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
- APT Package Manager (Debian/Ubuntu)
APT (Advanced Package Tool) for Debian and Ubuntu-based systems. Basic Commands β¦ - Bazel Build System
Bazel - Fast, scalable, multi-language build system from Google. Installation 1# β¦ - dpkg Package Manager
dpkg - Low-level package manager for Debian-based systems. Basic Commands 1# β¦ - Go Modules & Workspaces
Go modules and workspaces for dependency management. Essential commands for Go β¦ - npm - Node Package Manager
Essential npm commands for Node.js package management. Quick reference for daily β¦ - pacman Package Manager (Arch Linux)
pacman - Package manager for Arch Linux and derivatives (Manjaro, EndeavourOS). β¦ - pip Package Manager (Python)
pip - Package installer for Python. Basic Commands 1# Install package 2pip β¦ - pkg Package Manager (FreeBSD)
pkg - Binary package manager for FreeBSD. Basic Commands 1# Update repository β¦ - Scoop Package Manager (Windows)
Scoop - Command-line installer for Windows. Installation 1# Set execution policy β¦ - Yarn Package Manager
Yarn package manager for JavaScript/Node.js projects. Installation 1# Via npm β¦ - yum/dnf Package Manager (RHEL/Fedora)
yum (Yellowdog Updater Modified) and dnf (Dandified Yum) for RHEL, Fedora, β¦