diff --git a/build_library/catalyst_toolchains.sh b/build_library/catalyst_toolchains.sh index 1e0ea642f5..c09ebbfd9a 100644 --- a/build_library/catalyst_toolchains.sh +++ b/build_library/catalyst_toolchains.sh @@ -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" </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 diff --git a/build_library/toolchain_util.sh b/build_library/toolchain_util.sh index f51e8d16ac..231f9b3ea8 100644 --- a/build_library/toolchain_util.sh +++ b/build_library/toolchain_util.sh @@ -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" </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 +}