mirror of
				https://github.com/flatcar/scripts.git
				synced 2025-10-31 16:21:04 +01:00 
			
		
		
		
	This option became ineffective with EAPI 7 and all trace of older EAPIs has now gone. Signed-off-by: James Le Cuirot <jlecuirot@microsoft.com>
		
			
				
	
	
		
			220 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| # Copyright (c) 2023 The Flatcar Maintainers. All rights reserved.
 | |
| # Use of this source code is governed by the Apache 2.0 license.
 | |
| 
 | |
| DEFAULT_STAGING_ROOT="/build/"
 | |
| 
 | |
| function lineprepend() {
 | |
|   awk -v msg="$*" '{ print msg ": " $0}'
 | |
| }
 | |
| # --
 | |
| 
 | |
| function set_prefix_vars() {
 | |
|   local name="${1}"
 | |
|   local prefix="${2}"
 | |
| 
 | |
|   EPREFIX="${prefix}"
 | |
|   PREFIXNAME="${name}"
 | |
|   STAGINGDIR="${FLAGS_staging_dir}"
 | |
|   STAGINGROOT="${STAGINGDIR}/root"
 | |
|   FINALDIR="${FLAGS_final_dir}"
 | |
|   FINALROOT="${FINALDIR}/root"
 | |
| 
 | |
|   CB_ROOT="${FLAGS_cross_boss_root}"
 | |
| 
 | |
|   # the prefix profile enables unstable via MAKE_DEFAULTS; we don't want those.
 | |
|   PREFIX_BOARD="${FLAGS_board}"
 | |
|   case "${PREFIX_BOARD}" in
 | |
|     amd64-usr)
 | |
|       PREFIX_CHOST="x86_64-cros-linux-gnu"
 | |
|       PREFIX_KEYWORDS="amd64 -~amd64"
 | |
|       ;;
 | |
|     arm64-usr)
 | |
|       PREFIX_CHOST="aarch64-cros-linux-gnu"
 | |
|       PREFIX_KEYWORDS="arm64 -~arm64"
 | |
|       ;;
 | |
|   esac
 | |
| 
 | |
|   export EPREFIX PREFIXNAME STAGINGDIR STAGINGROOT FINALDIR FINALROOT CB_ROOT \
 | |
|           PREFIX_CHOST PREFIX_KEYWORDS PREFIX_BOARD
 | |
| }
 | |
| # --
 | |
| 
 | |
| function install_prereqs() {
 | |
|   # Make sure cross-boss prerequisites are installed in the SDK
 | |
|   local prefix_repo="${1}"
 | |
| 
 | |
|   sudo emerge --newuse sys-apps/bubblewrap
 | |
|   sudo emerge --newuse -1 ">=dev-python/gpep517-15"
 | |
| 
 | |
|   # HACK ALERT: needed for cb-bootstrap to build the initial toolchain in staging.
 | |
|   #             cb-bootstrap should be ported to use the prefix repos.conf instead.
 | |
|   sudo cp -r "${prefix_repo}/skel/etc/portage/repos.conf" /usr/x86_64-cros-linux-gnu/etc/portage/
 | |
|   sudo cp -r "${prefix_repo}/skel/etc/portage/repos.conf" /usr/aarch64-cros-linux-gnu/etc/portage/
 | |
| }
 | |
| # --
 | |
| 
 | |
| function setup_prefix_dirs() {
 | |
|   local prefix_repo="${1}"
 | |
|   sudo mkdir -v -p \
 | |
|           "${STAGINGDIR}/logs" \
 | |
|           "${STAGINGDIR}/pkgs" \
 | |
|           "${STAGINGDIR}/tmp" \
 | |
|           "${STAGINGROOT}${EPREFIX}/etc" \
 | |
|           "${FINALDIR}/logs" \
 | |
|           "${FINALDIR}/tmp" \
 | |
|           "${FINALROOT}${EPREFIX}/etc"
 | |
| 
 | |
|   sudo cp -vR "${prefix_repo}/skel/etc/portage" "${STAGINGROOT}${EPREFIX}/etc/"
 | |
|   sudo cp -vR "${prefix_repo}/skel/etc/portage" "${FINALROOT}${EPREFIX}/etc/"
 | |
| 
 | |
|   local profile="/mnt/host/source/src/third_party/portage-stable/profiles/default/linux"
 | |
|   case "${PREFIX_BOARD}" in
 | |
|     amd64-usr) profile="${profile}/amd64/17.1/no-multilib/prefix/kernel-3.2+";;
 | |
