Choose prebuilt or source via an Soong config variable
A simple way to provide fine grained control over the use of a prebuilt
or source module via a Soong config variable.
Bug: 193523070
Test: m nothing
Change-Id: I47ae8ac04fa29156d2e87efd9e60ab995f50ea6d
diff --git a/android/prebuilt.go b/android/prebuilt.go
index f3493bd..e611502 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -61,6 +61,16 @@
// a matching name.
Prefer *bool `android:"arch_variant"`
+ // When specified this names a Soong config variable that controls the prefer property.
+ //
+ // If the value of the named Soong config variable is true then prefer is set to false and vice
+ // versa. If the Soong config variable is not set then it defaults to false, so prefer defaults
+ // to true.
+ //
+ // If specified then the prefer property is ignored in favor of the value of the Soong config
+ // variable.
+ Use_source_config_var *ConfigVarProperties
+
SourceExists bool `blueprint:"mutated"`
UsePrebuilt bool `blueprint:"mutated"`
@@ -68,6 +78,22 @@
PrebuiltRenamedToSource bool `blueprint:"mutated"`
}
+// Properties that can be used to select a Soong config variable.
+type ConfigVarProperties struct {
+ // Allow instances of this struct to be used as a property value in a BpPropertySet.
+ BpPrintableBase
+
+ // The name of the configuration namespace.
+ //
+ // As passed to add_soong_config_namespace in Make.
+ Config_namespace *string
+
+ // The name of the configuration variable.
+ //
+ // As passed to add_soong_config_var_value in Make.
+ Var_name *string
+}
+
type Prebuilt struct {
properties PrebuiltProperties
@@ -364,12 +390,18 @@
return false
}
- // TODO: use p.Properties.Name and ctx.ModuleDir to override preference
- if Bool(p.properties.Prefer) {
+ // If source is not available or is disabled then always use the prebuilt.
+ if source == nil || !source.Enabled() {
return true
}
- return source == nil || !source.Enabled()
+ // If the use_source_config_var property is set then it overrides the prefer property setting.
+ if configVar := p.properties.Use_source_config_var; configVar != nil {
+ return !ctx.Config().VendorConfig(proptools.String(configVar.Config_namespace)).Bool(proptools.String(configVar.Var_name))
+ }
+
+ // TODO: use p.Properties.Name and ctx.ModuleDir to override preference
+ return Bool(p.properties.Prefer)
}
func (p *Prebuilt) SourceExists() bool {
diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go
index 23524a5..dcd77ea 100644
--- a/android/prebuilt_test.go
+++ b/android/prebuilt_test.go
@@ -26,6 +26,7 @@
replaceBp bool // modules is added to default bp boilerplate if false.
modules string
prebuilt []OsType
+ preparer FixturePreparer
}{
{
name: "no prebuilt",
@@ -291,6 +292,86 @@
}`,
prebuilt: []OsType{Android, BuildOs},
},
+ {
+ name: "prebuilt use_source_config_var={acme, use_source} - no var specified",
+ modules: `
+ source {
+ name: "bar",
+ }
+
+ prebuilt {
+ name: "bar",
+ use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
+ srcs: ["prebuilt_file"],
+ }`,
+ // When use_source_env is specified then it will use the prebuilt by default if the environment
+ // variable is not set.
+ prebuilt: []OsType{Android, BuildOs},
+ },
+ {
+ name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=false",
+ modules: `
+ source {
+ name: "bar",
+ }
+
+ prebuilt {
+ name: "bar",
+ use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
+ srcs: ["prebuilt_file"],
+ }`,
+ preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
+ variables.VendorVars = map[string]map[string]string{
+ "acme": {
+ "use_source": "false",
+ },
+ }
+ }),
+ // Setting the environment variable named in use_source_env to false will cause the prebuilt to
+ // be used.
+ prebuilt: []OsType{Android, BuildOs},
+ },
+ {
+ name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=true",
+ modules: `
+ source {
+ name: "bar",
+ }
+
+ prebuilt {
+ name: "bar",
+ use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
+ srcs: ["prebuilt_file"],
+ }`,
+ preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
+ variables.VendorVars = map[string]map[string]string{
+ "acme": {
+ "use_source": "true",
+ },
+ }
+ }),
+ // Setting the environment variable named in use_source_env to true will cause the source to be
+ // used.
+ prebuilt: nil,
+ },
+ {
+ name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=true, no source",
+ modules: `
+ prebuilt {
+ name: "bar",
+ use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
+ srcs: ["prebuilt_file"],
+ }`,
+ preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
+ variables.VendorVars = map[string]map[string]string{
+ "acme": {
+ "use_source": "true",
+ },
+ }
+ }),
+ // Although the environment variable says to use source there is no source available.
+ prebuilt: []OsType{Android, BuildOs},
+ },
}
func TestPrebuilts(t *testing.T) {
@@ -329,6 +410,7 @@
}),
fs.AddToFixture(),
FixtureRegisterWithContext(registerTestPrebuiltModules),
+ OptionalFixturePreparer(test.preparer),
).RunTestWithBp(t, bp)
for _, variant := range result.ModuleVariantsForTests("foo") {