Use version mutator for NDK
The ndk_api mutator is similar to the version mutator. Move the
ndk_library ndk_api variations into the version mutator instead,
which will help later when consolidating the stubs handling
between NDK, LLDNK and Apex libraries.
Test: No change to build.ninja or Android-${TARGET_PRODUCT}.mk
Change-Id: I51417cf669265762c15f7289e1dc186d017ef4a9
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 899d339..e58a172 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -442,6 +442,11 @@
entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String()
entries.Class = "SHARED_LIBRARIES"
+ if !c.buildStubs() {
+ entries.Disabled = true
+ return
+ }
+
entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) {
path, file := filepath.Split(c.installPath.String())
stem, suffix, _ := android.SplitFileExt(file)
diff --git a/cc/cc.go b/cc/cc.go
index 8235e35..2c5868b 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1978,13 +1978,13 @@
ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
actx.AddVariationDependencies([]blueprint.Variation{
- {Mutator: "ndk_api", Variation: version},
+ {Mutator: "version", Variation: version},
{Mutator: "link", Variation: "shared"},
}, ndkStubDepTag, variantNdkLibs...)
ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
actx.AddVariationDependencies([]blueprint.Variation{
- {Mutator: "ndk_api", Variation: version},
+ {Mutator: "version", Variation: version},
{Mutator: "link", Variation: "shared"},
}, ndkLateStubDepTag, variantLateNdkLibs...)
diff --git a/cc/library.go b/cc/library.go
index a43adbb..fea3002 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -355,6 +355,8 @@
useCoreVariant bool
checkSameCoreVariant bool
+ skipAPIDefine bool
+
// Decorated interfaces
*baseCompiler
*baseLinker
@@ -1197,7 +1199,7 @@
library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...)
}
- if library.buildStubs() {
+ if library.buildStubs() && !library.skipAPIDefine {
library.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + library.stubsVersion())
}
@@ -1613,16 +1615,14 @@
Host() bool
InRamdisk() bool
InRecovery() bool
- UseSdk() bool
}) bool {
- return !module.Host() && !module.InRamdisk() && !module.InRecovery() && !module.UseSdk()
+ return !module.Host() && !module.InRamdisk() && !module.InRecovery()
}
func CanBeVersionVariant(module interface {
Host() bool
InRamdisk() bool
InRecovery() bool
- UseSdk() bool
CcLibraryInterface() bool
Shared() bool
Static() bool
@@ -1648,7 +1648,7 @@
}
}
- if library.CcLibrary() && library.BuildSharedVariant() && len(library.StubsVersions()) > 0 {
+ if library.CcLibrary() && library.BuildSharedVariant() && len(library.StubsVersions()) > 0 && !library.UseSdk() {
versions := library.StubsVersions()
normalizeVersions(mctx, versions)
if mctx.Failed() {
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index 5682d1c..7303b71 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -80,9 +80,6 @@
// https://github.com/android-ndk/ndk/issues/265.
Unversioned_until *string
- // Use via apiLevel on the stubDecorator.
- ApiLevel string `blueprint:"mutated"`
-
// True if this API is not yet ready to be shipped in the NDK. It will be
// available in the platform for testing, but will be excluded from the
// sysroot provided to the NDK proper.
@@ -107,9 +104,7 @@
return stub.apiLevel.GreaterThanOrEqualTo(stub.unversionedUntil)
}
-func generatePerApiVariants(ctx android.BottomUpMutatorContext, m *Module,
- from android.ApiLevel, perSplit func(*Module, android.ApiLevel)) {
-
+func ndkLibraryVersions(ctx android.BottomUpMutatorContext, from android.ApiLevel) []string {
var versions []android.ApiLevel
versionStrs := []string{}
for _, version := range ctx.Config().AllSupportedApiLevels() {
@@ -118,12 +113,20 @@
versionStrs = append(versionStrs, version.String())
}
}
- versions = append(versions, android.FutureApiLevel)
versionStrs = append(versionStrs, android.FutureApiLevel.String())
+ return versionStrs
+}
+
+func generatePerApiVariants(ctx android.BottomUpMutatorContext,
+ from android.ApiLevel, perSplit func(*Module, android.ApiLevel)) {
+
+ versionStrs := ndkLibraryVersions(ctx, from)
modules := ctx.CreateVariations(versionStrs...)
+
for i, module := range modules {
- perSplit(module.(*Module), versions[i])
+ perSplit(module.(*Module), android.ApiLevelOrPanic(ctx, versionStrs[i]))
+
}
}
@@ -143,11 +146,7 @@
ctx.PropertyErrorf("first_version", err.Error())
return
}
- generatePerApiVariants(ctx, m, firstVersion,
- func(m *Module, version android.ApiLevel) {
- m.compiler.(*stubDecorator).properties.ApiLevel =
- version.String()
- })
+ m.SetAllStubsVersions(ndkLibraryVersions(ctx, firstVersion))
} else if m.SplitPerApiLevel() && m.IsSdkVariant() {
if ctx.Os() != android.Android {
return
@@ -157,7 +156,7 @@
ctx.PropertyErrorf("min_sdk_version", err.Error())
return
}
- generatePerApiVariants(ctx, m, from,
+ generatePerApiVariants(ctx, from,
func(m *Module, version android.ApiLevel) {
m.Properties.Sdk_version = StringPtr(version.String())
})
@@ -167,7 +166,7 @@
}
func (this *stubDecorator) initializeProperties(ctx BaseModuleContext) bool {
- this.apiLevel = nativeApiLevelOrPanic(ctx, this.properties.ApiLevel)
+ this.apiLevel = nativeApiLevelOrPanic(ctx, this.stubsVersion())
var err error
this.firstVersion, err = nativeApiLevelFromUser(ctx,
@@ -280,6 +279,11 @@
ctx.PropertyErrorf("symbol_file", "must end with .map.txt")
}
+ if !c.buildStubs() {
+ // NDK libraries have no implementation variant, nothing to do
+ return Objects{}
+ }
+
if !c.initializeProperties(ctx) {
// Emits its own errors, so we don't need to.
return Objects{}
@@ -311,12 +315,18 @@
func (stub *stubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
objs Objects) android.Path {
+ if !stub.buildStubs() {
+ // NDK libraries have no implementation variant, nothing to do
+ return nil
+ }
+
if shouldUseVersionScript(ctx, stub) {
linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String()
flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlag)
flags.LdFlagsDeps = append(flags.LdFlagsDeps, stub.versionScriptPath)
}
+ stub.libraryDecorator.skipAPIDefine = true
return stub.libraryDecorator.link(ctx, flags, deps, objs)
}
diff --git a/cc/ndk_sysroot.go b/cc/ndk_sysroot.go
index 56fd54b..b6733c2 100644
--- a/cc/ndk_sysroot.go
+++ b/cc/ndk_sysroot.go
@@ -131,7 +131,7 @@
}
if m, ok := module.(*Module); ok {
- if installer, ok := m.installer.(*stubDecorator); ok {
+ if installer, ok := m.installer.(*stubDecorator); ok && m.BuildStubs() {
if ctx.Config().ExcludeDraftNdkApis() &&
installer.properties.Draft {
return