Eix

Updated 9 November 2026

Eix is a set of utilities for searching the Portage tree: by name and description, USE flags, dependencies, slots and masking. It works off its own compiled database of the Portage tree, enabled overlays and system settings, so it answers in hundredths of a second: on a tree of 19,498 packages with a 21 MB cache, eix -# -S browser completes in 0.017 s, while emerge --search browser takes 0.620 s.

The app-portage/eix package is included in all Calculate Linux distributions, and cl-update keeps the index up to date. This reference is current for eix 0.36.9.

Index structure

The eix-update utility traverses the Portage tree, the enabled overlays and the installed package database, and builds the cache /var/cache/eix/portage.eix from them. All eix queries read only the cache, so the response speed does not depend on the size of the tree.

You normally do not need to run eix-update by hand:

  • cl-update rebuilds the index after synchronization for those repositories that changed; the --force-eix-update and --skip-eix-update options change this behavior.
  • emerge --sync updates the cache through the postsync hook /etc/portage/postsync.d/50-eix-postsync.

Before updating, cl-update saves the previous copy of the cache to previous.eix, so that after synchronization you can use eix-diff to see what changed in the tree: added, removed and modified packages.

eix also has its own synchronization script, eix-sync. It reads the /etc/eix-sync.conf file, which in Calculate specifies what to use instead of emerge --sync:

/etc/eix-sync.conf
#------------------------------------------------------------------------------
# Modified Calculate Utilities 3.7.6.8
# Processed template files:
# /var/db/repos/calculate/profiles/templates/2_ac_install_merge/app-portage/eix/eix-sync.conf
# To modify this file, create a /etc/eix-sync.conf.clt template.
#------------------------------------------------------------------------------
# checkout and repair repositories before sync
!have_changed=:
!emergecmd='/usr/sbin/cl-core --method update --sync-only --skip-eix-update'

The file was created from a distribution template, as the # Processed template files: line in the header indicates; for your own version, create /etc/eix-sync.conf.clt - the mechanism is described in working with templates.

Reading the output

A call without format options prints the detailed block about a package:

eix app-portage/eix

[I] app-portage/eix
     Available versions:  0.36.9 {debug doc nls sqlite}
     Installed versions:  0.36.9(00:03:06 12/30/24)(nls -debug -doc -sqlite)
     Homepage:            https://github.com/vaeth/eix/
     Description:         Search and query ebuilds

The package status is the first column: [I] - installed, [U] - installed, but not the best version of its slot, [N] - absent from the system; in the normal format, packages not installed on the system are marked with an asterisk *. In verbose mode -v, the package header always starts with *.

The symbols next to version numbers in the "Available versions" line:

Symbol Meaning Example
~3.8.2.29 testing version (~arch): an architecture keyword is required for installation the calculate-utils versions line
**9999 masked: no stable keyword on any architecture nano
9999 live ebuild: built from the development repository nano
^t, ^s, ^f … RESTRICT letters of the ebuild: t - test, s - strip, f - fetch 8.23.0^t (curl)
*l, *i … PROPERTIES letters of the ebuild: l - live, i - interactive **9999*l (nano)
{tbz2} a prebuilt binary package of this version is present in PKGDIR 0-r3{tbz2} (acct-group/dnsmasq)
(esr), (6/6.29) slot and subslot of the version firefox, kde-frameworks

The marks from the table are directly visible in the output - example: nano with a masked live version:

eix app-editors/nano

* app-editors/nano
     Available versions:  9.2 **9999*l {debug justify magic minimal ncurses nls +spell unicode verify-sig}
     Homepage:            https://www.nano-editor.org/ https://wiki.gentoo.org/wiki/Nano/Guide
     Description:         GNU GPL'd Pico clone with more functionality

USE flags in curly braces are the build options declared in the ebuild; a plus before a name (+spell) means the flag is enabled by default. In the "Installed versions" line, the parentheses list the flags of the actual installation: without a minus it is enabled, with a minus (-debug) it is disabled, and the installation date comes before the parentheses.

Packages from overlays get a numbered footnote, and a legend appears below the list:

eix -c sys-apps/calculate-utils

[I] sys-apps/calculate-utils [1] (3.8.2.30@10/30/26): A set of Calculate utilities for system installation, build and upgrade
[1] "calculate" /var/db/repos/calculate

Output formats

The compact format -c, --compact prints one line per package: status, name, version with the installation date, and description:

eix -c net-misc/curl

