blob: c3e93a54f226ad61dbaf7b318798ed84f56027ca [file] [log] [blame] [edit]
#!/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.
# 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}"
. "${SRC_ROOT}/platform/dev/toolchain_utils.sh"
# Flags
DEFINE_string board "$DEFAULT_BOARD" "The name of the board to set up."
# TODO(bsimonnet): Remove this once setup_board has been updated.
DEFINE_string board_overlay "" "Deprecated. DO NOT USE THIS."
DEFINE_string variant "" "Board variant."
DEFINE_string profile "" "The portage configuration profile to use."
DEFINE_string board_root "" "Board root where the profile should be created."
DEFINE_string brick "" "Brick to set up."
# 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}" ]] && [[ -z "${FLAGS_brick}" ]] && \
[[ -z "${FLAGS_board_root}" ]]; then
error "--board, --brick or --board_root required."
exit 1
elif [[ -n "${FLAGS_board}" ]] && [[ -n "${FLAGS_brick}" ]]; then
error "--board and --brick are incompatible."
exit 1
fi
get_board_and_variant "${FLAGS_board}" "${FLAGS_variant}" "${FLAGS_brick}"
BOARD_ROOT="${FLAGS_board_root:-/build/${BOARD_VARIANT}}"
CHROMIUMOS_OVERLAY="/usr/local/portage/chromiumos"
CHROMIUMOS_PROFILES="${CHROMIUMOS_OVERLAY}/profiles"
MAKE_PROFILE="${BOARD_ROOT}/etc/portage/make.profile"
SYSROOT_CACHE="${BOARD_ROOT}/${SYSROOT_SETTINGS_FILE}"
if [ -e "${MAKE_PROFILE}" -a ! -L "${MAKE_PROFILE}" ]; then
error "${MAKE_PROFILE} is not a symbolic link, it should be."
exit 1
fi
# Clean old profile paths. No need to migrate since we're creating it.
# http://brbug.com/1098
sudo rm -f "${BOARD_ROOT}/etc/make.profile"
#
# Get board overlay list.
#
BOARD_OVERLAY_LIST="$(get_sysroot_config "${BOARD_ROOT}" "BOARD_OVERLAY")"
#
# Get ARCH
#
ARCH=$(get_sysroot_config "${BOARD_ROOT}" "ARCH") || exit 1
# 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"
PROFILE_OVERRIDE="${FLAGS_profile:-$(get_variable "${SYSROOT_CACHE}" \
"PROFILE_OVERRIDE")}"
if [ ! -z "${PROFILE_OVERRIDE}" ]; then # profile specified. must exist or we fail
if [ -d "${PROFILE_OVERRIDE}" ]; then
# Make sure we get the full path since we'll be creating a symlink to it.
# Relative paths won't work. http://crbug.com/567959
PROFILES_DIR=$(realpath "${PROFILE_OVERRIDE}")
else
PROFILE_NAME="${PROFILE_OVERRIDE}"
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
# Only run `ln` if profile doesn't exist, or has changed.
CURR_PROFILE=$(readlink "${MAKE_PROFILE}" 2>/dev/null || :)
if [[ ${CURR_PROFILE} != "${PROFILES_DIR}" ]]; then
if [[ -n ${CURR_PROFILE} ]]; then
# If it's changed, then warn & clean out the old link.
msg="
You are switching profiles for a board that is already setup. This
can cause trouble for Portage. If you experience problems with
build_packages you may need to run:
\tsetup_board --board ${BOARD_VARIANT} --force --profile ${PROFILE_NAME}\n
Alternatively, you can correct the dependecy graph by using
'emerge-${BOARD_VARIANT} -c' or 'emerge-${BOARD_VARIANT} -C <ebuild>'
"
warn "${msg}"
sudo rm -f "${MAKE_PROFILE}"
fi
sudo ln -sf "${PROFILES_DIR}" "${MAKE_PROFILE}"
if [[ -n "${PROFILE_OVERRIDE}" ]]; then
set_variable "${SYSROOT_CACHE}" "PROFILE_OVERRIDE" "${PROFILE_OVERRIDE}"
fi
fi