| #!/bin/bash -u |
| |
| set -o pipefail |
| |
| # Test that the mk and ninja files generated by Soong don't change if some |
| # incremental modules are restored from cache. |
| |
| OUTPUT_DIR="$(mktemp -d tmp.XXXXXX)" |
| |
| echo ${OUTPUT_DIR} |
| |
| function cleanup { |
| rm -rf "${OUTPUT_DIR}" |
| } |
| trap cleanup EXIT |
| |
| function run_soong_build { |
| USE_RBE=false TARGET_PRODUCT=aosp_arm TARGET_RELEASE=trunk_staging TARGET_BUILD_VARIANT=userdebug build/soong/soong_ui.bash --make-mode "$@" nothing |
| } |
| |
| function run_soong_clean { |
| build/soong/soong_ui.bash --make-mode clean |
| } |
| |
| function assert_files_equal { |
| if [ $# -ne 2 ]; then |
| echo "Usage: assert_files_equal file1 file2" |
| exit 1 |
| fi |
| |
| if ! cmp -s "$1" "$2"; then |
| echo "Files are different: $1 $2" |
| exit 1 |
| fi |
| } |
| |
| function compare_mtimes() { |
| if [ $# -ne 2 ]; then |
| echo "Usage: compare_mtimes file1 file2" |
| exit 1 |
| fi |
| |
| file1_mtime=$(stat -c '%Y' $1) |
| file2_mtime=$(stat -c '%Y' $2) |
| |
| if [ "$file1_mtime" -eq "$file2_mtime" ]; then |
| return 1 |
| else |
| return 0 |
| fi |
| } |
| |
| function test_build_action_restoring() { |
| local test_dir="${OUTPUT_DIR}/test_build_action_restoring" |
| mkdir -p ${test_dir} |
| run_soong_clean |
| cat > ${test_dir}/Android.bp <<'EOF' |
| python_binary_host { |
| name: "my_little_binary_host", |
| srcs: ["my_little_binary_host.py"], |
| } |
| EOF |
| touch ${test_dir}/my_little_binary_host.py |
| run_soong_build --incremental-build-actions |
| local dir_before="${test_dir}/before" |
| mkdir -p ${dir_before} |
| cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before |
| # add a comment to the bp file, this should force a new analysis but no module |
| # should be really impacted, so all the incremental modules should be skipped. |
| cat >> ${test_dir}/Android.bp <<'EOF' |
| // new comments |
| EOF |
| run_soong_build --incremental-build-actions |
| local dir_after="${test_dir}/after" |
| mkdir -p ${dir_after} |
| cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after |
| |
| compare_incremental_files $dir_before $dir_after |
| rm -rf "$test_dir" |
| echo "test_build_action_restoring test passed" |
| } |
| |
| function test_incremental_build_parity() { |
| local test_dir="${OUTPUT_DIR}/test_incremental_build_parity" |
| run_soong_clean |
| run_soong_build |
| local dir_before="${test_dir}/before" |
| mkdir -p ${dir_before} |
| cp -pr out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before |
| |
| # Now run clean build with incremental enabled |
| run_soong_clean |
| run_soong_build --incremental-build-actions |
| local dir_after="${test_dir}/after" |
| mkdir -p ${dir_after} |
| cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after |
| |
| compare_files_parity $dir_before $dir_after |
| rm -rf "$test_dir" |
| echo "test_incremental_build_parity test passed" |
| } |
| |
| function compare_files_parity() { |
| local dir_before=$1; shift |
| local dir_after=$1; shift |
| count=0 |
| for file_before in ${dir_before}/*.mk; do |
| file_after="${dir_after}/$(basename "$file_before")" |
| assert_files_equal $file_before $file_after |
| ((count++)) |
| done |
| echo "Compared $count mk files" |
| |
| combined_before_file="${dir_before}/combined_files.ninja" |
| count=0 |
| for file in ${dir_before}/build.aosp_arm.*.ninja; do |
| cat $file >> $combined_before_file |
| ((count++)) |
| done |
| echo "Combined $count ninja files from normal build" |
| |
| combined_after_file="${dir_after}/combined_files.ninja" |
| count=0 |
| for file in ${dir_after}/build.aosp_arm.*.ninja; do |
| cat $file >> $combined_after_file |
| ((count++)) |
| done |
| echo "Combined $count ninja files from incremental build" |
| |
| combined_incremental_ninjas="${dir_after}/combined_incremental_files.ninja" |
| count=0 |
| for file in ${dir_after}/build_aosp_arm_ninja_incremental/*.ninja; do |
| cat $file >> $combined_incremental_ninjas |
| ((count++)) |
| done |
| echo "Combined $count incremental ninja files" |
| |
| cat $combined_incremental_ninjas >> $combined_after_file |
| sort $combined_after_file -o $combined_after_file |
| sort $combined_before_file -o $combined_before_file |
| assert_files_equal $combined_before_file $combined_after_file |
| } |
| |
| function compare_incremental_files() { |
| local dir_before=$1; shift |
| local dir_after=$1; shift |
| count=0 |
| for file_before in ${dir_before}/*.ninja; do |
| file_after="${dir_after}/$(basename "$file_before")" |
| assert_files_equal $file_before $file_after |
| compare_mtimes $file_before $file_after |
| if [ $? -ne 0 ]; then |
| echo "Files have identical mtime: $file_before $file_after" |
| exit 1 |
| fi |
| ((count++)) |
| done |
| echo "Compared $count ninja files" |
| |
| count=0 |
| for file_before in ${dir_before}/*.mk; do |
| file_after="${dir_after}/$(basename "$file_before")" |
| assert_files_equal $file_before $file_after |
| compare_mtimes $file_before $file_after |
| # mk files shouldn't be regenerated |
| if [ $? -ne 1 ]; then |
| echo "Files have different mtimes: $file_before $file_after" |
| exit 1 |
| fi |
| ((count++)) |
| done |
| echo "Compared $count mk files" |
| |
| count=0 |
| for file_before in ${dir_before}/build_aosp_arm_ninja_incremental/*.ninja; do |
| file_after="${dir_after}/build_aosp_arm_ninja_incremental/$(basename "$file_before")" |
| assert_files_equal $file_before $file_after |
| compare_mtimes $file_before $file_after |
| # ninja files of skipped modules shouldn't be regenerated |
| if [ $? -ne 1 ]; then |
| echo "Files have different mtimes: $file_before $file_after" |
| exit 1 |
| fi |
| ((count++)) |
| done |
| echo "Compared $count incremental ninja files" |
| } |
| |
| test_incremental_build_parity |
| test_build_action_restoring |