diff --git a/cc/cc.go b/cc/cc.go index 5d72097b0..a92831223 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -342,10 +342,11 @@ var _ common.AndroidDynamicDepender = (*CCBase)(nil) func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain { arch := ctx.Arch() - factory := toolchainFactories[arch.HostOrDevice][arch.ArchType] + hod := ctx.HostOrDevice() + factory := toolchainFactories[hod][arch.ArchType] if factory == nil { panic(fmt.Sprintf("Toolchain not found for %s arch %q", - arch.HostOrDevice.String(), arch.String())) + hod.String(), arch.String())) } return factory(arch.ArchVariant, arch.CpuVariant) } @@ -471,13 +472,13 @@ func (c *CCBase) collectFlags(ctx common.AndroidModuleContext, toolchain Toolcha flags.GlobalFlags = append(flags.GlobalFlags, toolchain.ClangCflags(), "${commonClangGlobalCflags}", - fmt.Sprintf("${%sClangGlobalCflags}", ctx.Arch().HostOrDevice)) + fmt.Sprintf("${%sClangGlobalCflags}", ctx.HostOrDevice())) } else { flags.CppFlags = append(flags.CppFlags, "${commonGlobalCppflags}") flags.GlobalFlags = append(flags.GlobalFlags, toolchain.Cflags(), "${commonGlobalCflags}", - fmt.Sprintf("${%sGlobalCflags}", ctx.Arch().HostOrDevice)) + fmt.Sprintf("${%sGlobalCflags}", ctx.HostOrDevice())) } if ctx.Device() { @@ -588,7 +589,7 @@ func (c *CCBase) depsToPathsFromList(ctx common.AndroidModuleContext, // of host and device. Ignore the disabled one. return } - if a.HostOrDevice() != ctx.Arch().HostOrDevice { + if a.HostOrDevice() != ctx.HostOrDevice() { ctx.ModuleErrorf("host/device mismatch between %q and %q", ctx.ModuleName(), otherName) return diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index f8c32cbfa..b7c4198ed 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -75,6 +75,7 @@ func main() { ctx.RegisterModuleType("android_app", java.AndroidAppFactory) // Mutators + ctx.RegisterEarlyMutator("host_or_device", common.HostOrDeviceMutator) ctx.RegisterEarlyMutator("arch", common.ArchMutator) ctx.RegisterEarlyMutator("link", cc.LinkageMutator) ctx.RegisterEarlyMutator("test_per_src", cc.TestPerSrcMutator) diff --git a/common/arch.go b/common/arch.go index 38613a06f..2a09ae959 100644 --- a/common/arch.go +++ b/common/arch.go @@ -129,15 +129,14 @@ type archProperties struct { // An Arch indicates a single CPU architecture. type Arch struct { - HostOrDevice HostOrDevice - ArchType ArchType - ArchVariant string - CpuVariant string - Abi string + ArchType ArchType + ArchVariant string + CpuVariant string + Abi string } func (a Arch) String() string { - s := a.HostOrDevice.String() + "_" + a.ArchType.String() + s := a.ArchType.String() if a.ArchVariant != "" { s += "_" + a.ArchVariant } @@ -247,37 +246,60 @@ var hostOrDeviceName = map[HostOrDevice]string{ var ( armArch = Arch{ - HostOrDevice: Device, - ArchType: Arm, - ArchVariant: "armv7-a-neon", - CpuVariant: "cortex-a15", - Abi: "armeabi-v7a", + ArchType: Arm, + ArchVariant: "armv7-a-neon", + CpuVariant: "cortex-a15", + Abi: "armeabi-v7a", } arm64Arch = Arch{ - HostOrDevice: Device, - ArchType: Arm64, - ArchVariant: "armv8-a", - CpuVariant: "denver", - Abi: "arm64-v8a", + ArchType: Arm64, + ArchVariant: "armv8-a", + CpuVariant: "denver", + Abi: "arm64-v8a", } - hostArch = Arch{ - HostOrDevice: Host, - ArchType: X86, + x86Arch = Arch{ + ArchType: X86, } - host64Arch = Arch{ - HostOrDevice: Host, - ArchType: X86_64, + x8664Arch = Arch{ + ArchType: X86_64, } - commonDevice = Arch{ - HostOrDevice: Device, - ArchType: Common, - } - commonHost = Arch{ - HostOrDevice: Host, - ArchType: Common, + commonArch = Arch{ + ArchType: Common, } ) +func HostOrDeviceMutator(mctx blueprint.EarlyMutatorContext) { + var module AndroidModule + var ok bool + if module, ok = mctx.Module().(AndroidModule); !ok { + return + } + + hods := []HostOrDevice{} + + if module.base().HostSupported() { + hods = append(hods, Host) + } + + if module.base().DeviceSupported() { + hods = append(hods, Device) + } + + if len(hods) == 0 { + return + } + + hodNames := []string{} + for _, hod := range hods { + hodNames = append(hodNames, hod.String()) + } + + modules := mctx.CreateVariations(hodNames...) + for i, m := range modules { + m.(AndroidModule).base().SetHostOrDevice(hods[i]) + } +} + func ArchMutator(mctx blueprint.EarlyMutatorContext) { var module AndroidModule var ok bool @@ -290,19 +312,19 @@ func ArchMutator(mctx blueprint.EarlyMutatorContext) { arches := []Arch{} - if module.base().HostSupported() { + if module.base().HostSupported() && module.base().HostOrDevice().Host() { switch module.base().commonProperties.Compile_multilib { case "common": - arches = append(arches, commonHost) + arches = append(arches, commonArch) default: - arches = append(arches, host64Arch) + arches = append(arches, x8664Arch) } } - if module.base().DeviceSupported() { + if module.base().DeviceSupported() && module.base().HostOrDevice().Device() { switch module.base().commonProperties.Compile_multilib { case "common": - arches = append(arches, commonDevice) + arches = append(arches, commonArch) case "both": arches = append(arches, arm64Arch, armArch) case "first", "64": @@ -328,7 +350,7 @@ func ArchMutator(mctx blueprint.EarlyMutatorContext) { for i, m := range modules { m.(AndroidModule).base().SetArch(arches[i]) - m.(AndroidModule).base().setArchProperties(mctx, arches[i]) + m.(AndroidModule).base().setArchProperties(mctx) } } @@ -373,7 +395,10 @@ func InitArchModule(m AndroidModule, defaultMultilib Multilib, } // Rewrite the module's properties structs to contain arch-specific values. -func (a *AndroidModuleBase) setArchProperties(ctx blueprint.EarlyMutatorContext, arch Arch) { +func (a *AndroidModuleBase) setArchProperties(ctx blueprint.EarlyMutatorContext) { + arch := a.commonProperties.CompileArch + hod := a.commonProperties.CompileHostOrDevice + if arch.ArchType == Common { return } @@ -406,7 +431,6 @@ func (a *AndroidModuleBase) setArchProperties(ctx blueprint.EarlyMutatorContext, // key: value, // }, // }, - hod := arch.HostOrDevice a.extendProperties(ctx, "target", hod.FieldLower(), generalPropsValue, reflect.ValueOf(a.archProperties[i].Target).FieldByName(hod.Field()).Elem().Elem()) diff --git a/common/module.go b/common/module.go index d93378854..ef7c63aee 100644 --- a/common/module.go +++ b/common/module.go @@ -32,6 +32,7 @@ var ( type androidBaseContext interface { Arch() Arch + HostOrDevice() HostOrDevice Host() bool Device() bool Darwin() bool @@ -86,6 +87,9 @@ type commonProperties struct { // platform Compile_multilib string + // Set by HostOrDeviceMutator + CompileHostOrDevice HostOrDevice `blueprint:"mutated"` + // Set by ArchMutator CompileArch Arch `blueprint:"mutated"` @@ -196,12 +200,16 @@ func (a *AndroidModuleBase) base() *AndroidModuleBase { return a } +func (a *AndroidModuleBase) SetHostOrDevice(hod HostOrDevice) { + a.commonProperties.CompileHostOrDevice = hod +} + func (a *AndroidModuleBase) SetArch(arch Arch) { a.commonProperties.CompileArch = arch } func (a *AndroidModuleBase) HostOrDevice() HostOrDevice { - return a.commonProperties.CompileArch.HostOrDevice + return a.commonProperties.CompileHostOrDevice } func (a *AndroidModuleBase) HostSupported() bool { @@ -293,6 +301,7 @@ func (a *AndroidModuleBase) DynamicDependencies(ctx blueprint.DynamicDependerMod DynamicDependerModuleContext: ctx, androidBaseContextImpl: androidBaseContextImpl{ arch: a.commonProperties.CompileArch, + hod: a.commonProperties.CompileHostOrDevice, config: ctx.Config().(Config), }, } @@ -309,6 +318,7 @@ func (a *AndroidModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { ModuleContext: ctx, androidBaseContextImpl: androidBaseContextImpl{ arch: a.commonProperties.CompileArch, + hod: a.commonProperties.CompileHostOrDevice, config: ctx.Config().(Config), }, installDeps: a.computeInstallDeps(ctx), @@ -336,6 +346,7 @@ func (a *AndroidModuleBase) GenerateBuildActions(ctx blueprint.ModuleContext) { type androidBaseContextImpl struct { arch Arch + hod HostOrDevice debug bool config Config } @@ -366,16 +377,20 @@ func (a *androidBaseContextImpl) Arch() Arch { return a.arch } +func (a *androidBaseContextImpl) HostOrDevice() HostOrDevice { + return a.hod +} + func (a *androidBaseContextImpl) Host() bool { - return a.arch.HostOrDevice.Host() + return a.hod.Host() } func (a *androidBaseContextImpl) Device() bool { - return a.arch.HostOrDevice.Device() + return a.hod.Device() } func (a *androidBaseContextImpl) Darwin() bool { - return a.arch.HostOrDevice.Host() && runtime.GOOS == "darwin" + return a.hod.Host() && runtime.GOOS == "darwin" } func (a *androidBaseContextImpl) Debug() bool { @@ -391,7 +406,7 @@ func (a *androidModuleContext) InstallFileName(installPath, name, srcPath string config := a.AConfig() var fullInstallPath string - if a.arch.HostOrDevice.Device() { + if a.hod.Device() { // TODO: replace unset with a device name once we have device targeting fullInstallPath = filepath.Join(config.DeviceOut(), "system", installPath, name)