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

Commit 009a9dc4 authored by Martin Stjernholm's avatar Martin Stjernholm
Browse files

Fall back to the source module for variants that the corresponding

prebuilt doesn't define.

Test: m
Test: "m" on a platform tree with prebuilts/runtime in the manifest
Bug: 151303681
Change-Id: I8e10579c5daa79e82009a0c3060cde76cdf520e9
parent f455d1fb
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
}