Merge "Give cc_test rule information to determine the test types" into main
diff --git a/aconfig/rust_aconfig_library.go b/aconfig/rust_aconfig_library.go
index 8b16372..de41776 100644
--- a/aconfig/rust_aconfig_library.go
+++ b/aconfig/rust_aconfig_library.go
@@ -6,6 +6,7 @@
"fmt"
"github.com/google/blueprint"
+ "github.com/google/blueprint/proptools"
)
type rustDeclarationsTagType struct {
@@ -17,6 +18,7 @@
type RustAconfigLibraryProperties struct {
// name of the aconfig_declarations module to generate a library for
Aconfig_declarations string
+ Test *bool
}
type aconfigDecorator struct {
@@ -58,6 +60,11 @@
}
declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData)
+ mode := "production"
+ if proptools.Bool(a.Properties.Test) {
+ mode = "test"
+ }
+
ctx.Build(pctx, android.BuildParams{
Rule: rustRule,
Input: declarations.IntermediatePath,
@@ -67,8 +74,7 @@
Description: "rust_aconfig_library",
Args: map[string]string{
"gendir": generatedDir.String(),
- // TODO: Add test mode
- "mode": "production",
+ "mode": mode,
},
})
a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource}
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 71c8d0e..056c1a8 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -145,6 +145,7 @@
"external/flatbuffers": Bp2BuildDefaultTrueRecursively,
"external/fmtlib": Bp2BuildDefaultTrueRecursively,
"external/fsverity-utils": Bp2BuildDefaultTrueRecursively,
+ "external/gflags": Bp2BuildDefaultTrueRecursively,
"external/google-benchmark": Bp2BuildDefaultTrueRecursively,
"external/googletest": Bp2BuildDefaultTrueRecursively,
"external/guava": Bp2BuildDefaultTrueRecursively,
diff --git a/android/bazel_paths.go b/android/bazel_paths.go
index 7992564..02ae5ca 100644
--- a/android/bazel_paths.go
+++ b/android/bazel_paths.go
@@ -378,7 +378,13 @@
if m, tag := SrcIsModuleWithTag(p); m != "" {
l := getOtherModuleLabel(ctx, m, tag, BazelModuleLabel)
if l != nil && !InList(l.Label, expandedExcludes) {
- l.OriginalModuleName = fmt.Sprintf(":%s", m)
+ if strings.HasPrefix(m, "//") {
+ // this is a module in a soong namespace
+ // It appears as //<namespace>:<module_name> in srcs, and not ://<namespace>:<module_name>
+ l.OriginalModuleName = m
+ } else {
+ l.OriginalModuleName = fmt.Sprintf(":%s", m)
+ }
labels.Includes = append(labels.Includes, *l)
}
} else {
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 8368db1..da059eb 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -3870,6 +3870,7 @@
}
`+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
+ variables.KeepVndk = proptools.BoolPtr(true)
}))
ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
})
diff --git a/apex/vndk.go b/apex/vndk.go
index 095e89d..8893240 100644
--- a/apex/vndk.go
+++ b/apex/vndk.go
@@ -103,7 +103,7 @@
}
} else if a, ok := mctx.Module().(*apexBundle); ok && a.vndkApex {
vndkVersion := proptools.StringDefault(a.vndkProperties.Vndk_version, "current")
- mctx.AddDependency(mctx.Module(), prebuiltTag, cc.VndkLibrariesTxtModules(vndkVersion)...)
+ mctx.AddDependency(mctx.Module(), prebuiltTag, cc.VndkLibrariesTxtModules(vndkVersion, mctx)...)
}
}
diff --git a/apex/vndk_test.go b/apex/vndk_test.go
index 21526c3..4327a61 100644
--- a/apex/vndk_test.go
+++ b/apex/vndk_test.go
@@ -51,6 +51,7 @@
`+vndkLibrariesTxtFiles("current"),
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
variables.DeviceVndkVersion = proptools.StringPtr("")
+ variables.KeepVndk = proptools.BoolPtr(true)
}),
)
// VNDK-Lite contains only core variants of VNDK-Sp libraries
diff --git a/bazel/configurability.go b/bazel/configurability.go
index 671e5c1..aa58fdc 100644
--- a/bazel/configurability.go
+++ b/bazel/configurability.go
@@ -76,6 +76,8 @@
NonApex = "non_apex"
ErrorproneDisabled = "errorprone_disabled"
+ // TODO: b/294868620 - Remove when completing the bug
+ SanitizersEnabled = "sanitizers_enabled"
)
func PowerSetWithoutEmptySet[T any](items []T) [][]T {
@@ -223,6 +225,12 @@
ErrorproneDisabled: "//build/bazel/rules/java/errorprone:errorprone_globally_disabled",
ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
}
+
+ // TODO: b/294868620 - Remove when completing the bug
+ sanitizersEnabledMap = map[string]string{
+ SanitizersEnabled: "//build/bazel/rules/cc:sanitizers_enabled",
+ ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
+ }
)
// basic configuration types
@@ -237,6 +245,8 @@
osAndInApex
inApex
errorProneDisabled
+ // TODO: b/294868620 - Remove when completing the bug
+ sanitizersEnabled
)
func osArchString(os string, arch string) string {
@@ -253,6 +263,8 @@
osAndInApex: "os_in_apex",
inApex: "in_apex",
errorProneDisabled: "errorprone_disabled",
+ // TODO: b/294868620 - Remove when completing the bug
+ sanitizersEnabled: "sanitizers_enabled",
}[ct]
}
@@ -287,6 +299,11 @@
if _, ok := errorProneMap[config]; !ok {
panic(fmt.Errorf("Unknown errorprone config: %s", config))
}
+ // TODO: b/294868620 - Remove when completing the bug
+ case sanitizersEnabled:
+ if _, ok := sanitizersEnabledMap[config]; !ok {
+ panic(fmt.Errorf("Unknown sanitizers_enabled config: %s", config))
+ }
default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ct))
}
@@ -318,6 +335,9 @@
return inApexMap[config]
case errorProneDisabled:
return errorProneMap[config]
+ // TODO: b/294868620 - Remove when completing the bug
+ case sanitizersEnabled:
+ return sanitizersEnabledMap[config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ca.configurationType))
}
@@ -338,6 +358,9 @@
InApexAxis = ConfigurationAxis{configurationType: inApex}
ErrorProneAxis = ConfigurationAxis{configurationType: errorProneDisabled}
+
+ // TODO: b/294868620 - Remove when completing the bug
+ SanitizersEnabledAxis = ConfigurationAxis{configurationType: sanitizersEnabled}
)
// ProductVariableConfigurationAxis returns an axis for the given product variable
diff --git a/bazel/properties.go b/bazel/properties.go
index 702c31c..9c63bc0 100644
--- a/bazel/properties.go
+++ b/bazel/properties.go
@@ -194,14 +194,7 @@
// UniqueSortedBazelLabels takes a []Label and deduplicates the labels, and returns
// the slice in a sorted order.
func UniqueSortedBazelLabels(originalLabels []Label) []Label {
- uniqueLabelsSet := make(map[Label]bool)
- for _, l := range originalLabels {
- uniqueLabelsSet[l] = true
- }
- var uniqueLabels []Label
- for l, _ := range uniqueLabelsSet {
- uniqueLabels = append(uniqueLabels, l)
- }
+ uniqueLabels := FirstUniqueBazelLabels(originalLabels)
sort.SliceStable(uniqueLabels, func(i, j int) bool {
return uniqueLabels[i].Label < uniqueLabels[j].Label
})
@@ -210,13 +203,13 @@
func FirstUniqueBazelLabels(originalLabels []Label) []Label {
var labels []Label
- found := make(map[Label]bool, len(originalLabels))
+ found := make(map[string]bool, len(originalLabels))
for _, l := range originalLabels {
- if _, ok := found[l]; ok {
+ if _, ok := found[l.Label]; ok {
continue
}
labels = append(labels, l)
- found[l] = true
+ found[l.Label] = true
}
return labels
}
@@ -433,7 +426,7 @@
switch axis.configurationType {
case noConfig:
la.Value = &value
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if la.ConfigurableValues == nil {
la.ConfigurableValues = make(configurableLabels)
}
@@ -449,7 +442,7 @@
switch axis.configurationType {
case noConfig:
return la.Value
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
return la.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -519,7 +512,7 @@
switch axis.configurationType {
case noConfig:
ba.Value = value
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if ba.ConfigurableValues == nil {
ba.ConfigurableValues = make(configurableBools)
}
@@ -666,7 +659,7 @@
switch axis.configurationType {
case noConfig:
return ba.Value
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, sanitizersEnabled:
if v, ok := ba.ConfigurableValues[axis][config]; ok {
return &v
} else {
@@ -801,7 +794,7 @@
switch axis.configurationType {
case noConfig:
lla.Value = list
- case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled:
+ case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled, sanitizersEnabled:
if lla.ConfigurableValues == nil {
lla.ConfigurableValues = make(configurableLabelLists)
}
@@ -817,7 +810,7 @@
switch axis.configurationType {
case noConfig:
return lla.Value
- case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled:
+ case arch, os, osArch, productVariables, osAndInApex, inApex, errorProneDisabled, sanitizersEnabled:
return lla.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
@@ -1175,7 +1168,7 @@
switch axis.configurationType {
case noConfig:
sa.Value = str
- case arch, os, osArch, productVariables:
+ case arch, os, osArch, productVariables, sanitizersEnabled:
if sa.ConfigurableValues == nil {
sa.ConfigurableValues = make(configurableStrings)
}
@@ -1191,7 +1184,7 @@
switch axis.configurationType {
case noConfig:
return sa.Value
- case arch, os, osArch, productVariables:
+ case arch, os, osArch, productVariables, sanitizersEnabled:
if v, ok := sa.ConfigurableValues[axis][config]; ok {
return v
} else {
@@ -1381,7 +1374,7 @@
switch axis.configurationType {
case noConfig:
sla.Value = list
- case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled:
+ case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled, sanitizersEnabled:
if sla.ConfigurableValues == nil {
sla.ConfigurableValues = make(configurableStringLists)
}
@@ -1397,7 +1390,7 @@
switch axis.configurationType {
case noConfig:
return sla.Value
- case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled:
+ case arch, os, osArch, productVariables, osAndInApex, errorProneDisabled, sanitizersEnabled:
return sla.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
diff --git a/bazel/properties_test.go b/bazel/properties_test.go
index c98ae0e..751cb8b 100644
--- a/bazel/properties_test.go
+++ b/bazel/properties_test.go
@@ -33,8 +33,12 @@
{Label: "b"},
{Label: "a"},
{Label: "c"},
+ // namespaces
+ {Label: "//foo:bar", OriginalModuleName: "bar"}, // when referenced from foo namespace
+ {Label: "//foo:bar", OriginalModuleName: "//foo:bar"}, // when reference from root namespace
},
expectedUniqueLabels: []Label{
+ {Label: "//foo:bar", OriginalModuleName: "bar"},
{Label: "a"},
{Label: "b"},
{Label: "c"},
@@ -194,6 +198,9 @@
{Label: "b"},
{Label: "a"},
{Label: "c"},
+ // namespaces
+ {Label: "//foo:bar", OriginalModuleName: "bar"}, // when referenced from foo namespace
+ {Label: "//foo:bar", OriginalModuleName: "//foo:bar"}, // when referenced from root namespace
},
Excludes: []Label{
{Label: "x"},
@@ -207,6 +214,7 @@
{Label: "a"},
{Label: "b"},
{Label: "c"},
+ {Label: "//foo:bar", OriginalModuleName: "bar"},
},
Excludes: []Label{
{Label: "x"},
diff --git a/bp2build/android_app_conversion_test.go b/bp2build/android_app_conversion_test.go
index d1b4d40..8ed94b4 100644
--- a/bp2build/android_app_conversion_test.go
+++ b/bp2build/android_app_conversion_test.go
@@ -40,6 +40,7 @@
"app.java": "",
"res/res.png": "",
"AndroidManifest.xml": "",
+ "assets/asset.png": "",
},
Blueprint: `
android_app {
@@ -54,6 +55,8 @@
"manifest": `"AndroidManifest.xml"`,
"resource_files": `["res/res.png"]`,
"sdk_version": `"current"`,
+ "assets": `["assets/asset.png"]`,
+ "assets_dir": `"assets"`,
}),
}})
}
@@ -68,6 +71,7 @@
"resa/res.png": "",
"resb/res.png": "",
"manifest/AndroidManifest.xml": "",
+ "assets_/asset.png": "",
},
Blueprint: simpleModuleDoNotConvertBp2build("android_app", "static_lib_dep") + `
android_app {
@@ -81,6 +85,7 @@
java_version: "7",
certificate: "foocert",
required: ["static_lib_dep"],
+ asset_dirs: ["assets_"],
}
`,
ExpectedBazelTargets: []string{
@@ -91,6 +96,8 @@
"resa/res.png",
"resb/res.png",
]`,
+ "assets": `["assets_/asset.png"]`,
+ "assets_dir": `"assets_"`,
"custom_package": `"com.google"`,
"deps": `[":static_lib_dep"]`,
"java_version": `"7"`,
diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go
index d9a7860..90db365 100644
--- a/bp2build/cc_binary_conversion_test.go
+++ b/bp2build/cc_binary_conversion_test.go
@@ -880,8 +880,15 @@
}`,
targets: []testBazelTarget{
{"cc_binary", "foo", AttrNameToString{
+ "copts": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
+ "//conditions:default": [],
+ })`,
+ "additional_compiler_inputs": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
+ "//conditions:default": [],
+ })`,
"local_includes": `["."]`,
- "features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
}},
},
})
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 622ec4a..e70cd10 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -4206,11 +4206,25 @@
`,
ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
- "features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
+ "copts": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
+ "//conditions:default": [],
+ })`,
+ "additional_compiler_inputs": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
+ "//conditions:default": [],
+ })`,
"local_includes": `["."]`,
}),
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
- "features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
+ "copts": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
+ "//conditions:default": [],
+ })`,
+ "additional_compiler_inputs": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
+ "//conditions:default": [],
+ })`,
"local_includes": `["."]`,
}),
},
diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go
index ccb426f..90b13b0 100644
--- a/bp2build/cc_library_shared_conversion_test.go
+++ b/bp2build/cc_library_shared_conversion_test.go
@@ -1225,7 +1225,14 @@
`,
ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
- "features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
+ "copts": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
+ "//conditions:default": [],
+ })`,
+ "additional_compiler_inputs": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
+ "//conditions:default": [],
+ })`,
"local_includes": `["."]`,
}),
},
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index 26baf89..89ec8f9 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -1950,7 +1950,14 @@
`,
ExpectedBazelTargets: []string{
MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
- "features": `["sanitizer_blocklist_foo_blocklist_txt"]`,
+ "copts": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": ["-fsanitize-ignorelist=$(location foo_blocklist.txt)"],
+ "//conditions:default": [],
+ })`,
+ "additional_compiler_inputs": `select({
+ "//build/bazel/rules/cc:sanitizers_enabled": [":foo_blocklist.txt"],
+ "//conditions:default": [],
+ })`,
"local_includes": `["."]`,
}),
},
diff --git a/bp2build/genrule_conversion_test.go b/bp2build/genrule_conversion_test.go
index 5ca8bd7..2a10a14 100644
--- a/bp2build/genrule_conversion_test.go
+++ b/bp2build/genrule_conversion_test.go
@@ -27,6 +27,8 @@
func registerGenruleModuleTypes(ctx android.RegistrationContext) {
ctx.RegisterModuleType("genrule_defaults", func() android.Module { return genrule.DefaultsFactory() })
+ ctx.RegisterModuleType("cc_binary", func() android.Module { return cc.BinaryFactory() })
+ ctx.RegisterModuleType("soong_namespace", func() android.Module { return android.NamespaceFactory() })
}
func runGenruleTestCase(t *testing.T, tc Bp2buildTestCase) {
@@ -913,3 +915,40 @@
})
}
}
+
+func TestGenruleWithModulesInNamespaces(t *testing.T) {
+ bp := `
+genrule {
+ name: "mygenrule",
+ cmd: "echo $(location //mynamespace:mymodule) > $(out)",
+ srcs: ["//mynamespace:mymodule"],
+ out: ["myout"],
+}
+`
+ fs := map[string]string{
+ "mynamespace/Android.bp": `soong_namespace {}`,
+ "mynamespace/dir/Android.bp": `cc_binary {name: "mymodule"}`,
+ }
+ expectedBazelTargets := []string{
+ MakeBazelTargetNoRestrictions("genrule", "mygenrule", AttrNameToString{
+ // The fully qualified soong label is <namespace>:<module_name>
+ // - here the prefix is mynamespace
+ // The fully qualifed bazel label is <package>:<module_name>
+ // - here the prefix is mynamespace/dir, since there is a BUILD file at each level of this FS path
+ "cmd": `"echo $(location //mynamespace/dir:mymodule) > $(OUTS)"`,
+ "outs": `["myout"]`,
+ "srcs": `["//mynamespace/dir:mymodule"]`,
+ }),
+ }
+
+ t.Run("genrule that uses module from a different namespace", func(t *testing.T) {
+ runGenruleTestCase(t, Bp2buildTestCase{
+ Blueprint: bp,
+ Filesystem: fs,
+ ModuleTypeUnderTest: "genrule",
+ ModuleTypeUnderTestFactory: genrule.GenRuleFactory,
+ ExpectedBazelTargets: expectedBazelTargets,
+ })
+ })
+
+}
diff --git a/cc/binary.go b/cc/binary.go
index 5ba33a2..4606b62 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -638,7 +638,8 @@
Stl: baseAttrs.stl,
Cpp_std: baseAttrs.cppStd,
- Additional_linker_inputs: baseAttrs.additionalLinkerInputs,
+ Additional_linker_inputs: baseAttrs.additionalLinkerInputs,
+ Additional_compiler_inputs: baseAttrs.additionalCompilerInputs,
Strip: stripAttributes{
Keep_symbols: baseAttrs.stripKeepSymbols,
@@ -680,10 +681,11 @@
Srcs_c bazel.LabelListAttribute
Srcs_as bazel.LabelListAttribute
- Copts bazel.StringListAttribute
- Cppflags bazel.StringListAttribute
- Conlyflags bazel.StringListAttribute
- Asflags bazel.StringListAttribute
+ Copts bazel.StringListAttribute
+ Cppflags bazel.StringListAttribute
+ Conlyflags bazel.StringListAttribute
+ Asflags bazel.StringListAttribute
+ Additional_compiler_inputs bazel.LabelListAttribute
Deps bazel.LabelListAttribute
Dynamic_deps bazel.LabelListAttribute
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 9d90a5b..0157632 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -65,6 +65,8 @@
Hdrs bazel.LabelListAttribute
Copts bazel.StringListAttribute
+ Additional_compiler_inputs bazel.LabelListAttribute
+
Deps bazel.LabelListAttribute
Implementation_deps bazel.LabelListAttribute
Dynamic_deps bazel.LabelListAttribute
@@ -508,6 +510,8 @@
suffix bazel.StringAttribute
fdoProfile bazel.LabelAttribute
+
+ additionalCompilerInputs bazel.LabelListAttribute
}
type filterOutFn func(string) bool
@@ -1016,13 +1020,25 @@
(&compilerAttrs).localIncludes.Append(rsLocalIncludes)
(&compilerAttrs).localIncludes.Value = android.FirstUniqueStrings(compilerAttrs.localIncludes.Value)
- features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(bp2buildSanitizerFeatures(ctx, module))
+ sanitizerValues := bp2buildSanitizerFeatures(ctx, module)
+
+ features := compilerAttrs.features.Clone().Append(linkerAttrs.features).Append(sanitizerValues.features)
features = features.Append(bp2buildLtoFeatures(ctx, module))
features = features.Append(convertHiddenVisibilityToFeatureBase(ctx, module))
features.DeduplicateAxesFromBase()
+ compilerAttrs.copts = *compilerAttrs.copts.Append(sanitizerValues.copts)
+ compilerAttrs.additionalCompilerInputs = *compilerAttrs.additionalCompilerInputs.Append(sanitizerValues.additionalCompilerInputs)
+
addMuslSystemDynamicDeps(ctx, linkerAttrs)
+ // Dedupe all deps.
+ (&linkerAttrs).deps.Value = bazel.FirstUniqueBazelLabelList((&linkerAttrs).deps.Value)
+ (&linkerAttrs).implementationDeps.Value = bazel.FirstUniqueBazelLabelList((&linkerAttrs).implementationDeps.Value)
+ (&linkerAttrs).implementationDynamicDeps.Value = bazel.FirstUniqueBazelLabelList((&linkerAttrs).implementationDynamicDeps.Value)
+ (&linkerAttrs).wholeArchiveDeps.Value = bazel.FirstUniqueBazelLabelList((&linkerAttrs).wholeArchiveDeps.Value)
+ (&linkerAttrs).implementationWholeArchiveDeps.Value = bazel.FirstUniqueBazelLabelList((&linkerAttrs).implementationWholeArchiveDeps.Value)
+
return baseAttributes{
compilerAttrs,
linkerAttrs,
@@ -1910,8 +1926,16 @@
return attrs
}
-func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {
+type sanitizerValues struct {
+ features bazel.StringListAttribute
+ copts bazel.StringListAttribute
+ additionalCompilerInputs bazel.LabelListAttribute
+}
+
+func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module) sanitizerValues {
sanitizerFeatures := bazel.StringListAttribute{}
+ sanitizerCopts := bazel.StringListAttribute{}
+ sanitizerCompilerInputs := bazel.LabelListAttribute{}
bp2BuildPropParseHelper(ctx, m, &SanitizeProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) {
var features []string
if sanitizerProps, ok := props.(*SanitizeProperties); ok {
@@ -1923,9 +1947,10 @@
}
blocklist := sanitizerProps.Sanitize.Blocklist
if blocklist != nil {
- // Format the blocklist name to be used in a feature name
- blocklistFeatureSuffix := strings.Replace(strings.ToLower(*blocklist), ".", "_", -1)
- features = append(features, "sanitizer_blocklist_"+blocklistFeatureSuffix)
+ // TODO: b/294868620 - Change this not to use the special axis when completing the bug
+ coptValue := fmt.Sprintf("-fsanitize-ignorelist=$(location %s)", *blocklist)
+ sanitizerCopts.SetSelectValue(bazel.SanitizersEnabledAxis, bazel.SanitizersEnabled, []string{coptValue})
+ sanitizerCompilerInputs.SetSelectValue(bazel.SanitizersEnabledAxis, bazel.SanitizersEnabled, bazel.MakeLabelListFromTargetNames([]string{*blocklist}))
}
if sanitizerProps.Sanitize.Cfi != nil && !proptools.Bool(sanitizerProps.Sanitize.Cfi) {
features = append(features, "-android_cfi")
@@ -1938,7 +1963,11 @@
sanitizerFeatures.SetSelectValue(axis, config, features)
}
})
- return sanitizerFeatures
+ return sanitizerValues{
+ features: sanitizerFeatures,
+ copts: sanitizerCopts,
+ additionalCompilerInputs: sanitizerCompilerInputs,
+ }
}
func bp2buildLtoFeatures(ctx android.BazelConversionPathContext, m *Module) bazel.StringListAttribute {
diff --git a/cc/cc_test.go b/cc/cc_test.go
index d95ed3f..7ce0f37 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -654,6 +654,7 @@
config := TestConfig(t.TempDir(), android.Android, nil, bp, nil)
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
config.TestProductVariables.Platform_vndk_version = StringPtr("29")
+ config.TestProductVariables.KeepVndk = BoolPtr(true)
ctx := testCcWithConfig(t, config)
module := ctx.ModuleForTests("llndk.libraries.txt", "android_common")
diff --git a/cc/library.go b/cc/library.go
index df1dbc5..2d4d604 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -349,6 +349,7 @@
Runtime_deps: linkerAttrs.runtimeDeps,
sdkAttributes: bp2BuildParseSdkAttributes(m),
Native_coverage: baseAttributes.Native_coverage,
+ Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
}
includeAttrs := includesAttributes{
@@ -376,6 +377,7 @@
Runtime_deps: linkerAttrs.runtimeDeps,
sdkAttributes: bp2BuildParseSdkAttributes(m),
Native_coverage: baseAttributes.Native_coverage,
+ Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
}
staticTargetAttrs := &bazelCcLibraryStaticAttributes{
@@ -2962,6 +2964,7 @@
sdkAttributes: bp2BuildParseSdkAttributes(module),
Runtime_deps: linkerAttrs.runtimeDeps,
Native_coverage: baseAttributes.Native_coverage,
+ Additional_compiler_inputs: compilerAttrs.additionalCompilerInputs,
}
module.convertTidyAttributes(ctx, &commonAttrs.tidyAttributes)
diff --git a/cc/vndk.go b/cc/vndk.go
index 7a2286e..95a5a4f 100644
--- a/cc/vndk.go
+++ b/cc/vndk.go
@@ -39,25 +39,34 @@
vndkUsingCoreVariantLibrariesTxt = "vndkcorevariant.libraries.txt"
)
-func VndkLibrariesTxtModules(vndkVersion string) []string {
+func VndkLibrariesTxtModules(vndkVersion string, ctx android.BaseModuleContext) []string {
if vndkVersion == "current" {
- return []string{
- llndkLibrariesTxt,
+ result := []string{
vndkCoreLibrariesTxt,
vndkSpLibrariesTxt,
vndkPrivateLibrariesTxt,
vndkProductLibrariesTxt,
}
+
+ // TODO(b/290159430) This part will not be required once deprecation of VNDK
+ // is handled with 'ro.vndk.version' property
+ if !ctx.Config().IsVndkDeprecated() {
+ result = append(result, llndkLibrariesTxt)
+ }
+
+ return result
}
// Snapshot vndks have their own *.libraries.VER.txt files.
// Note that snapshots don't have "vndkcorevariant.libraries.VER.txt"
- return []string{
- insertVndkVersion(llndkLibrariesTxt, vndkVersion),
+ result := []string{
insertVndkVersion(vndkCoreLibrariesTxt, vndkVersion),
insertVndkVersion(vndkSpLibrariesTxt, vndkVersion),
insertVndkVersion(vndkPrivateLibrariesTxt, vndkVersion),
insertVndkVersion(vndkProductLibrariesTxt, vndkVersion),
+ insertVndkVersion(llndkLibrariesTxt, vndkVersion),
}
+
+ return result
}
type VndkProperties struct {
@@ -519,11 +528,15 @@
}
func (txt *vndkLibrariesTxt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- var filename string
- if BoolDefault(txt.properties.Insert_vndk_version, true) {
+ filename := txt.Name()
+
+ shouldInsertVndkVersion := BoolDefault(txt.properties.Insert_vndk_version, true)
+ // llndk.libraries.txt file installed in the system image should not contain version info.
+ if ctx.Config().IsVndkDeprecated() && txt.Name() == llndkLibrariesTxt {
+ shouldInsertVndkVersion = false
+ }
+ if shouldInsertVndkVersion {
filename = insertVndkVersion(txt.Name(), ctx.DeviceConfig().PlatformVndkVersion())
- } else {
- filename = txt.Name()
}
txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath
diff --git a/java/aar.go b/java/aar.go
index 1e38efc..308a48c 100644
--- a/java/aar.go
+++ b/java/aar.go
@@ -23,6 +23,7 @@
"android/soong/android"
"android/soong/bazel"
"android/soong/dexpreopt"
+ "android/soong/ui/metrics/bp2build_metrics_proto"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -1228,6 +1229,8 @@
type bazelAapt struct {
Manifest bazel.Label
Resource_files bazel.LabelListAttribute
+ Assets_dir bazel.StringAttribute
+ Assets bazel.LabelListAttribute
}
type bazelAndroidLibrary struct {
@@ -1242,7 +1245,7 @@
Sdk_version bazel.StringAttribute
}
-func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.TopDownMutatorContext) *bazelAapt {
+func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.TopDownMutatorContext) (*bazelAapt, bool) {
manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
resourceFiles := bazel.LabelList{
@@ -1252,10 +1255,30 @@
files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
resourceFiles.Includes = append(resourceFiles.Includes, files...)
}
+
+ assetsDir := bazel.StringAttribute{}
+ var assets bazel.LabelList
+ for i, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") {
+ if i > 0 {
+ ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "multiple asset_dirs")
+ return &bazelAapt{}, false
+ }
+ // Assets_dirs are relative to the module dir when specified, but if the default in used in
+ // PathsWithOptionalDefaultForModuleSrc, then dir is relative to the top.
+ assetsRelDir, error := filepath.Rel(ctx.ModuleDir(), dir.Rel())
+ if error != nil {
+ assetsRelDir = dir.Rel()
+ }
+ assetsDir.Value = proptools.StringPtr(assetsRelDir)
+ assets = bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir)))
+
+ }
return &bazelAapt{
android.BazelLabelForModuleSrcSingle(ctx, manifest),
bazel.MakeLabelListAttribute(resourceFiles),
- }
+ assetsDir,
+ bazel.MakeLabelListAttribute(assets),
+ }, true
}
func (a *AARImport) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
@@ -1328,6 +1351,10 @@
name := a.Name()
props := AndroidLibraryBazelTargetModuleProperties()
+ aaptAttrs, supported := a.convertAaptAttrsWithBp2Build(ctx)
+ if !supported {
+ return
+ }
ctx.CreateBazelTargetModule(
props,
android.CommonAttributes{Name: name},
@@ -1337,7 +1364,7 @@
Deps: deps,
Exports: depLabels.StaticDeps,
},
- a.convertAaptAttrsWithBp2Build(ctx),
+ aaptAttrs,
},
)
diff --git a/java/app.go b/java/app.go
index e277aed..1d1ea97 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1628,8 +1628,10 @@
deps := depLabels.Deps
deps.Append(depLabels.StaticDeps)
- aapt := a.convertAaptAttrsWithBp2Build(ctx)
-
+ aapt, supported := a.convertAaptAttrsWithBp2Build(ctx)
+ if !supported {
+ return
+ }
certificate, certificateName := android.BazelStringOrLabelFromProp(ctx, a.overridableAppProperties.Certificate)
manifestValues := &manifestValueAttribute{}
diff --git a/java/core-libraries/Android.bp b/java/core-libraries/Android.bp
index de9a82d..4380f4f 100644
--- a/java/core-libraries/Android.bp
+++ b/java/core-libraries/Android.bp
@@ -55,6 +55,19 @@
],
}
+java_api_library {
+ name: "core.current.stubs.from-text",
+ api_surface: "core",
+ api_contributions: [
+ "art.module.public.api.stubs.source.api.contribution",
+ "conscrypt.module.public.api.stubs.source.api.contribution",
+ "i18n.module.public.api.stubs.source.api.contribution",
+ ],
+ libs: [
+ "stub-annotations",
+ ],
+}
+
java_library {
name: "core.current.stubs",
defaults: [
@@ -153,7 +166,6 @@
system_modules: "none",
}
-
// A stubs target containing the parts of the public SDK & @SystemApi(MODULE_LIBRARIES) API
// provided by the core libraries.
//
@@ -265,6 +277,32 @@
],
}
+java_defaults {
+ name: "android_core_platform_stubs_current_contributions",
+ api_surface: "core_platform",
+ api_contributions: [
+ "art.module.public.api.stubs.source.api.contribution",
+ "art.module.public.api.stubs.source.system.api.contribution",
+ "art.module.public.api.stubs.source.module_lib.api.contribution",
+ "conscrypt.module.platform.api.stubs.source.api.contribution",
+ "i18n.module.public.api.stubs.source.api.contribution",
+ ],
+}
+
+java_api_library {
+ name: "legacy.core.platform.api.stubs.from-text",
+ api_surface: "core_platform",
+ defaults: [
+ "android_core_platform_stubs_current_contributions",
+ ],
+ api_contributions: [
+ "legacy.i18n.module.platform.api.stubs.source.api.contribution",
+ ],
+ libs: [
+ "stub-annotations",
+ ],
+}
+
java_library {
name: "legacy.core.platform.api.stubs",
visibility: core_platform_visibility,
@@ -328,6 +366,20 @@
],
}
+java_api_library {
+ name: "stable.core.platform.api.stubs.from-text",
+ api_surface: "core_platform",
+ defaults: [
+ "android_core_platform_stubs_current_contributions",
+ ],
+ api_contributions: [
+ "stable.i18n.module.platform.api.stubs.source.api.contribution",
+ ],
+ libs: [
+ "stub-annotations",
+ ],
+}
+
java_library {
name: "stable.core.platform.api.stubs",
visibility: core_platform_visibility,
diff --git a/python/builder.go b/python/builder.go
index 1066493..2553a77 100644
--- a/python/builder.go
+++ b/python/builder.go
@@ -73,14 +73,14 @@
precompile = pctx.AndroidStaticRule("precompilePython", blueprint.RuleParams{
Command: `LD_LIBRARY_PATH="$ldLibraryPath" ` +
- `PYTHONPATH=$stdlibZip/internal/stdlib ` +
+ `PYTHONPATH=$stdlibZip/internal/$stdlibPkg ` +
`$launcher build/soong/python/scripts/precompile_python.py $in $out`,
CommandDeps: []string{
"$stdlibZip",
"$launcher",
"build/soong/python/scripts/precompile_python.py",
},
- }, "stdlibZip", "launcher", "ldLibraryPath")
+ }, "stdlibZip", "stdlibPkg", "launcher", "ldLibraryPath")
)
func init() {
diff --git a/python/proto.go b/python/proto.go
index 400e72c..ad2b786 100644
--- a/python/proto.go
+++ b/python/proto.go
@@ -19,7 +19,8 @@
)
func genProto(ctx android.ModuleContext, protoFile android.Path, flags android.ProtoFlags) android.Path {
- srcsZipFile := android.PathForModuleGen(ctx, protoFile.Base()+".srcszip")
+ // Using protoFile.Base() would generate duplicate source errors in some cases, so we use Rel() instead
+ srcsZipFile := android.PathForModuleGen(ctx, protoFile.Rel()+".srcszip")
outDir := srcsZipFile.ReplaceExtension(ctx, "tmp")
depFile := srcsZipFile.ReplaceExtension(ctx, "srcszip.d")
diff --git a/python/python.go b/python/python.go
index 8fde638..6c837a8 100644
--- a/python/python.go
+++ b/python/python.go
@@ -169,6 +169,7 @@
getDataPathMappings() []pathMapping
getSrcsZip() android.Path
getPrecompiledSrcsZip() android.Path
+ getPkgPath() string
}
// getSrcsPathMappings gets this module's path mapping of src source path : runfiles destination
@@ -191,6 +192,11 @@
return p.precompiledSrcsZip
}
+// getPkgPath returns the pkg_path value
+func (p *PythonLibraryModule) getPkgPath() string {
+ return String(p.properties.Pkg_path)
+}
+
func (p *PythonLibraryModule) getBaseProperties() *BaseProperties {
return &p.properties
}
@@ -370,7 +376,20 @@
launcherSharedLibDeps = append(launcherSharedLibDeps, "libc++")
case pyVersion3:
- stdLib = "py3-stdlib"
+ var prebuiltStdLib bool
+ if targetForDeps.Os.Bionic() {
+ prebuiltStdLib = false
+ } else if ctx.Config().VendorConfig("cpython3").Bool("force_build_host") {
+ prebuiltStdLib = false
+ } else {
+ prebuiltStdLib = true
+ }
+
+ if prebuiltStdLib {
+ stdLib = "py3-stdlib-prebuilt"
+ } else {
+ stdLib = "py3-stdlib"
+ }
launcherModule = "py3-launcher"
if autorun {
@@ -461,14 +480,19 @@
destToPySrcs := make(map[string]string)
destToPyData := make(map[string]string)
+ // Disable path checks for the stdlib, as it includes a "." in the version string
+ isInternal := proptools.BoolDefault(p.properties.Is_internal, false)
+
for _, s := range expandedSrcs {
if s.Ext() != pyExt && s.Ext() != protoExt {
ctx.PropertyErrorf("srcs", "found non (.py|.proto) file: %q!", s.String())
continue
}
runfilesPath := filepath.Join(pkgPath, s.Rel())
- if err := isValidPythonPath(runfilesPath); err != nil {
- ctx.PropertyErrorf("srcs", err.Error())
+ if !isInternal {
+ if err := isValidPythonPath(runfilesPath); err != nil {
+ ctx.PropertyErrorf("srcs", err.Error())
+ }
}
if !checkForDuplicateOutputPath(ctx, destToPySrcs, runfilesPath, s.String(), p.Name(), p.Name()) {
p.srcsPathMappings = append(p.srcsPathMappings, pathMapping{dest: runfilesPath, src: s})
@@ -591,13 +615,16 @@
// "cross compiling" for device here purely by virtue of host and device python bytecode
// being the same.
var stdLib android.Path
+ var stdLibPkg string
var launcher android.Path
- if ctx.ModuleName() == "py3-stdlib" || ctx.ModuleName() == "py2-stdlib" {
+ if proptools.BoolDefault(p.properties.Is_internal, false) {
stdLib = p.srcsZip
+ stdLibPkg = p.getPkgPath()
} else {
ctx.VisitDirectDepsWithTag(hostStdLibTag, func(module android.Module) {
if dep, ok := module.(pythonDependency); ok {
stdLib = dep.getPrecompiledSrcsZip()
+ stdLibPkg = dep.getPkgPath()
}
})
}
@@ -636,6 +663,7 @@
Description: "Precompile the python sources of " + ctx.ModuleName(),
Args: map[string]string{
"stdlibZip": stdLib.String(),
+ "stdlibPkg": stdLibPkg,
"launcher": launcher.String(),
"ldLibraryPath": strings.Join(ldLibraryPath, ":"),
},
diff --git a/python/tests/par_test.py b/python/tests/par_test.py
index 1e03f16..96b42ae 100644
--- a/python/tests/par_test.py
+++ b/python/tests/par_test.py
@@ -33,6 +33,8 @@
assert_equal("os.path.basename(__file__)", fileName, "par_test.py")
archive = os.path.dirname(__file__)
+major = sys.version_info.major
+minor = sys.version_info.minor
assert_equal("__package__", __package__, "")
assert_equal("sys.argv[0]", sys.argv[0], archive)
@@ -42,10 +44,11 @@
assert_equal("__loader__.archive", __loader__.archive, archive)
assert_equal("site.ENABLE_USER_SITE", site.ENABLE_USER_SITE, None)
-assert_equal("len(sys.path)", len(sys.path), 3)
+assert_equal("len(sys.path)", len(sys.path), 4)
assert_equal("sys.path[0]", sys.path[0], archive)
-assert_equal("sys.path[1]", sys.path[1], os.path.join(archive, "internal"))
-assert_equal("sys.path[2]", sys.path[2], os.path.join(archive, "internal", "stdlib"))
+assert_equal("sys.path[1]", sys.path[1], os.path.join(archive, "internal", f"python{major}{minor}.zip"))
+assert_equal("sys.path[2]", sys.path[2], os.path.join(archive, "internal", f"python{major}.{minor}"))
+assert_equal("sys.path[3]", sys.path[3], os.path.join(archive, "internal", f"python{major}.{minor}", "lib-dynload"))
if os.getenv('ARGTEST', False):
assert_equal("len(sys.argv)", len(sys.argv), 3)
diff --git a/python/tests/py-cmd_test.py b/python/tests/py-cmd_test.py
index c7ba0ab..8aed782 100644
--- a/python/tests/py-cmd_test.py
+++ b/python/tests/py-cmd_test.py
@@ -55,22 +55,22 @@
assert_equal("sys.prefix", sys.prefix, sys.executable)
assert_equal("site.ENABLE_USER_SITE", site.ENABLE_USER_SITE, None)
-if sys.version_info[0] == 2:
+major = sys.version_info.major
+minor = sys.version_info.minor
+
+if major == 2:
assert_equal("len(sys.path)", len(sys.path), 4)
assert_equal("sys.path[0]", sys.path[0], os.path.abspath(os.path.dirname(__file__)))
assert_equal("sys.path[1]", sys.path[1], "/extra")
assert_equal("sys.path[2]", sys.path[2], os.path.join(sys.executable, "internal"))
assert_equal("sys.path[3]", sys.path[3], os.path.join(sys.executable, "internal", "stdlib"))
else:
- assert_equal("len(sys.path)", len(sys.path), 8)
+ assert_equal("len(sys.path)", len(sys.path), 5)
assert_equal("sys.path[0]", sys.path[0], os.path.abspath(os.path.dirname(__file__)))
assert_equal("sys.path[1]", sys.path[1], "/extra")
- assert_equal("sys.path[2]", sys.path[2], os.path.join(sys.executable, 'lib', 'python' + str(sys.version_info[0]) + str(sys.version_info[1]) + '.zip'))
- assert_equal("sys.path[3]", sys.path[3], os.path.join(sys.executable, 'lib', 'python' + str(sys.version_info[0]) + '.' + str(sys.version_info[1]), '..'))
- assert_equal("sys.path[4]", sys.path[4], os.path.join(sys.executable, 'lib', 'python' + str(sys.version_info[0]) + '.' + str(sys.version_info[1])))
- assert_equal("sys.path[5]", sys.path[5], os.path.join(sys.executable, 'lib', 'python' + str(sys.version_info[0]) + '.' + str(sys.version_info[1]), 'lib-dynload'))
- assert_equal("sys.path[6]", sys.path[6], os.path.join(sys.executable, "internal"))
- assert_equal("sys.path[7]", sys.path[7], os.path.join(sys.executable, "internal", "stdlib"))
+ assert_equal("sys.path[2]", sys.path[2], os.path.join(sys.executable, 'internal', 'python' + str(sys.version_info[0]) + str(sys.version_info[1]) + '.zip'))
+ assert_equal("sys.path[3]", sys.path[3], os.path.join(sys.executable, 'internal', 'python' + str(sys.version_info[0]) + '.' + str(sys.version_info[1])))
+ assert_equal("sys.path[4]", sys.path[4], os.path.join(sys.executable, 'internal', 'python' + str(sys.version_info[0]) + '.' + str(sys.version_info[1]), 'lib-dynload'))
if failed:
sys.exit(1)
diff --git a/rust/config/lints.go b/rust/config/lints.go
index ef6b315..9322981 100644
--- a/rust/config/lints.go
+++ b/rust/config/lints.go
@@ -46,6 +46,7 @@
"-A deprecated",
"-D missing-docs",
"-D warnings",
+ "-D unsafe_op_in_unsafe_fn",
}
// Default Clippy lints. These are applied on top of defaultRustcLints.
// It should be assumed that any warning lint will be promoted to a
@@ -55,6 +56,7 @@
"-A clippy::unnecessary-wraps",
"-A clippy::unusual-byte-groupings",
"-A clippy::upper-case-acronyms",
+ "-D clippy::undocumented_unsafe_blocks",
}
// Rust lints for vendor code.
diff --git a/rust/library.go b/rust/library.go
index 3f480a2..419fcfc 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -466,7 +466,15 @@
library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...)
}
if library.shared() {
- flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx))
+ if ctx.Darwin() {
+ flags.LinkFlags = append(
+ flags.LinkFlags,
+ "-dynamic_lib",
+ "-install_name @rpath/"+library.sharedLibFilename(ctx),
+ )
+ } else {
+ flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx))
+ }
}
return flags
diff --git a/rust/rust.go b/rust/rust.go
index dab3532..fc8db86 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -613,6 +613,7 @@
&cc.RustBindgenClangProperties{},
&ClippyProperties{},
&SanitizeProperties{},
+ &fuzz.FuzzProperties{},
)
android.InitDefaultsModule(module)
@@ -1224,6 +1225,11 @@
if _, exists := skipModuleList[depName]; exists {
return
}
+
+ if depTag == android.DarwinUniversalVariantTag {
+ return
+ }
+
if rustDep, ok := dep.(*Module); ok && !rustDep.CcLibraryInterface() {
//Handle Rust Modules
makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName)