From b1c5c10233323d2d776348620bbe8e6713e34f1a Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 6 Aug 2021 09:56:26 +0200 Subject: [PATCH] [Gradle] Implement `test KT-48118 c-interops available in commonMain` Integration Test project was taken from: https://github.com/4qa/kotlin-multiplatform-issues/tree/cinterop-common The issue seems to be twofold: 1) The old `compileKotlinMetadata` task is still found, even when compatibilityMetadataVariant is disabled 2) The shared native compilation for commonMain can't be found, because it is not listing its default source set: (see: https://youtrack.jetbrains.com/issue/KT-45412) Covers ^KT-48118 --- .../jetbrains/kotlin/gradle/CommonizerIT.kt | 23 +++++++++ .../reportSourceSetCommonizerDependencies.kt | 19 +++++++- .../build.gradle.kts | 48 +++++++++++++++++++ .../gradle.properties | 5 ++ .../libs/include/dummy/dummy.h | 1 + .../settings.gradle.kts | 10 ++++ .../src/commonMain/kotlin/Common.kt | 3 ++ .../src/nativeInterop/cinterop/dummy.def | 0 .../src/upperMain/kotlin/SharedNative.kt | 3 ++ 9 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/libs/include/dummy/dummy.h create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/commonMain/kotlin/Common.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/nativeInterop/cinterop/dummy.def create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/upperMain/kotlin/SharedNative.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt index e316237429e..192fa5f4fc7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerIT.kt @@ -515,6 +515,29 @@ class CommonizerIT : BaseGradleIT() { } } + @Test + fun `test KT-48118 c-interops available in commonMain`() { + with(Project("commonize-kt-48118-c-interop-in-common-main")) { + reportSourceSetCommonizerDependencies(this) { + val upperMain = getCommonizerDependencies("upperMain") + upperMain.onlyCInterops().assertDependencyFilesMatches(".*cinterop-dummy") + upperMain.onlyNativeDistribution().assertNotEmpty() + + val commonMain = getCommonizerDependencies("commonMain") + commonMain.onlyCInterops().assertDependencyFilesMatches(".*cinterop-dummy") + commonMain.onlyNativeDistribution().assertNotEmpty() + } + + build(":compileCommonMainKotlinMetadata") { + assertSuccessful() + } + + build(":compileUpperMainKotlinMetadata") { + assertSuccessful() + } + } + } + @Test fun `test KT-47641 commonizing c-interops does not depend on any source compilation`() { with(Project("commonize-kt-47641-cinterops-compilation-dependency")) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt index b070ac76899..0cc4ae7378f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/reportSourceSetCommonizerDependencies.kt @@ -38,6 +38,15 @@ data class SourceSetCommonizerDependencies( ) } + fun onlyNativeDistribution(): SourceSetCommonizerDependencies { + return SourceSetCommonizerDependencies( + sourceSetName, + dependencies.filter { dependency -> + dependency.file.allParents.any { parentFile -> parentFile.name == ".konan" } + }.toSet() + ) + } + fun assertTargetOnAllDependencies(target: CommonizerTarget) { dependencies.forEach { dependency -> if (dependency.target != target) { @@ -52,6 +61,12 @@ data class SourceSetCommonizerDependencies( } } + fun assertNotEmpty() { + if (dependencies.isEmpty()) { + fail("$sourceSetName: Missing dependencies") + } + } + fun assertDependencyFilesMatches(@Language("RegExp") @RegEx @RegExp vararg fileMatchers: String?) { assertDependencyFilesMatches(fileMatchers.filterNotNull().map(::Regex).toSet()) } @@ -137,12 +152,12 @@ private const val dollar = "\$" private val taskSourceCode = """ tasks.register("reportCommonizerSourceSetDependencies") { - kotlin.sourceSets.withType(DefaultKotlinSourceSet::class).all { + kotlin.sourceSets.withType(org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet::class).all { inputs.files(configurations.getByName(intransitiveMetadataConfigurationName)) } doLast { - kotlin.sourceSets.filterIsInstance().forEach { sourceSet -> + kotlin.sourceSets.filterIsInstance().forEach { sourceSet -> val configuration = configurations.getByName(sourceSet.intransitiveMetadataConfigurationName) val dependencies = configuration.files diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/build.gradle.kts new file mode 100644 index 00000000000..7956e69f8e2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() +} + +kotlin { + linuxArm64() { + compilations.getByName("main") { + cinterops { + create("dummy") { + headers("libs/include/dummy/dummy.h") + compilerOpts.add("-Ilibs/include") + } + } + } + } + linuxX64(){ + compilations.getByName("main") { + cinterops { + create("dummy") { + headers("libs/include/dummy/dummy.h") + compilerOpts.add("-Ilibs/include") + } + } + } + } + + sourceSets { + val commonMain by getting + + val linuxArm64Main by getting + val linuxX64Main by getting + + val upperMain by creating { + dependsOn(commonMain) + } + + val lowerMain by creating { + dependsOn(upperMain) + linuxArm64Main.dependsOn(this) + linuxX64Main.dependsOn(this) + } + } +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/gradle.properties new file mode 100644 index 00000000000..bd508beeabe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/gradle.properties @@ -0,0 +1,5 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.native.enableDependencyPropagation=false +kotlin.mpp.enableCInteropCommonization=true +kotlin.mpp.enableCompatibilityMetadataVariant=false +kotlin.mpp.enableIntransitiveMetadataConfiguration=true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/libs/include/dummy/dummy.h b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/libs/include/dummy/dummy.h new file mode 100644 index 00000000000..c44e102a191 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/libs/include/dummy/dummy.h @@ -0,0 +1 @@ +int max(int num1, int num2); diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/settings.gradle.kts new file mode 100644 index 00000000000..ecdece6ecfe --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/settings.gradle.kts @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } + val kotlin_version: String by settings + plugins { + kotlin("multiplatform").version(kotlin_version) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/commonMain/kotlin/Common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/commonMain/kotlin/Common.kt new file mode 100644 index 00000000000..b97df657174 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/commonMain/kotlin/Common.kt @@ -0,0 +1,3 @@ +fun c(){ + dummy.max(2,3) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/nativeInterop/cinterop/dummy.def b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/nativeInterop/cinterop/dummy.def new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/upperMain/kotlin/SharedNative.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/upperMain/kotlin/SharedNative.kt new file mode 100644 index 00000000000..5bf4e8b18a4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonize-kt-48118-c-interop-in-common-main/src/upperMain/kotlin/SharedNative.kt @@ -0,0 +1,3 @@ +fun sn(){ + dummy.max(1,2) +} \ No newline at end of file