[Gradle] Handle multiplatform composite builds when metadata.jar is not yet present

KT-52172
This commit is contained in:
Sebastian Sellmair
2022-12-09 11:49:27 +01:00
committed by Space Team
parent 90f8edbe80
commit b872d42723
4 changed files with 26 additions and 3 deletions
@@ -21,6 +21,11 @@ internal interface CompositeMetadataArtifact {
* Alternatively use the [read] function instead. * Alternatively use the [read] function instead.
*/ */
fun open(): CompositeMetadataArtifactContent fun open(): CompositeMetadataArtifactContent
/**
* Checks if physical files are present on disk
*/
fun exists(): Boolean
} }
/** /**
@@ -26,6 +26,10 @@ internal class CompositeMetadataArtifactImpl(
private val hostSpecificArtifactFilesBySourceSetName: Map<String, File> private val hostSpecificArtifactFilesBySourceSetName: Map<String, File>
) : CompositeMetadataArtifact { ) : CompositeMetadataArtifact {
override fun exists(): Boolean {
return primaryArtifactFile.exists() && hostSpecificArtifactFilesBySourceSetName.values.all { it.exists() }
}
override fun open(): CompositeMetadataArtifactContent { override fun open(): CompositeMetadataArtifactContent {
return CompositeMetadataArtifactContentImpl() return CompositeMetadataArtifactContentImpl()
} }
@@ -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.targets.metadata.dependsOnClosureWithInterCompilationDependencies
import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat
import org.jetbrains.kotlin.gradle.utils.outputFilesProvider
import java.io.File import java.io.File
import javax.inject.Inject import javax.inject.Inject
@@ -117,8 +118,11 @@ open class MetadataDependencyTransformationTask
get() = metadataDependencyResolutions get() = metadataDependencyResolutions
.filterIsInstance<MetadataDependencyResolution.ChooseVisibleSourceSets>() .filterIsInstance<MetadataDependencyResolution.ChooseVisibleSourceSets>()
.associateWith { chooseVisibleSourceSets -> .associateWith { chooseVisibleSourceSets ->
val files = project.transformMetadataLibrariesForBuild(chooseVisibleSourceSets, outputsDir, materializeFiles = false) outputFilesProvider {
project.files(files).builtBy(this) project.transformMetadataLibrariesForBuild(
chooseVisibleSourceSets, outputsDir, materializeFiles = false
)
}
} }
@TaskAction @TaskAction
@@ -82,6 +82,16 @@ private fun transformMetadataLibrariesForBuild(
materializeFiles: Boolean, materializeFiles: Boolean,
compositeMetadataArtifact: CompositeMetadataArtifact compositeMetadataArtifact: CompositeMetadataArtifact
): Set<File> { ): Set<File> {
/*
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 -> return compositeMetadataArtifact.read { artifactContent ->
resolution.visibleSourceSetNamesExcludingDependsOn.mapNotNull { visibleSourceSetName -> resolution.visibleSourceSetNamesExcludingDependsOn.mapNotNull { visibleSourceSetName ->
val sourceSetContent = artifactContent.findSourceSet(visibleSourceSetName) ?: return@mapNotNull null val sourceSetContent = artifactContent.findSourceSet(visibleSourceSetName) ?: return@mapNotNull null