acd5f590af
Background: if a lib has `sdk_version` set, it is mutated into two variants: platform and sdk. The latter is for the inclusion into unbundled APKs which can be installed on older platforms. The former is what is installed to the platform. So far, for unbundled app builds, (1) the platform variant was marked as uninstallable, (2) while the sdk variant was left installable. (1) is causing a problem (b/339262059) when an APEX containing a filesystem module is built as unbundled. The filesystem skips installing the platform variant. (2) is not causing a problem, but is unnecessary because the sdk variant is not something to be installed (on the platform). It is built into the APK via the jni_libs property. It's not considered an installation. This change fixes (1) and (2). For (1), the platform variant is always marked installable even for unbundled build. For (2), the sdk variant is always marked non-installable.. because, again, it's not designed to be installed to the platform. Bug: 339262059 Test: banchan com.android.virt aosp_arm64 UNBUNDLED_BUILD_SDKS_FROM_SOURCE=true m apps_only dist check libc++.so, libcrypto.so are in the microdroid image in the APEX. Change-Id: I8999b724926cd9ab6d56796133e218fefcc1910b
91 lines
3.2 KiB
Go
91 lines
3.2 KiB
Go
// Copyright 2020 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package cc
|
|
|
|
import (
|
|
"android/soong/android"
|
|
"android/soong/genrule"
|
|
)
|
|
|
|
// sdkMutator sets a creates a platform and an SDK variant for modules
|
|
// that set sdk_version, and ignores sdk_version for the platform
|
|
// variant. The SDK variant will be used for embedding in APKs
|
|
// that may be installed on older platforms. Apexes use their own
|
|
// variants that enforce backwards compatibility.
|
|
func sdkMutator(ctx android.BottomUpMutatorContext) {
|
|
if ctx.Os() != android.Android {
|
|
return
|
|
}
|
|
|
|
switch m := ctx.Module().(type) {
|
|
case LinkableInterface:
|
|
ccModule, isCcModule := ctx.Module().(*Module)
|
|
if m.AlwaysSdk() {
|
|
if !m.UseSdk() && !m.SplitPerApiLevel() {
|
|
ctx.ModuleErrorf("UseSdk() must return true when AlwaysSdk is set, did the factory forget to set Sdk_version?")
|
|
}
|
|
modules := ctx.CreateVariations("sdk")
|
|
modules[0].(*Module).Properties.IsSdkVariant = true
|
|
} else if m.UseSdk() || m.SplitPerApiLevel() {
|
|
modules := ctx.CreateVariations("", "sdk")
|
|
|
|
// Clear the sdk_version property for the platform (non-SDK) variant so later code
|
|
// doesn't get confused by it.
|
|
modules[0].(*Module).Properties.Sdk_version = nil
|
|
|
|
// Mark the SDK variant.
|
|
modules[1].(*Module).Properties.IsSdkVariant = true
|
|
|
|
if ctx.Config().UnbundledBuildApps() {
|
|
// For an unbundled apps build, hide the platform variant from Make
|
|
// so that other Make modules don't link against it, but against the
|
|
// SDK variant.
|
|
modules[0].(*Module).Properties.HideFromMake = true
|
|
} else {
|
|
// For a platform build, mark the SDK variant so that it gets a ".sdk" suffix when
|
|
// exposed to Make.
|
|
modules[1].(*Module).Properties.SdkAndPlatformVariantVisibleToMake = true
|
|
}
|
|
// SDK variant never gets installed because the variant is to be embedded in
|
|
// APKs, not to be installed to the platform.
|
|
modules[1].(*Module).Properties.PreventInstall = true
|
|
ctx.AliasVariation("")
|
|
} else {
|
|
if isCcModule {
|
|
// Clear the sdk_version property for modules that don't have an SDK variant so
|
|
// later code doesn't get confused by it.
|
|
ccModule.Properties.Sdk_version = nil
|
|
}
|
|
ctx.CreateVariations("")
|
|
ctx.AliasVariation("")
|
|
}
|
|
case *genrule.Module:
|
|
if p, ok := m.Extra.(*GenruleExtraProperties); ok {
|
|
if String(p.Sdk_version) != "" {
|
|
ctx.CreateVariations("", "sdk")
|
|
} else {
|
|
ctx.CreateVariations("")
|
|
}
|
|
ctx.AliasVariation("")
|
|
}
|
|
case *CcApiVariant:
|
|
ccApiVariant, _ := ctx.Module().(*CcApiVariant)
|
|
if String(ccApiVariant.properties.Variant) == "ndk" {
|
|
ctx.CreateVariations("sdk")
|
|
} else {
|
|
ctx.CreateVariations("")
|
|
}
|
|
}
|
|
}
|