emerge Package Manager (Gentoo)

emerge (Portage) - Source-based package manager for Gentoo Linux.


Basic Commands

 1# Sync package tree
 2emerge --sync
 3# Or
 4emaint sync -a
 5
 6# Update system
 7emerge --update --deep --newuse @world
 8
 9# Install package
10emerge package-name
11
12# Install with dependencies
13emerge --ask package-name
14
15# Remove package
16emerge --deselect package-name
17emerge --depclean
18
19# Search package
20emerge --search package-name
21emerge -s package-name
22
23# Search by description
24emerge --searchdesc keyword

Install from Repository

 1# Install package
 2emerge app-editors/vim
 3
 4# Install with confirmation
 5emerge --ask www-servers/nginx
 6
 7# Install specific version
 8emerge =app-editors/vim-9.0.0
 9
10# Install latest version
11emerge app-editors/vim
12
13# Pretend install (dry run)
14emerge --pretend package-name
15
16# Verbose output
17emerge --verbose package-name
18
19# Ask before proceeding
20emerge --ask package-name

Build from Source

All packages in Gentoo are built from source!

 1# Install package (builds from source)
 2emerge package-name
 3
 4# Show build process
 5emerge --verbose package-name
 6
 7# Build with specific USE flags
 8USE="flag1 -flag2" emerge package-name
 9
10# Build with custom CFLAGS
11CFLAGS="-O3 -march=native" emerge package-name
12
13# Parallel compilation
14MAKEOPTS="-j8" emerge package-name
15
16# Or set in /etc/portage/make.conf:
17MAKEOPTS="-j8"

USE Flags

 1# Show USE flags for package
 2emerge --pretend --verbose package-name
 3
 4# Show all USE flags
 5equery uses package-name
 6
 7# Set global USE flags
 8# Edit /etc/portage/make.conf
 9USE="X gtk gnome -kde -qt5"
10
11# Set per-package USE flags
12# /etc/portage/package.use/custom
13app-editors/vim python ruby
14www-servers/nginx ssl http2
15
16# Show enabled USE flags
17emerge --info | grep ^USE
18
19# List all USE flags
20less /var/db/repos/gentoo/profiles/use.desc

System Updates

 1# Update world (all packages)
 2emerge --update --deep --newuse @world
 3
 4# Update with ask
 5emerge --ask --update --deep --newuse @world
 6
 7# Shorter form
 8emerge -avuDN @world
 9
10# Update only changed USE flags
11emerge --newuse @world
12
13# Update kernel
14emerge --ask sys-kernel/gentoo-sources

Package Management

 1# List installed packages
 2qlist -I
 3
 4# Show package info
 5emerge --info package-name
 6
 7# Show dependencies
 8emerge --pretend --tree package-name
 9
10# Show reverse dependencies
11equery depends package-name
12
13# List files in package
14equery files package-name
15
16# Find which package owns file
17equery belongs /path/to/file
18
19# Check package integrity
20equery check package-name

Cleaning

 1# Remove unused dependencies
 2emerge --depclean
 3
 4# Pretend depclean
 5emerge --pretend --depclean
 6
 7# Clean build files
 8eclean-dist --deep
 9
10# Clean old packages
11eclean-pkg --deep
12
13# Remove obsolete packages
14emerge --prune

Configuration

/etc/portage/make.conf

 1# Compiler flags
 2CFLAGS="-O2 -pipe -march=native"
 3CXXFLAGS="${CFLAGS}"
 4
 5# Parallel compilation
 6MAKEOPTS="-j8"
 7
 8# USE flags
 9USE="X gtk gnome -kde -qt5 systemd"
10
11# Mirrors
12GENTOO_MIRRORS="https://mirror.example.com/gentoo"
13
14# Features
15FEATURES="parallel-fetch ccache"
16
17# Accept licenses
18ACCEPT_LICENSE="*"
19
20# Language
21L10N="en"

