Merge changes Idc985c52,Ibbbde323,I51417cf6,I9886498d,I195d99c9

* changes:
  Move LLNDK and NDK versionSelectorMutator special cases into versionedInterface
  use version mutator for CRT
  Use version mutator for NDK
  Reuse more of apex stubs implementation for llndk stubs
  Use libraryInterface instead of concrete type asserts for stubs
This commit is contained in:
Colin Cross
2020-10-14 00:20:05 +00:00
committed by Gerrit Code Review
8 changed files with 169 additions and 203 deletions

View File

@@ -442,6 +442,11 @@ func (c *stubDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.
entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String() entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String()
entries.Class = "SHARED_LIBRARIES" entries.Class = "SHARED_LIBRARIES"
if !c.buildStubs() {
entries.Disabled = true
return
}
entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) {
path, file := filepath.Split(c.installPath.String()) path, file := filepath.Split(c.installPath.String())
stem, suffix, _ := android.SplitFileExt(file) stem, suffix, _ := android.SplitFileExt(file)

137
cc/cc.go
View File

@@ -45,7 +45,6 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) {
ctx.BottomUp("sdk", sdkMutator).Parallel() ctx.BottomUp("sdk", sdkMutator).Parallel()
ctx.BottomUp("vndk", VndkMutator).Parallel() ctx.BottomUp("vndk", VndkMutator).Parallel()
ctx.BottomUp("link", LinkageMutator).Parallel() ctx.BottomUp("link", LinkageMutator).Parallel()
ctx.BottomUp("ndk_api", NdkApiMutator).Parallel()
ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel() ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
ctx.BottomUp("version_selector", versionSelectorMutator).Parallel() ctx.BottomUp("version_selector", versionSelectorMutator).Parallel()
ctx.BottomUp("version", versionMutator).Parallel() ctx.BottomUp("version", versionMutator).Parallel()
@@ -718,14 +717,9 @@ func (c *Module) AlwaysSdk() bool {
return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only) return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
} }
func (c *Module) StubsVersions() []string { func (c *Module) StubsVersions(ctx android.BaseMutatorContext) []string {
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { return versioned.stubsVersions(ctx)
return library.Properties.Stubs.Versions
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return library.Properties.Stubs.Versions
}
} }
panic(fmt.Errorf("StubsVersions called on non-library module: %q", c.BaseModuleName())) panic(fmt.Errorf("StubsVersions called on non-library module: %q", c.BaseModuleName()))
} }
@@ -754,100 +748,48 @@ func (c *Module) NonCcVariants() bool {
} }
func (c *Module) SetBuildStubs() { func (c *Module) SetBuildStubs() {
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { versioned.setBuildStubs()
library.MutatedProperties.BuildStubs = true c.Properties.HideFromMake = true
c.Properties.HideFromMake = true c.sanitize = nil
c.sanitize = nil c.stl = nil
c.stl = nil c.Properties.PreventInstall = true
c.Properties.PreventInstall = true return
return
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
library.MutatedProperties.BuildStubs = true
c.Properties.HideFromMake = true
c.sanitize = nil
c.stl = nil
c.Properties.PreventInstall = true
return
}
if _, ok := c.linker.(*llndkStubDecorator); ok {
c.Properties.HideFromMake = true
return
}
} }
panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName())) panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName()))
} }
func (c *Module) BuildStubs() bool { func (c *Module) BuildStubs() bool {
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { return versioned.buildStubs()
return library.buildStubs()
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return library.buildStubs()
}
} }
panic(fmt.Errorf("BuildStubs called on non-library module: %q", c.BaseModuleName())) panic(fmt.Errorf("BuildStubs called on non-library module: %q", c.BaseModuleName()))
} }
func (c *Module) SetAllStubsVersions(versions []string) { func (c *Module) SetAllStubsVersions(versions []string) {
if library, ok := c.linker.(*libraryDecorator); ok { if versioned, ok := c.linker.(versionedInterface); ok {
library.MutatedProperties.AllStubsVersions = versions versioned.setAllStubsVersions(versions)
return
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
library.MutatedProperties.AllStubsVersions = versions
return
}
if llndk, ok := c.linker.(*llndkStubDecorator); ok {
llndk.libraryDecorator.MutatedProperties.AllStubsVersions = versions
return
} }
} }
func (c *Module) AllStubsVersions() []string { func (c *Module) AllStubsVersions() []string {
if library, ok := c.linker.(*libraryDecorator); ok { if versioned, ok := c.linker.(versionedInterface); ok {
return library.MutatedProperties.AllStubsVersions return versioned.allStubsVersions()
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return library.MutatedProperties.AllStubsVersions
}
if llndk, ok := c.linker.(*llndkStubDecorator); ok {
return llndk.libraryDecorator.MutatedProperties.AllStubsVersions
} }
return nil return nil
} }
func (c *Module) SetStubsVersion(version string) { func (c *Module) SetStubsVersion(version string) {
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { versioned.setStubsVersion(version)
library.MutatedProperties.StubsVersion = version return
return
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
library.MutatedProperties.StubsVersion = version
return
}
if llndk, ok := c.linker.(*llndkStubDecorator); ok {
llndk.libraryDecorator.MutatedProperties.StubsVersion = version
return
}
} }
panic(fmt.Errorf("SetStubsVersion called on non-library module: %q", c.BaseModuleName())) panic(fmt.Errorf("SetStubsVersion called on non-library module: %q", c.BaseModuleName()))
} }
func (c *Module) StubsVersion() string { func (c *Module) StubsVersion() string {
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { return versioned.stubsVersion()
return library.MutatedProperties.StubsVersion
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return library.MutatedProperties.StubsVersion
}
if llndk, ok := c.linker.(*llndkStubDecorator); ok {
return llndk.libraryDecorator.MutatedProperties.StubsVersion
}
} }
panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName())) panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName()))
} }
@@ -1085,22 +1027,15 @@ func (c *Module) getVndkExtendsModuleName() string {
} }
func (c *Module) IsStubs() bool { func (c *Module) IsStubs() bool {
if library, ok := c.linker.(*libraryDecorator); ok { if versioned, ok := c.linker.(versionedInterface); ok {
return library.buildStubs() return versioned.buildStubs()
} else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return library.buildStubs()
} else if _, ok := c.linker.(*llndkStubDecorator); ok {
return true
} }
return false return false
} }
func (c *Module) HasStubsVariants() bool { func (c *Module) HasStubsVariants() bool {
if library, ok := c.linker.(*libraryDecorator); ok { if versioned, ok := c.linker.(versionedInterface); ok {
return len(library.Properties.Stubs.Versions) > 0 return versioned.hasStubsVariants()
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
return len(library.Properties.Stubs.Versions) > 0
} }
return false return false
} }
@@ -1752,7 +1687,7 @@ func GetCrtVariations(ctx android.BottomUpMutatorContext,
if m.UseSdk() { if m.UseSdk() {
return []blueprint.Variation{ return []blueprint.Variation{
{Mutator: "sdk", Variation: "sdk"}, {Mutator: "sdk", Variation: "sdk"},
{Mutator: "ndk_api", Variation: m.SdkVersion()}, {Mutator: "version", Variation: m.SdkVersion()},
} }
} }
return []blueprint.Variation{ return []blueprint.Variation{
@@ -1872,16 +1807,9 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
} }
buildStubs := false buildStubs := false
if c.linker != nil { if versioned, ok := c.linker.(versionedInterface); ok {
if library, ok := c.linker.(*libraryDecorator); ok { if versioned.buildStubs() {
if library.buildStubs() { buildStubs = true
buildStubs = true
}
}
if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
if library.buildStubs() {
buildStubs = true
}
} }
} }
@@ -2025,11 +1953,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
actx.AddDependency(c, depTag, gen) actx.AddDependency(c, depTag, gen)
} }
actx.AddVariationDependencies(nil, objDepTag, deps.ObjFiles...)
vendorSnapshotObjects := vendorSnapshotObjects(actx.Config()) vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
crtVariations := GetCrtVariations(ctx, c) crtVariations := GetCrtVariations(ctx, c)
actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
if deps.CrtBegin != "" { if deps.CrtBegin != "" {
actx.AddVariationDependencies(crtVariations, CrtBeginDepTag, actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects)) rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
@@ -2049,13 +1976,13 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version} ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
actx.AddVariationDependencies([]blueprint.Variation{ actx.AddVariationDependencies([]blueprint.Variation{
{Mutator: "ndk_api", Variation: version}, {Mutator: "version", Variation: version},
{Mutator: "link", Variation: "shared"}, {Mutator: "link", Variation: "shared"},
}, ndkStubDepTag, variantNdkLibs...) }, ndkStubDepTag, variantNdkLibs...)
ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version} ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
actx.AddVariationDependencies([]blueprint.Variation{ actx.AddVariationDependencies([]blueprint.Variation{
{Mutator: "ndk_api", Variation: version}, {Mutator: "version", Variation: version},
{Mutator: "link", Variation: "shared"}, {Mutator: "link", Variation: "shared"},
}, ndkLateStubDepTag, variantLateNdkLibs...) }, ndkLateStubDepTag, variantLateNdkLibs...)

