Skip to content

Commit 4096e7d

Browse files
committed
Add hidden workaround for native dependencies
1 parent 9d7c372 commit 4096e7d

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-c
6060
#### Gradle plugins ####
6161
# The Maven coordinates of Gradle plugins that are either used in convention plugins, or in Dokka subprojects
6262
gradlePlugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "gradlePlugin-kotlin" }
63+
gradlePlugin-kotlin-klibCommonizerApi = { module = "org.jetbrains.kotlin:kotlin-klib-commonizer-api", version.ref = "gradlePlugin-kotlin" }
6364
gradlePlugin-android = { module = "com.android.tools.build:gradle", version.ref = "gradlePlugin-android" }
6465
gradlePlugin-dokka = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "gradlePlugin-dokka" }
6566
gradlePlugin-shadow = { module = "gradle.plugin.com.github.johnrengelman:shadow", version.ref = "gradlePlugin-shadow" }

runners/gradle-plugin/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ dependencies {
88
api(projects.core)
99

1010
compileOnly(libs.gradlePlugin.kotlin)
11+
compileOnly(libs.gradlePlugin.kotlin.klibCommonizerApi)
1112
compileOnly(libs.gradlePlugin.android)
1213

1314
testImplementation(libs.gradlePlugin.kotlin)
15+
testImplementation(libs.gradlePlugin.kotlin.klibCommonizerApi)
1416
testImplementation(libs.gradlePlugin.android)
1517
}
1618

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
@file:Suppress("INVISIBLE_REFERENCE")
2+
package org.jetbrains.dokka.gradle.kotlin
3+
4+
import java.io.File
5+
import org.gradle.api.Project
6+
import org.jetbrains.kotlin.commonizer.KonanDistribution
7+
import org.jetbrains.kotlin.commonizer.platformLibsDir
8+
import org.jetbrains.kotlin.commonizer.stdlib
9+
import org.jetbrains.kotlin.compilerRunner.konanHome
10+
import org.jetbrains.kotlin.konan.target.KonanTarget
11+
12+
/**
13+
* Provides access to the Kotlin/Native distribution components:
14+
* * [stdlibDir] -- stdlib directory
15+
* * [platformDependencies] -- list of directories to platform dependencies
16+
*
17+
* It uses Kotlin Gradle Plugin API that is guaranteed to be present in:
18+
* 1.5 <= kotlinVersion <= 1.9
19+
*
20+
* It should not be used with Kotlin versions later than 1.9
21+
*/
22+
// https://github.com/Kotlin/dokka/pull/3147
23+
internal class KotlinNativeDistributionAccessor(
24+
project: Project
25+
) {
26+
private val konanDistribution = KonanDistribution(
27+
@Suppress("INVISIBLE_MEMBER")
28+
project.konanHome
29+
)
30+
31+
val stdlibDir: File = konanDistribution.stdlib
32+
33+
fun platformDependencies(target: KonanTarget): List<File> = konanDistribution
34+
.platformLibsDir
35+
.resolve(target.name)
36+
.listLibraryFiles()
37+
38+
private fun File.listLibraryFiles(): List<File> = listFiles().orEmpty()
39+
.filter { it.isDirectory || it.extension == "klib" }
40+
}

runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/kotlin/kotlinClasspathUtils.kt

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
77
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
88
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
99
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileTool
10+
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
11+
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMON_LIBS_DIR
12+
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
13+
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR
14+
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
15+
import org.jetbrains.kotlin.konan.target.KonanTarget
16+
import java.io.File
1017

