Add InstallBypassMake

Allow modules to mark themselves as InstallBypassMake, which will
cause android.PathForModuleInstall to return a path in $OUT_DIR
instead of $OUT_DIR/soong.  This can be used for modules that
can handle installation to the final location on their own.  The
main blocker for most modules is support for the "required" property,
which requires adding dependencies on the installed location of
other modules.

Bug: 122332855
Test: m checkbuild
Change-Id: I85238d937ff30335167d4b3fec79bbefc734b5e1
This commit is contained in:
Colin Cross
2019-07-29 16:44:46 -07:00
parent 8baf29fb10
commit 607d8587e4
4 changed files with 30 additions and 5 deletions

View File

@@ -689,10 +689,6 @@ func (c *config) DevicePrimaryArchType() ArchType {
return c.Targets[Android][0].Arch.ArchType return c.Targets[Android][0].Arch.ArchType
} }
func (c *config) SkipDeviceInstall() bool {
return c.EmbeddedInMake()
}
func (c *config) SkipMegaDeviceInstall(path string) bool { func (c *config) SkipMegaDeviceInstall(path string) bool {
return Bool(c.Mega_device) && return Bool(c.Mega_device) &&
strings.HasPrefix(path, filepath.Join(c.buildDir, "target", "product")) strings.HasPrefix(path, filepath.Join(c.buildDir, "target", "product"))

View File

@@ -155,6 +155,7 @@ type ModuleContext interface {
InstallInData() bool InstallInData() bool
InstallInSanitizerDir() bool InstallInSanitizerDir() bool
InstallInRecovery() bool InstallInRecovery() bool
InstallBypassMake() bool
RequiredModuleNames() []string RequiredModuleNames() []string
HostRequiredModuleNames() []string HostRequiredModuleNames() []string
@@ -192,6 +193,7 @@ type Module interface {
InstallInData() bool InstallInData() bool
InstallInSanitizerDir() bool InstallInSanitizerDir() bool
InstallInRecovery() bool InstallInRecovery() bool
InstallBypassMake() bool
SkipInstall() SkipInstall()
ExportedToMake() bool ExportedToMake() bool
NoticeFile() OptionalPath NoticeFile() OptionalPath
@@ -837,6 +839,10 @@ func (m *ModuleBase) InstallInRecovery() bool {
return Bool(m.commonProperties.Recovery) return Bool(m.commonProperties.Recovery)
} }
func (m *ModuleBase) InstallBypassMake() bool {
return false
}
func (m *ModuleBase) Owner() string { func (m *ModuleBase) Owner() string {
return String(m.commonProperties.Owner) return String(m.commonProperties.Owner)
} }
@@ -1493,6 +1499,10 @@ func (m *moduleContext) InstallInRecovery() bool {
return m.module.InstallInRecovery() return m.module.InstallInRecovery()
} }
func (m *moduleContext) InstallBypassMake() bool {
return m.module.InstallBypassMake()
}
func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool { func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool {
if m.module.base().commonProperties.SkipInstall { if m.module.base().commonProperties.SkipInstall {
return true return true
@@ -1506,7 +1516,7 @@ func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool {
} }
if m.Device() { if m.Device() {
if m.Config().SkipDeviceInstall() { if m.Config().EmbeddedInMake() && !m.InstallBypassMake() {
return true return true
} }

View File

@@ -46,6 +46,7 @@ type ModuleInstallPathContext interface {
InstallInData() bool InstallInData() bool
InstallInSanitizerDir() bool InstallInSanitizerDir() bool
InstallInRecovery() bool InstallInRecovery() bool
InstallBypassMake() bool
} }
var _ ModuleInstallPathContext = ModuleContext(nil) var _ ModuleInstallPathContext = ModuleContext(nil)
@@ -818,6 +819,17 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath {
return OutputPath{basePath{path, ctx.Config(), ""}} return OutputPath{basePath{path, ctx.Config(), ""}}
} }
// pathForInstallInMakeDir is used by PathForModuleInstall when the module returns true
// for InstallBypassMake to produce an OutputPath that installs to $OUT_DIR instead of
// $OUT_DIR/soong.
func pathForInstallInMakeDir(ctx PathContext, pathComponents ...string) OutputPath {
path, err := validatePath(pathComponents...)
if err != nil {
reportPathError(ctx, err)
}
return OutputPath{basePath{"../" + path, ctx.Config(), ""}}
}
// PathsForOutput returns Paths rooted from buildDir // PathsForOutput returns Paths rooted from buildDir
func PathsForOutput(ctx PathContext, paths []string) WritablePaths { func PathsForOutput(ctx PathContext, paths []string) WritablePaths {
ret := make(WritablePaths, len(paths)) ret := make(WritablePaths, len(paths))
@@ -1123,6 +1135,9 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string
outPaths = append([]string{"debug"}, outPaths...) outPaths = append([]string{"debug"}, outPaths...)
} }
outPaths = append(outPaths, pathComponents...) outPaths = append(outPaths, pathComponents...)
if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() {
return pathForInstallInMakeDir(ctx, outPaths...)
}
return PathForOutput(ctx, outPaths...) return PathForOutput(ctx, outPaths...)
} }

View File

@@ -227,6 +227,10 @@ func (m moduleInstallPathContextImpl) InstallInRecovery() bool {
return m.inRecovery return m.inRecovery
} }
func (m moduleInstallPathContextImpl) InstallBypassMake() bool {
return false
}
func TestPathForModuleInstall(t *testing.T) { func TestPathForModuleInstall(t *testing.T) {
testConfig := TestConfig("", nil) testConfig := TestConfig("", nil)