Merge changes from topic "vendor_linker_config_soong" into main
* changes:
Create linker_config_srcs for autogenerated vendor partition
Add linker.config.pb support to android_filesystem
diff --git a/android/Android.bp b/android/Android.bp
index 1ed2dba..cf707bd 100644
--- a/android/Android.bp
+++ b/android/Android.bp
@@ -111,6 +111,7 @@
"util.go",
"variable.go",
"vintf_fragment.go",
+ "vintf_data.go",
"visibility.go",
],
testSrcs: [
diff --git a/android/config.go b/android/config.go
index 1739b01..8c4b5cd 100644
--- a/android/config.go
+++ b/android/config.go
@@ -2234,3 +2234,19 @@
func (c Config) InstallApexSystemServerDexpreoptSamePartition() bool {
return c.config.productVariables.GetBuildFlagBool("RELEASE_INSTALL_APEX_SYSTEMSERVER_DEXPREOPT_SAME_PARTITION")
}
+
+func (c *config) DeviceMatrixFile() []string {
+ return c.productVariables.DeviceMatrixFile
+}
+
+func (c *config) ProductManifestFiles() []string {
+ return c.productVariables.ProductManifestFiles
+}
+
+func (c *config) SystemManifestFile() []string {
+ return c.productVariables.SystemManifestFile
+}
+
+func (c *config) SystemExtManifestFiles() []string {
+ return c.productVariables.SystemExtManifestFiles
+}
diff --git a/android/module.go b/android/module.go
index 1148430..a918d6e 100644
--- a/android/module.go
+++ b/android/module.go
@@ -85,6 +85,7 @@
PartitionTag(DeviceConfig) string
HideFromMake()
IsHideFromMake() bool
+ SkipInstall()
IsSkipInstall() bool
MakeUninstallable()
ReplacedByPrebuilt()
@@ -1421,6 +1422,7 @@
func (m *ModuleBase) MakeUninstallable() {
m.commonProperties.UninstallableApexPlatformVariant = true
m.HideFromMake()
+ m.SkipInstall()
}
func (m *ModuleBase) ReplacedByPrebuilt() {
diff --git a/android/module_context.go b/android/module_context.go
index 9fa3a62..9fa3fa3 100644
--- a/android/module_context.go
+++ b/android/module_context.go
@@ -497,10 +497,6 @@
return true
}
- if m.module.base().commonProperties.HideFromMake {
- return true
- }
-
// We'll need a solution for choosing which of modules with the same name in different
// namespaces to install. For now, reuse the list of namespaces exported to Make as the
// list of namespaces to install in a Soong-only build.
@@ -519,6 +515,10 @@
return false
}
+ if m.module.base().commonProperties.HideFromMake {
+ return false
+ }
+
if proptools.Bool(m.module.base().commonProperties.No_full_install) {
return false
}
diff --git a/android/module_proxy.go b/android/module_proxy.go
index 2a65072..a60a5a8 100644
--- a/android/module_proxy.go
+++ b/android/module_proxy.go
@@ -122,6 +122,10 @@
panic("method is not implemented on ModuleProxy")
}
+func (m ModuleProxy) SkipInstall() {
+ panic("method is not implemented on ModuleProxy")
+}
+
func (m ModuleProxy) IsSkipInstall() bool {
panic("method is not implemented on ModuleProxy")
}
diff --git a/android/prebuilt.go b/android/prebuilt.go
index 5d75b62..51e72af 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -569,6 +569,7 @@
for _, moduleInFamily := range allModulesInFamily {
if moduleInFamily.Name() != selectedModuleInFamily.Name() {
moduleInFamily.HideFromMake()
+ moduleInFamily.SkipInstall()
// If this is a prebuilt module, unset properties.UsePrebuilt
// properties.UsePrebuilt might evaluate to true via soong config var fallback mechanism
// Set it to false explicitly so that the following mutator does not replace rdeps to this unselected prebuilt
@@ -639,6 +640,7 @@
}
} else {
m.HideFromMake()
+ m.SkipInstall()
}
}
}
diff --git a/android/variable.go b/android/variable.go
index 3656d0e..548a762 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -535,6 +535,11 @@
ExtraAllowedDepsTxt *string `json:",omitempty"`
AdbKeys *string `json:",omitempty"`
+
+ DeviceMatrixFile []string `json:",omitempty"`
+ ProductManifestFiles []string `json:",omitempty"`
+ SystemManifestFile []string `json:",omitempty"`
+ SystemExtManifestFiles []string `json:",omitempty"`
}
type PartitionQualifiedVariablesType struct {
diff --git a/android/vintf_data.go b/android/vintf_data.go
new file mode 100644
index 0000000..cd5f096
--- /dev/null
+++ b/android/vintf_data.go
@@ -0,0 +1,148 @@
+// Copyright 2024 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 android
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/google/blueprint/proptools"
+)
+
+const (
+ deviceCmType = "device_cm"
+ systemManifestType = "system_manifest"
+ productManifestType = "product_manifest"
+ systemExtManifestType = "system_ext_manifest"
+
+ defaultDcm = "system/libhidl/vintfdata/device_compatibility_matrix.default.xml"
+ defaultSystemManifest = "system/libhidl/vintfdata/manifest.xml"
+ defaultSystemExtManifest = "system/libhidl/vintfdata/system_ext_manifest.default.xml"
+)
+
+type vintfDataProperties struct {
+ // Optional name for the installed file. If unspecified it will be manifest.xml by default.
+ Filename *string
+
+ // Type of the vintf data type, the allowed type are device_compatibility_matrix, system_manifest,
+ // product_manifest, and system_ext_manifest.
+ Type *string
+}
+
+type vintfDataRule struct {
+ ModuleBase
+
+ properties vintfDataProperties
+
+ installDirPath InstallPath
+ outputFilePath OutputPath
+ noAction bool
+}
+
+func init() {
+ registerVintfDataComponents(InitRegistrationContext)
+}
+
+func registerVintfDataComponents(ctx RegistrationContext) {
+ ctx.RegisterModuleType("vintf_data", vintfDataFactory)
+}
+
+// vintf_fragment module processes vintf fragment file and installs under etc/vintf/manifest.
+func vintfDataFactory() Module {
+ m := &vintfDataRule{}
+ m.AddProperties(
+ &m.properties,
+ )
+ InitAndroidArchModule(m, DeviceSupported, MultilibFirst)
+
+ return m
+}
+
+func (m *vintfDataRule) GenerateAndroidBuildActions(ctx ModuleContext) {
+ builder := NewRuleBuilder(pctx, ctx)
+ gensrc := PathForModuleOut(ctx, "manifest.xml")
+ assembleVintfEnvs := []string{}
+ inputPaths := make(Paths, 0)
+
+ switch proptools.String(m.properties.Type) {
+ case deviceCmType:
+ assembleVintfEnvs = append(assembleVintfEnvs, fmt.Sprintf("BOARD_SYSTEMSDK_VERSIONS=\"%s\"", strings.Join(ctx.DeviceConfig().SystemSdkVersions(), " ")))
+
+ deviceMatrixs := PathsForSource(ctx, ctx.Config().DeviceMatrixFile())
+ if len(deviceMatrixs) > 0 {
+ inputPaths = append(inputPaths, deviceMatrixs...)
+ } else {
+ inputPaths = append(inputPaths, PathForSource(ctx, defaultDcm))
+ }
+ case systemManifestType:
+ assembleVintfEnvs = append(assembleVintfEnvs, fmt.Sprintf("PLATFORM_SYSTEMSDK_VERSIONS=\"%s\"", strings.Join(ctx.DeviceConfig().PlatformSystemSdkVersions(), " ")))
+
+ inputPaths = append(inputPaths, PathForSource(ctx, defaultSystemManifest))
+ systemManifestFiles := PathsForSource(ctx, ctx.Config().SystemManifestFile())
+ if len(systemManifestFiles) > 0 {
+ inputPaths = append(inputPaths, systemManifestFiles...)
+ }
+ case productManifestType:
+ productManifestFiles := PathsForSource(ctx, ctx.Config().ProductManifestFiles())
+ // Only need to generate the manifest if PRODUCT_MANIFEST_FILES not defined.
+ if len(productManifestFiles) == 0 {
+ m.noAction = true
+ return
+ }
+
+ inputPaths = append(inputPaths, productManifestFiles...)
+ case systemExtManifestType:
+ assembleVintfEnvs = append(assembleVintfEnvs, fmt.Sprintf("PROVIDED_VNDK_VERSIONS=\"%s\"", strings.Join(ctx.DeviceConfig().ExtraVndkVersions(), " ")))
+
+ inputPaths = append(inputPaths, PathForSource(ctx, defaultSystemExtManifest))
+ systemExtManifestFiles := PathsForSource(ctx, ctx.Config().SystemExtManifestFiles())
+ if len(systemExtManifestFiles) > 0 {
+ inputPaths = append(inputPaths, systemExtManifestFiles...)
+ }
+ default:
+ panic(fmt.Errorf("For %s: The attribute 'type' value only allowed device_cm, system_manifest, product_manifest, system_ext_manifest!", ctx.Module().Name()))
+ }
+
+ // Process vintf fragment source file with assemble_vintf tool
+ builder.Command().
+ Flags(assembleVintfEnvs).
+ BuiltTool("assemble_vintf").
+ FlagWithArg("-i ", strings.Join(inputPaths.Strings(), ":")).
+ FlagWithOutput("-o ", gensrc)
+
+ builder.Build("assemble_vintf", "Process vintf data "+gensrc.String())
+
+ m.installDirPath = PathForModuleInstall(ctx, "etc", "vintf")
+ m.outputFilePath = gensrc.OutputPath
+
+ installFileName := "manifest.xml"
+ if filename := proptools.String(m.properties.Filename); filename != "" {
+ installFileName = filename
+ }
+
+ ctx.InstallFile(m.installDirPath, installFileName, gensrc)
+}
+
+// Make this module visible to AndroidMK so it can be referenced from modules defined from Android.mk files
+func (m *vintfDataRule) AndroidMkEntries() []AndroidMkEntries {
+ if m.noAction {
+ return []AndroidMkEntries{}
+ }
+
+ return []AndroidMkEntries{{
+ Class: "ETC",
+ OutputFile: OptionalPathForPath(m.outputFilePath),
+ }}
+}
diff --git a/cc/builder.go b/cc/builder.go
index cd535c1..2948ca3 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -821,7 +821,7 @@
return nil
}
- output := android.PathForModuleOut(ctx, "generated_rust_staticlib", "lib"+ctx.ModuleName()+"_rust_staticlib.a")
+ output := android.PathForModuleOut(ctx, "generated_rust_staticlib", "librustlibs.a")
stemFile := output.ReplaceExtension(ctx, "rs")
crateNames := []string{}
diff --git a/cc/cc.go b/cc/cc.go
index 4cda633..551f2cd 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -2166,6 +2166,7 @@
// modules can be hidden from make as some are needed for resolving make side
// dependencies.
c.HideFromMake()
+ c.SkipInstall()
} else if !installable(c, apexInfo) {
c.SkipInstall()
}
diff --git a/java/java.go b/java/java.go
index c9bda72..53b3481 100644
--- a/java/java.go
+++ b/java/java.go
@@ -944,6 +944,7 @@
// Even though the source javalib is not used, we need to hide it to prevent duplicate installation rules.
// TODO (b/331665856): Implement a principled solution for this.
j.HideFromMake()
+ j.SkipInstall()
}
j.provideHiddenAPIPropertyInfo(ctx)
diff --git a/java/sdk_library.go b/java/sdk_library.go
index dfbde0e..f6dfcdd 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -1403,6 +1403,7 @@
// Even though the source javalib is not used, we need to hide it to prevent duplicate installation rules.
// TODO (b/331665856): Implement a principled solution for this.
module.HideFromMake()
+ module.SkipInstall()
}
module.stem = proptools.StringDefault(module.overridableProperties.Stem, ctx.ModuleName())
diff --git a/rust/builder.go b/rust/builder.go
index f469f56..a1e17fc 100644
--- a/rust/builder.go
+++ b/rust/builder.go
@@ -170,6 +170,9 @@
return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, getTransformProperties(ctx, "rlib"))
}
+// TransformRlibstoStaticlib is assumed to be called from the cc module, and
+// thus needs to reconstruct the common set of flags which need to be passed
+// to the rustc compiler.
func TransformRlibstoStaticlib(ctx android.ModuleContext, mainSrc android.Path, deps []cc.RustRlibDep,
outputFile android.WritablePath) android.Path {
diff --git a/rust/rust.go b/rust/rust.go
index 6b91ccb..9e06cd4 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -974,6 +974,7 @@
// side dependencies. In particular, proc-macros need to be captured in the
// host snapshot.
mod.HideFromMake()
+ mod.SkipInstall()
} else if !mod.installable(apexInfo) {
mod.SkipInstall()
}
diff --git a/rust/rust_test.go b/rust/rust_test.go
index eeedf3f..767508d 100644
--- a/rust/rust_test.go
+++ b/rust/rust_test.go
@@ -494,7 +494,7 @@
}
// Make sure the static lib is included in the ld command
- if !strings.Contains(libcc_shared_ld.Args["libFlags"], "generated_rust_staticlib/liblibcc_shared_rust_staticlib.a") {
+ if !strings.Contains(libcc_shared_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") {
t.Errorf("missing generated static library in linker step libFlags %#v, libFlags: %#v",
"libcc_shared.generated_rust_staticlib.a", libcc_shared_ld.Args["libFlags"])
}
@@ -511,7 +511,7 @@
}
// Make sure the static lib is included in the cc command
- if !strings.Contains(ccbin_ld.Args["libFlags"], "generated_rust_staticlib/libccBin_rust_staticlib.a") {
+ if !strings.Contains(ccbin_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") {
t.Errorf("missing generated static library in linker step libFlags, expecting %#v, libFlags: %#v",
"ccBin.generated_rust_staticlib.a", ccbin_ld.Args["libFlags"])
}
diff --git a/sh/sh_binary.go b/sh/sh_binary.go
index 9c0db73..853f3d3 100644
--- a/sh/sh_binary.go
+++ b/sh/sh_binary.go
@@ -45,6 +45,7 @@
ctx.RegisterModuleType("sh_binary_host", ShBinaryHostFactory)
ctx.RegisterModuleType("sh_test", ShTestFactory)
ctx.RegisterModuleType("sh_test_host", ShTestHostFactory)
+ ctx.RegisterModuleType("sh_defaults", ShDefaultsFactory)
}
// Test fixture preparer that will register most sh build components.
@@ -167,6 +168,7 @@
type ShBinary struct {
android.ModuleBase
+ android.DefaultableModuleBase
properties shBinaryProperties
@@ -548,6 +550,7 @@
module := &ShBinary{}
initShBinaryModule(module)
android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibFirst)
+ android.InitDefaultableModule(module)
return module
}
@@ -557,6 +560,7 @@
module := &ShBinary{}
initShBinaryModule(module)
android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
+ android.InitDefaultableModule(module)
return module
}
@@ -567,6 +571,7 @@
module.AddProperties(&module.testProperties)
android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibFirst)
+ android.InitDefaultableModule(module)
return module
}
@@ -581,6 +586,21 @@
}
android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
+ android.InitDefaultableModule(module)
+ return module
+}
+
+type ShDefaults struct {
+ android.ModuleBase
+ android.DefaultsModuleBase
+}
+
+func ShDefaultsFactory() android.Module {
+ module := &ShDefaults{}
+
+ module.AddProperties(&shBinaryProperties{}, &TestProperties{})
+ android.InitDefaultsModule(module)
+
return module
}
diff --git a/sh/sh_binary_test.go b/sh/sh_binary_test.go
index 37450b0..5a50439 100644
--- a/sh/sh_binary_test.go
+++ b/sh/sh_binary_test.go
@@ -294,3 +294,92 @@
actualData := entries.EntryMap["LOCAL_TEST_DATA"]
android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
}
+
+func TestDefaultsForTests(t *testing.T) {
+ ctx, config := testShBinary(t, `
+ sh_defaults {
+ name: "defaults",
+ src: "test.sh",
+ filename: "test.sh",
+ data: [
+ "testdata/data1",
+ "testdata/sub/data2",
+ ],
+ }
+ sh_test_host {
+ name: "foo",
+ defaults: ["defaults"],
+ data: [
+ "testdata/more_data",
+ ],
+ java_data: [
+ "javalib",
+ ],
+ }
+
+ java_library_host {
+ name: "javalib",
+ srcs: [],
+ }
+
+ sh_test {
+ name: "sh-test",
+ defaults: ["defaults"],
+ }
+
+ `)
+ buildOS := ctx.Config().BuildOS.String()
+ mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest)
+ if !mod.Host() {
+ t.Errorf("host bit is not set for a sh_test_host module.")
+ }
+ expectedData := []string{
+ ":testdata/data1",
+ ":testdata/sub/data2",
+ ":testdata/more_data",
+ "out/soong/.intermediates/javalib/" + buildOS + "_common/combined/:javalib.jar",
+ }
+
+ entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
+ actualData := entries.EntryMap["LOCAL_TEST_DATA"]
+ android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
+
+ // Just the defaults
+ expectedData = []string{
+ ":testdata/data1",
+ ":testdata/sub/data2",
+ }
+ mod = ctx.ModuleForTests("sh-test", "android_arm64_armv8-a").Module().(*ShTest)
+ entries = android.AndroidMkEntriesForTest(t, ctx, mod)[0]
+ actualData = entries.EntryMap["LOCAL_TEST_DATA"]
+ android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
+}
+
+func TestDefaultsForBinaries(t *testing.T) {
+ ctx, _ := testShBinary(t, `
+ sh_defaults {
+ name: "defaults",
+ src: "test.sh",
+ filename: "test.sh",
+ }
+ sh_binary_host {
+ name: "the-host-binary",
+ defaults: ["defaults"],
+ }
+ sh_binary{
+ name: "the-binary",
+ defaults: ["defaults"],
+ }
+ `)
+ buildOS := ctx.Config().BuildOS.String()
+ mod := ctx.ModuleForTests("the-host-binary", buildOS+"_x86_64").Module().(*ShBinary)
+ if !mod.Host() {
+ t.Errorf("host bit is not set for a sh_binary_host module.")
+ }
+
+ expectedFilename := "test.sh"
+ android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename)
+
+ mod = ctx.ModuleForTests("the-binary", "android_arm64_armv8-a").Module().(*ShBinary)
+ android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename)
+}