From d3ba039f74da29fc3d4184850e6e29acba58057c Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 7 May 2015 14:11:29 -0700 Subject: [PATCH] Separate HostOrDevice out of Arch Take HostOrDevice out of Arch, and put it into AndroidModuleBase instead. Also separate out the host vs. device mutator from ArchMutator. This will make it possible for genrules to depend on a host tool, regardless of which host arches it is compiled for. Change-Id: I22bbfd28b65c3eebdfa101a712f90dd615148dc8 --- cc/cc.go | 11 ++--- cmd/soong_build/main.go | 1 + common/arch.go | 98 +++++++++++++++++++++++++---------------- common/module.go | 25 ++++++++--- 4 files changed, 88 insertions(+), 47 deletions(-) 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)