Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 1 | #!/bin/bash -u |
| 2 | |
| 3 | set -o pipefail |
| 4 | |
| 5 | # Test that the mk and ninja files generated by Soong don't change if some |
| 6 | # incremental modules are restored from cache. |
| 7 | |
| 8 | OUTPUT_DIR="$(mktemp -d tmp.XXXXXX)" |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 9 | |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 10 | echo ${OUTPUT_DIR} |
| 11 | |
| 12 | function cleanup { |
| 13 | rm -rf "${OUTPUT_DIR}" |
| 14 | } |
| 15 | trap cleanup EXIT |
| 16 | |
| 17 | function run_soong_build { |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 18 | USE_RBE=false TARGET_PRODUCT=aosp_arm TARGET_RELEASE=trunk_staging TARGET_BUILD_VARIANT=userdebug build/soong/soong_ui.bash --make-mode "$@" nothing |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 19 | } |
| 20 | |
| 21 | function run_soong_clean { |
| 22 | build/soong/soong_ui.bash --make-mode clean |
| 23 | } |
| 24 | |
| 25 | function assert_files_equal { |
| 26 | if [ $# -ne 2 ]; then |
| 27 | echo "Usage: assert_files_equal file1 file2" |
| 28 | exit 1 |
| 29 | fi |
| 30 | |
| 31 | if ! cmp -s "$1" "$2"; then |
| 32 | echo "Files are different: $1 $2" |
| 33 | exit 1 |
| 34 | fi |
| 35 | } |
| 36 | |
| 37 | function compare_mtimes() { |
| 38 | if [ $# -ne 2 ]; then |
| 39 | echo "Usage: compare_mtimes file1 file2" |
| 40 | exit 1 |
| 41 | fi |
| 42 | |
| 43 | file1_mtime=$(stat -c '%Y' $1) |
| 44 | file2_mtime=$(stat -c '%Y' $2) |
| 45 | |
| 46 | if [ "$file1_mtime" -eq "$file2_mtime" ]; then |
| 47 | return 1 |
| 48 | else |
| 49 | return 0 |
| 50 | fi |
| 51 | } |
| 52 | |
| 53 | function test_build_action_restoring() { |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 54 | local test_dir="${OUTPUT_DIR}/test_build_action_restoring" |
| 55 | mkdir -p ${test_dir} |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 56 | run_soong_clean |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 57 | cat > ${test_dir}/Android.bp <<'EOF' |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 58 | python_binary_host { |
| 59 | name: "my_little_binary_host", |
| 60 | srcs: ["my_little_binary_host.py"], |
| 61 | } |
| 62 | EOF |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 63 | touch ${test_dir}/my_little_binary_host.py |
| 64 | run_soong_build --incremental-build-actions |
| 65 | local dir_before="${test_dir}/before" |
| 66 | mkdir -p ${dir_before} |
| 67 | cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 68 | # add a comment to the bp file, this should force a new analysis but no module |
| 69 | # should be really impacted, so all the incremental modules should be skipped. |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 70 | cat >> ${test_dir}/Android.bp <<'EOF' |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 71 | // new comments |
| 72 | EOF |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 73 | run_soong_build --incremental-build-actions |
| 74 | local dir_after="${test_dir}/after" |
| 75 | mkdir -p ${dir_after} |
| 76 | cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 77 | |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 78 | compare_incremental_files $dir_before $dir_after |
| 79 | rm -rf "$test_dir" |
| 80 | echo "test_build_action_restoring test passed" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 81 | } |
| 82 | |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 83 | function test_incremental_build_parity() { |
| 84 | local test_dir="${OUTPUT_DIR}/test_incremental_build_parity" |
| 85 | run_soong_clean |
| 86 | run_soong_build |
| 87 | local dir_before="${test_dir}/before" |
| 88 | mkdir -p ${dir_before} |
| 89 | cp -pr out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before |
| 90 | |
| 91 | # Now run clean build with incremental enabled |
| 92 | run_soong_clean |
| 93 | run_soong_build --incremental-build-actions |
| 94 | local dir_after="${test_dir}/after" |
| 95 | mkdir -p ${dir_after} |
| 96 | cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after |
| 97 | |
| 98 | compare_files_parity $dir_before $dir_after |
| 99 | rm -rf "$test_dir" |
| 100 | echo "test_incremental_build_parity test passed" |
| 101 | } |
| 102 | |
| 103 | function compare_files_parity() { |
| 104 | local dir_before=$1; shift |
| 105 | local dir_after=$1; shift |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 106 | count=0 |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 107 | for file_before in ${dir_before}/*.mk; do |
| 108 | file_after="${dir_after}/$(basename "$file_before")" |
| 109 | assert_files_equal $file_before $file_after |
| 110 | ((count++)) |
| 111 | done |
| 112 | echo "Compared $count mk files" |
| 113 | |
| 114 | combined_before_file="${dir_before}/combined_files.ninja" |
| 115 | count=0 |
| 116 | for file in ${dir_before}/build.aosp_arm.*.ninja; do |
| 117 | cat $file >> $combined_before_file |
| 118 | ((count++)) |
| 119 | done |
| 120 | echo "Combined $count ninja files from normal build" |
| 121 | |
| 122 | combined_after_file="${dir_after}/combined_files.ninja" |
| 123 | count=0 |
| 124 | for file in ${dir_after}/build.aosp_arm.*.ninja; do |
| 125 | cat $file >> $combined_after_file |
| 126 | ((count++)) |
| 127 | done |
| 128 | echo "Combined $count ninja files from incremental build" |
| 129 | |
| 130 | combined_incremental_ninjas="${dir_after}/combined_incremental_files.ninja" |
| 131 | count=0 |
| 132 | for file in ${dir_after}/build_aosp_arm_ninja_incremental/*.ninja; do |
| 133 | cat $file >> $combined_incremental_ninjas |
| 134 | ((count++)) |
| 135 | done |
| 136 | echo "Combined $count incremental ninja files" |
| 137 | |
| 138 | cat $combined_incremental_ninjas >> $combined_after_file |
| 139 | sort $combined_after_file -o $combined_after_file |
| 140 | sort $combined_before_file -o $combined_before_file |
| 141 | assert_files_equal $combined_before_file $combined_after_file |
| 142 | } |
| 143 | |
| 144 | function compare_incremental_files() { |
| 145 | local dir_before=$1; shift |
| 146 | local dir_after=$1; shift |
| 147 | count=0 |
| 148 | for file_before in ${dir_before}/*.ninja; do |
| 149 | file_after="${dir_after}/$(basename "$file_before")" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 150 | assert_files_equal $file_before $file_after |
| 151 | compare_mtimes $file_before $file_after |
| 152 | if [ $? -ne 0 ]; then |
| 153 | echo "Files have identical mtime: $file_before $file_after" |
| 154 | exit 1 |
| 155 | fi |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 156 | ((count++)) |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 157 | done |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 158 | echo "Compared $count ninja files" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 159 | |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 160 | count=0 |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 161 | for file_before in ${dir_before}/*.mk; do |
| 162 | file_after="${dir_after}/$(basename "$file_before")" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 163 | assert_files_equal $file_before $file_after |
| 164 | compare_mtimes $file_before $file_after |
| 165 | # mk files shouldn't be regenerated |
| 166 | if [ $? -ne 1 ]; then |
| 167 | echo "Files have different mtimes: $file_before $file_after" |
| 168 | exit 1 |
| 169 | fi |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 170 | ((count++)) |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 171 | done |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 172 | echo "Compared $count mk files" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 173 | |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 174 | count=0 |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 175 | for file_before in ${dir_before}/build_aosp_arm_ninja_incremental/*.ninja; do |
| 176 | file_after="${dir_after}/build_aosp_arm_ninja_incremental/$(basename "$file_before")" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 177 | assert_files_equal $file_before $file_after |
| 178 | compare_mtimes $file_before $file_after |
| 179 | # ninja files of skipped modules shouldn't be regenerated |
| 180 | if [ $? -ne 1 ]; then |
| 181 | echo "Files have different mtimes: $file_before $file_after" |
| 182 | exit 1 |
| 183 | fi |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 184 | ((count++)) |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 185 | done |
Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 186 | echo "Compared $count incremental ninja files" |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 187 | } |
| 188 | |
Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame^] | 189 | test_incremental_build_parity |
Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 190 | test_build_action_restoring |