diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt index aa0ad9edd13..0ec743272be 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt @@ -129,8 +129,8 @@ open class KotlinNativeTarget @Inject constructor( "org.jetbrains.kotlin.native.target", String::class.java ) - val konanBuildTypeAttribute = Attribute.of( - "org.jetbrains.kotlin.native.type", + val kotlinNativeBuildTypeAttribute = Attribute.of( + "org.jetbrains.kotlin.native.build.type", String::class.java ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 505d924d93b..c14063e42ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.testing.internal.configureConventions import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.testTaskName +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File @@ -151,8 +152,7 @@ open class KotlinNativeTargetConfigurator( binary: Framework, linkTask: TaskProvider ) { - fun Configuration.configureConfiguration(fat: Boolean, taskProvider: TaskProvider) { - usesPlatformOf(binary.target) + fun Configuration.configureConfiguration(taskProvider: TaskProvider) { project.afterEvaluate { val task = taskProvider.get() val artifactFile = when (task) { @@ -169,38 +169,38 @@ open class KotlinNativeTargetConfigurator( project.extensions.getByType(org.gradle.api.internal.plugins.DefaultArtifactPublicationSet::class.java) .addCandidate(linkArtifact) artifacts.add(linkArtifact) + attributes.attribute(KotlinPlatformType.attribute, binary.target.platformType) attributes.attribute( - org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORMAT, - org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat.FRAMEWORK + ArtifactAttributes.ARTIFACT_FORMAT, + NativeArtifactFormat.FRAMEWORK ) attributes.attribute( - org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget.konanBuildTypeAttribute, + KotlinNativeTarget.kotlinNativeBuildTypeAttribute, binary.buildType.name ) + if (attributes.getAttribute(Framework.frameworkTargets) == null) { + attributes.attribute( + Framework.frameworkTargets, + setOf(binary.target.konanTarget.name) + ) + } // capture type parameter T fun copyAttribute(key: Attribute, from: AttributeContainer, to: AttributeContainer) { to.attribute(key, from.getAttribute(key)!!) } - binary.target.getAttributes().keySet().forEach { - copyAttribute(it, binary.target.getAttributes(), this.attributes) - } - if (fat) { - attributes.attribute(KotlinNativeTarget.konanTargetAttribute, "fat") - // else is already set to real konan target - } - binary.attributes.keySet().forEach { + binary.attributes.keySet().filter { it != KotlinNativeTarget.konanTargetAttribute }.forEach { copyAttribute(it, binary.attributes, this.attributes) } } } - configurations.create(frameworkConfigurationName(binary.target.name, binary.buildType.name.toLowerCase()) + binary.baseName) { + configurations.create(lowerCamelCaseName(binary.name, binary.target.name)) { it.isCanBeConsumed = true it.isCanBeResolved = false - it.configureConfiguration(false, linkTask) + it.configureConfiguration(linkTask) } - val fatFrameworkConfigurationName = frameworkConfigurationName(binary.baseName, binary.buildType.name.toLowerCase() + "Fat") + val fatFrameworkConfigurationName = lowerCamelCaseName(binary.name, binary.target.konanTarget.family.name.toLowerCase(), "fat") val fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalize()}" val fatFrameworkTask = try { @@ -220,17 +220,19 @@ open class KotlinNativeTargetConfigurator( } } - if (configurations.findByName(fatFrameworkConfigurationName) == null) { - configurations.create(fatFrameworkConfigurationName) { + // maybeCreate is not used as it does not provide way to configure once + val fatConfiguration = + configurations.findByName(fatFrameworkConfigurationName) ?: configurations.create(fatFrameworkConfigurationName) { it.isCanBeConsumed = true it.isCanBeResolved = false - it.configureConfiguration(true, fatFrameworkTask) + it.configureConfiguration(fatFrameworkTask) } - } - } - private fun frameworkConfigurationName(name: String, type: String): String = - listOf(name, type, "framework").joinToString("") { it.capitalize() }.decapitalize() + fatConfiguration.attributes.attribute( + Framework.frameworkTargets, + (fatConfiguration.attributes.getAttribute(Framework.frameworkTargets) ?: setOf()) + binary.target.konanTarget.name + ) + } private fun Project.createRunTask(binary: Executable) { val taskName = binary.runTaskName ?: return diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt index ce521fc7eab..8e74ce3d2dd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt @@ -12,7 +12,6 @@ import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import org.gradle.api.attributes.Attribute -import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.HasAttributes import org.gradle.api.provider.Provider import org.gradle.api.tasks.AbstractExecTask @@ -234,7 +233,7 @@ class Framework( compilation: KotlinNativeCompilation ) : AbstractNativeLibrary(name, baseName, buildType, compilation), HasAttributes { - private val attributeContainer = HierarchyAttributeContainer(parent = null) + private val attributeContainer = HierarchyAttributeContainer(parent = compilation.attributes) override fun getAttributes() = attributeContainer @@ -281,6 +280,13 @@ class Framework( /** Embed placeholder LLVM IR data as a marker. */ MARKER, } + + companion object { + val frameworkTargets = Attribute.of( + "org.jetbrains.kotlin.native.framework.targets", + Set::class.java + ) + } }