[Gradle] Ensure 'commonized cinterop configurations' are present and expose api dependencies

^KT-59596 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-08-17 12:09:15 +02:00
committed by Space Team
parent 9866336a40
commit fac5083dbf
4 changed files with 59 additions and 38 deletions
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset
import org.jetbrains.kotlin.gradle.targets.native.createFatFrameworks
import org.jetbrains.kotlin.gradle.targets.native.internal.configureCInteropCommonizer
import org.jetbrains.kotlin.gradle.targets.native.internal.setupCInteropCommonizedCInteropApiElementsConfigurations
import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.registerKotlinArtifactsExtension
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
@@ -73,7 +73,7 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
// Ensure that the instance is created and configured during apply
project.kotlinIdeMultiplatformImport
project.locateOrRegisterIdeResolveDependenciesTask()
project.launch { project.configureCInteropCommonizer() }
project.launch { project.setupCInteropCommonizedCInteropApiElementsConfigurations() }
project.addBuildListenerForXcode()
project.whenEvaluated { kotlinMultiplatformExtension.createFatFrameworks() }
}
@@ -6,12 +6,22 @@ import org.gradle.api.attributes.Category
import org.gradle.api.attributes.LibraryElements
import org.gradle.api.attributes.Usage
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.identityString
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.categoryByName
import org.jetbrains.kotlin.gradle.plugin.launch
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.targets.metadata.awaitMetadataCompilationsCreated
import org.jetbrains.kotlin.gradle.targets.metadata.findMetadataCompilation
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements
import org.jetbrains.kotlin.gradle.utils.markConsumable
import org.jetbrains.kotlin.gradle.utils.markResolvable
@@ -19,6 +29,39 @@ import org.jetbrains.kotlin.tooling.core.UnsafeApi
/* Elements configuration */
internal suspend fun Project.setupCInteropCommonizedCInteropApiElementsConfigurations() {
val extension = multiplatformExtensionOrNull ?: return
val cinteropCommonizerTask = commonizeCInteropTask() ?: return
/*
Expose api dependencies from Source Sets to the elements configuration
*/
extension.awaitSourceSets().forEach { sourceSet ->
val commonizerTarget = sourceSet.commonizerTarget.await() as? SharedCommonizerTarget ?: return@forEach
val configuration = locateOrCreateCommonizedCInteropApiElementsConfiguration(commonizerTarget)
val metadataCompilation = findMetadataCompilation(sourceSet) ?: return@forEach
configuration.extendsFrom(metadataCompilation.internal.configurations.apiConfiguration)
}
/*
Expose artifacts from cinterop commonizer
*/
for (commonizerGroup in kotlinCInteropGroups.await()) {
for (target in commonizerGroup.targets) {
val configuration = locateOrCreateCommonizedCInteropApiElementsConfiguration(target)
val commonizerTargetOutputDir = cinteropCommonizerTask.map { task ->
CommonizerOutputFileLayout.resolveCommonizedDirectory(task.outputDirectory(commonizerGroup), target)
}
project.artifacts.add(configuration.name, commonizerTargetOutputDir) { artifact ->
artifact.extension = CInteropCommonizerArtifactTypeAttribute.KLIB_COLLECTION_DIR
artifact.type = CInteropCommonizerArtifactTypeAttribute.KLIB_COLLECTION_DIR
artifact.builtBy(cinteropCommonizerTask)
}
}
}
}
internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(commonizerTarget: SharedCommonizerTarget): Configuration {
val configurationName = commonizerTarget.identityString + "CInteropApiElements"
configurations.findByName(configurationName)?.let { return it }
@@ -26,6 +69,13 @@ internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(co
return configurations.create(configurationName) { configuration ->
configuration.markConsumable()
setupBasicCommonizedCInteropConfigurationAttributes(configuration, commonizerTarget)
launch {
val metadataTarget = multiplatformExtension.metadata() as KotlinMetadataTarget
metadataTarget.awaitMetadataCompilationsCreated()
.filter { compilation -> compilation.commonizerTarget.await() == commonizerTarget }
.forEach { compilation -> configuration.extendsFrom(compilation.internal.configurations.apiConfiguration) }
}
}
}
@@ -9,6 +9,7 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.*
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseDsl
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
@@ -82,6 +83,11 @@ internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: Kotl
attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB)
/* Expose api dependencies */
target.compilations.findByName(MAIN_COMPILATION_NAME)?.let { compilation ->
extendsFrom(compilation.internal.configurations.apiConfiguration)
}
}
}
}
@@ -1,35 +0,0 @@
/*
* Copyright 2010-2023 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.
*/
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
internal suspend fun Project.configureCInteropCommonizer() {
val interopTask = commonizeCInteropTask() ?: return
configureCInteropCommonizerConsumableConfigurations(kotlinCInteropGroups.await(), interopTask)
}
private fun Project.configureCInteropCommonizerConsumableConfigurations(
cinteropGroups: Set<CInteropCommonizerGroup>,
interopTask: TaskProvider<CInteropCommonizerTask>,
) {
for (commonizerGroup in cinteropGroups) {
for (sharedCommonizerTargets in commonizerGroup.targets) {
val configuration = locateOrCreateCommonizedCInteropApiElementsConfiguration(sharedCommonizerTargets)
val commonizerTargetOutputDir = interopTask.map { task ->
CommonizerOutputFileLayout.resolveCommonizedDirectory(task.outputDirectory(commonizerGroup), sharedCommonizerTargets)
}
project.artifacts.add(configuration.name, commonizerTargetOutputDir) { artifact ->
artifact.extension = CInteropCommonizerArtifactTypeAttribute.KLIB_COLLECTION_DIR
artifact.type = CInteropCommonizerArtifactTypeAttribute.KLIB_COLLECTION_DIR
artifact.builtBy(interopTask)
}
}
}
}