Wip

^KT-70493
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionGranularMetadataTransformationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionGranularMetadataTransformationIT.kt
index 8f064e3..9bfbccf 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionGranularMetadataTransformationIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionGranularMetadataTransformationIT.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.gradle.uklibs
 
 import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
 import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
 import org.jetbrains.kotlin.gradle.plugin.mpp.locateOrRegisterMetadataDependencyTransformationTask
@@ -14,7 +15,7 @@
 import kotlin.io.path.pathString
 import kotlin.test.assertEquals
 
-
+@OptIn(ExperimentalKotlinGradlePluginApi::class)
 @MppGradlePluginTests
 @DisplayName("Test the GMT runtime behavior")
 class UklibConsumptionGranularMetadataTransformationIT : KGPBaseTest() {
@@ -92,6 +93,8 @@
             addPublishedProjectToRepositoriesAndIgnoreGradleMetadata(directPublisher)
             addPublishedProjectToRepositoriesAndIgnoreGradleMetadata(transitivePublisher)
             buildScriptInjection {
+                project.setUklibResolutionStrategy()
+                project.computeUklibChecksum(false)
                 project.applyMultiplatform {
                     iosArm64()
                     iosX64()
@@ -139,12 +142,12 @@
 
             assertEquals(
                 listOf(
-                    listOf("consumerIosMain", "uklib-foo-direct-1.0-directProducerIosMain"),
-                    listOf("consumerIosMain", "uklib-foo-transitive-1.0-transitiveProducerIosMain"),
-                    listOf("consumerAppleMain", "uklib-foo-direct-1.0-directProducerAppleMain"),
-                    listOf("consumerAppleMain", "uklib-foo-transitive-1.0-transitiveProducerAppleMain"),
-                    listOf("consumerCommonMain", "uklib-foo-direct-1.0-directProducerCommonMain"),
-                    listOf("consumerCommonMain", "uklib-foo-transitive-1.0-transitiveProducerCommonMain"),
+                    listOf("consumerIosMain", "uklib-foo-direct-1.0-directProducerIosMain-"),
+                    listOf("consumerIosMain", "uklib-foo-transitive-1.0-transitiveProducerIosMain-"),
+                    listOf("consumerAppleMain", "uklib-foo-direct-1.0-directProducerAppleMain-"),
+                    listOf("consumerAppleMain", "uklib-foo-transitive-1.0-transitiveProducerAppleMain-"),
+                    listOf("consumerCommonMain", "uklib-foo-direct-1.0-directProducerCommonMain-"),
+                    listOf("consumerCommonMain", "uklib-foo-transitive-1.0-transitiveProducerCommonMain-"),
                 ),
                 outputClasspath.map {
                     it.toPath().toList().takeLast(2).map { it.pathString }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionIT.kt
index d43569a..aad3373 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibConsumptionIT.kt
@@ -12,6 +12,7 @@
 import org.gradle.api.internal.project.ProjectStateRegistry
 import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
 import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
 import org.jetbrains.kotlin.gradle.internal.dsl.KotlinMultiplatformSourceSetConventionsImpl.commonMain
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
@@ -25,6 +26,7 @@
 import kotlin.io.path.pathString
 import kotlin.test.assertEquals
 
+@OptIn(ExperimentalWasmDsl::class)
 @MppGradlePluginTests
 @DisplayName("Smoke test uklib consumption")
 class UklibConsumptionIT : KGPBaseTest() {
@@ -370,6 +372,7 @@
             addPublishedProjectToRepositoriesAndIgnoreGradleMetadata(direct)
             addPublishedProjectToRepositoriesAndIgnoreGradleMetadata(transitive)
             buildScriptInjection {
+                project.computeUklibChecksum(false)
                 project.setUklibResolutionStrategy()
                 project.applyMultiplatform {
                     linuxArm64()
@@ -400,7 +403,7 @@
             assertEquals(
                 listOf(
                     listOf("foo", "direct", "1.0", "direct-1.0.jar"),
-                    listOf("build", "kotlinTransformedMetadataLibraries", "commonMain", "uklib-foo-transitive-1.0-commonMain"),
+                    listOf("build", "kotlinTransformedMetadataLibraries", "commonMain", "uklib-foo-transitive-1.0-commonMain-"),
                 ),
                 classpath.filterNot {
                     "kotlin-stdlib" in it.name
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibPublicationITWIP.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibPublicationITWIP.kt
index 299c3e1..1b5584f 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibPublicationITWIP.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/UklibPublicationITWIP.kt
@@ -20,6 +20,7 @@
 import kotlin.io.path.name
 import kotlin.test.assertEquals
 import com.android.build.api.dsl.LibraryExtension
+import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.publication.ArchiveUklibTask
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.Uklib
 import org.w3c.dom.Document
@@ -27,6 +28,7 @@
 import java.io.File
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.diagnostics.UklibFragmentsChecker
 
+@ExperimentalKotlinGradlePluginApi
 @MppGradlePluginTests
 @DisplayName("Smoke test uklib artifact publication")
 class UklibPublicationITWIP : KGPBaseTest() {
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/uklibTestingUtils.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/uklibTestingUtils.kt
index ce76f17..55c65afc 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/uklibTestingUtils.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/uklibs/uklibTestingUtils.kt
@@ -240,4 +240,11 @@
         PropertiesProvider.PropertyNames.KOTLIN_MPP_UKLIB_RESOLUTION_STRATEGY,
         strategy.propertyName,
     )
+}
+
+fun Project.computeUklibChecksum(enable: Boolean = false) {
+    propertiesExtension.set(
+        PropertiesProvider.PropertyNames.KOTLIN_MPP_COMPUTE_UKLIB_CHECKSUM,
+        enable.toString(),
+    )
 }
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt
index 24e9b26..47740fc 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt
@@ -33,6 +33,7 @@
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_APPLY_DEFAULT_HIERARCHY_TEMPLATE
+import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_COMPUTE_UKLIB_CHECKSUM
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT
 import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA
@@ -205,6 +206,9 @@
     val fakeUkibTransforms: Boolean
         get() = booleanProperty(KOTLIN_MPP_FAKE_UKLIB_TRANSFORMS) ?: false
 
+    val computeUklibChecksum: Boolean
+        get() = booleanProperty(KOTLIN_MPP_COMPUTE_UKLIB_CHECKSUM) ?: true
+
     val hierarchicalStructureSupport: Boolean
         get() = booleanProperty(KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT) ?: mppHierarchicalStructureByDefault
 
@@ -648,6 +652,7 @@
         val KOTLIN_MPP_PUBLISH_UKLIB = property("kotlin.mpp.publishUklib")
         val KOTLIN_MPP_UKLIB_RESOLUTION_STRATEGY = property("kotlin.mpp.uklibResolutionStrategy")
         val KOTLIN_MPP_FAKE_UKLIB_TRANSFORMS = property("kotlin.internal.mpp.fakeUklibTransforms")
+        val KOTLIN_MPP_COMPUTE_UKLIB_CHECKSUM = property("kotlin.internal.mpp.computeUklibChecksum")
         val KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA = property("kotlin.mpp.enableGranularSourceSetsMetadata")
         val KOTLIN_MPP_ENABLE_COMPATIBILITY_METADATA_VARIANT = property("kotlin.mpp.enableCompatibilityMetadataVariant")
         val KOTLIN_MPP_ENABLE_CINTEROP_COMMONIZATION = property("kotlin.mpp.enableCInteropCommonization")
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
index 7258778..89f1562 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
@@ -119,6 +119,7 @@
         val sourceSetMetadataLocationsOfProjectDependencies: KotlinProjectSharedDataProvider<SourceSetMetadataLocations>,
         val transformProjectDependencies: Boolean,
         val uklibFragmentAttributes: Set<String>,
+        val computeUklibChecksum: Boolean,
     ) {
         constructor(project: Project, kotlinSourceSet: KotlinSourceSet, transformProjectDependencies: Boolean = true) : this(
             build = project.currentBuild,
@@ -135,6 +136,7 @@
                 .consumeCommonSourceSetMetadataLocations(kotlinSourceSet.internal.resolvableMetadataConfiguration),
             transformProjectDependencies = transformProjectDependencies,
             uklibFragmentAttributes = kotlinSourceSet.metadataFragmentAttributes.map { it.safeToConsume() }.toSet(),
+            computeUklibChecksum = project.kotlinPropertiesProvider.computeUklibChecksum,
         )
     }
 
@@ -319,6 +321,7 @@
                     ),
                     // FIXME: Should this be fragmentsVisibleByThisSourceSet?
                     allVisibleFragments,
+                    params.computeUklibChecksum,
                 )
             )
         )
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UklibCompositeMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UklibCompositeMetadataArtifact.kt
index 038ecc5..5aeb594 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UklibCompositeMetadataArtifact.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/UklibCompositeMetadataArtifact.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.UklibFragment
 import org.jetbrains.kotlin.utils.keysToMap
-import org.jetbrains.kotlin.gradle.utils.checksumString
 import java.io.File
 import java.security.MessageDigest
 
@@ -17,6 +16,7 @@
 internal class UklibCompositeMetadataArtifact(
     val moduleId: ModuleId,
     val allVisibleFragments: List<UklibFragment>,
+    val computeChecksum: Boolean,
 ) : CompositeMetadataArtifact {
     data class ModuleId(val group: String, val name: String, val version: String)
 
@@ -30,6 +30,7 @@
             this,
             moduleId,
             allVisibleFragments,
+            computeChecksum,
         )
     }
 
@@ -40,6 +41,7 @@
     override val containingArtifact: CompositeMetadataArtifact,
     val moduleId: UklibCompositeMetadataArtifact.ModuleId,
     allVisibleFragments: List<UklibFragment>,
+    computeChecksum: Boolean,
 ) : CompositeMetadataArtifactContent {
 
     private val fragmentSourceSets: Map<String, CompositeMetadataArtifactContent.SourceSetContent> =
@@ -48,6 +50,7 @@
                 this,
                 moduleId,
                 fragment,
+                computeChecksum
             )
         }.mapKeys { it.key.identifier }
 
@@ -73,12 +76,13 @@
     override val containingArtifactContent: CompositeMetadataArtifactContent,
     val moduleId: UklibCompositeMetadataArtifact.ModuleId,
     val fragment: UklibFragment,
+    val computeChecksum: Boolean,
 ) : CompositeMetadataArtifactContent.SourceSetContent {
     override val sourceSetName: String
         get() = fragment.identifier
 
     override val metadataBinary: CompositeMetadataArtifactContent.MetadataBinary
-        get() = UklibCompositeMetadataBinary(this, moduleId, fragment)
+        get() = UklibCompositeMetadataBinary(this, moduleId, fragment, computeChecksum)
 
     override val cinteropMetadataBinaries: List<CompositeMetadataArtifactContent.CInteropMetadataBinary>
         get() = emptyList()
@@ -88,6 +92,7 @@
     override val containingSourceSetContent: CompositeMetadataArtifactContent.SourceSetContent,
     val moduleId: UklibCompositeMetadataArtifact.ModuleId,
     val fragment: UklibFragment,
+    val computeChecksum: Boolean,
 ) : CompositeMetadataArtifactContent.MetadataBinary {
     override val archiveExtension: String
         get() = ""
@@ -96,8 +101,10 @@
 
     // Rely on unique transform path
     override val checksum: String
-        get() = md5.digest(fragment.file().path.encodeToByteArray())
-            .joinToString(separator = "") { byte -> "%02x".format(byte) }
+        get() = if (computeChecksum) {
+            md5.digest(fragment.file().path.encodeToByteArray())
+                .joinToString(separator = "") { byte -> "%02x".format(byte) }
+        } else ""
 
     override fun copyTo(file: File): Boolean {
         return fragment.file().copyRecursively(
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/uklibs/serialization/uklibDeserialization.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/uklibs/serialization/uklibDeserialization.kt
index 86e9df7..3fc8267 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/uklibs/serialization/uklibDeserialization.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/uklibs/serialization/uklibDeserialization.kt
@@ -26,6 +26,7 @@
 internal fun deserializeUklibFromDirectory(directory: File): Uklib {
     val umanifest = directory.resolve(UMANIFEST_FILE_NAME)
     if (!umanifest.exists()) error("Can't deserialize Uklib from ${directory} because $UMANIFEST_FILE_NAME doesn't exist")
+    @Suppress("UNCHECKED_CAST")
     val json = Gson().fromJson(umanifest.reader(), Map::class.java) as Map<String, Any>
 
     val manifestVersion = json.property<String>(UMANIFEST_VERSION)
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibFromKGPFragmentsTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibFromKGPFragmentsTests.kt
index fbd97cf..745d8cf 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibFromKGPFragmentsTests.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibFromKGPFragmentsTests.kt
@@ -11,8 +11,10 @@
 import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
 import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
 import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
+import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinCompilation
 import org.jetbrains.kotlin.gradle.plugin.mpp.external.createCompilation
 import org.jetbrains.kotlin.gradle.plugin.mpp.external.createExternalKotlinTarget
+import org.jetbrains.kotlin.gradle.plugin.mpp.internal
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.UklibFragment
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.consumption.formCompilationClasspathInConsumingModuleFragment
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.publication.validateKgpModelIsUklibCompliantAndCreateKgpFragments
@@ -280,6 +282,26 @@
         }.evaluate().assertNoDiagnostics()
     }
 
+    @Test
+    fun `project configuration with enabled uklib publication - source set dependencies`() {
+        val p = buildProjectWithMPP(
+            preApplyCode = {
+                publishUklib()
+            }
+        ) {
+            kotlin {
+                sourceSets.commonMain.get().dependencies {
+                    implementation("foo:bar:1")
+                }
+                iosArm64()
+            }
+        }.evaluate()
+        println(p)
+//            .multiplatformExtension.iosArm64().internal
+//            .compilations
+//            .getByName("main").internal.configurations.compileDependencyConfiguration.dependencies
+    }
+
     private data class TestFragment(
         val identifier: String,
         // FIXME: Test transitive refinees
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibResolutionTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibResolutionTests.kt
index 0b5a89e..5d10439 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibResolutionTests.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/uklibs/UklibResolutionTests.kt
@@ -9,6 +9,7 @@
 import org.gradle.api.artifacts.Configuration
 import org.gradle.api.attributes.Attribute
 import org.gradle.kotlin.dsl.maven
+import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
 import org.jetbrains.kotlin.gradle.plugin.mpp.uklibs.consumption.UklibResolutionStrategy
 import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
 import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
@@ -20,6 +21,7 @@
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
+@ExperimentalWasmDsl
 class UklibResolutionTests {
 
     @Test