From 2baf344f5f5261881ef36755c69cffa9e20b18f5 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Fri, 9 Jul 2021 14:39:46 +0200 Subject: [PATCH] [kotlin gradle plugin] enable to work with embedded k/n compiler. --- kotlin-native/build.gradle | 5 +++++ .../src/main/kotlin/KonanHomeProvider.kt | 4 ++-- .../kotlin/gradle/plugin/KotlinGradleSubplugin.kt | 1 + .../kotlin/compilerRunner/KotlinToolRunner.kt | 1 + .../kotlin/compilerRunner/nativeToolRunners.kt | 15 ++++++++++++++- .../kotlin/gradle/plugin/SubpluginEnvironment.kt | 2 +- .../targets/native/NativeCompilerDownloader.kt | 4 +++- .../gradle/SerializationSubplugin.kt | 11 +++++++++++ 8 files changed, 38 insertions(+), 5 deletions(-) diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 06e65f24b06..6bc14b3f6e5 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -246,6 +246,7 @@ task shadowJar(type: ShadowJar) { task distCompiler(type: Copy) { dependsOn ":kotlin-native:dependencies:update" dependsOn ':kotlin-native:shadowJar' + dependsOn ":kotlin-native-compiler-embeddable:kotlin-native-compiler-embeddable" destinationDir distDir @@ -257,6 +258,10 @@ task distCompiler(type: Copy) { into('konan/lib') } + from(project(":kotlin-native-compiler-embeddable").file("build/libs")) { + into("konan/lib") + } + from(project(':kotlin-native:Interop').file('Indexer/build/nativelibs')) { into('konan/nativelib') } diff --git a/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt b/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt index 5d3e8b0edf4..6ac5687279b 100644 --- a/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt +++ b/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt @@ -27,8 +27,8 @@ object KonanHomeProvider { val jarPath = PathUtil.getResourcePathForClass(this::class.java) // Check that the path obtained really points to the distribution. - val expectedRelativeJarPath = Paths.get("konan/lib/kotlin-native.jar") - check(jarPath.toPath().endsWith(expectedRelativeJarPath)) { + check(jarPath.toPath().endsWith(Paths.get("konan/lib/kotlin-native.jar")) || + jarPath.toPath().endsWith(Paths.get("konan/lib/kotlin-native-compiler-embeddable.jar"))) { val classesPath = if (jarPath.extension == "jar") jarPath else jarPath.parentFile """ Cannot determine a compiler distribution directory. diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt index d6acf3d8966..b0bdffca6c2 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleSubplugin.kt @@ -124,6 +124,7 @@ interface KotlinCompilerPluginSupportPlugin : Plugin { fun getCompilerPluginId(): String fun getPluginArtifact(): SubpluginArtifact fun getPluginArtifactForNative(): SubpluginArtifact? = null + fun getPluginArtifactForNative(project: Project): SubpluginArtifact? = getPluginArtifactForNative() } open class SubpluginArtifact(val groupId: String, val artifactId: String, val version: String? = null) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinToolRunner.kt index c163e5283fd..ade5082660f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinToolRunner.kt @@ -116,6 +116,7 @@ internal abstract class KotlinToolRunner( project.logger.info( """|Run in-process tool "$displayName" |Entry point method = $mainClass.$daemonEntryPoint + |Classpath = ${classpath.joinToString(File.pathSeparator) { it.absolutePath }} |Arguments = ${args.toPrettyString()} |Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()} """.trimMargin() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt index 832822f0526..cf252b3ec2a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/nativeToolRunners.kt @@ -77,9 +77,22 @@ internal abstract class KotlinNativeToolRunner( } final override val classpath by lazy { - project.fileTree("${project.konanHome}/konan/lib/").apply { include("*.jar") }.toSet() + project.files( + project.kotlinNativeCompilerJar, + "${project.konanHome}/konan/lib/trove4j.jar" + ).files } + private val Project.kotlinNativeCompilerJar: String + get() = if (isNativeEmbedded) + "$konanHome/konan/lib/kotlin-native-compiler-embeddable.jar" + else + "$konanHome/konan/lib/kotlin-native.jar" + + //TODO: find better place (see org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin.isNativeEmbedded) + private val Project.isNativeEmbedded: Boolean + get() = findProperty("kotlin.native.shaded")?.toString()?.toBoolean() == true + final override fun checkClasspath() = check(classpath.isNotEmpty()) { """ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt index 3c10752fb71..e679ad244ba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt @@ -72,7 +72,7 @@ class SubpluginEnvironment( if (kotlinCompilation is AbstractKotlinNativeCompilation) { - subplugin.getPluginArtifactForNative()?.let { artifact -> + subplugin.getPluginArtifactForNative(project)?.let { artifact -> project.addMavenDependency(kotlinCompilation.pluginConfigurationName, artifact) } } else { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt index cbd9383cba6..9fe16613047 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt @@ -167,7 +167,9 @@ class NativeCompilerDownloader( } fun downloadIfNeeded() { - if (KotlinNativeCompilerRunner(project).classpath.isEmpty()) { + + val classpath = KotlinNativeCompilerRunner(project).classpath + if (classpath.isEmpty() || classpath.any { !it.exists() }) { downloadAndExtract() } } diff --git a/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt b/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt index 8b41551ed36..8fa61c60a33 100644 --- a/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt +++ b/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt @@ -50,6 +50,12 @@ class SerializationGradleSubplugin : override fun getPluginArtifactForNative(): SubpluginArtifact? = SubpluginArtifact(SERIALIZATION_GROUP_NAME, SERIALIZATION_ARTIFACT_UNSHADED_NAME) + override fun getPluginArtifactForNative(project: Project): SubpluginArtifact? = + if (project.isNativeEmbedded) + getPluginArtifact() + else getPluginArtifactForNative() + + override fun getCompilerPluginId() = "org.jetbrains.kotlinx.serialization" //region Stub implementation for legacy API, KT-39809 @@ -63,4 +69,9 @@ class SerializationGradleSubplugin : "Please use an older version of kotlin-serialization or upgrade the Kotlin Gradle plugin version to make them match." ) //endregion + + // TODO: find better place (see org.jetbrains.kotlin.compilerRunner.KotlinNativeToolRunner.isNativeEmbedded) + private val Project.isNativeEmbedded: Boolean + get() = findProperty("kotlin.native.shaded")?.toString()?.toBoolean() == true + }