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-updaterebuilds the index after synchronization for those repositories that changed; the--force-eix-updateand--skip-eix-updateoptions change this behavior.emerge --syncupdates 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:
#------------------------------------------------------------------------------ # 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:
* 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:
* 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:
[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:
[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:
[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:
[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:
[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:
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:
* acct-group/dnsmasq
Available versions: 0-r3{tbz2}
Description: System group: dnsmasq
...
Found 97 matches