[Gradle] Ensure 'commonized cinterop configurations' are present and expose api dependencies
^KT-59596 Verification Pending
This commit is contained in:
committed by
Space Team
parent
9866336a40
commit
fac5083dbf
+2
-2
@@ -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() }
|
||||
}
|
||||
|
||||
+51
-1
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-35
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user