From 125a0e2f528fb8d18e276f85e0b835f89b5daf40 Mon Sep 17 00:00:00 2001 From: Dmitrii Krasnov Date: Mon, 18 Dec 2023 12:06:13 +0100 Subject: [PATCH] [Gradle] Made klib unpacked for native metadata compile task ^KT-63363 Fixed --- .../kotlin/gradle/CommonizerHierarchicalIT.kt | 10 +++++----- .../jetbrains/kotlin/gradle/ConfigurationCacheIT.kt | 13 +++++++++++++ .../jetbrains/kotlin/gradle/HierarchicalMppIT.kt | 2 +- .../org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt | 2 +- .../kotlin/gradle/mpp/MppSharedNativeCompileIT.kt | 4 ++-- .../gradle/artifacts/KotlinMetadataArtifact.kt | 4 +--- .../KotlinNativeHostSpecificMetadataArtifact.kt | 3 +-- .../KotlinCreateNativeCompileTasksSideEffect.kt | 8 ++++++-- .../metadata/KotlinMetadataTargetConfigurator.kt | 10 ---------- .../targets/native/tasks/KotlinNativeTasks.kt | 10 +++++----- .../KotlinNativeCompileRefinesPathsTest.kt | 4 ++-- .../unitTests/DependsOnClosureCompilePathTest.kt | 6 +++--- 12 files changed, 40 insertions(+), 36 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerHierarchicalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerHierarchicalIT.kt index f57aa8d8918..e82ac15299c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerHierarchicalIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerHierarchicalIT.kt @@ -22,28 +22,28 @@ open class CommonizerHierarchicalIT : KGPBaseTest() { nativeProject("commonizeHierarchically", gradleVersion) { if (HostManager.hostIsMac) { build(":p1:compileIosMainKotlinMetadata") { - assertFileInProjectExists("p1/build/classes/kotlin/metadata/iosMain/klib/p1_iosMain.klib") + assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/iosMain/klib/p1_iosMain") assertNoDuplicateLibraryWarning() } build(":p1:compileAppleMainKotlinMetadata") { - assertFileInProjectExists("p1/build/classes/kotlin/metadata/appleMain/klib/p1_appleMain.klib") + assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/appleMain/klib/p1_appleMain") assertNoDuplicateLibraryWarning() } } build(":p1:compileLinuxMainKotlinMetadata") { - assertFileInProjectExists("p1/build/classes/kotlin/metadata/linuxMain/klib/p1_linuxMain.klib") + assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/linuxMain/klib/p1_linuxMain") assertNoDuplicateLibraryWarning() } build(":p1:compileAppleAndLinuxMainKotlinMetadata") { - assertFileInProjectExists("p1/build/classes/kotlin/metadata/appleAndLinuxMain/klib/p1_appleAndLinuxMain.klib") + assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/appleAndLinuxMain/klib/p1_appleAndLinuxMain") assertNoDuplicateLibraryWarning() } build(":p1:compileNativeMainKotlinMetadata") { - assertFileInProjectExists("p1/build/classes/kotlin/metadata/nativeMain/klib/p1_nativeMain.klib") + assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/nativeMain/klib/p1_nativeMain") assertNoDuplicateLibraryWarning() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt index 9ea4a5fbd9b..3a79e20a606 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt @@ -79,6 +79,19 @@ class ConfigurationCacheIT : AbstractConfigurationCacheIT() { } } + @MppGradlePluginTests + @DisplayName("KT-63363: all metadata jar works well with configuration cache") + @GradleTestVersions( + minVersion = TestVersions.Gradle.G_7_4, + additionalVersions = [TestVersions.Gradle.G_7_6], + ) + @GradleTest + fun testAllMetadataJarWithConfigurationCache(gradleVersion: GradleVersion) { + project("new-mpp-lib-and-app/sample-lib", gradleVersion) { + testConfigurationCacheOf(":allMetadataJar") + } + } + @NativeGradlePluginTests @DisplayName("works with commonizer") @GradleTestVersions( diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt index 074616bb7b1..261a2cd0b4b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt @@ -384,7 +384,7 @@ open class HierarchicalMppIT : KGPBaseTest() { ) { build("assemble") { assertFileExists(projectPath.resolve("build/libs/test-project-jvm.jar")) - assertFileExists(projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain.klib")) + assertDirectoryExists(projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain")) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt index f2c5e6ea71d..bc8c8702144 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt @@ -204,7 +204,7 @@ open class KlibBasedMppIT : BaseGradleIT() { assertFileExists("build/classes/kotlin/metadata/commonMain/default/manifest") assertFileExists("build/classes/kotlin/metadata/jvmAndJsMain/default/manifest") - assertFileExists("build/classes/kotlin/metadata/linuxMain/klib/${projectName}_linuxMain.klib") + assertFileExists("build/classes/kotlin/metadata/linuxMain/klib/${projectName}_linuxMain") // Check that the common and JVM+JS source sets don't receive the Kotlin/Native stdlib in the classpath: run { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppSharedNativeCompileIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppSharedNativeCompileIT.kt index 1340515aa75..2bf0c48b5e4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppSharedNativeCompileIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppSharedNativeCompileIT.kt @@ -26,8 +26,8 @@ class MppSharedNativeCompileIT : KGPBaseTest() { fun `test - shared native klib - does not contain 'depends=' manifest property`(gradleVersion: GradleVersion) { project("kt-54995-compileSharedNative-with-okio", gradleVersion) { build("compileNativeMainKotlinMetadata") { - val nativeMainKlib = projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain.klib") - assertFileExists(nativeMainKlib) + val nativeMainKlib = projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain") + assertDirectoryExists(nativeMainKlib) val libraryFile = org.jetbrains.kotlin.library.resolveSingleFileKlib( org.jetbrains.kotlin.konan.file.File(nativeMainKlib), diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinMetadataArtifact.kt index 763eaf720d7..0d50cfcf9a7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinMetadataArtifact.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.plugin.categoryByName import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.targets.metadata.createGenerateProjectStructureMetadataTask -import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata @@ -46,8 +45,7 @@ internal val KotlinMetadataArtifact = KotlinTargetArtifact { target, apiElements /* Filter 'host specific' source sets (aka source sets that require a certain host to compile metadata) */ if (compilation.defaultSourceSet in hostSpecificSourceSets) return@all - val metadataContent = target.project.filesWithUnpackedArchives(compilation.output.allOutputs, setOf("klib")) - metadataJarTask.configure { it.from(metadataContent) { spec -> spec.into(compilation.defaultSourceSet.name) } } + metadataJarTask.configure { it.from(compilation.output.allOutputs) { spec -> spec.into(compilation.defaultSourceSet.name) } } if (compilation is KotlinSharedNativeCompilation) { target.project.includeCommonizedCInteropMetadata(metadataJarTask, compilation) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt index 3b329b32241..a3f0cfc0a0c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.getHostSpecificSourceSets import org.jetbrains.kotlin.gradle.plugin.usageByName -import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives import org.jetbrains.kotlin.gradle.targets.metadata.findMetadataCompilation import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata @@ -58,7 +57,7 @@ internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { t } metadataCompilations.forEach { compilation -> - metadataJar.from(project.filesWithUnpackedArchives(compilation.output.allOutputs, setOf("klib"))) { spec -> + metadataJar.from(compilation.output.allOutputs) { spec -> spec.into(compilation.name) } metadataJar.dependsOn(compilation.output.classesDirs) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCreateNativeCompileTasksSideEffect.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCreateNativeCompileTasksSideEffect.kt index 3fbcb5a8e32..e8d6388e343 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCreateNativeCompileTasksSideEffect.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCreateNativeCompileTasksSideEffect.kt @@ -7,16 +7,16 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl import org.gradle.api.plugins.BasePlugin import org.gradle.language.base.plugins.LifecycleBasePlugin +import org.jetbrains.kotlin.gradle.artifacts.klibOutputDirectory import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode import org.jetbrains.kotlin.gradle.dsl.topLevelExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle -import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.SubpluginEnvironment import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost -import org.jetbrains.kotlin.gradle.artifacts.klibOutputDirectory import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -29,6 +29,7 @@ internal val KotlinCreateNativeCompileTasksSideEffect = KotlinCompilationSideEff val project = compilation.project val extension = project.topLevelExtension val compilationInfo = KotlinCompilationInfo(compilation) + val isMetadataCompilation = compilationInfo.compilation is KotlinMetadataCompilation<*> val kotlinNativeCompile = project.registerTask( compilation.compileKotlinTaskName, @@ -53,6 +54,9 @@ internal val KotlinCreateNativeCompileTasksSideEffect = KotlinCompilationSideEff } } ).finalizeValueOnRead() + + // for metadata tasks we should provide unpacked klib + task.produceUnpackedKlib.set(isMetadataCompilation) } compilationInfo.classesDirs.from(kotlinNativeCompile.map { it.outputFile }) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index e50dcf55b3d..e94c3badfe4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -337,16 +337,6 @@ internal suspend fun getPublishedPlatformCompilations(project: Project): Map): FileCollection = - project.files(project.provider { - from.mapNotNull { - @Suppress("IMPLICIT_CAST_TO_ANY") - if (it.extension in extensions) { - if (it.exists()) project.zipTree(it) else null - } else it - } - }).builtBy(from) - private val KotlinMetadataTarget.metadataCompilationsCreated: CompletableFuture by extrasLazyProperty("metadataCompilationsCreated") { CompletableFuture() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index deefa65e0c9..a5fd71339ac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -149,6 +149,9 @@ abstract class AbstractKotlinNativeCompile< @get:Internal abstract val baseName: String + @get:Input + internal abstract val produceUnpackedKlib: Property + @get:Input @get:Optional internal abstract val explicitApiMode: Property @@ -229,7 +232,7 @@ abstract class AbstractKotlinNativeCompile< open val outputFile: Provider get() = destinationDirectory.flatMap { val prefix = outputKind.prefix(konanTarget) - val suffix = outputKind.suffix(konanTarget) + val suffix = if (produceUnpackedKlib.get()) "" else outputKind.suffix(konanTarget) val filename = "$prefix${baseName}$suffix".let { when { outputKind == FRAMEWORK -> @@ -334,10 +337,6 @@ internal constructor( @get:Internal val moduleName: String get() = compilerOptions.moduleName.get() - @get:OutputFile - override val outputFile: Provider - get() = super.outputFile - @get:Input val shortModuleName: String by providerFactory.provider { baseName } @@ -453,6 +452,7 @@ internal constructor( args.metadataKlib = sharedCompilationData != null args.nodefaultlibs = sharedCompilationData != null args.manifestFile = sharedCompilationData?.manifestFile?.absolutePath + args.nopack = produceUnpackedKlib.get() args.pluginOptions = compilerPlugins.flatMap { it.options.arguments }.toTypedArray() diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KotlinNativeCompileRefinesPathsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KotlinNativeCompileRefinesPathsTest.kt index 90413f4a94f..48eb2fb8c62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KotlinNativeCompileRefinesPathsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KotlinNativeCompileRefinesPathsTest.kt @@ -35,8 +35,8 @@ class KotlinNativeCompileRefinesPathsTest { assertEquals( project.files( - "build/classes/kotlin/metadata/nativeMain/klib/test_nativeMain.klib", - "build/classes/kotlin/metadata/commonMain/klib/test_commonMain.klib" + "build/classes/kotlin/metadata/nativeMain/klib/test_nativeMain", + "build/classes/kotlin/metadata/commonMain/klib/test_commonMain" ).toSet().relativeTo(project), compileTask.refinesModule.files.relativeTo(project) ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DependsOnClosureCompilePathTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DependsOnClosureCompilePathTest.kt index 1baa99293d4..09aaa1f1c9b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DependsOnClosureCompilePathTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DependsOnClosureCompilePathTest.kt @@ -28,7 +28,7 @@ class DependsOnClosureCompilePathTest { project.evaluate() assertEquals( - listOf("test_appleMain.klib", "test_nativeMain.klib", "test_commonMain.klib"), + listOf("test_appleMain", "test_nativeMain", "test_commonMain"), kotlin.sourceSets.iosMain.get().dependsOnClosureCompilePath.toList().map { it.name } ) } @@ -78,7 +78,7 @@ class DependsOnClosureCompilePathTest { project.evaluate() assertEquals( - listOf("test_c.klib", "test_a.klib", "test_b.klib", "test_commonMain.klib"), + listOf("test_c", "test_a", "test_b", "test_commonMain"), kotlin.sourceSets.linuxMain.get().dependsOnClosureCompilePath.toList().map { it.name } ) } @@ -130,7 +130,7 @@ class DependsOnClosureCompilePathTest { If the order changed, please investigate the root cause; Do not update the assertion! */ assertEquals( - listOf("test_bottom.klib", "test_left.klib", "test_right.klib", "test_commonMain.klib"), + listOf("test_bottom", "test_left", "test_right", "test_commonMain"), kotlin.sourceSets.linuxMain.get().dependsOnClosureCompilePath.toList().map { it.name } ) }