From 7efdebf35f18b74240843a5511f994ba906cb96a Mon Sep 17 00:00:00 2001 From: Dave Parker Date: Wed, 1 Dec 2010 11:34:32 -0800 Subject: [PATCH] Added support for boards with only private overlays. (crosutils) If a board has a public overlay it will be used as the primary overlay. However, with this change, if a board only has a private overlay it will be used as the primary. BUG=7339 TEST=Ran setup_board, build_packages, and build_image on a board with only a private overlay (locally created). Ran setup_board, build_packages, and build_image on a board with both public and private overlays. Change-Id: Ic56e4951272ddb80511a213e3a2e54419267a49a Related Issues: http://codereview.chromium.org/3544009 http://codereview.chromium.org/3571015 Review URL: http://codereview.chromium.org/3622003 --- bin/cros_overlay_list | 103 ++++++++++++++++++++++++++++-------------- parallel_emerge | 16 ++++++- 2 files changed, 84 insertions(+), 35 deletions(-) diff --git a/bin/cros_overlay_list b/bin/cros_overlay_list index 1867da25a6..2cf911a858 100755 --- a/bin/cros_overlay_list +++ b/bin/cros_overlay_list @@ -15,6 +15,8 @@ get_default_board # Flags DEFINE_string board "$DEFAULT_BOARD" "The name of the board to set up." DEFINE_string board_overlay "" "Location of the board overlay." +DEFINE_boolean primary_only ${FLAGS_FALSE} \ + "Only return the path to the board's primary overlay. (Default: false)" DEFINE_string variant "" "Board variant." # Parse command line flags @@ -40,6 +42,53 @@ if [[ $FLAGS_variant =~ [_\ ] ]] ; then exit 1 fi +# +# Check that the provided variant overlay name is valid. +# +if [ -n "$FLAGS_variant" ] ; then + VARIANT_NAME="overlay-variant-${FLAGS_board}-${FLAGS_variant}" + VARIANT_OVERLAY="${SRC_ROOT}/overlays/${VARIANT_NAME}" + PRIVATE_VARIANT_NAME="overlay-variant-${FLAGS_board}-${FLAGS_variant}-private" + PRIVATE_VARIANT_OVERLAY="${SRC_ROOT}/private-overlays/${PRIVATE_VARIANT_NAME}" + if [ ! -d "${VARIANT_OVERLAY}" ] && \ + [ ! -d "${PRIVATE_VARIANT_OVERLAY}" ] ; then + error "There is no variant overlay called '${FLAGS_variant}'" + exit 1 + fi +fi + +function is_primary_overlay() { + local directory=$1 + [ -f "${directory}/make.conf" ] || return 1 + [ -f "${directory}/toolchain.conf" ] || return 1 + return 0 +} + +BOARD_OVERLAY="${SRC_ROOT}/overlays/overlay-${FLAGS_board}" +PRIVATE_OVERLAY_NAME="overlay-${FLAGS_board}-private" +PRIVATE_BOARD_OVERLAY="${SRC_ROOT}/private-overlays/${PRIVATE_OVERLAY_NAME}" + +# +# Identify the primary board overlay or die. +# +if is_primary_overlay ${BOARD_OVERLAY}; then + PRIMARY_OVERLAY="${BOARD_OVERLAY}" +elif is_primary_overlay "${PRIVATE_BOARD_OVERLAY}"; then + PRIMARY_OVERLAY="${PRIVATE_BOARD_OVERLAY}" +fi +if [ ! -n "${PRIMARY_OVERLAY}" ]; then + error "There is no primary board overlay for ${FLAGS_board}" + exit 1 +fi + +# +# If only the primary overlay is needed, provide it and exit. +# +if [ "${FLAGS_primary_only}" -eq "${FLAGS_TRUE}" ]; then + echo "${PRIMARY_OVERLAY}" + exit 0 +fi + # # Check for chromeos-overlay. # @@ -50,50 +99,38 @@ if [ -d "${CHROMEOS_OVERLAY}" ]; then fi # -# Check if there are any board overlays. There should be at least a top -# level board specific overlay. +# Check if there are any public board overlays. # -PRIMARY_BOARD_OVERLAY="${SRC_ROOT}/overlays/overlay-${FLAGS_board}" - -if [ -d "${PRIMARY_BOARD_OVERLAY}" ]; then - echo "${PRIMARY_BOARD_OVERLAY}" +if [ -d "${BOARD_OVERLAY}" ]; then + echo "${BOARD_OVERLAY}" # - # Add the public variant overlay + # Add the public variant overlay if it exists. # if [ -n "$FLAGS_variant" ] ; then - VARIANT_NAME="overlay-variant-${FLAGS_board}-${FLAGS_variant}" - VARIANT_OVERLAY="${SRC_ROOT}/overlays/${VARIANT_NAME}" - - if [ ! -d "$VARIANT_OVERLAY" ] ; then - error "Can't find variant overlay directory $VARIANT_OVERLAY" - exit 1 + if [ -d "$VARIANT_OVERLAY" ] ; then + echo "${VARIANT_OVERLAY}" fi + fi +fi - echo "${VARIANT_OVERLAY}" +# +# Add any private overlays and private variant overlays for this board. +# +if [ -d "${SRC_ROOT}/private-overlays" ] ; then + OVERLAY_NAME="overlay-${FLAGS_board}-private" + PRIVATE_OVERLAY="${SRC_ROOT}/private-overlays/${OVERLAY_NAME}" + + if [ -d "${PRIVATE_OVERLAY}" ] ; then + echo "${PRIVATE_OVERLAY}" fi # - # Add any private overlays and variant overlays for this board. + # Add the private variant overlay if it exists. # - if [ -d "${SRC_ROOT}/private-overlays" ] ; then - OVERLAY_NAME="overlay-${FLAGS_board}-private" - PRIVATE_OVERLAY="${SRC_ROOT}/private-overlays/${OVERLAY_NAME}" - - if [ -d "${PRIVATE_OVERLAY}" ] ; then - echo "${PRIVATE_OVERLAY}" - fi - - # - # Add the public and private variant overlays - # - if [ -n "$FLAGS_variant" ] ; then - VARIANT_NAME="overlay-variant-${FLAGS_board}-${FLAGS_variant}-private" - PRIVATE_VARIANT_OVERLAY="${SRC_ROOT}/private-overlays/${VARIANT_NAME}" - - if [ -d "${PRIVATE_VARIANT_OVERLAY}" ] ; then - echo "${PRIVATE_VARIANT_OVERLAY}" - fi + if [ -n "$FLAGS_variant" ] ; then + if [ -d "${PRIVATE_VARIANT_OVERLAY}" ] ; then + echo "${PRIVATE_VARIANT_OVERLAY}" fi fi fi diff --git a/parallel_emerge b/parallel_emerge index ce40be4b07..6516c29f5e 100755 --- a/parallel_emerge +++ b/parallel_emerge @@ -297,11 +297,23 @@ class DepGraphGenerator(object): os.environ["PORTAGE_SYSROOT"] = "/build/" + self.board os.environ["SYSROOT"] = "/build/" + self.board scripts_dir = os.path.dirname(os.path.realpath(__file__)) - toolchain_path = "%s/../overlays/overlay-%s/toolchain.conf" # Strip the variant out of the board name to look for the toolchain. This # is similar to what setup_board does. board_no_variant = self.board.split('_')[0] - f = open(toolchain_path % (scripts_dir, board_no_variant)) + public_toolchain_path = ("%s/../overlays/overlay-%s/toolchain.conf" % + (scripts_dir, board_no_variant)) + private_toolchain_path = ( + "%s/../private-overlays/overlay-%s-private/toolchain.conf" % + (scripts_dir, board_no_variant)) + if os.path.isfile(public_toolchain_path): + toolchain_path = public_toolchain_path + elif os.path.isfile(private_toolchain_path): + toolchain_path = private_toolchain_path + else: + print "Not able to locate toolchain.conf in board overlays" + sys.exit(1) + + f = open(toolchain_path) os.environ["CHOST"] = f.readline().strip() f.close()