|     arm64-usr) profile="${profile}/arm64/17.0/prefix/kernel-3.2+";;
 | |
|   esac
 | |
| 
 | |
|   sudo ln -s "${profile}" "${STAGINGROOT}${EPREFIX}/etc/portage/make.profile"
 | |
|   sudo ln -s "${profile}" "${FINALROOT}${EPREFIX}/etc/portage/make.profile"
 | |
| }
 | |
| # --
 | |
| 
 | |
| function extract_gcc_libs() {
 | |
|   # GCC libs aren't available in a separate package but a full GCC install would make final too big
 | |
|   # TODO: the below is effectively a copy of build_library/prod_image_util.sh::extract_prod_gcc()
 | |
|   #       and should eventually be reconciled.
 | |
|   gcc_ver="$(sudo -E PORTAGE_CONFIGROOT="${STAGINGROOT}${EPREFIX}" \
 | |
|                      portageq best_visible "${STAGINGROOT}${EPREFIX}" installed sys-devel/gcc)"
 | |
|   pkgdir="$(sudo -E PORTAGE_CONFIGROOT="${STAGINGROOT}${EPREFIX}" portageq pkgdir)"
 | |
|   qtbz2 -O -t "$pkgdir/$gcc_ver".tbz2 \
 | |
|           | sudo tar -v -C "${FINALROOT}" -xj \
 | |
|                      --transform "s#.${EPREFIX}/usr/lib/.*/#.${EPREFIX}/usr/lib64/#" \
 | |
|                      --wildcards ".${EPREFIX}/usr/lib/gcc/*.so*"
 | |
| }
 | |
| # --
 | |
| 
 | |
| function create_make_conf() {
 | |
|   local which="${1}" \
 | |
|         filepath \
 | |
|         dir \
 | |
|         portage_profile \
 | |
|         emerge_opts
 | |
| 
 | |
|   case "${which}" in
 | |
|     staging)
 | |
|       filepath="${STAGINGROOT}${EPREFIX}/etc/portage/make.conf"
 | |
|       dir="${STAGINGDIR}"
 | |
|       emerge_opts="--buildpkg"
 | |
|       ;;
 | |
|     final)
 | |
|       filepath="${FINALROOT}${EPREFIX}/etc/portage/make.conf"
 | |
|       dir="${FINALDIR}"
 | |
|       emerge_opts="--usepkgonly"
 | |
|       ;;
 | |
|   esac
 | |
| 
 | |
| sudo_clobber "${filepath}" <<EOF
 | |
| DISTDIR="/mnt/host/source/.cache/distfiles"
 | |
| PKGDIR=${STAGINGDIR@Q}/pkgs
 | |
| PORT_LOGDIR=${dir@Q}/logs
 | |
| PORTAGE_TMPDIR=${dir@Q}/tmp
 | |
| PORTAGE_BINHOST=""
 | |
| PORTAGE_USERNAME="sdk"
 | |
| MAKEOPTS="--jobs=4"
 | |
| CHOST=${PREFIX_CHOST@Q}
 | |
| 
 | |
| ACCEPT_KEYWORDS=${PREFIX_KEYWORDS@Q}
 | |
| 
 | |
| EMERGE_DEFAULT_OPTS=${emerge_opts@Q}
 | |
| 
 | |
| USE="
 | |
| -desktop
 | |
| -installkernel
 | |
| -llvm
 | |
