mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-08 21:46:58 +02:00
Merge pull request #112 from kinvolk/krnowak/break_dep_loop
Improve the dependency cycle breaking logic
This commit is contained in:
commit
746ac38cfb
101
build_packages
101
build_packages
@ -186,53 +186,98 @@ fi
|
|||||||
# Goo to attempt to resolve dependency loops on individual packages.
|
# Goo to attempt to resolve dependency loops on individual packages.
|
||||||
# If this becomes insufficient we will need to move to a full multi-stage
|
# If this becomes insufficient we will need to move to a full multi-stage
|
||||||
# bootstrap process like we do with the SDK via catalyst.
|
# 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() {
|
break_dep_loop() {
|
||||||
local pkg="$1"
|
local -a pkgs
|
||||||
local flags=( ${2//,/ } )
|
local -a all_flags
|
||||||
shift 2
|
local -a args
|
||||||
local flag_file="${BOARD_ROOT}/etc/portage/package.use/break_dep_loop"
|
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
|
# Be sure to clean up use flag hackery from previous failed runs
|
||||||
sudo rm -f "${flag_file}"
|
sudo rm -f "${flag_file}"
|
||||||
|
|
||||||
# If the package is already installed we have nothing to do
|
if [[ $# -eq 0 ]]; then
|
||||||
if portageq-"${BOARD}" has_version "${BOARD_ROOT}" "${pkg}"; then
|
return 0
|
||||||
return 0
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Likewise, nothing to do if the flag isn't actually enabled.
|
# Temporarily compile/install packages with flags disabled. If a binary
|
||||||
if ! pkg_use_enabled "${pkg}" "${flags[@]}"; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Temporarily compile/install package with flag disabled. If a binary
|
|
||||||
# package is available use it regardless of its version or use flags.
|
# package is available use it regardless of its version or use flags.
|
||||||
local disabled_flags="${flags[@]/#/-}"
|
local pkg
|
||||||
info "Merging ${pkg} with USE=${disabled_flags}"
|
local -a flags
|
||||||
sudo mkdir -p "${flag_file%/*}"
|
local disabled_flags
|
||||||
sudo_clobber "${flag_file}" <<<"${pkg} ${disabled_flags}"
|
|
||||||
# Disable any other problematic flags
|
|
||||||
extra_args=""
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
sudo_append "${flag_file}" <<<"$1 -$2"
|
pkg="${1}"
|
||||||
extra_args+=" --buildpkg-exclude=$1 --useoldpkg-atoms=$1"
|
pkgs+=("${pkg}")
|
||||||
shift 2
|
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
|
done
|
||||||
# rebuild-if-unbuilt is disabled to prevent portage from needlessly
|
# rebuild-if-unbuilt is disabled to prevent portage from needlessly
|
||||||
# rebuilding zlib for some unknown reason, in turn triggering more rebuilds.
|
# rebuilding zlib for some unknown reason, in turn triggering more rebuilds.
|
||||||
sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" \
|
sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" \
|
||||||
--rebuild-if-unbuilt=n \
|
--rebuild-if-unbuilt=n \
|
||||||
--buildpkg-exclude="${pkg}" \
|
"${args[@]}" "${pkgs[@]}"
|
||||||
${extra_args} "${pkg}"
|
|
||||||
sudo rm -f "${flag_file}"
|
sudo rm -f "${flag_file}"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_FALSE}" ]]; then
|
if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_FALSE}" ]]; then
|
||||||
|
# Breaking the following loops here:
|
||||||
|
#
|
||||||
# util-linux[udev] -> virtual->udev -> systemd -> util-linux
|
# util-linux[udev] -> virtual->udev -> systemd -> util-linux
|
||||||
break_dep_loop sys-apps/util-linux udev,systemd sys-apps/systemd cryptsetup
|
# util-linux[systemd] -> systemd -> util-linux
|
||||||
|
# cryptsetup[udev] -> virtual/udev -> systemd[cryptsetup] -> cryptsetup
|
||||||
# systemd[cryptsetup] -> cryptsetup -> lvm2 -> virtual/udev -> systemd
|
# lvm2[udev] -> virtual/udev -> systemd[cryptsetup] -> cryptsetup -> lvm2
|
||||||
break_dep_loop sys-apps/systemd cryptsetup
|
# 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
|
fi
|
||||||
|
|
||||||
export KBUILD_BUILD_USER="${BUILD_USER:-build}"
|
export KBUILD_BUILD_USER="${BUILD_USER:-build}"
|
||||||
|
Loading…
Reference in New Issue
Block a user