mirror of
				https://github.com/flatcar/scripts.git
				synced 2025-10-26 22:01:15 +01:00 
			
		
		
		
	This evidently hasn't been used in a very long time, if ever, and it's just adding confusion. Signed-off-by: James Le Cuirot <jlecuirot@microsoft.com>
		
			
				
	
	
		
			375 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			375 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| . "$(dirname "$0")/common.sh" || exit 1
 | |
| . "${BUILD_LIBRARY_DIR}/toolchain_util.sh" || exit 1
 | |
| 
 | |
| # Script must run inside the chroot
 | |
| assert_inside_chroot
 | |
| 
 | |
| assert_not_root_user
 | |
| 
 | |
| # Developer-visible flags.
 | |
| DEFINE_string board "${DEFAULT_BOARD}" \
 | |
|   "The name of the board to set up."
 | |
| DEFINE_boolean default "${FLAGS_FALSE}" \
 | |
|   "Set board to the default board in your chroot"
 | |
| DEFINE_boolean force "${FLAGS_FALSE}" \
 | |
|   "Force re-creating board root."
 | |
| DEFINE_boolean usepkg "${FLAGS_TRUE}" \
 | |
|   "Use binary packages when possible."
 | |
| DEFINE_boolean usepkgonly "${FLAGS_FALSE}" \
 | |
|   "Only use/download binary packages."
 | |
| DEFINE_boolean getbinpkg "${FLAGS_TRUE}" \
 | |
|   "Download binary packages from remote repository."
 | |
| DEFINE_string getbinpkgver "" \
 | |
|   "Use binary packages from a specific version."
 | |
| DEFINE_string pkgdir "" \
 | |
|   "Use binary packages from a custom directory instead of /build/[ARCH]/var/lib/portage/pkgs/."
 | |
| DEFINE_string binhost "" \
 | |
|   "Use binary packages from a specific location instead of $FLATCAR_DEV_BUILDS/... "
 | |
| DEFINE_boolean skip_toolchain_update "${FLAGS_FALSE}" \
 | |
|   "Don't update toolchain automatically."
 | |
| DEFINE_boolean skip_chroot_upgrade "${FLAGS_FALSE}" \
 | |
|   "Don't run the chroot upgrade automatically; use with care."
 | |
| DEFINE_boolean regen_configs "${FLAGS_FALSE}" \
 | |
|   "Regenerate all config files (useful for modifying profiles w/out rebuild)."
 | |
| DEFINE_boolean regen_configs_only "${FLAGS_FALSE}" \
 | |
|   "Regenerate all config files and nothing else, even if nothing else is installed."
 | |
| 
 | |
| FLAGS_HELP="usage: $(basename $0) [flags]
 | |
| 
 | |
| setup_board sets up the sysroot for a particular board. This script is called
 | |
| automatically when you run build_packages, so there is typically no need to
 | |
| call it directly, unless you want to blow away your board (using --force).
 | |
| "
 | |
| show_help_if_requested "$@"
 | |
| 
 | |
| # The following options are advanced options, only available to those willing
 | |
| # to read the source code. They are not shown in help output, since they are
 | |
| # not needed for the typical developer workflow.
 | |
| DEFINE_string libc_version "[stable]" \
 | |
|   "Version of libc to use."
 | |
| DEFINE_boolean quiet $FLAGS_FALSE \
 | |
|   "Don't print warnings when board already exists."
 | |
| DEFINE_string variant "" \
 | |
|   "Board variant."
 | |
| 
 | |
| 
 | |
| # builds wrappers like equery-arm-generic.
 | |
| # args:
 | |
| #   $1:  command to wrap
 | |
| #   rest:  extra arguments to pass to the command
 | |
| _generate_wrapper() {
 | |
|   local command="${1}"
 | |
|   shift
 | |
|   local extra_args="$@"
 | |
| 
 | |
| 
 | |
|   local target="/usr/local/bin/${command}-${BOARD_VARIANT}"
 | |
|   sudo_clobber "${target}" <<EOF
 | |
| #!/bin/bash
 | |
| 
 | |
| export PORTAGE_CONFIGROOT="$BOARD_ROOT"
 | |
| export SYSROOT="\${SYSROOT:-$BOARD_ROOT}"
 | |
| export ROOT="$BOARD_ROOT"
 | |
| exec sudo -E ${command} ${extra_args} "\$@"
 | |
| EOF
 | |
|   # Note: parent will process these.
 | |
|   wrappers+=( "${target}" )
 | |
|   upper=${command^^}
 | |
|   eval ${upper/-/_}_WRAPPER="${target}" # ${foo^^} returns toupper($foo)
 | |
| }
 | |
