From b872d427236a4c7c7b309ca0b66cc79082a59f2d Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Fri, 9 Dec 2022 11:49:27 +0100 Subject: [PATCH] [Gradle] Handle multiplatform composite builds when metadata.jar is not yet present KT-52172 --- .../gradle/plugin/mpp/CompositeMetadataArtifact.kt | 5 +++++ .../plugin/mpp/CompositeMetadataArtifactImpl.kt | 4 ++++ .../mpp/MetadataDependencyTransformationTask.kt | 8 ++++++-- .../gradle/plugin/mpp/transformMetadataLibraries.kt | 12 +++++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifact.kt index 4be871a63b0..e0ea50bc4d9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifact.kt @@ -21,6 +21,11 @@ internal interface CompositeMetadataArtifact { * Alternatively use the [read] function instead. */ fun open(): CompositeMetadataArtifactContent + + /** + * Checks if physical files are present on disk + */ + fun exists(): Boolean } /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifactImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifactImpl.kt index 3ed8bb39c68..dd874963965 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifactImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompositeMetadataArtifactImpl.kt @@ -26,6 +26,10 @@ internal class CompositeMetadataArtifactImpl( private val hostSpecificArtifactFilesBySourceSetName: Map ) : CompositeMetadataArtifact { + override fun exists(): Boolean { + return primaryArtifactFile.exists() && hostSpecificArtifactFilesBySourceSetName.values.all { it.exists() } + } + override fun open(): CompositeMetadataArtifactContent { return CompositeMetadataArtifactContentImpl() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index 87d7f5e2aa5..6fac60f6be3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvide import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat +import org.jetbrains.kotlin.gradle.utils.outputFilesProvider import java.io.File import javax.inject.Inject @@ -117,8 +118,11 @@ open class MetadataDependencyTransformationTask get() = metadataDependencyResolutions .filterIsInstance() .associateWith { chooseVisibleSourceSets -> - val files = project.transformMetadataLibrariesForBuild(chooseVisibleSourceSets, outputsDir, materializeFiles = false) - project.files(files).builtBy(this) + outputFilesProvider { + project.transformMetadataLibrariesForBuild( + chooseVisibleSourceSets, outputsDir, materializeFiles = false + ) + } } @TaskAction diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/transformMetadataLibraries.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/transformMetadataLibraries.kt index 479b10c3f02..fdfd31d32f0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/transformMetadataLibraries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/transformMetadataLibraries.kt @@ -82,6 +82,16 @@ private fun transformMetadataLibrariesForBuild( materializeFiles: Boolean, compositeMetadataArtifact: CompositeMetadataArtifact ): Set { + /* + Careful handling of composite builds: + Right now, composite multiplatform builds will compile against the composite artifact build by the producer build (not + against compiled source sets directly). + + This means, that this function might be called to figure out task inputs at a time, where + this composite artifact is not present on disk yet. + */ + if (!materializeFiles && !compositeMetadataArtifact.exists()) return emptySet() + return compositeMetadataArtifact.read { artifactContent -> resolution.visibleSourceSetNamesExcludingDependsOn.mapNotNull { visibleSourceSetName -> val sourceSetContent = artifactContent.findSourceSet(visibleSourceSetName) ?: return@mapNotNull null @@ -94,4 +104,4 @@ private fun transformMetadataLibrariesForBuild( metadataLibraryFile } }.toSet() -} \ No newline at end of file +}