| #!/bin/bash -u |
| # Regression test for the product and/or board configuration converter. |
| # |
| # Builds 'nothing' for a given product-variant twice: with product/board |
| # config makefiles converted to Starlark, and without such conversion. |
| # The generated Ninja files should be the same. |
| set -u |
| |
| function die() { |
| echo $@ >&2 |
| exit 1 |
| } |
| |
| function usage() { |
| cat <<EOF >&2 |
| Usage: $myname [-p] [-b] [-q] [-r] <product-variant> [product-variant ...] |
| -p: Test RBC product configuration. This is implied if -b is not supplied |
| -b: Test RBC board configuration |
| -q: Quiet. Suppress all output other than a failure message |
| -r: Retain Ninja files |
| EOF |
| exit 1 |
| } |
| |
| function build() { |
| local -r flavor="$1" |
| local -r product="$2" |
| local -r variant="$3" |
| shift 3 |
| command="build/soong/soong_ui.bash --make-mode TARGET_PRODUCT=$product TARGET_BUILD_VARIANT=$variant $@ nothing" |
| if ! ANDROID_QUIET_BUILD=$quiet $command; then |
| printf "%s-%s: %s build failed, actual command:\n %s\n" $product $variant $flavor "$command" >&2 |
| exit 1 |
| fi |
| } |
| |
| mypath=$(realpath "$0") |
| declare -r mydir=${mypath%/*/*/*/*} |
| declare -r myname=${mypath#${mydir}/} |
| |
| flags_mk=(RBC_NO_PRODUCT_GRAPH=1 DISABLE_ARTIFACT_PATH_REQUIREMENTS=t) |
| flags_rbc=() |
| quiet= |
| while getopts "bkpqr" o; do |
| case "${o}" in |
| k) ;; # backward compatibility to be removed later |
| q) quiet=true ;; |
| b) flags_rbc+=(RBC_BOARD_CONFIG=1) ;; |
| p) flags_rbc+=(RBC_PRODUCT_CONFIG=t) ;; |
| r) retain_files=t ;; |
| *) usage ;; |
| esac |
| done |
| shift $((OPTIND-1)) |
| [[ $# -gt 0 ]] || usage |
| ((${#flags_rbc[@]})) || flags_rbc+=(RBC_PRODUCT_CONFIG=t) |
| |
| cd $mydir |
| rc=0 |
| for arg in $@; do |
| [[ "$arg" =~ ^([a-zA-Z0-9_]+)-([a-zA-Z0-9_]+)$ ]] || \ |
| die "Invalid product name: $arg. Example: aosp_arm64-userdebug" |
| product="${BASH_REMATCH[1]}" |
| variant="${BASH_REMATCH[2]}" |
| ninja_files=(soong/build.ninja build-${product}.ninja build-${product}-package.ninja) |
| |
| # Build with converter, save Ninja files, build without it. |
| saved_ninja_dir=out/ninja_rbc/${product}-${variant} |
| build RBC $product $variant ${flags_rbc[@]} && \ |
| rm -rf $saved_ninja_dir && mkdir -p $saved_ninja_dir/soong && \ |
| (for f in ${ninja_files[@]}; do mv -f out/$f $saved_ninja_dir/$f || exit 1; done) && \ |
| build baseline $product $variant ${flags_mk[@]} |
| rc=$? |
| |
| # Compare Ninja files |
| if ((rc==0)); then |
| for f in "${ninja_files[@]}"; do |
| diff_file=$(mktemp) |
| diff out/$f $saved_ninja_dir/$f | head >& $diff_file |
| if [[ -s $diff_file ]]; then |
| echo ${product}-${variant}: "$f" is different '< make, > RBC):' >&2 |
| cat $diff_file >&2 |
| echo ... |
| rc=1 |
| fi |
| rm $diff_file |
| done |
| fi |
| [[ -n "${retain_files:-}" ]] || rm -rf $saved_ninja_dir |
| done |
| |
| ((rc==0)) || printf "In order to reproduce the failures above, run\n %s <product>-<variant>\n" $myname >&2 |
| exit $rc |