Overlays (Third-party Repositories)

 1# Install layman (overlay manager)
 2emerge app-portage/layman
 3
 4# List available overlays
 5layman -L
 6
 7# Add overlay
 8layman -a overlay-name
 9
10# Sync overlays
11layman -S
12
13# Remove overlay
14layman -d overlay-name
15
16# Or use eselect repository (modern)
17emerge app-eselect/eselect-repository
18eselect repository list
19eselect repository enable overlay-name
20emerge --sync

Masking/Unmasking

 1# Unmask package
 2# /etc/portage/package.unmask
 3=app-editors/vim-9.0.0
 4
 5# Mask package
 6# /etc/portage/package.mask
 7>=app-editors/vim-9.0.0
 8
 9# Accept keywords (testing)
10# /etc/portage/package.accept_keywords
11app-editors/vim ~amd64

Binary Packages

 1# Build binary package
 2emerge --buildpkg package-name
 3
 4# Install from binary
 5emerge --usepkg package-name
 6
 7# Install binary only (no compile)
 8emerge --getbinpkg package-name
 9
10# Configure binary host
11# /etc/portage/make.conf
12PORTAGE_BINHOST="https://binhost.example.com/packages"
13
14# Build all as binary
15FEATURES="buildpkg"

Troubleshooting

 1# Fix broken dependencies
 2emerge --ask --oneshot --verbose sys-apps/portage
 3revdep-rebuild
 4
 5# Rebuild @world
 6emerge -e @world
 7
 8# Resume failed build
 9emerge --resume
10
11# Skip failed package
12emerge --resume --skipfirst
13
14# Force rebuild
15emerge --oneshot package-name
16
17# Check for problems
18emerge --check-news
19eselect news read

Kernel Management

 1# Install kernel sources
 2emerge sys-kernel/gentoo-sources
 3
 4# List available kernels
 5eselect kernel list
 6
 7# Set active kernel
 8eselect kernel set 1
 9
10# Configure kernel
11cd /usr/src/linux
12make menuconfig
13
14# Compile kernel
15make -j8
16make modules_install
17make install
18
19# Or use genkernel
20emerge sys-kernel/genkernel
21genkernel all

Useful Tools

 1# Install gentoolkit
 2emerge app-portage/gentoolkit
 3
 4# equery - query packages
 5equery list '*'
 6equery depends package-name
 7equery files package-name
 8
 9# eix - fast package search
10emerge app-portage/eix
11eix-update
12eix package-name
13
14# genlop - analyze emerge logs
15emerge app-portage/genlop
16genlop -t package-name  # Estimate time
17genlop -c               # Current emerge

Logs

 1# Emerge log
 2cat /var/log/emerge.log
 3
 4# Fetch log
 5cat /var/log/emerge-fetch.log
 6
 7# Build log location
 8ls /var/tmp/portage/
 9
10# Show current emerge
11genlop -c
12
13# Show emerge history
14genlop -l
15
16# Estimate time
17genlop -t package-name

Common Workflows

Full System Update

 1# Sync
 2emerge --sync
 3
 4# Update world
 5emerge -avuDN @world
 6
 7# Clean dependencies
 8emerge --depclean
 9
10# Rebuild if needed
11revdep-rebuild
12
13# Clean distfiles
14eclean-dist --deep

Install New Package

 1# Search
 2eix package-name
 3
 4# Show info
 5emerge --pretend --verbose package-name
 6
 7# Install
 8emerge --ask package-name
 9
10# Check
11equery files package-name

Useful Aliases

1# Add to ~/.bashrc
2alias update='emerge --sync && emerge -avuDN @world'
3alias install='emerge --ask'
4alias remove='emerge --deselect'
5alias search='eix'
6alias clean='emerge --depclean && eclean-dist --deep'

Create and Publish Gentoo Ebuild

Ebuild Structure