[I] net-misc/curl (8.23.0@10/24/26): A Client that groks URLs

The names-only mode -#, --only-names is convenient for lists and pipelines:

eix -C app-portage -# | head -8

app-portage/cfg-update
app-portage/command-not-found
app-portage/conf-update
app-portage/cpuid2cpuflags
app-portage/diffmask
app-portage/eix
app-portage/elicense
app-portage/elogv

Verbose mode -v, --verbose adds the license, dependencies, and EAPI to the block:

eix -v app-text/tree
* app-text/tree
     Available versions:  2.1.1-r1 2.2.1 ~2.3.2
     Installed versions:  Version:   2.2.1
                          Date:      10:03:12 05/23/25
                          RDEPEND:   >=sys-libs/glibc-2.40-r8
                          EAPI:      8
     Best versions/slot:  2.2.1
     Homepage:            https://oldmanprogrammer.net/source.php?dir=projects/tree https://gitlab.com/OldManProgrammer/unix-tree
     Find open bugs:      https://bugs.gentoo.org/buglist.cgi?quicksearch=app-text%2Ftree
     Description:         Lists directories recursively, and produces an indented listing of files
     License:             GPL-2

The -l, --versionlines option puts each available version on a separate line - with its USE flags and constraints; when combined with -v (eix -lv), it also prints the additional fields:

eix -l app-misc/mc

* app-misc/mc
     Available versions:  
            4.8.33    ^t    [X +edit gpm nls sftp +slang spell test unicode]    ["spell? ( edit )"]
     Homepage:            https://midnight-commander.org https://github.com/MidnightCommander/mc
     Description:         GNU Midnight Commander is a text based file manager

The last column of the versionlines output is the REQUIRED_USE conditional expression from the ebuild: the entry spell? ( edit ) for mc requires enabling the edit flag together with spell.

--format assembles its own set of fields - see the "Eix in scripts" section.

Search options

By default, the argument is interpreted as a regular expression and matched against the package name:

eix browser

* app-emacs/color-browser
     Available versions:  ~0.3-r1
     Homepage:            https://www.emacswiki.org/emacs/KahlilHodgson
     Description:         A utility for designing Emacs color themes
...
Found 17 matches

The -S, --description option searches descriptions as well - the number of matches is immediately five times higher:

eix -S browser
* app-accessibility/edbrowse
     Available versions:  ~3.8.13 ~3.8.15 ~3.8.17 ~3.8.18 {PYTHON_SINGLE_TARGET="python3_12 python3_13 python3_14 python3_15"}
     Homepage:            https://edbrowse.org
     Description:         Combination editor, browser, and mail client that is 100% text based
...
Found 92 matches

The options set the matching scheme: -e, --exact is the exact name, -z, --substring is a substring, -b, --begin is the beginning of the string, -p, --pattern is a glob, -r, --regex is a regular expression (the default value). Exact mode is useful when you need the whole name, not a substring containing it: eix -e app-portage/eix finds only the app-portage/eix package.

-U, --use checks for the presence of a USE flag in an ebuild:

eix -c -U wayland
[N] app-admin/conky (1.22.3): An advanced, highly configurable system monitor for X
[N] app-admin/pass (1.7.4-r5): Stores, retrieves, generates, and synchronizes passwords securely
[N] app-crypt/gcr (4.4.0.1-r1(4/gcr-4.4-gck-2.2)): Libraries for cryptographic UIs and accessing PKCS#11 modules
[I] app-crypt/pinentry (1.3.3@09/07/26): Simple passphrase entry dialogs which utilize the Assuan protocol
[N] app-editors/gvim (9.2.1125): GUI version of the Vim text editor
...
Found 180 matches

If you need the actual installed state rather than the declared flag, use --installed-with-use (flag enabled) and --installed-without-use (disabled). List of installed packages built with zstd support:

eix -# --installed-with-use zstd

app-arch/libarchive
dev-libs/elfutils
net-libs/gnutls
net-misc/curl
net-misc/rsync
sys-apps/file
sys-apps/kbd
sys-apps/kmod
sys-devel/binutils
sys-devel/gcc

Search scope

The -I, --installed option limits the output to installed packages - with any search word it is a quick answer to the question of whether something similar is already in the system.

-C, --category sets the category:

