[Gradle] Moved downloading konan dependencies from compiler to Gradle

^KT-65823 Fixed
This commit is contained in:
Dmitrii Krasnov
2024-02-14 15:57:02 +01:00
committed by Space Team
parent 8ae6e98295
commit f525d03e67
8 changed files with 174 additions and 75 deletions
@@ -19,12 +19,14 @@ package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.properties.KonanPropertiesLoader
import org.jetbrains.kotlin.konan.properties.Properties
import org.jetbrains.kotlin.konan.util.InternalServer
import org.jetbrains.kotlin.konan.util.ProgressCallback
class AppleConfigurablesImpl(
target: KonanTarget,
properties: Properties,
dependenciesDir: String?
) : AppleConfigurables, KonanPropertiesLoader(target, properties, dependenciesDir) {
dependenciesDir: String?,
progressCallback: ProgressCallback,
) : AppleConfigurables, KonanPropertiesLoader(target, properties, dependenciesDir, progressCallback = progressCallback) {
private val sdkDependency = this.targetSysRoot!!
private val toolchainDependency = this.targetToolchain!!
@@ -45,10 +47,13 @@ class AppleConfigurablesImpl(
XcodePartsProvider.InternalServer -> absolute(additionalToolsDir)
}
override val dependencies get() = super.dependencies + when (xcodePartsProvider) {
is XcodePartsProvider.Local -> emptyList()
XcodePartsProvider.InternalServer -> listOf(sdkDependency, toolchainDependency, xcodeAddonDependency)
}
override val dependencies
get() = super.dependencies +
if (InternalServer.isAvailable) listOf(
sdkDependency,
toolchainDependency,
xcodeAddonDependency
) else emptyList()
private val xcodePartsProvider by lazy {
if (InternalServer.isAvailable) {
@@ -17,34 +17,42 @@
package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.properties.*
import org.jetbrains.kotlin.konan.util.ProgressCallback
class GccConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: GccConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot), ConfigurablesWithEmulator {
class GccConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?, progressCallback: ProgressCallback) : GccConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot, progressCallback = progressCallback), ConfigurablesWithEmulator {
override val dependencies: List<String>
get() = super.dependencies + listOfNotNull(emulatorDependency)
}
class AndroidConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: AndroidConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
class WasmConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: WasmConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: ZephyrConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
fun loadConfigurables(target: KonanTarget, properties: Properties, dependenciesRoot: String?): Configurables = when (target.family) {
Family.LINUX -> GccConfigurablesImpl(target, properties, dependenciesRoot)
Family.TVOS, Family.WATCHOS, Family.IOS, Family.OSX -> AppleConfigurablesImpl(target, properties, dependenciesRoot)
Family.ANDROID -> AndroidConfigurablesImpl(target, properties, dependenciesRoot)
Family.MINGW -> MingwConfigurablesImpl(target, properties, dependenciesRoot)
Family.WASM -> WasmConfigurablesImpl(target, properties, dependenciesRoot)
Family.ZEPHYR -> ZephyrConfigurablesImpl(target, properties, dependenciesRoot)
}
class AndroidConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?, progressCallback: ProgressCallback) : AndroidConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot, progressCallback = progressCallback)
class WasmConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?, progressCallback: ProgressCallback) : WasmConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot, progressCallback = progressCallback)
class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?, progressCallback: ProgressCallback) : ZephyrConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot, progressCallback = progressCallback)
fun loadConfigurables(
target: KonanTarget,
properties: Properties,
dependenciesRoot: String?,
progressCallback: ProgressCallback = { url, currentBytes, totalBytes ->
print("\n(KonanProperties) Downloading dependency: $url (${currentBytes}/${totalBytes}). ")
},
): Configurables = when (target.family) {
Family.LINUX -> GccConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
Family.TVOS, Family.WATCHOS, Family.IOS, Family.OSX -> AppleConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
Family.ANDROID -> AndroidConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
Family.MINGW -> MingwConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
Family.WASM -> WasmConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
Family.ZEPHYR -> ZephyrConfigurablesImpl(target, properties, dependenciesRoot, progressCallback)
}
@@ -21,15 +21,16 @@ import org.jetbrains.kotlin.konan.target.Configurables
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.util.ArchiveType
import org.jetbrains.kotlin.konan.util.DependencyProcessor
import org.jetbrains.kotlin.konan.util.ProgressCallback
import java.io.File
interface TargetableExternalStorage {
fun targetString(key: String): String?
fun targetString(key: String): String?
fun targetList(key: String): List<String>
fun hostString(key: String): String?
fun hostList(key: String): List<String>
fun hostTargetString(key: String): String?
fun hostTargetList(key: String): List<String>
fun hostString(key: String): String?
fun hostList(key: String): List<String>
fun hostTargetString(key: String): String?
fun hostTargetList(key: String): List<String>
fun absolute(value: String?): String
fun downloadDependencies()
}
@@ -39,21 +40,24 @@ abstract class KonanPropertiesLoader(
val properties: Properties,
private val dependenciesRoot: String?,
private val host: KonanTarget = HostManager.host,
private val progressCallback: ProgressCallback,
) : Configurables {
private val predefinedLlvmDistributions: Set<String> =
properties.propertyList("predefinedLlvmDistributions").toSet()
properties.propertyList("predefinedLlvmDistributions").toSet()
private val predefinedLibffiVersions: Set<String> =
properties.propertyList("predefinedLibffiVersions").toSet()
properties.propertyList("predefinedLibffiVersions").toSet()
private fun getPredefinedDependencyOrNull(
dependencyName: String,
dependencyAccessor: () -> String?,
predefinedDependencies: Set<String>
dependencyName: String,
dependencyAccessor: () -> String?,
predefinedDependencies: Set<String>,
): String? {
// Store into variable to avoid repeated resolve.
val dependency = dependencyAccessor()
?: error("Undefined $dependencyName!")
?: error("Undefined $dependencyName!")
return when (dependency) {
in predefinedDependencies -> dependency
else -> null
@@ -61,8 +65,8 @@ abstract class KonanPropertiesLoader(
}
private fun compilerDependencies(): List<String> = listOfNotNull(
getPredefinedDependencyOrNull("LLVM home", this::llvmHome, predefinedLlvmDistributions),
getPredefinedDependencyOrNull("libffi version", this::libffiDir, predefinedLibffiVersions)
getPredefinedDependencyOrNull("LLVM home", this::llvmHome, predefinedLlvmDistributions),
getPredefinedDependencyOrNull("libffi version", this::libffiDir, predefinedLibffiVersions)
)
open val dependencies: List<String>
@@ -73,38 +77,30 @@ abstract class KonanPropertiesLoader(
}
// TODO: We may want to add caching to avoid repeated resolve.
override fun targetString(key: String): String?
= properties.targetString(key, target)
override fun targetList(key: String): List<String>
= properties.targetList(key, target)
override fun hostString(key: String): String?
= properties.hostString(key, host)
override fun hostList(key: String): List<String>
= properties.hostList(key, host)
override fun hostTargetString(key: String): String?
= properties.hostTargetString(key, target, host)
override fun hostTargetList(key: String): List<String>
= properties.hostTargetList(key, target, host)
override fun targetString(key: String): String? = properties.targetString(key, target)
override fun targetList(key: String): List<String> = properties.targetList(key, target)
override fun hostString(key: String): String? = properties.hostString(key, host)
override fun hostList(key: String): List<String> = properties.hostList(key, host)
override fun hostTargetString(key: String): String? = properties.hostTargetString(key, target, host)
override fun hostTargetList(key: String): List<String> = properties.hostTargetList(key, target, host)
override fun absolute(value: String?): String =
dependencyProcessor!!.resolve(value!!).absolutePath
private val dependencyProcessor by lazy {
dependencyProcessor!!.resolve(value!!).absolutePath
private val dependencyProcessor by lazy {
dependenciesRoot?.let {
DependencyProcessor(
dependenciesRoot = File(dependenciesRoot),
properties = this,
archiveType = defaultArchiveTypeByHost(host)
){ url, currentBytes, totalBytes ->
print("\n(KonanProperties) Downloading dependency: $url (${currentBytes}/${totalBytes}). ")
}
archiveType = defaultArchiveTypeByHost(host),
customProgressCallback = progressCallback
)
}
}
}
private fun defaultArchiveTypeByHost(host: KonanTarget): ArchiveType = when (host) {
KonanTarget.LINUX_X64,
KonanTarget.MACOS_X64,
KonanTarget.MACOS_ARM64 -> ArchiveType.TAR_GZ
KonanTarget.LINUX_X64, KonanTarget.MACOS_X64, KonanTarget.MACOS_ARM64 -> ArchiveType.TAR_GZ
KonanTarget.MINGW_X64 -> ArchiveType.ZIP
else -> error("$host can't be a host platform!")
}
@@ -9,10 +9,11 @@ import org.jetbrains.kotlin.konan.util.InternalServer
import java.nio.file.Path
import org.jetbrains.kotlin.konan.properties.KonanPropertiesLoader
import org.jetbrains.kotlin.konan.properties.Properties
import org.jetbrains.kotlin.konan.util.ProgressCallback
import java.nio.file.Paths
class MingwConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?) : MingwConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot) {
class MingwConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?, progressCallback : ProgressCallback) : MingwConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot, progressCallback = progressCallback) {
override val windowsKit: WindowsKit by lazy {
when (windowsSdkPartsProvider) {
WindowsSdkPartsProvider.InternalServer -> createCustomWindowsKitPath(Paths.get(absolute(windowsKitParts)))
@@ -65,9 +65,6 @@ private fun Properties.findCandidates(dependencies: List<String>): Map<String, L
private val KonanPropertiesLoader.dependenciesUrl : String get() = properties.dependenciesUrl
private val KonanPropertiesLoader.airplaneMode : Boolean get() = properties.airplaneMode
private val KonanPropertiesLoader.downloadingAttempts : Int get() = properties.downloadingAttempts
private val KonanPropertiesLoader.downloadingAttemptIntervalMs : Long get() = properties.downloadingAttemptIntervalMs
sealed class DependencySource {
data class Local(val path: File) : DependencySource()