Merge "Refactor some tests to not use bp2build_avail" into main
diff --git a/aconfig/cc_aconfig_library.go b/aconfig/cc_aconfig_library.go
index ec86af7..0583bef 100644
--- a/aconfig/cc_aconfig_library.go
+++ b/aconfig/cc_aconfig_library.go
@@ -16,6 +16,7 @@
import (
"android/soong/android"
+ "android/soong/bazel"
"android/soong/cc"
"github.com/google/blueprint"
@@ -31,6 +32,8 @@
var ccDeclarationsTag = ccDeclarationsTagType{}
+const baseLibDep = "server_configurable_flags"
+
type CcAconfigLibraryProperties struct {
// name of the aconfig_declarations module to generate a library for
Aconfig_declarations string
@@ -72,7 +75,7 @@
}
// Add a dependency for the aconfig flags base library
- deps.SharedLibs = append(deps.SharedLibs, "server_configurable_flags")
+ deps.SharedLibs = append(deps.SharedLibs, baseLibDep)
// TODO: It'd be really nice if we could reexport this library and not make everyone do it.
return deps
@@ -138,3 +141,33 @@
},
})
}
+
+type bazelCcAconfigLibraryAttributes struct {
+ Aconfig_declarations bazel.LabelAttribute
+ Dynamic_deps bazel.LabelListAttribute
+}
+
+// Convert the cc_aconfig_library module to bazel.
+//
+// This method is called from cc.ConvertWithBp2build to actually convert the
+// cc_aconfig_library module. This is necessary since the factory method of this
+// module type returns a cc library and the bp2build conversion is called on the
+// cc library type.
+
+func (this *CcAconfigLibraryCallbacks) GeneratorBp2build(ctx android.Bp2buildMutatorContext) bool {
+ if ctx.ModuleType() != "cc_aconfig_library" {
+ return false
+ }
+
+ attrs := bazelCcAconfigLibraryAttributes{
+ Aconfig_declarations: *bazel.MakeLabelAttribute(android.BazelLabelForModuleDepSingle(ctx, this.properties.Aconfig_declarations).Label),
+ Dynamic_deps: bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, []string{baseLibDep})),
+ }
+ props := bazel.BazelTargetModuleProperties{
+ Rule_class: "cc_aconfig_library",
+ Bzl_load_location: "//build/bazel/rules/cc:cc_aconfig_library.bzl",
+ }
+
+ ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: ctx.ModuleName()}, &attrs)
+ return true
+}
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 5b77ba9..a00ac98 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -340,6 +340,7 @@
"prebuilts/clang/host/linux-x86": Bp2BuildDefaultTrueRecursively,
"prebuilts/gradle-plugin": Bp2BuildDefaultTrueRecursively,
"prebuilts/runtime/mainline/platform/sdk": Bp2BuildDefaultTrueRecursively,
+ "prebuilts/module_sdk": Bp2BuildDefaultTrueRecursively,
"prebuilts/sdk": Bp2BuildDefaultTrue,
"prebuilts/sdk/current/androidx": Bp2BuildDefaultTrue,
"prebuilts/sdk/current/androidx-legacy": Bp2BuildDefaultTrue,
@@ -432,6 +433,7 @@
"tools/apifinder": Bp2BuildDefaultTrue,
"tools/apksig": Bp2BuildDefaultTrue,
+ "tools/dexter/slicer": Bp2BuildDefaultTrueRecursively,
"tools/external_updater": Bp2BuildDefaultTrueRecursively,
"tools/metalava": Bp2BuildDefaultTrueRecursively,
"tools/platform-compat/java/android/compat": Bp2BuildDefaultTrueRecursively,
@@ -852,6 +854,10 @@
"libstagefright_headers",
+ // Apps with JNI libs
+ "SimpleJNI",
+ "libsimplejni",
+
// aidl
"aidl",
"libaidl-common",
@@ -914,14 +920,21 @@
"androidx.test.monitor-nodeps",
"androidx.test.annotation",
"androidx.test.annotation-nodeps",
+
+ // jni deps of an internal android_test (b/297405812)
+ "libdexmakerjvmtiagent",
+ "libopenjdkjvmti_headers",
+ "libstaticjvmtiagent",
}
Bp2buildModuleTypeAlwaysConvertList = []string{
+ // go/keep-sorted start
"aconfig_declarations",
"aconfig_value_set",
"aconfig_values",
"aidl_interface_headers",
"bpf",
+ "cc_aconfig_library",
"cc_prebuilt_library",
"cc_prebuilt_library_headers",
"cc_prebuilt_library_shared",
@@ -934,8 +947,10 @@
"java_sdk_library_import",
"license",
"linker_config",
+ "ndk_library",
"sysprop_library",
"xsd_config",
+ // go/keep-sorted end
}
// Add the names of modules that bp2build should never convert, if it is
@@ -1675,6 +1690,9 @@
"MtsTimeZoneDataTestCases",
"NanoAndroidTest",
"MtsLibnativehelperTestCases",
+
+ // android_test_helper_app from allowlisted packages, but with unconverted deps
+ "SharedLibraryInfoTestApp",
}
// Bazel prod-mode allowlist. Modules in this list are built by Bazel
diff --git a/android/bazel_paths.go b/android/bazel_paths.go
index ac862d4..4ac5840 100644
--- a/android/bazel_paths.go
+++ b/android/bazel_paths.go
@@ -487,6 +487,9 @@
if moduleDir == Bp2BuildTopLevel {
moduleDir = ""
}
+ if a, ok := module.(Module); ok && IsModulePrebuilt(a) {
+ moduleName = RemoveOptionalPrebuiltPrefix(moduleName)
+ }
return fmt.Sprintf("//%s:%s", moduleDir, moduleName)
}
diff --git a/android/config.go b/android/config.go
index 445c6cd..df282ec 100644
--- a/android/config.go
+++ b/android/config.go
@@ -200,7 +200,7 @@
// The aconfig value set passed to aconfig, derived from RELEASE_VERSION
func (c Config) ReleaseAconfigValueSets() string {
// This logic to handle both Soong module name and bazel target is temporary in order to
- // provide backward compatibility where aosp and vendor/google both have the release
+ // provide backward compatibility where aosp and internal both have the release
// aconfig value set but can't be updated at the same time to use bazel target
value := strings.Split(c.config.productVariables.ReleaseAconfigValueSets, ":")
value_len := len(value)
@@ -2073,6 +2073,11 @@
return c.apiLibraries
}
+// Bp2buildMode indicates whether the config is for bp2build mode of Soong
+func (c *config) Bp2buildMode() bool {
+ return c.BuildMode == Bp2build
+}
+
func (c *deviceConfig) CheckVendorSeappViolations() bool {
return Bool(c.config.productVariables.CheckVendorSeappViolations)
}
diff --git a/android/module.go b/android/module.go
index f4b51ea..f48af4a 100644
--- a/android/module.go
+++ b/android/module.go
@@ -3100,11 +3100,21 @@
if !b.isBazelConversionMode() {
panic("cannot call ModuleFromName if not in bazel conversion mode")
}
+ var m blueprint.Module
+ var ok bool
if moduleName, _ := SrcIsModuleWithTag(name); moduleName != "" {
- return b.bp.ModuleFromName(moduleName)
+ m, ok = b.bp.ModuleFromName(moduleName)
} else {
- return b.bp.ModuleFromName(name)
+ m, ok = b.bp.ModuleFromName(name)
}
+ if !ok {
+ return m, ok
+ }
+ // If this module is not preferred, tried to get the prebuilt version instead
+ if a, aOk := m.(Module); aOk && !IsModulePrebuilt(a) && !IsModulePreferred(a) {
+ return b.ModuleFromName("prebuilt_" + name)
+ }
+ return m, ok
}
func (b *baseModuleContext) VisitDirectDepsBlueprint(visit func(blueprint.Module)) {
diff --git a/android/mutator.go b/android/mutator.go
index 0284794..336f8f7 100644
--- a/android/mutator.go
+++ b/android/mutator.go
@@ -56,6 +56,7 @@
// TODO(b/165114590): this is required to resolve deps that are only prebuilts, but we should
// evaluate the impact on conversion.
RegisterPrebuiltsPreArchMutators,
+ RegisterPrebuiltsPostDepsMutators,
},
bp2buildMutators...)
diff --git a/android/prebuilt.go b/android/prebuilt.go
index 95b772d..e7b7979 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -483,20 +483,55 @@
// usePrebuilt returns true if a prebuilt should be used instead of the source module. The prebuilt
// will be used if it is marked "prefer" or if the source module is disabled.
func (p *Prebuilt) usePrebuilt(ctx TopDownMutatorContext, source Module, prebuilt Module) bool {
- if p.srcsSupplier != nil && len(p.srcsSupplier(ctx, prebuilt)) == 0 {
- return false
- }
+ if !ctx.Config().Bp2buildMode() {
+ if p.srcsSupplier != nil && len(p.srcsSupplier(ctx, prebuilt)) == 0 {
+ return false
+ }
- // Skip prebuilt modules under unexported namespaces so that we won't
- // end up shadowing non-prebuilt module when prebuilt module under same
- // name happens to have a `Prefer` property set to true.
- if ctx.Config().KatiEnabled() && !prebuilt.ExportedToMake() {
- return false
+ // Skip prebuilt modules under unexported namespaces so that we won't
+ // end up shadowing non-prebuilt module when prebuilt module under same
+ // name happens to have a `Prefer` property set to true.
+ if ctx.Config().KatiEnabled() && !prebuilt.ExportedToMake() {
+ return false
+ }
}
// If source is not available or is disabled then always use the prebuilt.
if source == nil || !source.Enabled() {
- return true
+ // If in bp2build mode, we need to check product variables & Soong config variables, which may
+ // have overridden the "enabled" property but have not been merged into the property value as
+ // they would in a non-bp2build mode invocation
+ if ctx.Config().Bp2buildMode() && source != nil {
+ productVariableProps, errs := ProductVariableProperties(ctx, source)
+ if productConfigProps, exists := productVariableProps["Enabled"]; len(errs) == 0 && exists && len(productConfigProps) == 1 {
+ var prop ProductConfigOrSoongConfigProperty
+ var value bool
+ for p, v := range productConfigProps {
+ prop = p
+ actual, ok := v.(*bool)
+ if ok {
+ value = proptools.Bool(actual)
+ }
+ }
+ if scv, ok := prop.(SoongConfigProperty); ok {
+ // If the product config var is enabled but the value of enabled is false still, the
+ // prebuilt is preferred. Otherwise, check if the prebulit is explicitly preferred
+ if ctx.Config().VendorConfig(scv.namespace).Bool(strings.ToLower(scv.name)) && !value {
+ return true
+ }
+ } else {
+ // TODO: b/300998219 - handle product vars
+ // We don't handle product variables yet, so return based on the non-product specific
+ // value of enabled
+ return true
+ }
+ } else {
+ // No "enabled" property override, return true since this module isn't enabled
+ return true
+ }
+ } else {
+ return true
+ }
}
// If the use_source_config_var property is set then it overrides the prefer property setting.
diff --git a/bp2build/Android.bp b/bp2build/Android.bp
index 755b7a3..e30e53d 100644
--- a/bp2build/Android.bp
+++ b/bp2build/Android.bp
@@ -44,6 +44,7 @@
"aidl_library_conversion_test.go",
"android_app_certificate_conversion_test.go",
"android_app_conversion_test.go",
+ "android_test_conversion_test.go",
"apex_conversion_test.go",
"apex_key_conversion_test.go",
"build_conversion_test.go",
diff --git a/bp2build/aconfig_conversion_test.go b/bp2build/aconfig_conversion_test.go
index ddb62f7..cbf42ac 100644
--- a/bp2build/aconfig_conversion_test.go
+++ b/bp2build/aconfig_conversion_test.go
@@ -19,10 +19,12 @@
"android/soong/aconfig"
"android/soong/android"
+ "android/soong/cc"
)
func registerAconfigModuleTypes(ctx android.RegistrationContext) {
aconfig.RegisterBuildComponents(ctx)
+ ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
}
func TestAconfigDeclarations(t *testing.T) {
@@ -90,3 +92,46 @@
ExpectedBazelTargets: expectedBazelTargets,
})
}
+
+func TestCcAconfigLibrary(t *testing.T) {
+ bp := `
+ aconfig_declarations {
+ name: "foo_aconfig_declarations",
+ srcs: [
+ "foo1.aconfig",
+ ],
+ package: "com.android.foo",
+ }
+ cc_library {
+ name: "server_configurable_flags",
+ srcs: ["bar.cc"],
+ bazel_module: { bp2build_available: false },
+ }
+ cc_aconfig_library {
+ name: "foo",
+ aconfig_declarations: "foo_aconfig_declarations",
+ }
+ `
+ expectedBazelTargets := []string{
+ MakeBazelTargetNoRestrictions(
+ "aconfig_declarations",
+ "foo_aconfig_declarations",
+ AttrNameToString{
+ "srcs": `["foo1.aconfig"]`,
+ "package": `"com.android.foo"`,
+ },
+ ),
+ MakeBazelTargetNoRestrictions(
+ "cc_aconfig_library",
+ "foo",
+ AttrNameToString{
+ "aconfig_declarations": `":foo_aconfig_declarations"`,
+ "dynamic_deps": `[":server_configurable_flags"]`,
+ "target_compatible_with": `["//build/bazel/platforms/os:android"]`,
+ },
+ )}
+ RunBp2BuildTestCase(t, registerAconfigModuleTypes, Bp2buildTestCase{
+ Blueprint: bp,
+ ExpectedBazelTargets: expectedBazelTargets,
+ })
+}
diff --git a/bp2build/android_app_conversion_test.go b/bp2build/android_app_conversion_test.go
index 0daa4fe..7f04e2a 100644
--- a/bp2build/android_app_conversion_test.go
+++ b/bp2build/android_app_conversion_test.go
@@ -16,6 +16,7 @@
import (
"android/soong/android"
+ "android/soong/cc"
"android/soong/java"
"testing"
@@ -29,6 +30,7 @@
func registerAndroidAppModuleTypes(ctx android.RegistrationContext) {
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
ctx.RegisterModuleType("java_library", java.LibraryFactory)
+ ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
}
func TestMinimalAndroidApp(t *testing.T) {
@@ -78,8 +80,9 @@
"manifest/AndroidManifest.xml": "",
"assets_/asset.png": "",
},
- StubbedBuildDefinitions: []string{"static_lib_dep"},
- Blueprint: simpleModule("android_app", "static_lib_dep") + `
+ StubbedBuildDefinitions: []string{"static_lib_dep", "jni_lib"},
+ Blueprint: simpleModule("android_app", "static_lib_dep") +
+ simpleModule("cc_library_shared", "jni_lib") + `
android_app {
name: "TestApp",
srcs: ["app.java"],
@@ -100,6 +103,7 @@
obfuscate: false,
ignore_warnings: true,
},
+ jni_libs: ["jni_lib"],
}
`,
ExpectedBazelTargets: []string{
@@ -110,10 +114,13 @@
"resa/res.png",
"resb/res.png",
]`,
- "assets": `["assets_/asset.png"]`,
- "assets_dir": `"assets_"`,
- "custom_package": `"com.google"`,
- "deps": `[":static_lib_dep"]`,
+ "assets": `["assets_/asset.png"]`,
+ "assets_dir": `"assets_"`,
+ "custom_package": `"com.google"`,
+ "deps": `[
+ ":static_lib_dep",
+ ":jni_lib",
+ ]`,
"java_version": `"7"`,
"sdk_version": `"current"`,
"certificate_name": `"foocert"`,
diff --git a/bp2build/android_test_conversion_test.go b/bp2build/android_test_conversion_test.go
new file mode 100644
index 0000000..52413fa
--- /dev/null
+++ b/bp2build/android_test_conversion_test.go
@@ -0,0 +1,103 @@
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package bp2build
+
+import (
+ "android/soong/android"
+ "android/soong/java"
+
+ "testing"
+)
+
+func runAndroidTestTestCase(t *testing.T, tc Bp2buildTestCase) {
+ t.Helper()
+ RunBp2BuildTestCase(t, registerAndroidTestModuleTypes, tc)
+}
+
+func registerAndroidTestModuleTypes(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
+ ctx.RegisterModuleType("java_library", java.LibraryFactory)
+}
+
+func TestMinimalAndroidTest(t *testing.T) {
+ runAndroidAppTestCase(t, Bp2buildTestCase{
+ Description: "Android test - simple example",
+ ModuleTypeUnderTest: "android_test",
+ ModuleTypeUnderTestFactory: java.AndroidTestFactory,
+ Filesystem: map[string]string{
+ "app.java": "",
+ "res/res.png": "",
+ "AndroidManifest.xml": "",
+ "assets/asset.png": "",
+ },
+ Blueprint: `
+android_test {
+ name: "TestApp",
+ srcs: ["app.java"],
+ sdk_version: "current",
+ optimize: {
+ shrink: true,
+ optimize: true,
+ obfuscate: true,
+ },
+}
+`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("android_test", "TestApp", AttrNameToString{
+ "srcs": `["app.java"]`,
+ "manifest": `"AndroidManifest.xml"`,
+ "resource_files": `["res/res.png"]`,
+ "sdk_version": `"current"`,
+ "assets": `["assets/asset.png"]`,
+ "assets_dir": `"assets"`,
+ }),
+ }})
+}
+
+func TestMinimalAndroidTestHelperApp(t *testing.T) {
+ runAndroidAppTestCase(t, Bp2buildTestCase{
+ Description: "Android test helper app - simple example",
+ ModuleTypeUnderTest: "android_test_helper_app",
+ ModuleTypeUnderTestFactory: java.AndroidTestHelperAppFactory,
+ Filesystem: map[string]string{
+ "app.java": "",
+ "res/res.png": "",
+ "AndroidManifest.xml": "",
+ "assets/asset.png": "",
+ },
+ Blueprint: `
+android_test_helper_app {
+ name: "TestApp",
+ srcs: ["app.java"],
+ sdk_version: "current",
+ optimize: {
+ shrink: true,
+ optimize: true,
+ obfuscate: true,
+ },
+}
+`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
+ "srcs": `["app.java"]`,
+ "manifest": `"AndroidManifest.xml"`,
+ "resource_files": `["res/res.png"]`,
+ "sdk_version": `"current"`,
+ "assets": `["assets/asset.png"]`,
+ "assets_dir": `"assets"`,
+ "testonly": `True`,
+ }),
+ }})
+}
diff --git a/bp2build/cc_library_headers_conversion_test.go b/bp2build/cc_library_headers_conversion_test.go
index bf3351a..fde4c97 100644
--- a/bp2build/cc_library_headers_conversion_test.go
+++ b/bp2build/cc_library_headers_conversion_test.go
@@ -58,6 +58,7 @@
func registerCcLibraryHeadersModuleTypes(ctx android.RegistrationContext) {
cc.RegisterCCBuildComponents(ctx)
cc.RegisterLibraryHeadersBuildComponents(ctx)
+ ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
}
func runCcLibraryHeadersTestCase(t *testing.T, tc Bp2buildTestCase) {
@@ -417,3 +418,67 @@
},
})
}
+
+func TestPrebuiltCcLibraryHeadersPreferredRdepUpdated(t *testing.T) {
+ runCcLibraryHeadersTestCase(t, Bp2buildTestCase{
+ Description: "cc_library_headers prebuilt preferred is used as rdep",
+ StubbedBuildDefinitions: []string{"foo_export"},
+ Filesystem: map[string]string{
+ "foo/bar/Android.bp": simpleModule("cc_library_headers", "foo_headers"),
+ },
+ Blueprint: soongCcLibraryHeadersPreamble + `
+cc_prebuilt_library_headers {
+ name: "foo_headers",
+ whole_static_libs: ["foo_export"],
+ bazel_module: { bp2build_available: true },
+ prefer: true,
+}
+
+cc_library_shared {
+ name: "foo",
+ header_libs: ["foo_headers"],
+ include_build_directory: false,
+}
+` + simpleModule("cc_library_headers", "foo_export"),
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+ "deps": `[":foo_export"]`,
+ }),
+ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+ "implementation_deps": `[":foo_headers"]`,
+ }),
+ },
+ })
+}
+
+func TestPrebuiltCcLibraryHeadersRdepUpdated(t *testing.T) {
+ runCcLibraryHeadersTestCase(t, Bp2buildTestCase{
+ Description: "cc_library_headers not preferred is not used for rdep",
+ StubbedBuildDefinitions: []string{"foo_export"},
+ Filesystem: map[string]string{
+ "foo/bar/Android.bp": simpleModule("cc_library_headers", "foo_headers"),
+ },
+ Blueprint: soongCcLibraryHeadersPreamble + `
+cc_prebuilt_library_headers {
+ name: "foo_headers",
+ whole_static_libs: ["foo_export"],
+ bazel_module: { bp2build_available: true },
+ prefer: false,
+}
+
+cc_library_shared {
+ name: "foo",
+ header_libs: ["foo_headers"],
+ include_build_directory: false,
+}
+` + simpleModule("cc_library_headers", "foo_export"),
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+ "deps": `[":foo_export"]`,
+ }),
+ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+ "implementation_deps": `["//foo/bar:foo_headers"]`,
+ }),
+ },
+ })
+}
diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go
index 5153224..bdde996 100644
--- a/bp2build/cc_library_shared_conversion_test.go
+++ b/bp2build/cc_library_shared_conversion_test.go
@@ -1635,7 +1635,7 @@
],
"//build/bazel/rules/apex:unbundled_app": [
":libHasApexStubs",
- "//.:libHasApexAndNdkStubs.ndk_stub_libs",
+ "//.:libHasApexAndNdkStubs.ndk_stub_libs-current",
],
"//conditions:default": [
":libHasApexStubs",
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 6a49915..569f721 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -1657,9 +1657,11 @@
if depC, ok := dep.(*Module); ok && hasNdkStubs(ctx, depC) {
// If the dependency has ndk stubs, build against the ndk stubs
// https://cs.android.com/android/_/android/platform/build/soong/+/main:cc/cc.go;l=2642-2643;drc=e12d252e22dd8afa654325790d3298a0d67bd9d6;bpv=1;bpt=0
+ ver := proptools.String(c.Properties.Sdk_version)
+ // TODO - b/298085502: Add bp2build support for sdk_version: "minimum"
ndkLibModule, _ := ctx.ModuleFromName(dep.Name() + ndkLibrarySuffix)
label = bazel.Label{
- Label: "//" + ctx.OtherModuleDir(ndkLibModule) + ":" + ndkLibModule.Name() + "_stub_libs",
+ Label: "//" + ctx.OtherModuleDir(ndkLibModule) + ":" + ndkLibModule.Name() + "_stub_libs-" + ver,
}
}
// add the ndk lib label to this axis
diff --git a/cc/cc.go b/cc/cc.go
index 9aa0cac..81a6cd6 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -589,6 +589,7 @@
GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
GeneratorSources(ctx ModuleContext) GeneratedSource
GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
+ GeneratorBp2build(ctx android.Bp2buildMutatorContext) bool
}
// compiler is the interface for a compiler helper object. Different module decorators may implement
@@ -4215,6 +4216,16 @@
// ConvertWithBp2build converts Module to Bazel for bp2build.
func (c *Module) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
+ if len(c.generators) > 0 {
+ allConverted := true
+ for _, generator := range c.generators {
+ allConverted = allConverted && generator.GeneratorBp2build(ctx)
+ }
+ if allConverted {
+ return
+ }
+ }
+
prebuilt := c.IsPrebuilt()
switch c.typ() {
case binary:
diff --git a/cc/generated_cc_library.go b/cc/generated_cc_library.go
index 55e19f9..8428e94 100644
--- a/cc/generated_cc_library.go
+++ b/cc/generated_cc_library.go
@@ -28,9 +28,8 @@
staticAndSharedLibrarySdkMemberType,
}
- // TODO: Need to be bazelable
- // module.bazelable = true
- // module.bazelHandler = &ccLibraryBazelHandler{module: module}
+ module.bazelable = true
+ module.bazelHandler = &ccLibraryBazelHandler{module: module}
module.generators = append(module.generators, callbacks)
diff --git a/java/app.go b/java/app.go
index 2edd3f7..3ab814a 100755
--- a/java/app.go
+++ b/java/app.go
@@ -31,6 +31,7 @@
"android/soong/dexpreopt"
"android/soong/genrule"
"android/soong/tradefed"
+ "android/soong/ui/metrics/bp2build_metrics_proto"
)
func init() {
@@ -1257,6 +1258,8 @@
AndroidApp
appTestHelperAppProperties appTestHelperAppProperties
+
+ android.BazelModuleBase
}
func (a *AndroidTestHelperApp) InstallInTestcases() bool {
@@ -1288,6 +1291,7 @@
android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
android.InitDefaultableModule(module)
android.InitApexModule(module)
+ android.InitBazelModule(module)
return module
}
@@ -1639,6 +1643,21 @@
if !supported {
return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{}
}
+ if a.appProperties.Jni_uses_platform_apis != nil {
+ ctx.MarkBp2buildUnconvertible(
+ bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED,
+ "TODO - b/299360988: Add bp2build support for jni_uses_platform_apis",
+ )
+ return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{}
+ }
+ if a.appProperties.Jni_uses_sdk_apis != nil {
+ ctx.MarkBp2buildUnconvertible(
+ bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED,
+ "TODO - b/299360988: Add bp2build support for jni_uses_sdk_apis",
+ )
+ return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{}
+ }
+
certificate, certificateName := android.BazelStringOrLabelFromProp(ctx, a.overridableAppProperties.Certificate)
manifestValues := &manifestValueAttribute{}
@@ -1716,6 +1735,20 @@
deps := depLabels.Deps
deps.Append(depLabels.StaticDeps)
+ var jniDeps bazel.LabelListAttribute
+ archVariantProps := a.GetArchVariantProperties(ctx, &appProperties{})
+ for axis, configToProps := range archVariantProps {
+ for config, _props := range configToProps {
+ if archProps, ok := _props.(*appProperties); ok {
+ archJniLibs := android.BazelLabelForModuleDeps(
+ ctx,
+ android.LastUniqueStrings(android.CopyOf(archProps.Jni_libs)))
+ jniDeps.SetSelectValue(axis, config, archJniLibs)
+ }
+ }
+ }
+ deps.Append(jniDeps)
+
if !bp2BuildInfo.hasKotlin {
appAttrs.javaCommonAttributes = commonAttrs
appAttrs.bazelAapt = aapt
@@ -1769,3 +1802,27 @@
}
}
+
+func (atha *AndroidTestHelperApp) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
+ if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, &atha.AndroidApp); ok {
+ // an android_test_helper_app is an android_binary with testonly = True
+ commonAttrs.Testonly = proptools.BoolPtr(true)
+
+ // additionally, it sets default values differently to android_app,
+ // https://cs.android.com/android/platform/superproject/main/+/main:build/soong/java/app.go;l=1273-1279;drc=e12c083198403ec694af6c625aed11327eb2bf7f
+ //
+ // installable: true (settable prop)
+ // use_embedded_native_libs: true (settable prop)
+ // lint.test: true (settable prop)
+ // optimize EnabledByDefault: true (blueprint mutated prop)
+ // AlwaysPackageNativeLibs: true (blueprint mutated prop)
+ // dexpreopt isTest: true (not prop)
+
+ props := bazel.BazelTargetModuleProperties{
+ Rule_class: "android_binary",
+ Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl",
+ }
+
+ ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs)
+ }
+}