org.jetbrains.kotlin.gradle.targets.native.DefaultCInteropSettings.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp
import groovy.lang.Closure
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings.IncludeDirectories
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeVariantCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.disambiguateName
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropIdentifier
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
import javax.inject.Inject
open class DefaultCInteropSettings @Inject constructor(
private val project: Project,
private val name: String,
override val compilation: KotlinNativeCompilationData<*>
) : CInteropSettings {
inner class DefaultIncludeDirectories : CInteropSettings.IncludeDirectories {
var allHeadersDirs: FileCollection = project.files()
var headerFilterDirs: FileCollection = project.files()
override fun allHeaders(vararg includeDirs: Any) = allHeaders(includeDirs.toList())
override fun allHeaders(includeDirs: Collection) {
allHeadersDirs += project.files(*includeDirs.toTypedArray())
}
override fun headerFilterOnly(vararg includeDirs: Any) = headerFilterOnly(includeDirs.toList())
override fun headerFilterOnly(includeDirs: Collection) {
headerFilterDirs += project.files(*includeDirs.toTypedArray())
}
}
override fun getName(): String = name
internal val identifier: CInteropIdentifier
get() = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name)
val target: KotlinNativeTarget?
get() = (compilation as? KotlinNativeCompilation?)?.target
override val dependencyConfigurationName: String
get() = compilation.disambiguateName("${name.capitalize()}CInterop")
override var dependencyFiles: FileCollection = project.files()
val interopProcessingTaskName: String
get() = lowerCamelCaseName(
"cinterop",
compilation.compilationPurpose.takeIf { it != "main" }.orEmpty(),
name,
target?.disambiguationClassifier ?: compilation.compilationClassifier
)
val defFileProperty: Property = project.objects.property(File::class.java)
.apply { set(project.projectDir.resolve("src/nativeInterop/cinterop/$name.def")) }
var defFile: File
get() = defFileProperty.get()
set(value) {
defFileProperty.set(value)
}
var packageName: String?
get() = _packageNameProp.orNull
set(value) {
_packageNameProp.set(value)
}
internal val _packageNameProp: Property = project.objects.property(String::class.java)
val compilerOpts = mutableListOf()
val linkerOpts = mutableListOf()
var extraOpts: List
get() = _extraOptsProp.get()
set(value) {
_extraOptsProp = project.objects.listProperty(String::class.java)
extraOpts(value)
}
internal var _extraOptsProp: ListProperty = project.objects.listProperty(String::class.java)
val includeDirs = DefaultIncludeDirectories()
var headers: FileCollection = project.files()
// DSL methods.
override fun defFile(file: Any) {
defFileProperty.set(project.file(file))
}
override fun packageName(value: String) {
_packageNameProp.set(value)
}
override fun header(file: Any) = headers(file)
override fun headers(vararg files: Any) = headers(project.files(files))
override fun headers(files: FileCollection) {
headers += files
}
override fun includeDirs(vararg values: Any) = includeDirs.allHeaders(values.toList())
override fun includeDirs(closure: Closure) = includeDirs(ConfigureUtil.configureUsing(closure))
override fun includeDirs(action: Action) = includeDirs { action.execute(this) }
override fun includeDirs(configure: IncludeDirectories.() -> Unit) = includeDirs.configure()
override fun compilerOpts(vararg values: String) = compilerOpts(values.toList())
override fun compilerOpts(values: List) {
compilerOpts.addAll(values)
}
override fun linkerOpts(vararg values: String) = linkerOpts(values.toList())
override fun linkerOpts(values: List) {
linkerOpts.addAll(values)
}
override fun extraOpts(vararg values: Any) = extraOpts(values.toList())
override fun extraOpts(values: List) {
_extraOptsProp.addAll(project.provider { values.map { it.toString() } })
}
}
private fun KotlinNativeCompilationData<*>.disambiguateName(simpleName: String): String = when (this) {
is AbstractKotlinNativeCompilation -> (this as AbstractKotlinCompilation<*>).disambiguateName(simpleName)
is KotlinNativeVariantCompilationData -> owner.disambiguateName(simpleName)
else -> lowerCamelCaseName(
this.compilationClassifier,
this.compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME },
simpleName
)
}