Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Target Java17 for Android .aars and Java11 for apollo-gradle-plugin.jar #5534

Merged
merged 2 commits into from
Jan 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 35 additions & 19 deletions build-logic/src/main/kotlin/CompilerOptions.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

import com.android.build.gradle.BaseExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
Expand All @@ -17,8 +18,9 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType

fun KotlinCommonCompilerOptions.configure() {
fun KotlinCommonCompilerOptions.configure(baseJvmTarget: Int, isAndroid: Boolean) {
freeCompilerArgs.add("-Xexpect-actual-classes")

/**
Expand All @@ -35,7 +37,16 @@ fun KotlinCommonCompilerOptions.configure() {
when (this) {
is KotlinJvmCompilerOptions -> {
freeCompilerArgs.add("-Xjvm-default=all")
jvmTarget.set(JvmTarget.JVM_1_8)
val target = when {
isAndroid -> {
// https://blog.blundellapps.co.uk/setting-jdk-level-in-android-gradle-builds/
// D8 can dex Java17 bytecode
JvmTarget.JVM_17
}
baseJvmTarget == 8 -> JvmTarget.JVM_1_8
else -> JvmTarget.fromTarget(baseJvmTarget.toString())
}
jvmTarget.set(target)
}

is KotlinNativeCompilerOptions -> {
Expand All @@ -49,19 +60,21 @@ fun KotlinCommonCompilerOptions.configure() {
}
}

private fun KotlinProjectExtension.forEachCompilerOptions(block: KotlinCommonCompilerOptions.() -> Unit) {
private fun KotlinProjectExtension.forEachCompilerOptions(block: KotlinCommonCompilerOptions.(isAndroid: Boolean) -> Unit) {
when (this) {
is KotlinJvmProjectExtension -> compilerOptions.block()
is KotlinAndroidProjectExtension -> compilerOptions.block()
is KotlinJvmProjectExtension -> compilerOptions.block(false)
is KotlinAndroidProjectExtension -> compilerOptions.block(true)
is KotlinMultiplatformExtension -> {
targets.all {
val isAndroid = platformType == KotlinPlatformType.androidJvm
compilations.all {
compilerOptions.configure {
block()
block(isAndroid)
}
}
}
}

else -> error("Unknown kotlin extension $this")
}
}
Expand All @@ -77,9 +90,23 @@ val Project.androidExtensionOrNull: BaseExtension?
return (extensions.findByName("android") as? BaseExtension)
}

fun Project.configureJavaAndKotlinCompilers() {
fun Project.configureJavaAndKotlinCompilers(jvmTarget: Int?) {
@Suppress("NAME_SHADOWING")
val jvmTarget = jvmTarget?: 8

kotlinExtensionOrNull?.forEachCompilerOptions {
configure()
configure(jvmTarget, it)
}
project.tasks.withType(JavaCompile::class.java).configureEach {
// For JVM only modules, this dictates the "org.gradle.jvm.version" Gradle attribute
options.release.set(jvmTarget)
}
androidExtensionOrNull?.run {
compileOptions {
// For Android, latest D8 version support Java 17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_17
}
}

(kotlinExtensionOrNull as? KotlinMultiplatformExtension)?.sourceSets?.configureEach {
Expand All @@ -99,17 +126,6 @@ fun Project.configureJavaAndKotlinCompilers() {
// Keep in sync with build-logic/build.gradle.kts
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
project.tasks.withType(JavaCompile::class.java).configureEach {
// Ensure "org.gradle.jvm.version" is set to "8" in Gradle metadata of jvm-only modules.
options.release.set(8)
}
androidExtensionOrNull?.run {
compileOptions {
// Android somewhat does not honor `options.release.set(8)` above. Make sure to target
// Java 8 bytecode.
targetCompatibility = JavaVersion.VERSION_1_8
}
}

/**
* Required because of:
Expand Down
5 changes: 3 additions & 2 deletions build-logic/src/main/kotlin/api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension

fun Project.apolloLibrary(
javaModuleName: String?,
jvmTarget: Int? = null,
withJs: Boolean = true,
withLinux: Boolean = true,
withApple: Boolean = true,
Expand All @@ -15,8 +16,8 @@ fun Project.apolloLibrary(
version = property("VERSION_NAME")!!

commonSetup()
configureJavaAndKotlinCompilers(jvmTarget)

configureJavaAndKotlinCompilers()
addOptIn(
"com.apollographql.apollo3.annotations.ApolloExperimental",
"com.apollographql.apollo3.annotations.ApolloInternal"
Expand Down Expand Up @@ -63,7 +64,7 @@ fun Project.apolloTest(
browserTest: Boolean = false,
) {
commonSetup()
configureJavaAndKotlinCompilers()
configureJavaAndKotlinCompilers(null)
addOptIn(
"com.apollographql.apollo3.annotations.ApolloExperimental",
"com.apollographql.apollo3.annotations.ApolloInternal",
Expand Down
6 changes: 3 additions & 3 deletions gradle/libraries.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
# Can be as high as IJ supports
android-plugin = "8.2.1"
# The version we compile against
android-plugin-min = "3.4.2"
# The latest version that has been tested to work
android-plugin-max = "8.2.0-alpha03"
android-plugin-min = "8.0.0"
# The version used by the 'android-plugin-max' test
android-plugin-max = "8.2.1"
android-sdkversion-compile = "33"
android-sdkversion-compilebenchmark = "34"
android-sdkversion-min = "16"
Expand Down
3 changes: 2 additions & 1 deletion libraries/apollo-gradle-plugin-external/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ plugins {
}

apolloLibrary(
javaModuleName = "com.apollographql.apollo3.gradle"
javaModuleName = "com.apollographql.apollo3.gradle",
jvmTarget = 11 // AGP requires 11
)

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.apollographql.apollo3.gradle.internal

import com.android.build.gradle.AppExtension
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.FeatureExtension
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.TestedExtension
import com.android.build.gradle.api.BaseVariant
Expand Down Expand Up @@ -38,12 +37,6 @@ private fun Project.getVariants(): NamedDomainObjectContainer<BaseVariant> {
}
}

is FeatureExtension -> {
extension.featureVariants.all { variant ->
container.add(variant)
}
}

else -> error("Unsupported extension: $extension")
}

Expand Down
3 changes: 2 additions & 1 deletion libraries/apollo-gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ plugins {
}

apolloLibrary(
javaModuleName = null
javaModuleName = null,
jvmTarget = 11 // AGP requires 11
)

// Configuration for extra jar to pass to R8 to give it more context about what can be relocated
Expand Down