blob: be433be9d4ab21432c5d727dfc6a4aa292454dff [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2011 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.
# This script selects a profile from the overlays.
# Load common CrOS utilities. Inside the chroot this file is installed in
# /usr/lib/crosutils. Outside the chroot we find it relative to the scripts
# location.
common_paths="/usr/lib/crosutils $(dirname "$0")/../../../scripts"
for path in ${common_paths} ; do
if [ -f "${path}/common.sh" ] ; then
COMMON_SH="${path}/common.sh"
break
fi
done
if [ -z "${COMMON_SH}" ] ; then
echo "common.sh not found in search path (${common_paths})"
exit 1
fi
. "${COMMON_SH}"
get_default_board
# Flags
DEFINE_string board "$DEFAULT_BOARD" "The name of the board to set up."
DEFINE_string build_root "/build" "The root location for board sysroots."
DEFINE_string board_overlay "" "Location of the board overlay."
DEFINE_string variant "" "Board variant."
DEFINE_string profile "" "The portage configuration profile to use."
# 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 'set -e' is specified before now.
set -e
if [ -z "$FLAGS_board" ] ; then
error "--board required."
exit 1
fi
get_board_and_variant $FLAGS_board $FLAGS_variant
BOARD_ROOT="${FLAGS_build_root}/${BOARD_VARIANT}"
CHROMIUMOS_OVERLAY="/usr/local/portage/chromiumos"
CHROMIUMOS_PROFILES="${CHROMIUMOS_OVERLAY}/profiles"
MAKE_PROFILE="${BOARD_ROOT}/etc/make.profile"
if [ -e "${MAKE_PROFILE}" -a ! -L "${MAKE_PROFILE}" ]; then
error "${MAKE_PROFILE} is not a symbolic link, it should be."
exit 1
fi
#
# Construct board overlay list.
#
BOARD_OVERLAY_LIST=$(cros_overlay_list \
--board "$BOARD" \
--board_overlay "$FLAGS_board_overlay" \
--variant "$VARIANT")
#
# Compute ARCH
#
PRIMARY_BOARD_OVERLAY=$(cros_overlay_list \
--board "$BOARD" \
--board_overlay "$FLAGS_board_overlay" \
--variant "$VARIANT" \
--primary_only)
TC_ARCH=$(awk -F'-' '{ print $1 }' < "${PRIMARY_BOARD_OVERLAY}/toolchain.conf")
case "${TC_ARCH}" in
arm*)
ARCH="arm"
;;
*86)
ARCH="x86"
;;
x86_64)
ARCH="amd64"
;;
*)
error "Unable to determine ARCH from toolchain: ${BOARD_VARIANT}"
exit 1
esac
# The profile directory comes from many possible locations, the <overlay>
# values below can be any of the board overlays, public, private, primary
# or variant. The name defaults to base, but can be set using --profile:
# * relative profile name from --profile in <overlay>/profiles/<name>
# * absolute profile path from --profile
# * <overlay>/profiles/base
# * ${CHROMIUMOS_PROFILES}/default/linux/${ARCH}/10.0/chromeos
#
# If --profile is non-null and does not exist the script will error
# If none of the directories exist the script will error as well
PROFILES_LIST=""
PROFILES_DIR=""
PROFILE_NAME="base"
if [ ! -z "${FLAGS_profile}" ]; then # profile specified. must exist or we fail
if [ -d "${FLAGS_profile}" ]; then
PROFILES_DIR="${FLAGS_profile}"
else
PROFILE_NAME="${FLAGS_profile}"
fi
fi
if [ -z "${PROFILES_DIR}" ]; then
# Add the overlays in reverse order so that the most specific overlay is
# searched first.
for overlay in ${BOARD_OVERLAY_LIST}; do
PROFILES_LIST="${overlay}/profiles/${PROFILE_NAME} ${PROFILES_LIST}"
done
# Then, if we are looking for the default profile, we look in the
# chromiumos-overlay as well.
CHROMEOS_PROFILE="${CHROMIUMOS_PROFILES}/default/linux/${ARCH}/10.0/chromeos/"
if [ "${PROFILE_NAME}" == "base" ]; then
PROFILES_LIST="${PROFILES_LIST} ${CHROMEOS_PROFILE}"
fi
# Search for the most specific profile. Stop looking once we've found the
# first one.
for profile in ${PROFILES_LIST}; do
if [ -d "${profile}" ]; then
PROFILES_DIR="${profile}"
break
fi
done
fi
if [ -z "${PROFILES_DIR}" ]; then
error "Profiles directory not found, searched in (${PROFILES_LIST})"
exit 1
fi
info "Selecting profile: ${PROFILES_DIR} for ${BOARD_ROOT}"
if [ ! -f "${PROFILES_DIR}/parent" ]; then
warn "Portage profile directory '${PROFILES_DIR}' has no file 'parent'."
warn "This likely means your profile directory is invalid and build_packages"
warn "will fail"
fi
if [ -e "${MAKE_PROFILE}" ]; then
warn "You are switching profiles for a board that is already setup. This"
warn "can cause trouble for Portage. If you experience problems with"
warn "build_packages you may need to run:"
warn ""
warn "setup_board --board ${BOARD_VARIANT} --force --profile ${PROFILE_NAME}"
warn ""
warn "Alternatively, you can correct the dependecy graph by using"
warn "'emerge-${BOARD_VARIANT} -c' or 'emerge-${BOARD_VARIANT} -C <ebuild>'"
sudo rm -f "${MAKE_PROFILE}"
fi
sudo ln -sf "${PROFILES_DIR}" "${MAKE_PROFILE}"