From 9e9450caa2e3d61ea0b2b28fe4b0007c00ae505c Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 19 Apr 2021 12:00:01 +0200 Subject: [PATCH] Fix adding associated compilation for Kotlin Native. Kotlin native does not support 'compileOnly' or 'runtimeOnly' configurations. In this case associated compilations are added as 'implementation'. ^KT-45911 Fixed --- .../kotlin/gradle/NewMultiplatformIT.kt | 95 +++++++++++++++---- .../build.gradle.kts | 18 ++++ .../settings.gradle.kts | 11 +++ .../gradle/plugin/mpp/kotlinCompilations.kt | 1 - .../targets/native/KotlinNativeCompilation.kt | 14 +++ 5 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/settings.gradle.kts diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 2ab35c4aaea..168fa4b2357 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -4,6 +4,7 @@ */ package org.jetbrains.kotlin.gradle +import org.gradle.api.logging.LogLevel import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.checkNativeCommandLineArguments import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.containsSequentially import org.gradle.api.logging.configuration.WarningMode @@ -693,8 +694,9 @@ class NewMultiplatformIT : BaseGradleIT() { } @Test - fun testLanguageSettingsClosureForKotlinDsl() = with(transformNativeTestProjectWithPluginDsl("sample-lib-gradle-kotlin-dsl", gradleVersion, "new-mpp-lib-and-app")) { - gradleBuildScript().appendText( + fun testLanguageSettingsClosureForKotlinDsl() = + with(transformNativeTestProjectWithPluginDsl("sample-lib-gradle-kotlin-dsl", gradleVersion, "new-mpp-lib-and-app")) { + gradleBuildScript().appendText( "\n" + """ kotlin.sourceSets.all { languageSettings { @@ -703,16 +705,16 @@ class NewMultiplatformIT : BaseGradleIT() { } } """.trimIndent() - ) + ) - listOf("compileKotlinMetadata", "compileKotlinJvm6", "compileKotlinNodeJs").forEach { - build(it) { - assertSuccessful() - assertTasksExecuted(":$it") - assertContains("-language-version 1.3", "-api-version 1.3") + listOf("compileKotlinMetadata", "compileKotlinJvm6", "compileKotlinNodeJs").forEach { + build(it) { + assertSuccessful() + assertTasksExecuted(":$it") + assertContains("-language-version 1.3", "-api-version 1.3") + } } } - } @Test fun testLanguageSettingsApplied() = with(transformNativeTestProject("sample-lib", gradleVersion, "new-mpp-lib-and-app")) { @@ -1409,19 +1411,19 @@ class NewMultiplatformIT : BaseGradleIT() { ) assertContains(">> :app:testNonTransitiveDependencyNotationApiDependenciesMetadata --> kotlin-reflect-${defaultBuildOptions().kotlinVersion}.jar") - assertEquals( - 1, - (Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output) - .count() - ) + assertEquals( + 1, + (Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output) + .count() + ) - assertContains(">> :app:testExplicitKotlinVersionApiDependenciesMetadata --> kotlin-reflect-1.3.0.jar") - assertContains(">> :app:testExplicitKotlinVersionImplementationDependenciesMetadata --> kotlin-reflect-1.2.71.jar") - assertContains(">> :app:testExplicitKotlinVersionCompileOnlyDependenciesMetadata --> kotlin-reflect-1.2.70.jar") - assertContains(">> :app:testExplicitKotlinVersionRuntimeOnlyDependenciesMetadata --> kotlin-reflect-1.2.60.jar") + assertContains(">> :app:testExplicitKotlinVersionApiDependenciesMetadata --> kotlin-reflect-1.3.0.jar") + assertContains(">> :app:testExplicitKotlinVersionImplementationDependenciesMetadata --> kotlin-reflect-1.2.71.jar") + assertContains(">> :app:testExplicitKotlinVersionCompileOnlyDependenciesMetadata --> kotlin-reflect-1.2.70.jar") + assertContains(">> :app:testExplicitKotlinVersionRuntimeOnlyDependenciesMetadata --> kotlin-reflect-1.2.60.jar") - assertContains(">> :app:testProjectWithConfigurationApiDependenciesMetadata --> output.txt") - } + assertContains(">> :app:testProjectWithConfigurationApiDependenciesMetadata --> output.txt") + } testDependencies() @@ -1712,4 +1714,55 @@ class NewMultiplatformIT : BaseGradleIT() { assertEquals("org.sample.one:foo", jsManifest[KLIB_PROPERTY_UNIQUE_NAME]) } } -} + + @Test + fun testNativeCompilationShouldNotProduceAnyWarningsForAssociatedCompilations() { + with(Project("native-common-dependencies-warning", minLogLevel = LogLevel.INFO)) { + setupWorkingDir() + build("help") { + assertSuccessful() + assertNotContains("A compileOnly dependency is used in the Kotlin/Native target '${detectNativeEnabledCompilation()}':") + } + } + } + + @Test + fun testNativeCompilationShouldProduceWarningOnCompileOnlyCommonDependency() { + with(Project("native-common-dependencies-warning", minLogLevel = LogLevel.INFO)) { + setupWorkingDir() + gradleBuildScript().modify { + it.replaceFirst("//compileOnly:", "") + } + build("help") { + assertSuccessful() + assertContains("A compileOnly dependency is used in the Kotlin/Native target '${detectNativeEnabledCompilation()}':") + } + } + } + + @Test + fun testNativeCompilationCompileOnlyDependencyWarningCouldBeDisabled() { + with(Project("native-common-dependencies-warning", minLogLevel = LogLevel.INFO)) { + setupWorkingDir() + gradleBuildScript().modify { + it.replaceFirst("//compileOnly:", "") + } + projectDir.resolve("gradle.properties").writeText( + """ + kotlin.native.ignoreIncorrectDependencies = true + """.trimIndent() + ) + build("help") { + assertSuccessful() + assertNotContains("A compileOnly dependency is used in the Kotlin/Native target '${detectNativeEnabledCompilation()}':") + } + } + } + + private fun detectNativeEnabledCompilation(): String = when { + HostManager.hostIsLinux -> "linuxX64" + HostManager.hostIsMingw -> "mingwX64" + HostManager.hostIsMac -> "macosX64" + else -> throw AssertionError("Host ${HostManager.host} is not supported for this test") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/build.gradle.kts new file mode 100644 index 00000000000..b7e8e0c8afa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + linuxX64() + mingwX64() + macosX64() +} + +dependencies { + //compileOnly: commonMainCompileOnly("org.jetbrains.kotlin:kotlin-stdlib") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/settings.gradle.kts new file mode 100644 index 00000000000..b63391625d2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-common-dependencies-warning/settings.gradle.kts @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id("org.jetbrains.kotlin.multiplatform") version "${extra["kotlin_version"]}" + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 2635bdf5bed..e1f89a7b63f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -254,7 +254,6 @@ abstract class AbstractKotlinCompilation( protected open fun addAssociateCompilationDependencies(other: KotlinCompilation<*>) { with(target.project) { - dependencies.add( compileOnlyConfigurationName, project.files(Callable { other.output.classesDirs }) 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 5c2d2751c4c..a00902cf003 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 @@ -104,6 +104,20 @@ class KotlinNativeCompilation( val binariesTaskName: String get() = lowerCamelCaseName(target.disambiguationClassifier, compilationName, "binaries") + + override fun addAssociateCompilationDependencies(other: KotlinCompilation<*>) { + with(target.project) { + // Kotlin native does not support either 'compileOnly' or 'runtimeOnly' configurations + dependencies.add( + implementationConfigurationName, + project.files({ other.output.classesDirs }) + ) + + configurations.named(implementationConfigurationName).configure { + it.extendsFrom(configurations.findByName(other.implementationConfigurationName)) + } + } + } } class KotlinSharedNativeCompilation(override val target: KotlinMetadataTarget, val konanTargets: List, name: String) :