Collect and pass to K2Native actual targets of native-shared compilation

^KT-38658 Fixed
This commit is contained in:
Dmitry Savvinov
2020-04-30 16:00:24 +03:00
parent 550aa1ba59
commit 686d00ddf5
4 changed files with 38 additions and 7 deletions
@@ -264,9 +264,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
val compilationFactory: KotlinCompilationFactory<out AbstractKotlinCompilation<*>> = 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)
}
@@ -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<KonanTarget>, 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<KotlinCommonOptions> {
override val friendArtifacts: FileCollection
@@ -26,11 +26,11 @@ class KotlinNativeCompilationFactory(
class KotlinSharedNativeCompilationFactory(
val target: KotlinMetadataTarget,
val konanTarget: KonanTarget
val konanTargets: List<KonanTarget>
): KotlinCompilationFactory<KotlinSharedNativeCompilation> {
override val itemClass: Class<KotlinSharedNativeCompilation>
get() = KotlinSharedNativeCompilation::class.java
override fun create(name: String): KotlinSharedNativeCompilation =
KotlinSharedNativeCompilation(target, konanTarget, name)
KotlinSharedNativeCompilation(target, konanTargets, name)
}
@@ -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<T : KotlinCommonToolOptions> : 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<File>
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<String> = mutableListOf<String>().apply {
addKey("-opt", optimized)
@@ -257,6 +274,7 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions> : 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<T : KotlinCommonToolOptions> : 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())
}
}