#!/bin/bash -eux source "$(dirname $0)/target_lists.sh" cd "$(dirname $0)/../../.." OUT_DIR=$(realpath ${OUT_DIR:-out}) DIST_DIR=$(realpath ${DIST_DIR:-out/dist}) read -ra PRODUCTS <<<"$(build/soong/soong_ui.bash --dumpvar-mode all_named_products)" FAILED_PRODUCTS=() PRODUCTS_WITH_BP2BUILD_DIFFS=() function report { # Turn off -x so that we can see the printfs more clearly set +x # check if FAILED_PRODUCTS is not empty if (( ${#FAILED_PRODUCTS[@]} )); then printf "Failed products:\n" >&2 printf '%s\n' "${FAILED_PRODUCTS[@]}" >&2 fi if (( ${#PRODUCTS_WITH_BP2BUILD_DIFFS[@]} )); then printf "\n\nProducts that produced different bp2build files from aosp_arm64:\n" >&2 printf '%s\n' "${PRODUCTS_WITH_BP2BUILD_DIFFS[@]}" >&2 # TODO(b/261023967): Don't fail the build until every product is OK and we want to prevent backsliding. # exit 1 fi # TODO(b/262192655): Support riscv64 products in Bazel. for product in "${FAILED_PRODUCTS[@]}"; do if [[ "$product" != *"riscv64"* ]]; then exit 1 fi done } trap report EXIT rm -rf "${DIST_DIR}/multiproduct_analysis" mkdir -p "${DIST_DIR}/multiproduct_analysis" # Create zip of the bp2build files for aosp_arm64. We'll check that all other products produce # identical bp2build files. # We have to run tar and gzip as separate commands because tar with -z doesn't provide an option # to not include a timestamp in the gzip header. (--mtime is only for the tar parts, not gzip) export TARGET_PRODUCT="aosp_arm64" build/soong/soong_ui.bash --make-mode --skip-soong-tests bp2build tar c --mtime='1970-01-01' -C out/soong/bp2build . | gzip -n > "${DIST_DIR}/multiproduct_analysis/reference_bp2build_files_aosp_arm64.tar.gz" total=${#PRODUCTS[@]} count=1 for product in "${PRODUCTS[@]}"; do echo "Product ${count}/${total}: ${product}" # Ensure that all processes later use the same TARGET_PRODUCT. export TARGET_PRODUCT="${product}" # Re-run product config and bp2build for every TARGET_PRODUCT. build/soong/soong_ui.bash --make-mode --skip-soong-tests bp2build # Remove the ninja_build output marker file to communicate to buildbot that this is not a regular Ninja build, and its # output should not be parsed as such. rm -f out/ninja_build rm -f out/multiproduct_analysis_current_bp2build_files.tar.gz tar c --mtime='1970-01-01' -C out/soong/bp2build . | gzip -n > "${DIST_DIR}/multiproduct_analysis/bp2build_files_${product}.tar.gz" if diff -q "${DIST_DIR}/multiproduct_analysis/bp2build_files_${product}.tar.gz" "${DIST_DIR}/multiproduct_analysis/reference_bp2build_files_aosp_arm64.tar.gz"; then rm -f "${DIST_DIR}/multiproduct_analysis/bp2build_files_${product}.tar.gz" else PRODUCTS_WITH_BP2BUILD_DIFFS+=("${product}") fi STARTUP_FLAGS=( # Keep the Bazel server alive, package cache hot and reduce excessive I/O # and wall time by ensuring that max_idle_secs is longer than bp2build which # runs in every loop. bp2build takes ~20 seconds to run, so set this to a # minute to account for resource contention, but still ensure that the bazel # server doesn't stick around after. --max_idle_secs=60 ) FLAGS=( --config=bp2build --config=ci --nobuild --keep_going ) build/bazel/bin/bazel ${STARTUP_FLAGS[@]} build ${FLAGS[@]} --config=linux_x86_64 -- ${BUILD_TARGETS} || \ FAILED_PRODUCTS+=("${product} --config=linux_x86_64") build/bazel/bin/bazel ${STARTUP_FLAGS[@]} build ${FLAGS[@]} --config=android -- ${BUILD_TARGETS} || \ FAILED_PRODUCTS+=("${product} --config=android") count=$((count+1)) done