Merge pull request #112 from kinvolk/krnowak/break_dep_loop

Improve the dependency cycle breaking logic
This commit is contained in:
Krzesimir Nowak 2021-02-12 10:01:27 +01:00 committed by GitHub
commit 746ac38cfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -186,53 +186,98 @@ fi
# Goo to attempt to resolve dependency loops on individual packages.
# If this becomes insufficient we will need to move to a full multi-stage
# bootstrap process like we do with the SDK via catalyst.
#
# Called like:
#
# break_dep_loop [PKG_USE_PAIR]…
#
# PKG_USE_PAIR consists of two arguments: a package name (for example:
# sys-fs/lvm2), and a comma-separated list of USE flags to clear (for
# example: udev,systemd).
break_dep_loop() {
local pkg="$1"
local flags=( ${2//,/ } )
shift 2
local -a pkgs
local -a all_flags
local -a args
local flag_file="${BOARD_ROOT}/etc/portage/package.use/break_dep_loop"
local -a flag_file_entries
local -a pkg_summaries
# Be sure to clean up use flag hackery from previous failed runs
sudo rm -f "${flag_file}"
# If the package is already installed we have nothing to do
if portageq-"${BOARD}" has_version "${BOARD_ROOT}" "${pkg}"; then
if [[ $# -eq 0 ]]; then
return 0
fi
# Likewise, nothing to do if the flag isn't actually enabled.
if ! pkg_use_enabled "${pkg}" "${flags[@]}"; then
return 0
fi
# Temporarily compile/install package with flag disabled. If a binary
# Temporarily compile/install packages with flags disabled. If a binary
# package is available use it regardless of its version or use flags.
local disabled_flags="${flags[@]/#/-}"
info "Merging ${pkg} with USE=${disabled_flags}"
sudo mkdir -p "${flag_file%/*}"
sudo_clobber "${flag_file}" <<<"${pkg} ${disabled_flags}"
# Disable any other problematic flags
extra_args=""
local pkg
local -a flags
local disabled_flags
while [[ $# -gt 0 ]]; do
sudo_append "${flag_file}" <<<"$1 -$2"
extra_args+=" --buildpkg-exclude=$1 --useoldpkg-atoms=$1"
pkg="${1}"
pkgs+=("${pkg}")
flags=( ${2//,/ } )
all_flags+=("${flags[@]}")
disabled_flags="${flags[@]/#/-}"
flag_file_entries+=("${pkg} ${disabled_flags}")
args+=("--buildpkg-exclude=${pkg}")
pkg_summaries+=("${pkg}[${disabled_flags}]")
shift 2
done
# If packages are already installed we have nothing to do
local any_package_uninstalled=0
for pkg in "${pkgs[@]}"; do
if ! portageq-"${BOARD}" has_version "${BOARD_ROOT}" "${pkgs[@]}"; then
any_package_uninstalled=1
break
fi
done
if [[ ${any_package_uninstalled} -eq 0 ]]; then
return 0
fi
# Likewise, nothing to do if the flags aren't actually enabled.
local any_flag_enabled=0
for pkg in "${pkgs[@]}"; do
if pkg_use_enabled "${pkg}" "${all_flags[@]}"; then
any_flag_enabled=1
break
fi
done
if [[ ${any_flag_enabled} -eq 0 ]]; then
return 0
fi
info "Merging ${pkg_summaries[@]}"
sudo mkdir -p "${flag_file%/*}"
sudo_clobber "${flag_file}" <<<"${flag_file_entries[0]}"
local entry
for entry in "${flag_file_entries[@]:1}"; do
sudo_append "${flag_file}" <<<"${entry}"
done
# rebuild-if-unbuilt is disabled to prevent portage from needlessly
# rebuilding zlib for some unknown reason, in turn triggering more rebuilds.
sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" \
--rebuild-if-unbuilt=n \
--buildpkg-exclude="${pkg}" \
${extra_args} "${pkg}"
"${args[@]}" "${pkgs[@]}"
sudo rm -f "${flag_file}"
}
if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_FALSE}" ]]; then
# Breaking the following loops here:
#
# util-linux[udev] -> virtual->udev -> systemd -> util-linux
break_dep_loop sys-apps/util-linux udev,systemd sys-apps/systemd cryptsetup
# systemd[cryptsetup] -> cryptsetup -> lvm2 -> virtual/udev -> systemd
break_dep_loop sys-apps/systemd cryptsetup
# util-linux[systemd] -> systemd -> util-linux
# cryptsetup[udev] -> virtual/udev -> systemd[cryptsetup] -> cryptsetup
# lvm2[udev] -> virtual/udev -> systemd[cryptsetup] -> cryptsetup -> lvm2
# lvm2[systemd] -> systemd[cryptsetup] -> cryptsetup -> lvm2
# systemd[cryptsetup] -> cryptsetup[udev] -> virtual/udev -> systemd
break_dep_loop sys-apps/util-linux udev,systemd \
sys-fs/cryptsetup udev \
sys-fs/lvm2 udev,systemd \
sys-apps/systemd cryptsetup
fi
export KBUILD_BUILD_USER="${BUILD_USER:-build}"