From 847e6cf7487671a395bcf70373538805388f3c02 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 29 Aug 2018 17:46:11 +0700 Subject: [PATCH] [gradle-plugin] Pass component dependencies in cinterop --- .../gradle/plugin/experimental/CInterop.kt | 6 +++ .../internal/KotlinNativeDependenciesImpl.kt | 6 ++- .../internal/cinterop/CInteropImpl.kt | 19 +++++++++- .../internal/cinterop/CInteropSettingsImpl.kt | 37 +++++++++++++++++++ .../plugins/KotlinNativeBasePlugin.kt | 4 +- .../plugin/experimental/tasks/CInteropTask.kt | 17 ++++----- 6 files changed, 77 insertions(+), 12 deletions(-) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/CInterop.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/CInterop.kt index d39cc76f180..615d49bd4dd 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/CInterop.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/CInterop.kt @@ -20,6 +20,7 @@ import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.Named import org.gradle.api.file.FileCollection +import org.gradle.language.ComponentDependencies import org.jetbrains.kotlin.konan.target.KonanTarget interface CInteropSettings { @@ -53,6 +54,11 @@ interface CInteropSettings { fun extraOpts(vararg values: Any) fun extraOpts(values: List) + + val dependencies: ComponentDependencies + fun dependencies(action: ComponentDependencies.() -> Unit) + fun dependencies(action: Closure) + fun dependencies(action: Action) } interface CInterop : Named, CInteropSettings { 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 b8199fdfb08..21399e39ffe 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 @@ -35,7 +35,11 @@ open class KotlinNativeDependenciesImpl @Inject constructor( KotlinNativeDependencies { internal val cinterops = project.container(CInteropImpl::class.java) { name -> - CInteropImpl(project, name) + CInteropImpl(project, name).apply { + dependencies.implementationDependencies.extendsFrom( + this@KotlinNativeDependenciesImpl.implementationDependencies + ) + } } override fun cinterop(name: String) = cinterops.maybeCreate(name) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropImpl.kt index a51a9cdee1e..d747105c248 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropImpl.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropImpl.kt @@ -19,9 +19,10 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.internal.cinterop import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.DomainObjectCollection -import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.file.FileCollection +import org.gradle.language.ComponentDependencies +import org.gradle.language.internal.DefaultComponentDependencies import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.experimental.CInterop import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings @@ -46,12 +47,19 @@ open class CInteropImpl @Inject constructor( private val targetToSettings: MutableMap = mutableMapOf() // DSL. + + override val dependencies = + DefaultComponentDependencies(project.configurations, name + "InteropImplementation") + override fun target(target: String): CInteropSettings = target(target.konanTarget) override fun target(target: KonanTarget): CInteropSettings = targetToSettings.getOrPut(target) { CInteropSettingsImpl(project, name, target).also { platformSettings.add(it) + it.dependencies.implementationDependencies.extendsFrom( + this.dependencies.implementationDependencies + ) } } @@ -93,4 +101,13 @@ open class CInteropImpl @Inject constructor( override fun extraOpts(vararg values: Any) = platformSettings.all { it.extraOpts(*values) } override fun extraOpts(values: List) = platformSettings.all { it.extraOpts(values) } + + override fun dependencies(action: ComponentDependencies.() -> Unit) { + dependencies.action() + } + override fun dependencies(action: Closure) = + dependencies(ConfigureUtil.configureUsing(action)) + override fun dependencies(action: Action) { + action.execute(dependencies) + } } \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt index 826f78a7cb4..ad35215f7d9 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/cinterop/CInteropSettingsImpl.kt @@ -20,10 +20,19 @@ import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.Named import org.gradle.api.Project +import org.gradle.api.attributes.Usage import org.gradle.api.file.FileCollection +import org.gradle.language.ComponentDependencies +import org.gradle.language.cpp.CppBinary +import org.gradle.language.internal.DefaultComponentDependencies +import org.gradle.nativeplatform.OperatingSystemFamily import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings import org.jetbrains.kotlin.gradle.plugin.experimental.CInteropSettings.IncludeDirectories +import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeBinary +import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativeBuildType +import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativeUsage +import org.jetbrains.kotlin.gradle.plugin.experimental.internal.getGradleOSFamily import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File import javax.inject.Inject @@ -64,6 +73,25 @@ open class CInteropSettingsImpl @Inject constructor( // DSL methods. + override val dependencies = DefaultComponentDependencies( + project.configurations, + name + "InteropImplementation" + ).apply { + with(implementationDependencies) { + val objects = project.objects + isCanBeConsumed = false + isCanBeResolved = true + attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinNativeUsage.KLIB)) + attributes.attribute(CppBinary.DEBUGGABLE_ATTRIBUTE, KotlinNativeBuildType.DEBUG.debuggable) + attributes.attribute(CppBinary.OPTIMIZED_ATTRIBUTE, KotlinNativeBuildType.DEBUG.optimized) + attributes.attribute(KotlinNativeBinary.KONAN_TARGET_ATTRIBUTE, konanTarget.name) + attributes.attribute( + OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, + konanTarget.getGradleOSFamily(objects) + ) + } + } + override fun defFile(file: Any) { defFile = project.file(file) } @@ -97,4 +125,13 @@ open class CInteropSettingsImpl @Inject constructor( override fun extraOpts(values: List) { extraOpts.addAll(values.map { it.toString() }) } + + override fun dependencies(action: ComponentDependencies.() -> Unit) { + dependencies.action() + } + override fun dependencies(action: Closure) = + dependencies(ConfigureUtil.configureUsing(action)) + override fun dependencies(action: Action) { + action.execute(dependencies) + } } \ No newline at end of file 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 4be74706e6f..d12da298dcd 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 @@ -203,7 +203,9 @@ class KotlinNativeBasePlugin: Plugin { binary.klibraries.dependencies.add(dependencies.create(files(interopTask.outputFileProvider))) if (binary is KotlinNativeLibrary) { - binary.linkElements.get().outgoing.artifact(interopTask.outputFileProvider) + binary.linkElements.get().outgoing.artifact(interopTask.outputFileProvider) { + it.classifier = "interop-${cinterop.name}" + } } } } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/CInteropTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/CInteropTask.kt index 80c92c77308..870e43e2edc 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/CInteropTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/CInteropTask.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.tasks import org.gradle.api.DefaultTask +import org.gradle.api.artifacts.Configuration import org.gradle.api.file.FileCollection import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.plugin.* @@ -75,6 +76,9 @@ open class CInteropTask @Inject constructor(val settings: CInteropSettingsImpl): val headerFilterDirs: Set @Input get() = settings.includeDirs.headerFilterDirs.files + val libraries: Configuration + @InputFiles get() = settings.dependencies.implementationDependencies + val extraOpts: List @Input get() = settings.extraOpts @@ -102,15 +106,10 @@ open class CInteropTask @Inject constructor(val settings: CInteropSettingsImpl): addArgs("-copt", allHeadersDirs.map { "-I${it.absolutePath}" }) addArgs("-headerFilterAdditionalSearchPrefix", headerFilterDirs.map { it.absolutePath }) - /* TODO: Support dependencies - addArgs("-repo", libraries.repos.map { it.canonicalPath }) - - addFileArgs("-library", libraries.files) - addArgs("-library", libraries.namedKlibs) - addArgs("-library", libraries.artifacts.map { it.artifact.canonicalPath }) - - addKey("-nodefaultlibs", noDefaultLibs) - */ + libraries.files.forEach { library -> + library.parent?.let { addArg("-r", it) } + addArg("-l", library.nameWithoutExtension) + } addAll(extraOpts) }