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