From 686d00ddf54aa082ed98ad87747befa04ed9168f Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Thu, 30 Apr 2020 16:00:24 +0300 Subject: [PATCH] Collect and pass to K2Native actual targets of native-shared compilation ^KT-38658 Fixed --- .../KotlinMetadataTargetConfigurator.kt | 4 +-- .../targets/native/KotlinNativeCompilation.kt | 10 +++++-- .../native/KotlinNativeCompilationFactory.kt | 4 +-- .../targets/native/tasks/KotlinNativeTasks.kt | 27 +++++++++++++++++++ 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 5cb9309b31a..a1272ee348a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -264,9 +264,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) : val compilationFactory: KotlinCompilationFactory> = when { isNativeSourceSet -> KotlinSharedNativeCompilationFactory( target, - //get FIRST platform for metadata compiling - //todo: get commonized platform libraries for metadata compiling - (platformCompilations.first() as KotlinNativeCompilation).konanTarget + platformCompilations.map { (it as AbstractKotlinNativeCompilation).konanTarget } ) else -> KotlinCommonCompilationFactory(target) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 40dfe5ec812..4de8401a500 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -97,8 +97,14 @@ class KotlinNativeCompilation( get() = compileKotlinTask.kotlinOptions } -class KotlinSharedNativeCompilation(override val target: KotlinMetadataTarget, konanTarget: KonanTarget, name: String) : - AbstractKotlinNativeCompilation(target, konanTarget, name), +class KotlinSharedNativeCompilation(override val target: KotlinMetadataTarget, val konanTargets: List, name: String) : + AbstractKotlinNativeCompilation( + target, + // TODO: this will end up as '-target' argument passed to K2Native, which is wrong. + // Rewrite this when we'll compile native-shared source-sets against commonized platform libs + konanTargets.first(), + name + ), KotlinMetadataCompilation { override val friendArtifacts: FileCollection diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt index 868d2bfab0e..38ef1dfd23b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt @@ -26,11 +26,11 @@ class KotlinNativeCompilationFactory( class KotlinSharedNativeCompilationFactory( val target: KotlinMetadataTarget, - val konanTarget: KonanTarget + val konanTargets: List ): KotlinCompilationFactory { override val itemClass: Class get() = KotlinSharedNativeCompilation::class.java override fun create(name: String): KotlinSharedNativeCompilation = - KotlinSharedNativeCompilation(target, konanTarget, name) + KotlinSharedNativeCompilation(target, konanTargets, name) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index bd1c8dae203..9fab3674e12 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind +import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName import org.jetbrains.kotlin.gradle.plugin.mpp.* @@ -28,6 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.klibModuleName import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER +import org.jetbrains.kotlin.konan.properties.saveToFile import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind.* import org.jetbrains.kotlin.konan.target.KonanTarget @@ -245,6 +247,21 @@ abstract class AbstractKotlinNativeCompile : Abstra } } + @get:Input + @get:Optional + internal val konanTargetsForManifest: String? by project.provider { + (compilation as? KotlinSharedNativeCompilation) + ?.konanTargets + ?.joinToString(separator = " ") { it.visibleName } + } + + @get:Internal + internal val manifestFile: Provider + get() = project.provider { + val inputManifestFile = project.buildDir.resolve("tmp/$name/inputManifest") + inputManifestFile + } + // Args passed to the compiler only (except sources). protected open fun buildCompilerArgs(): List = mutableListOf().apply { addKey("-opt", optimized) @@ -257,6 +274,7 @@ abstract class AbstractKotlinNativeCompile : Abstra if (compilation is KotlinSharedNativeCompilation) { add("-Xexpect-actual-linker") add("-Xmetadata-klib") + addArg("-manifest", manifestFile.get().absolutePath) } addArg("-o", outputFile.get().absolutePath) @@ -278,6 +296,15 @@ abstract class AbstractKotlinNativeCompile : Abstra open fun compile() { val output = outputFile.get() output.parentFile.mkdirs() + + if (compilation is KotlinSharedNativeCompilation) { + val manifestFile: File = manifestFile.get() + manifestFile.ensureParentDirsCreated() + val properties = java.util.Properties() + properties[KLIB_PROPERTY_NATIVE_TARGETS] = konanTargetsForManifest!! + properties.saveToFile(org.jetbrains.kotlin.konan.file.File(manifestFile.toPath())) + } + KotlinNativeCompilerRunner(project).run(buildArgs()) } }