diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 6c3007de1b0..b2e5e0d2d24 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -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 { // 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() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt index 8b63c790fed..ef37f2e68ae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt @@ -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) } + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt index 2858ea52994..963dce3e854 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt @@ -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) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/configureCInteropCommonizer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/configureCInteropCommonizer.kt deleted file mode 100644 index 7e8ffe9efd4..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/configureCInteropCommonizer.kt +++ /dev/null @@ -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, - interopTask: TaskProvider, -) { - 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) - } - } - } -}