@@ -4,10 +4,13 @@ import org.gradle.api.plugins.JavaPlugin.API_ELEMENTS_CONFIGURATION_NAME
44import org.gradle.api.plugins.JavaPlugin.JAVADOC_ELEMENTS_CONFIGURATION_NAME
55import org.gradle.api.plugins.JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME
66import org.gradle.api.plugins.JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME
7+ import org.gradle.language.base.plugins.LifecycleBasePlugin.VERIFICATION_GROUP
78import org.gradle.plugin.compatibility.compatibility
89import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode
910import org.jetbrains.kotlin.gradle.dsl.JvmTarget
11+ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
1012import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
13+ import org.jetbrains.kotlin.gradle.dsl.abi.BinariesSource
1114import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation
1215
1316plugins {
@@ -30,7 +33,11 @@ dokka { dokkaPublications.html { outputDirectory = rootDir.resolve("docs/api") }
3033
3134kotlin {
3235 explicitApi()
33- @OptIn(ExperimentalAbiValidation ::class ) abiValidation()
36+ @OptIn(ExperimentalAbiValidation ::class )
37+ abiValidation {
38+ // Check APIs under main and versioned source sets.
39+ binariesSource = BinariesSource .NON_TEST_COMPILATIONS
40+ }
3441 val jdkRelease = " 17"
3542 compilerOptions {
3643 allWarningsAsErrors = true
@@ -46,6 +53,8 @@ kotlin {
4653 }
4754}
4855
56+ addMultiReleaseSourceSet(24 )
57+
4958lint {
5059 baseline = file(" gradle/lint-baseline.xml" )
5160 ignoreTestFixturesSources = true
@@ -240,6 +249,10 @@ buildConfig {
240249 }
241250}
242251
252+ tasks.jar {
253+ manifest.attributes(" Multi-Release" to true )
254+ }
255+
243256tasks.pluginUnderTestMetadata { pluginClasspath.from(testPluginClasspath) }
244257
245258tasks.check { dependsOn(tasks.withType<Test >()) }
@@ -254,3 +267,35 @@ tasks.clean {
254267 rootDir.resolve(" site" ),
255268 )
256269}
270+
271+ fun addMultiReleaseSourceSet (version : Int ) {
272+ kotlin.target.compilations.create(" java${version} " ) {
273+ associateWith(kotlin.target.compilations.getByName(" main" ))
274+ compileTaskProvider {
275+ compilerOptions {
276+ this @compilerOptions as KotlinJvmCompilerOptions
277+ jvmTarget = JvmTarget .fromTarget(version.toString())
278+ freeCompilerArgs.add(" -Xjdk-release=$version " )
279+ }
280+ }
281+ compileJavaTaskProvider { options.release = version }
282+
283+ tasks.jar { from(output.allOutputs) { into(" META-INF/versions/$version " ) } }
284+
285+ val versionedTest =
286+ tasks.register(" testJava${version} " , Test ::class ) {
287+ useJUnitPlatform()
288+ group = VERIFICATION_GROUP
289+ description = " Runs test suite using Java $version toolchain."
290+ val testSourceSet = sourceSets.test.get()
291+ testClassesDirs = testSourceSet.output.classesDirs
292+ val testCpWithoutMainOutput = testSourceSet.runtimeClasspath - sourceSets.main.get().output
293+ // Prefer MR classes on the classpath, so remove main output.
294+ classpath = files(tasks.jar.flatMap { it.archiveFile }) + testCpWithoutMainOutput
295+ javaLauncher = javaToolchains.launcherFor {
296+ languageVersion = JavaLanguageVersion .of(version)
297+ }
298+ }
299+ tasks.check { dependsOn(versionedTest) }
300+ }
301+ }
0 commit comments