1*333d2b36SAndroid Build Coastguard Worker#!/bin/bash -eu 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Workerset -o pipefail 4*333d2b36SAndroid Build Coastguard Worker 5*333d2b36SAndroid Build Coastguard Worker# This test exercises the bootstrapping process of the build system 6*333d2b36SAndroid Build Coastguard Worker# in a source tree that only contains enough files for Bazel and Soong to work. 7*333d2b36SAndroid Build Coastguard Worker 8*333d2b36SAndroid Build Coastguard Workersource "$(dirname "$0")/lib.sh" 9*333d2b36SAndroid Build Coastguard Worker 10*333d2b36SAndroid Build Coastguard Workerreadonly GENERATED_BUILD_FILE_NAME="BUILD.bazel" 11*333d2b36SAndroid Build Coastguard Worker 12*333d2b36SAndroid Build Coastguard Workerreadonly target_product="${TARGET_PRODUCT:-aosp_arm}" 13*333d2b36SAndroid Build Coastguard Worker 14*333d2b36SAndroid Build Coastguard Workerfunction test_smoke { 15*333d2b36SAndroid Build Coastguard Worker setup 16*333d2b36SAndroid Build Coastguard Worker run_soong 17*333d2b36SAndroid Build Coastguard Worker} 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerfunction test_null_build() { 20*333d2b36SAndroid Build Coastguard Worker setup 21*333d2b36SAndroid Build Coastguard Worker run_soong 22*333d2b36SAndroid Build Coastguard Worker local -r bootstrap_mtime1=$(stat -c "%y" out/soong/bootstrap.ninja) 23*333d2b36SAndroid Build Coastguard Worker local -r output_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 24*333d2b36SAndroid Build Coastguard Worker run_soong 25*333d2b36SAndroid Build Coastguard Worker local -r bootstrap_mtime2=$(stat -c "%y" out/soong/bootstrap.ninja) 26*333d2b36SAndroid Build Coastguard Worker local -r output_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker if [[ "$bootstrap_mtime1" == "$bootstrap_mtime2" ]]; then 29*333d2b36SAndroid Build Coastguard Worker # Bootstrapping is always done. It doesn't take a measurable amount of time. 30*333d2b36SAndroid Build Coastguard Worker fail "Bootstrap Ninja file did not change on null build" 31*333d2b36SAndroid Build Coastguard Worker fi 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker if [[ "$output_mtime1" != "$output_mtime2" ]]; then 34*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed on null build" 35*333d2b36SAndroid Build Coastguard Worker fi 36*333d2b36SAndroid Build Coastguard Worker} 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Workerfunction test_soong_build_rebuilt_if_blueprint_changes() { 39*333d2b36SAndroid Build Coastguard Worker setup 40*333d2b36SAndroid Build Coastguard Worker run_soong 41*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/bootstrap.ninja) 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker sed -i 's/pluginGenSrcCmd/pluginGenSrcCmd2/g' build/blueprint/bootstrap/bootstrap.go 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker run_soong 46*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/bootstrap.ninja) 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 49*333d2b36SAndroid Build Coastguard Worker fail "Bootstrap Ninja file did not change" 50*333d2b36SAndroid Build Coastguard Worker fi 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workerfunction test_change_android_bp() { 54*333d2b36SAndroid Build Coastguard Worker setup 55*333d2b36SAndroid Build Coastguard Worker mkdir -p a 56*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 57*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 58*333d2b36SAndroid Build Coastguard Worker name: "my_little_binary_host", 59*333d2b36SAndroid Build Coastguard Worker srcs: ["my_little_binary_host.py"] 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard WorkerEOF 62*333d2b36SAndroid Build Coastguard Worker touch a/my_little_binary_host.py 63*333d2b36SAndroid Build Coastguard Worker run_soong 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja || fail "module not found" 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 68*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 69*333d2b36SAndroid Build Coastguard Worker name: "my_great_binary_host", 70*333d2b36SAndroid Build Coastguard Worker srcs: ["my_great_binary_host.py"] 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard WorkerEOF 73*333d2b36SAndroid Build Coastguard Worker touch a/my_great_binary_host.py 74*333d2b36SAndroid Build Coastguard Worker run_soong 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja && fail "old module found" 77*333d2b36SAndroid Build Coastguard Worker grep -q "^# Module:.*my_great_binary_host" out/soong/build."${target_product}".ninja || fail "new module not found" 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workerfunction test_add_android_bp() { 81*333d2b36SAndroid Build Coastguard Worker setup 82*333d2b36SAndroid Build Coastguard Worker run_soong 83*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker mkdir -p a 86*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 87*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 88*333d2b36SAndroid Build Coastguard Worker name: "my_little_binary_host", 89*333d2b36SAndroid Build Coastguard Worker srcs: ["my_little_binary_host.py"] 90*333d2b36SAndroid Build Coastguard Worker} 91*333d2b36SAndroid Build Coastguard WorkerEOF 92*333d2b36SAndroid Build Coastguard Worker touch a/my_little_binary_host.py 93*333d2b36SAndroid Build Coastguard Worker run_soong 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 96*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 97*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file did not change" 98*333d2b36SAndroid Build Coastguard Worker fi 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "New module not in output" 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker run_soong 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunction test_delete_android_bp() { 106*333d2b36SAndroid Build Coastguard Worker setup 107*333d2b36SAndroid Build Coastguard Worker mkdir -p a 108*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 109*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 110*333d2b36SAndroid Build Coastguard Worker name: "my_little_binary_host", 111*333d2b36SAndroid Build Coastguard Worker srcs: ["my_little_binary_host.py"] 112*333d2b36SAndroid Build Coastguard Worker} 113*333d2b36SAndroid Build Coastguard WorkerEOF 114*333d2b36SAndroid Build Coastguard Worker touch a/my_little_binary_host.py 115*333d2b36SAndroid Build Coastguard Worker run_soong 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "Module not in output" 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker rm a/Android.bp 120*333d2b36SAndroid Build Coastguard Worker run_soong 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker if grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja; then 123*333d2b36SAndroid Build Coastguard Worker fail "Old module in output" 124*333d2b36SAndroid Build Coastguard Worker fi 125*333d2b36SAndroid Build Coastguard Worker} 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker# Test that an incremental build with a glob doesn't rerun soong_build, and 128*333d2b36SAndroid Build Coastguard Worker# only regenerates the globs on the first but not the second incremental build. 129*333d2b36SAndroid Build Coastguard Workerfunction test_glob_noop_incremental() { 130*333d2b36SAndroid Build Coastguard Worker setup 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker # This test needs to start from a clean build, but setup creates an 133*333d2b36SAndroid Build Coastguard Worker # initialized tree that has already been built once. Clear the out 134*333d2b36SAndroid Build Coastguard Worker # directory to start from scratch (see b/185591972) 135*333d2b36SAndroid Build Coastguard Worker rm -rf out 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker mkdir -p a 138*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 139*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 140*333d2b36SAndroid Build Coastguard Worker name: "my_little_binary_host", 141*333d2b36SAndroid Build Coastguard Worker srcs: ["*.py"], 142*333d2b36SAndroid Build Coastguard Worker} 143*333d2b36SAndroid Build Coastguard WorkerEOF 144*333d2b36SAndroid Build Coastguard Worker touch a/my_little_binary_host.py 145*333d2b36SAndroid Build Coastguard Worker run_soong 146*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker run_soong 149*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then 152*333d2b36SAndroid Build Coastguard Worker fail "Ninja file rewritten on null incremental build" 153*333d2b36SAndroid Build Coastguard Worker fi 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker run_soong 156*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja) 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker if [[ "$ninja_mtime2" != "$ninja_mtime3" ]]; then 159*333d2b36SAndroid Build Coastguard Worker fail "Ninja file rewritten on null incremental build" 160*333d2b36SAndroid Build Coastguard Worker fi 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workerfunction test_add_file_to_glob() { 164*333d2b36SAndroid Build Coastguard Worker setup 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker mkdir -p a 167*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<'EOF' 168*333d2b36SAndroid Build Coastguard Workerpython_binary_host { 169*333d2b36SAndroid Build Coastguard Worker name: "my_little_binary_host", 170*333d2b36SAndroid Build Coastguard Worker srcs: ["*.py"], 171*333d2b36SAndroid Build Coastguard Worker} 172*333d2b36SAndroid Build Coastguard WorkerEOF 173*333d2b36SAndroid Build Coastguard Worker touch a/my_little_binary_host.py 174*333d2b36SAndroid Build Coastguard Worker run_soong 175*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker touch a/my_little_library.py 178*333d2b36SAndroid Build Coastguard Worker run_soong 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 181*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 182*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file did not change" 183*333d2b36SAndroid Build Coastguard Worker fi 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker grep -q my_little_library.py out/soong/build."${target_product}".ninja || fail "new file is not in output" 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Workerfunction test_soong_build_rerun_iff_environment_changes() { 189*333d2b36SAndroid Build Coastguard Worker setup 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker mkdir -p build/soong/cherry 192*333d2b36SAndroid Build Coastguard Worker cat > build/soong/cherry/Android.bp <<'EOF' 193*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package { 194*333d2b36SAndroid Build Coastguard Worker name: "cherry", 195*333d2b36SAndroid Build Coastguard Worker pkgPath: "android/soong/cherry", 196*333d2b36SAndroid Build Coastguard Worker deps: [ 197*333d2b36SAndroid Build Coastguard Worker "blueprint", 198*333d2b36SAndroid Build Coastguard Worker "soong", 199*333d2b36SAndroid Build Coastguard Worker "soong-android", 200*333d2b36SAndroid Build Coastguard Worker ], 201*333d2b36SAndroid Build Coastguard Worker srcs: [ 202*333d2b36SAndroid Build Coastguard Worker "cherry.go", 203*333d2b36SAndroid Build Coastguard Worker ], 204*333d2b36SAndroid Build Coastguard Worker pluginFor: ["soong_build"], 205*333d2b36SAndroid Build Coastguard Worker} 206*333d2b36SAndroid Build Coastguard WorkerEOF 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker cat > build/soong/cherry/cherry.go <<'EOF' 209*333d2b36SAndroid Build Coastguard Workerpackage cherry 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Workerimport ( 212*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 213*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 214*333d2b36SAndroid Build Coastguard Worker) 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Workervar ( 217*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("cherry") 218*333d2b36SAndroid Build Coastguard Worker) 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Workerfunc init() { 221*333d2b36SAndroid Build Coastguard Worker android.RegisterSingletonType("cherry", CherrySingleton) 222*333d2b36SAndroid Build Coastguard Worker} 223*333d2b36SAndroid Build Coastguard Worker 224*333d2b36SAndroid Build Coastguard Workerfunc CherrySingleton() android.Singleton { 225*333d2b36SAndroid Build Coastguard Worker return &cherrySingleton{} 226*333d2b36SAndroid Build Coastguard Worker} 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workertype cherrySingleton struct{} 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Workerfunc (p *cherrySingleton) GenerateBuildActions(ctx android.SingletonContext) { 231*333d2b36SAndroid Build Coastguard Worker cherryRule := ctx.Rule(pctx, "cherry", 232*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 233*333d2b36SAndroid Build Coastguard Worker Command: "echo CHERRY IS " + ctx.Config().Getenv("CHERRY") + " > ${out}", 234*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{}, 235*333d2b36SAndroid Build Coastguard Worker Description: "Cherry", 236*333d2b36SAndroid Build Coastguard Worker }) 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForOutput(ctx, "cherry", "cherry.txt") 239*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 242*333d2b36SAndroid Build Coastguard Worker Rule: cherryRule, 243*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 244*333d2b36SAndroid Build Coastguard Worker Inputs: deps, 245*333d2b36SAndroid Build Coastguard Worker }) 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard WorkerEOF 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker export CHERRY=TASTY 250*333d2b36SAndroid Build Coastguard Worker run_soong 251*333d2b36SAndroid Build Coastguard Worker grep -q "CHERRY IS TASTY" out/soong/build."${target_product}".ninja \ 252*333d2b36SAndroid Build Coastguard Worker || fail "first value of environment variable is not used" 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Worker export CHERRY=RED 255*333d2b36SAndroid Build Coastguard Worker run_soong 256*333d2b36SAndroid Build Coastguard Worker grep -q "CHERRY IS RED" out/soong/build."${target_product}".ninja \ 257*333d2b36SAndroid Build Coastguard Worker || fail "second value of environment variable not used" 258*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Worker run_soong 261*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 262*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" != "$mtime2" ]]; then 263*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed when environment variable did not" 264*333d2b36SAndroid Build Coastguard Worker fi 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker} 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Workerfunction test_create_global_include_directory() { 269*333d2b36SAndroid Build Coastguard Worker setup 270*333d2b36SAndroid Build Coastguard Worker run_soong 271*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker # Soong needs to know if top level directories like hardware/ exist for use 274*333d2b36SAndroid Build Coastguard Worker # as global include directories. Make sure that doesn't cause regens for 275*333d2b36SAndroid Build Coastguard Worker # unrelated changes to the top level directory. 276*333d2b36SAndroid Build Coastguard Worker mkdir -p system/core 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker run_soong 279*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 280*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" != "$mtime2" ]]; then 281*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed when top level directory changed" 282*333d2b36SAndroid Build Coastguard Worker fi 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker # Make sure it does regen if a missing directory in the path of a global 285*333d2b36SAndroid Build Coastguard Worker # include directory is added. 286*333d2b36SAndroid Build Coastguard Worker mkdir -p system/core/include 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker run_soong 289*333d2b36SAndroid Build Coastguard Worker local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja) 290*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime2" = "$mtime3" ]]; then 291*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file did not change when global include directory created" 292*333d2b36SAndroid Build Coastguard Worker fi 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker} 295*333d2b36SAndroid Build Coastguard Worker 296*333d2b36SAndroid Build Coastguard Workerfunction test_add_file_to_soong_build() { 297*333d2b36SAndroid Build Coastguard Worker setup 298*333d2b36SAndroid Build Coastguard Worker run_soong 299*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker mkdir -p vendor/foo/picard 302*333d2b36SAndroid Build Coastguard Worker cat > vendor/foo/picard/Android.bp <<'EOF' 303*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package { 304*333d2b36SAndroid Build Coastguard Worker name: "picard-soong-rules", 305*333d2b36SAndroid Build Coastguard Worker pkgPath: "android/soong/picard", 306*333d2b36SAndroid Build Coastguard Worker deps: [ 307*333d2b36SAndroid Build Coastguard Worker "blueprint", 308*333d2b36SAndroid Build Coastguard Worker "soong", 309*333d2b36SAndroid Build Coastguard Worker "soong-android", 310*333d2b36SAndroid Build Coastguard Worker ], 311*333d2b36SAndroid Build Coastguard Worker srcs: [ 312*333d2b36SAndroid Build Coastguard Worker "picard.go", 313*333d2b36SAndroid Build Coastguard Worker ], 314*333d2b36SAndroid Build Coastguard Worker pluginFor: ["soong_build"], 315*333d2b36SAndroid Build Coastguard Worker} 316*333d2b36SAndroid Build Coastguard WorkerEOF 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker cat > vendor/foo/picard/picard.go <<'EOF' 319*333d2b36SAndroid Build Coastguard Workerpackage picard 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Workerimport ( 322*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 323*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 324*333d2b36SAndroid Build Coastguard Worker) 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Workervar ( 327*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("picard") 328*333d2b36SAndroid Build Coastguard Worker) 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Workerfunc init() { 331*333d2b36SAndroid Build Coastguard Worker android.RegisterSingletonType("picard", PicardSingleton) 332*333d2b36SAndroid Build Coastguard Worker} 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Workerfunc PicardSingleton() android.Singleton { 335*333d2b36SAndroid Build Coastguard Worker return &picardSingleton{} 336*333d2b36SAndroid Build Coastguard Worker} 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Workertype picardSingleton struct{} 339*333d2b36SAndroid Build Coastguard Worker 340*333d2b36SAndroid Build Coastguard Workerfunc (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) { 341*333d2b36SAndroid Build Coastguard Worker picardRule := ctx.Rule(pctx, "picard", 342*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 343*333d2b36SAndroid Build Coastguard Worker Command: "echo Make it so. > ${out}", 344*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{}, 345*333d2b36SAndroid Build Coastguard Worker Description: "Something quotable", 346*333d2b36SAndroid Build Coastguard Worker }) 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForOutput(ctx, "picard", "picard.txt") 349*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 352*333d2b36SAndroid Build Coastguard Worker Rule: picardRule, 353*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 354*333d2b36SAndroid Build Coastguard Worker Inputs: deps, 355*333d2b36SAndroid Build Coastguard Worker }) 356*333d2b36SAndroid Build Coastguard Worker} 357*333d2b36SAndroid Build Coastguard Worker 358*333d2b36SAndroid Build Coastguard WorkerEOF 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Worker run_soong 361*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 362*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 363*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file did not change" 364*333d2b36SAndroid Build Coastguard Worker fi 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "New action not present" 367*333d2b36SAndroid Build Coastguard Worker} 368*333d2b36SAndroid Build Coastguard Worker 369*333d2b36SAndroid Build Coastguard Worker# Tests a glob in a build= statement in an Android.bp file, which is interpreted 370*333d2b36SAndroid Build Coastguard Worker# during bootstrapping. 371*333d2b36SAndroid Build Coastguard Workerfunction test_glob_during_bootstrapping() { 372*333d2b36SAndroid Build Coastguard Worker setup 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Worker mkdir -p build/soong/picard 375*333d2b36SAndroid Build Coastguard Worker cat > build/soong/picard/Android.bp <<'EOF' 376*333d2b36SAndroid Build Coastguard Workerbuild=["foo*.bp"] 377*333d2b36SAndroid Build Coastguard WorkerEOF 378*333d2b36SAndroid Build Coastguard Worker cat > build/soong/picard/fooa.bp <<'EOF' 379*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package { 380*333d2b36SAndroid Build Coastguard Worker name: "picard-soong-rules", 381*333d2b36SAndroid Build Coastguard Worker pkgPath: "android/soong/picard", 382*333d2b36SAndroid Build Coastguard Worker deps: [ 383*333d2b36SAndroid Build Coastguard Worker "blueprint", 384*333d2b36SAndroid Build Coastguard Worker "soong", 385*333d2b36SAndroid Build Coastguard Worker "soong-android", 386*333d2b36SAndroid Build Coastguard Worker ], 387*333d2b36SAndroid Build Coastguard Worker srcs: [ 388*333d2b36SAndroid Build Coastguard Worker "picard.go", 389*333d2b36SAndroid Build Coastguard Worker ], 390*333d2b36SAndroid Build Coastguard Worker pluginFor: ["soong_build"], 391*333d2b36SAndroid Build Coastguard Worker} 392*333d2b36SAndroid Build Coastguard WorkerEOF 393*333d2b36SAndroid Build Coastguard Worker 394*333d2b36SAndroid Build Coastguard Worker cat > build/soong/picard/picard.go <<'EOF' 395*333d2b36SAndroid Build Coastguard Workerpackage picard 396*333d2b36SAndroid Build Coastguard Worker 397*333d2b36SAndroid Build Coastguard Workerimport ( 398*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 399*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 400*333d2b36SAndroid Build Coastguard Worker) 401*333d2b36SAndroid Build Coastguard Worker 402*333d2b36SAndroid Build Coastguard Workervar ( 403*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("picard") 404*333d2b36SAndroid Build Coastguard Worker) 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Workerfunc init() { 407*333d2b36SAndroid Build Coastguard Worker android.RegisterSingletonType("picard", PicardSingleton) 408*333d2b36SAndroid Build Coastguard Worker} 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Workerfunc PicardSingleton() android.Singleton { 411*333d2b36SAndroid Build Coastguard Worker return &picardSingleton{} 412*333d2b36SAndroid Build Coastguard Worker} 413*333d2b36SAndroid Build Coastguard Worker 414*333d2b36SAndroid Build Coastguard Workertype picardSingleton struct{} 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Workervar Message = "Make it so." 417*333d2b36SAndroid Build Coastguard Worker 418*333d2b36SAndroid Build Coastguard Workerfunc (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) { 419*333d2b36SAndroid Build Coastguard Worker picardRule := ctx.Rule(pctx, "picard", 420*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 421*333d2b36SAndroid Build Coastguard Worker Command: "echo " + Message + " > ${out}", 422*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{}, 423*333d2b36SAndroid Build Coastguard Worker Description: "Something quotable", 424*333d2b36SAndroid Build Coastguard Worker }) 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForOutput(ctx, "picard", "picard.txt") 427*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 428*333d2b36SAndroid Build Coastguard Worker 429*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 430*333d2b36SAndroid Build Coastguard Worker Rule: picardRule, 431*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 432*333d2b36SAndroid Build Coastguard Worker Inputs: deps, 433*333d2b36SAndroid Build Coastguard Worker }) 434*333d2b36SAndroid Build Coastguard Worker} 435*333d2b36SAndroid Build Coastguard Worker 436*333d2b36SAndroid Build Coastguard WorkerEOF 437*333d2b36SAndroid Build Coastguard Worker 438*333d2b36SAndroid Build Coastguard Worker run_soong 439*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 440*333d2b36SAndroid Build Coastguard Worker 441*333d2b36SAndroid Build Coastguard Worker grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "Original action not present" 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Worker cat > build/soong/picard/foob.bp <<'EOF' 444*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package { 445*333d2b36SAndroid Build Coastguard Worker name: "worf-soong-rules", 446*333d2b36SAndroid Build Coastguard Worker pkgPath: "android/soong/worf", 447*333d2b36SAndroid Build Coastguard Worker deps: [ 448*333d2b36SAndroid Build Coastguard Worker "blueprint", 449*333d2b36SAndroid Build Coastguard Worker "soong", 450*333d2b36SAndroid Build Coastguard Worker "soong-android", 451*333d2b36SAndroid Build Coastguard Worker "picard-soong-rules", 452*333d2b36SAndroid Build Coastguard Worker ], 453*333d2b36SAndroid Build Coastguard Worker srcs: [ 454*333d2b36SAndroid Build Coastguard Worker "worf.go", 455*333d2b36SAndroid Build Coastguard Worker ], 456*333d2b36SAndroid Build Coastguard Worker pluginFor: ["soong_build"], 457*333d2b36SAndroid Build Coastguard Worker} 458*333d2b36SAndroid Build Coastguard WorkerEOF 459*333d2b36SAndroid Build Coastguard Worker 460*333d2b36SAndroid Build Coastguard Worker cat > build/soong/picard/worf.go <<'EOF' 461*333d2b36SAndroid Build Coastguard Workerpackage worf 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Workerimport "android/soong/picard" 464*333d2b36SAndroid Build Coastguard Worker 465*333d2b36SAndroid Build Coastguard Workerfunc init() { 466*333d2b36SAndroid Build Coastguard Worker picard.Message = "Engage." 467*333d2b36SAndroid Build Coastguard Worker} 468*333d2b36SAndroid Build Coastguard WorkerEOF 469*333d2b36SAndroid Build Coastguard Worker 470*333d2b36SAndroid Build Coastguard Worker run_soong 471*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 472*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 473*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file did not change" 474*333d2b36SAndroid Build Coastguard Worker fi 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Worker grep -q "Engage" out/soong/build."${target_product}".ninja || fail "New action not present" 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Worker if grep -q "Make it so" out/soong/build."${target_product}".ninja; then 479*333d2b36SAndroid Build Coastguard Worker fail "Original action still present" 480*333d2b36SAndroid Build Coastguard Worker fi 481*333d2b36SAndroid Build Coastguard Worker} 482*333d2b36SAndroid Build Coastguard Worker 483*333d2b36SAndroid Build Coastguard Workerfunction test_soong_docs_smoke() { 484*333d2b36SAndroid Build Coastguard Worker setup 485*333d2b36SAndroid Build Coastguard Worker 486*333d2b36SAndroid Build Coastguard Worker run_soong soong_docs 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Worker [[ -e "out/soong/docs/soong_build.html" ]] || fail "Documentation for main page not created" 489*333d2b36SAndroid Build Coastguard Worker [[ -e "out/soong/docs/cc.html" ]] || fail "Documentation for C++ modules not created" 490*333d2b36SAndroid Build Coastguard Worker} 491*333d2b36SAndroid Build Coastguard Worker 492*333d2b36SAndroid Build Coastguard Workerfunction test_null_build_after_soong_docs() { 493*333d2b36SAndroid Build Coastguard Worker setup 494*333d2b36SAndroid Build Coastguard Worker 495*333d2b36SAndroid Build Coastguard Worker run_soong 496*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Worker run_soong soong_docs 499*333d2b36SAndroid Build Coastguard Worker local -r docs_mtime1=$(stat -c "%y" out/soong/docs/soong_build.html) 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Worker run_soong soong_docs 502*333d2b36SAndroid Build Coastguard Worker local -r docs_mtime2=$(stat -c "%y" out/soong/docs/soong_build.html) 503*333d2b36SAndroid Build Coastguard Worker 504*333d2b36SAndroid Build Coastguard Worker if [[ "$docs_mtime1" != "$docs_mtime2" ]]; then 505*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed on null build" 506*333d2b36SAndroid Build Coastguard Worker fi 507*333d2b36SAndroid Build Coastguard Worker 508*333d2b36SAndroid Build Coastguard Worker run_soong 509*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Worker if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then 512*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed on null build" 513*333d2b36SAndroid Build Coastguard Worker fi 514*333d2b36SAndroid Build Coastguard Worker} 515*333d2b36SAndroid Build Coastguard Worker 516*333d2b36SAndroid Build Coastguard Workerfunction test_write_to_source_tree { 517*333d2b36SAndroid Build Coastguard Worker setup 518*333d2b36SAndroid Build Coastguard Worker mkdir -p a 519*333d2b36SAndroid Build Coastguard Worker cat > a/Android.bp <<EOF 520*333d2b36SAndroid Build Coastguard Workergenrule { 521*333d2b36SAndroid Build Coastguard Worker name: "write_to_source_tree", 522*333d2b36SAndroid Build Coastguard Worker out: ["write_to_source_tree"], 523*333d2b36SAndroid Build Coastguard Worker cmd: "touch file_in_source_tree && touch \$(out)", 524*333d2b36SAndroid Build Coastguard Worker} 525*333d2b36SAndroid Build Coastguard WorkerEOF 526*333d2b36SAndroid Build Coastguard Worker readonly EXPECTED_OUT=out/soong/.intermediates/a/write_to_source_tree/gen/write_to_source_tree 527*333d2b36SAndroid Build Coastguard Worker readonly ERROR_LOG=${MOCK_TOP}/out/error.log 528*333d2b36SAndroid Build Coastguard Worker readonly ERROR_MSG="Read-only file system" 529*333d2b36SAndroid Build Coastguard Worker readonly ERROR_HINT_PATTERN="BUILD_BROKEN_SRC_DIR" 530*333d2b36SAndroid Build Coastguard Worker # Test in ReadOnly source tree 531*333d2b36SAndroid Build Coastguard Worker run_ninja BUILD_BROKEN_SRC_DIR_IS_WRITABLE=false ${EXPECTED_OUT} &> /dev/null && \ 532*333d2b36SAndroid Build Coastguard Worker fail "Write to source tree should not work in a ReadOnly source tree" 533*333d2b36SAndroid Build Coastguard Worker 534*333d2b36SAndroid Build Coastguard Worker if grep -q "${ERROR_MSG}" "${ERROR_LOG}" && grep -q "${ERROR_HINT_PATTERN}" "${ERROR_LOG}" ; then 535*333d2b36SAndroid Build Coastguard Worker echo Error message and error hint found in logs >/dev/null 536*333d2b36SAndroid Build Coastguard Worker else 537*333d2b36SAndroid Build Coastguard Worker fail "Did not find Read-only error AND error hint in error.log" 538*333d2b36SAndroid Build Coastguard Worker fi 539*333d2b36SAndroid Build Coastguard Worker 540*333d2b36SAndroid Build Coastguard Worker # Test in ReadWrite source tree 541*333d2b36SAndroid Build Coastguard Worker run_ninja BUILD_BROKEN_SRC_DIR_IS_WRITABLE=true ${EXPECTED_OUT} &> /dev/null || \ 542*333d2b36SAndroid Build Coastguard Worker fail "Write to source tree did not succeed in a ReadWrite source tree" 543*333d2b36SAndroid Build Coastguard Worker 544*333d2b36SAndroid Build Coastguard Worker if grep -q "${ERROR_MSG}\|${ERROR_HINT_PATTERN}" "${ERROR_LOG}" ; then 545*333d2b36SAndroid Build Coastguard Worker fail "Found read-only error OR error hint in error.log" 546*333d2b36SAndroid Build Coastguard Worker fi 547*333d2b36SAndroid Build Coastguard Worker} 548*333d2b36SAndroid Build Coastguard Worker 549*333d2b36SAndroid Build Coastguard Workerfunction test_dump_json_module_graph() { 550*333d2b36SAndroid Build Coastguard Worker setup 551*333d2b36SAndroid Build Coastguard Worker run_soong json-module-graph 552*333d2b36SAndroid Build Coastguard Worker if [[ ! -r "out/soong/module-graph.json" ]]; then 553*333d2b36SAndroid Build Coastguard Worker fail "JSON file was not created" 554*333d2b36SAndroid Build Coastguard Worker fi 555*333d2b36SAndroid Build Coastguard Worker} 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Workerfunction test_json_module_graph_back_and_forth_null_build() { 558*333d2b36SAndroid Build Coastguard Worker setup 559*333d2b36SAndroid Build Coastguard Worker 560*333d2b36SAndroid Build Coastguard Worker run_soong 561*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 562*333d2b36SAndroid Build Coastguard Worker 563*333d2b36SAndroid Build Coastguard Worker run_soong json-module-graph 564*333d2b36SAndroid Build Coastguard Worker local -r json_mtime1=$(stat -c "%y" out/soong/module-graph.json) 565*333d2b36SAndroid Build Coastguard Worker 566*333d2b36SAndroid Build Coastguard Worker run_soong 567*333d2b36SAndroid Build Coastguard Worker local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 568*333d2b36SAndroid Build Coastguard Worker if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then 569*333d2b36SAndroid Build Coastguard Worker fail "Output Ninja file changed after writing JSON module graph" 570*333d2b36SAndroid Build Coastguard Worker fi 571*333d2b36SAndroid Build Coastguard Worker 572*333d2b36SAndroid Build Coastguard Worker run_soong json-module-graph 573*333d2b36SAndroid Build Coastguard Worker local -r json_mtime2=$(stat -c "%y" out/soong/module-graph.json) 574*333d2b36SAndroid Build Coastguard Worker if [[ "$json_mtime1" != "$json_mtime2" ]]; then 575*333d2b36SAndroid Build Coastguard Worker fail "JSON module graph file changed after writing Ninja file" 576*333d2b36SAndroid Build Coastguard Worker fi 577*333d2b36SAndroid Build Coastguard Worker 578*333d2b36SAndroid Build Coastguard Worker} 579*333d2b36SAndroid Build Coastguard Worker 580*333d2b36SAndroid Build Coastguard Worker# This test verifies that adding a new glob to a blueprint file only 581*333d2b36SAndroid Build Coastguard Worker# causes build."${target_product}".ninja to be regenerated on the *next* build, and *not* 582*333d2b36SAndroid Build Coastguard Worker# the build after. (This is a regression test for a bug where globs 583*333d2b36SAndroid Build Coastguard Worker# resulted in two successive regenerations.) 584*333d2b36SAndroid Build Coastguard Workerfunction test_new_glob_incrementality { 585*333d2b36SAndroid Build Coastguard Worker setup 586*333d2b36SAndroid Build Coastguard Worker 587*333d2b36SAndroid Build Coastguard Worker run_soong nothing 588*333d2b36SAndroid Build Coastguard Worker local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja) 589*333d2b36SAndroid Build Coastguard Worker 590*333d2b36SAndroid Build Coastguard Worker mkdir -p globdefpkg/ 591*333d2b36SAndroid Build Coastguard Worker cat > globdefpkg/Android.bp <<'EOF' 592*333d2b36SAndroid Build Coastguard Workerfilegroup { 593*333d2b36SAndroid Build Coastguard Worker name: "fg_with_glob", 594*333d2b36SAndroid Build Coastguard Worker srcs: ["*.txt"], 595*333d2b36SAndroid Build Coastguard Worker} 596*333d2b36SAndroid Build Coastguard WorkerEOF 597*333d2b36SAndroid Build Coastguard Worker 598*333d2b36SAndroid Build Coastguard Worker run_soong nothing 599*333d2b36SAndroid Build Coastguard Worker local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja) 600*333d2b36SAndroid Build Coastguard Worker 601*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime1" == "$mtime2" ]]; then 602*333d2b36SAndroid Build Coastguard Worker fail "Ninja file was not regenerated, despite a new bp file" 603*333d2b36SAndroid Build Coastguard Worker fi 604*333d2b36SAndroid Build Coastguard Worker 605*333d2b36SAndroid Build Coastguard Worker run_soong nothing 606*333d2b36SAndroid Build Coastguard Worker local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja) 607*333d2b36SAndroid Build Coastguard Worker 608*333d2b36SAndroid Build Coastguard Worker if [[ "$mtime2" != "$mtime3" ]]; then 609*333d2b36SAndroid Build Coastguard Worker fail "Ninja file was regenerated despite no previous bp changes" 610*333d2b36SAndroid Build Coastguard Worker fi 611*333d2b36SAndroid Build Coastguard Worker} 612*333d2b36SAndroid Build Coastguard Worker 613*333d2b36SAndroid Build Coastguard Workerscan_and_run_tests 614