diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt index ce0e8ebb433..e292b9bf767 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt @@ -71,6 +71,14 @@ interface KotlinNativeBinary: ComponentWithDependencies, BuildableComponent { */ val additionalCompilerOptions: Collection + // DSL. + /** + * Additional options passed to a linker when this binary is built. + */ + val linkerOpts: MutableList + fun linkerOpts(values: List) + fun linkerOpts(vararg values: String) + companion object { val KONAN_TARGET_ATTRIBUTE = Attribute.of("org.gradle.native.kotlin.platform", String::class.java) } 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 3f489eacc94..c75f396c703 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 @@ -61,6 +61,9 @@ interface KotlinNativeComponent: ComponentWithBinaries, ComponentWithDependencie // region DSL + /** Allows a user to specify targets this component is built for. */ + var targets: List + /** Provides an access to component's dependencies including cinterop and jsinterop DSL */ override fun getDependencies(): KotlinNativeDependencies @@ -69,8 +72,14 @@ interface KotlinNativeComponent: ComponentWithBinaries, ComponentWithDependencie fun dependencies(action: Action) /** Set native targets for this component. */ + @Deprecated("Use the 'targets' property instead. E.g. targets = ['macos_x64', 'linux_x64']") fun target(vararg targets: String) + /** Provide a way to configure binaries included in this component for a particular target. */ + fun target(target: String, action: KotlinNativeBinary.() -> Unit) + fun target(target: String, action: Closure) + fun target(target: String, action: Action) + /** Set additional compiler options for this component. */ val extraOpts: Collection diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt index 0b34401b1e7..4ee6e709222 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeBinary.kt @@ -135,4 +135,10 @@ abstract class AbstractKotlinNativeBinary( override val additionalCompilerOptions: Collection get() = component.extraOpts + + override val linkerOpts = mutableListOf() + override fun linkerOpts(values: List) = linkerOpts(*values.toTypedArray()) + override fun linkerOpts(vararg values: String) { + linkerOpts.addAll(values) + } } \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeComponent.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeComponent.kt index ed329c44e08..899d1df7d6c 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeComponent.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/AbstractKotlinNativeComponent.kt @@ -77,11 +77,35 @@ abstract class AbstractKotlinNativeComponent @Inject constructor( override fun getImplementationDependencies(): Configuration = dependencies.implementationDependencies - // region DSL + // region DSL. + override var targets: List + get() = konanTargets.get().map { it.name } + set(value) { + val hostManager = HostManager() + konanTargets.set(targets.map { hostManager.targetByName(it) }) + } + + override fun target(target: String, action: KotlinNativeBinary.() -> Unit) = + binaries.whenElementKnown { + if (it.konanTarget == HostManager().targetByName(target)) { + it.action() + } + } + + override fun target(target: String, action: Closure) = + target(target, ConfigureUtil.configureUsing(action)) + + override fun target(target: String, action: Action) = + target(target) { action.execute(this) } + + @Deprecated("Use the 'targets' property instead. E.g. targets = ['macos_x64', 'linux_x64']") override fun target(vararg targets: String) { - val hostManager = HostManager() - konanTargets.set(targets.map { hostManager.targetByName(it) }) + project.logger.warn(""" + Kotlin/Native component's method 'target' is deprecated. Use the 'targets' property instead. + E.g. targets = ['macos_x64', 'linux_x64'] + """.trimIndent()) + this.targets = targets.toList() } override val extraOpts = mutableListOf() 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 dc5f136b6f9..4be74706e6f 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 @@ -32,8 +32,8 @@ 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.internal.* -import org.jetbrains.kotlin.gradle.plugin.experimental.internal.cinterop.CInteropSettingsImpl import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.CInteropTask import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.plugin.hasProperty @@ -184,9 +184,7 @@ class KotlinNativeBasePlugin: Plugin { } private fun Project.addInteropTasks() { - val settingsToTask = mutableMapOf() - components.withType(AbstractKotlinNativeBinary::class.java) { binary -> binary.component.dependencies.cinterops.all { cinterop -> val konanTarget = binary.konanTarget @@ -204,6 +202,9 @@ class KotlinNativeBasePlugin: Plugin { } binary.klibraries.dependencies.add(dependencies.create(files(interopTask.outputFileProvider))) + if (binary is KotlinNativeLibrary) { + binary.linkElements.get().outgoing.artifact(interopTask.outputFileProvider) + } } } } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt index 91b1d017d87..61123d78586 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt @@ -24,10 +24,7 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.TaskAction -import org.jetbrains.kotlin.gradle.plugin.KonanCompilerRunner -import org.jetbrains.kotlin.gradle.plugin.KonanPlugin -import org.jetbrains.kotlin.gradle.plugin.addArg -import org.jetbrains.kotlin.gradle.plugin.addKey +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.experimental.internal.AbstractKotlinNativeBinary import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind.* @@ -59,6 +56,9 @@ open class KotlinNativeCompile @Inject constructor(internal val binary: Abstract val additionalCompilerOptions: Collection @Input get() = binary.additionalCompilerOptions + val linkerOpts: List + @Input get() = binary.linkerOpts + val outputFile: File get() = outputLocationProvider.get().asFile @@ -120,6 +120,8 @@ open class KotlinNativeCompile @Inject constructor(internal val binary: Abstract addArg("-l", library.nameWithoutExtension) } + addListArg("-linkerOpts", linkerOpts) + addAll(sources.files.map { it.absolutePath }) }