Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native library having stubs (i.e. stubs.versions property is set), the stubs variant is used unless the dependent lib is directly included in the same APEX with the depending module. Example: apex { name: "myapex", native_shared_libs: ["libX", "libY"], } cc_library { name: "libX", shared_libs: ["libY", "libZ"], } cc_library { name: "libY", stubs: { versions: ["1", "2"], }, } cc_library { name: "libZ", stubs: { versions: ["1", "2"], }, } In this case, libX is linking to the impl variant of libY (that provides private APIs) while libY is linking to the version 2 stubs of libZ. This is because libY is directly included in the same apex via native_shared_libs property, but libZ isn't. Bug: 112672359 Test: apex_test added Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
This commit is contained in:
@@ -16,6 +16,8 @@ package cc
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
@@ -981,30 +983,65 @@ func LinkageMutator(mctx android.BottomUpMutatorContext) {
|
||||
}
|
||||
}
|
||||
|
||||
// maps a module name to the list of stubs versions available for the module
|
||||
func stubsVersionsFor(config android.Config) map[string][]string {
|
||||
return config.Once("stubVersions", func() interface{} {
|
||||
return make(map[string][]string)
|
||||
}).(map[string][]string)
|
||||
}
|
||||
|
||||
var stubsVersionsLock sync.Mutex
|
||||
|
||||
func latestStubsVersionFor(config android.Config, name string) string {
|
||||
versions, ok := stubsVersionsFor(config)[name]
|
||||
if ok && len(versions) > 0 {
|
||||
// the versions are alreay sorted in ascending order
|
||||
return versions[len(versions)-1]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// Version mutator splits a module into the mandatory non-stubs variant
|
||||
// (which is named "impl") and zero or more stubs variants.
|
||||
func versionMutator(mctx android.BottomUpMutatorContext) {
|
||||
// (which is unnamed) and zero or more stubs variants.
|
||||
func VersionMutator(mctx android.BottomUpMutatorContext) {
|
||||
if mctx.Os() != android.Android {
|
||||
return
|
||||
}
|
||||
|
||||
if m, ok := mctx.Module().(*Module); ok && !m.inRecovery() && m.linker != nil {
|
||||
if library, ok := m.linker.(*libraryDecorator); ok && library.buildShared() {
|
||||
versions := []string{""}
|
||||
if library, ok := m.linker.(*libraryDecorator); ok && library.buildShared() &&
|
||||
len(library.Properties.Stubs.Versions) > 0 {
|
||||
versions := []string{}
|
||||
for _, v := range library.Properties.Stubs.Versions {
|
||||
if _, err := strconv.Atoi(v); err != nil {
|
||||
mctx.PropertyErrorf("versions", "%q is not a number", v)
|
||||
}
|
||||
versions = append(versions, v)
|
||||
}
|
||||
sort.Slice(versions, func(i, j int) bool {
|
||||
left, _ := strconv.Atoi(versions[i])
|
||||
right, _ := strconv.Atoi(versions[j])
|
||||
return left < right
|
||||
})
|
||||
|
||||
// save the list of versions for later use
|
||||
copiedVersions := make([]string, len(versions))
|
||||
copy(copiedVersions, versions)
|
||||
stubsVersionsLock.Lock()
|
||||
defer stubsVersionsLock.Unlock()
|
||||
stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = copiedVersions
|
||||
|
||||
// "" is for the non-stubs variant
|
||||
versions = append(versions, "")
|
||||
|
||||
modules := mctx.CreateVariations(versions...)
|
||||
for i, m := range modules {
|
||||
l := m.(*Module).linker.(*libraryDecorator)
|
||||
if i == 0 {
|
||||
l.MutatedProperties.BuildStubs = false
|
||||
continue
|
||||
if versions[i] != "" {
|
||||
l.MutatedProperties.BuildStubs = true
|
||||
l.MutatedProperties.StubsVersion = versions[i]
|
||||
m.(*Module).Properties.HideFromMake = true
|
||||
}
|
||||
// Mark that this variant is for stubs.
|
||||
l.MutatedProperties.BuildStubs = true
|
||||
l.MutatedProperties.StubsVersion = versions[i]
|
||||
m.(*Module).Properties.HideFromMake = true
|
||||
}
|
||||
} else {
|
||||
mctx.CreateVariations("")
|
||||
|
Reference in New Issue
Block a user