From 040e0443c303c6bbe7eeeff2fb14853350fbda75 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Mon, 7 Jun 2021 23:18:56 +0100 Subject: [PATCH] Remove use of fake soong.variables. Use the --soong-only flag instead to create it the proper way with the config make step. This fixes build problems arising from the incomplete soong.variables settings. This partially relands https://r.android.com/1535202 so that we'll use TARGET_PRODUCT=mainline_sdk in module SDK builds everywhere. build-aml-prebuilts.sh isn't removed completely because we still need the special case to create build_number.txt. Test: art/build/build-art-module.sh --skip-apex && \ packages/modules/ArtPrebuilt/update-art-module-prebuilts.py \ --local-dist out/dist then check that the created prebuilt dex2oatd64 runs with the repro in b/190194345 Test: build/soong/scripts/build-mainline-modules.sh then prebuilts/runtime/mainline/update.py --local-dist .../out/dist in a master-art tree and check that art/build/build-art-module.sh works there Bug: 190194345 Bug: 174315599 Change-Id: I86327b082b61c292f18c0a6b315d9add08002832 --- scripts/build-aml-prebuilts.sh | 138 +++++++----------------------- scripts/build-mainline-modules.sh | 8 +- 2 files changed, 36 insertions(+), 110 deletions(-) diff --git a/scripts/build-aml-prebuilts.sh b/scripts/build-aml-prebuilts.sh index 4b08ac331..8a5513ee3 100755 --- a/scripts/build-aml-prebuilts.sh +++ b/scripts/build-aml-prebuilts.sh @@ -1,14 +1,24 @@ #!/bin/bash -e -# This is a wrapper around "m" that builds the given modules in multi-arch mode -# for all architectures supported by Mainline modules. The make (kati) stage is -# skipped, so the build targets in the arguments can only be Soong modules or -# intermediate output files - make targets and normal installed paths are not -# supported. +# This script is similar to "m" but builds in --soong-only mode, and handles +# special cases to make that mode work. All arguments are passed on to +# build/soong/soong_ui.bash. # -# This script is typically used with "sdk" or "module_export" modules, which -# Soong will install in $OUT_DIR/soong/mainline-sdks (cf -# PathForMainlineSdksInstall in android/paths.go). +# --soong-only bypasses the kati step and hence the make logic that e.g. doesn't +# handle more than two device architectures. It is particularly intended for use +# with TARGET_PRODUCT=mainline_sdk to build 'sdk' and 'module_export' Soong +# modules in TARGET_ARCH_SUITE=mainline_sdk mode so that they get all four +# device architectures (artifacts get installed in $OUT_DIR/soong/mainline-sdks +# - cf PathForMainlineSdksInstall in android/paths.go). +# +# TODO(b/174315599): Replace this script completely with a 'soong_ui.bash +# --soong-only' invocation. For now it is still necessary to set up +# build_number.txt. + +if [ ! -e build/soong/soong_ui.bash ]; then + echo "$0 must be run from the top of the tree" + exit 1 +fi export OUT_DIR=${OUT_DIR:-out} @@ -23,109 +33,19 @@ if [ -e ${OUT_DIR}/soong/.soong.kati_enabled ]; then OUT_DIR=${AML_OUT_DIR} fi -if [ ! -e "build/envsetup.sh" ]; then - echo "$0 must be run from the top of the tree" - exit 1 -fi +mkdir -p ${OUT_DIR}/soong -source build/envsetup.sh - -my_get_build_var() { - # get_build_var will run Soong in normal in-make mode where it creates - # .soong.kati_enabled. That would clobber our real out directory, so we need - # to run it in a different one. - OUT_DIR=${OUT_DIR}/get_build_var get_build_var "$@" -} - -readonly SOONG_OUT=${OUT_DIR}/soong -mkdir -p ${SOONG_OUT} +# The --dumpvars-mode invocation will run Soong in normal make mode where it +# creates .soong.kati_enabled. That would clobber our real out directory, so we +# need to use a different OUT_DIR. +vars="$(OUT_DIR=${OUT_DIR}/dumpvars_mode build/soong/soong_ui.bash \ + --dumpvars-mode --vars=BUILD_NUMBER)" +# Assign to a variable and eval that, since bash ignores any error status +# from the command substitution if it's directly on the eval line. +eval $vars # Some Soong build rules may require this, and the failure mode if it's missing # is confusing (b/172548608). -readonly BUILD_NUMBER="$(my_get_build_var BUILD_NUMBER)" -echo -n ${BUILD_NUMBER} > ${SOONG_OUT}/build_number.txt +echo -n ${BUILD_NUMBER} > ${OUT_DIR}/soong/build_number.txt -readonly PLATFORM_SDK_VERSION="$(my_get_build_var PLATFORM_SDK_VERSION)" -readonly PLATFORM_VERSION="$(my_get_build_var PLATFORM_VERSION)" -PLATFORM_VERSION_ALL_CODENAMES="$(my_get_build_var PLATFORM_VERSION_ALL_CODENAMES)" - -# PLATFORM_VERSION_ALL_CODENAMES is a comma separated list like O,P. We need to -# turn this into ["O","P"]. -PLATFORM_VERSION_ALL_CODENAMES="${PLATFORM_VERSION_ALL_CODENAMES/,/'","'}" -PLATFORM_VERSION_ALL_CODENAMES="[\"${PLATFORM_VERSION_ALL_CODENAMES}\"]" - -# Get the list of missing modules and convert it to a JSON array -# (quote module names, add comma separator and wrap in brackets). -MISSING_USES_LIBRARIES="$(my_get_build_var INTERNAL_PLATFORM_MISSING_USES_LIBRARIES)" -MISSING_USES_LIBRARIES="[$(echo $MISSING_USES_LIBRARIES | sed -e 's/\([^ ]\+\)/\"\1\"/g' -e 's/[ ]\+/, /g')]" - -# Logic from build/make/core/goma.mk -if [ "${USE_GOMA}" = true ]; then - if [ -n "${GOMA_DIR}" ]; then - goma_dir="${GOMA_DIR}" - else - goma_dir="${HOME}/goma" - fi - GOMA_CC="${goma_dir}/gomacc" - export CC_WRAPPER="${CC_WRAPPER}${CC_WRAPPER:+ }${GOMA_CC}" - export CXX_WRAPPER="${CXX_WRAPPER}${CXX_WRAPPER:+ }${GOMA_CC}" - export JAVAC_WRAPPER="${JAVAC_WRAPPER}${JAVAC_WRAPPER:+ }${GOMA_CC}" -else - USE_GOMA=false -fi - -readonly SOONG_VARS=${SOONG_OUT}/soong.variables - -# Aml_abis: true -# - This flag configures Soong to compile for all architectures required for -# Mainline modules. -# CrossHost: linux_bionic -# CrossHostArch: x86_64 -# - Enable Bionic on host as ART needs prebuilts for it. -# VendorVars.art_mdoule.source_build -# - TODO(b/172480615): Change default to false when platform uses ART Module -# prebuilts by default. -cat > ${SOONG_VARS}.new << EOF -{ - "BuildNumberFile": "build_number.txt", - - "Platform_version_name": "${PLATFORM_VERSION}", - "Platform_sdk_version": ${PLATFORM_SDK_VERSION}, - "Platform_sdk_codename": "${PLATFORM_VERSION}", - "Platform_version_active_codenames": ${PLATFORM_VERSION_ALL_CODENAMES}, - - "DeviceName": "generic_arm64", - "HostArch": "x86_64", - "HostSecondaryArch": "x86", - "CrossHost": "linux_bionic", - "CrossHostArch": "x86_64", - "Aml_abis": true, - - "Allow_missing_dependencies": ${SOONG_ALLOW_MISSING_DEPENDENCIES:-false}, - "Unbundled_build": ${TARGET_BUILD_UNBUNDLED:-false}, - "UseGoma": ${USE_GOMA}, - - "VendorVars": { - "art_module": { - "source_build": "${ENABLE_ART_SOURCE_BUILD:-true}" - } - }, - - "MissingUsesLibraries": ${MISSING_USES_LIBRARIES} -} -EOF - -if [ -f ${SOONG_VARS} ] && cmp -s ${SOONG_VARS} ${SOONG_VARS}.new; then - # Don't touch soong.variables if we don't have to, to avoid Soong rebuilding - # the ninja file when it isn't necessary. - rm ${SOONG_VARS}.new -else - mv ${SOONG_VARS}.new ${SOONG_VARS} -fi - -# We use force building LLVM components flag (even though we actually don't -# compile them) because we don't have bionic host prebuilts -# for them. -export FORCE_BUILD_LLVM_COMPONENTS=true - -m --skip-make "$@" +build/soong/soong_ui.bash --make-mode --soong-only "$@" diff --git a/scripts/build-mainline-modules.sh b/scripts/build-mainline-modules.sh index 39c8fba48..7d494925b 100755 --- a/scripts/build-mainline-modules.sh +++ b/scripts/build-mainline-modules.sh @@ -93,11 +93,17 @@ for product in "${PRODUCTS[@]}"; do done done +# We use force building LLVM components flag (even though we actually don't +# compile them) because we don't have bionic host prebuilts +# for them. +export FORCE_BUILD_LLVM_COMPONENTS=true + # Create multi-archs SDKs in a different out directory. The multi-arch script # uses Soong in --skip-make mode which cannot use the same directory as normal # mode with make. export OUT_DIR=${OUT_DIR}/aml -echo_and_run build/soong/scripts/build-aml-prebuilts.sh ${MODULES_SDK_AND_EXPORTS[@]} +echo_and_run build/soong/scripts/build-aml-prebuilts.sh \ + TARGET_PRODUCT=mainline_sdk ${MODULES_SDK_AND_EXPORTS[@]} rm -rf ${DIST_DIR}/mainline-sdks echo_and_run cp -R ${OUT_DIR}/soong/mainline-sdks ${DIST_DIR}