diff --git a/android/bazel_handler.go b/android/bazel_handler.go index 43e0013e3..28bcaced5 100644 --- a/android/bazel_handler.go +++ b/android/bazel_handler.go @@ -689,20 +689,26 @@ func (r *builtinBazelRunner) issueBazelCommand(cmdRequest bazel.CmdRequest, path func (context *mixedBuildBazelContext) createBazelCommand(config Config, runName bazel.RunName, command bazelCommand, extraFlags ...string) bazel.CmdRequest { - if runtime.GOOS != "linux" && runtime.GOOS != "darwin" { - panic("Unknown GOOS: " + runtime.GOOS) - } cmdFlags := []string{ "--output_base=" + absolutePath(context.paths.outputBase), command.command, command.expression, "--profile=" + shared.BazelMetricsFilename(context.paths, runName), - "--host_platform=@soong_injection//product_config_platforms:mixed_builds_product-" + context.targetBuildVariant + "_" + runtime.GOOS + "_x86_64", - // This --platforms flag largely doesn't matter, because the config_nodes will - // transition into the right configuration. This is just to make sure we use the - // mixed_builds_product everywhere. - "--platforms=@soong_injection//product_config_platforms:mixed_builds_product-" + context.targetBuildVariant, + // We don't need to set --host_platforms because it's set in bazelrc files + // that the bazel shell script wrapper passes + + // Optimize Ninja rebuilds by ensuring Bazel write into product-agnostic + // output paths for the configured targets that shouldn't be affected by + // TARGET_PRODUCT. Otherwise product agnostic modules will be rebuilt by + // Ninja when the product changes, unconditionally. + // + // For example, Mainline APEXes should be identical regardless of the + // product (modulo arch/cpu). + // + // This flag forcibly disables the platform prefix in the intermediate + // outputs during a mixed build. + "--noexperimental_platform_in_output_dir", // Suppress noise "--ui_event_filters=-INFO", @@ -749,9 +755,9 @@ func (context *mixedBuildBazelContext) mainBzlFileContents() []byte { ##################################################### def _config_node_transition_impl(settings, attr): if attr.os == "android" and attr.arch == "target": - target = "mixed_builds_product-{VARIANT}" + target = "current_product-{VARIANT}" else: - target = "mixed_builds_product-{VARIANT}_%s_%s" % (attr.os, attr.arch) + target = "current_product-{VARIANT}_%s_%s" % (attr.os, attr.arch) apex_name = "" if attr.within_apex: # //build/bazel/rules/apex:apex_name has to be set to a non_empty value, @@ -988,9 +994,9 @@ def get_arch(target): platform_name = platforms[0].name if platform_name == "host": return "HOST" - if not platform_name.startswith("mixed_builds_product-{TARGET_BUILD_VARIANT}"): - fail("expected platform name of the form 'mixed_builds_product-{TARGET_BUILD_VARIANT}_android_' or 'mixed_builds_product-{TARGET_BUILD_VARIANT}_linux_', but was " + str(platforms)) - platform_name = platform_name.removeprefix("mixed_builds_product-{TARGET_BUILD_VARIANT}").removeprefix("_") + if not platform_name.startswith("current_product-{TARGET_BUILD_VARIANT}"): + fail("expected platform name of the form 'current_product-{TARGET_BUILD_VARIANT}_android_' or 'current_product-{TARGET_BUILD_VARIANT}_linux_', but was " + str(platforms)) + platform_name = platform_name.removeprefix("current_product-{TARGET_BUILD_VARIANT}").removeprefix("_") config_key = "" if not platform_name: config_key = "target|android" @@ -999,7 +1005,7 @@ def get_arch(target): elif platform_name.startswith("linux_"): config_key = platform_name.removeprefix("linux_") + "|linux" else: - fail("expected platform name of the form 'mixed_builds_product-{TARGET_BUILD_VARIANT}_android_' or 'mixed_builds_product-{TARGET_BUILD_VARIANT}_linux_', but was " + str(platforms)) + fail("expected platform name of the form 'current_product-{TARGET_BUILD_VARIANT}_android_' or 'current_product-{TARGET_BUILD_VARIANT}_linux_', but was " + str(platforms)) within_apex = buildoptions.get("//build/bazel/rules/apex:within_apex") apex_sdk_version = buildoptions.get("//build/bazel/rules/apex:min_sdk_version") diff --git a/bp2build/bp2build_product_config.go b/bp2build/bp2build_product_config.go index 72244961d..66d0cc554 100644 --- a/bp2build/bp2build_product_config.go +++ b/bp2build/bp2build_product_config.go @@ -72,13 +72,8 @@ package(default_visibility = [ load("//{PRODUCT_FOLDER}:soong.variables.bzl", _soong_variables = "variables") load("@//build/bazel/product_config:android_product.bzl", "android_product") -# Bazel will qualify its outputs by the platform name. When switching between products, this -# means that soong-built files that depend on bazel-built files will suddenly get different -# dependency files, because the path changes, and they will be rebuilt. In order to avoid this -# extra rebuilding, make mixed builds always use a single platform so that the bazel artifacts -# are always under the same path. android_product( - name = "mixed_builds_product-{VARIANT}", + name = "current_product-{VARIANT}", soong_variables = _soong_variables, ) `)), @@ -91,7 +86,7 @@ android_product( # TODO: When we start generating the platforms for more than just the # currently lunched product, they should all be listed here product_labels = [ - "@soong_injection//product_config_platforms:mixed_builds_product-{VARIANT}", + "@soong_injection//product_config_platforms:current_product-{VARIANT}", "@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}" ] `)), @@ -99,25 +94,38 @@ product_labels = [ "product_config_platforms", "common.bazelrc", productReplacer.Replace(` -build --platforms @soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_x86_64 +# current_product refers to the current TARGET_PRODUCT set, usually through +# 'lunch' or 'banchan'. Every build will have a primary TARGET_PRODUCT, but +# bazel supports using other products in tests or configuration transitions. The +# other products can be found in +# @soong_injection//product_config_platforms/products/... +build --platforms @soong_injection//product_config_platforms:current_product-{VARIANT}_linux_x86_64 -build:android --platforms=@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT} -build:linux_x86_64 --platforms=@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_x86_64 -build:linux_bionic_x86_64 --platforms=@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_bionic_x86_64 -build:linux_musl_x86 --platforms=@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_musl_x86 -build:linux_musl_x86_64 --platforms=@soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_musl_x86_64 +build:android --platforms=@soong_injection//product_config_platforms:current_product-{VARIANT} +build:linux_x86_64 --platforms=@soong_injection//product_config_platforms:current_product-{VARIANT}_linux_x86_64 +build:linux_bionic_x86_64 --platforms=@soong_injection//product_config_platforms:current_product-{VARIANT}_linux_bionic_x86_64 +build:linux_musl_x86 --platforms=@soong_injection//product_config_platforms:current_product-{VARIANT}_linux_musl_x86 +build:linux_musl_x86_64 --platforms=@soong_injection//product_config_platforms:current_product-{VARIANT}_linux_musl_x86_64 `)), newFile( "product_config_platforms", "linux.bazelrc", productReplacer.Replace(` -build --host_platform @soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_linux_x86_64 +build --host_platform @soong_injection//product_config_platforms:current_product-{VARIANT}_linux_x86_64 `)), newFile( "product_config_platforms", "darwin.bazelrc", productReplacer.Replace(` -build --host_platform @soong_injection//{PRODUCT_FOLDER}:{PRODUCT}-{VARIANT}_darwin_x86_64 +build --host_platform product_config_platforms:current_product-{VARIANT}_darwin_x86_64 +`)), + newFile( + "product_config_platforms", + "platform_mappings", + productReplacer.Replace(` +flags: + --cpu=k8 + @soong_injection//product_config_platforms:current_product-{VARIANT} `)), } diff --git a/tests/bp2build_bazel_test.sh b/tests/bp2build_bazel_test.sh index 7878be65f..71e6af009 100755 --- a/tests/bp2build_bazel_test.sh +++ b/tests/bp2build_bazel_test.sh @@ -382,39 +382,4 @@ EOF run_bazel build --config=android --config=api_bp2build //foo:libfoo.contribution } -function test_bazel_standalone_output_paths_contain_product_name { - setup - mkdir -p a - cat > a/Android.bp < a/qq.cc < a/qq.h <