diff --git a/android/config.go b/android/config.go index 074dfc729..61370a0c4 100644 --- a/android/config.go +++ b/android/config.go @@ -689,10 +689,6 @@ func (c *config) DevicePrimaryArchType() ArchType { return c.Targets[Android][0].Arch.ArchType } -func (c *config) SkipDeviceInstall() bool { - return c.EmbeddedInMake() -} - func (c *config) SkipMegaDeviceInstall(path string) bool { return Bool(c.Mega_device) && strings.HasPrefix(path, filepath.Join(c.buildDir, "target", "product")) diff --git a/android/module.go b/android/module.go index 138b9cd6a..990a893a7 100644 --- a/android/module.go +++ b/android/module.go @@ -155,6 +155,7 @@ type ModuleContext interface { InstallInData() bool InstallInSanitizerDir() bool InstallInRecovery() bool + InstallBypassMake() bool RequiredModuleNames() []string HostRequiredModuleNames() []string @@ -192,6 +193,7 @@ type Module interface { InstallInData() bool InstallInSanitizerDir() bool InstallInRecovery() bool + InstallBypassMake() bool SkipInstall() ExportedToMake() bool NoticeFile() OptionalPath @@ -837,6 +839,10 @@ func (m *ModuleBase) InstallInRecovery() bool { return Bool(m.commonProperties.Recovery) } +func (m *ModuleBase) InstallBypassMake() bool { + return false +} + func (m *ModuleBase) Owner() string { return String(m.commonProperties.Owner) } @@ -1493,6 +1499,10 @@ func (m *moduleContext) InstallInRecovery() bool { return m.module.InstallInRecovery() } +func (m *moduleContext) InstallBypassMake() bool { + return m.module.InstallBypassMake() +} + func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool { if m.module.base().commonProperties.SkipInstall { return true @@ -1506,7 +1516,7 @@ func (m *moduleContext) skipInstall(fullInstallPath OutputPath) bool { } if m.Device() { - if m.Config().SkipDeviceInstall() { + if m.Config().EmbeddedInMake() && !m.InstallBypassMake() { return true } diff --git a/android/paths.go b/android/paths.go index e3f0544d3..0d999185d 100644 --- a/android/paths.go +++ b/android/paths.go @@ -46,6 +46,7 @@ type ModuleInstallPathContext interface { InstallInData() bool InstallInSanitizerDir() bool InstallInRecovery() bool + InstallBypassMake() bool } var _ ModuleInstallPathContext = ModuleContext(nil) @@ -818,6 +819,17 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath { 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 func PathsForOutput(ctx PathContext, paths []string) WritablePaths { ret := make(WritablePaths, len(paths)) @@ -1123,6 +1135,9 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string outPaths = append([]string{"debug"}, outPaths...) } outPaths = append(outPaths, pathComponents...) + if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() { + return pathForInstallInMakeDir(ctx, outPaths...) + } return PathForOutput(ctx, outPaths...) } diff --git a/android/paths_test.go b/android/paths_test.go index 8286e9a35..f2996bff8 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -227,6 +227,10 @@ func (m moduleInstallPathContextImpl) InstallInRecovery() bool { return m.inRecovery } +func (m moduleInstallPathContextImpl) InstallBypassMake() bool { + return false +} + func TestPathForModuleInstall(t *testing.T) { testConfig := TestConfig("", nil)