[gradle-plugin] Pass component dependencies in cinterop

This commit is contained in:
Ilya Matveev
2018-08-29 17:46:11 +07:00
committed by Ilya Matveev
parent 62e3145ca9
commit 847e6cf748
6 changed files with 77 additions and 12 deletions
@@ -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<Any>)
val dependencies: ComponentDependencies
fun dependencies(action: ComponentDependencies.() -> Unit)
fun dependencies(action: Closure<Unit>)
fun dependencies(action: Action<ComponentDependencies>)
}
interface CInterop : Named, CInteropSettings {
@@ -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)
@@ -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<KonanTarget, CInteropSettingsImpl> = 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<Any>) = platformSettings.all { it.extraOpts(values) }
override fun dependencies(action: ComponentDependencies.() -> Unit) {
dependencies.action()
}
override fun dependencies(action: Closure<Unit>) =
dependencies(ConfigureUtil.configureUsing(action))
override fun dependencies(action: Action<ComponentDependencies>) {
action.execute(dependencies)
}
}
@@ -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<Any>) {
extraOpts.addAll(values.map { it.toString() })
}
override fun dependencies(action: ComponentDependencies.() -> Unit) {
dependencies.action()
}
override fun dependencies(action: Closure<Unit>) =
dependencies(ConfigureUtil.configureUsing(action))
override fun dependencies(action: Action<ComponentDependencies>) {
action.execute(dependencies)
}
}
@@ -203,7 +203,9 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
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}"
}
}
}
}
@@ -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<File>
@Input get() = settings.includeDirs.headerFilterDirs.files
val libraries: Configuration
@InputFiles get() = settings.dependencies.implementationDependencies
val extraOpts: List<String>
@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)
}