[Gradle, K/N] Consumable frameworks review fixes

This commit is contained in:
Alexander Likhachev
2021-02-02 11:20:58 +03:00
parent 604dda839a
commit a6cdfeafed
3 changed files with 35 additions and 27 deletions
@@ -129,8 +129,8 @@ open class KotlinNativeTarget @Inject constructor(
"org.jetbrains.kotlin.native.target", "org.jetbrains.kotlin.native.target",
String::class.java String::class.java
) )
val konanBuildTypeAttribute = Attribute.of( val kotlinNativeBuildTypeAttribute = Attribute.of(
"org.jetbrains.kotlin.native.type", "org.jetbrains.kotlin.native.build.type",
String::class.java String::class.java
) )
} }
@@ -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.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName 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.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File import java.io.File
@@ -151,8 +152,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget>(
binary: Framework, binary: Framework,
linkTask: TaskProvider<KotlinNativeLink> linkTask: TaskProvider<KotlinNativeLink>
) { ) {
fun <T: Task> Configuration.configureConfiguration(fat: Boolean, taskProvider: TaskProvider<T>) { fun <T : Task> Configuration.configureConfiguration(taskProvider: TaskProvider<T>) {
usesPlatformOf(binary.target)
project.afterEvaluate { project.afterEvaluate {
val task = taskProvider.get() val task = taskProvider.get()
val artifactFile = when (task) { val artifactFile = when (task) {
@@ -169,38 +169,38 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget>(
project.extensions.getByType(org.gradle.api.internal.plugins.DefaultArtifactPublicationSet::class.java) project.extensions.getByType(org.gradle.api.internal.plugins.DefaultArtifactPublicationSet::class.java)
.addCandidate(linkArtifact) .addCandidate(linkArtifact)
artifacts.add(linkArtifact) artifacts.add(linkArtifact)
attributes.attribute(KotlinPlatformType.attribute, binary.target.platformType)
attributes.attribute( attributes.attribute(
org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORMAT, ArtifactAttributes.ARTIFACT_FORMAT,
org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat.FRAMEWORK NativeArtifactFormat.FRAMEWORK
) )
attributes.attribute( attributes.attribute(
org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget.konanBuildTypeAttribute, KotlinNativeTarget.kotlinNativeBuildTypeAttribute,
binary.buildType.name binary.buildType.name
) )
if (attributes.getAttribute(Framework.frameworkTargets) == null) {
attributes.attribute(
Framework.frameworkTargets,
setOf(binary.target.konanTarget.name)
)
}
// capture type parameter T // capture type parameter T
fun <T> copyAttribute(key: Attribute<T>, from: AttributeContainer, to: AttributeContainer) { fun <T> copyAttribute(key: Attribute<T>, from: AttributeContainer, to: AttributeContainer) {
to.attribute(key, from.getAttribute(key)!!) to.attribute(key, from.getAttribute(key)!!)
} }
binary.target.getAttributes().keySet().forEach { binary.attributes.keySet().filter { it != KotlinNativeTarget.konanTargetAttribute }.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 {
copyAttribute(it, binary.attributes, this.attributes) 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.isCanBeConsumed = true
it.isCanBeResolved = false 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 fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalize()}"
val fatFrameworkTask = try { val fatFrameworkTask = try {
@@ -220,17 +220,19 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget>(
} }
} }
if (configurations.findByName(fatFrameworkConfigurationName) == null) { // maybeCreate is not used as it does not provide way to configure once
configurations.create(fatFrameworkConfigurationName) { val fatConfiguration =
configurations.findByName(fatFrameworkConfigurationName) ?: configurations.create(fatFrameworkConfigurationName) {
it.isCanBeConsumed = true it.isCanBeConsumed = true
it.isCanBeResolved = false it.isCanBeResolved = false
it.configureConfiguration(true, fatFrameworkTask) it.configureConfiguration(fatFrameworkTask)
} }
}
}
private fun frameworkConfigurationName(name: String, type: String): String = fatConfiguration.attributes.attribute(
listOf(name, type, "framework").joinToString("") { it.capitalize() }.decapitalize() Framework.frameworkTargets,
(fatConfiguration.attributes.getAttribute(Framework.frameworkTargets) ?: setOf<String>()) + binary.target.konanTarget.name
)
}
private fun Project.createRunTask(binary: Executable) { private fun Project.createRunTask(binary: Executable) {
val taskName = binary.runTaskName ?: return val taskName = binary.runTaskName ?: return
@@ -12,7 +12,6 @@ import org.gradle.api.Named
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.Dependency
import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.attributes.HasAttributes import org.gradle.api.attributes.HasAttributes
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.tasks.AbstractExecTask import org.gradle.api.tasks.AbstractExecTask
@@ -234,7 +233,7 @@ class Framework(
compilation: KotlinNativeCompilation compilation: KotlinNativeCompilation
) : AbstractNativeLibrary(name, baseName, buildType, compilation), HasAttributes { ) : AbstractNativeLibrary(name, baseName, buildType, compilation), HasAttributes {
private val attributeContainer = HierarchyAttributeContainer(parent = null) private val attributeContainer = HierarchyAttributeContainer(parent = compilation.attributes)
override fun getAttributes() = attributeContainer override fun getAttributes() = attributeContainer
@@ -281,6 +280,13 @@ class Framework(
/** Embed placeholder LLVM IR data as a marker. */ /** Embed placeholder LLVM IR data as a marker. */
MARKER, MARKER,
} }
companion object {
val frameworkTargets = Attribute.of(
"org.jetbrains.kotlin.native.framework.targets",
Set::class.java
)
}
} }