HostCross is an attribute of a Target, not OsType

A host target is considered as being cross-compiled when the target
can't run natively on the build machine. For example, linux_glibc/x86_64
is a non-cross target on a standard x86/Linux machine, but is a cross
host on Mac. Previously, whether cross or not was a static attribute of
an OsType. For example, Windows was always considered as cross host,
while linux_bionic was not. This becomes a problem when we support more
host targets like linux_bionic/arm64 which should be cross-host on
standard x86/Linux machines.

This change removes HostCross from the OsClass type and instead adds a
property HostCross to the Target type. When a target is being added, it
is initialized to true when the target can't run natively on the current
build machine.

Bug: 168086242
Test: m
Change-Id: Ic37c8db918873ddf324c86b12b5412952b0f2be2
This commit is contained in:
Jiyong Park
2020-09-14 19:43:17 +09:00
parent d55be35331
commit 1613e5541f
12 changed files with 124 additions and 92 deletions

View File

@@ -578,7 +578,7 @@ var (
Linux = NewOsType("linux_glibc", Host, false)
Darwin = NewOsType("darwin", Host, false)
LinuxBionic = NewOsType("linux_bionic", Host, false)
Windows = NewOsType("windows", HostCross, true)
Windows = NewOsType("windows", Host, true)
Android = NewOsType("android", Device, false)
Fuchsia = NewOsType("fuchsia", Device, false)
@@ -609,7 +609,6 @@ const (
Generic OsClass = iota
Device
Host
HostCross
)
func (class OsClass) String() string {
@@ -620,8 +619,6 @@ func (class OsClass) String() string {
return "device"
case Host:
return "host"
case HostCross:
return "host cross"
default:
panic(fmt.Errorf("unknown class %d", class))
}
@@ -681,6 +678,11 @@ type Target struct {
NativeBridge NativeBridgeSupport
NativeBridgeHostArchName string
NativeBridgeRelativePath string
// HostCross is true when the target cannot run natively on the current build host.
// For example, linux_glibc_x86 returns true on a regular x86/i686/Linux machines, but returns false
// on Mac (different OS), or on 64-bit only i686/Linux machines (unsupported arch).
HostCross bool
}
func (target Target) String() string {
@@ -739,26 +741,15 @@ func osMutator(bpctx blueprint.BottomUpMutatorContext) {
return
}
osClasses := base.OsClassSupported()
var moduleOSList []OsType
for _, os := range OsTypeList {
supportedClass := false
for _, osClass := range osClasses {
if os.Class == osClass {
supportedClass = true
for _, t := range mctx.Config().Targets[os] {
if base.supportsTarget(t, mctx.Config()) {
moduleOSList = append(moduleOSList, os)
break
}
}
if !supportedClass {
continue
}
if len(mctx.Config().Targets[os]) == 0 {
continue
}
moduleOSList = append(moduleOSList, os)
}
if len(moduleOSList) == 0 {
@@ -913,7 +904,7 @@ func archMutator(bpctx blueprint.BottomUpMutatorContext) {
prefer32 := false
if base.prefer32 != nil {
prefer32 = base.prefer32(mctx, base, os.Class)
prefer32 = base.prefer32(mctx, base, os)
}
multilib, extraMultilib := decodeMultilib(base, os.Class)
@@ -964,7 +955,7 @@ func decodeMultilib(base *ModuleBase, class OsClass) (multilib, extraMultilib st
switch class {
case Device:
multilib = String(base.commonProperties.Target.Android.Compile_multilib)
case Host, HostCross:
case Host:
multilib = String(base.commonProperties.Target.Host.Compile_multilib)
}
if multilib == "" {
@@ -1240,7 +1231,7 @@ func (m *ModuleBase) setOSProperties(ctx BottomUpMutatorContext) {
// key: value,
// },
// },
if os.Class == Host || os.Class == HostCross {
if os.Class == Host {
field := "Host"
prefix := "target.host"
m.appendProperties(ctx, genProps, targetProp, field, prefix)
@@ -1280,7 +1271,7 @@ func (m *ModuleBase) setOSProperties(ctx BottomUpMutatorContext) {
prefix := "target." + os.Name
m.appendProperties(ctx, genProps, targetProp, field, prefix)
if (os.Class == Host || os.Class == HostCross) && os != Windows {
if os.Class == Host && os != Windows {
field := "Not_windows"
prefix := "target.not_windows"
m.appendProperties(ctx, genProps, targetProp, field, prefix)
@@ -1508,6 +1499,36 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) {
nativeBridgeRelativePathStr = arch.ArchType.String()
}
// A target is considered as HostCross if it's a host target which can't run natively on
// the currently configured build machine (either because the OS is different or because of
// the unsupported arch)
hostCross := false
if os.Class == Host {
var osSupported bool
if os == BuildOs {
osSupported = true
} else if BuildOs.Linux() && os.Linux() {
// LinuxBionic and Linux are compatible
osSupported = true
} else {
osSupported = false
}
var archSupported bool
if arch.ArchType == Common {
archSupported = true
} else if arch.ArchType.Name == *variables.HostArch {
archSupported = true
} else if variables.HostSecondaryArch != nil && arch.ArchType.Name == *variables.HostSecondaryArch {
archSupported = true
} else {
archSupported = false
}
if !osSupported || !archSupported {
hostCross = true
}
}
targets[os] = append(targets[os],
Target{
Os: os,
@@ -1515,6 +1536,7 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) {
NativeBridge: nativeBridgeEnabled,
NativeBridgeHostArchName: nativeBridgeHostArchNameStr,
NativeBridgeRelativePath: nativeBridgeRelativePathStr,
HostCross: hostCross,
})
}