From 0c52c7ba63ee6af891a72f0292ca3df7c120b070 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Tue, 6 Jul 2021 17:15:25 +0100 Subject: [PATCH] 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 --- android/prebuilt.go | 38 +++++++++++++++++-- android/prebuilt_test.go | 82 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 3 deletions(-) diff --git a/android/prebuilt.go b/android/prebuilt.go index f3493bd5a..e61150243 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -61,6 +61,16 @@ type PrebuiltProperties struct { // 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 @@ type PrebuiltProperties struct { 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 @@ func (p *Prebuilt) usePrebuilt(ctx TopDownMutatorContext, source Module, prebuil 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 23524a533..dcd77ea46 100644 --- a/android/prebuilt_test.go +++ b/android/prebuilt_test.go @@ -26,6 +26,7 @@ var prebuiltsTests = []struct { replaceBp bool // modules is added to default bp boilerplate if false. modules string prebuilt []OsType + preparer FixturePreparer }{ { name: "no prebuilt", @@ -291,6 +292,86 @@ var prebuiltsTests = []struct { }`, 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 @@ func TestPrebuilts(t *testing.T) { }), fs.AddToFixture(), FixtureRegisterWithContext(registerTestPrebuiltModules), + OptionalFixturePreparer(test.preparer), ).RunTestWithBp(t, bp) for _, variant := range result.ModuleVariantsForTests("foo") {