Files
Jay Faulkner f831b3d0b6 [gentoo] Fix+Update CI for 23.0 profile
- Adjusts how we remove pacakges. Gentoo maintains a list of packages
  that the user has requested be installed called "world". By
  deselecting the packages, we remove them from this list, and at the
  end, call depclean which will uninstall packages no longer selected or
  needed as dependencies.
- Updates profile logic. We should theoretically be able to support any
  new gentoo profile, without having to maintain a static list ourself
  by just updating the base.
- Updates CI job to use default profile as determined by the gentoo
  element. This basically eliminates one more place we need to update
  profiles on change.
- Ensures we install installkernel with USE=+grub so we actually install
  the kernel
- Do not use testing (~amd64) packages unless absolutely neccessary
- Fix growroot openrc initscript to use /sbin/openrc-run instead of
  deprecated-and-now-removed /sbin/runscript.

Change-Id: Ie9d2ab67d72114603034374854bb3a3d52de8ca4
2024-11-20 12:07:08 -08:00

162 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2016 Matthew Thode
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
if [[ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]]; then
set -x
fi
set -eu
set -o pipefail
# note(JayF): YACC and LEX are both set by gentoo alternatives handling if you want to
# use alternative implementations of them. Since whatever alternative
# implementation is opted-for may not availabe inside the image, we need to
# unset the environment to ensure default behavior.
unset YACC LEX
# env is not sourced with user specified package inclusions
# set the default bash array if GENTOO_EMERGE_ENV is not defined as an array
if ! declare -p GENTOO_EMERGE_ENV 2> /dev/null | grep -q '^declare \-a'; then
declare -a GENTOO_EMERGE_ENV
GENTOO_EMERGE_ENV+=("USE=\"-build\"")
GENTOO_EMERGE_ENV+=("FEATURES=\"binpkg-multi-instance buildpkg parallel-fetch parallel-install\"")
GENTOO_EMERGE_ENV+=("PKGDIR=\"/tmp/portage-pkgdir\"")
GENTOO_EMERGE_ENV+=("DISTDIR=\"/tmp/portage-distdir\"")
GENTOO_EMERGE_ENV+=("PORTDIR=\"/tmp/portage-portdir\"")
export GENTOO_EMERGE_ENV
fi
# iterate over the array, exporting each 'line'
for (( i=0; i<${#GENTOO_EMERGE_ENV[@]}; i++ )); do
eval export "${GENTOO_EMERGE_ENV[i]}"
done
# set default opts
GENTOO_EMERGE_DEFAULT_OPTS=${GENTOO_EMERGE_DEFAULT_OPTS:-"--binpkg-respect-use --rebuilt-binaries=y --usepkg=y --with-bdeps=y --binpkg-changed-deps=y --jobs=2 --verbose --autounmask=n"}
ACTION='install'
SCRIPTNAME="$(basename $0)"
function show_options {
echo "Usage: ${SCRIPTNAME} [package ...]"
echo
echo 'Options:'
echo ' -u -- update all packages'
echo ' -e -- erase/remove packages'
exit 0
}
function install_gentoo_packages {
RUN_ONCE_SHM='1'
if mountpoint -q /dev/shm; then
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
elif [[ -k /dev/shm ]]; then
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
else
fix_shm
emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
unfix_shm
fi
}
TEMP="$(getopt -o huem: -n ${SCRIPTNAME} -- ${@})"
if [[ "${?}" != 0 ]]; then
echo 'Terminating...' >&2
exit 1
fi
eval set -- "${TEMP}"
while true; do
case "${1}" in
-u )
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
install_gentoo_packages --update --deep --changed-use @world
install_gentoo_packages --verbose=n --depclean
install_gentoo_packages --usepkg=n @preserved-rebuild
etc-update --automode -5
eselect news read new
exit 0
;;
-e )
ACTION='remove'
shift
;;
-m )
MAP_ELEMENT="${2}"
shift 2
;;
-h )
show_options
;;
-- )
shift
break
;;
* )
echo "Error: unsupported option ${1}."
exit 1
;;
esac
done
PKGS="${@}"
if [[ -n "${MAP_ELEMENT:-}" ]]; then
PKGS="$(pkg-map --element ${MAP_ELEMENT} ${@})"
if [[ "${?}" != 0 ]]; then
echo "bin/pkg-map error. ${PKGS}"
exit 1
fi
fi
if [[ -z "${PKGS}" ]]; then
echo "Not running install-packages ${ACTION} with empty packages list"
else
if [[ "${ACTION}" == 'install' ]]; then
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
# --noreplace prevents us from rebuilding a package already installed
# --changed-use means that package will be rebuilt *if* USE flags for
# it (configuration) has changed
install_gentoo_packages --noreplace --changed-use "${PKGS}"
elif [[ "${ACTION}" == 'remove' ]]; then
if [[ ! -f ${PORTDIR}/profiles ]]; then
emerge-webrsync -q
fi
# A good practice for removing packages in gentoo is to deselect them,
# removing them from "world" set -- the equivalent of "unmark" in dnf.
# This tells portage we no longer care if the package is installed,
# and it can be removed if depedancies allow.
# This means a removal is two steps:
# - emerge --deselect $pkg
# - emerge --depclean
#
# The depclean step removes all packages that are not in the "world"
# set and are not in the dependency graph for any packages in "world"
# set.
#
# Other methods of removal may work; but this method sets us up to
# calculate the dependency graph exactly once and prevents portage
# from erroring if any of the packages were not already selected.
for PKG in ${PKGS}; do
install_gentoo_packages --deselect $PKG
done
install_gentoo_packages --depclean
else
echo 'something went really wrong, install action is not install or remove'
fi
fi