@@ -7,6 +7,13 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
77import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
88import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
99import 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
1118internal fun Project.classpathOf (sourceSet : KotlinSourceSet ): FileCollection {
1219 val compilations = compilationsOf(sourceSet)
@@ -78,13 +85,67 @@ private fun KotlinCompilation.getKotlinCompileTask(kgpVersion: KotlinGradlePlugi
7885
7986private 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+
89150private fun Project.classpathProperty (name : String , default : Boolean ): Boolean =
90151 (findProperty(" org.jetbrains.dokka.classpath.$name " ) as ? String )?.toBoolean() ? : default
0 commit comments