| 
 | |
| generate_all_wrappers() {
 | |
|   local cmds=() wrappers=()
 | |
|   local wrapper qemu
 | |
| 
 | |
|   # If the QEMU user space emulator is missing for this board arch, that implies
 | |
|   # the board arch matches the SDK arch and therefore emulation is unnecessary.
 | |
|   qemu=$(type -P "qemu-${BOARD_CHOST%%-*}") || unset qemu
 | |
| 
 | |
|   info "Generating wrapper scripts"
 | |
| 
 | |
|   for wrapper in emerge ebuild eclean equery portageq \
 | |
|                  qcheck qfile qlist emaint glsa-check; do
 | |
|     _generate_wrapper ${wrapper}
 | |
|   done
 | |
| 
 | |
|   wrapper="/usr/local/bin/flatcar_workon-${BOARD_VARIANT}"
 | |
|   sudo_clobber "${wrapper}" <<EOF
 | |
| #!/bin/bash
 | |
| exec "${SRC_ROOT}/scripts/flatcar_workon" --board ${BOARD_VARIANT} "\$@"
 | |
| EOF
 | |
|   wrappers+=( "${wrapper}" )
 | |
| 
 | |
|   wrapper="/usr/local/bin/gdb-${BOARD_VARIANT}"
 | |
|   sudo_clobber "${wrapper}" <<EOF
 | |
| #!/bin/bash
 | |
| exec ${BOARD_CHOST}-gdb -iex 'set sysroot ${BOARD_ROOT}' "\$@"
 | |
| EOF
 | |
|   wrappers+=( "${wrapper}" )
 | |
| 
 | |
|   # ldconfig cannot generate caches for non-native arches. Use QEMU and the
 | |
|   # native ldconfig to work around that.
 | |
|   wrapper="/usr/local/sbin/ldconfig-${BOARD_VARIANT}"
 | |
|   sudo_clobber "${wrapper}" <<EOF
 | |
| #!/bin/sh
 | |
| exec ${qemu-} "${BOARD_ROOT}"/sbin/ldconfig -r "${BOARD_ROOT}" "\$@"
 | |
| EOF
 | |
|   wrappers+=( "${wrapper}" )
 | |
| 
 | |
|   # Create a CHOST-based ldconfig symlink for Portage to call.
 | |
|   sudo ln -sfT "ldconfig-${BOARD_VARIANT}" "/usr/local/sbin/${BOARD_CHOST}-ldconfig"
 | |
| 
 | |
|   cmds+=(
 | |
|     "chmod a+rx ${wrappers[*]}"
 | |
|     "chown root:root ${wrappers[*]}"
 | |
|   )
 | |
| 
 | |
|   sudo_multi "${cmds[@]}"
 | |
| }
 | |
| 
 | |
| generate_binhost_list() {
 | |
|   FLAGS_getbinpkgver="${FLAGS_getbinpkgver/current/${FLATCAR_VERSION_ID}}"
 | |
|   FLAGS_getbinpkgver="${FLAGS_getbinpkgver/latest/${FLATCAR_VERSION_ID}}"
 | |
|   FLAGS_getbinpkgver="${FLAGS_getbinpkgver/sdk/${FLATCAR_SDK_VERSION}}"
 | |
| 
 | |
|   get_board_binhost "${BOARD}" ${FLAGS_getbinpkgver}
 | |
| }
 | |
| 
 | |
| # Parse command line flags
 | |
| FLAGS "$@" || exit 1
 | |
| eval set -- "${FLAGS_ARGV}"
 | |
| 
 | |
| # Only now can we die on error.  shflags functions leak non-zero error codes,
 | |
| # so will die prematurely if 'switch_to_strict_mode' is specified before now.
 | |
| switch_to_strict_mode
 | |
| 
 | |
| if [ -z "$FLAGS_board" ] ; then
 | |
|   error "--board required."
 | |
|   exit 1
 | |
| fi
 | |
| 
 | |
| if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_TRUE}" ]]; then
 | |
|   for flag in usepkg getbinpkg; do
 | |
|     fvar="FLAGS_${flag}"
 | |
|     if [[ "${!fvar}" -ne "${FLAGS_TRUE}" ]]; then
 | |
|       die_notrace "--usepkgonly is incompatible with --no${flag}"
 | |
|     fi
 | |
|   done
 | |
| fi
 | |
| 
 | |
| get_board_and_variant $FLAGS_board $FLAGS_variant
 | |
