1*333d2b36SAndroid Build Coastguard Worker#! /bin/bash -eu 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Worker# Run CKati step separately, tracing given Makefile variables. 4*333d2b36SAndroid Build Coastguard Worker# It is expected that the regular Android null build (`m nothing`) 5*333d2b36SAndroid Build Coastguard Worker# has been run so that $OUT_DIR/soong/Android-${TARGET_PRODUCT}.mk, 6*333d2b36SAndroid Build Coastguard Worker# $OUT_DIR/soong/make_vars-${TARGET_PRODUCT}.mk, etc. files exist. 7*333d2b36SAndroid Build Coastguard Worker# 8*333d2b36SAndroid Build Coastguard Worker# The output file is in JSON format and can be processed with, say, 9*333d2b36SAndroid Build Coastguard Worker# `jq`. For instance, the following invocation outputs all assignment 10*333d2b36SAndroid Build Coastguard Worker# traces concisely: 11*333d2b36SAndroid Build Coastguard Worker# jq -c '.assignments[] | (select (.operation == "assign")) | {("n"): .name, ("l"): .value_stack[0]?, ("v"): .value }' out/ckati.trace 12*333d2b36SAndroid Build Coastguard Worker# generates 13*333d2b36SAndroid Build Coastguard Worker# {"n":"<var1>","l":"<file>:<line>","v":"<value1>"} 14*333d2b36SAndroid Build Coastguard Worker# ... 15*333d2b36SAndroid Build Coastguard Worker 16*333d2b36SAndroid Build Coastguard Workerfunction die() { format=$1; shift; printf "$format\n" $@; exit 1; } 17*333d2b36SAndroid Build Coastguard Workerfunction usage() { die "Usage: %s [-o FILE] VAR ...\n(without -o the output goes to ${outfile})" ${0##*/}; } 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Worker[[ -d build/soong ]] || die "run this script from the top of the Android source tree" 20*333d2b36SAndroid Build Coastguard Workerdeclare -r out=${OUT_DIR:-out} 21*333d2b36SAndroid Build Coastguard Worker[[ -x ${out}/soong_ui ]] || die "run Android build first" 22*333d2b36SAndroid Build Coastguard Worker: ${TARGET_PRODUCT:?not set, run lunch?} 23*333d2b36SAndroid Build Coastguard Worker: ${TARGET_BUILD_VARIANT:?not set, run lunch?} 24*333d2b36SAndroid Build Coastguard Workerdeclare -r androidmk=${out}/soong/Android-${TARGET_PRODUCT}.mk 25*333d2b36SAndroid Build Coastguard Workerdeclare -r makevarsmk=${out}/soong/make_vars-${TARGET_PRODUCT}.mk 26*333d2b36SAndroid Build Coastguard Workerdeclare -r target_device_dir=$(${out}/soong_ui --dumpvar-mode TARGET_DEVICE_DIR) 27*333d2b36SAndroid Build Coastguard Worker: ${target_device_dir:?cannot find device directory for ${TARGET_PRODUCT}} 28*333d2b36SAndroid Build Coastguard Workerdeclare -r target_device=$(${out}/soong_ui --dumpvar-mode TARGET_DEVICE) 29*333d2b36SAndroid Build Coastguard Worker: ${target_device:?cannot find target device for ${TARGET_PRODUCT}} 30*333d2b36SAndroid Build Coastguard Workerdeclare -r timestamp_file=${out}/build_date.txt 31*333d2b36SAndroid Build Coastguard Worker# Files should exist, so ls should succeed: 32*333d2b36SAndroid Build Coastguard Workerls -1d "$androidmk" "$makevarsmk" "$target_device_dir" "$timestamp_file" >/dev/null 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workeroutfile=${out}/ckati.trace 35*333d2b36SAndroid Build Coastguard Workerwhile getopts "ho:" opt; do 36*333d2b36SAndroid Build Coastguard Worker case $opt in 37*333d2b36SAndroid Build Coastguard Worker h) usage ;; 38*333d2b36SAndroid Build Coastguard Worker o) outfile=$OPTARG ;; 39*333d2b36SAndroid Build Coastguard Worker ?) usage ;; 40*333d2b36SAndroid Build Coastguard Worker esac 41*333d2b36SAndroid Build Coastguard Workerdone 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Workerif (($#>0)); then 44*333d2b36SAndroid Build Coastguard Worker declare -a tracing=(--variable_assignment_trace_filter="$*" --dump_variable_assignment_trace "$outfile") 45*333d2b36SAndroid Build Coastguard Workerelse 46*333d2b36SAndroid Build Coastguard Worker printf "running ckati without tracing variables\n" 47*333d2b36SAndroid Build Coastguard Workerfi 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Worker# Touch one input for ckati, otherwise it will just print 50*333d2b36SAndroid Build Coastguard Worker# 'No need to regenerate ninja file' and exit. 51*333d2b36SAndroid Build Coastguard Workertouch "$androidmk" 52*333d2b36SAndroid Build Coastguard Workerprebuilts/build-tools/linux-x86/bin/ckati \ 53*333d2b36SAndroid Build Coastguard Worker --gen_all_targets \ 54*333d2b36SAndroid Build Coastguard Worker -i \ 55*333d2b36SAndroid Build Coastguard Worker --ignore_optional_include=out/%.P \ 56*333d2b36SAndroid Build Coastguard Worker --ninja \ 57*333d2b36SAndroid Build Coastguard Worker --ninja_dir=out \ 58*333d2b36SAndroid Build Coastguard Worker --ninja_suffix=-${TARGET_PRODUCT} \ 59*333d2b36SAndroid Build Coastguard Worker --no_builtin_rules \ 60*333d2b36SAndroid Build Coastguard Worker --no_ninja_prelude \ 61*333d2b36SAndroid Build Coastguard Worker --regen \ 62*333d2b36SAndroid Build Coastguard Worker --top_level_phony \ 63*333d2b36SAndroid Build Coastguard Worker --use_find_emulator \ 64*333d2b36SAndroid Build Coastguard Worker --use_ninja_phony_output \ 65*333d2b36SAndroid Build Coastguard Worker --use_ninja_symlink_outputs \ 66*333d2b36SAndroid Build Coastguard Worker --werror_find_emulator \ 67*333d2b36SAndroid Build Coastguard Worker --werror_implicit_rules \ 68*333d2b36SAndroid Build Coastguard Worker --werror_overriding_commands \ 69*333d2b36SAndroid Build Coastguard Worker --werror_phony_looks_real \ 70*333d2b36SAndroid Build Coastguard Worker --werror_real_to_phony \ 71*333d2b36SAndroid Build Coastguard Worker --werror_suffix_rules \ 72*333d2b36SAndroid Build Coastguard Worker --werror_writable \ 73*333d2b36SAndroid Build Coastguard Worker --writable out/ \ 74*333d2b36SAndroid Build Coastguard Worker -f build/make/core/main.mk \ 75*333d2b36SAndroid Build Coastguard Worker "${tracing[@]}" \ 76*333d2b36SAndroid Build Coastguard Worker ANDROID_JAVA_HOME=prebuilts/jdk/jdk21/linux-x86 \ 77*333d2b36SAndroid Build Coastguard Worker ASAN_SYMBOLIZER_PATH=$PWD/prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-symbolizer \ 78*333d2b36SAndroid Build Coastguard Worker BUILD_DATETIME_FILE="$timestamp_file" \ 79*333d2b36SAndroid Build Coastguard Worker BUILD_HOSTNAME=$(hostname) \ 80*333d2b36SAndroid Build Coastguard Worker BUILD_USERNAME="$USER" \ 81*333d2b36SAndroid Build Coastguard Worker JAVA_HOME=$PWD/prebuilts/jdk/jdk21/linux-x86 \ 82*333d2b36SAndroid Build Coastguard Worker KATI_PACKAGE_MK_DIR="{$out}/target/product/${target_device}/CONFIG/kati_packaging" \ 83*333d2b36SAndroid Build Coastguard Worker OUT_DIR="$out" \ 84*333d2b36SAndroid Build Coastguard Worker PATH="$PWD/prebuilts/build-tools/path/linux-x86:$PWD/${out}/.path" \ 85*333d2b36SAndroid Build Coastguard Worker PYTHONDONTWRITEBYTECODE=1 \ 86*333d2b36SAndroid Build Coastguard Worker SOONG_ANDROID_MK="$androidmk" \ 87*333d2b36SAndroid Build Coastguard Worker SOONG_MAKEVARS_MK="$makevarsmk" \ 88*333d2b36SAndroid Build Coastguard Worker TARGET_BUILD_VARIANT="$TARGET_BUILD_VARIANT" \ 89*333d2b36SAndroid Build Coastguard Worker TARGET_DEVICE_DIR="$target_device_dir" \ 90*333d2b36SAndroid Build Coastguard Worker TARGET_PRODUCT=${TARGET_PRODUCT} \ 91*333d2b36SAndroid Build Coastguard Worker TMPDIR="$PWD/$out/soong/.temp" 92