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 8ccb04aeee1..7c894e4d9cd 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 @@ -207,6 +207,27 @@ class CommonizerIT : BaseGradleIT() { } } + @Test + fun `test commonizeInterop using posix APIs`() { + with(preparedProject("commonizeInteropUsingPosixApis")) { + build(":commonizeCInterop") { + assertSuccessful() + assertTasksExecuted(":cinteropWithPosixTargetA") + assertTasksExecuted(":cinteropWithPosixTargetB") + assertTasksExecuted(":commonizeNativeDistribution") + assertTasksExecuted(":commonizeCInterop") + } + + build(":compileNativeMainKotlinMetadata") { + assertSuccessful() + assertTasksUpToDate(":cinteropWithPosixTargetA") + assertTasksUpToDate(":cinteropWithPosixTargetB") + assertTasksUpToDate(":commonizeNativeDistribution") + assertTasksUpToDate(":commonizeCInterop") + } + } + } + private fun preparedProject(name: String): Project { return Project(name).apply { setupWorkingDir() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/build.gradle.kts new file mode 100644 index 00000000000..9bbdc545608 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + val targetA = ("targetA") + val targetB = ("targetB") + + val commonMain by sourceSets.getting + val nativeMain by sourceSets.creating + val targetAMain by sourceSets.getting + val targetBMain by sourceSets.getting + + nativeMain.dependsOn(commonMain) + targetAMain.dependsOn(nativeMain) + targetBMain.dependsOn(nativeMain) + + sourceSets.all { + languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") + } + + targetA.compilations.getByName("main").cinterops.create("withPosix") { + header(file("libs/withPosix.h")) + } + targetB.compilations.getByName("main").cinterops.create("withPosix") { + header(file("libs/withPosix.h")) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/gradle.properties new file mode 100644 index 00000000000..0dc17385bc4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/gradle.properties @@ -0,0 +1,3 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.mpp.enableCInteropCommonization=true +kotlin.native.enableDependencyPropagation=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/libs/withPosix.h b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/libs/withPosix.h new file mode 100644 index 00000000000..1c45bb80b18 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/libs/withPosix.h @@ -0,0 +1,2 @@ +#include +struct stat getFileStat(); diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/settings.gradle.kts new file mode 100644 index 00000000000..9612ae41b9a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/settings.gradle.kts @@ -0,0 +1,12 @@ +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/commonizeInteropUsingPosixApis/src/nativeInterop/cinterop/withPosix.def b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/nativeInterop/cinterop/withPosix.def new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/nativeMain/kotlin/NativeMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/nativeMain/kotlin/NativeMain.kt new file mode 100644 index 00000000000..41486a04354 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/nativeMain/kotlin/NativeMain.kt @@ -0,0 +1,10 @@ +import kotlinx.cinterop.useContents +import platform.posix.stat +import withPosix.getFileStat + +fun main() { + repeat(10) { + getFileStat().useContents { score(this) } + } +} +expect fun score(stat: stat): Int diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetAMain/kotlin/score.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetAMain/kotlin/score.kt new file mode 100644 index 00000000000..5ba80af29da --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetAMain/kotlin/score.kt @@ -0,0 +1,5 @@ +import platform.posix.stat + +actual fun score(stat: stat): Int { + return stat.st_blocks.toInt() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetBMain/kotlin/score.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetBMain/kotlin/score.kt new file mode 100644 index 00000000000..dff60438b3a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/commonizeInteropUsingPosixApis/src/targetBMain/kotlin/score.kt @@ -0,0 +1,5 @@ +import platform.posix.stat + +actual fun score(stat: stat): Int { + return stat.rawPtr.toLong().toInt() +}