1118
internal fun Project.classpathOf(sourceSet: KotlinSourceSet): FileCollection {
1219
val compilations = compilationsOf(sourceSet)
@@ -78,13 +85,67 @@ private fun KotlinCompilation.getKotlinCompileTask(kgpVersion: KotlinGradlePlugi
7885

7986
private fun KotlinCompilation.platformDependencyFiles(project: Project): FileCollection {
8087
val excludePlatformDependencyFiles = project.classpathProperty("excludePlatformDependencyFiles", default = false)
81-
8288
if (excludePlatformDependencyFiles) return project.files()
89+
90+
val useNativeDistributionAccessor = project.classpathProperty("useNativeDistributionAccessor", default = false)
91+
if (useNativeDistributionAccessor) return this.getPlatformDependenciesFromNativeDistributionAccessor(project)
92+
93+
val useKonanDistribution = project.classpathProperty("useKonanDistribution", default = false)
94+
if (useKonanDistribution) return this.getPlatfromDependenciesFromKonanDistribution(project)
95+
8396
return (this as? AbstractKotlinNativeCompilation)
8497
?.target?.project?.configurations
8598
?.findByName(@Suppress("DEPRECATION") this.defaultSourceSet.implementationMetadataConfigurationName) // KT-58640
8699
?: project.files()
87100
}
88101

102+
// https://github.com/Kotlin/dokka/pull/3147
103+
private fun KotlinCompilation.getPlatformDependenciesFromNativeDistributionAccessor(project: Project): FileCollection {
104+
return if (this is AbstractKotlinNativeCompilation) {
105+
val result = project.objects.fileCollection()
106+
val kotlinNativeDistributionAccessor = KotlinNativeDistributionAccessor(project)
107+
result.from(kotlinNativeDistributionAccessor.stdlibDir)
108+
result.from(kotlinNativeDistributionAccessor.platformDependencies(konanTarget))
109+
result
110+
} else {
111+
project.files()
112+
}
113+
}
114+
115+
// -------- The hack for platform dependencies from compiler ------------------
116+
// adapted from https://github.com/jetbrains/kotlin/blob/b6a215d681695a2fe0cc798308966c5675de447f/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt#L39
117+
// https://github.com/Kotlin/dokka/pull/3145
118+
private fun KotlinCompilation.getPlatfromDependenciesFromKonanDistribution(project: Project): FileCollection {
119+
return if (this is AbstractKotlinNativeCompilation)
120+
project.files(project.getStdLibFromKonanDistribution()) + project.files(project.getPlatformLibsFromKonanDistribution(this.konanTarget))
121+
else
122+
project.files()
123+
}
124+
125+
private fun Project.getStdLibFromKonanDistribution(): File {
126+
val root = file(this.konanHome())
127+
val konanCommonLibraries = root.resolve(KONAN_DISTRIBUTION_KLIB_DIR).resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR)
128+
val stdlib = konanCommonLibraries.resolve(KONAN_STDLIB_NAME)
129+
return stdlib
130+
}
131+
132+
// copy-pasted from https://github.com/jetbrains/kotlin/blob/c9aeadd31f763646237faffab38a57923c520fa1/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt#L29
133+
private fun Project.konanHome(): String {
134+
return nativeHome()?.let { file(it).absolutePath }
135+
?: NativeCompilerDownloader(project).compilerDirectory.absolutePath
136+
}
137+
138+
private fun Project.nativeHome(): String? =
139+
this.findProperty("org.jetbrains.kotlin.native.home") as? String
140+
141+
//copy-pasted from https://github.com/jetbrains/kotlin/blob/05a6d89151e6a7230faf733e51161b5f07ae10a7/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/KonanDistributionRepository.kt#L20
142+
// https://github.com/jetbrains/kotlin/blob/b6a215d681695a2fe0cc798308966c5675de447f/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt#L83
143+
private fun Project.getPlatformLibsFromKonanDistribution(target: KonanTarget): Array<out File>? {
144+
val root = file(this.konanHome())
145+
val platformLibsDir = root.resolve(KONAN_DISTRIBUTION_KLIB_DIR).resolve(KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR)
146+
val libs = platformLibsDir.resolve(target.name).takeIf { it.isDirectory }?.listFiles()
147+
return libs
148+
}
149+
89150
private fun Project.classpathProperty(name: String, default: Boolean): Boolean =
90151
(findProperty("org.jetbrains.dokka.classpath.$name") as? String)?.toBoolean() ?: default

0 commit comments

Comments
 (0)