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

Commit e88944c5 authored by Paul Duffin's avatar Paul Duffin Committed by Gerrit Code Review
Browse files

Merge "Choose prebuilt or source via an Soong config variable"

parents e04058f2 0c52c7ba
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") {