Merge changes I15328e0b,I731227c2
* changes: crt objects for APEX and vendor variants have correct target API levels crt modules produces cc rules for testing
This commit is contained in:
@@ -1874,6 +1874,45 @@ func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
|
|||||||
expectNoLink("libx", "shared_apex10000", "libz", "shared")
|
expectNoLink("libx", "shared_apex10000", "libz", "shared")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
|
||||||
|
ctx := testApex(t, `
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
native_shared_libs: ["mylib"],
|
||||||
|
updatable: false,
|
||||||
|
vendor: true,
|
||||||
|
min_sdk_version: "29",
|
||||||
|
}
|
||||||
|
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_library {
|
||||||
|
name: "mylib",
|
||||||
|
vendor_available: true,
|
||||||
|
system_shared_libs: [],
|
||||||
|
stl: "none",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
min_sdk_version: "29",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
vendorVariant := "android_vendor.29_arm64_armv8-a"
|
||||||
|
|
||||||
|
// First check that the correct variant of crtbegin_so is used.
|
||||||
|
ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
|
||||||
|
crtBegin := names(ldRule.Args["crtBegin"])
|
||||||
|
ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
|
||||||
|
|
||||||
|
// Ensure that the crtbegin_so used by the APEX is targeting 29
|
||||||
|
cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
|
||||||
|
android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
|
||||||
|
}
|
||||||
|
|
||||||
func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
|
func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
|
||||||
ctx := testApex(t, `
|
ctx := testApex(t, `
|
||||||
apex {
|
apex {
|
||||||
|
29
cc/cc.go
29
cc/cc.go
@@ -975,16 +975,17 @@ func (c *Module) MinSdkVersion() string {
|
|||||||
return String(c.Properties.Min_sdk_version)
|
return String(c.Properties.Min_sdk_version)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Module) SplitPerApiLevel() bool {
|
func (c *Module) isCrt() bool {
|
||||||
if !c.canUseSdk() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if linker, ok := c.linker.(*objectLinker); ok {
|
if linker, ok := c.linker.(*objectLinker); ok {
|
||||||
return linker.isCrt()
|
return linker.isCrt()
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Module) SplitPerApiLevel() bool {
|
||||||
|
return c.canUseSdk() && c.isCrt()
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Module) AlwaysSdk() bool {
|
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)
|
||||||
}
|
}
|
||||||
@@ -1446,12 +1447,20 @@ func (ctx *moduleContextImpl) minSdkVersion() string {
|
|||||||
// create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
|
// create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
|
||||||
// the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
|
// the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
|
||||||
// and min_sdk_version properties of the variants are set to the corresponding version
|
// and min_sdk_version properties of the variants are set to the corresponding version
|
||||||
// numbers. However, the platform (non-sdk) variant of the crt object is left untouched.
|
// numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
|
||||||
// min_sdk_version: 16 doesn't actually mean that the platform variant has to support such
|
// untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
|
||||||
// an old version. Since the variant is for the platform, it's preferred to target the
|
// support such an old version. The version is set to the later version in case when the
|
||||||
// latest version.
|
// non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
|
||||||
if ctx.mod.SplitPerApiLevel() && !ctx.isSdkVariant() {
|
// it's for an APEX.
|
||||||
ver = strconv.Itoa(android.FutureApiLevelInt)
|
if ctx.mod.isCrt() && !ctx.isSdkVariant() {
|
||||||
|
if ctx.isForPlatform() {
|
||||||
|
ver = strconv.Itoa(android.FutureApiLevelInt)
|
||||||
|
} else { // for apex
|
||||||
|
ver = ctx.apexSdkVersion().String()
|
||||||
|
if ver == "" { // in case when min_sdk_version was not set by the APEX
|
||||||
|
ver = ctx.sdkVersion()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
|
// Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
|
||||||
|
@@ -15,8 +15,9 @@
|
|||||||
package cc
|
package cc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"android/soong/android"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"android/soong/android"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMinSdkVersionsOfCrtObjects(t *testing.T) {
|
func TestMinSdkVersionsOfCrtObjects(t *testing.T) {
|
||||||
@@ -27,24 +28,23 @@ func TestMinSdkVersionsOfCrtObjects(t *testing.T) {
|
|||||||
crt: true,
|
crt: true,
|
||||||
stl: "none",
|
stl: "none",
|
||||||
min_sdk_version: "28",
|
min_sdk_version: "28",
|
||||||
|
vendor_available: true,
|
||||||
}`)
|
}`)
|
||||||
|
|
||||||
arch := "android_arm64_armv8-a"
|
variants := []struct {
|
||||||
for _, v := range []string{"", "28", "29", "30", "current"} {
|
variant string
|
||||||
var variant string
|
num string
|
||||||
// platform variant
|
}{
|
||||||
if v == "" {
|
{"android_arm64_armv8-a", "10000"},
|
||||||
variant = arch
|
{"android_arm64_armv8-a_sdk_28", "28"},
|
||||||
} else {
|
{"android_arm64_armv8-a_sdk_29", "29"},
|
||||||
variant = arch + "_sdk_" + v
|
{"android_arm64_armv8-a_sdk_30", "30"},
|
||||||
}
|
{"android_arm64_armv8-a_sdk_current", "10000"},
|
||||||
cflags := ctx.ModuleForTests("crt_foo", variant).Rule("cc").Args["cFlags"]
|
{"android_vendor.29_arm64_armv8-a", "29"},
|
||||||
vNum := v
|
}
|
||||||
if v == "current" || v == "" {
|
for _, v := range variants {
|
||||||
vNum = "10000"
|
cflags := ctx.ModuleForTests("crt_foo", v.variant).Rule("cc").Args["cFlags"]
|
||||||
}
|
expected := "-target aarch64-linux-android" + v.num + " "
|
||||||
expected := "-target aarch64-linux-android" + vNum + " "
|
|
||||||
android.AssertStringDoesContain(t, "cflag", cflags, expected)
|
android.AssertStringDoesContain(t, "cflag", cflags, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -375,26 +375,42 @@ func commonDefaultModules() string {
|
|||||||
cc_object {
|
cc_object {
|
||||||
name: "crtbegin_so",
|
name: "crtbegin_so",
|
||||||
defaults: ["crt_defaults"],
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtbegin_so.c"],
|
||||||
|
objs: ["crtbrand"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_object {
|
cc_object {
|
||||||
name: "crtbegin_dynamic",
|
name: "crtbegin_dynamic",
|
||||||
defaults: ["crt_defaults"],
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtbegin.c"],
|
||||||
|
objs: ["crtbrand"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_object {
|
cc_object {
|
||||||
name: "crtbegin_static",
|
name: "crtbegin_static",
|
||||||
defaults: ["crt_defaults"],
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtbegin.c"],
|
||||||
|
objs: ["crtbrand"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_object {
|
cc_object {
|
||||||
name: "crtend_so",
|
name: "crtend_so",
|
||||||
defaults: ["crt_defaults"],
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtend_so.c"],
|
||||||
|
objs: ["crtbrand"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_object {
|
cc_object {
|
||||||
name: "crtend_android",
|
name: "crtend_android",
|
||||||
defaults: ["crt_defaults"],
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtend.c"],
|
||||||
|
objs: ["crtbrand"],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_object {
|
||||||
|
name: "crtbrand",
|
||||||
|
defaults: ["crt_defaults"],
|
||||||
|
srcs: ["crtbrand.c"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_library {
|
cc_library {
|
||||||
@@ -585,6 +601,11 @@ var PrepareForTestWithCcDefaultModules = android.GroupFixturePreparers(
|
|||||||
"defaults/cc/common/libm.map.txt": nil,
|
"defaults/cc/common/libm.map.txt": nil,
|
||||||
"defaults/cc/common/ndk_libandroid_support": nil,
|
"defaults/cc/common/ndk_libandroid_support": nil,
|
||||||
"defaults/cc/common/ndk_libc++_shared": nil,
|
"defaults/cc/common/ndk_libc++_shared": nil,
|
||||||
|
"defaults/cc/common/crtbegin_so.c": nil,
|
||||||
|
"defaults/cc/common/crtbegin.c": nil,
|
||||||
|
"defaults/cc/common/crtend_so.c": nil,
|
||||||
|
"defaults/cc/common/crtend.c": nil,
|
||||||
|
"defaults/cc/common/crtbrand.c": nil,
|
||||||
}.AddToFixture(),
|
}.AddToFixture(),
|
||||||
|
|
||||||
// Place the default cc test modules that are common to all platforms in a location that will not
|
// Place the default cc test modules that are common to all platforms in a location that will not
|
||||||
|
Reference in New Issue
Block a user