| 
 | |
| # Locations we will need
 | |
| COREOS_OVERLAY="${REPO_ROOT}/src/third_party/coreos-overlay"
 | |
| COREOS_CONFIG="${COREOS_OVERLAY}/coreos/config"
 | |
| BOARD_ROOT="/build/${BOARD_VARIANT}"
 | |
| BOARD_ETC="${BOARD_ROOT}/etc"
 | |
| BOARD_ARCH=$(get_board_arch "$BOARD")
 | |
| BOARD_CHOST=$(get_board_chost ${BOARD})
 | |
| PORTAGE_PROFILE=$(get_board_profile "$BOARD")
 | |
| BOARD_BINHOST="$FLAGS_binhost $(generate_binhost_list)"
 | |
| BOARD_PKGDIR="${FLAGS_pkgdir:-${BOARD_ROOT}/var/lib/portage/pkgs}"
 | |
| 
 | |
| if [[ ${FLAGS_regen_configs_only} -eq ${FLAGS_TRUE} ]]; then
 | |
|   FLAGS_regen_configs=${FLAGS_TRUE}
 | |
|   FLAGS_skip_chroot_upgrade=${FLAGS_TRUE}
 | |
| elif [[ -d "${BOARD_ROOT}" ]]; then
 | |
|   if [[ ${FLAGS_force} -eq ${FLAGS_TRUE} ]]; then
 | |
|     info "--force set.  Re-creating ${BOARD_ROOT}..."
 | |
|     # Removal takes long. Make it asynchronous.
 | |
|     TEMP_DIR=`mktemp -d`
 | |
|     sudo mv "${BOARD_ROOT}" "${TEMP_DIR}"
 | |
|     sudo rm -rf "${TEMP_DIR}" &
 | |
|   elif [[ ${FLAGS_regen_configs} -eq ${FLAGS_FALSE} ]]; then
 | |
|     if [[ ${FLAGS_quiet} -eq ${FLAGS_FALSE} ]]; then
 | |
|       warn "Board output directory '$BOARD_ROOT' already exists."
 | |
|       warn "Not setting up board root. "
 | |
|       warn "Use --force to clobber the board root and start again."
 | |
|     fi
 | |
|     exit 0
 | |
|   fi
 | |
| else
 | |
|   # Missing board root and --regen_configs_only wasn't used.
 | |
|   FLAGS_regen_configs=${FLAGS_FALSE}
 | |
| fi
 | |
| 
 | |
| # Before we can run any tools, we need to update chroot
 | |
| UPDATE_ARGS="--toolchain_boards=${BOARD}"
 | |
| if [ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ]; then
 | |
|   UPDATE_ARGS+=" --usepkg"
 | |
|   if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_TRUE}" ]]; then
 | |
|     UPDATE_ARGS+=" --usepkgonly"
 | |
|   else
 | |
|     UPDATE_ARGS+=" --nousepkgonly"
 | |
|   fi
 | |
|   if [[ "${FLAGS_getbinpkg}" -eq "${FLAGS_TRUE}" ]]; then
 | |
|     UPDATE_ARGS+=" --getbinpkg "
 | |
|   else
 | |
|     UPDATE_ARGS+=" --nogetbinpkg "
 | |
|   fi
 | |
|   if [[ -n "${FLAGS_binhost}" ]]; then
 | |
|     UPDATE_ARGS+=" --binhost=${FLAGS_binhost} "
 | |
|   fi
 | |
| else
 | |
|   UPDATE_ARGS+=" --nousepkg"
 | |
| fi
 | |
| if [ "${FLAGS_skip_toolchain_update}" -eq "${FLAGS_TRUE}" ]; then
 | |
|   UPDATE_ARGS+=" --skip_toolchain_update"
 | |
| fi
 | |
| if [ "${FLAGS_skip_chroot_upgrade}" -eq "${FLAGS_FALSE}" ] ; then
 | |
|   "${SRC_ROOT}/scripts"/update_chroot ${UPDATE_ARGS}
 | |
| fi
 | |
| 
 | |
| # Migrate board roots that were created before the package location
 | |
| # was standardized to /var/lib/portage/pkgs, build_image will fail if we
 | |
| # simply forget about the old location and start writing to the new.
 | |
| # Keep /packages as a compatibility symlink until everyone is updated.
 | |
| if [[ ! -L "${BOARD_ROOT}/packages" ]]; then
 | |
|   if [[ ! -d "${BOARD_ROOT}/var/lib/portage/pkgs" ]]; then
 | |
