xref: /aosp_15_r20/build/soong/scripts/run-ckati.sh (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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