diff options
| author | 2021-08-12 09:37:14 +0000 | |
|---|---|---|
| committer | 2021-08-12 10:14:02 +0000 | |
| commit | 53dfa408b4b0e60cfa1911c50a564cdbcedd7fa8 (patch) | |
| tree | f2fab52ac0c5b0cd024219f1404e53f1d03341b8 | |
| parent | c0a671fc80264fdf501225f64f8c2605d48d77ca (diff) | |
Generate build-globs.ninja when running bp2build.
This fixes null bp2build builds.
When running bp2build, out/soong/.bootstrap/build-globs.ninja wasn't
generated, therefore none of the globs in out/soong/.primary/globs have
actions to generate them. This makes bp2build always re-run on a null
build, because it depends on those non-existent globs in its depfile.
Fix the above by generating a build-globs.ninja file with the globs that
bp2build encounters during conversion, and add tests to verify that null
builds and bp2build -> soong workflows correctly regenerates the
build-globs.ninja file.
Test: soong integration tests for null soong->soong, bp2build->bp2build and bp2build->soong builds.
Fixes: 193650250
Change-Id: Icfbad351dfa85541d1ea451f73e65cac87097926
| -rw-r--r-- | cmd/soong_build/main.go | 6 | ||||
| -rwxr-xr-x | tests/bp2build_bazel_test.sh | 94 |
2 files changed, 100 insertions, 0 deletions
diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 0336fb668..0099e877e 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -469,6 +469,12 @@ func runBp2Build(configuration android.Config, extraNinjaDeps []string) { ninjaDeps := bootstrap.RunBlueprint(blueprintArgs, bp2buildCtx.Context, configuration) ninjaDeps = append(ninjaDeps, extraNinjaDeps...) + // Generate out/soong/.bootstrap/build-globs.ninja with the actions to generate flattened globfiles + // containing the globs seen during bp2build conversion + if blueprintArgs.GlobFile != "" { + bootstrap.WriteBuildGlobsNinjaFile(bootstrap.StageMain, bp2buildCtx.Context, blueprintArgs, configuration) + } + // Add the depfile on the expanded globs in out/soong/.primary/globs ninjaDeps = append(ninjaDeps, bootstrap.GlobFileListFiles(configuration)...) // Run the code-generation phase to convert BazelTargetModules to BUILD files diff --git a/tests/bp2build_bazel_test.sh b/tests/bp2build_bazel_test.sh index e3577107f..b5c686311 100755 --- a/tests/bp2build_bazel_test.sh +++ b/tests/bp2build_bazel_test.sh @@ -8,6 +8,100 @@ source "$(dirname "$0")/lib.sh" readonly GENERATED_BUILD_FILE_NAME="BUILD.bazel" +function test_bp2build_null_build() { + setup + run_bp2build + local output_mtime1=$(stat -c "%y" out/soong/.bootstrap/bp2build_workspace_marker) + + run_bp2build + local output_mtime2=$(stat -c "%y" out/soong/.bootstrap/bp2build_workspace_marker) + + if [[ "$output_mtime1" != "$output_mtime2" ]]; then + fail "Output bp2build marker file changed on null build" + fi +} + +test_bp2build_null_build + +function test_bp2build_null_build_with_globs() { + setup + + mkdir -p foo/bar + cat > foo/bar/Android.bp <<'EOF' +filegroup { + name: "globs", + srcs: ["*.txt"], + } +EOF + touch foo/bar/a.txt foo/bar/b.txt + + run_bp2build + local output_mtime1=$(stat -c "%y" out/soong/.bootstrap/bp2build_workspace_marker) + + run_bp2build + local output_mtime2=$(stat -c "%y" out/soong/.bootstrap/bp2build_workspace_marker) + + if [[ "$output_mtime1" != "$output_mtime2" ]]; then + fail "Output bp2build marker file changed on null build" + fi +} + +test_bp2build_null_build_with_globs + +function test_soong_after_bp2build_regenerates_build_globs_ninja() { + setup + + mkdir -p foo/bar + cat > foo/bar/Android.bp <<'EOF' +filegroup { + name: "bp2build-files", + srcs: ["bp2build.*"], + bazel_module: { bp2build_available: true }, +} + +filegroup { + name: "soong-files", + srcs: ["soong.*"], +} +EOF + touch foo/bar/bp2build.txt foo/bar/soong.txt + + build_globs_file="out/soong/.bootstrap/build-globs.ninja" + + # Test: the build-globs file for bp2build should only contain the bp2build-files + # glob, whereas the build-globs file for soong should contain both bp2build-files + # and soong-files globs. + + run_bp2build + local output_mtime1=$(stat -c "%y" "${build_globs_file}") + + if ! grep "\"foo/bar/bp2build.*\"" "${build_globs_file}"; then + fail "bp2build filegroup globs not found in bp2build's globs file" + fi + + if grep "\"foo/bar/soong.*\"" "${build_globs_file}"; then + fail "soong filegroup globs unexpectedly found in bp2build's globs file" + fi + + run_soong + local output_mtime2=$(stat -c "%y" "${build_globs_file}") + + if [[ "$output_mtime1" == "$output_mtime2" ]]; then + fail "Output build-globs.ninja file did not change" + fi + + if ! grep "\"foo/bar/bp2build.*\"" "${build_globs_file}"; then + fail "bp2build filegroup globs not found in bp2build's globs file" + fi + + if ! grep "\"foo/bar/soong.*\"" "${build_globs_file}"; then + fail "soong filegroup globs not found in bp2build's globs file" + fi + +} + +test_soong_after_bp2build_regenerates_build_globs_ninja + function test_bp2build_generates_all_buildfiles { setup create_mock_bazel |