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

Commit 2642bc6d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I9170c7e2,I058201b2,Icf37bb3d

* changes:
  Make filesToInstall return InstallPaths and add it to Module
  Add pathForInstall and InstallPaths
  Add InstallForceOS, fix testcases for host
parents 6f9bfc01 897266ed
Loading
Loading
Loading
Loading
+27 −31
Original line number Diff line number Diff line
@@ -172,6 +172,7 @@ type ModuleContext interface {
	InstallInRecovery() bool
	InstallInRoot() bool
	InstallBypassMake() bool
	InstallForceOS() *OsType

	RequiredModuleNames() []string
	HostRequiredModuleNames() []string
@@ -214,6 +215,7 @@ type Module interface {
	InstallInRecovery() bool
	InstallInRoot() bool
	InstallBypassMake() bool
	InstallForceOS() *OsType
	SkipInstall()
	ExportedToMake() bool
	InitRc() Paths
@@ -242,6 +244,8 @@ type Module interface {
	RequiredModuleNames() []string
	HostRequiredModuleNames() []string
	TargetRequiredModuleNames() []string

	filesToInstall() InstallPaths
}

// Qualified id for a module
@@ -643,7 +647,7 @@ type ModuleBase struct {
	primaryVisibilityProperty visibilityProperty

	noAddressSanitizer bool
	installFiles       Paths
	installFiles       InstallPaths
	checkbuildFiles    Paths
	noticeFiles        Paths

@@ -849,22 +853,20 @@ func (m *ModuleBase) ExportedToMake() bool {
	return m.commonProperties.NamespaceExportedToMake
}

func (m *ModuleBase) computeInstallDeps(
	ctx blueprint.ModuleContext) Paths {
func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {

	result := Paths{}
	var result InstallPaths
	// TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
	ctx.VisitDepsDepthFirstIf(isFileInstaller,
		func(m blueprint.Module) {
			fileInstaller := m.(fileInstaller)
			files := fileInstaller.filesToInstall()
			result = append(result, files...)
	ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
		if a, ok := m.(Module); ok {
			result = append(result, a.filesToInstall()...)
		}
	})

	return result
}

func (m *ModuleBase) filesToInstall() Paths {
func (m *ModuleBase) filesToInstall() InstallPaths {
	return m.installFiles
}

@@ -900,6 +902,10 @@ func (m *ModuleBase) InstallBypassMake() bool {
	return false
}

func (m *ModuleBase) InstallForceOS() *OsType {
	return nil
}

func (m *ModuleBase) Owner() string {
	return String(m.commonProperties.Owner)
}
@@ -948,8 +954,8 @@ func (m *ModuleBase) VintfFragments() Paths {
}

func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
	allInstalledFiles := Paths{}
	allCheckbuildFiles := Paths{}
	var allInstalledFiles InstallPaths
	var allCheckbuildFiles Paths
	ctx.VisitAllModuleVariants(func(module Module) {
		a := module.base()
		allInstalledFiles = append(allInstalledFiles, a.installFiles...)
@@ -968,7 +974,7 @@ func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
		ctx.Build(pctx, BuildParams{
			Rule:      blueprint.Phony,
			Output:    name,
			Implicits: allInstalledFiles,
			Implicits: allInstalledFiles.Paths(),
			Default:   !ctx.Config().EmbeddedInMake(),
		})
		deps = append(deps, name)
@@ -1309,8 +1315,8 @@ func (b *baseModuleContext) GetDirectDepWithTag(name string, tag blueprint.Depen
type moduleContext struct {
	bp blueprint.ModuleContext
	baseModuleContext
	installDeps     Paths
	installFiles    Paths
	installDeps     InstallPaths
	installFiles    InstallPaths
	checkbuildFiles Paths
	module          Module

@@ -1716,6 +1722,10 @@ func (m *moduleContext) InstallBypassMake() bool {
	return m.module.InstallBypassMake()
}

func (m *moduleContext) InstallForceOS() *OsType {
	return m.module.InstallForceOS()
}

func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool {
	if m.module.base().commonProperties.SkipInstall {
		return true
@@ -1759,7 +1769,7 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat

	if !m.skipInstall(fullInstallPath) {

		deps = append(deps, m.installDeps...)
		deps = append(deps, m.installDeps.Paths()...)

		var implicitDeps, orderOnlyDeps Paths

@@ -1840,20 +1850,6 @@ func (m *moduleContext) CheckbuildFile(srcPath Path) {
	m.checkbuildFiles = append(m.checkbuildFiles, srcPath)
}

type fileInstaller interface {
	filesToInstall() Paths
}

func isFileInstaller(m blueprint.Module) bool {
	_, ok := m.(fileInstaller)
	return ok
}

func isAndroidModule(m blueprint.Module) bool {
	_, ok := m.(Module)
	return ok
}

func findStringInSlice(str string, slice []string) int {
	for i, s := range slice {
		if s == str {
+87 −42
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ type ModuleInstallPathContext interface {
	InstallInRecovery() bool
	InstallInRoot() bool
	InstallBypassMake() bool
	InstallForceOS() *OsType
}

var _ ModuleInstallPathContext = ModuleContext(nil)
@@ -1205,22 +1206,40 @@ func (p InstallPath) ToMakePath() InstallPath {
// PathForModuleInstall returns a Path representing the install path for the
// module appended with paths...
func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) InstallPath {
	os := ctx.Os()
	if forceOS := ctx.InstallForceOS(); forceOS != nil {
		os = *forceOS
	}
	partition := modulePartition(ctx, os)

	ret := pathForInstall(ctx, os, partition, ctx.Debug(), pathComponents...)

	if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() {
		ret = ret.ToMakePath()
	}

	return ret
}

func pathForInstall(ctx PathContext, os OsType, partition string, debug bool,
	pathComponents ...string) InstallPath {

	var outPaths []string
	if ctx.Device() {
		partition := modulePartition(ctx)

	if os.Class == Device {
		outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
	} else {
		switch ctx.Os() {
		switch os {
		case Linux:
			outPaths = []string{"host", "linux-x86"}
			outPaths = []string{"host", "linux-x86", partition}
		case LinuxBionic:
			// TODO: should this be a separate top level, or shared with linux-x86?
			outPaths = []string{"host", "linux_bionic-x86"}
			outPaths = []string{"host", "linux_bionic-x86", partition}
		default:
			outPaths = []string{"host", ctx.Os().String() + "-x86"}
			outPaths = []string{"host", os.String() + "-x86", partition}
		}
	}
	if ctx.Debug() {
	if debug {
		outPaths = append([]string{"debug"}, outPaths...)
	}
	outPaths = append(outPaths, pathComponents...)
@@ -1231,9 +1250,6 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string
	}

	ret := InstallPath{basePath{path, ctx.Config(), ""}, ""}
	if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() {
		ret = ret.ToMakePath()
	}

	return ret
}
@@ -1253,12 +1269,14 @@ func InstallPathToOnDevicePath(ctx PathContext, path InstallPath) string {
	return "/" + rel
}

func modulePartition(ctx ModuleInstallPathContext) string {
func modulePartition(ctx ModuleInstallPathContext, os OsType) string {
	var partition string
	if ctx.InstallInTestcases() {
		// "testcases" install directory can be used for host or device modules.
		partition = "testcases"
	} else if os.Class == Device {
		if ctx.InstallInData() {
			partition = "data"
	} else if ctx.InstallInTestcases() {
		partition = "testcases"
		} else if ctx.InstallInRamdisk() {
			if ctx.DeviceConfig().BoardUsesRecoveryAsBoot() {
				partition = "recovery/root/first_stage_ramdisk"
@@ -1291,9 +1309,36 @@ func modulePartition(ctx ModuleInstallPathContext) string {
		if ctx.InstallInSanitizerDir() {
			partition = "data/asan/" + partition
		}
	}
	return partition
}

type InstallPaths []InstallPath

// Paths returns the InstallPaths as a Paths
func (p InstallPaths) Paths() Paths {
	if p == nil {
		return nil
	}
	ret := make(Paths, len(p))
	for i, path := range p {
		ret[i] = path
	}
	return ret
}

// Strings returns the string forms of the install paths.
func (p InstallPaths) Strings() []string {
	if p == nil {
		return nil
	}
	ret := make([]string, len(p))
	for i, path := range p {
		ret[i] = path.String()
	}
	return ret
}

// validateSafePath validates a path that we trust (may contain ninja variables).
// Ensures that each path component does not attempt to leave its component.
func validateSafePath(pathComponents ...string) (string, error) {
+39 −0
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ type moduleInstallPathContextImpl struct {
	inRamdisk      bool
	inRecovery     bool
	inRoot         bool
	forceOS        *OsType
}

func (m moduleInstallPathContextImpl) Config() Config {
@@ -241,6 +242,10 @@ func (m moduleInstallPathContextImpl) InstallBypassMake() bool {
	return false
}

func (m moduleInstallPathContextImpl) InstallForceOS() *OsType {
	return m.forceOS
}

func pathTestConfig(buildDir string) Config {
	return TestConfig(buildDir, nil, "", nil)
}
@@ -598,6 +603,40 @@ func TestPathForModuleInstall(t *testing.T) {
			},
			in:  []string{"nativetest", "my_test"},
			out: "target/product/test_device/data/asan/data/nativetest/my_test",
		}, {
			name: "device testcases",
			ctx: &moduleInstallPathContextImpl{
				baseModuleContext: baseModuleContext{
					os:     deviceTarget.Os,
					target: deviceTarget,
				},
				inTestcases: true,
			},
			in:  []string{"my_test", "my_test_bin"},
			out: "target/product/test_device/testcases/my_test/my_test_bin",
		}, {
			name: "host testcases",
			ctx: &moduleInstallPathContextImpl{
				baseModuleContext: baseModuleContext{
					os:     hostTarget.Os,
					target: hostTarget,
				},
				inTestcases: true,
			},
			in:  []string{"my_test", "my_test_bin"},
			out: "host/linux-x86/testcases/my_test/my_test_bin",
		}, {
			name: "forced host testcases",
			ctx: &moduleInstallPathContextImpl{
				baseModuleContext: baseModuleContext{
					os:     deviceTarget.Os,
					target: deviceTarget,
				},
				inTestcases: true,
				forceOS:     &Linux,
			},
			in:  []string{"my_test", "my_test_bin"},
			out: "host/linux-x86/testcases/my_test/my_test_bin",
		},
	}