[Gradle] Made klib unpacked for native metadata compile task
^KT-63363 Fixed
This commit is contained in:
committed by
Space Team
parent
470ec8aef1
commit
125a0e2f52
+5
-5
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
+13
@@ -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(
|
||||
|
||||
+1
-1
@@ -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"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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),
|
||||
|
||||
+1
-3
@@ -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)
|
||||
}
|
||||
|
||||
+1
-2
@@ -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)
|
||||
|
||||
+6
-2
@@ -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<KotlinNativeCompile>(
|
||||
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 })
|
||||
|
||||
-10
@@ -337,16 +337,6 @@ internal suspend fun getPublishedPlatformCompilations(project: Project): Map<Kot
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun Project.filesWithUnpackedArchives(from: FileCollection, extensions: Set<String>): 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<Unit> by extrasLazyProperty("metadataCompilationsCreated") {
|
||||
CompletableFuture()
|
||||
}
|
||||
|
||||
+5
-5
@@ -149,6 +149,9 @@ abstract class AbstractKotlinNativeCompile<
|
||||
@get:Internal
|
||||
abstract val baseName: String
|
||||
|
||||
@get:Input
|
||||
internal abstract val produceUnpackedKlib: Property<Boolean>
|
||||
|
||||
@get:Input
|
||||
@get:Optional
|
||||
internal abstract val explicitApiMode: Property<ExplicitApiMode>
|
||||
@@ -229,7 +232,7 @@ abstract class AbstractKotlinNativeCompile<
|
||||
open val outputFile: Provider<File>
|
||||
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<File>
|
||||
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()
|
||||
|
||||
|
||||
+2
-2
@@ -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)
|
||||
)
|
||||
|
||||
+3
-3
@@ -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 }
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user