Skip to content

Commit b7b0397

Browse files
dkrasnoffSpace Team
authored and
Space Team
committedDec 20, 2023
[Gradle] Made klib unpacked for native metadata compile task
^KT-63363 Fixed
1 parent 262697d commit b7b0397

File tree

13 files changed

+47
-41
lines changed

13 files changed

+47
-41
lines changed
 

‎libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonizerHierarchicalIT.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,28 @@ open class CommonizerHierarchicalIT : KGPBaseTest() {
2222
nativeProject("commonizeHierarchically", gradleVersion) {
2323
if (HostManager.hostIsMac) {
2424
build(":p1:compileIosMainKotlinMetadata") {
25-
assertFileInProjectExists("p1/build/classes/kotlin/metadata/iosMain/klib/p1_iosMain.klib")
25+
assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/iosMain/klib/p1_iosMain")
2626
assertNoDuplicateLibraryWarning()
2727
}
2828

2929
build(":p1:compileAppleMainKotlinMetadata") {
30-
assertFileInProjectExists("p1/build/classes/kotlin/metadata/appleMain/klib/p1_appleMain.klib")
30+
assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/appleMain/klib/p1_appleMain")
3131
assertNoDuplicateLibraryWarning()
3232
}
3333
}
3434

3535
build(":p1:compileLinuxMainKotlinMetadata") {
36-
assertFileInProjectExists("p1/build/classes/kotlin/metadata/linuxMain/klib/p1_linuxMain.klib")
36+
assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/linuxMain/klib/p1_linuxMain")
3737
assertNoDuplicateLibraryWarning()
3838
}
3939

4040
build(":p1:compileAppleAndLinuxMainKotlinMetadata") {
41-
assertFileInProjectExists("p1/build/classes/kotlin/metadata/appleAndLinuxMain/klib/p1_appleAndLinuxMain.klib")
41+
assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/appleAndLinuxMain/klib/p1_appleAndLinuxMain")
4242
assertNoDuplicateLibraryWarning()
4343
}
4444

4545
build(":p1:compileNativeMainKotlinMetadata") {
46-
assertFileInProjectExists("p1/build/classes/kotlin/metadata/nativeMain/klib/p1_nativeMain.klib")
46+
assertDirectoryInProjectExists("p1/build/classes/kotlin/metadata/nativeMain/klib/p1_nativeMain")
4747
assertNoDuplicateLibraryWarning()
4848
}
4949

‎libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt

+13
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ class ConfigurationCacheIT : AbstractConfigurationCacheIT() {
7979
}
8080
}
8181

82+
@MppGradlePluginTests
83+
@DisplayName("KT-63363: all metadata jar works well with configuration cache")
84+
@GradleTestVersions(
85+
minVersion = TestVersions.Gradle.G_7_4,
86+
additionalVersions = [TestVersions.Gradle.G_7_6],
87+
)
88+
@GradleTest
89+
fun testAllMetadataJarWithConfigurationCache(gradleVersion: GradleVersion) {
90+
project("new-mpp-lib-and-app/sample-lib", gradleVersion) {
91+
testConfigurationCacheOf(":allMetadataJar")
92+
}
93+
}
94+
8295
@NativeGradlePluginTests
8396
@DisplayName("works with commonizer")
8497
@GradleTestVersions(

‎libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ open class HierarchicalMppIT : KGPBaseTest() {
380380
) {
381381
build("assemble") {
382382
assertFileExists(projectPath.resolve("build/libs/test-project-jvm.jar"))
383-
assertFileExists(projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain.klib"))
383+
assertDirectoryExists(projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain"))
384384
}
385385
}
386386
}

‎libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ open class KlibBasedMppIT : BaseGradleIT() {
204204

205205
assertFileExists("build/classes/kotlin/metadata/commonMain/default/manifest")
206206
assertFileExists("build/classes/kotlin/metadata/jvmAndJsMain/default/manifest")
207-
assertFileExists("build/classes/kotlin/metadata/linuxMain/klib/${projectName}_linuxMain.klib")
207+
assertFileExists("build/classes/kotlin/metadata/linuxMain/klib/${projectName}_linuxMain")
208208

209209
// Check that the common and JVM+JS source sets don't receive the Kotlin/Native stdlib in the classpath:
210210
run {

‎libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppSharedNativeCompileIT.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class MppSharedNativeCompileIT : KGPBaseTest() {
2626
fun `test - shared native klib - does not contain 'depends=' manifest property`(gradleVersion: GradleVersion) {
2727
project("kt-54995-compileSharedNative-with-okio", gradleVersion) {
2828
build("compileNativeMainKotlinMetadata") {
29-
val nativeMainKlib = projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain.klib")
30-
assertFileExists(nativeMainKlib)
29+
val nativeMainKlib = projectPath.resolve("build/classes/kotlin/metadata/nativeMain/klib/test-project_nativeMain")
30+
assertDirectoryExists(nativeMainKlib)
3131

3232
val libraryFile = org.jetbrains.kotlin.library.resolveSingleFileKlib(
3333
org.jetbrains.kotlin.konan.file.File(nativeMainKlib),

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmHostSpecificMetadataArtifact.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
88
import org.gradle.api.artifacts.Dependency
99
import org.gradle.jvm.tasks.Jar
1010
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
11-
import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives
1211
import org.jetbrains.kotlin.gradle.tasks.registerTask
13-
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
1412

1513
/**
1614
* Will register a 'hostSpecificMetadataJar' [Jar] task containing compilation outputs of host specific metadata.
@@ -29,7 +27,7 @@ val GradleKpmHostSpecificMetadataArtifact = GradleKpmConfigurationArtifactsSetup
2927
if (metadataCompilation is GradleKpmNativeFragmentMetadataCompilationData) {
3028
jar.from(project.files(project.provider {
3129
if (metadataFragment in fragment.withRefinesClosure && metadataFragment.isNativeHostSpecific())
32-
project.filesWithUnpackedArchives(metadataCompilation.output.allOutputs, setOf(KLIB_FILE_EXTENSION))
30+
metadataCompilation.output.allOutputs
3331
else emptyList<Any>()
3432
})) { spec -> spec.into(metadataFragment.name) }
3533
}

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/setupFragmentsMetadataForKpmModules.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
1818
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
1919
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
2020
import org.jetbrains.kotlin.gradle.targets.metadata.createGenerateProjectStructureMetadataTask
21-
import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives
2221
import org.jetbrains.kotlin.gradle.tasks.*
2322
import org.jetbrains.kotlin.gradle.tasks.withType
2423
import org.jetbrains.kotlin.gradle.utils.*
2524
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
2625
import org.jetbrains.kotlin.gradle.utils.filesProvider
2726
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
28-
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
2927
import org.jetbrains.kotlin.project.model.KpmFragment
3028
import java.util.concurrent.Callable
3129

@@ -162,7 +160,7 @@ private fun configureMetadataJarTask(
162160
val compilationData = registry.getForFragmentOrNull(fragment)
163161
.takeIf { !fragment.isNativeHostSpecific() }
164162
?: return@filesProvider emptyList<Any>()
165-
project.filesWithUnpackedArchives(compilationData.output.allOutputs, setOf(KLIB_FILE_EXTENSION))
163+
compilationData.output.allOutputs
166164
}
167165
jar.from(metadataOutput) { spec ->
168166
spec.into(fragment.fragmentName)

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt

+1-12
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,7 @@ class KotlinMetadataTargetConfigurator :
320320
configureMetadataDependenciesForCompilation(this@apply)
321321

322322
if (!isHostSpecific) {
323-
val metadataContent = project.filesWithUnpackedArchives(this@apply.output.allOutputs, setOf("klib"))
324-
allMetadataJar.configure { it.from(metadataContent) { spec -> spec.into(this@apply.defaultSourceSet.name) } }
323+
allMetadataJar.configure { it.from(this@apply.output.allOutputs) { spec -> spec.into(this@apply.defaultSourceSet.name) } }
325324
if (this is KotlinSharedNativeCompilation) {
326325
project.includeCommonizedCInteropMetadata(allMetadataJar, this)
327326
}
@@ -477,16 +476,6 @@ internal suspend fun getPublishedPlatformCompilations(project: Project): Map<Kot
477476
return result
478477
}
479478

480-
internal fun Project.filesWithUnpackedArchives(from: FileCollection, extensions: Set<String>): FileCollection =
481-
project.files(project.provider {
482-
from.mapNotNull {
483-
@Suppress("IMPLICIT_CAST_TO_ANY")
484-
if (it.extension in extensions) {
485-
if (it.exists()) project.zipTree(it) else null
486-
} else it
487-
}
488-
}).builtBy(from)
489-
490479
private val KotlinMetadataTarget.metadataCompilationsCreated: CompletableFuture<Unit> by extrasLazyProperty("metadataCompilationsCreated") {
491480
CompletableFuture()
492481
}

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ abstract class KotlinNativeTarget @Inject constructor(
8080
}
8181

8282
metadataCompilations.forEach { compilation ->
83-
metadataJar.from(project.filesWithUnpackedArchives(compilation.output.allOutputs, setOf("klib"))) { spec ->
83+
metadataJar.from(compilation.output.allOutputs) { spec ->
8484
spec.into(compilation.name)
8585
}
8686
metadataJar.dependsOn(compilation.output.classesDirs)

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.*
3333
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XcodeVersionTask
3434
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFrameworkTask
3535
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.version
36+
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmMetadataCompilationData
3637
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
3738
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
3839
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
@@ -45,8 +46,6 @@ import org.jetbrains.kotlin.gradle.tasks.*
4546
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
4647
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
4748
import org.jetbrains.kotlin.gradle.testing.testTaskName
48-
import org.jetbrains.kotlin.gradle.utils.XcodeUtils
49-
import org.jetbrains.kotlin.gradle.utils.named
5049
import org.jetbrains.kotlin.gradle.utils.newInstance
5150
import org.jetbrains.kotlin.gradle.utils.valueSourceWithExecProviderCompat
5251
import org.jetbrains.kotlin.konan.target.HostManager
@@ -366,6 +365,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
366365
): TaskProvider<KotlinNativeCompile> {
367366
val project = compilationInfo.project
368367
val ext = project.topLevelExtension
368+
val isMetadataCompilation = checkCompilationIsMetadataCompilation(compilationInfo)
369369
val compileTaskProvider = project.registerTask<KotlinNativeCompile>(
370370
compilationInfo.compileKotlinTaskName,
371371
listOf(
@@ -399,6 +399,8 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
399399
)
400400
.finalizeValueOnRead()
401401

402+
// for metadata tasks we should provide unpacked klib
403+
it.produceUnpackedKlib.set(isMetadataCompilation)
402404
}
403405

404406
compilationInfo.classesDirs.from(compileTaskProvider.map { it.outputFile })
@@ -429,6 +431,13 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
429431
return compileTaskProvider
430432
}
431433

434+
private fun checkCompilationIsMetadataCompilation(compilationInfo: KotlinCompilationInfo): Boolean {
435+
return when (compilationInfo) {
436+
is KPM -> compilationInfo.compilationData is GradleKpmMetadataCompilationData<*>
437+
is KotlinCompilationInfo.TCS -> compilationInfo.compilation is KotlinMetadataCompilation<*>
438+
}
439+
}
440+
432441
private fun Project.klibOutputDirectory(
433442
compilation: KotlinCompilationInfo,
434443
): DirectoryProperty {

‎libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt

+5-6
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import org.jetbrains.kotlin.gradle.targets.native.tasks.*
4747
import org.jetbrains.kotlin.gradle.utils.*
4848
import org.jetbrains.kotlin.gradle.utils.GradleLoggerAdapter
4949
import org.jetbrains.kotlin.gradle.utils.listFilesOrEmpty
50-
import org.jetbrains.kotlin.incremental.deleteDirectoryContents
5150
import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageMode
5251
import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER
5352
import org.jetbrains.kotlin.konan.properties.saveToFile
@@ -152,6 +151,9 @@ abstract class AbstractKotlinNativeCompile<
152151
@get:Internal
153152
abstract val baseName: String
154153

154+
@get:Input
155+
internal abstract val produceUnpackedKlib: Property<Boolean>
156+
155157
@get:Input
156158
@get:Optional
157159
internal abstract val explicitApiMode: Property<ExplicitApiMode>
@@ -242,7 +244,7 @@ abstract class AbstractKotlinNativeCompile<
242244
open val outputFile: Provider<File>
243245
get() = destinationDirectory.flatMap {
244246
val prefix = outputKind.prefix(konanTarget)
245-
val suffix = outputKind.suffix(konanTarget)
247+
val suffix = if (produceUnpackedKlib.get()) "" else outputKind.suffix(konanTarget)
246248
val filename = "$prefix${baseName}$suffix".let {
247249
when {
248250
outputKind == FRAMEWORK ->
@@ -346,10 +348,6 @@ internal constructor(
346348
@get:Internal
347349
val moduleName: String get() = compilerOptions.moduleName.get()
348350

349-
@get:OutputFile
350-
override val outputFile: Provider<File>
351-
get() = super.outputFile
352-
353351
@get:Input
354352
val shortModuleName: String by providerFactory.provider { baseName }
355353

@@ -466,6 +464,7 @@ internal constructor(
466464
args.metadataKlib = sharedCompilationData != null
467465
args.nodefaultlibs = sharedCompilationData != null
468466
args.manifestFile = sharedCompilationData?.manifestFile?.absolutePath
467+
args.nopack = produceUnpackedKlib.get()
469468

470469
args.pluginOptions = compilerPlugins.flatMap { it.options.arguments }.toTypedArray()
471470

‎libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KotlinNativeCompileRefinesPathsTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ class KotlinNativeCompileRefinesPathsTest {
3535

3636
assertEquals(
3737
project.files(
38-
"build/classes/kotlin/metadata/nativeMain/klib/test_nativeMain.klib",
39-
"build/classes/kotlin/metadata/commonMain/klib/test_commonMain.klib"
38+
"build/classes/kotlin/metadata/nativeMain/klib/test_nativeMain",
39+
"build/classes/kotlin/metadata/commonMain/klib/test_commonMain"
4040
).toSet().relativeTo(project),
4141
compileTask.refinesModule.files.relativeTo(project)
4242
)

‎libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DependsOnClosureCompilePathTest.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class DependsOnClosureCompilePathTest {
2828
project.evaluate()
2929

3030
assertEquals(
31-
listOf("test_appleMain.klib", "test_nativeMain.klib", "test_commonMain.klib"),
31+
listOf("test_appleMain", "test_nativeMain", "test_commonMain"),
3232
kotlin.sourceSets.iosMain.get().dependsOnClosureCompilePath.toList().map { it.name }
3333
)
3434
}
@@ -78,7 +78,7 @@ class DependsOnClosureCompilePathTest {
7878
project.evaluate()
7979

8080
assertEquals(
81-
listOf("test_c.klib", "test_a.klib", "test_b.klib", "test_commonMain.klib"),
81+
listOf("test_c", "test_a", "test_b", "test_commonMain"),
8282
kotlin.sourceSets.linuxMain.get().dependsOnClosureCompilePath.toList().map { it.name }
8383
)
8484
}
@@ -130,7 +130,7 @@ class DependsOnClosureCompilePathTest {
130130
If the order changed, please investigate the root cause; Do not update the assertion!
131131
*/
132132
assertEquals(
133-
listOf("test_bottom.klib", "test_left.klib", "test_right.klib", "test_commonMain.klib"),
133+
listOf("test_bottom", "test_left", "test_right", "test_commonMain"),
134134
kotlin.sourceSets.linuxMain.get().dependsOnClosureCompilePath.toList().map { it.name }
135135
)
136136
}

0 commit comments

Comments
 (0)
Please sign in to comment.