1#!/bin/bash -eux 2# Verifies that bp2build-generated BUILD files result in successful Bazel 3# builds. 4# 5# This verification script is designed to be used for continuous integration 6# tests, though may also be used for manual developer verification. 7 8####### 9# Setup 10####### 11 12if [[ -z ${DIST_DIR+x} ]]; then 13 echo "DIST_DIR not set. Using out/dist. This should only be used for manual developer testing." 14 DIST_DIR="out/dist" 15fi 16 17# Generate BUILD files into out/soong/bp2build 18AOSP_ROOT="$(dirname $0)/../../.." 19"${AOSP_ROOT}/build/soong/soong_ui.bash" --make-mode BP2BUILD_VERBOSE=1 --skip-soong-tests bp2build dist 20 21# Dist the entire workspace of generated BUILD files, rooted from 22# out/soong/bp2build. This is done early so it's available even if builds/tests 23# fail. 24tar -czf "${DIST_DIR}/bp2build_generated_workspace.tar.gz" -C out/soong/bp2build . 25 26# Remove the ninja_build output marker file to communicate to buildbot that this is not a regular Ninja build, and its 27# output should not be parsed as such. 28rm -f out/ninja_build 29 30# Before you add flags to this list, cosnider adding it to the "ci" bazelrc 31# config instead of this list so that flags are not duplicated between scripts 32# and bazelrc, and bazelrc is the Bazel-native way of organizing flags. 33FLAGS_LIST=( 34 --config=bp2build 35 --config=ci 36) 37FLAGS="${FLAGS_LIST[@]}" 38 39############### 40# Build targets 41############### 42BUILD_TARGETS_LIST=( 43 //art/... 44 //bionic/... 45 //bootable/recovery/tools/recovery_l10n/... 46 //build/... 47 //cts/... 48 //development/... 49 //external/... 50 //frameworks/... 51 //libnativehelper/... 52 //packages/... 53 //prebuilts/clang/host/linux-x86:all 54 //system/... 55 //tools/apksig/... 56 //tools/platform-compat/... 57 58 # These tools only build for host currently 59 -//external/e2fsprogs/misc:all 60 -//external/e2fsprogs/resize:all 61 -//external/e2fsprogs/debugfs:all 62 -//external/e2fsprogs/e2fsck:all 63) 64BUILD_TARGETS="${BUILD_TARGETS_LIST[@]}" 65# Iterate over various architectures supported in the platform build. 66tools/bazel --max_idle_secs=5 build ${FLAGS} --platforms //build/bazel/platforms:android_x86 -k -- ${BUILD_TARGETS} 67tools/bazel --max_idle_secs=5 build ${FLAGS} --platforms //build/bazel/platforms:android_x86_64 -k -- ${BUILD_TARGETS} 68tools/bazel --max_idle_secs=5 build ${FLAGS} --platforms //build/bazel/platforms:android_arm -k -- ${BUILD_TARGETS} 69tools/bazel --max_idle_secs=5 build ${FLAGS} --platforms //build/bazel/platforms:android_arm64 -k -- ${BUILD_TARGETS} 70 71HOST_INCOMPATIBLE_TARGETS=( 72 # TODO(b/217756861): Apex toolchain is incompatible with host arches but apex modules do 73 # not have this restriction 74 -//build/bazel/examples/apex/... 75 -//packages/modules/adb/apex:com.android.adbd 76 -//system/timezone/apex:com.android.tzdata 77 -//build/bazel/tests/apex/... 78 -//build/bazel/ci/dist/... 79 80 # TODO(b/217927043): Determine how to address targets that are device only 81 -//system/core/libpackagelistparser:all 82 -//external/icu/libicu:all 83 //external/icu/libicu:libicu 84 -//external/icu/icu4c/source/tools/ctestfw:all 85 86 # TODO(b/217926427): determine why these host_supported modules do not build on host 87 -//packages/modules/adb:all 88 -//packages/modules/adb/pairing_connection:all 89) 90 91# build for host 92tools/bazel --max_idle_secs=5 build ${FLAGS} \ 93 --platforms //build/bazel/platforms:linux_x86_64 \ 94 -- ${BUILD_TARGETS} "${HOST_INCOMPATIBLE_TARGETS[@]}" 95 96########### 97# Run tests 98########### 99tools/bazel --max_idle_secs=5 test ${FLAGS} //build/bazel/tests/... //build/bazel/rules/apex/... //build/bazel/scripts/... 100 101########### 102# Dist mainline modules 103########### 104tools/bazel --max_idle_secs=5 run //build/bazel/ci/dist:mainline_modules ${FLAGS} --platforms=//build/bazel/platforms:android_x86 -- --dist_dir="${DIST_DIR}/mainline_modules_x86" 105tools/bazel --max_idle_secs=5 run //build/bazel/ci/dist:mainline_modules ${FLAGS} --platforms=//build/bazel/platforms:android_x86_64 -- --dist_dir="${DIST_DIR}/mainline_modules_x86_64" 106tools/bazel --max_idle_secs=5 run //build/bazel/ci/dist:mainline_modules ${FLAGS} --platforms=//build/bazel/platforms:android_arm -- --dist_dir="${DIST_DIR}/mainline_modules_arm" 107tools/bazel --max_idle_secs=5 run //build/bazel/ci/dist:mainline_modules ${FLAGS} --platforms=//build/bazel/platforms:android_arm64 -- --dist_dir="${DIST_DIR}/mainline_modules_arm64" 108 109################### 110# bp2build-progress 111################### 112 113# Generate bp2build progress reports and graphs for these modules into the dist 114# dir so that they can be downloaded from the CI artifact list. 115BP2BUILD_PROGRESS_MODULES=( 116 com.android.runtime 117 com.android.neuralnetworks 118 com.android.media.swcodec 119) 120bp2build_progress_script="${AOSP_ROOT}/build/bazel/scripts/bp2build-progress/bp2build-progress.py" 121bp2build_progress_output_dir="${DIST_DIR}/bp2build-progress" 122mkdir -p "${bp2build_progress_output_dir}" 123 124report_args="" 125for m in "${BP2BUILD_PROGRESS_MODULES[@]}"; do 126 report_args="$report_args -m ""${m}" 127 "${bp2build_progress_script}" graph -m "${m}" --use_queryview=true > "${bp2build_progress_output_dir}/${m}_graph.dot" 128done 129 130"${bp2build_progress_script}" report ${report_args} --use_queryview=true > "${bp2build_progress_output_dir}/progress_report.txt" 131