mirror of
https://github.com/flatcar/scripts.git
synced 2025-09-22 14:11:07 +02:00
fix(toolchain_util.sh): Move cross-toolchain install code to common lib.
This will eventually be used by setup_board instead of the even more complicated toolchain code provided by chromite.
This commit is contained in:
parent
e145b916f2
commit
d5a19a0700
@ -11,83 +11,18 @@ source /tmp/toolchain_util.sh
|
||||
# build deps in crossdev's sysroot use ${PKGDIR}/cross/${CHOST} (no upload)
|
||||
# native toolchains use ${PKGDIR}/target/${BOARD} (uploaded to board location)
|
||||
|
||||
get_dependency_list() {
|
||||
local ROOT="$1"
|
||||
local IFS=$'| \t\n'
|
||||
shift
|
||||
|
||||
PORTAGE_CONFIGROOT="$ROOT" SYSROOT="$ROOT" \
|
||||
ROOT="$ROOT" emerge ${clst_myemergeopts} \
|
||||
--pretend --with-bdeps=y --onlydeps --quiet \
|
||||
"$@" | sed -e 's/.*\] \([^ :]*\).*/=\1/' |
|
||||
egrep -v "(=$(echo "$*")-[0-9])"
|
||||
}
|
||||
|
||||
configure_portage() {
|
||||
local pkg_path="$1"
|
||||
local profile="$2"
|
||||
|
||||
mkdir -p "${ROOT}/etc/portage"
|
||||
echo "eselect will report '!!! Warning: Strange path.' but that's OK"
|
||||
eselect profile set --force "$profile"
|
||||
|
||||
cat >"${ROOT}/etc/portage/make.conf" <<EOF
|
||||
CHOST=${CHOST}
|
||||
CBUILD=$(portageq envvar CBUILD)
|
||||
HOSTCC=\${CBUILD}-gcc
|
||||
ROOT="${ROOT}"
|
||||
SYSROOT="${SYSROOT}"
|
||||
PKG_CONFIG_PATH="\${SYSROOT}/usr/lib/pkgconfig/"
|
||||
PORTDIR="$(portageq envvar PORTDIR)"
|
||||
DISTDIR="\${PORTDIR}/distfiles"
|
||||
PKGDIR="\${PORTDIR}/packages/${pkg_path}"
|
||||
PORTDIR_OVERLAY="$(portageq envvar PORTDIR_OVERLAY)"
|
||||
EOF
|
||||
}
|
||||
|
||||
build_cross_toolchain() {
|
||||
local cross_chost="$1"
|
||||
local cross_pkgs=( $(get_cross_pkgs $cross_chost) )
|
||||
local PORTDIR="$(portageq envvar PORTDIR)"
|
||||
local PKGDIR="${PORTDIR}/packages/crossdev"
|
||||
|
||||
PKGDIR="${PKGDIR}" crossdev \
|
||||
--ov-output "/tmp/crossdev" --stable \
|
||||
--portage "${clst_myemergeopts}" \
|
||||
--init-target --target "${cross_chost}"
|
||||
|
||||
# If PKGCACHE is enabled check to see if binary packages are available.
|
||||
# If so then don't perform a full bootstrap and just call emerge instead.
|
||||
if [[ -n "${clst_PKGCACHE}" ]] && \
|
||||
PKGDIR="${PKGDIR}" emerge ${clst_myemergeopts} \
|
||||
--usepkgonly --binpkg-respect-use=y \
|
||||
--pretend "${cross_pkgs[@]}" &>/dev/null
|
||||
then
|
||||
PKGDIR="${PKGDIR}" run_merge -u "${cross_pkgs[@]}"
|
||||
else
|
||||
PKGDIR="${PKGDIR}" crossdev \
|
||||
--ov-output "/tmp/crossdev" --stable \
|
||||
--env PKGDIR="${PORTDIR}/packages/crossdev" \
|
||||
--portage "${clst_myemergeopts}" \
|
||||
--stage4 --target "${cross_chost}"
|
||||
fi
|
||||
|
||||
# Setup ccache for our shiny new toolchain
|
||||
ccache-config --install-links "${cross_chost}"
|
||||
}
|
||||
|
||||
configure_cross_root() {
|
||||
build_cross_libs() {
|
||||
local cross_chost="$1"
|
||||
local ROOT="/usr/${cross_chost}"
|
||||
|
||||
CHOST="${cross_chost}" ROOT="$ROOT" SYSROOT="$ROOT" \
|
||||
configure_portage "cross/${cross_chost}" \
|
||||
"${CROSS_PROFILE[${cross_chost}]}"
|
||||
_configure_sysroot "${CROSS_PROFILE[${cross_chost}]}"
|
||||
|
||||
# In order to get a dependency list we must calculate it before
|
||||
# updating package.provided. Otherwise portage will no-op.
|
||||
get_dependency_list "$ROOT" "${TOOLCHAIN_PKGS[@]}" \
|
||||
> "$ROOT/etc/portage/cross-${cross_chost}-depends"
|
||||
ROOT="$ROOT" _get_dependency_list \
|
||||
${clst_myemergeopts} "${TOOLCHAIN_PKGS[@]}" > \
|
||||
"$ROOT/etc/portage/cross-${cross_chost}-depends"
|
||||
|
||||
# Add toolchain to packages.provided since they are on the host system
|
||||
mkdir -p "$ROOT/etc/portage/profile/package.provided"
|
||||
@ -97,11 +32,6 @@ configure_cross_root() {
|
||||
cross_pkg_version=$(portageq match / "${cross_pkg}")
|
||||
echo "${native_pkg%/*}/${cross_pkg_version#*/}"
|
||||
done > "$ROOT/etc/portage/profile/package.provided/cross-${cross_chost}"
|
||||
}
|
||||
|
||||
build_cross_libs() {
|
||||
local cross_chost="$1"
|
||||
local ROOT="/usr/${cross_chost}"
|
||||
local cross_deps=$(<"$ROOT/etc/portage/cross-${cross_chost}-depends")
|
||||
|
||||
# --root is required because run_merge overrides ROOT=
|
||||
@ -111,10 +41,12 @@ build_cross_libs() {
|
||||
configure_target_root() {
|
||||
local board="$1"
|
||||
local cross_chost=$(get_board_chost "$1")
|
||||
local profile=$(get_board_profile "${board}")
|
||||
|
||||
CHOST="${cross_chost}" ROOT="/build/${board}" \
|
||||
SYSROOT="/usr/${cross_chost}" configure_portage \
|
||||
"target/${board}" "$(get_board_profile "${board}")"
|
||||
CHOST="${cross_chost}" \
|
||||
ROOT="/build/${board}" \
|
||||
SYSROOT="/usr/${cross_chost}" \
|
||||
_configure_sysroot "${profile}"
|
||||
}
|
||||
|
||||
build_target_toolchain() {
|
||||
@ -126,15 +58,21 @@ build_target_toolchain() {
|
||||
run_merge -u --root="$ROOT" "${TOOLCHAIN_PKGS[@]}"
|
||||
}
|
||||
|
||||
mkdir -p "/tmp/crossdev"
|
||||
export PORTDIR_OVERLAY="/tmp/crossdev $(portageq envvar PORTDIR_OVERLAY)"
|
||||
|
||||
for cross_chost in $(get_chost_list); do
|
||||
echo "Building cross toolchain for ${cross_chost}"
|
||||
build_cross_toolchain "${cross_chost}"
|
||||
configure_cross_root "${cross_chost}"
|
||||
build_cross_libs "${cross_chost}"
|
||||
PKGDIR="$(portageq envvar PKGDIR)/crossdev" \
|
||||
install_cross_toolchain "${cross_chost}" ${clst_myemergeopts}
|
||||
|
||||
sysroot_pkgdir="$(portageq envvar PKGDIR)/cross/${cross_chost}"
|
||||
PKGDIR="${sysroot_pkgdir}" build_cross_libs "${cross_chost}"
|
||||
done
|
||||
|
||||
for board in $(get_board_list); do
|
||||
echo "Building native toolchain for ${board}"
|
||||
configure_target_root "${board}"
|
||||
build_target_toolchain "${board}"
|
||||
target_pkgdir="$(portageq envvar PKGDIR)/target/${board}"
|
||||
PKGDIR="${target_pkgdir}" configure_target_root "${board}"
|
||||
PKGDIR="${target_pkgdir}" build_target_toolchain "${board}"
|
||||
done
|
||||
|
@ -71,3 +71,87 @@ get_cross_pkgs() {
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
### Toolchain building utilities ###
|
||||
|
||||
# Ugly hack to get a dependency list of a set of packages.
|
||||
# This is required to figure out what to install in the crossdev sysroot.
|
||||
# Usage: ROOT=/foo/bar _get_dependency_list pkgs... [--portage-opts...]
|
||||
_get_dependency_list() {
|
||||
local pkgs=( ${*/#-*/} )
|
||||
local IFS=$'| \t\n'
|
||||
|
||||
PORTAGE_CONFIGROOT="$ROOT" emerge "$@" --pretend \
|
||||
--emptytree --root-deps=rdeps --onlydeps --quiet | \
|
||||
sed -e 's/.*\] \([^ :]*\).*/=\1/' |
|
||||
egrep -v "(=$(echo "${pkgs[*]}")-[0-9])"
|
||||
}
|
||||
|
||||
# Configure a new ROOT
|
||||
# Values are copied from the environment or the current host configuration.
|
||||
# Usage: ROOT=/foo/bar SYSROOT=/foo/bar configure_portage coreos:some/profile
|
||||
_configure_sysroot() {
|
||||
local profile="$1"
|
||||
|
||||
mkdir -p "${ROOT}/etc/portage"
|
||||
echo "eselect will report '!!! Warning: Strange path.' but that's OK"
|
||||
eselect profile set --force "$profile"
|
||||
|
||||
cat >"${ROOT}/etc/portage/make.conf" <<EOF
|
||||
$(portageq envvar -v CHOST CBUILD ROOT SYSROOT \
|
||||
PORTDIR PORTDIR_OVERLAY DISTDIR PKGDIR)
|
||||
HOSTCC=\${CBUILD}-gcc
|
||||
PKG_CONFIG_PATH="\${SYSROOT}/usr/lib/pkgconfig/"
|
||||
EOF
|
||||
}
|
||||
|
||||
# Dump crossdev information to determine if configs must be reganerated
|
||||
_crossdev_info() {
|
||||
local cross_chost="$1"; shift
|
||||
echo -n "# "; crossdev --version
|
||||
echo "# $@"
|
||||
crossdev --show-target-cfg "${cross_chost}"
|
||||
}
|
||||
|
||||
# Build/install a toolchain w/ crossdev.
|
||||
# Usage: build_cross_toolchain chost [--portage-opts....]
|
||||
install_cross_toolchain() {
|
||||
local cross_chost="$1"; shift
|
||||
local cross_pkgs=( $(get_cross_pkgs $cross_chost) )
|
||||
local cross_cfg="/usr/${cross_chost}/etc/portage/${cross_chost}-crossdev"
|
||||
local cross_cfg_data=$(_crossdev_info "${cross_chost}" stable)
|
||||
|
||||
# may be called from either catalyst (root) or upgrade_chroot (user)
|
||||
local sudo=
|
||||
if [[ $(id -u) -ne 0 ]]; then
|
||||
sudo="sudo -E"
|
||||
fi
|
||||
|
||||
# Only call crossdev to regenerate configs if something has changed
|
||||
if ! cmp --quiet - "${cross_cfg}" <<<"${cross_cfg_data}"
|
||||
then
|
||||
$sudo crossdev --stable --portage "$*" \
|
||||
--init-target --target "${cross_chost}"
|
||||
sudo_clobber "${cross_cfg}" <<<"${cross_cfg_data}"
|
||||
fi
|
||||
|
||||
# If binary packages are enabled try to just emerge them instead of
|
||||
# doing a full bootstrap which speeds things up greatly. :)
|
||||
if [[ "$*" == *--usepkg* ]] && \
|
||||
emerge "$@" --usepkgonly --binpkg-respect-use=y \
|
||||
--pretend "${cross_pkgs[@]}" &>/dev/null
|
||||
then
|
||||
$sudo emerge "$@" --binpkg-respect-use=y -u "${cross_pkgs[@]}"
|
||||
else
|
||||
$sudo crossdev --stable --portage "$*" \
|
||||
--stage4 --target "${cross_chost}"
|
||||
fi
|
||||
|
||||
# Setup wrappers for our shiny new toolchain
|
||||
if [[ ! -e "/usr/lib/ccache/bin/${cross_chost}-gcc" ]]; then
|
||||
$sudo ccache-config --install-links "${cross_chost}"
|
||||
fi
|
||||
if [[ ! -e "/usr/lib/sysroot-wrappers/bin/${cross_chost}-gcc" ]]; then
|
||||
$sudo sysroot-config --install-links "${cross_chost}"
|
||||
fi
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user