From b971a91a8cc5d4e425aaf373ec97198a1dc44b3d Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 6 Mar 2019 15:11:17 +0300 Subject: [PATCH] Add main interop libraries in test interop dependencies Earlier we added interop libraries built for a main compilation in dependencies of a corresponding test compilation. But we didn't add them in dependencies of interop libraries built for the test compilation. It caused cinterop failures when the test compilation has interop libraries. This patch fixes it by adding main interop libraries in dependencies of test ones. Also earlier interop libraries of test compilations were unintentionally added in apiElements and publication. This patch fixes this issue too. Issue #KT-30290 Fixed --- .../kotlin/gradle/NewMultiplatformIT.kt | 1 + .../publishedLibrary/build.gradle | 11 +++++++---- .../plugin/KotlinNativeTaretConfigurator.kt | 17 +++++++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) 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 58f2c5ffc04..31a6f6c0d51 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 @@ -1124,6 +1124,7 @@ class NewMultiplatformIT : BaseGradleIT() { assertTasksExecuted(":publishedLibrary:cinteropStdio${host.capitalize()}") assertTrue(output.contains("Published test"), "No test output found") assertFileExists("publishedLibrary/build/classes/kotlin/$host/main/publishedLibrary-cinterop-stdio.klib") + assertFileExists("publishedLibrary/build/classes/kotlin/$host/test/test-cinterop-stdio.klib") assertFileExists("repo/org/example/publishedLibrary-$host/1.0/publishedLibrary-$host-1.0-cinterop-stdio.klib") } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-cinterop/publishedLibrary/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-cinterop/publishedLibrary/build.gradle index 7c7ee82d32a..eb1a64c0630 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-cinterop/publishedLibrary/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-native-cinterop/publishedLibrary/build.gradle @@ -34,10 +34,13 @@ kotlin { fromPreset(presets.mingwX64, 'mingw64') configure([macos64, linux64, mingw64]) { - compilations.main.cinterops { - stdio { - packageName 'example.cinterop.published.stdio' - extraOpts '-nodefaultlibs' + compilations.all { + // Add interop in the test compilation too as a regression test for KT-30290. + cinterops { + stdio { + packageName 'example.cinterop.published.stdio' + extraOpts '-nodefaultlibs' + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativeTaretConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativeTaretConfigurator.kt index 7f0836b4c00..65827df2efe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativeTaretConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinNativeTaretConfigurator.kt @@ -194,16 +194,25 @@ open class KotlinNativeTargetConfigurator( val interopOutput = project.files(outputFileProvider).builtBy(this) with(compilation) { + // Register the interop library as a dependency of the compilation to make IDE happy. project.dependencies.add(compileDependencyConfigurationName, interopOutput) if (isMainCompilation) { - target.compilations.findByName(TEST_COMPILATION_NAME)?.let { - project.dependencies.add(it.compileDependencyConfigurationName, interopOutput) + // Register the interop library as an outgoing klib to allow depending on projects with cinterops. + project.dependencies.add(target.apiElementsConfigurationName, interopOutput) + // Add the interop library in publication. + createCInteropKlibArtifact(interop, this@apply) + // We cannot add the interop library in an compilation output because in this case + // IDE doesn't see this library in module dependencies. So we have to manually add + // main interop libraries in dependencies of the default test compilation. + target.compilations.findByName(TEST_COMPILATION_NAME)?.let { testCompilation -> + project.dependencies.add(testCompilation.compileDependencyConfigurationName, interopOutput) + testCompilation.cinterops.all { + it.dependencyFiles += interopOutput + } } } - project.dependencies.add(target.apiElementsConfigurationName, interopOutput) } } - createCInteropKlibArtifact(interop, interopTask) } } // endregion.