Apex: support codenames for min_sdk_version
Apex can use codenames like "Q", "R" for its min_sdk_version property.
Also, cc_library can use codenames for its stubs.versions.
Bug: 152655956
Test: m
Merged-In: I077ad7b2ac5d90b4c8708921e43846206f05ba70
Change-Id: I077ad7b2ac5d90b4c8708921e43846206f05ba70
(cherry picked from commit 29e91d2121
)
This commit is contained in:
@@ -1489,18 +1489,22 @@ func LatestStubsVersionFor(config android.Config, name string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func checkVersions(ctx android.BaseModuleContext, versions []string) {
|
||||
func normalizeVersions(ctx android.BaseModuleContext, versions []string) {
|
||||
numVersions := make([]int, len(versions))
|
||||
for i, v := range versions {
|
||||
numVer, err := strconv.Atoi(v)
|
||||
numVer, err := android.ApiStrToNum(ctx, v)
|
||||
if err != nil {
|
||||
ctx.PropertyErrorf("versions", "%q is not a number", v)
|
||||
ctx.PropertyErrorf("versions", "%s", err.Error())
|
||||
return
|
||||
}
|
||||
numVersions[i] = numVer
|
||||
}
|
||||
if !sort.IsSorted(sort.IntSlice(numVersions)) {
|
||||
ctx.PropertyErrorf("versions", "not sorted: %v", versions)
|
||||
}
|
||||
for i, v := range numVersions {
|
||||
versions[i] = strconv.Itoa(v)
|
||||
}
|
||||
}
|
||||
|
||||
func createVersionVariations(mctx android.BottomUpMutatorContext, versions []string) {
|
||||
@@ -1522,7 +1526,7 @@ func VersionMutator(mctx android.BottomUpMutatorContext) {
|
||||
if library, ok := mctx.Module().(LinkableInterface); ok && !library.InRecovery() {
|
||||
if library.CcLibrary() && library.BuildSharedVariant() && len(library.StubsVersions()) > 0 {
|
||||
versions := library.StubsVersions()
|
||||
checkVersions(mctx, versions)
|
||||
normalizeVersions(mctx, versions)
|
||||
if mctx.Failed() {
|
||||
return
|
||||
}
|
||||
|
@@ -17,6 +17,8 @@ package cc
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"android/soong/android"
|
||||
)
|
||||
|
||||
func TestLibraryReuse(t *testing.T) {
|
||||
@@ -186,3 +188,55 @@ func TestLibraryReuse(t *testing.T) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestStubsVersions(t *testing.T) {
|
||||
bp := `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo.c"],
|
||||
stubs: {
|
||||
versions: ["29", "R", "10000"],
|
||||
},
|
||||
}
|
||||
`
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
|
||||
ctx := testCcWithConfig(t, config)
|
||||
|
||||
variants := ctx.ModuleVariantsForTests("libfoo")
|
||||
for _, expectedVer := range []string{"29", "9000", "10000"} {
|
||||
expectedVariant := "android_arm_armv7-a-neon_shared_" + expectedVer
|
||||
if !inList(expectedVariant, variants) {
|
||||
t.Errorf("missing expected variant: %q", expectedVariant)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStubsVersions_NotSorted(t *testing.T) {
|
||||
bp := `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo.c"],
|
||||
stubs: {
|
||||
versions: ["29", "10000", "R"],
|
||||
},
|
||||
}
|
||||
`
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
|
||||
testCcErrorWithConfig(t, `"libfoo" .*: versions: not sorted`, config)
|
||||
}
|
||||
|
||||
func TestStubsVersions_ParseError(t *testing.T) {
|
||||
bp := `
|
||||
cc_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo.c"],
|
||||
stubs: {
|
||||
versions: ["29", "10000", "X"],
|
||||
},
|
||||
}
|
||||
`
|
||||
|
||||
testCcError(t, `"libfoo" .*: versions: SDK version should be`, bp)
|
||||
}
|
||||
|
@@ -96,6 +96,8 @@ type libraryProperties struct {
|
||||
Unversioned_until *string
|
||||
|
||||
// Private property for use by the mutator that splits per-API level.
|
||||
// can be one of <number:sdk_version> or <codename> or "current"
|
||||
// passed to "gen_stub_libs.py" as it is
|
||||
ApiLevel string `blueprint:"mutated"`
|
||||
|
||||
// True if this API is not yet ready to be shipped in the NDK. It will be
|
||||
|
Reference in New Issue
Block a user