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

Commit 1b2bae1b authored by Martin Stjernholm's avatar Martin Stjernholm Committed by Gerrit Code Review
Browse files

Merge "Fall back to the source module for variants that the corresponding prebuilt doesn't define."

parents 8f37ec82 009a9dc4
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -111,6 +111,8 @@ type BaseModuleContext interface {
	OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{})
	OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag
	OtherModuleExists(name string) bool
	OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool
	OtherModuleReverseDependencyVariantExists(name string) bool
	OtherModuleType(m blueprint.Module) string

	GetDirectDepsWithTag(tag blueprint.DependencyTag) []Module
@@ -1433,6 +1435,12 @@ func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) bluepri
	return b.bp.OtherModuleDependencyTag(m)
}
func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
	return b.bp.OtherModuleDependencyVariantExists(variations, name)
}
func (b *baseModuleContext) OtherModuleReverseDependencyVariantExists(name string) bool {
	return b.bp.OtherModuleReverseDependencyVariantExists(name)
}
func (b *baseModuleContext) OtherModuleType(m blueprint.Module) string {
	return b.bp.OtherModuleType(m)
}
+25 −9
Original line number Diff line number Diff line
@@ -52,6 +52,9 @@ type PrebuiltProperties struct {

	SourceExists bool `blueprint:"mutated"`
	UsePrebuilt  bool `blueprint:"mutated"`

	// Set if the module has been renamed to remove the "prebuilt_" prefix.
	PrebuiltRenamedToSource bool `blueprint:"mutated"`
}

type Prebuilt struct {
@@ -188,25 +191,38 @@ type PrebuiltInterface interface {
}

func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) {
	ctx.BottomUp("prebuilts", PrebuiltMutator).Parallel()
	ctx.BottomUp("prebuilt_rename", PrebuiltRenameMutator).Parallel()
}

func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) {
	ctx.BottomUp("prebuilt_source", PrebuiltSourceDepsMutator).Parallel()
	ctx.TopDown("prebuilt_select", PrebuiltSelectModuleMutator).Parallel()
	ctx.BottomUp("prebuilt_postdeps", PrebuiltPostDepsMutator).Parallel()
}

