run-ckati.sh 3.4 KB

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