eix -C app-portage -c
[N] app-portage/cfg-update (1.11.0): Easy to use GUI & CLI alternative for etc-update
[N] app-portage/command-not-found (0.0.7-r1): Command-not-found handler for Gentoo
[N] app-portage/conf-update (1.0.3-r1): conf-update is a ncurses-based config management utility
[N] app-portage/cpuid2cpuflags (18): Tool to guess CPU_FLAGS_* flags for the host
[N] app-portage/diffmask (0.3.3-r5): A utility to maintain package.unmask entries up-to-date with masks
[I] app-portage/eix (0.36.9@12/30/24): Search and query ebuilds
...
Found 54 matches

Slots let you keep several major versions of a package in the system at the same time. In KDE Frameworks 6 all libraries live in slot 6 with the minor version as the subslot:

eix -C kde-frameworks --slot 6 -c
[N] kde-frameworks/attica (6.29.0(6/6.29)): Framework providing access to Open Collaboration Services
[N] kde-frameworks/baloo (6.29.0(6/6.29)): Framework for searching and managing metadata
[N] kde-frameworks/bluez-qt (6.29.0(6/6.29)): Qt wrapper for Bluez 5 DBus API
[N] kde-frameworks/breeze-icons (6.29.0(6/6.29)): Breeze SVG icon theme
[N] kde-frameworks/frameworkintegration (6.29.0(6/6.29)): Framework for integrating Qt applications with KDE Plasma workspaces
...
Found 75 matches

Overlays: -O, --overlay keeps only the overlay package tree, --in-overlay <name> only the specified overlay, --only-in-overlay <name> the packages that are not in the main tree. Calculate's own overlay contains 61 packages - from cl-* utilities to binary package repository signing keys:

eix --in-overlay calculate -c
[N] acct-group/keyd [1] (2.5.0): Group for app-misc/keyd
[N] app-admin/cl-remote [1] (0.3.2-r1): Parallel SSH execution of shell scripts on multiple hosts
[N] app-containers/cl-lxc [1] (0.1.5): Automates creation and upgrade of Calculate Linux LXC containers
[I] app-crypt/openpgp-keys-calculate-release [1] (20180827@01/06/23): OpenPGP keys used for Calculate binary packages
[N] app-crypt/shim-signed [1] (0.2): UEFI Shim bootloader for SecureBoot signed by Microsoft
...
Found 61 matches

--installed-unstable looks for unstable installed versions; if there are no such packages, the output is limited to one line:

eix --installed-unstable

No matches found

Another check before cl-update is the -u, --upgrade option: if all installed versions are already the best in their slots, the output is limited to one line:

eix -u -c

No matches found

Search by dependencies

A common question when cleaning up the system is what depends on a package. The search target is specified by package name:

eix --depend 'dev-libs/boost' -c
[N] app-admin/calamares (3.4.2-r1): Distribution-independent installer framework
[N] app-admin/logstalgia (~1.1.4): Replays or streams an access_log as a retro arcade game-like simulation
[N] app-arch/innoextract (1.10_pre20250206-r1): A tool to unpack installers created by Inno Setup
[N] app-backup/snapper (0.13.1): Command-line program for btrfs and lvm snapshot management
[N] app-editors/xmlcopyeditor (~1.3.1.0-r4): XML Copy Editor is a fast, free, validating XML editor
...
Found 276 matches

The --depend option checks DEPEND of both available and installed versions; for RDEPEND there is --rdepend, and for BDEPEND, PDEPEND and IDEPEND - --bdepend, --pdepend, --idepend; the --available- and --installed- prefixes refine which versions to search. Searching the available versions requires an index with DEP: the current value is shown by eix --dump | grep '^DEP='.

Boolean expressions

Search tests are combined into an expression: -a, --and, -o, --or, --not (also -!), а группировка задаётся парой -( … -). A bare argument is also a test: it is matched against the package name according to the active scheme; the -s, --name option specifies searching by name explicitly, and it is the one used in the examples below.

A browser and a mail client in one query:

eix -c -s firefox --or -s thunderbird

[N] mail-client/thunderbird (158.0.1(0/stable)): Thunderbird Mail Client
[N] mail-client/thunderbird-bin (158.0.1(0/stable)): Thunderbird Mail Client
[N] mail-client/thunderbird-l10n (158.0.1(0/stable)): Thunderbird mail client's translation files
[N] sec-policy/selinux-thunderbird (2.20260616_p1): SELinux policy for thunderbird
[N] www-client/firefox (158.0.1(rapid)): Firefox Web Browser
[N] www-client/firefox-bin (158.0.1(rapid)): Firefox Web Browser
[N] www-client/firefox-l10n (158.0.1(0/rapid)): Firefox Web Browser's translation files
Found 7 matches

