From 71af22dba0d0990b45afe33b3cc81848f550cf3a Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 27 Aug 2021 23:01:42 +0300 Subject: [PATCH] [Gradle] Support Native embeddable compiler jar in subplugins Apply generic (backend-agnostic) compiler plugin artifact instead of Native-specific one when Native embeddable compiler jar is used (with `kotlin.native.useEmbeddableCompilerJar=true` project property). --- .../gradle/plugin/KotlinGradleSubplugin.kt | 8 ++++++ .../mpp/CompilationSpecificPluginPath.kt | 26 +++++++++++++++++++ .../gradle/plugin/SubpluginEnvironment.kt | 2 +- .../targets/native/KotlinNativeCompilation.kt | 3 +++ 4 files changed, 38 insertions(+), 1 deletion(-) 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..42bff7f5d5e 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 @@ -123,6 +123,14 @@ interface KotlinCompilerPluginSupportPlugin : Plugin { fun getCompilerPluginId(): String fun getPluginArtifact(): SubpluginArtifact + + /** + * Kotlin/Native-specific plugin artifact. + * + * If Gradle is configured to use Kotlin/Native embeddable compiler jar + * (with `kotlin.native.useEmbeddableCompilerJar=true` project property), + * then [getPluginArtifact] is used instead. + */ fun getPluginArtifactForNative(): SubpluginArtifact? = null } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt index 9bd56c16ffa..0fca89ba7a8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt @@ -136,6 +136,32 @@ internal class CompilationSpecificPluginPath { assertEquals(listOf("native"), project.subplugins("linuxX64")) } + @Test + fun `native should use regular artifact when embeddable compiler jar is used`() { + // Given plugin but with native-specific artifact + class NativeSpecificPlugin : FakeSubPlugin("common1", "native", { true }) + + // And plugin without native artifact but applicable on all platforms + class RegularPluginWithoutNativeArtifact : FakeSubPlugin("common2", null, { true }) + + // When applying these plugins + val project = buildProjectWithMPP { + plugins.apply(NativeSpecificPlugin::class.java) + plugins.apply(RegularPluginWithoutNativeArtifact::class.java) + + // With kotlin.native.useEmbeddableCompilerJar=true + extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.native.useEmbeddableCompilerJar", "true") + + kotlin { + linuxX64() + } + } + project.evaluate() + + // Expect native target have both regular artifacts + assertEquals(listOf("common1", "common2"), project.subplugins("linuxX64")) + } + @Test fun `native plugin configuration should not be transitive`() { val project = buildProjectWithMPP { 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..0e08ea99a58 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 @@ -71,7 +71,7 @@ class SubpluginEnvironment( project.logger.kotlinDebug { "Loading subplugin $pluginId" } - if (kotlinCompilation is AbstractKotlinNativeCompilation) { + if (kotlinCompilation is AbstractKotlinNativeCompilation && !kotlinCompilation.useGenericPluginArtifact) { subplugin.getPluginArtifactForNative()?.let { artifact -> project.addMavenDependency(kotlinCompilation.pluginConfigurationName, artifact) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index dcda3f2f20c..fb3c549faf7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -72,6 +72,9 @@ abstract class AbstractKotlinNativeCompilation( addSourcesToKotlinNativeCompileTask(project, compileKotlinTaskName, { sourceSet.kotlin }, addAsCommonSources) } + internal val useGenericPluginArtifact: Boolean + get() = project.nativeUseEmbeddableCompilerJar + // Endorsed library controller. override var enableEndorsedLibs: Boolean = false }