mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-09 22:16:58 +02:00
Merge pull request #636 from flatcar/krnowak/matching-cross-toolchain-versions
build_library/toolchain_util.sh: Install matching versions of toolchain packages
This commit is contained in:
commit
e99a025508
@ -301,7 +301,7 @@ GENERATE_SLSA_PROVENANCE="true"
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
# Dump crossdev information to determine if configs must be reganerated
|
# Dump crossdev information to determine if configs must be regenerated
|
||||||
_crossdev_info() {
|
_crossdev_info() {
|
||||||
local cross_chost="$1"; shift
|
local cross_chost="$1"; shift
|
||||||
echo -n "# "; crossdev --version
|
echo -n "# "; crossdev --version
|
||||||
@ -309,17 +309,66 @@ _crossdev_info() {
|
|||||||
crossdev "$@" --show-target-cfg
|
crossdev "$@" --show-target-cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Gets atoms for emerge and flags for crossdev that will install such
|
||||||
|
# versions of cross toolchain packages that they will match versions
|
||||||
|
# of a normal packages that would be installed. That way, if, for
|
||||||
|
# example, some version of sys-devel/gcc needs to be masked, then
|
||||||
|
# there is no need to also mask cross-<arch>-cros-linux-gnu/gcc
|
||||||
|
# package.
|
||||||
|
#
|
||||||
|
# Example use:
|
||||||
|
#
|
||||||
|
# local -a emerge_atoms=() crossdev_flags=()
|
||||||
|
# _get_cross_pkgs_for_emerge_and_crossdev x86_64-cros-linux-gnu emerge_atoms crossdev_flags
|
||||||
|
#
|
||||||
|
# emerge_atoms will have atoms like "=cross-x86_64-cros-linux-gnu/gcc-11.3.1_p20221209"
|
||||||
|
#
|
||||||
|
# crossdev_flags will have flags like "--gcc" "=11.3.1_p20221209"
|
||||||
|
_get_cross_pkgs_for_emerge_and_crossdev() {
|
||||||
|
local cross_chost="${1}"; shift
|
||||||
|
local gcpfeac_emerge_atoms_var_name="${1}"; shift
|
||||||
|
local gcpfeac_crossdev_pkg_flags_var_name="${1}"; shift
|
||||||
|
local -n gcpfeac_emerge_atoms_var_ref="${gcpfeac_emerge_atoms_var_name}"
|
||||||
|
local -n gcpfeac_crossdev_pkg_flags_var_ref="${gcpfeac_crossdev_pkg_flags_var_name}"
|
||||||
|
|
||||||
|
local -a all_pkgs=( "${TOOLCHAIN_PKGS[@]}" sys-devel/gdb )
|
||||||
|
local -A crossdev_flags_map=(
|
||||||
|
[binutils]=--binutils
|
||||||
|
[gdb]=--gdb
|
||||||
|
[gcc]=--gcc
|
||||||
|
[linux-headers]=--kernel
|
||||||
|
[glibc]=--libc
|
||||||
|
)
|
||||||
|
local emerge_report pkg line version pkg_name crossdev_flag
|
||||||
|
|
||||||
|
emerge_report=$(emerge --quiet --pretend --oneshot --nodeps "${all_pkgs[@]}")
|
||||||
|
for pkg in "${all_pkgs[@]}"; do
|
||||||
|
line=$(grep -o "${pkg}-[^ ]*" <<<"${emerge_report}")
|
||||||
|
cross_pkg="${pkg/*\//cross-${cross_chost}/}"
|
||||||
|
version="${line#${pkg}-}"
|
||||||
|
gcpfeac_emerge_atoms_var_ref+=( "=${cross_pkg}-${version}" )
|
||||||
|
pkg_name="${pkg#*/}"
|
||||||
|
crossdev_flag="${crossdev_flags_map[${pkg_name}]}"
|
||||||
|
gcpfeac_crossdev_pkg_flags_var_ref+=( "${crossdev_flag}" "=${version}" )
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
# Build/install a toolchain w/ crossdev.
|
# Build/install a toolchain w/ crossdev.
|
||||||
# Usage: build_cross_toolchain chost [--portage-opts....]
|
# Usage: build_cross_toolchain chost [--portage-opts....]
|
||||||
install_cross_toolchain() {
|
install_cross_toolchain() {
|
||||||
local cross_chost="$1"; shift
|
local cross_chost="${1}"; shift
|
||||||
local cross_pkgs=( $(get_cross_pkgs $cross_chost) )
|
local cross_cfg cross_cfg_data cbuild
|
||||||
# build gdb as an extra step, default to stable ebuilds
|
local -a cross_flags emerge_flags emerge_atoms cross_pkg_flags
|
||||||
local cross_flags=( --ex-gdb --stable --target "${cross_chost}" )
|
|
||||||
local cross_cfg="/usr/${cross_chost}/etc/portage/${cross_chost}-crossdev"
|
emerge_atoms=()
|
||||||
local cross_cfg_data=$(_crossdev_info "${cross_flags[@]}")
|
cross_pkg_flags=()
|
||||||
local cbuild="$(portageq envvar CBUILD)"
|
_get_cross_pkgs_for_emerge_and_crossdev "${cross_chost}" emerge_atoms cross_pkg_flags
|
||||||
local emerge_flags=( "$@" --binpkg-respect-use=y --update --newuse )
|
# build gdb as an extra step, use specific versions of toolchain packages
|
||||||
|
cross_flags=( --ex-gdb --target "${cross_chost}" "${cross_pkg_flags[@]}" )
|
||||||
|
cross_cfg="/usr/${cross_chost}/etc/portage/${cross_chost}-crossdev"
|
||||||
|
cross_cfg_data=$(_crossdev_info "${cross_flags[@]}")
|
||||||
|
cbuild=$(portageq envvar CBUILD)
|
||||||
|
emerge_flags=( "$@" --binpkg-respect-use=y --update --newuse )
|
||||||
|
|
||||||
# Forcing binary packages for toolchain packages breaks crossdev since it
|
# Forcing binary packages for toolchain packages breaks crossdev since it
|
||||||
# prevents it from rebuilding with different use flags during bootstrap.
|
# prevents it from rebuilding with different use flags during bootstrap.
|
||||||
@ -335,7 +384,8 @@ install_cross_toolchain() {
|
|||||||
|
|
||||||
# crossdev will arbitrarily choose an overlay that it finds first.
|
# crossdev will arbitrarily choose an overlay that it finds first.
|
||||||
# Force it to use the one created by configure_crossdev_overlay
|
# Force it to use the one created by configure_crossdev_overlay
|
||||||
local cross_overlay=$(portageq get_repo_path / x-crossdev)
|
local cross_overlay
|
||||||
|
cross_overlay=$(portageq get_repo_path / x-crossdev)
|
||||||
if [[ -n "${cross_overlay}" ]]; then
|
if [[ -n "${cross_overlay}" ]]; then
|
||||||
cross_flags+=( --ov-output "${cross_overlay}" )
|
cross_flags+=( --ov-output "${cross_overlay}" )
|
||||||
else
|
else
|
||||||
@ -354,14 +404,13 @@ install_cross_toolchain() {
|
|||||||
# bootstrap via crossdev, otherwise just install the binaries (if enabled).
|
# bootstrap via crossdev, otherwise just install the binaries (if enabled).
|
||||||
# It is ok to build gdb from source outside of crossdev.
|
# It is ok to build gdb from source outside of crossdev.
|
||||||
if emerge "${emerge_flags[@]}" \
|
if emerge "${emerge_flags[@]}" \
|
||||||
--pretend "${cross_pkgs[@]}" | grep -q '^\[ebuild'
|
--pretend "${emerge_atoms[@]}" | grep -q '^\[ebuild'
|
||||||
then
|
then
|
||||||
echo "Doing a full bootstrap via crossdev"
|
echo "Doing a full bootstrap via crossdev"
|
||||||
$sudo crossdev "${cross_flags[@]}" --stage4
|
$sudo crossdev "${cross_flags[@]}" --stage4
|
||||||
else
|
else
|
||||||
echo "Installing existing binaries"
|
echo "Installing existing binaries"
|
||||||
$sudo emerge "${emerge_flags[@]}" \
|
$sudo emerge "${emerge_flags[@]}" "${emerge_atoms[@]}"
|
||||||
"cross-${cross_chost}/gdb" "${cross_pkgs[@]}"
|
|
||||||
if [ "${cbuild}" = "x86_64-pc-linux-gnu" ] && [ "${cross_chost}" = aarch64-cros-linux-gnu ] && \
|
if [ "${cbuild}" = "x86_64-pc-linux-gnu" ] && [ "${cross_chost}" = aarch64-cros-linux-gnu ] && \
|
||||||
[ ! -d /usr/lib/rust-*/rustlib/aarch64-unknown-linux-gnu ] && [ ! -d /usr/lib/rustlib/aarch64-unknown-linux-gnu ]; then
|
[ ! -d /usr/lib/rust-*/rustlib/aarch64-unknown-linux-gnu ] && [ ! -d /usr/lib/rustlib/aarch64-unknown-linux-gnu ]; then
|
||||||
# If no aarch64 folder exists, warn about the situation but don't compile Rust here or download it as binary package
|
# If no aarch64 folder exists, warn about the situation but don't compile Rust here or download it as binary package
|
||||||
|
Loading…
Reference in New Issue
Block a user