pm_emerge.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/bin/bash
  2. # pm_emerge.sh - Portage (emerge) package manager implementation for Gentoo systems
  3. #
  4. # To add a new package manager, create a file named pm_<name>.sh with:
  5. # - pm_<name>_detect: Returns 0 if this PM is available, 1 otherwise
  6. # - pm_<name>_get_missing_deps: Prints space-separated list of missing packages
  7. # - pm_<name>_install_missing_deps: Installs the missing packages
  8. #
  9. # Gentoo notes:
  10. # - EMERGE_DEPS are Gentoo atoms mirroring the dnf/apt dependency sets
  11. # (vala, meson, ninja, pkgconf, gcc, glib, libsodium, json-glib,
  12. # libarchive, libgee, xz-utils, gobject-introspection). A stage3 already
  13. # carries gcc and friends; portageq skips whatever is present.
  14. # - Everything is compiled from source: this step can take a long time.
  15. # - USE flags are NOT modified. The stack's platform libraries (glib,
  16. # json-glib, libgee, ...) enable their introspection USE flag by default
  17. # and vala ships the platform .vapi bindings itself; only a system that
  18. # explicitly disabled introspection via package.use/make.conf will lack
  19. # .gir/.typelib/.vapi artifacts after install — re-enable the flag in
  20. # /etc/portage/package.use and re-emerge if the USM build needs them.
  21. # Package atoms required by USM
  22. 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"
  23. # Check if this package manager is available
  24. pm_emerge_detect() {
  25. command -v emerge &>/dev/null
  26. }
  27. # Get list of missing dependencies
  28. pm_emerge_get_missing_deps() {
  29. local -a missing=()
  30. for pkg in $EMERGE_DEPS; do
  31. if ! portageq has_version / "$pkg" &>/dev/null; then
  32. missing+=("$pkg")
  33. fi
  34. done
  35. echo "${missing[*]}"
  36. }
  37. # Install missing dependencies
  38. pm_emerge_install_missing_deps() {
  39. local missing=$(pm_emerge_get_missing_deps)
  40. if [[ -z "$missing" ]]; then
  41. log_info "All dependencies are already installed"
  42. return 0
  43. fi
  44. log_step "Installing packages via emerge: ${missing}"
  45. local sudo=""
  46. if ! is_root; then
  47. sudo=$(get_sudo)
  48. fi
  49. local emerge_opts="--ask=n --quiet=y"
  50. if [[ -n "$sudo" ]]; then
  51. $sudo emerge $emerge_opts $missing
  52. else
  53. emerge $emerge_opts $missing
  54. fi
  55. }