From cfc4e715e4d539c284c63727fcd13fe045710b40 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Thu, 29 Jul 2021 00:12:51 +0300 Subject: [PATCH] [IR] Tests for IR linking error reporting ^KT-44626 --- .../util/ResolvedDependenciesSupportTest.kt | 134 ++++++++++ .../kotlin/util/ResolvedDependencyIdTest.kt | 56 +++++ .../native/NativeExternalDependenciesIT.kt | 134 ++++++++++ .../gradle/native/NativeIrLinkerIssuesIT.kt | 231 ++++++++++++++++++ .../build.gradle.kts | 28 +++ .../settings.gradle | 11 + .../src/hostMain/kotlin/main.kt | 1 + .../app/build.gradle.kts | 30 +++ .../app/settings.gradle | 11 + .../app/src/nativeMain/kotlin/app.kt | 17 ++ .../liba-v1.0/build.gradle.kts | 24 ++ .../liba-v1.0/settings.gradle | 11 + .../liba-v1.0/src/nativeMain/kotlin/liba.kt | 5 + .../liba-v2.0/build.gradle.kts | 24 ++ .../liba-v2.0/settings.gradle | 11 + .../liba-v2.0/src/nativeMain/kotlin/liba.kt | 4 + .../libb/build.gradle.kts | 29 +++ .../libb/settings.gradle | 11 + .../libb/src/nativeMain/kotlin/libb.kt | 26 ++ .../build.gradle.kts | 29 +++ .../settings.gradle | 11 + .../src/nativeMain/kotlin/main.kt | 1 + .../app/build.gradle.kts | 30 +++ .../app/settings.gradle | 11 + .../app/src/nativeMain/kotlin/app.kt | 14 ++ .../liba-v1.0/build.gradle.kts | 24 ++ .../liba-v1.0/settings.gradle | 11 + .../liba-v1.0/src/nativeMain/kotlin/liba.kt | 5 + .../liba-v2.0/build.gradle.kts | 24 ++ .../liba-v2.0/settings.gradle | 11 + .../liba-v2.0/src/nativeMain/kotlin/liba.kt | 4 + .../libb/build.gradle.kts | 29 +++ .../libb/settings.gradle | 11 + .../libb/src/nativeMain/kotlin/libb.kt | 16 ++ .../targets/native/tasks/KotlinNativeTasks.kt | 53 ++-- 35 files changed, 1067 insertions(+), 15 deletions(-) create mode 100644 compiler/tests/org/jetbrains/kotlin/util/ResolvedDependenciesSupportTest.kt create mode 100644 compiler/tests/org/jetbrains/kotlin/util/ResolvedDependencyIdTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeExternalDependenciesIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeIrLinkerIssuesIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/src/hostMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/src/nativeMain/kotlin/app.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/src/nativeMain/kotlin/liba.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/src/nativeMain/kotlin/liba.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/src/nativeMain/kotlin/libb.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/src/nativeMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/src/nativeMain/kotlin/app.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/src/nativeMain/kotlin/liba.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/src/nativeMain/kotlin/liba.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/src/nativeMain/kotlin/libb.kt diff --git a/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependenciesSupportTest.kt b/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependenciesSupportTest.kt new file mode 100644 index 00000000000..377a9c43fe6 --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependenciesSupportTest.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.util + +import org.jetbrains.kotlin.utils.ResolvedDependenciesSupport +import org.junit.Assert.assertEquals +import org.junit.Assert.fail +import org.junit.Test + +class ResolvedDependenciesSupportTest { + @Test + fun success1() { + val originalText = """ + |1 io.ktor:ktor-io,io.ktor:ktor-io-macosx64[1.5.4] #0[1.5.4] + |${'\t'}/some/path/ktor-io.klib + |${'\t'}/some/path/ktor-io-cinterop-bits.klib + |${'\t'}/some/path/ktor-io-cinterop-sockets.klib + |2 org.jetbrains.kotlin:kotlin-stdlib-common[1.5.0] #1[1.4.32] #3[1.5.0] #4[1.5.0] + |${'\t'}/some/path/kotlin-stdlib-common-1.5.0.jar + |3 org.jetbrains.kotlinx:kotlinx-coroutines-core,org.jetbrains.kotlinx:kotlinx-coroutines-core-macosx64[1.5.0-RC-native-mt] #1[1.4.3-native-mt] #0[1.5.0-RC-native-mt] + |${'\t'}/some/path/kotlinx-coroutines-core.klib + |4 org.jetbrains.kotlinx:atomicfu,org.jetbrains.kotlinx:atomicfu-macosx64[0.16.1] #3[0.16.1] #1[0.15.1] + |${'\t'}/some/path/atomicfu.klib + |${'\t'}/some/path/atomicfu-cinterop-interop.klib + | + """.trimMargin() + + val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line -> + fail("Unexpected failure at line $lineNo: $line") + } + val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules) + + assertEquals(originalText, restoredText) + } + + @Test + fun success2() { + val originalText = """ + |1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0] + |${'\t'}/some/path/liba.klib + |2 org.sample:libb,org.sample:libb-native[1.0] #0[1.0] + |${'\t'}/some/path/libb.klib + | + """.trimMargin() + + val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line -> + fail("Unexpected failure at line $lineNo: $line") + } + val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules) + + assertEquals(originalText, restoredText) + } + + @Test + fun success3() { + val originalText = """ + |1 org.jetbrains.kotlin:kotlin-stdlib-common[1.5.0] #2[1.4.32] #3[1.5.0] #4[1.5.0] #5[1.4.32] #6[1.4.32] #7[1.4.32] #8[1.4.32] + |${'\t'}/some/path/kotlin-stdlib-common-1.5.0.jar + |2 io.ktor:ktor-client-core,io.ktor:ktor-client-core-macosx64[1.5.4] #0[1.5.4] + |${'\t'}/some/path/ktor-client-core.klib + |3 org.jetbrains.kotlinx:kotlinx-coroutines-core,org.jetbrains.kotlinx:kotlinx-coroutines-core-macosx64[1.5.0-RC-native-mt] #0[1.5.0-RC-native-mt] #2[1.4.3-native-mt] #5[1.4.3-native-mt] #6[1.4.3-native-mt] #7[1.4.3-native-mt] #8[1.4.3-native-mt] + |${'\t'}/some/path/kotlinx-coroutines-core.klib + |4 org.jetbrains.kotlinx:atomicfu,org.jetbrains.kotlinx:atomicfu-macosx64[0.16.1] #3[0.16.1] #7[0.15.1] #6[0.15.1] #5[0.15.1] #8[0.15.1] #2[0.15.1] + |${'\t'}/some/path/atomicfu.klib + |${'\t'}/some/path/atomicfu-cinterop-interop.klib + |5 io.ktor:ktor-http,io.ktor:ktor-http-macosx64[1.5.4] #2[1.5.4] #8[1.5.4] + |${'\t'}/some/path/ktor-http.klib + |6 io.ktor:ktor-utils,io.ktor:ktor-utils-macosx64[1.5.4] #5[1.5.4] + |${'\t'}/some/path/ktor-utils.klib + |${'\t'}/some/path/ktor-utils-cinterop-utils.klib + |7 io.ktor:ktor-io,io.ktor:ktor-io-macosx64[1.5.4] #6[1.5.4] + |${'\t'}/some/path/ktor-io.klib + |${'\t'}/some/path/ktor-io-cinterop-bits.klib + |${'\t'}/some/path/ktor-io-cinterop-sockets.klib + |8 io.ktor:ktor-http-cio,io.ktor:ktor-http-cio-macosx64[1.5.4] #2[1.5.4] + |${'\t'}/some/path/ktor-http-cio.klib + | + """.trimMargin() + + val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line -> + fail("Unexpected failure at line $lineNo: $line") + } + val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules) + + assertEquals(originalText, restoredText) + } + + @Test(expected = NoSuchElementException::class) + fun failure1() { + // There is no record with number 42! + val originalText = """ + |1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0] #42[42.42] + |${'\t'}/some/path/liba.klib + |2 org.sample:libb,org.sample:libb-native[1.0] #0[1.0] + |${'\t'}/some/path/libb.klib + | + """.trimMargin() + + ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() } + } + + @Test(expected = MyException::class) + fun failure2() { + // Name not specified. + val originalText = """ + |1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0] + |${'\t'}/some/path/liba.klib + |2 [1.0] #0[1.0] + |${'\t'}/some/path/libb.klib + | + """.trimMargin() + + ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() } + } + + @Test(expected = MyException::class) + fun failure3() { + // Version not specified. + val originalText = """ + |1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0] + |${'\t'}/some/path/liba.klib + |2 org.sample:libb,org.sample:libb-native #0[1.0] + |${'\t'}/some/path/libb.klib + | + """.trimMargin() + + ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() } + } + + private class MyException : Exception() +} diff --git a/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependencyIdTest.kt b/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependencyIdTest.kt new file mode 100644 index 00000000000..95f05712ffd --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/util/ResolvedDependencyIdTest.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.util + +import org.jetbrains.kotlin.utils.ResolvedDependencyId +import org.jetbrains.kotlin.utils.ResolvedDependencyVersion +import org.junit.Assert.* +import org.junit.Test + +class ResolvedDependencyIdTest { + @Test(expected = IllegalStateException::class) + fun failOnNoNames1() { + ResolvedDependencyId() + } + + @Test(expected = IllegalStateException::class) + fun failOnNoNames2() { + ResolvedDependencyId(emptyList()) + } + + @Test + fun namesAreOrdered() { + val characters: List = ('a'..'z') + ('A'..'Z') + ('0'..'9') + val uniqueNames: List = List(10) { + List(20) { characters.random() }.joinToString("") + } + val moduleId = ResolvedDependencyId(uniqueNames) + assertEquals(uniqueNames.sorted(), moduleId.uniqueNames.toList()) + } + + @Test + fun contains() { + assertTrue(ResolvedDependencyId("foo", "bar") in ResolvedDependencyId("foo", "bar")) + assertTrue(ResolvedDependencyId("foo", "bar") in ResolvedDependencyId("foo", "bar", "baz")) + assertFalse(ResolvedDependencyId("foo", "bar") in ResolvedDependencyId("foo", "baz")) + } + + @Test + fun withVersion() { + assertEquals("foo: 1.0.1", ResolvedDependencyId("foo").withVersion(ResolvedDependencyVersion("1.0.1"))) + assertEquals("foo", ResolvedDependencyId("foo").withVersion(ResolvedDependencyVersion(""))) + assertEquals("foo", ResolvedDependencyId("foo").withVersion(ResolvedDependencyVersion.EMPTY)) + } + + @Test + fun toStringImplementation() { + assertEquals("/", ResolvedDependencyId.SOURCE_CODE_MODULE_ID.toString()) + assertEquals("foo", ResolvedDependencyId("foo").toString()) + assertEquals("bar (foo)", ResolvedDependencyId("foo", "bar").toString()) + assertEquals("bar (baz, foo)", ResolvedDependencyId("foo", "bar", "baz").toString()) + assertEquals("bar (baz, foo, qux)", ResolvedDependencyId("foo", "bar", "baz", "qux").toString()) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeExternalDependenciesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeExternalDependenciesIT.kt new file mode 100644 index 00000000000..1146a7b5016 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeExternalDependenciesIT.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.native + +import org.jetbrains.kotlin.gradle.BaseGradleIT +import org.jetbrains.kotlin.gradle.GradleVersionRequired +import org.junit.Test +import java.io.File +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class NativeExternalDependenciesIT : BaseGradleIT() { + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.FOR_MPP_SUPPORT + + @Test + fun `no external dependencies`() = buildProjectWithDependencies { externalDependenciesText -> + assertNull(externalDependenciesText) + } + + @Test + fun `ktor 1_5_4 and coroutines 1_4_3-native-mt`() = buildProjectWithDependencies( + "io.ktor:ktor-io:1.5.4", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3-native-mt" + ) { externalDependenciesText -> + assertNotNull(externalDependenciesText) + + assertEquals( + """ + |1 io.ktor:ktor-io,io.ktor:ktor-io-$MASKED_TARGET_NAME[1.5.4] #0[1.5.4] + |${'\t'}/some/path/ktor-io.klib + |${'\t'}/some/path/ktor-io-cinterop-bits.klib + |${'\t'}/some/path/ktor-io-cinterop-sockets.klib + |2 org.jetbrains.kotlinx:atomicfu,org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME[0.15.1] #3[0.15.1] #1[0.15.1] + |${'\t'}/some/path/atomicfu.klib + |${'\t'}/some/path/atomicfu-cinterop-interop.klib + |3 org.jetbrains.kotlinx:kotlinx-coroutines-core,org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME[1.4.3-native-mt] #0[1.4.3-native-mt] #1[1.4.3-native-mt] + |${'\t'}/some/path/kotlinx-coroutines-core.klib + | + """.trimMargin(), + externalDependenciesText + ) + } + + @Test + fun `ktor 1_5_4 and coroutines 1_5_0-RC-native-mt`() = buildProjectWithDependencies( + "io.ktor:ktor-io:1.5.4", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC-native-mt" + ) { externalDependenciesText -> + assertNotNull(externalDependenciesText) + + assertEquals( + """ + |1 io.ktor:ktor-io,io.ktor:ktor-io-$MASKED_TARGET_NAME[1.5.4] #0[1.5.4] + |${'\t'}/some/path/ktor-io.klib + |${'\t'}/some/path/ktor-io-cinterop-bits.klib + |${'\t'}/some/path/ktor-io-cinterop-sockets.klib + |2 org.jetbrains.kotlinx:atomicfu,org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME[0.16.1] #3[0.16.1] #1[0.15.1] + |${'\t'}/some/path/atomicfu.klib + |${'\t'}/some/path/atomicfu-cinterop-interop.klib + |3 org.jetbrains.kotlinx:kotlinx-coroutines-core,org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME[1.5.0-RC-native-mt] #0[1.5.0-RC-native-mt] #1[1.4.3-native-mt] + |${'\t'}/some/path/kotlinx-coroutines-core.klib + | + """.trimMargin(), + externalDependenciesText + ) + } + + private fun buildProjectWithDependencies( + vararg dependencies: String, + externalDependenciesTextConsumer: (externalDependenciesText: String?) -> Unit + ) { + with(transformNativeTestProjectWithPluginDsl("native-external-dependencies")) { + gradleBuildScript().appendText( + """ + | + |kotlin { + | val commonMain by sourceSets.getting { + | dependencies {${dependencies.joinToString("") { "\n| implementation(\"$it\")" }} + | } + | } + |} + """.trimMargin() + ) + + build( + "assemble", + options = defaultBuildOptions().copy(dryRun = true) + ) { + assertSuccessful() + + val kotlinNativeTargetName = findKotlinNativeTargetName(output) + assertNotNull(kotlinNativeTargetName) + + val externalDependenciesFile = findParameterInOutput("for_test_external_dependencies_file", output)?.let(::File) + val externalDependenciesText = if (externalDependenciesFile?.exists() == true) { + externalDependenciesFile.readText() + .lineSequence() + .map { line -> + if (line.firstOrNull()?.isWhitespace() == true) { + // Transform artifact path. + val pureFileName = File(line.trimStart()).name + "\t/some/path/$pureFileName" + } else { + // Transform module name (mask target name). + line.replace(kotlinNativeTargetName, MASKED_TARGET_NAME) + } + } + .joinToString("\n") + } else null + + externalDependenciesTextConsumer(externalDependenciesText) + } + } + } + + internal companion object { + const val MASKED_TARGET_NAME = "testTargetX64" + + fun findParameterInOutput(name: String, output: String): String? = + output.lineSequence().mapNotNull { line -> + val (key, value) = line.split('=', limit = 2).takeIf { it.size == 2 } ?: return@mapNotNull null + if (key.endsWith(name)) value else null + }.firstOrNull() + + fun findKotlinNativeTargetName(output: String): String? = findParameterInOutput("for_test_kotlin_native_target", output) + ?.takeIf(String::isNotBlank) + ?.toLowerCase() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeIrLinkerIssuesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeIrLinkerIssuesIT.kt new file mode 100644 index 00000000000..7e17937702e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeIrLinkerIssuesIT.kt @@ -0,0 +1,231 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.native + +import org.jetbrains.kotlin.gradle.BaseGradleIT +import org.jetbrains.kotlin.gradle.GradleVersionRequired +import org.jetbrains.kotlin.gradle.native.NativeExternalDependenciesIT.Companion.MASKED_TARGET_NAME +import org.jetbrains.kotlin.gradle.native.NativeExternalDependenciesIT.Companion.findKotlinNativeTargetName +import org.jetbrains.kotlin.gradle.native.NativeExternalDependenciesIT.Companion.findParameterInOutput +import org.junit.Test +import java.io.File +import java.nio.file.Files +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +class NativeIrLinkerIssuesIT : BaseGradleIT() { + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.FOR_MPP_SUPPORT + + @Test + fun `declaration that is gone (KT-41378)`() { + val repo = setupLocalRepo() + + buildAndPublishLibrary("native-ir-linker-issues-gone-declaration", "liba-v1.0", repo) + buildAndPublishLibrary("native-ir-linker-issues-gone-declaration", "liba-v2.0", repo) + buildAndPublishLibrary("native-ir-linker-issues-gone-declaration", "libb", repo) + + buildApplicationAndFail( + directory = "native-ir-linker-issues-gone-declaration", + projectName = "app", + localRepo = repo + ) { kotlinNativeCompilerVersion -> + """ + |e: Module "org.sample:libb (org.sample:libb-native)" has a reference to symbol sample.liba/C|null[0]. Neither the module itself nor its dependencies contain such declaration. + | + |This could happen if the required dependency is missing in the project. Or if there is a dependency of "org.sample:libb (org.sample:libb-native)" that has a different version in the project than the version that "org.sample:libb (org.sample:libb-native): 1.0" was initially compiled with. Please check that the project configuration is correct and has consistent versions of all required dependencies. + | + |The list of "org.sample:libb (org.sample:libb-native): 1.0" dependencies that may lead to conflicts: + |1. "org.sample:liba (org.sample:liba-native): 2.0" (was initially compiled with "org.sample:liba (org.sample:liba-native): 1.0") + | + |Project dependencies: + |├─── org.sample:liba (org.sample:liba-native): 2.0 + |│ └─── stdlib: $kotlinNativeCompilerVersion + |└─── org.sample:libb (org.sample:libb-native): 1.0 + | ^^^ This module requires symbol sample.liba/C|null[0]. + | ├─── org.sample:liba (org.sample:liba-native): 1.0 -> 2.0 (*) + | └─── stdlib: $kotlinNativeCompilerVersion + | + |(*) - dependencies omitted (listed previously) + """.trimMargin() + } + } + + @Test + fun `symbol type mismatch (KT-47285)`() { + val repo = setupLocalRepo() + + buildAndPublishLibrary("native-ir-linker-issues-symbol-mismatch", "liba-v1.0", repo) + buildAndPublishLibrary("native-ir-linker-issues-symbol-mismatch", "liba-v2.0", repo) + buildAndPublishLibrary("native-ir-linker-issues-symbol-mismatch", "libb", repo) + + buildApplicationAndFail( + directory = "native-ir-linker-issues-symbol-mismatch", + projectName = "app", + localRepo = repo + ) { kotlinNativeCompilerVersion -> + """ + |e: The symbol of unexpected type encountered during IR deserialization: IrClassPublicSymbolImpl, sample.liba/B|null[0]. IrTypeAliasSymbol is expected. + | + |This could happen if there are two libraries, where one library was compiled against the different version of the other library than the one currently used in the project. Please check that the project configuration is correct and has consistent versions of dependencies. + | + |The list of libraries that depend on "org.sample:liba (org.sample:liba-native)" and may lead to conflicts: + |1. "org.sample:libb (org.sample:libb-native): 1.0" (was compiled against "org.sample:liba (org.sample:liba-native): 1.0" but "org.sample:liba (org.sample:liba-native): 2.0" is used in the project) + | + |Project dependencies: + |├─── org.sample:liba (org.sample:liba-native): 2.0 + |│ ^^^ This module contains symbol sample.liba/B|null[0] that is the cause of the conflict. + |│ └─── stdlib: $kotlinNativeCompilerVersion + |└─── org.sample:libb (org.sample:libb-native): 1.0 + | ├─── org.sample:liba (org.sample:liba-native): 1.0 -> 2.0 (*) + | │ ^^^ This module contains symbol sample.liba/B|null[0] that is the cause of the conflict. + | └─── stdlib: $kotlinNativeCompilerVersion + | + |(*) - dependencies omitted (listed previously) + """.trimMargin() + } + } + + @Test + fun `ktor 1_5_4 and coroutines 1_5_0-RC-native-mt (KT-46697)`() = buildApplicationAndFail( + directory = null, + projectName = "native-ir-linker-issues-ktor-and-coroutines", + localRepo = null + ) { kotlinNativeCompilerVersion -> + """ + |e: The symbol of unexpected type encountered during IR deserialization: IrClassPublicSymbolImpl, kotlinx.coroutines/CancellationException|null[0]. IrTypeAliasSymbol is expected. + | + |This could happen if there are two libraries, where one library was compiled against the different version of the other library than the one currently used in the project. Please check that the project configuration is correct and has consistent versions of dependencies. + | + |The list of libraries that depend on "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME)" and may lead to conflicts: + |1. "io.ktor:ktor-client-core (io.ktor:ktor-client-core-$MASKED_TARGET_NAME): 1.5.4" (was compiled against "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt" but "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt" is used in the project) + |2. "io.ktor:ktor-http (io.ktor:ktor-http-$MASKED_TARGET_NAME): 1.5.4" (was compiled against "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt" but "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt" is used in the project) + |3. "io.ktor:ktor-http-cio (io.ktor:ktor-http-cio-$MASKED_TARGET_NAME): 1.5.4" (was compiled against "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt" but "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt" is used in the project) + |4. "io.ktor:ktor-io (io.ktor:ktor-io-$MASKED_TARGET_NAME): 1.5.4" (was compiled against "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt" but "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt" is used in the project) + |5. "io.ktor:ktor-utils (io.ktor:ktor-utils-$MASKED_TARGET_NAME): 1.5.4" (was compiled against "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt" but "org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt" is used in the project) + | + |Project dependencies: + |├─── io.ktor:ktor-client-core (io.ktor:ktor-client-core-$MASKED_TARGET_NAME): 1.5.4 + |│ ├─── io.ktor:ktor-http (io.ktor:ktor-http-$MASKED_TARGET_NAME): 1.5.4 + |│ │ ├─── io.ktor:ktor-utils (io.ktor:ktor-utils-$MASKED_TARGET_NAME): 1.5.4 + |│ │ │ ├─── io.ktor:ktor-io (io.ktor:ktor-io-$MASKED_TARGET_NAME): 1.5.4 + |│ │ │ │ ├─── io.ktor:ktor-io-cinterop-bits: 1.5.4 + |│ │ │ │ │ └─── stdlib: 1.4.32 -> $kotlinNativeCompilerVersion + |│ │ │ │ ├─── io.ktor:ktor-io-cinterop-sockets: 1.5.4 + |│ │ │ │ │ └─── stdlib: 1.4.32 -> $kotlinNativeCompilerVersion + |│ │ │ │ ├─── stdlib: 1.4.32 -> $kotlinNativeCompilerVersion + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.CoreFoundation: 1.4.32 -> $kotlinNativeCompilerVersion + |│ │ │ │ │ ├─── stdlib: $kotlinNativeCompilerVersion + |│ │ │ │ │ ├─── org.jetbrains.kotlin.native.platform.darwin: $kotlinNativeCompilerVersion + |│ │ │ │ │ │ ├─── stdlib: $kotlinNativeCompilerVersion + |│ │ │ │ │ │ └─── org.jetbrains.kotlin.native.platform.posix: $kotlinNativeCompilerVersion + |│ │ │ │ │ │ └─── stdlib: $kotlinNativeCompilerVersion + |│ │ │ │ │ └─── org.jetbrains.kotlin.native.platform.posix: $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.darwin: 1.4.32 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.iconv: 1.4.32 -> $kotlinNativeCompilerVersion + |│ │ │ │ │ ├─── stdlib: $kotlinNativeCompilerVersion + |│ │ │ │ │ └─── org.jetbrains.kotlin.native.platform.posix: $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.posix: 1.4.32 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.15.1 -> 0.16.1 + |│ │ │ │ │ ├─── stdlib: 1.5 -> $kotlinNativeCompilerVersion + |│ │ │ │ │ ├─── org.jetbrains.kotlin.native.platform.posix: 1.5 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ │ └─── org.jetbrains.kotlinx:atomicfu-cinterop-interop: 0.16.1 + |│ │ │ │ │ ├─── stdlib: 1.5 -> $kotlinNativeCompilerVersion + |│ │ │ │ │ └─── org.jetbrains.kotlin.native.platform.posix: 1.5 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlinx:atomicfu-cinterop-interop: 0.16.1 (*) + |│ │ │ │ └─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt -> 1.5.0-RC-native-mt + |│ │ │ │ ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + |│ │ │ │ ├─── stdlib: 1.5 -> $kotlinNativeCompilerVersion + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.CoreFoundation: 1.5 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.darwin: 1.5 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlin.native.platform.posix: 1.5 -> $kotlinNativeCompilerVersion (*) + |│ │ │ │ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.16.1 (*) + |│ │ │ │ └─── org.jetbrains.kotlinx:atomicfu-cinterop-interop: 0.16.1 (*) + |│ │ │ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.15.1 -> 0.16.1 (*) + |│ │ │ └─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt -> 1.5.0-RC-native-mt (*) + |│ │ │ ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + |│ │ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.15.1 -> 0.16.1 (*) + |│ │ └─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt -> 1.5.0-RC-native-mt (*) + |│ │ ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + |│ ├─── io.ktor:ktor-http-cio (io.ktor:ktor-http-cio-$MASKED_TARGET_NAME): 1.5.4 + |│ │ ├─── io.ktor:ktor-http (io.ktor:ktor-http-$MASKED_TARGET_NAME): 1.5.4 (*) + |│ │ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.15.1 -> 0.16.1 (*) + |│ │ └─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt -> 1.5.0-RC-native-mt (*) + |│ │ ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + |│ ├─── org.jetbrains.kotlinx:atomicfu (org.jetbrains.kotlinx:atomicfu-$MASKED_TARGET_NAME): 0.15.1 -> 0.16.1 (*) + |│ └─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.4.3-native-mt -> 1.5.0-RC-native-mt (*) + |│ ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + |└─── org.jetbrains.kotlinx:kotlinx-coroutines-core (org.jetbrains.kotlinx:kotlinx-coroutines-core-$MASKED_TARGET_NAME): 1.5.0-RC-native-mt (*) + | ^^^ This module contains symbol kotlinx.coroutines/CancellationException|null[0] that is the cause of the conflict. + | + |(*) - dependencies omitted (listed previously) + """.trimMargin() + } + + private fun buildApplicationAndFail( + directory: String?, + projectName: String, + localRepo: File?, + expectedErrorMessage: (compilerVersion: String) -> String + ) { + prepareProject(directory, projectName, localRepo) { + build("linkDebugExecutableNative") { + assertFailed() + + val kotlinNativeTargetName = findKotlinNativeTargetName(output) + assertNotNull(kotlinNativeTargetName) + + val kotlinNativeCompilerVersion = findKotlinNativeCompilerVersion(output) + assertNotNull(kotlinNativeCompilerVersion) + + val errorMessage = ERROR_LINE_REGEX.findAll(getOutputForTask("linkDebugExecutableNative")) + .map { matchResult -> matchResult.groupValues[1] } + .map { line -> line.replace(kotlinNativeTargetName, MASKED_TARGET_NAME) } + .joinToString("\n") + + assertEquals(expectedErrorMessage(kotlinNativeCompilerVersion), errorMessage) + } + } + } + + private fun buildAndPublishLibrary(directory: String, projectName: String, localRepo: File) { + prepareProject(directory, projectName, localRepo) { + build("publish") { + assertSuccessful() + } + } + } + + private fun prepareProject( + directory: String?, + projectName: String, + localRepo: File?, + block: Project.() -> Unit + ) { + with(transformNativeTestProjectWithPluginDsl(directoryPrefix = directory, projectName = projectName)) { + if (localRepo != null) { + val localRepoPath = localRepo.absolutePath + gradleBuildScript().apply { + writeText(readText().replace("", localRepoPath)) + } + } + + block() + } + } + + private companion object { + private val ERROR_LINE_REGEX = "(?m)^.*\\[ERROR] \\[\\S+] (.*)$".toRegex() + + private fun setupLocalRepo(): File = Files.createTempDirectory("localRepo").toAbsolutePath().toFile() + + fun findKotlinNativeCompilerVersion(output: String): String? = findParameterInOutput( + "for_test_kotlin_native_compiler_version", + output + ) + } +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/build.gradle.kts new file mode 100644 index 00000000000..82e3f8719b3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("host") { + binaries { + executable { + entryPoint = "main" + } + } + } +} + +afterEvaluate { + val externalDependenciesFile = Class.forName("org.jetbrains.kotlin.gradle.tasks.ExternalDependenciesBuilder") + .getDeclaredMethod("buildExternalDependenciesFileForTests", Project::class.java).apply { isAccessible = true } + .invoke(null, project) + ?.toString().orEmpty() + + println("for_test_kotlin_native_target=") + println("for_test_external_dependencies_file=$externalDependenciesFile") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/settings.gradle new file mode 100644 index 00000000000..b19c4128428 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "native-external-dependencies" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/src/hostMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/src/hostMain/kotlin/main.kt new file mode 100644 index 00000000000..067dfde52e4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-external-dependencies/src/hostMain/kotlin/main.kt @@ -0,0 +1 @@ +fun main() = Unit diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/build.gradle.kts new file mode 100644 index 00000000000..a3b599c8ed4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +repositories { + mavenCentral() + mavenLocal() + maven("") +} + +kotlin { + ("native") { + binaries { + executable { + entryPoint = "main" + } + } + sourceSets["commonMain"].dependencies { + implementation("org.sample:libb:1.0") // libb:1.0 is compatible with liba:1.0 only! + implementation("org.sample:liba:2.0") // liba:1.0 -> liba:2.0 + } + } +} + +val konanHome: String? by ext.properties +val kotlinNativeCompilerVersion = konanHome?.let { org.jetbrains.kotlin.konan.target.Distribution(it).compilerVersion } + ?: "" + +println("for_test_kotlin_native_target=") +println("for_test_kotlin_native_compiler_version=$kotlinNativeCompilerVersion") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/settings.gradle new file mode 100644 index 00000000000..e7d9b686eb1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "app" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/src/nativeMain/kotlin/app.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/src/nativeMain/kotlin/app.kt new file mode 100644 index 00000000000..2be645b6809 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/app/src/nativeMain/kotlin/app.kt @@ -0,0 +1,17 @@ +package sample.app + +import sample.liba.A +import sample.liba.B +import sample.libb.getA +import sample.libb.getB +import sample.libb.getAll + +fun main() { + val a: A = getA() + val b: B = getB() + val all = getAll() + + println("a.hashCode(): ${a.hashCode()}") + println("b.hashCode(): ${b.hashCode()}") + println("all: $all") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/build.gradle.kts new file mode 100644 index 00000000000..d48a1ea3723 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "1.0" + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("native") +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/settings.gradle new file mode 100644 index 00000000000..d0b88d86a12 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "liba" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/src/nativeMain/kotlin/liba.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/src/nativeMain/kotlin/liba.kt new file mode 100644 index 00000000000..d5d3e1d769a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v1.0/src/nativeMain/kotlin/liba.kt @@ -0,0 +1,5 @@ +package sample.liba + +class A +class B +class C diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/build.gradle.kts new file mode 100644 index 00000000000..8708cc2861c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "2.0" + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("native") +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/settings.gradle new file mode 100644 index 00000000000..d0b88d86a12 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "liba" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/src/nativeMain/kotlin/liba.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/src/nativeMain/kotlin/liba.kt new file mode 100644 index 00000000000..fcf5a248e56 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/liba-v2.0/src/nativeMain/kotlin/liba.kt @@ -0,0 +1,4 @@ +package sample.liba + +class A +class B diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/build.gradle.kts new file mode 100644 index 00000000000..f073c0320dd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "1.0" + +repositories { + mavenLocal() + mavenCentral() + maven("") +} + +kotlin { + ("native") { + sourceSets["nativeMain"].dependencies { + implementation("org.sample:liba:1.0") + } + } +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/settings.gradle new file mode 100644 index 00000000000..fb3dce4eb44 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "libb" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/src/nativeMain/kotlin/libb.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/src/nativeMain/kotlin/libb.kt new file mode 100644 index 00000000000..1942961845e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-gone-declaration/libb/src/nativeMain/kotlin/libb.kt @@ -0,0 +1,26 @@ +package sample.libb + +import sample.liba.* + +fun getAll(): List { + return listOf(getA(), getB(), getC()) +} + +fun getA(): A { + val a = A() + println("Returning a: ${a::class}, $a") + return a +} + + +fun getB(): B { + val b = B() + println("Returning b: ${b::class}, $b") + return b +} + +fun getC(): C { + val c = C() + println("Returning c: ${c::class}, $c") + return c +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/build.gradle.kts new file mode 100644 index 00000000000..826be53ab2e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("native") { + binaries { + executable { + entryPoint = "main" + } + } + sourceSets["commonMain"].dependencies { + implementation("io.ktor:ktor-client-core:1.5.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC-native-mt") + } + } +} + +val konanHome: String? by ext.properties +val kotlinNativeCompilerVersion = konanHome?.let { org.jetbrains.kotlin.konan.target.Distribution(it).compilerVersion } + ?: "" + +println("for_test_kotlin_native_target=") +println("for_test_kotlin_native_compiler_version=$kotlinNativeCompilerVersion") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/settings.gradle new file mode 100644 index 00000000000..bb6ed669fa6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "native-ir-linker-issues-ktor-and-coroutines" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/src/nativeMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/src/nativeMain/kotlin/main.kt new file mode 100644 index 00000000000..067dfde52e4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-ktor-and-coroutines/src/nativeMain/kotlin/main.kt @@ -0,0 +1 @@ +fun main() = Unit diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/build.gradle.kts new file mode 100644 index 00000000000..7bfa756f71a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +repositories { + mavenCentral() + mavenLocal() + maven("") +} + +kotlin { + ("native") { + binaries { + executable { + entryPoint = "main" + } + } + sourceSets["commonMain"].dependencies { + implementation("org.sample:libb:1.0") + implementation("org.sample:liba:2.0") + } + } +} + +val konanHome: String? by ext.properties +val kotlinNativeCompilerVersion = konanHome?.let { org.jetbrains.kotlin.konan.target.Distribution(it).compilerVersion } + ?: "" + +println("for_test_kotlin_native_target=") +println("for_test_kotlin_native_compiler_version=$kotlinNativeCompilerVersion") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/settings.gradle new file mode 100644 index 00000000000..e7d9b686eb1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "app" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/src/nativeMain/kotlin/app.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/src/nativeMain/kotlin/app.kt new file mode 100644 index 00000000000..27219e236b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/app/src/nativeMain/kotlin/app.kt @@ -0,0 +1,14 @@ +package sample.app + +import sample.liba.A +import sample.liba.B +import sample.libb.getA +import sample.libb.getB + +fun main() { + val a = getA() + val b = getB() + + println("a.hashCode(): ${a.hashCode()}") + println("b.hashCode(): ${b.hashCode()}") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/build.gradle.kts new file mode 100644 index 00000000000..d48a1ea3723 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "1.0" + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("native") +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/settings.gradle new file mode 100644 index 00000000000..d0b88d86a12 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "liba" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/src/nativeMain/kotlin/liba.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/src/nativeMain/kotlin/liba.kt new file mode 100644 index 00000000000..d6328b28746 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v1.0/src/nativeMain/kotlin/liba.kt @@ -0,0 +1,5 @@ +package sample.liba + +class A +class B + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/build.gradle.kts new file mode 100644 index 00000000000..8708cc2861c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "2.0" + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("native") +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/settings.gradle new file mode 100644 index 00000000000..d0b88d86a12 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "liba" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/src/nativeMain/kotlin/liba.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/src/nativeMain/kotlin/liba.kt new file mode 100644 index 00000000000..8561af4c5d1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/liba-v2.0/src/nativeMain/kotlin/liba.kt @@ -0,0 +1,4 @@ +package sample.liba + +class A +typealias B = A diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/build.gradle.kts new file mode 100644 index 00000000000..f073c0320dd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "org.sample" +version = "1.0" + +repositories { + mavenLocal() + mavenCentral() + maven("") +} + +kotlin { + ("native") { + sourceSets["nativeMain"].dependencies { + implementation("org.sample:liba:1.0") + } + } +} + +publishing { + repositories { + maven { + url = file("").toURI() + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/settings.gradle new file mode 100644 index 00000000000..fb3dce4eb44 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +enableFeaturePreview('GRADLE_METADATA') + +rootProject.name = "libb" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/src/nativeMain/kotlin/libb.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/src/nativeMain/kotlin/libb.kt new file mode 100644 index 00000000000..a85a0d81b0b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-ir-linker-issues-symbol-mismatch/libb/src/nativeMain/kotlin/libb.kt @@ -0,0 +1,16 @@ +package sample.libb + +import sample.liba.* + +fun getA(): A { + val a = A() + println("Returning a: ${a::class}, $a") + return a +} + + +fun getB(): B { + val b = B() + println("Returning b: ${b::class}, $") + return b +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index eef3f32a160..67b990146ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -118,10 +118,9 @@ private fun FileCollection.filterOutPublishableInteropLibs(project: Project): Fi * for it (NO-SOURCE check). So we need to take this case into account * and skip libraries that were not compiled. See also: GH-2617 (K/N repo). */ -private val File.isKlibPassedToCompiler: Boolean - get() = (extension == "klib" || isDirectory) && exists() - -private fun Collection.filterKlibsPassedToCompiler(): List = filter { it.isKlibPassedToCompiler } +private fun Collection.filterKlibsPassedToCompiler(): List = filter { + (it.extension == "klib" || it.isDirectory) && it.exists() +} // endregion abstract class AbstractKotlinNativeCompile> : AbstractCompile() { @@ -690,8 +689,7 @@ constructor( } } -@Suppress("FunctionName") -internal class ExternalDependenciesBuilder(val project: Project, val binary: NativeBinary) { +private class ExternalDependenciesBuilder(val project: Project, val binary: NativeBinary) { private val compilation: KotlinNativeCompilation get() = binary.compilation @@ -702,16 +700,13 @@ internal class ExternalDependenciesBuilder(val project: Project, val binary: Nat val konanVersion = Distribution(project.konanHome).compilerVersion?.let(CompilerVersion.Companion::fromString) ?: project.konanVersion - if (!konanVersion.isAtLeast(1, 6, 0)) return emptyList() + if (konanVersion.isAtLeast(1, 6, 0)) { + val dependenciesFile = writeDependenciesFile(buildDependencies(), deleteOnExit = true) + if (dependenciesFile != null) + return listOf("-Xexternal-dependencies=${dependenciesFile.path}") + } - val modules = buildDependencies() - if (modules.isEmpty()) return emptyList() - - val dependenciesFile = Files.createTempFile("kotlin-native-external-dependencies", ".deps").toAbsolutePath().toFile() - dependenciesFile.deleteOnExit() - dependenciesFile.writeText(KResolvedDependenciesSupport.serialize(modules)) - - return listOf("-Xexternal-dependencies=${dependenciesFile.path}") + return emptyList() } private fun buildDependencies(): Collection { @@ -828,6 +823,34 @@ internal class ExternalDependenciesBuilder(val project: Project, val binary: Nat private val ModuleComponentIdentifier.uniqueName: String get() = "$group:$module" + + companion object { + @Suppress("unused") // Used for tests only. Accessed via reflection. + @JvmStatic + fun buildExternalDependenciesFileForTests(project: Project): File? { + val executable = project.tasks.asSequence() + .filterIsInstance() + .map { it.binary } + .filterIsInstance() // Not TestExecutable or any other kind of NativeBinary. Strictly Executable! + .firstOrNull() + ?: return null + + val dependencies = ExternalDependenciesBuilder(project, executable) + .buildDependencies() + .sortedBy { it.id.toString() } + + return writeDependenciesFile(dependencies, deleteOnExit = false) + } + + private fun writeDependenciesFile(dependencies: Collection, deleteOnExit: Boolean): File? { + if (dependencies.isEmpty()) return null + + val dependenciesFile = Files.createTempFile("kotlin-native-external-dependencies", ".deps").toAbsolutePath().toFile() + if (deleteOnExit) dependenciesFile.deleteOnExit() + dependenciesFile.writeText(KResolvedDependenciesSupport.serialize(dependencies)) + return dependenciesFile + } + } } internal class CacheBuilder(