From 4e0a9ad1eddc4fca07e1fea0efddd5c9bf6f0052 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 30 Aug 2023 10:16:41 +0200 Subject: [PATCH] Use compileDependencyFiles for getting compilation dependencies Add KotlinNativeDistributionAccessor It uses internal KGP API but since Kotlin 2.0 Kotlin Native Distribution dependencies will be included to compileDependencyFiles. --- gradle/libs.versions.toml | 1 + runners/gradle-plugin/build.gradle.kts | 2 + .../KotlinNativeDistributionAccessor.kt | 39 +++++++++++++++++++ .../gradle/kotlin/kotlinClasspathUtils.kt | 17 ++++++-- 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/KotlinNativeDistributionAccessor.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9170c40b91..7b86c191b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -63,6 +63,7 @@ kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collec #### Gradle plugins #### # The Maven coordinates of Gradle plugins that are either used in convention plugins, or in Dokka subprojects gradlePlugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "gradlePlugin-kotlin" } +gradlePlugin-kotlin-klibCommonizerApi = { module = "org.jetbrains.kotlin:kotlin-klib-commonizer-api", version.ref = "gradlePlugin-kotlin" } gradlePlugin-android = { module = "com.android.tools.build:gradle", version.ref = "gradlePlugin-android" } gradlePlugin-dokka = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "gradlePlugin-dokka" } gradlePlugin-shadow = { module = "gradle.plugin.com.github.johnrengelman:shadow", version.ref = "gradlePlugin-shadow" } diff --git a/runners/gradle-plugin/build.gradle.kts b/runners/gradle-plugin/build.gradle.kts index c7f34f5539..eae1ed9cb8 100644 --- a/runners/gradle-plugin/build.gradle.kts +++ b/runners/gradle-plugin/build.gradle.kts @@ -8,9 +8,11 @@ dependencies { api(projects.core) compileOnly(libs.gradlePlugin.kotlin) + compileOnly(libs.gradlePlugin.kotlin.klibCommonizerApi) compileOnly(libs.gradlePlugin.android) testImplementation(libs.gradlePlugin.kotlin) + testImplementation(libs.gradlePlugin.kotlin.klibCommonizerApi) testImplementation(libs.gradlePlugin.android) } diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/KotlinNativeDistributionAccessor.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/KotlinNativeDistributionAccessor.kt new file mode 100644 index 0000000000..3180efef47 --- /dev/null +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/KotlinNativeDistributionAccessor.kt @@ -0,0 +1,39 @@ +@file:Suppress("INVISIBLE_REFERENCE") +package org.jetbrains.dokka.gradle.kotlin + +import java.io.File +import org.gradle.api.Project +import org.jetbrains.kotlin.commonizer.KonanDistribution +import org.jetbrains.kotlin.commonizer.platformLibsDir +import org.jetbrains.kotlin.commonizer.stdlib +import org.jetbrains.kotlin.compilerRunner.konanHome +import org.jetbrains.kotlin.konan.target.KonanTarget + +/** + * Provides access to the Kotlin/Native distribution components: + * * [stdlibDir] -- stdlib directory + * * [platformDependencies] -- list of directories to platform dependencies + * + * It uses Kotlin Gradle Plugin API that is guaranteed to be present in: + * 1.5 <= kotlinVersion <= 1.9 + * + * It should not be used with Kotlin versions later than 1.9 + */ +internal class KotlinNativeDistributionAccessor( + project: Project +) { + private val konanDistribution = KonanDistribution( + @Suppress("INVISIBLE_MEMBER") + project.konanHome + ) + + val stdlibDir: File = konanDistribution.stdlib + + fun platformDependencies(target: KonanTarget): List = konanDistribution + .platformLibsDir + .resolve(target.name) + .listLibraryFiles() + + private fun File.listLibraryFiles(): List = listFiles().orEmpty() + .filter { it.isDirectory || it.extension == "klib" } +} \ No newline at end of file diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/kotlinClasspathUtils.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/kotlinClasspathUtils.kt index 83cb87d6a9..8ced1b8d4c 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/kotlinClasspathUtils.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/kotlinClasspathUtils.kt @@ -6,7 +6,6 @@ import org.jetbrains.dokka.gradle.isAndroidTarget import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.tasks.KotlinCompileTool internal fun Project.classpathOf(sourceSet: KotlinSourceSet): FileCollection { val compilations = compilationsOf(sourceSet) @@ -39,8 +38,20 @@ private fun KotlinCompilation.compileClasspathOf(project: Project): FileCollecti } private fun KotlinCompilation.newCompileClasspathOf(project: Project): FileCollection { - val compilationClasspath = (compileTaskProvider.get() as? KotlinCompileTool)?.libraries ?: project.files() - return compilationClasspath + platformDependencyFiles(project) + val result = project.objects.fileCollection() + result.from({ compileDependencyFiles }) + + val kgpVersion = project.getKgpVersion() + // Since Kotlin 2.0 native distributiuon dependencies will be included to compileDependencyFiles + if (kgpVersion != null && kgpVersion <= KotlinGradlePluginVersion(1, 9, 255)) { + if (this is AbstractKotlinNativeCompilation) { + val kotlinNativeDistributionAccessor = KotlinNativeDistributionAccessor(project) + result.from(kotlinNativeDistributionAccessor.stdlibDir) + result.from(kotlinNativeDistributionAccessor.platformDependencies(konanTarget)) + } + } + + return result } private fun KotlinCompilation.oldCompileClasspathOf(project: Project): FileCollection {