1mypackage/
2β”œβ”€β”€ mypackage-1.0.0.ebuild
3β”œβ”€β”€ mypackage-9999.ebuild  # Live ebuild (git)
4β”œβ”€β”€ Manifest
5β”œβ”€β”€ metadata.xml
6└── files/
7    β”œβ”€β”€ mypackage-1.0.0-fix-build.patch
8    └── mypackage.initd

Basic Ebuild

 1# mypackage-1.0.0.ebuild
 2# Copyright 1999-2024 Gentoo Authors
 3# Distributed under the terms of the GNU General Public License v2
 4
 5EAPI=8
 6
 7DESCRIPTION="A useful package"
 8HOMEPAGE="https://github.com/username/mypackage"
 9SRC_URI="https://github.com/username/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
10
11LICENSE="MIT"
12SLOT="0"
13KEYWORDS="~amd64 ~arm64"
14IUSE="doc examples +systemd"
15
16DEPEND="
17    dev-libs/glib:2
18    sys-libs/zlib
19"
20RDEPEND="${DEPEND}"
21BDEPEND="
22    virtual/pkgconfig
23    doc? ( dev-python/sphinx )
24"
25
26src_configure() {
27    local myconf=(
28        $(use_enable doc documentation)
29        $(use_enable systemd)
30    )
31    econf "${myconf[@]}"
32}
33
34src_compile() {
35    default
36    use doc && emake -C docs html
37}
38
39src_install() {
40    default
41    
42    if use doc; then
43        docinto html
44        dodoc -r docs/_build/html/*
45    fi
46    
47    if use examples; then
48        docinto examples
49        dodoc -r examples/*
50    fi
51    
52    newinitd "${FILESDIR}/${PN}.initd" ${PN}
53}

Live Ebuild (Git)

 1# mypackage-9999.ebuild
 2# Copyright 1999-2024 Gentoo Authors
 3# Distributed under the terms of the GNU General Public License v2
 4
 5EAPI=8
 6
 7inherit git-r3
 8
 9DESCRIPTION="A useful package (live version)"
10HOMEPAGE="https://github.com/username/mypackage"
11EGIT_REPO_URI="https://github.com/username/mypackage.git"
12
13LICENSE="MIT"
14SLOT="0"
15KEYWORDS=""  # Live ebuilds don't have keywords
16
17DEPEND="dev-libs/glib:2"
18RDEPEND="${DEPEND}"
19BDEPEND="virtual/pkgconfig"
20
21src_configure() {
22    econf
23}
24
25src_install() {
26    default
27}

metadata.xml

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
 3<pkgmetadata>
 4    <maintainer type="person">
 5        <email>email@example.com</email>
 6        <name>Your Name</name>
 7    </maintainer>
 8    <longdescription>
 9        Long description of the package.
10        Can span multiple lines.
11    </longdescription>
12    <use>
13        <flag name="doc">Build and install documentation</flag>
14        <flag name="examples">Install example files</flag>
15        <flag name="systemd">Enable systemd support</flag>
16    </use>
17    <upstream>
18        <remote-id type="github">username/mypackage</remote-id>
19    </upstream>
20</pkgmetadata>

Generate Manifest

1# Generate checksums
2ebuild mypackage-1.0.0.ebuild manifest
3
4# Creates Manifest:
5DIST mypackage-1.0.0.tar.gz 123456 BLAKE2B abc... SHA512 def...

Test Ebuild

 1# Test fetch
 2ebuild mypackage-1.0.0.ebuild fetch
 3
 4# Test unpack
 5ebuild mypackage-1.0.0.ebuild unpack
 6
 7# Test compile
 8ebuild mypackage-1.0.0.ebuild compile
 9
10# Test install
11ebuild mypackage-1.0.0.ebuild install
12
13# Install to system
14ebuild mypackage-1.0.0.ebuild merge
15
16# Check with repoman
17repoman full
18
19# Check with pkgcheck
20pkgcheck scan

Create Local Overlay

 1# Create overlay directory
 2mkdir -p /usr/local/portage/app-misc/mypackage
 3
 4# Copy ebuild files
 5cp mypackage-1.0.0.ebuild /usr/local/portage/app-misc/mypackage/
 6cp metadata.xml /usr/local/portage/app-misc/mypackage/
 7
 8# Generate Manifest
 9cd /usr/local/portage/app-misc/mypackage
10ebuild mypackage-1.0.0.ebuild manifest
11
12# Install
13emerge app-misc/mypackage

Publish to GURU (Gentoo User Repository)

 1# 1. Request access to GURU
 2# https://wiki.gentoo.org/wiki/Project:GURU
 3
 4# 2. Clone GURU
 5git clone https://anongit.gentoo.org/git/proj/guru.git
 6
 7# 3. Create package directory
 8cd guru
 9mkdir -p app-misc/mypackage
10
11# 4. Add ebuild files
12cp mypackage-1.0.0.ebuild app-misc/mypackage/
13cp metadata.xml app-misc/mypackage/
14
15# 5. Generate Manifest
16cd app-misc/mypackage
17ebuild mypackage-1.0.0.ebuild manifest
18
19# 6. Check with pkgcheck
20pkgcheck scan
21
22# 7. Commit and push
23git add app-misc/mypackage
24git commit -s -m "app-misc/mypackage: new package, add 1.0.0"
25git push
26
27# Users can install with:
28# eselect repository enable guru
29# emerge --sync guru
30# emerge app-misc/mypackage

Create Custom Overlay

 1# Create overlay structure
 2mkdir -p /var/db/repos/myoverlay/{metadata,profiles}
 3
 4# Create layout.conf
 5cat > /var/db/repos/myoverlay/metadata/layout.conf <<EOF
 6masters = gentoo
 7auto-sync = false
 8EOF
 9
10# Create repo_name
11echo "myoverlay" > /var/db/repos/myoverlay/profiles/repo_name
12
13# Add to repos.conf
14cat > /etc/portage/repos.conf/myoverlay.conf <<EOF
15[myoverlay]
16location = /var/db/repos/myoverlay
17auto-sync = no
18EOF
19
20# Add packages
21mkdir -p /var/db/repos/myoverlay/app-misc/mypackage
22# Add ebuild files...
23
24# Users can sync with:
25# emerge --sync
26# emerge app-misc/mypackage

Best Practices

 1# 1. Follow Gentoo development guide
 2# https://devmanual.gentoo.org/
 3
 4# 2. Use proper EAPI
 5EAPI=8  # Latest stable
 6
 7# 3. Use eclasses
 8inherit autotools git-r3 systemd
 9
10# 4. Handle USE flags properly
11IUSE="doc examples +default-flag"
12
13# 5. Use proper dependencies
14DEPEND="build-time dependencies"
15RDEPEND="runtime dependencies"
16BDEPEND="build tools"
17
18# 6. Install files correctly
19dobin myapp
20doman myapp.1
21dodoc README.md
22doins config.conf
23
24# 7. Check with tools
25repoman full
26pkgcheck scan
27
28# 8. Sign commits
29git commit -s -m "message"

Advanced Ebuild Features

 1# Python support
 2inherit python-single-r1
 3
 4PYTHON_COMPAT=( python3_{10..12} )
 5
 6DEPEND="${PYTHON_DEPS}"
 7RDEPEND="${DEPEND}"
 8
 9# Multiple versions
10SLOT="0/1.0"  # Sub-slot for ABI
11
12# Patches
13PATCHES=(
14    "${FILESDIR}/${P}-fix-build.patch"
15)
16
17# Custom phases
18src_prepare() {
19    default
20    eautoreconf
21}
22
23pkg_postinst() {
24    elog "Important information for users"
25    elog "Configuration file: /etc/mypackage/config.conf"
26}

Related Snippets