Merge "Resolve metrics_proto warning"
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index af4d32b..938c41e 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -220,6 +220,7 @@
"hardware/interfaces": Bp2BuildDefaultTrue,
"hardware/interfaces/audio/aidl": Bp2BuildDefaultTrue,
"hardware/interfaces/audio/aidl/common": Bp2BuildDefaultTrue,
+ "hardware/interfaces/bufferpool/aidl": Bp2BuildDefaultTrue,
"hardware/interfaces/common/aidl": Bp2BuildDefaultTrue,
"hardware/interfaces/common/fmq/aidl": Bp2BuildDefaultTrue,
"hardware/interfaces/configstore/1.0": Bp2BuildDefaultTrue,
@@ -399,7 +400,7 @@
"prebuilts/clang-tools":/* recursive = */ true,
"prebuilts/gcc":/* recursive = */ true,
"prebuilts/build-tools":/* recursive = */ true,
- "prebuilts/jdk/jdk11":/* recursive = */ false,
+ "prebuilts/jdk/jdk17":/* recursive = */ true,
"prebuilts/misc":/* recursive = */ false, // not recursive because we need bp2build converted build files in prebuilts/misc/common/asm
"prebuilts/sdk":/* recursive = */ false,
"prebuilts/sdk/tools":/* recursive = */ false,
@@ -705,6 +706,10 @@
"kotlinx_coroutines",
"annotations",
"kotlinx-coroutines-android-annotation-stubs",
+
+ // for building com.android.neuralnetworks
+ "libimapper_stablec",
+ "libimapper_providerutils",
}
Bp2buildModuleTypeAlwaysConvertList = []string{
diff --git a/android/androidmk.go b/android/androidmk.go
index aa411d1..a7b69f6 100644
--- a/android/androidmk.go
+++ b/android/androidmk.go
@@ -560,6 +560,8 @@
a.SetPaths("LOCAL_SOONG_INSTALL_SYMLINKS", base.katiSymlinks.InstallPaths().Paths())
}
+ a.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", base.commonProperties.SkipInstall)
+
if am, ok := mod.(ApexModule); ok {
a.SetBoolIfTrue("LOCAL_NOT_AVAILABLE_FOR_PLATFORM", am.NotAvailableForPlatform())
}
diff --git a/android/apex.go b/android/apex.go
index 358818f..a0ac5b8 100644
--- a/android/apex.go
+++ b/android/apex.go
@@ -603,7 +603,7 @@
// Do not install the module for platform, but still allow it to output
// uninstallable AndroidMk entries in certain cases when they have side
// effects. TODO(jiyong): move this routine to somewhere else
- mod.MakeUninstallable()
+ mod.SkipInstall()
}
if !platformVariation {
mctx.SetVariationProvider(mod, ApexInfoProvider, apexInfos[i-1])
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index e7b84e3..66832d5 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -1022,7 +1022,15 @@
fail("unsupported value '%s' of type '%s'" % (p, type(p)))
def encode_list(list):
- return "[%s]" % ", ".join([encode_primitive(item) for item in list])
+ items = []
+ for item in list:
+ if type(item) == "dict":
+ # support encoding dict of primitive keys and values. not list currently, because calling encode_list again is recursive.
+ kv_pairs = [("%s: %s" % (encode_primitive(k), encode_primitive(v))) for (k, v) in item.items()]
+ items.append("{ %s }" % ", ".join(kv_pairs))
+ else:
+ items.append(encode_primitive(item))
+ return "[%s]" % ", ".join(items)
def encode_list_or_primitive(v):
return encode_list(v) if type(v) == "list" else encode_primitive(v)
diff --git a/android/module.go b/android/module.go
index 773d77b..b45ed95 100644
--- a/android/module.go
+++ b/android/module.go
@@ -505,8 +505,8 @@
PartitionTag(DeviceConfig) string
HideFromMake()
IsHideFromMake() bool
+ SkipInstall()
IsSkipInstall() bool
- MakeUninstallable()
ReplacedByPrebuilt()
IsReplacedByPrebuilt() bool
ExportedToMake() bool
@@ -1964,15 +1964,6 @@
return m.commonProperties.SkipInstall
}
-// Similar to HideFromMake, but if the AndroidMk entry would set
-// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry
-// rather than leaving it out altogether. That happens in cases where it would
-// have other side effects, in particular when it adds a NOTICE file target,
-// which other install targets might depend on.
-func (m *ModuleBase) MakeUninstallable() {
- m.HideFromMake()
-}
-
func (m *ModuleBase) ReplacedByPrebuilt() {
m.commonProperties.ReplacedByPrebuilt = true
m.HideFromMake()
diff --git a/android/packaging_test.go b/android/packaging_test.go
index 91ac1f3..f32d1c3 100644
--- a/android/packaging_test.go
+++ b/android/packaging_test.go
@@ -15,6 +15,7 @@
package android
import (
+ "strings"
"testing"
"github.com/google/blueprint"
@@ -28,6 +29,8 @@
Deps []string
Skip_install *bool
}
+
+ builtFile Path
}
// dep tag used in this test. All dependencies are considered as installable.
@@ -48,13 +51,21 @@
}
func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) {
- builtFile := PathForModuleOut(ctx, m.Name())
+ m.builtFile = PathForModuleOut(ctx, m.Name())
dir := ctx.Target().Arch.ArchType.Multilib
installDir := PathForModuleInstall(ctx, dir)
if proptools.Bool(m.props.Skip_install) {
m.SkipInstall()
}
- ctx.InstallFile(installDir, m.Name(), builtFile)
+ ctx.InstallFile(installDir, m.Name(), m.builtFile)
+}
+
+func (m *componentTestModule) AndroidMkEntries() []AndroidMkEntries {
+ return []AndroidMkEntries{
+ {
+ OutputFile: OptionalPathForPath(m.builtFile),
+ },
+ }
}
// Module that itself is a package
@@ -251,6 +262,35 @@
`, []string{"lib32/foo", "lib64/foo", "lib64/bar"})
}
+func TestSkipInstallProducesLocalUninstallableModule(t *testing.T) {
+ result := GroupFixturePreparers(
+ PrepareForTestWithArchMutator,
+ FixtureRegisterWithContext(func(ctx RegistrationContext) {
+ ctx.RegisterModuleType("component", componentTestModuleFactory)
+ ctx.RegisterModuleType("package_module", packageTestModuleFactory)
+ }),
+ FixtureWithRootAndroidBp(`
+component {
+ name: "foo",
+ skip_install: true,
+}
+
+package_module {
+ name: "package",
+ deps: ["foo"],
+}
+`),
+ ).RunTest(t)
+ module := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*componentTestModule)
+ entries := AndroidMkEntriesForTest(t, result.TestContext, module)
+ builder := &strings.Builder{}
+ entries[0].write(builder)
+ androidMkString := builder.String()
+ if !strings.Contains(androidMkString, "LOCAL_UNINSTALLABLE_MODULE := true") {
+ t.Errorf("Expected android mk entries to contain \"LOCAL_UNINSTALLABLE_MODULE := true\", got: \n%s", androidMkString)
+ }
+}
+
func TestPackagingBaseSingleTarget(t *testing.T) {
multiTarget := false
runPackagingTest(t, multiTarget,
diff --git a/apex/androidmk.go b/apex/androidmk.go
index 7f03621..684833d 100644
--- a/apex/androidmk.go
+++ b/apex/androidmk.go
@@ -63,15 +63,17 @@
}
// Return the full module name for a dependency module, which appends the apex module name unless re-using a system lib.
-func (a *apexBundle) fullModuleName(apexBundleName string, fi *apexFile) string {
- linkToSystemLib := a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform()
-
+func (a *apexBundle) fullModuleName(apexBundleName string, linkToSystemLib bool, fi *apexFile) string {
if linkToSystemLib {
return fi.androidMkModuleName
}
return fi.androidMkModuleName + "." + apexBundleName + a.suffix
}
+// androidMkForFiles generates Make definitions for the contents of an
+// apexBundle (apexBundle#filesInfo). The filesInfo structure can either be
+// populated by Soong for unconverted APEXes, or Bazel in mixed mode. Use
+// apexFile#isBazelPrebuilt to differentiate.
func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir string,
apexAndroidMkData android.AndroidMkData) []string {
@@ -95,8 +97,7 @@
for _, fi := range a.filesInfo {
linkToSystemLib := a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform()
-
- moduleName := a.fullModuleName(apexBundleName, &fi)
+ moduleName := a.fullModuleName(apexBundleName, linkToSystemLib, &fi)
// This name will be added to LOCAL_REQUIRED_MODULES of the APEX. We need to be
// arch-specific otherwise we will end up installing both ABIs even when only
@@ -124,6 +125,7 @@
fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
}
fmt.Fprintln(w, "LOCAL_MODULE :=", moduleName)
+
if fi.module != nil && fi.module.Owner() != "" {
fmt.Fprintln(w, "LOCAL_MODULE_OWNER :=", fi.module.Owner())
}
@@ -161,6 +163,7 @@
fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String())
fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.nameInMake())
if fi.module != nil {
+ // This apexFile's module comes from Soong
archStr := fi.module.Target().Arch.ArchType.String()
host := false
switch fi.module.Target().Os.Class {
@@ -188,6 +191,9 @@
fmt.Fprintln(w, "LOCAL_MODULE_HOST_OS :=", makeOs)
fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
}
+ } else if fi.isBazelPrebuilt && fi.arch != "" {
+ // This apexFile comes from Bazel
+ fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH :=", fi.arch)
}
if fi.jacocoReportClassesFile != nil {
fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", fi.jacocoReportClassesFile.String())
@@ -231,17 +237,21 @@
fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_android_app_set.mk")
case nativeSharedLib, nativeExecutable, nativeTest:
fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", fi.stem())
- if ccMod, ok := fi.module.(*cc.Module); ok {
- if ccMod.UnstrippedOutputFile() != nil {
- fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", ccMod.UnstrippedOutputFile().String())
- }
- ccMod.AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
- if ccMod.CoverageOutputFile().Valid() {
- fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", ccMod.CoverageOutputFile().String())
- }
- } else if rustMod, ok := fi.module.(*rust.Module); ok {
- if rustMod.UnstrippedOutputFile() != nil {
- fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", rustMod.UnstrippedOutputFile().String())
+ if fi.isBazelPrebuilt {
+ fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", fi.unstrippedBuiltFile)
+ } else {
+ if ccMod, ok := fi.module.(*cc.Module); ok {
+ if ccMod.UnstrippedOutputFile() != nil {
+ fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", ccMod.UnstrippedOutputFile().String())
+ }
+ ccMod.AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
+ if ccMod.CoverageOutputFile().Valid() {
+ fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", ccMod.CoverageOutputFile().String())
+ }
+ } else if rustMod, ok := fi.module.(*rust.Module); ok {
+ if rustMod.UnstrippedOutputFile() != nil {
+ fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", rustMod.UnstrippedOutputFile().String())
+ }
}
}
fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk")
diff --git a/apex/apex.go b/apex/apex.go
index f506876..b2ca6c4 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -509,6 +509,21 @@
shBinary
)
+var (
+ classes = map[string]apexFileClass{
+ "app": app,
+ "appSet": appSet,
+ "etc": etc,
+ "goBinary": goBinary,
+ "javaSharedLib": javaSharedLib,
+ "nativeExecutable": nativeExecutable,
+ "nativeSharedLib": nativeSharedLib,
+ "nativeTest": nativeTest,
+ "pyBinary": pyBinary,
+ "shBinary": shBinary,
+ }
+)
+
// apexFile represents a file in an APEX bundle. This is created during the first half of
// GenerateAndroidBuildActions by traversing the dependencies of the APEX. Then in the second half
// of the function, this is used to create commands that copies the files into a staging directory,
@@ -543,6 +558,10 @@
multilib string
+ isBazelPrebuilt bool
+ unstrippedBuiltFile android.Path
+ arch string
+
// TODO(jiyong): remove this
module android.Module
}
@@ -1710,6 +1729,7 @@
// NB: Since go binaries are static we don't need the module for anything here, which is
// good since the go tool is a blueprint.Module not an android.Module like we would
// normally use.
+ //
return newApexFile(ctx, fileToCopy, depName, dirInApex, goBinary, nil)
}
@@ -2003,13 +2023,41 @@
panic(fmt.Errorf("internal error: unexpected apex_type for the ProcessBazelQueryResponse: %v", a.properties.ApexType))
}
- // filesInfo is not set in mixed mode, because all information about the
- // apex's contents should completely come from the Starlark providers.
+ // filesInfo in mixed mode must retrieve all information about the apex's
+ // contents completely from the Starlark providers. It should never rely on
+ // Android.bp information, as they might not exist for fully migrated
+ // dependencies.
//
// Prevent accidental writes to filesInfo in the earlier parts Soong by
// asserting it to be nil.
if a.filesInfo != nil {
- panic(fmt.Errorf("internal error: filesInfo must be nil for an apex handled by Bazel."))
+ panic(
+ fmt.Errorf("internal error: filesInfo must be nil for an apex handled by Bazel. " +
+ "Did something else set filesInfo before this line of code?"))
+ }
+ for _, f := range outputs.PayloadFilesInfo {
+ fileInfo := apexFile{
+ isBazelPrebuilt: true,
+
+ builtFile: android.PathForBazelOut(ctx, f["built_file"]),
+ unstrippedBuiltFile: android.PathForBazelOut(ctx, f["unstripped_built_file"]),
+ androidMkModuleName: f["make_module_name"],
+ installDir: f["install_dir"],
+ class: classes[f["class"]],
+ customStem: f["basename"],
+ moduleDir: f["package"],
+ }
+
+ arch := f["arch"]
+ fileInfo.arch = arch
+ if len(arch) > 0 {
+ fileInfo.multilib = "lib32"
+ if strings.HasSuffix(arch, "64") {
+ fileInfo.multilib = "lib64"
+ }
+ }
+
+ a.filesInfo = append(a.filesInfo, fileInfo)
}
}
diff --git a/apex/bp2build_test.go b/apex/bp2build_test.go
index 2f2b61e..2a0f6e9 100644
--- a/apex/bp2build_test.go
+++ b/apex/bp2build_test.go
@@ -25,6 +25,7 @@
apex_key{
name: "foo_key",
}
+
apex {
name: "foo",
key: "foo_key",
@@ -59,6 +60,16 @@
ProvidesLibs: []string{"a", "b"},
// ApexMkInfo Starlark provider
+ PayloadFilesInfo: []map[string]string{
+ {
+ "built_file": "bazel-out/adbd",
+ "install_dir": "bin",
+ "class": "nativeExecutable",
+ "make_module_name": "adbd",
+ "basename": "adbd",
+ "package": "foo",
+ },
+ },
MakeModulesToInstall: []string{"c"}, // d deliberately omitted
},
},
@@ -68,10 +79,12 @@
m := result.ModuleForTests("foo", "android_common_foo_image").Module()
ab, ok := m.(*apexBundle)
+
if !ok {
t.Fatalf("Expected module to be an apexBundle, was not")
}
+ // TODO: refactor to android.AssertStringEquals
if w, g := "out/bazel/execroot/__main__/public_key", ab.publicKeyFile.String(); w != g {
t.Errorf("Expected public key %q, got %q", w, g)
}
@@ -120,11 +133,136 @@
if len(ab.makeModulesToInstall) != 1 && ab.makeModulesToInstall[0] != "c" {
t.Errorf("Expected makeModulesToInstall slice to only contain 'c', got %q", ab.makeModulesToInstall)
}
- if w := "LOCAL_REQUIRED_MODULES := c"; !strings.Contains(data, w) {
+ if w := "LOCAL_REQUIRED_MODULES := adbd.foo c"; !strings.Contains(data, w) {
t.Errorf("Expected %q in androidmk data, but did not find it in %q", w, data)
}
}
+func TestApexImageCreatesFilesInfoForMake(t *testing.T) {
+ bp := `
+apex_key{
+ name: "foo_key",
+}
+
+apex {
+ name: "foo",
+ key: "foo_key",
+ updatable: true,
+ min_sdk_version: "31",
+ file_contexts: ":myapex-file_contexts",
+ bazel_module: { label: "//:foo" },
+}`
+
+ outputBaseDir := "out/bazel"
+ result := android.GroupFixturePreparers(
+ prepareForApexTest,
+ android.FixtureModifyConfig(func(config android.Config) {
+ config.BazelContext = android.MockBazelContext{
+ OutputBaseDir: outputBaseDir,
+ LabelToApexInfo: map[string]cquery.ApexInfo{
+ "//:foo": {
+ // ApexInfo Starlark provider. Necessary for the test.
+ SignedOutput: "signed_out.apex",
+ BundleKeyInfo: []string{"public_key", "private_key"},
+ ContainerKeyInfo: []string{"container_cert", "container_private"},
+
+ // ApexMkInfo Starlark provider
+ PayloadFilesInfo: []map[string]string{
+ {
+ "arch": "arm64",
+ "basename": "libcrypto.so",
+ "built_file": "bazel-out/64/libcrypto.so",
+ "class": "nativeSharedLib",
+ "install_dir": "lib64",
+ "make_module_name": "libcrypto",
+ "package": "foo/bar",
+ "unstripped_built_file": "bazel-out/64/unstripped_libcrypto.so",
+ },
+ {
+ "arch": "arm",
+ "basename": "libcrypto.so",
+ "built_file": "bazel-out/32/libcrypto.so",
+ "class": "nativeSharedLib",
+ "install_dir": "lib",
+ "make_module_name": "libcrypto",
+ "package": "foo/bar",
+ },
+ {
+ "arch": "arm64",
+ "basename": "adbd",
+ "built_file": "bazel-out/adbd",
+ "class": "nativeExecutable",
+ "install_dir": "bin",
+ "make_module_name": "adbd",
+ "package": "foo",
+ },
+ },
+ },
+ },
+ }
+ }),
+ ).RunTestWithBp(t, bp)
+
+ m := result.ModuleForTests("foo", "android_common_foo_image").Module()
+ ab, ok := m.(*apexBundle)
+
+ if !ok {
+ t.Fatalf("Expected module to be an apexBundle, was not")
+ }
+
+ expectedFilesInfo := []apexFile{
+ {
+ androidMkModuleName: "libcrypto",
+ builtFile: android.PathForTesting("out/bazel/execroot/__main__/bazel-out/64/libcrypto.so"),
+ class: nativeSharedLib,
+ customStem: "libcrypto.so",
+ installDir: "lib64",
+ moduleDir: "foo/bar",
+ arch: "arm64",
+ unstrippedBuiltFile: android.PathForTesting("out/bazel/execroot/__main__/bazel-out/64/unstripped_libcrypto.so"),
+ },
+ {
+ androidMkModuleName: "libcrypto",
+ builtFile: android.PathForTesting("out/bazel/execroot/__main__/bazel-out/32/libcrypto.so"),
+ class: nativeSharedLib,
+ customStem: "libcrypto.so",
+ installDir: "lib",
+ moduleDir: "foo/bar",
+ arch: "arm",
+ },
+ {
+ androidMkModuleName: "adbd",
+ builtFile: android.PathForTesting("out/bazel/execroot/__main__/bazel-out/adbd"),
+ class: nativeExecutable,
+ customStem: "adbd",
+ installDir: "bin",
+ moduleDir: "foo",
+ arch: "arm64",
+ },
+ }
+
+ if len(ab.filesInfo) != len(expectedFilesInfo) {
+ t.Errorf("Expected %d entries in ab.filesInfo, but got %d", len(ab.filesInfo), len(expectedFilesInfo))
+ }
+
+ for idx, f := range ab.filesInfo {
+ expected := expectedFilesInfo[idx]
+ android.AssertSame(t, "different class", expected.class, f.class)
+ android.AssertStringEquals(t, "different built file", expected.builtFile.String(), f.builtFile.String())
+ android.AssertStringEquals(t, "different custom stem", expected.customStem, f.customStem)
+ android.AssertStringEquals(t, "different install dir", expected.installDir, f.installDir)
+ android.AssertStringEquals(t, "different make module name", expected.androidMkModuleName, f.androidMkModuleName)
+ android.AssertStringEquals(t, "different moduleDir", expected.moduleDir, f.moduleDir)
+ android.AssertStringEquals(t, "different arch", expected.arch, f.arch)
+ if expected.unstrippedBuiltFile != nil {
+ if f.unstrippedBuiltFile == nil {
+ t.Errorf("expected an unstripped built file path.")
+ }
+ android.AssertStringEquals(t, "different unstripped built file", expected.unstrippedBuiltFile.String(), f.unstrippedBuiltFile.String())
+ }
+ }
+}
+
func TestCompressedApexImageInMixedBuilds(t *testing.T) {
bp := `
apex_key{
diff --git a/apex/vndk.go b/apex/vndk.go
index c0be753..095e89d 100644
--- a/apex/vndk.go
+++ b/apex/vndk.go
@@ -72,12 +72,14 @@
}
targets := mctx.MultiTargets()
- if len(targets) > 0 && apiLevel.LessThan(cc.MinApiForArch(mctx, targets[0].Arch.ArchType)) {
- // Disable VNDK apexes for VNDK versions less than the minimum supported API level for the primary
- // architecture.
+ if len(targets) > 0 && apiLevel.LessThan(cc.MinApiForArch(mctx, targets[0].Arch.ArchType)) &&
+ vndkVersion != mctx.DeviceConfig().PlatformVndkVersion() {
+ // Disable VNDK APEXes for VNDK versions less than the minimum supported API
+ // level for the primary architecture. This validation is skipped if the VNDK
+ // version matches the platform VNDK version, which can occur when the device
+ // config targets the 'current' VNDK (see `vndkVersion`).
ab.Disable()
}
-
}
}
diff --git a/bazel/cquery/request_type.go b/bazel/cquery/request_type.go
index 0c8247a..cf649a4 100644
--- a/bazel/cquery/request_type.go
+++ b/bazel/cquery/request_type.go
@@ -281,6 +281,7 @@
"bundle_file": info.base_with_config_zip.path,
"installed_files": info.installed_files.path,
"make_modules_to_install": mk_info.make_modules_to_install,
+ "files_info": mk_info.files_info,
"tidy_files": [t for t in tidy_files],
})`
}
@@ -303,7 +304,8 @@
TidyFiles []string `json:"tidy_files"`
// From the ApexMkInfo provider
- MakeModulesToInstall []string `json:"make_modules_to_install"`
+ MakeModulesToInstall []string `json:"make_modules_to_install"`
+ PayloadFilesInfo []map[string]string `json:"files_info"`
}
// ParseResult returns a value obtained by parsing the result of the request's Starlark function.
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 277d187..7ea1c1c 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -3035,7 +3035,7 @@
}`,
ExpectedBazelTargets: makeCcLibraryTargets("foolib", AttrNameToString{
"implementation_dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":barlib_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:barlib"],
"//conditions:default": [":barlib"],
})`,
"local_includes": `["."]`,
@@ -3088,8 +3088,8 @@
"//build/bazel/platforms/os:linux_musl": [":quxlib"],
"//build/bazel/platforms/os:windows": [":quxlib"],
"//build/bazel/rules/apex:android-in_apex": [
- ":barlib_stub_libs_current",
- ":quxlib_stub_libs_current",
+ "@api_surfaces//module-libapi/current:barlib",
+ "@api_surfaces//module-libapi/current:quxlib",
],
"//conditions:default": [
":barlib",
@@ -4130,11 +4130,11 @@
ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
"implementation_dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":barlib_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:barlib"],
"//conditions:default": [":barlib"],
})`,
"dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":bazlib_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:bazlib"],
"//conditions:default": [":bazlib"],
})`,
"local_includes": `["."]`,
@@ -4142,11 +4142,11 @@
}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
"implementation_dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":barlib_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:barlib"],
"//conditions:default": [":barlib"],
})`,
"dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":bazlib_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:bazlib"],
"//conditions:default": [":bazlib"],
})`,
"local_includes": `["."]`,
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index d16c5cc..7c18037 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -1553,7 +1553,7 @@
}),
MakeBazelTarget("cc_library_static", "keep_with_stubs", AttrNameToString{
"implementation_dynamic_deps": `select({
- "//build/bazel/rules/apex:android-in_apex": [":libm_stub_libs_current"],
+ "//build/bazel/rules/apex:android-in_apex": ["@api_surfaces//module-libapi/current:libm"],
"//conditions:default": [":libm"],
})`,
"system_dynamic_deps": `[]`,
diff --git a/bp2build/java_binary_host_conversion_test.go b/bp2build/java_binary_host_conversion_test.go
index 278a9bf..1b9777c 100644
--- a/bp2build/java_binary_host_conversion_test.go
+++ b/bp2build/java_binary_host_conversion_test.go
@@ -56,11 +56,9 @@
java_version: "8",
}`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
- "srcs": `["a.java"]`,
- "main_class": `"com.android.test.MainClass"`,
- "deps": `["//other:jni-lib-1"]`,
- "jvm_flags": `["-Djava.library.path=$${RUNPATH}other"]`,
+ MakeBazelTarget("java_library", "java-binary-host-1_lib", AttrNameToString{
+ "srcs": `["a.java"]`,
+ "deps": `["//other:jni-lib-1"]`,
"javacopts": `[
"-Xdoclint:all/protected",
"-source 1.8 -target 1.8",
@@ -68,8 +66,15 @@
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
- })`,
- }),
+ })`}),
+ MakeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
+ "main_class": `"com.android.test.MainClass"`,
+ "jvm_flags": `["-Djava.library.path=$${RUNPATH}other"]`,
+ "runtime_deps": `[":java-binary-host-1_lib"]`,
+ "target_compatible_with": `select({
+ "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ })`}),
},
})
}
@@ -122,15 +127,22 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("java_binary", "java-binary-host-libs", AttrNameToString{
- "main_class": `"com.android.test.MainClass"`,
- "srcs": `["a.java"]`,
- "deps": `[":java-lib-dep-1-neverlink"]`,
+ MakeBazelTarget("java_library", "java-binary-host-libs_lib", AttrNameToString{
+ "srcs": `["a.java"]`,
+ "deps": `[":java-lib-dep-1-neverlink"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
})`,
}),
+ MakeBazelTarget("java_binary", "java-binary-host-libs", AttrNameToString{
+ "main_class": `"com.android.test.MainClass"`,
+ "target_compatible_with": `select({
+ "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ })`,
+ "runtime_deps": `[":java-binary-host-libs_lib"]`,
+ }),
},
})
}
@@ -146,7 +158,7 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("kt_jvm_library", "java-binary-host_kt", AttrNameToString{
+ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{
"srcs": `[
"a.java",
"b.kt",
@@ -158,7 +170,7 @@
}),
MakeBazelTarget("java_binary", "java-binary-host", AttrNameToString{
"main_class": `"com.android.test.MainClass"`,
- "runtime_deps": `[":java-binary-host_kt"]`,
+ "runtime_deps": `[":java-binary-host_lib"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
@@ -180,7 +192,7 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("kt_jvm_library", "java-binary-host_kt", AttrNameToString{
+ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{
"srcs": `["a.java"]`,
"common_srcs": `["b.kt"]`,
"target_compatible_with": `select({
@@ -190,7 +202,7 @@
}),
MakeBazelTarget("java_binary", "java-binary-host", AttrNameToString{
"main_class": `"com.android.test.MainClass"`,
- "runtime_deps": `[":java-binary-host_kt"]`,
+ "runtime_deps": `[":java-binary-host_lib"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
@@ -216,7 +228,7 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("kt_jvm_library", "java-binary-host_kt", AttrNameToString{
+ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{
"srcs": `[
"a.java",
"b.kt",
@@ -233,7 +245,7 @@
}),
MakeBazelTarget("java_binary", "java-binary-host", AttrNameToString{
"main_class": `"com.android.test.MainClass"`,
- "runtime_deps": `[":java-binary-host_kt"]`,
+ "runtime_deps": `[":java-binary-host_lib"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
@@ -259,7 +271,7 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("kt_jvm_library", "java-binary-host_kt", AttrNameToString{
+ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{
"srcs": `[
"a.java",
"b.kt",
@@ -275,7 +287,7 @@
}),
MakeBazelTarget("java_binary", "java-binary-host", AttrNameToString{
"main_class": `"com.android.test.MainClass"`,
- "runtime_deps": `[":java-binary-host_kt"]`,
+ "runtime_deps": `[":java-binary-host_lib"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
@@ -297,7 +309,7 @@
}
`,
ExpectedBazelTargets: []string{
- MakeBazelTarget("kt_jvm_library", "java-binary-host_kt", AttrNameToString{
+ MakeBazelTarget("kt_jvm_library", "java-binary-host_lib", AttrNameToString{
"srcs": `["a.kt"]`,
"kotlincflags": `[
"-flag1",
@@ -310,7 +322,7 @@
}),
MakeBazelTarget("java_binary", "java-binary-host", AttrNameToString{
"main_class": `"com.android.test.MainClass"`,
- "runtime_deps": `[":java-binary-host_kt"]`,
+ "runtime_deps": `[":java-binary-host_lib"]`,
"target_compatible_with": `select({
"//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
"//conditions:default": [],
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 1086130..67a697a 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -1152,6 +1152,10 @@
}
}
+var (
+ apiSurfaceModuleLibCurrentPackage = "@api_surfaces//" + android.ModuleLibApi.String() + "/current:"
+)
+
func setStubsForDynamicDeps(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis,
config string, dynamicLibs bazel.LabelList, dynamicDeps *bazel.LabelListAttribute, ind int) {
depsWithStubs := []bazel.Label{}
@@ -1167,8 +1171,10 @@
stubLibLabels := []bazel.Label{}
for _, l := range depsWithStubs {
- l.Label = l.Label + stubsSuffix
- stubLibLabels = append(stubLibLabels, l)
+ stubLabelInApiSurfaces := bazel.Label{
+ Label: apiSurfaceModuleLibCurrentPackage + l.OriginalModuleName,
+ }
+ stubLibLabels = append(stubLibLabels, stubLabelInApiSurfaces)
}
inApexSelectValue := dynamicDeps.SelectValue(bazel.OsAndInApexAxis, bazel.AndroidAndInApex)
nonApexSelectValue := dynamicDeps.SelectValue(bazel.OsAndInApexAxis, bazel.AndroidAndNonApex)
@@ -1284,8 +1290,10 @@
la.implementationDynamicDeps.Exclude(bazel.OsAndInApexAxis, bazel.AndroidAndNonApex, toRemove)
stubsToRemove := make([]bazel.Label, 0, len(la.usedSystemDynamicDepAsDynamicDep))
for _, lib := range toRemove.Includes {
- lib.Label += stubsSuffix
- stubsToRemove = append(stubsToRemove, lib)
+ stubLabelInApiSurfaces := bazel.Label{
+ Label: apiSurfaceModuleLibCurrentPackage + lib.OriginalModuleName,
+ }
+ stubsToRemove = append(stubsToRemove, stubLabelInApiSurfaces)
}
la.implementationDynamicDeps.Exclude(bazel.OsAndInApexAxis, bazel.AndroidAndInApex, bazel.MakeLabelList(stubsToRemove))
}
diff --git a/cc/cc.go b/cc/cc.go
index 2dc20ae..6e2a3dd 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -609,7 +609,6 @@
inSanitizerDir() bool
hostToolPath() android.OptionalPath
relativeInstallPath() string
- makeUninstallable(mod *Module)
installInRoot() bool
}
@@ -3466,7 +3465,6 @@
nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
if ccDepModule != nil {
- // TODO(ivanlozano) Support snapshots for Rust-produced C library variants.
// Use base module name for snapshots when exporting to Makefile.
if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
baseName := ccDepModule.BaseModuleName()
@@ -3526,14 +3524,6 @@
return c.InRecovery()
}
-func (c *Module) MakeUninstallable() {
- if c.installer == nil {
- c.ModuleBase.MakeUninstallable()
- return
- }
- c.installer.makeUninstallable(c)
-}
-
func (c *Module) HostToolPath() android.OptionalPath {
if c.installer == nil {
return android.OptionalPath{}
diff --git a/cc/installer.go b/cc/installer.go
index e2c0e7b..c3618b7 100644
--- a/cc/installer.go
+++ b/cc/installer.go
@@ -121,10 +121,6 @@
return String(installer.Properties.Relative_install_path)
}
-func (installer *baseInstaller) makeUninstallable(mod *Module) {
- mod.ModuleBase.MakeUninstallable()
-}
-
func (installer *baseInstaller) installInRoot() bool {
return Bool(installer.Properties.Install_in_root)
}
diff --git a/cc/library.go b/cc/library.go
index 91960d5..842a05f 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -468,7 +468,7 @@
// Add alias for the stub shared_library in @api_surfaces repository
currentModuleLibApiDir := ctx.Config().ApiSurfacesDir(android.ModuleLibApi, "current")
actualLabelInMainWorkspace := bazel.Label{
- Label: fmt.Sprintf("@//%s:%s_stub_libs_current", ctx.ModuleDir(), m.Name()),
+ Label: fmt.Sprintf("@//%s:%s%s", ctx.ModuleDir(), m.Name(), stubsSuffix),
}
ctx.CreateBazelTargetAliasInDir(currentModuleLibApiDir, m.Name(), actualLabelInMainWorkspace)
@@ -2439,17 +2439,6 @@
return nil
}
-func (library *libraryDecorator) makeUninstallable(mod *Module) {
- if library.static() && library.buildStatic() && !library.buildStubs() {
- // If we're asked to make a static library uninstallable we don't do
- // anything since AndroidMkEntries always sets LOCAL_UNINSTALLABLE_MODULE
- // for these entries. This is done to still get the make targets for NOTICE
- // files from notice_files.mk, which other libraries might depend on.
- return
- }
- mod.ModuleBase.MakeUninstallable()
-}
-
func (library *libraryDecorator) getPartition() string {
return library.path.Partition()
}
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index 5b7ba43..c237d75 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -214,7 +214,7 @@
// without the prefix hack below.
if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() &&
!strings.HasPrefix(ctx.baseModuleName(), "libclang_rt.") {
- ctx.Module().MakeUninstallable()
+ ctx.Module().SkipInstall()
}
return outputFile
diff --git a/cc/sanitize.go b/cc/sanitize.go
index aa61453..d445732 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -77,7 +77,7 @@
"-fno-sanitize-recover=integer,undefined"}
hwasanGlobalOptions = []string{"heap_history_size=1023", "stack_history_size=512",
"export_memory_stats=0", "max_malloc_fill_size=131072", "malloc_fill_byte=0"}
- memtagStackCommonFlags = []string{"-march=armv8-a+memtag"}
+ memtagStackCommonFlags = []string{"-march=armv8-a+memtag", "-mllvm", "-dom-tree-reachability-max-bbs-to-explore=128"}
hostOnlySanitizeFlags = []string{"-fno-sanitize-recover=all"}
deviceOnlySanitizeFlags = []string{"-fsanitize-trap=all", "-ftrap-function=abort"}
@@ -827,13 +827,8 @@
if Bool(sanProps.Memtag_stack) {
flags.Local.CFlags = append(flags.Local.CFlags, memtagStackCommonFlags...)
- // TODO(fmayer): remove -Wno-error once https://reviews.llvm.org/D127917 is in Android toolchain.
- flags.Local.CFlags = append(flags.Local.CFlags, "-Wno-error=frame-larger-than")
flags.Local.AsFlags = append(flags.Local.AsFlags, memtagStackCommonFlags...)
flags.Local.LdFlags = append(flags.Local.LdFlags, memtagStackCommonFlags...)
- // This works around LLD complaining about the stack frame size.
- // TODO(fmayer): remove once https://reviews.llvm.org/D127917 is in Android toolchain.
- flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--no-fatal-warnings")
}
if (Bool(sanProps.Memtag_heap) || Bool(sanProps.Memtag_stack)) && ctx.binary() {
diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go
index 32878ca..bb6e257 100644
--- a/cc/snapshot_prebuilt.go
+++ b/cc/snapshot_prebuilt.go
@@ -522,6 +522,8 @@
return false
}
+var _ snapshotSanitizer = (*snapshotLibraryDecorator)(nil)
+
func (p *snapshotLibraryDecorator) isSanitizerAvailable(t SanitizerType) bool {
switch t {
case cfi:
@@ -644,8 +646,6 @@
return module.Init()
}
-var _ snapshotSanitizer = (*snapshotLibraryDecorator)(nil)
-
// Module definitions for snapshots of executable binaries.
//
// Modules (vendor|recovery)_snapshot_binary are defined here. They have their prebuilt executable
diff --git a/java/aar.go b/java/aar.go
index 7c45efe..4bc5465 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -1067,10 +1067,7 @@
neverlink := true
ctx.CreateBazelTargetModule(
- bazel.BazelTargetModuleProperties{
- Rule_class: "android_library",
- Bzl_load_location: "//build/bazel/rules/android:rules.bzl",
- },
+ AndroidLibraryBazelTargetModuleProperties(),
android.CommonAttributes{Name: name + "-neverlink"},
&bazelAndroidLibrary{
javaLibraryAttributes: &javaLibraryAttributes{
@@ -1081,6 +1078,12 @@
)
}
+func AndroidLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
+ return bazel.BazelTargetModuleProperties{
+ Rule_class: "android_library",
+ Bzl_load_location: "//build/bazel/rules/android:rules.bzl",
+ }
+}
func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
commonAttrs, bp2buildInfo := a.convertLibraryAttrsBp2Build(ctx)
@@ -1093,10 +1096,7 @@
ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
}
name := a.Name()
- props := bazel.BazelTargetModuleProperties{
- Rule_class: "android_library",
- Bzl_load_location: "//build/bazel/rules/android:rules.bzl",
- }
+ props := AndroidLibraryBazelTargetModuleProperties()
ctx.CreateBazelTargetModule(
props,
diff --git a/java/androidmk.go b/java/androidmk.go
index a4dac80..d73ff46 100644
--- a/java/androidmk.go
+++ b/java/androidmk.go
@@ -76,9 +76,6 @@
entriesList = append(entriesList, dexpreoptEntries...)
}
entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true})
- } else if !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) {
- // Platform variant. If not available for the platform, we don't need Make module.
- entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true})
} else {
entriesList = append(entriesList, android.AndroidMkEntries{
Class: "JAVA_LIBRARIES",
@@ -94,7 +91,8 @@
entries.AddStrings("LOCAL_LOGTAGS_FILES", logtags...)
}
- if library.installFile == nil {
+ if library.installFile == nil || !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) {
+ // If the ApexModule is not available for the platform, it shouldn't be installed.
entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", true)
}
if library.dexJarFile.IsSet() {
diff --git a/java/app.go b/java/app.go
index f596673..4cc9e19 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1535,10 +1535,7 @@
} else {
ktName := a.Name() + "_kt"
ctx.CreateBazelTargetModule(
- bazel.BazelTargetModuleProperties{
- Rule_class: "android_library",
- Bzl_load_location: "//build/bazel/rules/android:rules.bzl",
- },
+ AndroidLibraryBazelTargetModuleProperties(),
android.CommonAttributes{Name: ktName},
&bazelAndroidLibrary{
javaLibraryAttributes: &javaLibraryAttributes{
diff --git a/java/java.go b/java/java.go
index 15ee4a9..0841dad 100644
--- a/java/java.go
+++ b/java/java.go
@@ -2815,6 +2815,20 @@
Kotlincflags *[]string
}
+func ktJvmLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
+ return bazel.BazelTargetModuleProperties{
+ Rule_class: "kt_jvm_library",
+ Bzl_load_location: "//build/bazel/rules/kotlin:rules.bzl",
+ }
+}
+
+func javaLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
+ return bazel.BazelTargetModuleProperties{
+ Rule_class: "java_library",
+ Bzl_load_location: "//build/bazel/rules/java:rules.bzl",
+ }
+}
+
func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) {
commonAttrs, bp2BuildInfo := m.convertLibraryAttrsBp2Build(ctx)
depLabels := bp2BuildInfo.DepLabels
@@ -2844,15 +2858,9 @@
name := m.Name()
if !bp2BuildInfo.hasKotlin {
- props = bazel.BazelTargetModuleProperties{
- Rule_class: "java_library",
- Bzl_load_location: "//build/bazel/rules/java:rules.bzl",
- }
+ props = javaLibraryBazelTargetModuleProperties()
} else {
- props = bazel.BazelTargetModuleProperties{
- Rule_class: "kt_jvm_library",
- Bzl_load_location: "//build/bazel/rules/kotlin:rules.bzl",
- }
+ props = ktJvmLibraryBazelTargetModuleProperties()
}
ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name}, attrs)
@@ -2934,33 +2942,35 @@
Rule_class: "java_binary",
Bzl_load_location: "//build/bazel/rules/java:rules.bzl",
}
- attrs := &javaBinaryHostAttributes{
+ binAttrs := &javaBinaryHostAttributes{
Runtime_deps: runtimeDeps,
Main_class: mainClass,
Jvm_flags: jvmFlags,
}
- if !bp2BuildInfo.hasKotlin {
- attrs.javaCommonAttributes = commonAttrs
- attrs.Deps = deps
- } else {
- ktName := m.Name() + "_kt"
- ktProps := bazel.BazelTargetModuleProperties{
- Rule_class: "kt_jvm_library",
- Bzl_load_location: "//build/bazel/rules/kotlin:rules.bzl",
- }
-
- ktAttrs := &javaLibraryAttributes{
- Deps: deps,
- javaCommonAttributes: commonAttrs,
- }
-
- ctx.CreateBazelTargetModule(ktProps, android.CommonAttributes{Name: ktName}, ktAttrs)
- attrs.Runtime_deps.Add(&bazel.LabelAttribute{Value: &bazel.Label{Label: ":" + ktName}})
+ if commonAttrs.Srcs.IsEmpty() {
+ binAttrs.javaCommonAttributes = commonAttrs
+ ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, binAttrs)
+ return
}
+ libName := m.Name() + "_lib"
+ var libProps bazel.BazelTargetModuleProperties
+ if bp2BuildInfo.hasKotlin {
+ libProps = ktJvmLibraryBazelTargetModuleProperties()
+ } else {
+ libProps = javaLibraryBazelTargetModuleProperties()
+ }
+ libAttrs := &javaLibraryAttributes{
+ Deps: deps,
+ javaCommonAttributes: commonAttrs,
+ }
+
+ ctx.CreateBazelTargetModule(libProps, android.CommonAttributes{Name: libName}, libAttrs)
+ binAttrs.Runtime_deps.Add(&bazel.LabelAttribute{Value: &bazel.Label{Label: ":" + libName}})
+
// Create the BazelTargetModule.
- ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, attrs)
+ ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, binAttrs)
}
type bazelJavaImportAttributes struct {
@@ -2999,10 +3009,7 @@
Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
}
ctx.CreateBazelTargetModule(
- bazel.BazelTargetModuleProperties{
- Rule_class: "java_library",
- Bzl_load_location: "//build/bazel/rules/java:rules.bzl",
- },
+ javaLibraryBazelTargetModuleProperties(),
android.CommonAttributes{Name: name + "-neverlink"},
neverlinkAttrs)
diff --git a/mk2rbc/Android.bp b/mk2rbc/Android.bp
index 4fa3eb6..cd80a4d 100644
--- a/mk2rbc/Android.bp
+++ b/mk2rbc/Android.bp
@@ -19,7 +19,7 @@
blueprint_go_binary {
name: "mk2rbc",
- srcs: ["cmd/mk2rbc.go"],
+ srcs: ["mk2rbc/mk2rbc.go"],
deps: [
"mk2rbc-lib",
"androidmk-parser",
diff --git a/mk2rbc/cmd/mk2rbc.go b/mk2rbc/mk2rbc/mk2rbc.go
similarity index 100%
rename from mk2rbc/cmd/mk2rbc.go
rename to mk2rbc/mk2rbc/mk2rbc.go
diff --git a/rust/androidmk.go b/rust/androidmk.go
index 20e9919..5e680b0 100644
--- a/rust/androidmk.go
+++ b/rust/androidmk.go
@@ -43,6 +43,10 @@
}
}
+func (mod *Module) AndroidMkSuffix() string {
+ return mod.Properties.RustSubName + mod.Properties.SubName
+}
+
func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries {
if mod.Properties.HideFromMake || mod.hideApexVariantFromMake {
@@ -79,8 +83,7 @@
mod.SubAndroidMk(&ret, mod.sanitize)
}
- ret.SubName += mod.Properties.RustSubName
- ret.SubName += mod.Properties.SubName
+ ret.SubName += mod.AndroidMkSuffix()
return []android.AndroidMkEntries{ret}
}
@@ -152,6 +155,11 @@
})
}
+func (library *snapshotLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
+ ctx.SubAndroidMk(ret, library.libraryDecorator)
+ ret.SubName = library.SnapshotAndroidMkSuffix()
+}
+
func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) {
ctx.SubAndroidMk(ret, procMacro.baseCompiler)
diff --git a/rust/rust.go b/rust/rust.go
index 8a13ba3..a200617 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -1111,6 +1111,17 @@
return nil
}
+func rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string {
+ if rustDep, ok := dep.(*Module); ok {
+ // Use base module name for snapshots when exporting to Makefile.
+ if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok {
+ baseName := rustDep.BaseModuleName()
+ return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix()
+ }
+ }
+ return cc.MakeLibName(ctx, c, dep, depName)
+}
+
func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
var depPaths PathDeps
@@ -1142,7 +1153,7 @@
if rustDep, ok := dep.(*Module); ok && !rustDep.CcLibraryInterface() {
//Handle Rust Modules
- makeLibName := cc.MakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName)
+ makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName)
switch depTag {
case dylibDepTag:
diff --git a/rust/vendor_snapshot_test.go b/rust/vendor_snapshot_test.go
index 7be0042..e1b3c86 100644
--- a/rust/vendor_snapshot_test.go
+++ b/rust/vendor_snapshot_test.go
@@ -424,6 +424,14 @@
compile_multilib: "32",
srcs: ["bin.rs"],
}
+
+ rust_library {
+ name: "librust_vendor_available",
+ crate_name: "rust_vendor",
+ vendor_available: true,
+ srcs: ["client.rs"],
+ }
+
`
vndkBp := `
@@ -499,13 +507,6 @@
system_shared_libs: [],
}
- rust_library {
- name: "librust_vendor_available",
- crate_name: "rust_vendor",
- vendor_available: true,
- srcs: ["client.rs"],
- }
-
rust_ffi_shared {
name: "libclient",
crate_name: "client",
@@ -963,7 +964,7 @@
}
libclientAndroidMkRlibs := ctx.ModuleForTests("libclient", sharedVariant).Module().(*Module).Properties.AndroidMkRlibs
- if g, w := libclientAndroidMkRlibs, []string{"librust_vendor_available.vendor_rlib.30.arm64.rlib-std", "libstd.vendor_rlib.30.arm64"}; !reflect.DeepEqual(g, w) {
+ if g, w := libclientAndroidMkRlibs, []string{"librust_vendor_available.vendor.rlib-std", "libstd.vendor"}; !reflect.DeepEqual(g, w) {
t.Errorf("wanted libclient libclientAndroidMkRlibs %q, got %q", w, g)
}
@@ -978,10 +979,24 @@
}
libclientRustAndroidMkRlibs := ctx.ModuleForTests("libclient_rust", rlibVariant).Module().(*Module).Properties.AndroidMkRlibs
- if g, w := libclientRustAndroidMkRlibs, []string{"librust_vendor_available.vendor_rlib.30.arm64.rlib-std", "libstd.vendor_rlib.30.arm64"}; !reflect.DeepEqual(g, w) {
+ if g, w := libclientRustAndroidMkRlibs, []string{"librust_vendor_available.vendor.rlib-std", "libstd.vendor"}; !reflect.DeepEqual(g, w) {
t.Errorf("wanted libclient libclientAndroidMkRlibs %q, got %q", w, g)
}
+ // rust vendor snapshot must have ".vendor" suffix in AndroidMk
+ librustVendorAvailableSnapshotModule := ctx.ModuleForTests("librust_vendor_available.vendor_rlib.30.arm64", rlibVariant).Module()
+ librustVendorSnapshotMkName := android.AndroidMkEntriesForTest(t, ctx, librustVendorAvailableSnapshotModule)[0].EntryMap["LOCAL_MODULE"][0]
+ expectedRustVendorSnapshotName := "librust_vendor_available.vendor.rlib-std"
+ if librustVendorSnapshotMkName != expectedRustVendorSnapshotName {
+ t.Errorf("Unexpected rust vendor snapshot name in AndroidMk: %q, expected: %q\n", librustVendorSnapshotMkName, expectedRustVendorSnapshotName)
+ }
+
+ rustVendorBinModule := ctx.ModuleForTests("bin_without_snapshot", binaryVariant).Module()
+ rustVendorBinMkRlibName := android.AndroidMkEntriesForTest(t, ctx, rustVendorBinModule)[0].EntryMap["LOCAL_RLIB_LIBRARIES"][0]
+ if rustVendorBinMkRlibName != expectedRustVendorSnapshotName {
+ t.Errorf("Unexpected rust rlib name in AndroidMk: %q, expected: %q\n", rustVendorBinMkRlibName, expectedRustVendorSnapshotName)
+ }
+
binWithoutSnapshotLdFlags := ctx.ModuleForTests("bin_without_snapshot", binaryVariant).Rule("rustc").Args["linkFlags"]
libVndkStaticOutputPaths := cc.GetOutputPaths(ctx, staticVariant, []string{"libvndk.vendor_static.30.arm64"})
if !strings.Contains(binWithoutSnapshotLdFlags, libVndkStaticOutputPaths[0].String()) {
diff --git a/scripts/Android.bp b/scripts/Android.bp
index ddbba74..26fe432 100644
--- a/scripts/Android.bp
+++ b/scripts/Android.bp
@@ -231,3 +231,8 @@
srcs: ["rustfmt.toml"],
visibility: ["//visibility:public"],
}
+
+sh_binary_host {
+ name: "jars-to-module-info-java",
+ src: "jars-to-module-info-java.sh",
+}
diff --git a/soong_ui.bash b/soong_ui.bash
index 1d027c4..8e7cd19 100755
--- a/soong_ui.bash
+++ b/soong_ui.bash
@@ -33,8 +33,8 @@
source ${TOP}/build/soong/scripts/microfactory.bash
soong_build_go soong_ui android/soong/cmd/soong_ui
-soong_build_go mk2rbc android/soong/mk2rbc/cmd
-soong_build_go rbcrun rbcrun/cmd
+soong_build_go mk2rbc android/soong/mk2rbc/mk2rbc
+soong_build_go rbcrun rbcrun/rbcrun
cd ${TOP}
exec "$(getoutdir)/soong_ui" "$@"
diff --git a/tests/sbom_test.sh b/tests/sbom_test.sh
index 28ce9d8..6066d70 100755
--- a/tests/sbom_test.sh
+++ b/tests/sbom_test.sh
@@ -37,13 +37,21 @@
out_dir=out
droid_target=
fi
-# m droid
+# m droid, build sbom later in case additional dependencies might be built and included in partition images.
TARGET_PRODUCT="aosp_cf_x86_64_phone" TARGET_BUILD_VARIANT=userdebug OUT_DIR=$out_dir \
- build/soong/soong_ui.bash --make-mode $droid_target dump.erofs sbom
+ build/soong/soong_ui.bash --make-mode $droid_target dump.erofs
+
+product_out=$out_dir/target/product/vsoc_x86_64
+sbom_test=$product_out/sbom_test
+mkdir $sbom_test
+cp $product_out/*.img $sbom_test
+
+# m sbom
+TARGET_PRODUCT="aosp_cf_x86_64_phone" TARGET_BUILD_VARIANT=userdebug OUT_DIR=$out_dir \
+ build/soong/soong_ui.bash --make-mode sbom
# Generate installed file list from .img files in PRODUCT_OUT
dump_erofs=$out_dir/host/linux-x86/bin/dump.erofs
-product_out=$out_dir/target/product/vsoc_x86_64
declare -A diff_excludes
diff_excludes[odm]="-I /odm/lib/modules"
@@ -142,19 +150,19 @@
# 5388910 2 overlay
# 5479537 2 priv-app
EROFS_IMAGES="\
- $product_out/product.img \
- $product_out/system.img \
- $product_out/system_ext.img \
- $product_out/system_dlkm.img \
- $product_out/system_other.img \
- $product_out/odm.img \
- $product_out/odm_dlkm.img \
- $product_out/vendor.img \
- $product_out/vendor_dlkm.img"
+ $sbom_test/product.img \
+ $sbom_test/system.img \
+ $sbom_test/system_ext.img \
+ $sbom_test/system_dlkm.img \
+ $sbom_test/system_other.img \
+ $sbom_test/odm.img \
+ $sbom_test/odm_dlkm.img \
+ $sbom_test/vendor.img \
+ $sbom_test/vendor_dlkm.img"
for f in $EROFS_IMAGES; do
partition_name=$(basename $f | cut -d. -f1)
- file_list_file="${product_out}/sbom-${partition_name}-files.txt"
- files_in_spdx_file="${product_out}/sbom-${partition_name}-files-in-spdx.txt"
+ file_list_file="${sbom_test}/sbom-${partition_name}-files.txt"
+ files_in_spdx_file="${sbom_test}/sbom-${partition_name}-files-in-spdx.txt"
rm "$file_list_file" > /dev/null 2>&1
all_dirs="/"
while [ ! -z "$all_dirs" ]; do
diff --git a/ui/build/ninja.go b/ui/build/ninja.go
index a91cc3b..4734494 100644
--- a/ui/build/ninja.go
+++ b/ui/build/ninja.go
@@ -31,10 +31,11 @@
const (
// File containing the environment state when ninja is executed
ninjaEnvFileName = "ninja.environment"
+ ninjaLogFileName = ".ninja_log"
)
func useNinjaBuildLog(ctx Context, config Config, cmd *Cmd) {
- ninjaLogFile := filepath.Join(config.OutDir(), ".ninja_log")
+ ninjaLogFile := filepath.Join(config.OutDir(), ninjaLogFileName)
data, err := os.ReadFile(ninjaLogFile)
var outputBuilder strings.Builder
if err == nil {
@@ -59,9 +60,11 @@
outputBuilder.WriteString(",")
outputBuilder.WriteString(strconv.Itoa(end-start+1) + "\n")
}
+ } else {
+ // If there is no ninja log file, just pass empty ninja weight list.
+ // Because it is still efficient with critical path calculation logic even without weight.
+ ctx.Verbosef("There is an error during reading ninja log, so ninja will use empty weight list: %s", err)
}
- // If there is no ninja log file, just pass empty ninja weight list.
- // Because it is still efficient with critical path calculation logic even without weight.
weightListFile := filepath.Join(config.OutDir(), ".ninja_weight_list")
@@ -263,7 +266,7 @@
ticker := time.NewTicker(ninjaHeartbeatDuration)
defer ticker.Stop()
ninjaChecker := &ninjaStucknessChecker{
- logPath: filepath.Join(config.OutDir(), ".ninja_log"),
+ logPath: filepath.Join(config.OutDir(), ninjaLogFileName),
}
go func() {
for {
diff --git a/ui/metrics/BUILD.bazel b/ui/metrics/BUILD.bazel
new file mode 100644
index 0000000..15ebb88
--- /dev/null
+++ b/ui/metrics/BUILD.bazel
@@ -0,0 +1,30 @@
+# Copyright (C) 2023 The Android Open Source Project
+#
+# 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.
+
+load("//build/bazel/rules/python:py_proto.bzl", "py_proto_library")
+
+py_proto_library(
+ name = "metrics-py-proto",
+ visibility = ["//build/bazel/scripts/incremental_build:__pkg__"],
+ deps = [":metrics-proto"],
+)
+
+proto_library(
+ name = "metrics-proto",
+ srcs = [
+ "bp2build_metrics_proto/bp2build_metrics.proto",
+ "metrics_proto/metrics.proto",
+ ],
+ strip_import_prefix = "",
+)