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:
committed by
Space Team
parent
2f7f69ed4f
commit
f2816a5531
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user