blob: 79a660a863dcc2aa5fd00e49ab81ccecd54c1cbf [file]
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.testing.Test
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.named
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.the
import org.gradle.kotlin.dsl.withType
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
abstract class KotlinCommonPlugin : Plugin<Project> {
override fun apply(target: Project): Unit =
with(target) {
pluginManager.apply("org.jetbrains.kotlin.jvm")
pluginManager.apply("dev.drewhamilton.poko")
val projectLibs = extensions.getByType<VersionCatalogsExtension>().named("libs")
val javaCompilationVersion =
JavaLanguageVersion.of(projectLibs.findVersion("java-compilation").get().requiredVersion)
val javaTargetVersion = JavaLanguageVersion.of(projectLibs.findVersion("java-target").get().requiredVersion)
(kotlinExtension as KotlinJvmExtension).apply {
// All modules, the CLI included, must have an explicit API
explicitApi()
jvmToolchain(jdkVersion = javaCompilationVersion.asInt())
compilerOptions {
apiVersion.set(KotlinVersion.KOTLIN_2_0)
languageVersion.set(KotlinVersion.KOTLIN_2_0)
}
}
tasks.withType<JavaCompile>().configureEach {
options.release.set(javaTargetVersion.asInt())
}
tasks.withType<KotlinCompile>().configureEach {
// Convert Java version (e.g. "1.8" or "11") to Kotlin JvmTarget ("8" resp. "11")
compilerOptions.jvmTarget.set(JvmTarget.fromTarget(JavaVersion.toVersion(javaTargetVersion).toString()))
}
val requestedJdkVersion = project.findProperty("testJdkVersion")?.toString()?.toInt()
// List all non-current Java versions the developers may want to run via IDE click
setOfNotNull(8, 11, 17, 21, requestedJdkVersion).forEach { version ->
tasks.register<Test>("testOnJdk$version") {
javaLauncher.set(
target
.the<JavaToolchainService>()
.launcherFor { languageVersion.set(JavaLanguageVersion.of(version)) },
)
description = "Runs the test suite on JDK $version"
group = LifecycleBasePlugin.VERIFICATION_GROUP
// Copy inputs from normal Test task.
val testTask = tasks.named<Test>("test").get()
classpath = testTask.classpath
testClassesDirs = testTask.testClassesDirs
}
}
val skipTests: String = providers.systemProperty("skipTests").getOrElse("false")
tasks.withType<Test>().configureEach {
if (skipTests == "false") {
useJUnitPlatform()
} else {
logger.warn("Skipping tests for task '$name' as system property 'skipTests=$skipTests'")
}
maxParallelForks =
if (System.getenv("CI") != null) {
Runtime.getRuntime().availableProcessors()
} else {
// https://docs.gradle.org/8.0/userguide/performance.html#execute_tests_in_parallel
(Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
}
if (javaLauncher
.get()
.metadata
.languageVersion
.canCompileOrRun(JavaLanguageVersion.of(24))
) {
// Suppress warning "sun.misc.Unsafe::objectFieldOffset" on Java24+ (https://github.com/pinterest/ktlint/issues/2973)
jvmArgs("--sun-misc-unsafe-memory-access=allow") // Java 24+
}
}
}
}