| -nls
 | |
| -openmp
 | |
| -udev
 | |
| -wayland
 | |
| -X
 | |
| "
 | |
| EOF
 | |
| }
 | |
| # --
 | |
| 
 | |
| function emerge_name() {
 | |
|   local path=""
 | |
|   if [ "${1:-}" = "with-path" ] ; then
 | |
|     path="/usr/local/bin/"
 | |
|   fi
 | |
| 
 | |
|   echo "${path}emerge-prefix-${PREFIXNAME}-${PREFIX_BOARD}"
 | |
| }
 | |
| # --
 | |
| 
 | |
| function create_emerge_wrapper() {
 | |
|   local filename="$(emerge_name with-path)"
 | |
|   sudo_clobber "${filename}" <<EOF
 | |
| #!/bin/bash
 | |
| 
 | |
| # emerge comfort wrapper for emerging prefix packages.
 | |
| # The wrapper will build packages and dependencies in staging
 | |
| #   and then install binpkgs in prefix.
 | |
| 
 | |
| set -euo pipefail
 | |
| 
 | |
| PREFIXNAME=${PREFIXNAME@Q}
 | |
| EPREFIX=${EPREFIX@Q}
 | |
| STAGINGROOT=${STAGINGROOT@Q}
 | |
| FINALROOT=${FINALROOT@Q}
 | |
| CB_ROOT=${CB_ROOT@Q}
 | |
| 
 | |
| EOF
 | |
| 
 | |
|   sudo_append "${filename}" <<'EOF'
 | |
| if [ "${1}" = "--help" ] ; then
 | |
|     echo "$0 : emerge prefix wrapper for prefix '${PREFIXNAME}'"
 | |
|     echo "Usage:"
 | |
|     echo "  $0 [--install|--stage] <emerge-opts>"
 | |
|     echo "                          Builds packages in prefix' staging and installs w/ runtime dependencies"
 | |
|     echo "                           to prefix' final root."
 | |
|     echo "             --stage      Build binpkg in staging but don't install."
 | |
|     echo "             --install    Skip build, just install. Binpkg must exist in staging."
 | |
|     echo
 | |
|     echo "      Prefix configuration:"
 | |
|     echo "        PREFIXNAME=${PREFIXNAME@Q}"
 | |
|     echo "        EPREFIX=${EPREFIX@Q}"
 | |
|     echo "        STAGINGROOT=${STAGINGROOT@Q}"
 | |
|     echo "        FINALROOT=${FINALROOT@Q}"
 | |
|     echo "        CB_ROOT=${CB_ROOT@Q}"
 | |
|     exit
 | |
| fi
 | |
| 
 | |
| skip_build="false"
 | |
| skip_install="false"
 | |
| 
 | |
| case "${1}" in
 | |
|     --install) skip_build="true"; shift;;
 | |
|     --stage) skip_install="true"; shift;;
 | |
| esac
 | |
| 
 | |
| if [ "${skip_build}" = "true" ]  ; then
 | |
|     echo "Skipping build into staging as requested."
 | |
|     echo "NOTE that install into final will fail if binpkgs are missing."
 | |
| else
 | |
|     echo "Building in staging..."
 | |
|     sudo -E EPREFIX="${EPREFIX}" "${CB_ROOT}/bin/cb-emerge" "${STAGINGROOT}" "$@"
 | |
| fi
 | |
| 
 | |
| if [ "${skip_install}" = "true" ]  ; then
 | |
|     echo "Skipping install into final as requested."
 | |
| else
 | |
|     echo "Installing..."
 | |
|     sudo -E EPREFIX="${EPREFIX}" \
 | |
|             ROOT="${FINALROOT}" \
 | |
|             PORTAGE_CONFIGROOT="${FINALROOT}${EPREFIX}" emerge "$@"
 | |
| fi
 | |
| EOF
 | |
| 
 | |
|   sudo chmod 755 "${filename}"
 | |
| }
 | |
| # --
 |