blob: 218a4847935b16e32e6e40afe358f6796a565ed6 [file] [log] [blame]
/*
* Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
import org.jetbrains.kotlin.KonanKlibInstallTask
import org.jetbrains.kotlin.gradle.plugin.konan.tasks.KonanCacheTask
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanInteropTask
import org.jetbrains.kotlin.konan.target.*
import org.jetbrains.kotlin.konan.util.*
// These properties are used by the 'konan' plugin, thus we set them before applying it.
val distDir: File by project
val konanHome: String by extra(distDir.absolutePath)
val jvmArgs: String by extra(
mutableListOf<String>().apply {
addAll(HostManager.defaultJvmArgs)
add(project.findProperty("platformLibsJvmArgs") as? String ?: "-Xmx6G")
}.joinToString(" ")
)
extra["org.jetbrains.kotlin.native.home"] = konanHome
extra["konan.jvmArgs"] = jvmArgs
plugins {
id("konan")
}
val targetsWithoutZlib: List<KonanTarget> by project
// region: Util functions.
fun KonanTarget.defFiles() =
project.fileTree("src/platform/${family.visibleName}")
.filter { it.name.endsWith(".def") }
// The libz.a/libz.so and zlib.h are missing in MIPS sysroots.
// Just workaround it until we have sysroots corrected.
.filterNot { (this in targetsWithoutZlib) && it.name == "zlib.def" }
.map { DefFile(it, this) }
fun defFileToLibName(target: String, name: String) = "$target-$name"
// endregion
if (HostManager.host == KonanTarget.MACOS_ARM64) {
project.configureJvmToolchain(JdkMajorVersion.JDK_17_0)
}
val konanTargetList: List<KonanTarget> by project
val targetList: List<String> by project
val cacheableTargets: List<KonanTarget> by project
konanTargetList.forEach { target ->
val targetName = target.visibleName
val installTasks = mutableListOf<TaskProvider<out Task>>()
val cacheTasks = mutableListOf<TaskProvider<out Task>>()
target.defFiles().forEach { df ->
val libName = defFileToLibName(targetName, df.name)
val fileNamePrefix = PlatformLibsInfo.namePrefix
val artifactName = "${fileNamePrefix}${df.name}"
konanArtifacts {
interop(
args = mapOf("targets" to listOf(targetName)),
name = libName
) {
df.file?.let { defFile(it) }
artifactName(artifactName)
noDefaultLibs(true)
noEndorsedLibs(true)
libraries {
klibs(df.config.depends.map { "${fileNamePrefix}${it}" })
}
extraOpts("-Xpurge-user-libs", "-Xshort-module-name", df.name)
compilerOpts("-fmodules-cache-path=${project.buildDir}/clangModulesCache")
}
}
@kotlin.Suppress("UNCHECKED_CAST")
val libTask = konanArtifacts.getByName(libName).getByTarget(targetName) as TaskProvider<KonanInteropTask>
libTask.configure {
dependsOn(df.config.depends.map { defFileToLibName(targetName, it) })
dependsOn(":kotlin-native:${targetName}CrossDist")
enableParallel = project.findProperty("kotlin.native.platformLibs.parallel")?.toString()?.toBoolean() ?: true
}
val klibInstallTask = tasks.register(libName, KonanKlibInstallTask::class.java) {
klib = libTask.map { it.artifact }
repo = file("$konanHome/klib/platform/$targetName")
this.target = targetName
dependsOn(libTask)
}
installTasks.add(klibInstallTask)
if (target in cacheableTargets) {
val cacheTask = tasks.register("${libName}Cache", KonanCacheTask::class.java) {
this.target = targetName
originalKlib = klibInstallTask.get().installDir.get()
klibUniqName = artifactName
cacheRoot = file("$konanHome/klib/cache").absolutePath
dependsOn(":kotlin-native:${targetName}StdlibCache")
dependsOn(tasks.named(libName))
dependsOn(df.config.depends.map {
val depName = defFileToLibName(targetName, it)
"${depName}Cache"
})
}
cacheTasks.add(cacheTask)
}
}
tasks.register("${targetName}Install") {
dependsOn(installTasks)
}
if (target in cacheableTargets) {
tasks.register("${targetName}Cache") {
dependsOn(cacheTasks)
group = BasePlugin.BUILD_GROUP
description = "Builds the compilation cache for platform: $targetName"
}
}
}
val hostName: String by project
val hostInstall by tasks.registering {
dependsOn("${hostName}Install")
}
val hostCache by tasks.registering {
dependsOn("${hostName}Cache")
}
val cache by tasks.registering {
dependsOn(tasks.withType(KonanCacheTask::class.java))
group = BasePlugin.BUILD_GROUP
description = "Builds all the compilation caches"
}