Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c52c7ba authored by Paul Duffin's avatar Paul Duffin
Browse files

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
parent e1ef4763
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -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 {
+82 −0
Original line number Diff line number Diff line
@@ -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") {