// PrebuiltMutator ensures that there is always a module with an undecorated name, and marks
// prebuilt modules that have both a prebuilt and a source module.
func PrebuiltMutator(ctx BottomUpMutatorContext) {
// PrebuiltRenameMutator ensures that there always is a module with an
// undecorated name.
func PrebuiltRenameMutator(ctx BottomUpMutatorContext) {
	if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil {
		name := m.base().BaseModuleName()
		if !ctx.OtherModuleExists(name) {
			ctx.Rename(name)
			m.Prebuilt().properties.PrebuiltRenamedToSource = true
		}
	}
}

// PrebuiltSourceDepsMutator adds dependencies to the prebuilt module from the
// corresponding source module, if one exists for the same variant.
func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) {
	if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil {
		p := m.Prebuilt()
		if !p.properties.PrebuiltRenamedToSource {
			name := m.base().BaseModuleName()
		if ctx.OtherModuleExists(name) {
			if ctx.OtherModuleReverseDependencyVariantExists(name) {
				ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name)
				p.properties.SourceExists = true
		} else {
			ctx.Rename(name)
			}
		}
	}
}
+111 −68
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import (
var prebuiltsTests = []struct {
	name     string
	modules  string
	prebuilt bool
	prebuilt []OsClass
}{
	{
		name: "no prebuilt",
@@ -32,7 +32,7 @@ var prebuiltsTests = []struct {
			source {
				name: "bar",
			}`,
		prebuilt: false,
		prebuilt: nil,
	},
	{
		name: "no source prebuilt not preferred",
@@ -42,7 +42,7 @@ var prebuiltsTests = []struct {
				prefer: false,
				srcs: ["prebuilt_file"],
			}`,
		prebuilt: true,
		prebuilt: []OsClass{Device, Host},
	},
	{
		name: "no source prebuilt preferred",
@@ -52,7 +52,7 @@ var prebuiltsTests = []struct {
				prefer: true,
				srcs: ["prebuilt_file"],
			}`,
		prebuilt: true,
		prebuilt: []OsClass{Device, Host},
	},
	{
		name: "prebuilt not preferred",
@@ -66,7 +66,7 @@ var prebuiltsTests = []struct {
				prefer: false,
				srcs: ["prebuilt_file"],
			}`,
		prebuilt: false,
		prebuilt: nil,
	},
	{
		name: "prebuilt preferred",
@@ -80,7 +80,7 @@ var prebuiltsTests = []struct {
				prefer: true,
				srcs: ["prebuilt_file"],
			}`,
		prebuilt: true,
		prebuilt: []OsClass{Device, Host},
	},
	{
		name: "prebuilt no file not preferred",
@@ -93,7 +93,7 @@ var prebuiltsTests = []struct {
				name: "bar",
				prefer: false,
			}`,
		prebuilt: false,
		prebuilt: nil,
	},
	{
		name: "prebuilt no file preferred",
@@ -106,7 +106,7 @@ var prebuiltsTests = []struct {
				name: "bar",
				prefer: true,
			}`,
		prebuilt: false,
		prebuilt: nil,
	},
	{
		name: "prebuilt file from filegroup preferred",
@@ -120,7 +120,40 @@ var prebuiltsTests = []struct {
				prefer: true,
				srcs: [":fg"],
			}`,
		prebuilt: true,
		prebuilt: []OsClass{Device, Host},
	},
	{
		name: "prebuilt module for device only",
		modules: `
			source {
				name: "bar",
			}

			prebuilt {
				name: "bar",
				host_supported: false,
				prefer: true,
				srcs: ["prebuilt_file"],
			}`,
		prebuilt: []OsClass{Device},
	},
	{
		name: "prebuilt file for host only",
		modules: `
			source {
				name: "bar",
			}

			prebuilt {
				name: "bar",
				prefer: true,
				target: {
					linux_glibc: {
						srcs: ["prebuilt_file"],
					},
				},
			}`,
		prebuilt: []OsClass{Host},
	},
}

@@ -138,9 +171,9 @@ func TestPrebuilts(t *testing.T) {
					deps: [":bar"],
				}
				` + test.modules
			config := TestConfig(buildDir, nil, bp, fs)
			config := TestArchConfig(buildDir, nil, bp, fs)

			ctx := NewTestContext()
			ctx := NewTestArchContext()
			registerTestPrebuiltBuildComponents(ctx)
			ctx.RegisterModuleType("filegroup", FileGroupFactory)
			ctx.Register(config)
@@ -150,8 +183,9 @@ func TestPrebuilts(t *testing.T) {
			_, errs = ctx.PrepareBuildActions(config)
			FailIfErrored(t, errs)

			foo := ctx.ModuleForTests("foo", "")

			for _, variant := range ctx.ModuleVariantsForTests("foo") {
				foo := ctx.ModuleForTests("foo", variant)
				t.Run(foo.Module().Target().Os.Class.String(), func(t *testing.T) {
					var dependsOnSourceModule, dependsOnPrebuiltModule bool
					ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
						if _, ok := m.(*sourceModule); ok {
@@ -177,7 +211,14 @@ func TestPrebuilts(t *testing.T) {
						usingPrebuiltFile = true
					}

			if test.prebuilt {
					prebuilt := false
					for _, os := range test.prebuilt {
						if os == foo.Module().Target().Os.Class {
							prebuilt = true
						}
					}

					if prebuilt {
						if !dependsOnPrebuiltModule {
							t.Errorf("doesn't depend on prebuilt module")
						}
@@ -208,6 +249,8 @@ func TestPrebuilts(t *testing.T) {
					}
				})
			}
		})
	}
}

func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
@@ -221,7 +264,7 @@ type prebuiltModule struct {
	ModuleBase
	prebuilt   Prebuilt
	properties struct {
		Srcs []string `android:"path"`
		Srcs []string `android:"path,arch_variant"`
	}
	src Path
}
@@ -230,7 +273,7 @@ func newPrebuiltModule() Module {
	m := &prebuiltModule{}
	m.AddProperties(&m.properties)
	InitPrebuiltModule(m, &m.properties.Srcs)
	InitAndroidModule(m)
	InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
	return m
}

@@ -260,7 +303,7 @@ func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
type sourceModule struct {
	ModuleBase
	properties struct {
		Deps []string `android:"path"`
		Deps []string `android:"path,arch_variant"`
	}
	dependsOnSourceModule, dependsOnPrebuiltModule bool
	deps                                           Paths
@@ -270,7 +313,7 @@ type sourceModule struct {
func newSourceModule() Module {
	m := &sourceModule{}
	m.AddProperties(&m.properties)
	InitAndroidModule(m)
	InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
	return m
}