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 e292b9bf767..98fc9b1bc55 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,13 +71,10 @@ 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) + val linkerOpts: List 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 4568753a591..930ae306cad 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 @@ -39,6 +39,15 @@ interface KotlinNativeDependencies: ComponentDependencies { fun cinterop(name: String, action: Action) } +interface TargetSettings { + /** + * Additional options passed to a linker when a binary is built. + */ + val linkerOpts: MutableList + fun linkerOpts(values: List) + fun linkerOpts(vararg values: String) +} + /** * Class representing a Kotlin/Native component: application or library (both klib and dynamic) * built for different targets. @@ -77,10 +86,15 @@ interface KotlinNativeComponent: ComponentWithBinaries, ComponentWithDependencie @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) + /** Allows providing target-specific compiler options. */ + fun target(target: String): TargetSettings + fun target(konanTarget: KonanTarget): TargetSettings + fun target(target: String, action: TargetSettings.() -> Unit) fun target(target: String, action: Closure) - fun target(target: String, action: Action) + fun target(target: String, action: Action) + fun allTargets(action: TargetSettings.() -> Unit) + fun allTargets(action: Closure) + fun allTargets(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 4ee6e709222..75a16e7a67c 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 @@ -136,9 +136,6 @@ 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) - } + override val linkerOpts: List + get() = component.target(konanTarget).linkerOpts } \ 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 d90316d9b61..b6f6f291cff 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 @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.internal import groovy.lang.Closure import org.gradle.api.Action +import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.internal.file.FileOperations @@ -33,12 +34,22 @@ import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeBinary import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeComponent import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeDependencies +import org.jetbrains.kotlin.gradle.plugin.experimental.TargetSettings import org.jetbrains.kotlin.gradle.plugin.experimental.sourcesets.KotlinNativeSourceSetImpl import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.utils.addToStdlib.assertedCast import javax.inject.Inject +class TargetSettingsImpl(val konanTarget: KonanTarget) : Named, TargetSettings { + override fun getName(): String = konanTarget.name + override val linkerOpts = mutableListOf() + override fun linkerOpts(values: List) = linkerOpts(*values.toTypedArray()) + override fun linkerOpts(vararg values: String) { + linkerOpts.addAll(values) + } +} + abstract class AbstractKotlinNativeComponent @Inject constructor( private val name: String, override val sources: KotlinNativeSourceSetImpl, @@ -77,6 +88,11 @@ abstract class AbstractKotlinNativeComponent @Inject constructor( override fun getImplementationDependencies(): Configuration = dependencies.implementationDependencies + val targetSettings = + project.container(TargetSettingsImpl::class.java) { name -> + TargetSettingsImpl(HostManager().targetByName(name)) + } + // region DSL. override var targets: List @@ -86,19 +102,25 @@ abstract class AbstractKotlinNativeComponent @Inject constructor( konanTargets.set(value.map { hostManager.targetByName(it) }) } - override fun target(target: String, action: KotlinNativeBinary.() -> Unit) = - binaries.whenElementKnown { - if (it.konanTarget == HostManager().targetByName(target)) { - it.action() - } - } + private val String.canonicalTargetName: String + get() = HostManager().targetByName(this).name + + override fun target(konanTarget: KonanTarget): TargetSettings = targetSettings.maybeCreate(konanTarget.name) + override fun target(target: String): TargetSettings = targetSettings.maybeCreate(target.canonicalTargetName) + + override fun target(target: String, action: TargetSettings.() -> Unit) = + targetSettings.maybeCreate(target.canonicalTargetName).action() override fun target(target: String, action: Closure) = target(target, ConfigureUtil.configureUsing(action)) - override fun target(target: String, action: Action) = + override fun target(target: String, action: Action) = target(target) { action.execute(this) } + override fun allTargets(action: TargetSettings.() -> Unit) = targetSettings.all(action) + override fun allTargets(action: Closure) = targetSettings.all(action) + override fun allTargets(action: Action) = targetSettings.all(action) + @Deprecated("Use the 'targets' property instead. E.g. targets = ['macos_x64', 'linux_x64']") override fun target(vararg targets: String) { project.logger.warn(""" diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeTestExecutableImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeTestExecutableImpl.kt index 06e377f18ca..82dfecaa075 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeTestExecutableImpl.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeTestExecutableImpl.kt @@ -35,7 +35,7 @@ open class KotlinNativeTestExecutableImpl @Inject constructor( name: String, baseName: Provider, componentImplementation: Configuration, - testComponent: KotlinNativeTestSuite, + val testComponent: KotlinNativeTestSuite, val mainSources: KotlinNativeSourceSet, identity: KotlinNativeVariantIdentity, objects: ObjectFactory, @@ -63,5 +63,8 @@ open class KotlinNativeTestExecutableImpl @Inject constructor( override val outputRootName: String = "test-exe" override val additionalCompilerOptions: Collection - get() = listOf("-tr") + super.additionalCompilerOptions + get() = listOf("-tr") + super.additionalCompilerOptions + + override val linkerOpts: List + get() = super.linkerOpts + testComponent.testedComponent.target(konanTarget).linkerOpts } \ No newline at end of file