Added property for overriding konan distribution location

#KT-50463 Fixed

Merge-request: KT-MR-10310
Merged-by: Dmitrii Krasnov <Dmitrii.Krasnov@jetbrains.com>
This commit is contained in:
Dmitrii Krasnov
2023-07-12 12:36:51 +00:00
committed by Space Team
parent 2f7f69ed4f
commit f2816a5531
32 changed files with 174 additions and 108 deletions
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions
abstract class AbstractToolConfig(konanHome: String, userProvidedTargetName: String?, propertyOverrides: Map<String, String>) {
private val distribution = Distribution(konanHome, propertyOverrides = propertyOverrides)
abstract class AbstractToolConfig(konanHome: String, userProvidedTargetName: String?, propertyOverrides: Map<String, String>, konanDataDir: String? = null) {
private val distribution = Distribution(konanHome, propertyOverrides = propertyOverrides, konanDataDir = konanDataDir)
private val platformManager = PlatformManager(distribution)
private val targetManager = platformManager.targetManager(userProvidedTargetName)
private val host = HostManager.host
@@ -21,10 +21,10 @@ import org.jetbrains.kotlin.konan.properties.Properties
import org.jetbrains.kotlin.konan.util.InternalServer
class AppleConfigurablesImpl(
target: KonanTarget,
properties: Properties,
baseDir: String?
) : AppleConfigurables, KonanPropertiesLoader(target, properties, baseDir) {
target: KonanTarget,
properties: Properties,
dependenciesDir: String?
) : AppleConfigurables, KonanPropertiesLoader(target, properties, dependenciesDir) {
private val sdkDependency = this.targetSysRoot!!
private val toolchainDependency = this.targetToolchain!!
@@ -18,33 +18,33 @@ package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.properties.*
class GccConfigurablesImpl(target: KonanTarget, properties: Properties, baseDir: String?)
: GccConfigurables, KonanPropertiesLoader(target, properties, baseDir), ConfigurablesWithEmulator {
class GccConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: GccConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot), ConfigurablesWithEmulator {
override val dependencies: List<String>
get() = super.dependencies + listOfNotNull(emulatorDependency)
}
class AndroidConfigurablesImpl(target: KonanTarget, properties: Properties, baseDir: String?)
: AndroidConfigurables, KonanPropertiesLoader(target, properties, baseDir)
class AndroidConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: AndroidConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
class WasmConfigurablesImpl(target: KonanTarget, properties: Properties, baseDir: String?)
: WasmConfigurables, KonanPropertiesLoader(target, properties, baseDir)
class WasmConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: WasmConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, baseDir: String?)
: ZephyrConfigurables, KonanPropertiesLoader(target, properties, baseDir)
class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?)
: ZephyrConfigurables, KonanPropertiesLoader(target, properties, dependenciesRoot)
fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: String?): Configurables = when (target.family) {
Family.LINUX -> GccConfigurablesImpl(target, properties, baseDir)
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, baseDir)
Family.TVOS, Family.WATCHOS, Family.IOS, Family.OSX -> AppleConfigurablesImpl(target, properties, dependenciesRoot)
Family.ANDROID -> AndroidConfigurablesImpl(target, properties, baseDir)
Family.ANDROID -> AndroidConfigurablesImpl(target, properties, dependenciesRoot)
Family.MINGW -> MingwConfigurablesImpl(target, properties, baseDir)
Family.MINGW -> MingwConfigurablesImpl(target, properties, dependenciesRoot)
Family.WASM -> WasmConfigurablesImpl(target, properties, baseDir)
Family.WASM -> WasmConfigurablesImpl(target, properties, dependenciesRoot)
Family.ZEPHYR -> ZephyrConfigurablesImpl(target, properties, baseDir)
Family.ZEPHYR -> ZephyrConfigurablesImpl(target, properties, dependenciesRoot)
}
@@ -16,15 +16,17 @@ class Distribution private constructor(private val serialized: Serialized) : jav
konanHome: String,
onlyDefaultProfiles: Boolean = false,
runtimeFileOverride: String? = null,
propertyOverrides: Map<String, String>? = null
) : this(Serialized(konanHome, onlyDefaultProfiles, runtimeFileOverride, propertyOverrides))
propertyOverrides: Map<String, String>? = null,
konanDataDir: String? = null
) : this(Serialized(konanHome, onlyDefaultProfiles, runtimeFileOverride, propertyOverrides, konanDataDir))
val konanHome by serialized::konanHome
private val onlyDefaultProfiles by serialized::onlyDefaultProfiles
private val runtimeFileOverride by serialized::runtimeFileOverride
private val propertyOverrides by serialized::propertyOverrides
private val konanDataDir by serialized::konanDataDir
val localKonanDir = DependencyDirectories.localKonanDir
val localKonanDir = DependencyDirectories.getLocalKonanDir(konanDataDir)
val konanSubdir = "$konanHome/konan"
val mainPropertyFileName = "$konanSubdir/konan.properties"
@@ -99,7 +101,9 @@ class Distribution private constructor(private val serialized: Serialized) : jav
val launcherFiles = listOf("launcher.bc")
val dependenciesDir = DependencyDirectories.defaultDependenciesRoot.absolutePath
val dependenciesDir = DependencyDirectories
.getDependenciesRoot(konanDataDir)
.absolutePath
val subTargetProvider = object: SubTargetProvider {
override fun availableSubTarget(genericName: String) =
@@ -127,6 +131,7 @@ class Distribution private constructor(private val serialized: Serialized) : jav
val onlyDefaultProfiles: Boolean,
val runtimeFileOverride: String?,
val propertyOverrides: Map<String, String>?,
val konanDataDir: String?,
) : java.io.Serializable {
companion object {
private const val serialVersionUID: Long = 0L
@@ -139,4 +144,8 @@ class Distribution private constructor(private val serialized: Serialized) : jav
// TODO: Move into K/N?
fun buildDistribution(konanHome: String) = Distribution(konanHome,true, null)
fun customerDistribution(konanHome: String) = Distribution(konanHome,false, null)
fun buildDistribution(konanHome: String, konanDataDir: String?) = Distribution(konanHome,true, null, konanDataDir = konanDataDir)
fun customerDistribution(konanHome: String) = Distribution(konanHome,false, null)
fun customerDistribution(konanHome: String, konanDataDir: String?) = Distribution(konanHome,false, null, konanDataDir = konanDataDir)
@@ -34,10 +34,12 @@ interface TargetableExternalStorage {
fun downloadDependencies()
}
abstract class KonanPropertiesLoader(override val target: KonanTarget,
val properties: Properties,
private val baseDir: String? = null,
private val host: KonanTarget = HostManager.host) : Configurables {
abstract class KonanPropertiesLoader(
override val target: KonanTarget,
val properties: Properties,
private val dependenciesRoot: String?,
private val host: KonanTarget = HostManager.host,
) : Configurables {
private val predefinedLlvmDistributions: Set<String> =
properties.propertyList("predefinedLlvmDistributions").toSet()
@@ -87,13 +89,13 @@ abstract class KonanPropertiesLoader(override val target: KonanTarget,
override fun absolute(value: String?): String =
dependencyProcessor!!.resolve(value!!).absolutePath
private val dependencyProcessor by lazy {
baseDir?.let {
dependenciesRoot?.let {
DependencyProcessor(
dependenciesRoot = File(baseDir),
properties = this,
archiveType = defaultArchiveTypeByHost(host)
dependenciesRoot = File(dependenciesRoot),
properties = this,
archiveType = defaultArchiveTypeByHost(host)
){ url, currentBytes, totalBytes ->
print("\n(KonanProperies) Downloading dependency: $url (${currentBytes}/${totalBytes}). ")
print("\n(KonanProperties) Downloading dependency: $url (${currentBytes}/${totalBytes}). ")
}
}
}
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.util.DependencyProcessor
class Platform(val configurables: Configurables)
: Configurables by configurables {
class Platform(val configurables: Configurables) : Configurables by configurables {
val clang: ClangArgs.Native by lazy {
ClangArgs.Native(configurables)
@@ -35,15 +32,15 @@ class Platform(val configurables: Configurables)
}
class PlatformManager private constructor(private val serialized: Serialized) :
HostManager(serialized.distribution, serialized.experimental), java.io.Serializable {
HostManager(serialized.distribution, serialized.experimental), java.io.Serializable {
constructor(konanHome: String, experimental: Boolean = false) : this(Distribution(konanHome), experimental)
constructor(konanHome: String, experimental: Boolean = false, konanDataDir: String? = null) : this(Distribution(konanHome, konanDataDir = konanDataDir), experimental)
constructor(distribution: Distribution, experimental: Boolean = false) : this(Serialized(distribution, experimental))
private val distribution by serialized::distribution
private val loaders = enabled.map {
it to loadConfigurables(it, distribution.properties, DependencyProcessor.defaultDependenciesRoot.absolutePath)
it to loadConfigurables(it, distribution.properties, distribution.dependenciesDir)
}.toMap()
private val platforms = loaders.map {
@@ -58,8 +55,8 @@ class PlatformManager private constructor(private val serialized: Serialized) :
private fun writeReplace(): Any = serialized
private data class Serialized(
val distribution: Distribution,
val experimental: Boolean
val distribution: Distribution,
val experimental: Boolean,
) : java.io.Serializable {
companion object {
private const val serialVersionUID: Long = 0L
@@ -11,8 +11,8 @@ import org.jetbrains.kotlin.konan.properties.KonanPropertiesLoader
import org.jetbrains.kotlin.konan.properties.Properties
import java.nio.file.Paths
class MingwConfigurablesImpl(target: KonanTarget, properties: Properties, baseDir: String?)
: MingwConfigurables, KonanPropertiesLoader(target, properties, baseDir) {
class MingwConfigurablesImpl(target: KonanTarget, properties: Properties, dependenciesRoot: String?) : MingwConfigurables,
KonanPropertiesLoader(target, properties, dependenciesRoot) {
override val windowsKit: WindowsKit by lazy {
when (windowsSdkPartsProvider) {
WindowsSdkPartsProvider.InternalServer -> createCustomWindowsKitPath(Paths.get(absolute(windowsKitParts)))
@@ -8,13 +8,31 @@ package org.jetbrains.kotlin.konan.util
import java.io.File
object DependencyDirectories {
private const val DEPENDENCIES_FOLDER_NAME = "dependencies"
private const val CACHE_FOLDER_NAME = "cache"
@JvmStatic
val localKonanDir: File
get() = File(System.getenv("KONAN_DATA_DIR") ?: (System.getProperty("user.home") + File.separator + ".konan"))
get() = getLocalKonanDir()
@JvmStatic
val defaultDependenciesRoot: File
get() = localKonanDir.resolve("dependencies")
get() = getDependenciesRoot()
val defaultDependencyCacheDir: File
get() = localKonanDir.resolve("cache")
fun getLocalKonanDir(konanDataDir: String? = null): File {
return File(
konanDataDir
?: System.getenv("KONAN_DATA_DIR")
?: (System.getProperty("user.home") + File.separator + ".konan")
)
}
fun getDependenciesRoot(konanDataDir: String? = null): File {
return getLocalKonanDir(konanDataDir).resolve(DEPENDENCIES_FOLDER_NAME)
}
fun getDependencyCacheDir(konanDataDir: String? = null): File {
return getLocalKonanDir(konanDataDir).resolve(CACHE_FOLDER_NAME)
}
}
@@ -27,12 +27,10 @@ import java.net.InetAddress
import java.net.URL
import java.net.UnknownHostException
import java.nio.file.Paths
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
private val Properties.dependenciesUrl : String
private val Properties.dependenciesUrl: String
get() = getProperty("dependenciesUrl")
?: throw IllegalStateException("No such property in konan.properties: dependenciesUrl")
?: throw IllegalStateException("No such property in konan.properties: dependenciesUrl")
private val Properties.airplaneMode : Boolean
get() = getProperty("airplaneMode")?.toBoolean() ?: false
@@ -84,17 +82,19 @@ sealed class DependencySource {
* Inspects [dependencies] and downloads all the missing ones into [dependenciesDirectory] from [dependenciesUrl].
* If [airplaneMode] is true will throw a RuntimeException instead of downloading.
*/
class DependencyProcessor(dependenciesRoot: File,
private val dependenciesUrl: String,
dependencyToCandidates: Map<String, List<DependencySource>>,
homeDependencyCache: File = defaultDependencyCacheDir,
private val airplaneMode: Boolean = false,
maxAttempts: Int = DependencyDownloader.DEFAULT_MAX_ATTEMPTS,
attemptIntervalMs: Long = DependencyDownloader.DEFAULT_ATTEMPT_INTERVAL_MS,
customProgressCallback: ProgressCallback? = null,
private val keepUnstable: Boolean = true,
private val deleteArchives: Boolean = true,
private val archiveType: ArchiveType = ArchiveType.systemDefault) {
class DependencyProcessor(
dependenciesRoot: File,
private val dependenciesUrl: String,
dependencyToCandidates: Map<String, List<DependencySource>>,
homeDependencyCache: File = DependencyDirectories.getDependencyCacheDir(dependenciesRoot.absolutePath),
private val airplaneMode: Boolean = false,
maxAttempts: Int = DependencyDownloader.DEFAULT_MAX_ATTEMPTS,
attemptIntervalMs: Long = DependencyDownloader.DEFAULT_ATTEMPT_INTERVAL_MS,
customProgressCallback: ProgressCallback? = null,
private val keepUnstable: Boolean = true,
private val deleteArchives: Boolean = true,
private val archiveType: ArchiveType = ArchiveType.systemDefault,
) {
private val dependenciesDirectory by lazy {
dependenciesRoot.apply { mkdirs() }
@@ -222,16 +222,6 @@ class DependencyProcessor(dependenciesRoot: File,
}
companion object {
val localKonanDir: File
get() = File(System.getenv("KONAN_DATA_DIR") ?: (System.getProperty("user.home") + File.separator + ".konan"))
@JvmStatic
val defaultDependenciesRoot: File
get() = localKonanDir.resolve("dependencies")
val defaultDependencyCacheDir: File
get() = localKonanDir.resolve("cache")
val isInternalSeverAvailable: Boolean
get() = InternalServer.isAvailable
}