diff --git a/apex/apex_test.go b/apex/apex_test.go index 1f395b6c1..ad9187890 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -1763,6 +1763,7 @@ func TestMacro(t *testing.T) { name: "otherapex", key: "myapex.key", native_shared_libs: ["mylib", "mylib2"], + min_sdk_version: "29", } apex_key { @@ -1797,15 +1798,18 @@ func TestMacro(t *testing.T) { // non-APEX variant does not have __ANDROID_APEX__ defined mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") + ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000") - // APEX variant has __ANDROID_APEX__ defined + // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") + ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=10000") ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__") - // APEX variant has __ANDROID_APEX__ defined + // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") + ensureContains(t, mylibCFlags, "-D__ANDROID_SDK_VERSION__=29") ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__") // When cc_library sets use_apex_name_macro: true diff --git a/cc/cc.go b/cc/cc.go index 4310a36c2..1db61de10 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -292,6 +292,7 @@ type ModuleContextIntf interface { staticBinary() bool header() bool toolchain() config.Toolchain + canUseSdk() bool useSdk() bool sdkVersion() string useVndk() bool @@ -315,6 +316,7 @@ type ModuleContextIntf interface { useClangLld(actx ModuleContext) bool isForPlatform() bool apexName() string + apexSdkVersion() int hasStubsVariants() bool isStubs() bool bootstrap() bool @@ -1048,8 +1050,12 @@ func (ctx *moduleContextImpl) header() bool { return ctx.mod.header() } +func (ctx *moduleContextImpl) canUseSdk() bool { + return ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRamdisk() && !ctx.inRecovery() && !ctx.ctx.Fuchsia() +} + func (ctx *moduleContextImpl) useSdk() bool { - if ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRamdisk() && !ctx.inRecovery() && !ctx.ctx.Fuchsia() { + if ctx.canUseSdk() { return String(ctx.mod.Properties.Sdk_version) != "" } return false @@ -1182,6 +1188,10 @@ func (ctx *moduleContextImpl) apexName() string { return ctx.mod.ApexName() } +func (ctx *moduleContextImpl) apexSdkVersion() int { + return ctx.mod.ApexProperties.Info.MinSdkVersion +} + func (ctx *moduleContextImpl) hasStubsVariants() bool { return ctx.mod.HasStubsVariants() } diff --git a/cc/compiler.go b/cc/compiler.go index 3a87b6980..fe81bd0a4 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -315,6 +315,18 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps "-isystem "+getCurrentIncludePath(ctx).Join(ctx, config.NDKTriple(tc)).String()) } + if ctx.canUseSdk() { + sdkVersion := ctx.sdkVersion() + if sdkVersion == "" || sdkVersion == "current" { + if ctx.isForPlatform() { + sdkVersion = strconv.Itoa(android.FutureApiLevel) + } else { + sdkVersion = strconv.Itoa(ctx.apexSdkVersion()) + } + } + flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_SDK_VERSION__="+sdkVersion) + } + if ctx.useVndk() { flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_VNDK__") }