From 337d87ad54ebc3fbc5895f91442403be89ad7ae9 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Thu, 17 Aug 2023 12:10:23 +0200 Subject: [PATCH] [Gradle] CInterop IDE dependency resolution: Fix build dependencies ^KT-59596 Verification Pending --- .../MppCInteropDependencyTransformationIT.kt | 2 +- .../gradle/MppIdeDependencyResolutionIT.kt | 49 +++++++++++++++++++ ...eropMetadataDependencyClasspathResolver.kt | 9 +--- ...jectToProjectCInteropDependencyResolver.kt | 12 ++++- 4 files changed, 63 insertions(+), 9 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt index 96ca8cf2cc6..f59bd50adec 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppCInteropDependencyTransformationIT.kt @@ -88,7 +88,7 @@ abstract class MppCInteropDependencyTransformationIT : BaseGradleIT() { /* Assert p2 & p3 compiled for Windows */ assertTasksExecuted(":p2:compileKotlinWindowsX64") assertTasksExecuted(":p3:compileKotlinWindowsX64") - + /* Assert p2 & p3 compiled tests */ assertTasksExecuted(":p2:compileTestKotlinLinuxX64") assertTasksExecuted(":p3:compileTestKotlinLinuxX64") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt index 2d7ae79728f..25f1aae3392 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MppIdeDependencyResolutionIT.kt @@ -261,6 +261,55 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() { } } + @GradleTest + fun `test cinterops - transitive project dependencies`(gradleVersion: GradleVersion) { + project( + "cinterop-MetadataDependencyTransformation", + gradleVersion, + buildOptions = defaultBuildOptions.copy(freeArgs = defaultBuildOptions.freeArgs + "-PdependencyMode=project") + ) { + resolveIdeDependencies(":p3") { dependencies -> + /* Check that no compile-tasks are executed */ + run { + val compileTaskRegex = Regex(".*[cC]ompile.*") + val compileTasks = tasks.filter { task -> task.path.matches(compileTaskRegex) } + if (compileTasks.isNotEmpty()) { + fail("Expected no compile tasks to be executed. Found $compileTasks") + } + } + + dependencies["nativeMain"].cinteropDependencies().assertMatches( + binaryCoordinates(Regex(".*p1-cinterop-simple.*")), + binaryCoordinates(Regex(".*p1-cinterop-withPosix.*")) + ) + + dependencies["linuxX64Main"].cinteropDependencies().assertMatches( + binaryCoordinates(Regex(".*p1-cinterop-simple.*")), + binaryCoordinates(Regex(".*p1-cinterop-withPosix.*")) + ) + } + } + } + + @GradleTest + fun `test cinterops - transitive project dependencies - disabled cinterop commonization`(gradleVersion: GradleVersion) { + project( + "cinterop-MetadataDependencyTransformation", + gradleVersion, + buildOptions = defaultBuildOptions.copy( + freeArgs = defaultBuildOptions.freeArgs + "-PdependencyMode=project" + "-Pkotlin.mpp.enableCInteropCommonization=false" + ) + ) { + resolveIdeDependencies(":p3") { dependencies -> + dependencies["nativeMain"].cinteropDependencies().assertMatches() + dependencies["linuxX64Main"].cinteropDependencies().assertMatches( + binaryCoordinates(Regex(".*p1-cinterop-simple.*")), + binaryCoordinates(Regex(".*p1-cinterop-withPosix.*")) + ) + } + } + } + @GradleTest fun `test dependency on composite build with commonized cinterops`(gradleVersion: GradleVersion, @TempDir tempDir: Path) { val includedLib = project("composite-build-with-cinterop-commonization/includedLib", gradleVersion, localRepoDir = tempDir) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt index 3f1830f66a9..8689b3c4b5f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeCInteropMetadataDependencyClasspathResolver.kt @@ -23,9 +23,7 @@ import org.jetbrains.kotlin.gradle.utils.future internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyResolver, IdeDependencyResolver.WithBuildDependencies { override fun resolve(sourceSet: KotlinSourceSet): Set { if (sourceSet !is DefaultKotlinSourceSet) return emptySet() - val project = sourceSet.project - project.locateDependencyTask(sourceSet) ?: return emptySet() val cinteropFiles = project.future { createCInteropMetadataDependencyClasspathForIde(sourceSet) }.getOrThrow() return project.resolveCInteropDependencies(cinteropFiles) @@ -34,10 +32,7 @@ internal object IdeCInteropMetadataDependencyClasspathResolver : IdeDependencyRe override fun dependencies(project: Project): Iterable { return project.multiplatformExtension.sourceSets .filterIsInstance() - .filter { it.commonizerTarget.getOrThrow() is SharedCommonizerTarget} - .mapNotNull { project.locateDependencyTask(it) } + .filter { it.commonizerTarget.getOrThrow() is SharedCommonizerTarget } + .map { sourceSet -> project.future { createCInteropMetadataDependencyClasspathForIde(sourceSet) }.getOrThrow() } } - - private fun Project.locateDependencyTask(sourceSet: DefaultKotlinSourceSet): TaskProvider<*>? = - locateTask(sourceSet.cinteropMetadataDependencyTransformationForIdeTaskName) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt index 5620dad2f08..e078c8745d3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeProjectToProjectCInteropDependencyResolver.kt @@ -5,18 +5,21 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers +import org.gradle.api.Project import org.gradle.api.artifacts.component.ProjectComponentIdentifier +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCInteropDependencyConfiguration import org.jetbrains.kotlin.utils.addToStdlib.safeAs -internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyResolver { +internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyResolver, IdeDependencyResolver.WithBuildDependencies { override fun resolve(sourceSet: KotlinSourceSet): Set { if (sourceSet !is DefaultKotlinSourceSet) return emptySet() @@ -34,4 +37,11 @@ internal object IdeProjectToProjectCInteropDependencyResolver : IdeDependencyRes return project.resolveCInteropDependencies(cinteropFiles) } + + override fun dependencies(project: Project): Iterable { + val extension = project.multiplatformExtensionOrNull ?: return emptySet() + return extension.targets.filterIsInstance().flatMap { it.compilations }.mapNotNull { compilation -> + project.locateOrCreateCInteropDependencyConfiguration(compilation) + } + } }