xref: /aosp_15_r20/build/bazel/ci/rbc_regression_test.sh (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker#!/bin/bash -u
2*7594170eSAndroid Build Coastguard Worker# Regression test for the product and/or board configuration converter.
3*7594170eSAndroid Build Coastguard Worker#
4*7594170eSAndroid Build Coastguard Worker# Builds 'nothing' for a given product-variant twice: with product/board
5*7594170eSAndroid Build Coastguard Worker# config makefiles converted to Starlark, and without such conversion.
6*7594170eSAndroid Build Coastguard Worker# The generated Ninja files should be the same.
7*7594170eSAndroid Build Coastguard Workerset -u
8*7594170eSAndroid Build Coastguard Worker
9*7594170eSAndroid Build Coastguard Workerfunction die() {
10*7594170eSAndroid Build Coastguard Worker    echo $@ >&2
11*7594170eSAndroid Build Coastguard Worker    exit 1
12*7594170eSAndroid Build Coastguard Worker}
13*7594170eSAndroid Build Coastguard Worker
14*7594170eSAndroid Build Coastguard Workerfunction usage() {
15*7594170eSAndroid Build Coastguard Worker    cat <<EOF >&2
16*7594170eSAndroid Build Coastguard WorkerUsage: $myname [-q] [-r] <product-variant> [product-variant ...]
17*7594170eSAndroid Build Coastguard Worker  -q: Quiet. Suppress all output other than a failure message
18*7594170eSAndroid Build Coastguard Worker  -r: Retain Ninja files
19*7594170eSAndroid Build Coastguard WorkerEOF
20*7594170eSAndroid Build Coastguard Worker    exit 1
21*7594170eSAndroid Build Coastguard Worker}
22*7594170eSAndroid Build Coastguard Worker
23*7594170eSAndroid Build Coastguard Workerfunction build() {
24*7594170eSAndroid Build Coastguard Worker    local -r flavor="$1"
25*7594170eSAndroid Build Coastguard Worker    local -r product="$2"
26*7594170eSAndroid Build Coastguard Worker    local -r variant="$3"
27*7594170eSAndroid Build Coastguard Worker    shift 3
28*7594170eSAndroid Build Coastguard Worker    command="build/soong/soong_ui.bash --make-mode TARGET_PRODUCT=$product TARGET_BUILD_VARIANT=$variant $@ nothing"
29*7594170eSAndroid Build Coastguard Worker    if ! ANDROID_QUIET_BUILD=$quiet $command; then
30*7594170eSAndroid Build Coastguard Worker        printf "%s-%s: %s build failed, actual command:\n  %s\n" $product $variant $flavor "$command" >&2
31*7594170eSAndroid Build Coastguard Worker        exit 1
32*7594170eSAndroid Build Coastguard Worker    fi
33*7594170eSAndroid Build Coastguard Worker}
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Workermypath=$(realpath "$0")
36*7594170eSAndroid Build Coastguard Workerdeclare -r mydir=${mypath%/*/*/*/*}
37*7594170eSAndroid Build Coastguard Workerdeclare -r myname=${mypath#${mydir}/}
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Workerflags_rbc=(RBC_PRODUCT_CONFIG=true)
40*7594170eSAndroid Build Coastguard Workerquiet=
41*7594170eSAndroid Build Coastguard Workerwhile getopts "qr" o; do
42*7594170eSAndroid Build Coastguard Worker    case "${o}" in
43*7594170eSAndroid Build Coastguard Worker        q) quiet=true ;;
44*7594170eSAndroid Build Coastguard Worker        r) retain_files=t ;;
45*7594170eSAndroid Build Coastguard Worker        *) usage ;;
46*7594170eSAndroid Build Coastguard Worker    esac
47*7594170eSAndroid Build Coastguard Workerdone
48*7594170eSAndroid Build Coastguard Workershift $((OPTIND-1))
49*7594170eSAndroid Build Coastguard Worker[[ $# -gt 0 ]] || usage
50*7594170eSAndroid Build Coastguard Worker
51*7594170eSAndroid Build Coastguard Workercd $mydir
52*7594170eSAndroid Build Coastguard Workerrc=0
53*7594170eSAndroid Build Coastguard Workerfor arg in $@; do
54*7594170eSAndroid Build Coastguard Worker    [[ "$arg" =~ ^([a-zA-Z0-9_]+)-([a-zA-Z0-9_]+)$ ]] || \
55*7594170eSAndroid Build Coastguard Worker        die "Invalid product name: $arg. Example: aosp_arm64-userdebug"
56*7594170eSAndroid Build Coastguard Worker    product="${BASH_REMATCH[1]}"
57*7594170eSAndroid Build Coastguard Worker    variant="${BASH_REMATCH[2]}"
58*7594170eSAndroid Build Coastguard Worker    ninja_files=(soong/build.${product}.ninja build-${product}.ninja build-${product}-package.ninja)
59*7594170eSAndroid Build Coastguard Worker
60*7594170eSAndroid Build Coastguard Worker    # Build with converter, save Ninja files, build without it.
61*7594170eSAndroid Build Coastguard Worker    saved_ninja_dir=out/ninja_rbc/${product}-${variant}
62*7594170eSAndroid Build Coastguard Worker    build RBC $product $variant ${flags_rbc[@]} && \
63*7594170eSAndroid Build Coastguard Worker      rm -rf $saved_ninja_dir && mkdir -p $saved_ninja_dir/soong && \
64*7594170eSAndroid Build Coastguard Worker      (for f in ${ninja_files[@]}; do mv -f out/$f $saved_ninja_dir/$f || exit 1; done) && \
65*7594170eSAndroid Build Coastguard Worker      build baseline $product $variant
66*7594170eSAndroid Build Coastguard Worker    rc=$?
67*7594170eSAndroid Build Coastguard Worker
68*7594170eSAndroid Build Coastguard Worker    # Compare Ninja files
69*7594170eSAndroid Build Coastguard Worker    if ((rc==0)); then
70*7594170eSAndroid Build Coastguard Worker        for f in "${ninja_files[@]}"; do
71*7594170eSAndroid Build Coastguard Worker            diff_file=$(mktemp)
72*7594170eSAndroid Build Coastguard Worker            diff out/$f $saved_ninja_dir/$f | head >& $diff_file
73*7594170eSAndroid Build Coastguard Worker            if [[ -s $diff_file ]]; then
74*7594170eSAndroid Build Coastguard Worker                echo ${product}-${variant}: "$f" is different '< make, > RBC):' >&2
75*7594170eSAndroid Build Coastguard Worker                cat $diff_file >&2
76*7594170eSAndroid Build Coastguard Worker                echo ...
77*7594170eSAndroid Build Coastguard Worker                rc=1
78*7594170eSAndroid Build Coastguard Worker            fi
79*7594170eSAndroid Build Coastguard Worker            rm $diff_file
80*7594170eSAndroid Build Coastguard Worker        done
81*7594170eSAndroid Build Coastguard Worker    fi
82*7594170eSAndroid Build Coastguard Worker    [[ -n "${retain_files:-}" ]] || rm -rf $saved_ninja_dir
83*7594170eSAndroid Build Coastguard Workerdone
84*7594170eSAndroid Build Coastguard Worker
85*7594170eSAndroid Build Coastguard Worker((rc==0)) || printf "In order to reproduce the failures above, run\n  %s <product>-<variant>\n" $myname >&2
86*7594170eSAndroid Build Coastguard Workerexit $rc
87