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
diff --git a/cc/cc.go b/cc/cc.go
index 5d72097..a928312 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -342,10 +342,11 @@
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 @@
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 @@
// 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 f8c32cb..b7c4198 100644
--- a/cmd/soong_build/main.go
+++ b/cmd/soong_build/main.go
@@ -75,6 +75,7 @@
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 38613a0..2a09ae9 100644
--- a/common/arch.go
+++ b/common/arch.go
@@ -129,15 +129,14 @@
// 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 (
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 @@
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 @@
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 @@
}
// 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 @@
// 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 d933788..ef7c63a 100644
--- a/common/module.go
+++ b/common/module.go
@@ -32,6 +32,7 @@
type androidBaseContext interface {
Arch() Arch
+ HostOrDevice() HostOrDevice
Host() bool
Device() bool
Darwin() bool
@@ -86,6 +87,9 @@
// platform
Compile_multilib string
+ // Set by HostOrDeviceMutator
+ CompileHostOrDevice HostOrDevice `blueprint:"mutated"`
+
// Set by ArchMutator
CompileArch Arch `blueprint:"mutated"`
@@ -196,12 +200,16 @@
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 @@
DynamicDependerModuleContext: ctx,
androidBaseContextImpl: androidBaseContextImpl{
arch: a.commonProperties.CompileArch,
+ hod: a.commonProperties.CompileHostOrDevice,
config: ctx.Config().(Config),
},
}
@@ -309,6 +318,7 @@
ModuleContext: ctx,
androidBaseContextImpl: androidBaseContextImpl{
arch: a.commonProperties.CompileArch,
+ hod: a.commonProperties.CompileHostOrDevice,
config: ctx.Config().(Config),
},
installDeps: a.computeInstallDeps(ctx),
@@ -336,6 +346,7 @@
type androidBaseContextImpl struct {
arch Arch
+ hod HostOrDevice
debug bool
config Config
}
@@ -366,16 +377,20 @@
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 @@
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)