#!/bin/bash # pm_emerge.sh - Portage (emerge) package manager implementation for Gentoo systems # # To add a new package manager, create a file named pm_.sh with: # - pm__detect: Returns 0 if this PM is available, 1 otherwise # - pm__get_missing_deps: Prints space-separated list of missing packages # - pm__install_missing_deps: Installs the missing packages # # Gentoo notes: # - EMERGE_DEPS are Gentoo atoms mirroring the dnf/apt dependency sets # (vala, meson, ninja, pkgconf, gcc, glib, libsodium, json-glib, # libarchive, libgee, xz-utils, gobject-introspection). A stage3 already # carries gcc and friends; portageq skips whatever is present. # - Everything is compiled from source: this step can take a long time. # - USE flags are NOT modified. The stack's platform libraries (glib, # json-glib, libgee, ...) enable their introspection USE flag by default # and vala ships the platform .vapi bindings itself; only a system that # explicitly disabled introspection via package.use/make.conf will lack # .gir/.typelib/.vapi artifacts after install — re-enable the flag in # /etc/portage/package.use and re-emerge if the USM build needs them. # Package atoms required by USM EMERGE_DEPS="dev-lang/vala dev-build/meson dev-build/ninja dev-util/pkgconf sys-devel/gcc dev-libs/glib net-libs/glib-networking dev-libs/libsodium dev-libs/json-glib app-arch/libarchive dev-libs/libgee app-arch/xz-utils dev-libs/gobject-introspection" # Check if this package manager is available pm_emerge_detect() { command -v emerge &>/dev/null } # Get list of missing dependencies pm_emerge_get_missing_deps() { local -a missing=() for pkg in $EMERGE_DEPS; do if ! portageq has_version / "$pkg" &>/dev/null; then missing+=("$pkg") fi done echo "${missing[*]}" } # Install missing dependencies pm_emerge_install_missing_deps() { local missing=$(pm_emerge_get_missing_deps) if [[ -z "$missing" ]]; then log_info "All dependencies are already installed" return 0 fi log_step "Installing packages via emerge: ${missing}" local sudo="" if ! is_root; then sudo=$(get_sudo) fi local emerge_opts="--ask=n --quiet=y" if [[ -n "$sudo" ]]; then $sudo emerge $emerge_opts $missing else emerge $emerge_opts $missing fi }