[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.KotlinJsIrTargetPreset
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset
|
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.createFatFrameworks
|
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.targets.native.tasks.artifact.registerKotlinArtifactsExtension
|
||||||
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool
|
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool
|
||||||
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
|
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
|
// Ensure that the instance is created and configured during apply
|
||||||
project.kotlinIdeMultiplatformImport
|
project.kotlinIdeMultiplatformImport
|
||||||
project.locateOrRegisterIdeResolveDependenciesTask()
|
project.locateOrRegisterIdeResolveDependenciesTask()
|
||||||
project.launch { project.configureCInteropCommonizer() }
|
project.launch { project.setupCInteropCommonizedCInteropApiElementsConfigurations() }
|
||||||
project.addBuildListenerForXcode()
|
project.addBuildListenerForXcode()
|
||||||
project.whenEvaluated { kotlinMultiplatformExtension.createFatFrameworks() }
|
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.LibraryElements
|
||||||
import org.gradle.api.attributes.Usage
|
import org.gradle.api.attributes.Usage
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
|
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
|
||||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||||
import org.jetbrains.kotlin.commonizer.identityString
|
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.KotlinUsages
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
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.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements
|
||||||
import org.jetbrains.kotlin.gradle.utils.markConsumable
|
import org.jetbrains.kotlin.gradle.utils.markConsumable
|
||||||
import org.jetbrains.kotlin.gradle.utils.markResolvable
|
import org.jetbrains.kotlin.gradle.utils.markResolvable
|
||||||
@@ -19,6 +29,39 @@ import org.jetbrains.kotlin.tooling.core.UnsafeApi
|
|||||||
|
|
||||||
/* Elements configuration */
|
/* 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 {
|
internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(commonizerTarget: SharedCommonizerTarget): Configuration {
|
||||||
val configurationName = commonizerTarget.identityString + "CInteropApiElements"
|
val configurationName = commonizerTarget.identityString + "CInteropApiElements"
|
||||||
configurations.findByName(configurationName)?.let { return it }
|
configurations.findByName(configurationName)?.let { return it }
|
||||||
@@ -26,6 +69,13 @@ internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(co
|
|||||||
return configurations.create(configurationName) { configuration ->
|
return configurations.create(configurationName) { configuration ->
|
||||||
configuration.markConsumable()
|
configuration.markConsumable()
|
||||||
setupBasicCommonizedCInteropConfigurationAttributes(configuration, commonizerTarget)
|
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.artifacts.Configuration
|
||||||
import org.gradle.api.attributes.*
|
import org.gradle.api.attributes.*
|
||||||
import org.gradle.api.tasks.TaskProvider
|
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.KotlinNativeTargetConfigurator.NativeArtifactFormat
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseDsl
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseDsl
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
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(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP))
|
||||||
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
|
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
|
||||||
attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB)
|
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