|     if [[ -d "${BOARD_ROOT}/packages" ]]; then
 | |
|       warn "Moving board package directory to ${BOARD_ROOT}/var/lib/portage/pkgs"
 | |
|       sudo mkdir -p "${BOARD_ROOT}/var/lib/portage"
 | |
|       sudo mv "${BOARD_ROOT}/packages" "${BOARD_ROOT}/var/lib/portage/pkgs"
 | |
|     else
 | |
|       sudo mkdir -p "${BOARD_ROOT}/var/lib/portage/pkgs"
 | |
|     fi
 | |
|   fi
 | |
|   sudo ln -sfT "var/lib/portage/pkgs" "${BOARD_ROOT}/packages"
 | |
| fi
 | |
| 
 | |
| info "Configuring portage in ${BOARD_ROOT}"
 | |
| sudo mkdir -p "${BOARD_ETC}/portage/"{profile,repos.conf}
 | |
| sudo ln -sfT "$(portageq get_repo_path / coreos-overlay)/coreos/user-patches" \
 | |
|    "${BOARD_ETC}/portage/patches"
 | |
| sudo cp /etc/portage/repos.conf/* "${BOARD_ETC}"/portage/repos.conf/
 | |
| # set PORTAGE_CONFIGROOT to tell eselect to modify the profile inside
 | |
| # /build/<arch>-usr, but set ROOT to /, so eselect will actually find
 | |
| # the profile which is outside /build/<arch>-usr, set SYSROOT to / as
 | |
| # well, because it must match ROOT
 | |
| sudo \
 | |
|     PORTAGE_CONFIGROOT="${BOARD_ROOT}" ROOT=/ SYSROOT=/ \
 | |
|     eselect profile set --force "${PORTAGE_PROFILE}"
 | |
| 
 | |
| # Cleanup/migrate from older make.conf files
 | |
| sudo rm -f "${BOARD_ETC}/make.conf" "${BOARD_ETC}/make.conf.common"
 | |
| if [[ -f "${BOARD_ETC}/make.conf.user" ]]; then
 | |
|     sudo mv "${BOARD_ETC}/make.conf.user" \
 | |
|         "${BOARD_ETC}/portage/make.conf.user"
 | |
| else
 | |
|     sudo touch "${BOARD_ETC}/portage/make.conf.user"
 | |
| fi
 | |
| 
 | |
| sudo_clobber "${BOARD_ETC}/portage/make.conf" <<EOF
 | |
| # Created by setup_board
 | |
| 
 | |
| # Settings derived from the host environment
 | |
| CBUILD="$(portageq envvar CHOST)"
 | |
| HOSTCC="$(portageq envvar CHOST)-gcc"
 | |
| DISTDIR="$(portageq envvar DISTDIR)"
 | |
| MAKEOPTS="$(portageq envvar MAKEOPTS)"
 | |
| PORTAGE_USERNAME="$(portageq envvar PORTAGE_USERNAME)"
 | |
| 
 | |
| # Board specific settings
 | |
| CHOST="${BOARD_CHOST}"
 | |
| ROOT="${BOARD_ROOT}/"
 | |
| PKGDIR="${BOARD_PKGDIR}"
 | |
| PORT_LOGDIR="${BOARD_ROOT}/var/log/portage"
 | |
| PORTAGE_TMPDIR="${BOARD_ROOT}/var/tmp"
 | |
| PORTAGE_BINHOST="${BOARD_BINHOST}"
 | |
| 
 | |
| # Generally there isn't any need to add packages to @world by default.
 | |
| # You can use --select to override this.
 | |
| EMERGE_DEFAULT_OPTS="--oneshot --verbose"
 | |
| 
 | |
| # Enable provenance reporting by default. Produced files are in /usr/share/SLSA
 | |
| GENERATE_SLSA_PROVENANCE="true"
 | |
| 
 | |
| # Allow the user to override or define additional settings.
 | |
| source "${BOARD_ETC}/portage/make.conf.user"
 | |
| EOF
 | |
| 
 | |
| # required when using --regen_configs_only
 | |
| sudo mkdir -p --mode=01777 "${BOARD_ROOT}"{/tmp,/var/tmp}
 | |
| 
 | |
| # make it easy to find debug symbols
 | |
| sudo mkdir -p /usr/lib/debug/build
 | |
| sudo ln -sfT ${BOARD_ROOT}/usr/lib/debug /usr/lib/debug/${BOARD_ROOT}
 | |
| 
 | |
| # remove bogus pkg-config wrapper
 | |
| sudo rm -f "${BOARD_ROOT}/build/bin/${BOARD_CHOST}-pkg-config"
 | |
| 
 | |
| generate_all_wrappers
 | |
| 
 | |
| # Unclear why this is required but it doesn't happen automatically
 | |
| info "Performing package updates..."
 | |
| ${EMAINT_WRAPPER} --fix movebin
 | |
| ${EMAINT_WRAPPER} --fix moveinst
 | |
| ${EMAINT_WRAPPER} --fix world
 | |
| 
 | |
| if [[ ${FLAGS_regen_configs} -eq ${FLAGS_FALSE} ]]; then
 | |
|   EMERGE_FLAGS=( --select --verbose "--jobs=${NUM_JOBS}" )
 | |
|   EMERGE_TOOLCHAIN_FLAGS=( "${EMERGE_FLAGS[@]}" )
 | |
| 
 | |
|   if [[ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}"  && \
 | |
|         "${FLAGS_getbinpkg}" -eq "${FLAGS_TRUE}" ]]
 | |
|   then
 | |
|     if [[ "${FLAGS_usepkgonly}" -eq "${FLAGS_TRUE}" ]]; then
 | |
|       EMERGE_FLAGS+=( --usepkgonly --rebuilt-binaries n )
 | |
|     else
 | |
|       EMERGE_FLAGS+=( --usepkg )
 | |
|     fi
 | |
|     EMERGE_FLAGS+=( --getbinpkg )
 | |
|   fi
 | |
| 
 | |
|   info "Installing baselayout"
 | |
|   "${EMERGE_WRAPPER}" "${EMERGE_FLAGS[@]}" --nodeps sys-apps/baselayout
 | |
| 
 | |
|   if [[ "${FLAGS_usepkg}" -ne "${FLAGS_TRUE}" ||
 | |
|         "${FLAGS_getbinpkg}" -ne "${FLAGS_TRUE}" ]]
 | |
|   then
 | |
|     # When binary packages are disabled we need to make sure the cross
 | |
|     # sysroot includes any build dependencies for the toolchain.
 | |
|     info "Installing toolchain build dependencies"
 | |
|     install_cross_libs "${BOARD_CHOST}" "${EMERGE_FLAGS[@]}" --buildpkg=n
 | |
| 
 | |
|     info "Building toolchain dependencies"
 | |
|     "${EMERGE_WRAPPER}" --buildpkg --buildpkgonly \
 | |
|         --root="/usr/${BOARD_CHOST}" --sysroot="/usr/${BOARD_CHOST}" \
 | |
|         "${EMERGE_TOOLCHAIN_FLAGS[@]}" $(< "/usr/${BOARD_CHOST}/etc/portage/cross-${BOARD_CHOST}-depends")
 | |
|     info "Building toolchain"
 | |
|     "${EMERGE_WRAPPER}" --buildpkg --buildpkgonly \
 | |
|         --root="/usr/${BOARD_CHOST}" --sysroot="/usr/${BOARD_CHOST}" \
 | |
| 	"${EMERGE_TOOLCHAIN_FLAGS[@]}" "${TOOLCHAIN_PKGS[@]}"
 | |
|   fi
 | |
| 
 | |
|   info "Installing toolchain"
 | |
|   "${EMERGE_WRAPPER}" \
 | |
|       --usepkgonly --getbinpkg --rebuilt-binaries n \
 | |
|       "${EMERGE_TOOLCHAIN_FLAGS[@]}" "${TOOLCHAIN_PKGS[@]}"
 | |
| fi
 | |
| 
 | |
| if [[ ${FLAGS_regen_configs_only} -eq ${FLAGS_FALSE} ]]; then
 | |
|   # Setup BOARD_ROOT for QEMU user emulation.
 | |
|   setup_qemu_static "${BOARD_ROOT}"
 | |
| fi
 | |
| 
 | |
| if [ $FLAGS_default -eq $FLAGS_TRUE ] ; then
 | |
|   echo $BOARD_VARIANT > "$GCLIENT_ROOT/src/scripts/.default_board"
 | |
| fi
 | |
| 
 | |
| command_completed
 | |
| info "The SYSROOT is: ${BOARD_ROOT}"
 | |
| 
 | |
| WORKING_ON=$("${SRC_ROOT}"/scripts/flatcar_workon list --board="${FLAGS_board}")
 | |
| if [ -n "${WORKING_ON}" ]; then
 | |
|   info
 | |
|   info "Currently working on the following ebuilds for this board:"
 | |
|   info "${WORKING_ON}"
 | |
| fi
 |