diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeComponent.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeComponent.kt index c75f396c703..4568753a591 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeComponent.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeComponent.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental import groovy.lang.Closure import org.gradle.api.Action +import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.artifacts.Configuration import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty @@ -31,6 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.experimental.sourcesets.KotlinNativeSo import org.jetbrains.kotlin.konan.target.KonanTarget interface KotlinNativeDependencies: ComponentDependencies { + val cinterops : NamedDomainObjectContainer fun cinterop(name: String): CInterop fun cinterop(name: String, action: CInterop.() -> Unit) fun cinterop(name: String, action: Closure) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeDependenciesImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeDependenciesImpl.kt index 21399e39ffe..6263209f3c5 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeDependenciesImpl.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeDependenciesImpl.kt @@ -34,7 +34,7 @@ open class KotlinNativeDependenciesImpl @Inject constructor( ) : DefaultComponentDependencies(configurations, implementationName), KotlinNativeDependencies { - internal val cinterops = project.container(CInteropImpl::class.java) { name -> + override val cinterops = project.container(CInteropImpl::class.java) { name -> CInteropImpl(project, name).apply { dependencies.implementationDependencies.extendsFrom( this@KotlinNativeDependenciesImpl.implementationDependencies diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt index f0b9f708bab..c98c61a6172 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt @@ -31,8 +31,7 @@ import org.gradle.language.plugins.NativeBasePlugin import org.gradle.nativeplatform.test.tasks.RunTestExecutable import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.plugin.KonanPlugin -import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings -import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeLibrary +import org.jetbrains.kotlin.gradle.plugin.experimental.* import org.jetbrains.kotlin.gradle.plugin.experimental.internal.* import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.CInteropTask import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile @@ -186,9 +185,9 @@ class KotlinNativeBasePlugin: Plugin { private fun Project.addInteropTasks() { val settingsToTask = mutableMapOf() val namesWithWarning = mutableSetOf() - components.withType(AbstractKotlinNativeBinary::class.java) { binary -> - binary.component.dependencies.cinterops.all { cinterop -> - val konanTarget = binary.konanTarget + + fun AbstractKotlinNativeBinary.setupInteropFromComponent(component: KotlinNativeComponent) { + component.dependencies.cinterops.all { cinterop -> val settings = cinterop.target(konanTarget) val interopTask = settingsToTask.getOrPut(settings) { @@ -198,34 +197,47 @@ class KotlinNativeBasePlugin: Plugin { settings ).apply { group = INTEROP_GROUP - description = "Generates Kotlin/Native interop library '${cinterop.name}' for target '${konanTarget.name}'" + description = + "Generates Kotlin/Native interop library '${cinterop.name}' for target '${konanTarget.name}'" } } - binary.klibraries.dependencies.add(dependencies.create(files(interopTask.outputFileProvider))) - if (binary is KotlinNativeLibrary) { - binary.linkElements.get().outgoing.artifact(interopTask.outputFileProvider) { + klibraries.dependencies.add(project.dependencies.create(files(interopTask.outputFileProvider))) + + if (this is KotlinNativeLibrary) { + linkElements.get().outgoing.artifact(interopTask.outputFileProvider) { it.classifier = "interop-${cinterop.name}" } // User can create an interop with the same name as the main library. // In this case we get two libraries with the same name and one of them depends // on the another. Such a situation is considered as a cyclic dependency by the compiler // so we warn a user about it. - val mainLibraryName = binary.linkFile.get().asFile.nameWithoutExtension + val mainLibraryName = linkFile.get().asFile.nameWithoutExtension val interopLibraryName = interopTask.outputFile.nameWithoutExtension if (mainLibraryName == interopLibraryName && mainLibraryName !in namesWithWarning) { - logger.warn(""" + logger.warn( + """ Warning: you have an interop with the same name as the main library ($mainLibraryName)! It may cause failures in dependent projects so consider renaming the interop. - """.trimIndent()) + """.trimIndent() + ) namesWithWarning.add(mainLibraryName) } } } } + + components.withType(AbstractKotlinNativeBinary::class.java) { binary -> + binary.component.let { + binary.setupInteropFromComponent(it) + if (it is KotlinNativeTestComponent) { + binary.setupInteropFromComponent(it.testedComponent) + } + } + } } private fun ProjectInternal.checkGradleMetadataFeature() { diff --git a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt index 45ff28feeb8..7134d29e7ed 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt +++ b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt @@ -684,7 +684,7 @@ class ExperimentalPluginTests { } // endregion. - rootProject.createRunner().withArguments(":build").build().apply { + rootProject.createRunner().withArguments("build").build().apply { output.contains("Interop is here!") output.contains("Transitive call!") } @@ -722,7 +722,7 @@ class ExperimentalPluginTests { assertTrue(projectDirectory.resolve("libFoo/build").deleteRecursively()) assertTrue(projectDirectory.resolve("libBar/build").deleteRecursively()) - rootProject.createRunner().withArguments(":build").build().apply { + rootProject.createRunner().withArguments("build").build().apply { output.contains("Interop is here!") output.contains("Transitive call!") }