- 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
162 lines
5.3 KiB
Bash
Executable File
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
|
|
|