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