diff options
author | 2020-07-11 04:52:24 +0100 | |
---|---|---|
committer | 2020-08-03 21:06:50 +0100 | |
commit | caa47d7eed2f8d3504683e84b514f55fff0f6c0c (patch) | |
tree | 639d6252f4bbee793406ede23e042ec2c6036722 /sdk/update.go | |
parent | 0d333752cfe330e90a00f01356f393b6b4069547 (diff) |
Disable all host OS variants except those explicitly included.
Necessary to avoid problems with implicitly enabled host OS'es, e.g.
linux_glibc getting enabled when we only supply a linux_bionic linker
in runtime-module-host-exports. That will then cause a non-functional
prebuilt to take precedence over source if the prebuilt is preferred.
We don't do this for device since we so far only support a single
device OS (android).
This introduces the notion that SDK member types can be host OS
dependent or not. That way java members with host prebuilts don't get
restricted to a specific host OS.
Test: m nothing
Test: build/soong/scripts/build-aml-prebuilts.sh runtime-module-host-exports
Check that the generated Android.bp correctly disables the bionic
linker prebuilt for linux_glibc.
Test: art/build/apex/runtests.sh
on master-art with an updated runtime SDK snapshot
Test: art/tools/buildbot-build.sh {--host,--target}
on master-art with an updated runtime SDK snapshot
Bug: 160349757
Change-Id: Idad7ef138cdbcbd209d390bf6c10ca8365d4619f
Diffstat (limited to 'sdk/update.go')
-rw-r--r-- | sdk/update.go | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/sdk/update.go b/sdk/update.go index 25d50d217..936696a01 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -262,7 +262,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) andro memberCtx := &memberContext{ctx, builder, memberType, member.name} prebuiltModule := memberType.AddPrebuiltModule(memberCtx, member) - s.createMemberSnapshot(memberCtx, member, prebuiltModule) + s.createMemberSnapshot(memberCtx, member, prebuiltModule.(*bpModule)) } // Create a transformer that will transform an unversioned module into a versioned module. @@ -345,12 +345,37 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) andro snapshotModule.AddProperty("compile_multilib", commonVariantProperties.Compile_multilib) } - // Iterate over the os types in a fixed order. targetPropertySet := snapshotModule.AddPropertySet("target") + + // If host is supported and any member is host OS dependent then disable host + // by default, so that we can enable each host OS variant explicitly. This + // avoids problems with implicitly enabled OS variants when the snapshot is + // used, which might be different from this run (e.g. different build OS). + hasHostOsDependentMember := false + if s.HostSupported() { + for _, memberRef := range memberRefs { + if memberRef.memberType.IsHostOsDependent() { + hasHostOsDependentMember = true + break + } + } + if hasHostOsDependentMember { + hostPropertySet := targetPropertySet.AddPropertySet("host") + hostPropertySet.AddProperty("enabled", false) + } + } + + // Iterate over the os types in a fixed order. for _, osType := range s.getPossibleOsTypes() { if sdkVariant, ok := osTypeToMemberProperties[osType]; ok { osPropertySet := targetPropertySet.AddPropertySet(sdkVariant.Target().Os.Name) + // Enable the variant explicitly when we've disabled it by default on host. + if hasHostOsDependentMember && + (osType.Class == android.Host || osType.Class == android.HostCross) { + osPropertySet.AddProperty("enabled", true) + } + variantProps := variantToProperties[sdkVariant] if variantProps.Compile_multilib != "" && variantProps.Compile_multilib != "both" { osPropertySet.AddProperty("compile_multilib", variantProps.Compile_multilib) @@ -993,9 +1018,12 @@ func (osInfo *osTypeSpecificInfo) addToPropertySet(ctx *memberContext, bpModule var osPropertySet android.BpPropertySet var archPropertySet android.BpPropertySet var archOsPrefix string - if osInfo.Properties.Base().Os_count == 1 { - // There is only one os type present in the variants so don't bother - // with adding target specific properties. + if osInfo.Properties.Base().Os_count == 1 && + (osInfo.osType.Class == android.Device || !ctx.memberType.IsHostOsDependent()) { + // There is only one OS type present in the variants and it shouldn't have a + // variant-specific target. The latter is the case if it's either for device + // where there is only one OS (android), or for host and the member type + // isn't host OS dependent. // Create a structure that looks like: // module_type { @@ -1032,6 +1060,12 @@ func (osInfo *osTypeSpecificInfo) addToPropertySet(ctx *memberContext, bpModule osPropertySet = targetPropertySet.AddPropertySet(osType.Name) archPropertySet = targetPropertySet + // Enable the variant explicitly when we've disabled it by default on host. + if ctx.memberType.IsHostOsDependent() && + (osType.Class == android.Host || osType.Class == android.HostCross) { + osPropertySet.AddProperty("enabled", true) + } + // Arch specific properties need to be added to an os and arch specific // section prefixed with <os>_. archOsPrefix = osType.Name + "_" @@ -1202,7 +1236,7 @@ func (m *memberContext) Name() string { return m.name } -func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule android.BpModule) { +func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) { memberType := member.memberType @@ -1256,6 +1290,18 @@ func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModu // added. targetPropertySet := bpModule.AddPropertySet("target") + // If the member is host OS dependent and has host_supported then disable by + // default and enable each host OS variant explicitly. This avoids problems + // with implicitly enabled OS variants when the snapshot is used, which might + // be different from this run (e.g. different build OS). + if ctx.memberType.IsHostOsDependent() { + hostSupported := bpModule.getValue("host_supported") == true // Missing means false. + if hostSupported { + hostPropertySet := targetPropertySet.AddPropertySet("host") + hostPropertySet.AddProperty("enabled", false) + } + } + // Iterate over the os types in a fixed order. for _, osType := range s.getPossibleOsTypes() { osInfo := osTypeToInfo[osType] |