View File

@@ -349,7 +349,7 @@ type libraryDecorator struct {
// Location of the file that should be copied to dist dir when requested // Location of the file that should be copied to dist dir when requested
distFile android.Path distFile android.Path
versionScriptPath android.ModuleGenPath versionScriptPath android.OptionalPath
post_install_cmds []string post_install_cmds []string
@@ -358,6 +358,8 @@ type libraryDecorator struct {
useCoreVariant bool useCoreVariant bool
checkSameCoreVariant bool checkSameCoreVariant bool
skipAPIDefine bool
// Decorated interfaces // Decorated interfaces
*baseCompiler *baseCompiler
*baseLinker *baseLinker
@@ -611,7 +613,7 @@ func (library *libraryDecorator) shouldCreateSourceAbiDump(ctx ModuleContext) bo
func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
if library.buildStubs() { if library.buildStubs() {
objs, versionScript := compileStubLibrary(ctx, flags, String(library.Properties.Stubs.Symbol_file), library.MutatedProperties.StubsVersion, "--apex") objs, versionScript := compileStubLibrary(ctx, flags, String(library.Properties.Stubs.Symbol_file), library.MutatedProperties.StubsVersion, "--apex")
library.versionScriptPath = versionScript library.versionScriptPath = android.OptionalPathForPath(versionScript)
return objs return objs
} }
@@ -661,6 +663,8 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa
} }
type libraryInterface interface { type libraryInterface interface {
versionedInterface
static() bool static() bool
shared() bool shared() bool
objs() Objects objs() Objects
@@ -681,6 +685,21 @@ type libraryInterface interface {
availableFor(string) bool availableFor(string) bool
} }
type versionedInterface interface {
buildStubs() bool
setBuildStubs()
hasStubsVariants() bool
setStubsVersion(string)
stubsVersion() string
stubsVersions(ctx android.BaseMutatorContext) []string
setAllStubsVersions([]string)
allStubsVersions() []string
}
var _ libraryInterface = (*libraryDecorator)(nil)
var _ versionedInterface = (*libraryDecorator)(nil)
func (library *libraryDecorator) getLibNameHelper(baseModuleName string, useVndk bool) string { func (library *libraryDecorator) getLibNameHelper(baseModuleName string, useVndk bool) string {
name := library.libName name := library.libName
if name == "" { if name == "" {
@@ -916,10 +935,10 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext,
linkerDeps = append(linkerDeps, forceWeakSymbols.Path()) linkerDeps = append(linkerDeps, forceWeakSymbols.Path())
} }
} }
if library.buildStubs() { if library.versionScriptPath.Valid() {
linkerScriptFlags := "-Wl,--version-script," + library.versionScriptPath.String() linkerScriptFlags := "-Wl,--version-script," + library.versionScriptPath.String()
flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlags) flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlags)
linkerDeps = append(linkerDeps, library.versionScriptPath) linkerDeps = append(linkerDeps, library.versionScriptPath.Path())
} }
fileName := library.getLibName(ctx) + flags.Toolchain.ShlibSuffix() fileName := library.getLibName(ctx) + flags.Toolchain.ShlibSuffix()
@@ -1185,8 +1204,8 @@ func (library *libraryDecorator) link(ctx ModuleContext,
library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...) library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...)
} }
if library.buildStubs() { if library.buildStubs() && !library.skipAPIDefine {
library.reexportFlags("-D" + versioningMacroName(ctx.ModuleName()) + "=" + library.stubsVersion()) library.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + library.stubsVersion())
} }
library.flagExporter.setProvider(ctx) library.flagExporter.setProvider(ctx)
@@ -1353,10 +1372,34 @@ func (library *libraryDecorator) symbolFileForAbiCheck(ctx ModuleContext) *strin
return nil return nil
} }
func (library *libraryDecorator) hasStubsVariants() bool {
return len(library.Properties.Stubs.Versions) > 0
}
func (library *libraryDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
return library.Properties.Stubs.Versions
}
func (library *libraryDecorator) setStubsVersion(version string) {
library.MutatedProperties.StubsVersion = version
}
func (library *libraryDecorator) stubsVersion() string { func (library *libraryDecorator) stubsVersion() string {
return library.MutatedProperties.StubsVersion return library.MutatedProperties.StubsVersion
} }
func (library *libraryDecorator) setBuildStubs() {
library.MutatedProperties.BuildStubs = true
}
func (library *libraryDecorator) setAllStubsVersions(versions []string) {
library.MutatedProperties.AllStubsVersions = versions
}
func (library *libraryDecorator) allStubsVersions() []string {
return library.MutatedProperties.AllStubsVersions
}
func (library *libraryDecorator) isLatestStubVersion() bool { func (library *libraryDecorator) isLatestStubVersion() bool {
versions := library.Properties.Stubs.Versions versions := library.Properties.Stubs.Versions
return versions[len(versions)-1] == library.stubsVersion() return versions[len(versions)-1] == library.stubsVersion()
@@ -1573,20 +1616,33 @@ func createVersionVariations(mctx android.BottomUpMutatorContext, versions []str
mctx.CreateAliasVariation("latest", latestVersion) mctx.CreateAliasVariation("latest", latestVersion)
} }
func createPerApiVersionVariations(mctx android.BottomUpMutatorContext, minSdkVersion string) {
from, err := nativeApiLevelFromUser(mctx, minSdkVersion)
if err != nil {
mctx.PropertyErrorf("min_sdk_version", err.Error())
return
}
versionStrs := ndkLibraryVersions(mctx, from)
modules := mctx.CreateLocalVariations(versionStrs...)
for i, module := range modules {
module.(*Module).Properties.Sdk_version = StringPtr(versionStrs[i])
}
}
func CanBeOrLinkAgainstVersionVariants(module interface { func CanBeOrLinkAgainstVersionVariants(module interface {
Host() bool Host() bool
InRamdisk() bool InRamdisk() bool
InRecovery() bool InRecovery() bool
UseSdk() bool
}) bool { }) bool {
return !module.Host() && !module.InRamdisk() && !module.InRecovery() && !module.UseSdk() return !module.Host() && !module.InRamdisk() && !module.InRecovery()
} }
func CanBeVersionVariant(module interface { func CanBeVersionVariant(module interface {
Host() bool Host() bool
InRamdisk() bool InRamdisk() bool
InRecovery() bool InRecovery() bool
UseSdk() bool
CcLibraryInterface() bool CcLibraryInterface() bool
Shared() bool Shared() bool
Static() bool Static() bool
@@ -1599,27 +1655,18 @@ func CanBeVersionVariant(module interface {
// and propagates the value from implementation libraries to llndk libraries with the same name. // and propagates the value from implementation libraries to llndk libraries with the same name.
func versionSelectorMutator(mctx android.BottomUpMutatorContext) { func versionSelectorMutator(mctx android.BottomUpMutatorContext) {
if library, ok := mctx.Module().(LinkableInterface); ok && CanBeVersionVariant(library) { if library, ok := mctx.Module().(LinkableInterface); ok && CanBeVersionVariant(library) {
if library.CcLibrary() && library.BuildSharedVariant() && len(library.StubsVersions()) > 0 { if library.CcLibraryInterface() && library.BuildSharedVariant() {
versions := library.StubsVersions(mctx)
versions := library.StubsVersions() if len(versions) > 0 {
normalizeVersions(mctx, versions) normalizeVersions(mctx, versions)
if mctx.Failed() { if mctx.Failed() {
return
}
// Set the versions on the pre-mutated module so they can be read by any llndk modules that
// depend on the implementation library and haven't been mutated yet.
library.SetAllStubsVersions(versions)
return return
} }
// Set the versions on the pre-mutated module so they can be read by any llndk modules that
// depend on the implementation library and haven't been mutated yet.
library.SetAllStubsVersions(versions)
return
}
if c, ok := library.(*Module); ok && c.IsStubs() {
// Get the versions from the implementation module.
impls := mctx.GetDirectDepsWithTag(llndkImplDep)
if len(impls) > 1 {
panic(fmt.Errorf("Expected single implmenetation library, got %d", len(impls)))
} else if len(impls) == 1 {
c.SetAllStubsVersions(impls[0].(*Module).AllStubsVersions())
}
} }
} }
} }
@@ -1629,6 +1676,16 @@ func versionSelectorMutator(mctx android.BottomUpMutatorContext) {
func versionMutator(mctx android.BottomUpMutatorContext) { func versionMutator(mctx android.BottomUpMutatorContext) {
if library, ok := mctx.Module().(LinkableInterface); ok && CanBeVersionVariant(library) { if library, ok := mctx.Module().(LinkableInterface); ok && CanBeVersionVariant(library) {
createVersionVariations(mctx, library.AllStubsVersions()) createVersionVariations(mctx, library.AllStubsVersions())
return
}
if m, ok := mctx.Module().(*Module); ok {
if m.SplitPerApiLevel() && m.IsSdkVariant() {
if mctx.Os() != android.Android {
return
}
createPerApiVersionVariations(mctx, m.MinSdkVersion())
}
} }
} }

View File

@@ -16,7 +16,7 @@ type LinkableInterface interface {
NonCcVariants() bool NonCcVariants() bool
StubsVersions() []string StubsVersions(android.BaseMutatorContext) []string
BuildStubs() bool BuildStubs() bool
SetBuildStubs() SetBuildStubs()
SetStubsVersion(string) SetStubsVersion(string)

View File

@@ -15,17 +15,14 @@
package cc package cc
import ( import (
"fmt"
"path/filepath" "path/filepath"
"strings" "strings"
"android/soong/android" "android/soong/android"
"github.com/google/blueprint"
) )
var llndkImplDep = struct { var llndkImplDep = dependencyTag{name: "llndk impl"}
blueprint.DependencyTag
}{}
var ( var (
llndkLibrarySuffix = ".llndk" llndkLibrarySuffix = ".llndk"
@@ -72,9 +69,6 @@ type llndkStubDecorator struct {
Properties llndkLibraryProperties Properties llndkLibraryProperties
exportHeadersTimestamp android.OptionalPath
versionScriptPath android.ModuleGenPath
movedToApex bool movedToApex bool
} }
@@ -93,7 +87,9 @@ func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps Pat
vndkVer = stub.stubsVersion() vndkVer = stub.stubsVersion()
} }
objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndkVer, "--llndk") objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndkVer, "--llndk")
stub.versionScriptPath = versionScript if !Bool(stub.Properties.Unversioned) {
stub.versionScriptPath = android.OptionalPathForPath(versionScript)
}
return objs return objs
} }
@@ -142,12 +138,6 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe
stub.movedToApex = implApexModule.DirectlyInAnyApex() stub.movedToApex = implApexModule.DirectlyInAnyApex()
} }
if !Bool(stub.Properties.Unversioned) {
linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String()
flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlag)
flags.LdFlagsDeps = append(flags.LdFlagsDeps, stub.versionScriptPath)
}
if len(stub.Properties.Export_preprocessed_headers) > 0 { if len(stub.Properties.Export_preprocessed_headers) > 0 {
genHeaderOutDir := android.PathForModuleGen(ctx, "include") genHeaderOutDir := android.PathForModuleGen(ctx, "include")
@@ -170,10 +160,6 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe
stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{} stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{}
} }
if stub.stubsVersion() != "" {
stub.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + stub.stubsVersion())
}
return stub.libraryDecorator.link(ctx, flags, deps, objs) return stub.libraryDecorator.link(ctx, flags, deps, objs)
} }
@@ -181,6 +167,21 @@ func (stub *llndkStubDecorator) nativeCoverage() bool {
return false return false
} }
func (stub *llndkStubDecorator) buildStubs() bool {
return true
}
func (stub *llndkStubDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
// Get the versions from the implementation module.
impls := ctx.GetDirectDepsWithTag(llndkImplDep)
if len(impls) > 1 {
panic(fmt.Errorf("Expected single implmenetation library, got %d", len(impls)))
} else if len(impls) == 1 {
return impls[0].(*Module).AllStubsVersions()
}
return nil
}
func NewLLndkStubLibrary() *Module { func NewLLndkStubLibrary() *Module {
module, library := NewLibrary(android.DeviceSupported) module, library := NewLibrary(android.DeviceSupported)
library.BuildOnlyShared() library.BuildOnlyShared()

View File

@@ -80,9 +80,6 @@ type libraryProperties struct {
// https://github.com/android-ndk/ndk/issues/265. // https://github.com/android-ndk/ndk/issues/265.
Unversioned_until *string 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 // 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 // available in the platform for testing, but will be excluded from the
// sysroot provided to the NDK proper. // sysroot provided to the NDK proper.
@@ -107,9 +104,7 @@ func shouldUseVersionScript(ctx BaseModuleContext, stub *stubDecorator) bool {
return stub.apiLevel.GreaterThanOrEqualTo(stub.unversionedUntil) return stub.apiLevel.GreaterThanOrEqualTo(stub.unversionedUntil)
} }
func generatePerApiVariants(ctx android.BottomUpMutatorContext, m *Module, func ndkLibraryVersions(ctx android.BaseMutatorContext, from android.ApiLevel) []string {
from android.ApiLevel, perSplit func(*Module, android.ApiLevel)) {
var versions []android.ApiLevel var versions []android.ApiLevel
versionStrs := []string{} versionStrs := []string{}
for _, version := range ctx.Config().AllSupportedApiLevels() { for _, version := range ctx.Config().AllSupportedApiLevels() {
@@ -118,56 +113,26 @@ func generatePerApiVariants(ctx android.BottomUpMutatorContext, m *Module,
versionStrs = append(versionStrs, version.String()) versionStrs = append(versionStrs, version.String())
} }
} }
versions = append(versions, android.FutureApiLevel)
versionStrs = append(versionStrs, android.FutureApiLevel.String()) versionStrs = append(versionStrs, android.FutureApiLevel.String())
modules := ctx.CreateVariations(versionStrs...) return versionStrs
for i, module := range modules {
perSplit(module.(*Module), versions[i])
}
} }
func NdkApiMutator(ctx android.BottomUpMutatorContext) { func (this *stubDecorator) stubsVersions(ctx android.BaseMutatorContext) []string {
if m, ok := ctx.Module().(*Module); ok { if !ctx.Module().Enabled() {
if m.Enabled() { return nil
if compiler, ok := m.compiler.(*stubDecorator); ok {
if ctx.Os() != android.Android {
// These modules are always android.DeviceEnabled only, but
// those include Fuchsia devices, which we don't support.
ctx.Module().Disable()
return
}
firstVersion, err := nativeApiLevelFromUser(ctx,
String(compiler.properties.First_version))
if err != nil {
ctx.PropertyErrorf("first_version", err.Error())
return
}
generatePerApiVariants(ctx, m, firstVersion,
func(m *Module, version android.ApiLevel) {
m.compiler.(*stubDecorator).properties.ApiLevel =
version.String()
})
} else if m.SplitPerApiLevel() && m.IsSdkVariant() {
if ctx.Os() != android.Android {
return
}
from, err := nativeApiLevelFromUser(ctx, m.MinSdkVersion())
if err != nil {
ctx.PropertyErrorf("min_sdk_version", err.Error())
return
}
generatePerApiVariants(ctx, m, from,
func(m *Module, version android.ApiLevel) {
m.Properties.Sdk_version = StringPtr(version.String())
})
}
}
} }
firstVersion, err := nativeApiLevelFromUser(ctx,
String(this.properties.First_version))
if err != nil {
ctx.PropertyErrorf("first_version", err.Error())
return nil
}
return ndkLibraryVersions(ctx, firstVersion)
} }
func (this *stubDecorator) initializeProperties(ctx BaseModuleContext) bool { func (this *stubDecorator) initializeProperties(ctx BaseModuleContext) bool {
this.apiLevel = nativeApiLevelOrPanic(ctx, this.properties.ApiLevel) this.apiLevel = nativeApiLevelOrPanic(ctx, this.stubsVersion())
var err error var err error
this.firstVersion, err = nativeApiLevelFromUser(ctx, this.firstVersion, err = nativeApiLevelFromUser(ctx,
@@ -280,6 +245,11 @@ func (c *stubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) O
ctx.PropertyErrorf("symbol_file", "must end with .map.txt") 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) { if !c.initializeProperties(ctx) {
// Emits its own errors, so we don't need to. // Emits its own errors, so we don't need to.
return Objects{} return Objects{}
@@ -311,12 +281,18 @@ func (stub *stubDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
func (stub *stubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps, func (stub *stubDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps,
objs Objects) android.Path { objs Objects) android.Path {
if !stub.buildStubs() {
// NDK libraries have no implementation variant, nothing to do
return nil
}
if shouldUseVersionScript(ctx, stub) { if shouldUseVersionScript(ctx, stub) {
linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String() linkerScriptFlag := "-Wl,--version-script," + stub.versionScriptPath.String()
flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlag) flags.Local.LdFlags = append(flags.Local.LdFlags, linkerScriptFlag)
flags.LdFlagsDeps = append(flags.LdFlagsDeps, stub.versionScriptPath) flags.LdFlagsDeps = append(flags.LdFlagsDeps, stub.versionScriptPath)
} }
stub.libraryDecorator.skipAPIDefine = true
return stub.libraryDecorator.link(ctx, flags, deps, objs) return stub.libraryDecorator.link(ctx, flags, deps, objs)
} }

View File

@@ -131,7 +131,7 @@ func (n *ndkSingleton) GenerateBuildActions(ctx android.SingletonContext) {
} }
if m, ok := module.(*Module); ok { 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() && if ctx.Config().ExcludeDraftNdkApis() &&
installer.properties.Draft { installer.properties.Draft {
return return

View File

@@ -500,7 +500,7 @@ func (mod *Module) Module() android.Module {
return mod return mod
} }
func (mod *Module) StubsVersions() []string { func (mod *Module) StubsVersions(ctx android.BaseMutatorContext) []string {
// For now, Rust has no stubs versions. // For now, Rust has no stubs versions.
if mod.compiler != nil { if mod.compiler != nil {
if _, ok := mod.compiler.(libraryInterface); ok { if _, ok := mod.compiler.(libraryInterface); ok {