[gradle-plugin] Fix cinterop in tests

This commit is contained in:
Ilya Matveev
2018-08-30 12:14:04 +07:00
committed by Ilya Matveev
parent e491ef45c4
commit c4306a7462
4 changed files with 29 additions and 15 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental
import groovy.lang.Closure import groovy.lang.Closure
import org.gradle.api.Action import org.gradle.api.Action
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty 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 import org.jetbrains.kotlin.konan.target.KonanTarget
interface KotlinNativeDependencies: ComponentDependencies { interface KotlinNativeDependencies: ComponentDependencies {
val cinterops : NamedDomainObjectContainer<out CInterop>
fun cinterop(name: String): CInterop fun cinterop(name: String): CInterop
fun cinterop(name: String, action: CInterop.() -> Unit) fun cinterop(name: String, action: CInterop.() -> Unit)
fun cinterop(name: String, action: Closure<Unit>) fun cinterop(name: String, action: Closure<Unit>)
@@ -34,7 +34,7 @@ open class KotlinNativeDependenciesImpl @Inject constructor(
) : DefaultComponentDependencies(configurations, implementationName), ) : DefaultComponentDependencies(configurations, implementationName),
KotlinNativeDependencies { KotlinNativeDependencies {
internal val cinterops = project.container(CInteropImpl::class.java) { name -> override val cinterops = project.container(CInteropImpl::class.java) { name ->
CInteropImpl(project, name).apply { CInteropImpl(project, name).apply {
dependencies.implementationDependencies.extendsFrom( dependencies.implementationDependencies.extendsFrom(
this@KotlinNativeDependenciesImpl.implementationDependencies this@KotlinNativeDependenciesImpl.implementationDependencies
@@ -31,8 +31,7 @@ import org.gradle.language.plugins.NativeBasePlugin
import org.gradle.nativeplatform.test.tasks.RunTestExecutable import org.gradle.nativeplatform.test.tasks.RunTestExecutable
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.KonanPlugin import org.jetbrains.kotlin.gradle.plugin.KonanPlugin
import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings import org.jetbrains.kotlin.gradle.plugin.experimental.*
import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeLibrary
import org.jetbrains.kotlin.gradle.plugin.experimental.internal.* 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.CInteropTask
import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile
@@ -186,9 +185,9 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
private fun Project.addInteropTasks() { private fun Project.addInteropTasks() {
val settingsToTask = mutableMapOf<CInteropSettings, CInteropTask>() val settingsToTask = mutableMapOf<CInteropSettings, CInteropTask>()
val namesWithWarning = mutableSetOf<String>() val namesWithWarning = mutableSetOf<String>()
components.withType(AbstractKotlinNativeBinary::class.java) { binary ->
binary.component.dependencies.cinterops.all { cinterop -> fun AbstractKotlinNativeBinary.setupInteropFromComponent(component: KotlinNativeComponent) {
val konanTarget = binary.konanTarget component.dependencies.cinterops.all { cinterop ->
val settings = cinterop.target(konanTarget) val settings = cinterop.target(konanTarget)
val interopTask = settingsToTask.getOrPut(settings) { val interopTask = settingsToTask.getOrPut(settings) {
@@ -198,34 +197,47 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
settings settings
).apply { ).apply {
group = INTEROP_GROUP 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))) klibraries.dependencies.add(project.dependencies.create(files(interopTask.outputFileProvider)))
if (binary is KotlinNativeLibrary) {
binary.linkElements.get().outgoing.artifact(interopTask.outputFileProvider) { if (this is KotlinNativeLibrary) {
linkElements.get().outgoing.artifact(interopTask.outputFileProvider) {
it.classifier = "interop-${cinterop.name}" it.classifier = "interop-${cinterop.name}"
} }
// User can create an interop with the same name as the main library. // 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 // 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 // on the another. Such a situation is considered as a cyclic dependency by the compiler
// so we warn a user about it. // 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 val interopLibraryName = interopTask.outputFile.nameWithoutExtension
if (mainLibraryName == interopLibraryName && mainLibraryName !in namesWithWarning) { if (mainLibraryName == interopLibraryName && mainLibraryName !in namesWithWarning) {
logger.warn(""" logger.warn(
"""
Warning: you have an interop with the same name as the main library ($mainLibraryName)! 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. It may cause failures in dependent projects so consider renaming the interop.
""".trimIndent()) """.trimIndent()
)
namesWithWarning.add(mainLibraryName) 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() { private fun ProjectInternal.checkGradleMetadataFeature() {
@@ -684,7 +684,7 @@ class ExperimentalPluginTests {
} }
// endregion. // endregion.
rootProject.createRunner().withArguments(":build").build().apply { rootProject.createRunner().withArguments("build").build().apply {
output.contains("Interop is here!") output.contains("Interop is here!")
output.contains("Transitive call!") output.contains("Transitive call!")
} }
@@ -722,7 +722,7 @@ class ExperimentalPluginTests {
assertTrue(projectDirectory.resolve("libFoo/build").deleteRecursively()) assertTrue(projectDirectory.resolve("libFoo/build").deleteRecursively())
assertTrue(projectDirectory.resolve("libBar/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("Interop is here!")
output.contains("Transitive call!") output.contains("Transitive call!")
} }