diff --git a/android/Android.bp b/android/Android.bp index 8de0c7650..51c214546 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -35,6 +35,7 @@ bootstrap_go_package { "api_levels.go", "arch.go", "arch_list.go", + "arch_module_context.go", "base_module_context.go", "buildinfo_prop.go", "config.go", diff --git a/android/arch_module_context.go b/android/arch_module_context.go new file mode 100644 index 000000000..3cf4b4115 --- /dev/null +++ b/android/arch_module_context.go @@ -0,0 +1,83 @@ +// Copyright 2024 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package android + +// ArchModuleContext can be embedded in other contexts to provide information about the module set by +// the archMutator. +type ArchModuleContext interface { + Target() Target + TargetPrimary() bool + + // The additional arch specific targets (e.g. 32/64 bit) that this module variant is + // responsible for creating. + MultiTargets() []Target + Arch() Arch + Os() OsType + Host() bool + Device() bool + Darwin() bool + Windows() bool + PrimaryArch() bool +} + +type archModuleContext struct { + // TODO: these should eventually go through a (possibly cached) provider like any other configuration instead + // of being special cased. + os OsType + target Target + targetPrimary bool + multiTargets []Target + primaryArch bool +} + +func (a *archModuleContext) Target() Target { + return a.target +} + +func (a *archModuleContext) TargetPrimary() bool { + return a.targetPrimary +} + +func (a *archModuleContext) MultiTargets() []Target { + return a.multiTargets +} + +func (a *archModuleContext) Arch() Arch { + return a.target.Arch +} + +func (a *archModuleContext) Os() OsType { + return a.os +} + +func (a *archModuleContext) Host() bool { + return a.os.Class == Host +} + +func (a *archModuleContext) Device() bool { + return a.os.Class == Device +} + +func (a *archModuleContext) Darwin() bool { + return a.os == Darwin +} + +func (a *archModuleContext) Windows() bool { + return a.os == Windows +} + +func (b *archModuleContext) PrimaryArch() bool { + return b.primaryArch +} diff --git a/android/base_module_context.go b/android/base_module_context.go index 3dfe1234b..af262aba4 100644 --- a/android/base_module_context.go +++ b/android/base_module_context.go @@ -26,6 +26,7 @@ import ( // instead of a blueprint.Module, plus some extra methods that return Android-specific information // about the current module. type BaseModuleContext interface { + ArchModuleContext EarlyModuleContext blueprintBaseModuleContext() blueprint.BaseModuleContext @@ -204,29 +205,12 @@ type BaseModuleContext interface { // getMissingDependencies returns the list of missing dependencies. // Calling this function prevents adding new dependencies. getMissingDependencies() []string - - Target() Target - TargetPrimary() bool - - // The additional arch specific targets (e.g. 32/64 bit) that this module variant is - // responsible for creating. - MultiTargets() []Target - Arch() Arch - Os() OsType - Host() bool - Device() bool - Darwin() bool - Windows() bool - PrimaryArch() bool } type baseModuleContext struct { bp blueprint.BaseModuleContext earlyModuleContext - os OsType - target Target - multiTargets []Target - targetPrimary bool + archModuleContext walkPath []Module tagPath []blueprint.DependencyTag @@ -561,46 +545,3 @@ func (b *baseModuleContext) GetPathString(skipFirst bool) string { } return sb.String() } - -func (b *baseModuleContext) Target() Target { - return b.target -} - -func (b *baseModuleContext) TargetPrimary() bool { - return b.targetPrimary -} - -func (b *baseModuleContext) MultiTargets() []Target { - return b.multiTargets -} - -func (b *baseModuleContext) Arch() Arch { - return b.target.Arch -} - -func (b *baseModuleContext) Os() OsType { - return b.os -} - -func (b *baseModuleContext) Host() bool { - return b.os.Class == Host -} - -func (b *baseModuleContext) Device() bool { - return b.os.Class == Device -} - -func (b *baseModuleContext) Darwin() bool { - return b.os == Darwin -} - -func (b *baseModuleContext) Windows() bool { - return b.os == Windows -} - -func (b *baseModuleContext) PrimaryArch() bool { - if len(b.config.Targets[b.target.Os]) <= 1 { - return true - } - return b.target.Arch.ArchType == b.config.Targets[b.target.Os][0].Arch.ArchType -} diff --git a/android/module.go b/android/module.go index d8f004c61..02238e5c7 100644 --- a/android/module.go +++ b/android/module.go @@ -1622,14 +1622,31 @@ func (m *ModuleBase) earlyModuleContextFactory(ctx blueprint.EarlyModuleContext) func (m *ModuleBase) baseModuleContextFactory(ctx blueprint.BaseModuleContext) baseModuleContext { return baseModuleContext{ bp: ctx, + archModuleContext: m.archModuleContextFactory(ctx), earlyModuleContext: m.earlyModuleContextFactory(ctx), - os: m.commonProperties.CompileOS, - target: m.commonProperties.CompileTarget, - targetPrimary: m.commonProperties.CompilePrimary, - multiTargets: m.commonProperties.CompileMultiTargets, } } +func (m *ModuleBase) archModuleContextFactory(ctx blueprint.EarlyModuleContext) archModuleContext { + config := ctx.Config().(Config) + target := m.Target() + primaryArch := false + if len(config.Targets[target.Os]) <= 1 { + primaryArch = true + } else { + primaryArch = target.Arch.ArchType == config.Targets[target.Os][0].Arch.ArchType + } + + return archModuleContext{ + os: m.commonProperties.CompileOS, + target: m.commonProperties.CompileTarget, + targetPrimary: m.commonProperties.CompilePrimary, + multiTargets: m.commonProperties.CompileMultiTargets, + primaryArch: primaryArch, + } + +} + func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) { ctx := &moduleContext{ module: m.module, diff --git a/android/paths_test.go b/android/paths_test.go index bf46c34f3..93b9b9a16 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -268,8 +268,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "host binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: hostTarget.Os, - target: hostTarget, + archModuleContext: archModuleContext{ + os: hostTarget.Os, + target: hostTarget, + }, }, }, in: []string{"bin", "my_test"}, @@ -281,8 +283,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "system binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, }, in: []string{"bin", "my_test"}, @@ -293,8 +297,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "vendor binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: socSpecificModule, }, @@ -308,8 +314,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "odm binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: deviceSpecificModule, }, @@ -323,8 +331,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "product binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: productSpecificModule, }, @@ -338,8 +348,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "system_ext binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: systemExtSpecificModule, }, @@ -353,8 +365,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "root binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRoot: true, }, @@ -366,8 +380,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "recovery binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRecovery: true, }, @@ -379,8 +395,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "recovery root binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRecovery: true, inRoot: true, @@ -394,8 +412,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "ramdisk binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRamdisk: true, }, @@ -407,8 +427,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "ramdisk root binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRamdisk: true, inRoot: true, @@ -421,8 +443,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "vendor_ramdisk binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inVendorRamdisk: true, }, @@ -434,8 +458,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "vendor_ramdisk root binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inVendorRamdisk: true, inRoot: true, @@ -448,8 +474,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "debug_ramdisk binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inDebugRamdisk: true, }, @@ -461,8 +489,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "system native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inData: true, }, @@ -474,8 +504,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "vendor native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: socSpecificModule, }, @@ -490,8 +522,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "odm native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: deviceSpecificModule, }, @@ -506,8 +540,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "product native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: productSpecificModule, }, @@ -523,8 +559,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "system_ext native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: systemExtSpecificModule, }, @@ -540,8 +578,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized system binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inSanitizerDir: true, }, @@ -553,8 +593,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized vendor binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: socSpecificModule, }, @@ -569,8 +611,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized odm binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: deviceSpecificModule, }, @@ -585,8 +629,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized product binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: productSpecificModule, }, @@ -602,8 +648,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized system_ext binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: systemExtSpecificModule, }, @@ -619,8 +667,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized system native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inData: true, inSanitizerDir: true, @@ -633,8 +683,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized vendor native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: socSpecificModule, }, @@ -650,8 +702,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized odm native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: deviceSpecificModule, }, @@ -667,8 +721,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized product native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: productSpecificModule, }, @@ -684,8 +740,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "sanitized system_ext native test binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, earlyModuleContext: earlyModuleContext{ kind: systemExtSpecificModule, }, @@ -700,8 +758,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "device testcases", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inTestcases: true, }, @@ -712,8 +772,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "host testcases", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: hostTarget.Os, - target: hostTarget, + archModuleContext: archModuleContext{ + os: hostTarget.Os, + target: hostTarget, + }, }, inTestcases: true, }, @@ -724,8 +786,10 @@ func TestPathForModuleInstall(t *testing.T) { name: "forced host testcases", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inTestcases: true, forceOS: &Linux, @@ -771,8 +835,10 @@ func TestPathForModuleInstallRecoveryAsBoot(t *testing.T) { name: "ramdisk binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inRamdisk: true, inRoot: true, @@ -786,8 +852,10 @@ func TestPathForModuleInstallRecoveryAsBoot(t *testing.T) { name: "vendor_ramdisk binary", ctx: &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, inVendorRamdisk: true, inRoot: true, @@ -821,8 +889,10 @@ func TestBaseDirForInstallPath(t *testing.T) { ctx := &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, } ctx.baseModuleContext.config = testConfig @@ -1491,8 +1561,10 @@ func TestPathRelativeToTop(t *testing.T) { ctx := &testModuleInstallPathContext{ baseModuleContext: baseModuleContext{ - os: deviceTarget.Os, - target: deviceTarget, + archModuleContext: archModuleContext{ + os: deviceTarget.Os, + target: deviceTarget, + }, }, } ctx.baseModuleContext.config = testConfig