The installed curl:

eix -c -I -a -s curl

[I] net-misc/curl (8.23.0@10/24/26): A Client that groks URLs

Negation turns eix into an audit tool: installed packages that are not in world are candidates for removal by depclean:

eix -I --not --world -# | wc -l

238

Eix in scripts

The presence of a package in the tree is checked by the exit code, without parsing the output:

eix -e -q -0 sys-apps/portage; echo rc=$?

rc=0

eix -e -q -0 net-misc/no-such-package; echo rc=$?

rc=1

The pair -q, --quiet (do not print matches) with -0, --brief (stop at the first) makes the check instant, while -e protects against substring matches.

--format builds the output line from variables of the form <field> - the command and its output:

eix -I -C app-arch --format '<category>/<name> <installedversions:NAMEVERSION>'
app-arch/brotli app-arch/brotli-1.2.1
app-arch/bzip2 app-arch/bzip2-1.0.8-r5
app-arch/cpio app-arch/cpio-2.15
app-arch/gzip app-arch/gzip-1.15
app-arch/lbzip2 app-arch/lbzip2-2.5_p20181227-r3
app-arch/libarchive app-arch/libarchive-3.8.10
app-arch/lz4 app-arch/lz4-1.10.0-r1
app-arch/pigz app-arch/pigz-2.8
app-arch/tar app-arch/tar-1.35-r1
app-arch/xz-utils app-arch/xz-utils-5.8.3
app-arch/zstd app-arch/zstd-1.5.7-r1
Found 11 matches

--xml and --proto are provided for machine processing.

System maintenance

Entries in /etc/portage/package.* become outdated over time: a package has been removed from the tree, a name is misspelled. The -T option shows packages with outdated entries, -t prints those entries themselves before the normal output, checking package names against the tree; the eix-test-obsolete script additionally looks for redundant entries in the keyword and mask files.

For the demonstration, create files with nonexistent package names:

mkdir -p /tmp/eix-fakeroot/etc/portage && printf 'app-misc/doesnotexist-at-all foo\nnet-libs/wayland abc123\n' > /tmp/eix-fakeroot/etc/portage/package.use && printf '>=dev-libs/nosuchlib-1.0\n' > /tmp/eix-fakeroot/etc/portage/package.accept_keywords

Now the mismatches are visible in the -t report:

PORTAGE_CONFIGROOT=/tmp/eix-fakeroot eix -t -0

No non-matching entries in /tmp/eix-fakeroot/etc/portage/package.keywords
Non-matching entries in /tmp/eix-fakeroot/etc/portage/package.accept_keywords:
>=dev-libs/nosuchlib-1.0
--
No non-matching entries in /tmp/eix-fakeroot/etc/portage/package.mask
No non-matching entries in /tmp/eix-fakeroot/etc/portage/package.unmask
Non-matching or empty entries in /tmp/eix-fakeroot/etc/portage/package.use:
app-misc/doesnotexist-at-all foo
net-libs/wayland abc123
--
No non-matching or empty entries in /tmp/eix-fakeroot/etc/portage/package.env
No non-matching or empty entries in /tmp/eix-fakeroot/etc/portage/package.license
No non-matching or empty entries in /tmp/eix-fakeroot/etc/portage/package.accept_restrict
No non-matching or empty entries in /tmp/eix-fakeroot/etc/portage/package.cflags
The names of all installed packages are in the database.
* acct-group/3proxy
     Available versions:  0
     Description:         System group: 3proxy

Both package.use lines are marked because such packages are not in the tree: Wayland is in dev-libs/wayland. The -0 option limits the normal output to a single package - it is visible at the end of the report.

Eix and Calculate Linux

The integration of eix into the distribution is set up so that the index requires no manual maintenance: cl-update rebuilds it for the updated repositories and saves the previous copy for eix-diff, emerge --sync refreshes the cache through the postsync hook, and eix-sync synchronizes the tree the same way as the regular system update.

The -J, --installed-overlay option keeps only packages installed from overlays:

eix -J -#
app-crypt/openpgp-keys-calculate-release
sys-apps/calculate-utils
virtual/editor

{tbz2} in the version lines shows which versions are already built as binaries and will be installed without compilation: the marker means a prebuilt binary package in the local PKGDIR; versions downloaded from the Calculate binary package repository end up there too:

eix --binary
* acct-group/dnsmasq
     Available versions:  0-r3{tbz2}
     Description:         System group: dnsmasq

...
Found 97 matches