diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index a21ff02bda1..904912ea842 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -57,6 +57,7 @@ void loadCommandLineProperties() { loadCommandLineProperties() loadLocalProperties() +apply plugin: 'platform-manager' apply plugin: 'konan' apply plugin: 'kotlin' apply plugin: 'kotlin.native.build-tools-conventions' @@ -71,7 +72,7 @@ configurations { ext.testOutputRoot = rootProject.file("test.output").absolutePath -ext.platformManager = project.project(":kotlin-native").platformManager +ext.platformManager = project.extensions.platformManager ext.target = platformManager.targetManager(project.testTarget).target ext.buildNumber = rootProject.property("kotlinVersion") diff --git a/kotlin-native/build-tools/build.gradle.kts b/kotlin-native/build-tools/build.gradle.kts index a58e530e232..88c3eef789d 100644 --- a/kotlin-native/build-tools/build.gradle.kts +++ b/kotlin-native/build-tools/build.gradle.kts @@ -130,5 +130,9 @@ gradlePlugin { id = "native-dependencies" implementationClass = "org.jetbrains.kotlin.dependencies.NativeDependenciesPlugin" } + create("platformManager") { + id = "platform-manager" + implementationClass = "org.jetbrains.kotlin.PlatformManagerPlugin" + } } } diff --git a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy index d7c4a53452b..742304d43d3 100644 --- a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy +++ b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy @@ -170,7 +170,7 @@ class NamedNativeInteropConfig implements Named { this.project = project this.flavor = flavor - def platformManager = project.project(":kotlin-native").ext.platformManager + def platformManager = project.extensions.platformManager def targetManager = platformManager.targetManager(target) this.target = targetManager.targetName @@ -304,6 +304,7 @@ class NativeInteropPlugin implements Plugin { @Override void apply(Project prj) { + prj.plugins.apply("platform-manager") prj.plugins.apply("native-dependencies") prj.extensions.add("kotlinNativeInterop", new NativeInteropExtension(prj)) diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt index cd7b92832c8..7a94add2a88 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt @@ -161,12 +161,6 @@ abstract class ExecClang @Inject constructor( } companion object { - @JvmStatic - fun create(project: Project): ExecClang = create( - project.objects, - project.project(":kotlin-native").findProperty("platformManager") as PlatformManager, - ) - @JvmStatic fun create(objects: ObjectFactory, platformManager: PlatformManager) = objects.newInstance(ExecClang::class.java, platformManager) diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformInfo.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformInfo.kt index 2dcd6d84cea..01492f21596 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformInfo.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformInfo.kt @@ -32,7 +32,7 @@ object PlatformInfo { @JvmStatic fun getTarget(project: Project): KonanTarget { - val platformManager = project.project(":kotlin-native").platformManager + val platformManager = project.platformManager val targetName = project.project.testTarget.name return platformManager.targetManager(targetName).target } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformManagerPlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformManagerPlugin.kt new file mode 100644 index 00000000000..378c95e01de --- /dev/null +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/PlatformManagerPlugin.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin + +import kotlinBuildProperties +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.konan.target.* + +open class PlatformManagerPlugin : Plugin { + override fun apply(project: Project) { + val konanDataDir = project.kotlinBuildProperties.getOrNull("konan.data.dir") as String? + val platformManager = PlatformManager(buildDistribution(project.project(":kotlin-native").projectDir.absolutePath, konanDataDir), false) + project.extensions.add("platformManager", platformManager) + } +} diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt index 2d109b1a5ce..4eddcbad715 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt @@ -12,6 +12,7 @@ import org.gradle.api.file.FileCollection import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.provider.Provider import org.gradle.api.tasks.TaskProvider +import org.gradle.kotlin.dsl.* import org.jetbrains.kotlin.konan.target.* import java.io.File import java.nio.file.Path @@ -25,7 +26,7 @@ private const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version" //region Project properties. val Project.platformManager - get() = findProperty("platformManager") as PlatformManager + get() = extensions.getByType() val Project.testTarget get() = findProperty("target") as? KonanTarget ?: HostManager.host @@ -331,7 +332,7 @@ fun Project.buildStaticLibrary(cSources: Collection, output: File, objDir: val platform = platformManager.platform(testTarget) objDir.mkdirs() - ExecClang.create(project).execClangForCompilerTests(testTarget) { + ExecClang.create(project.objects, project.platformManager).execClangForCompilerTests(testTarget) { args = listOf("-c", *cSources.map { it.absolutePath }.toTypedArray()) workingDir(objDir) } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/bitcode/CompileToBitcodePlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/bitcode/CompileToBitcodePlugin.kt index b26b1f996a7..ccf87789857 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/bitcode/CompileToBitcodePlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/bitcode/CompileToBitcodePlugin.kt @@ -21,6 +21,7 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.* import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.ExecClang +import org.jetbrains.kotlin.PlatformManagerPlugin import org.jetbrains.kotlin.cpp.* import org.jetbrains.kotlin.dependencies.NativeDependenciesExtension import org.jetbrains.kotlin.dependencies.NativeDependenciesPlugin @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.konan.target.PlatformManager import org.jetbrains.kotlin.konan.target.SanitizerKind import org.jetbrains.kotlin.konan.target.TargetDomainObjectContainer import org.jetbrains.kotlin.konan.target.TargetWithSanitizer +import org.jetbrains.kotlin.konan.target.enabledTargets import org.jetbrains.kotlin.testing.native.GoogleTestExtension import org.jetbrains.kotlin.utils.capitalized import java.time.Duration @@ -139,13 +141,10 @@ open class CompileToBitcodeExtension @Inject constructor(val project: Project) : "-Wno-unused-parameter", // False positives with polymorphic functions. ) - private val targetList = with(project) { - provider { (rootProject.project(":kotlin-native").property("targetList") as? List<*>)?.filterIsInstance() ?: emptyList() } // TODO: Can we make it better? - } - private val allTestsTasks by lazy { val name = project.name.capitalized - targetList.get().associateBy(keySelector = { it }, valueTransform = { + val platformManager = project.extensions.getByType() + enabledTargets(platformManager).associateBy(keySelector = { it.visibleName }, valueTransform = { project.tasks.register("${it}${name}Tests") { description = "Runs all $name tests for $it" group = VERIFICATION_TASK_GROUP @@ -670,6 +669,7 @@ open class CompileToBitcodeExtension @Inject constructor(val project: Project) : */ open class CompileToBitcodePlugin : Plugin { override fun apply(project: Project) { + project.apply() project.apply() project.apply() project.apply() diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/GitClangFormatPlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/GitClangFormatPlugin.kt index 209efe67592..df83070c40f 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/GitClangFormatPlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/cpp/GitClangFormatPlugin.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.cpp import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.PlatformManagerPlugin import org.jetbrains.kotlin.dependencies.NativeDependenciesExtension import org.jetbrains.kotlin.dependencies.NativeDependenciesPlugin @@ -16,6 +17,7 @@ import org.jetbrains.kotlin.dependencies.NativeDependenciesPlugin */ open class GitClangFormatPlugin : Plugin { override fun apply(target: Project) { + target.apply() target.apply() val nativeDependencies = target.extensions.getByType() @@ -35,4 +37,4 @@ open class GitClangFormatPlugin : Plugin { @JvmStatic val TASK_GROUP = "development support" } -} \ No newline at end of file +} diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloader.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloader.kt index 6418749bcb0..865d6e09165 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloader.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloader.kt @@ -61,4 +61,4 @@ abstract class NativeDependenciesDownloader : DefaultTask() { dependencyProcessor.showInfo = logger.isEnabled(LogLevel.INFO) dependencyProcessor.run() } -} \ No newline at end of file +} diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloaderPlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloaderPlugin.kt index 03079a2ee11..cbfa0622459 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloaderPlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesDownloaderPlugin.kt @@ -13,6 +13,7 @@ import org.gradle.api.file.DirectoryProperty import org.gradle.api.logging.LogLevel import org.gradle.api.provider.Property import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.PlatformManagerPlugin import org.jetbrains.kotlin.konan.properties.KonanPropertiesLoader import org.jetbrains.kotlin.konan.target.PlatformManager import org.jetbrains.kotlin.konan.target.TargetDomainObjectContainer @@ -166,7 +167,8 @@ abstract class NativeDependenciesDownloaderExtension @Inject constructor(private */ open class NativeDependenciesDownloaderPlugin : Plugin { override fun apply(project: Project) { + project.apply() project.apply() project.extensions.create("nativeDependenciesDownloader", project) } -} \ No newline at end of file +} diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesPlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesPlugin.kt index f0122fe8353..387111a93f3 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesPlugin.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/dependencies/NativeDependenciesPlugin.kt @@ -12,6 +12,7 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Usage import org.gradle.api.file.FileCollection import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.PlatformManagerPlugin import org.jetbrains.kotlin.konan.target.* import java.io.File import java.nio.file.Paths @@ -137,7 +138,8 @@ abstract class NativeDependenciesExtension @Inject constructor(private val proje */ class NativeDependenciesPlugin : Plugin { override fun apply(project: Project) { + project.apply() project.apply() project.extensions.create("nativeDependencies", project) } -} \ No newline at end of file +} diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 10f138cda8a..0524b8119cd 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -52,18 +52,7 @@ if (PlatformInfo.isMac()) { } apply plugin: "kotlin.native.build-tools-conventions" - -ext { - distDir = UtilsKt.getKotlinNativeDist(project) - def konanDataDir = project.hasProperty('konan.data.dir') ? project.property('konan.data.dir').toString() : null - dependenciesDir = DependencyDirectories.INSTANCE.getDependenciesRoot(konanDataDir) - experimentalEnabled = project.hasProperty("org.jetbrains.kotlin.native.experimentalTargets") - platformManager = new PlatformManager(DistributionKt.buildDistribution(projectDir.absolutePath, konanDataDir), - ext.experimentalEnabled) - - cacheableTargetNames = platformManager.hostPlatform.cacheableTargets - cacheableTargets = cacheableTargetNames.collect { platformManager.targetByName(it) } -} +apply plugin: "platform-manager" allprojects { repositories { @@ -72,20 +61,13 @@ allprojects { url project.bootstrapKotlinRepo } } - - setupHostAndTarget() - setupClang(project) } -void setupHostAndTarget() { - ext.hostName = platformManager.hostName - ext.targetList = EnabledTargetsKt.enabledTargets(platformManager).collect { it.visibleName } as List - ext.konanTargetList = EnabledTargetsKt.enabledTargets(platformManager) as List -} - -void setupClang(Project project) { - project.extensions.platformManager = project.project(":kotlin-native").ext.platformManager -} +def platformManager = project.extensions.platformManager +def distDir = UtilsKt.getKotlinNativeDist(project) +def hostName = PlatformInfo.hostName +def targetList = EnabledTargetsKt.enabledTargets(platformManager).collect { it.visibleName } as List +def cacheableTargetNames = platformManager.hostPlatform.cacheableTargets configurations { ftpAntTask @@ -302,11 +284,7 @@ tasks.register("distCompiler", Copy) { tokens: [("llvm.${hostName}.dev".toString()): "\$llvm.${hostName}.${llvmVariant}".toString()] ) } - if (experimentalEnabled) { - file('konan/experimentalTargetsEnabled').text = "" - } else { - delete('konan/experimentalTargetsEnabled') - } + delete('konan/experimentalTargetsEnabled') } tasks.register("distDef", Copy) { diff --git a/kotlin-native/dependencies/build.gradle.kts b/kotlin-native/dependencies/build.gradle.kts index c273cd392de..65a53b58aa1 100644 --- a/kotlin-native/dependencies/build.gradle.kts +++ b/kotlin-native/dependencies/build.gradle.kts @@ -3,8 +3,8 @@ * that can be found in the LICENSE file. */ -import java.io.File import org.jetbrains.kotlin.konan.target.allTargetsWithSanitizers +import org.jetbrains.kotlin.konan.util.DependencyDirectories plugins { id("native-dependencies-downloader") @@ -13,7 +13,7 @@ plugins { nativeDependenciesDownloader { repositoryURL.set("https://cache-redirector.jetbrains.com/download.jetbrains.com/kotlin/native") - dependenciesDirectory.set(rootProject.project(":kotlin-native").property("dependenciesDir") as File) + dependenciesDirectory.set(DependencyDirectories.getDependenciesRoot(kotlinBuildProperties.konanDataDir)) allTargets {} } diff --git a/kotlin-native/platformLibs/build.gradle.kts b/kotlin-native/platformLibs/build.gradle.kts index 286951b6de7..7187513de0a 100644 --- a/kotlin-native/platformLibs/build.gradle.kts +++ b/kotlin-native/platformLibs/build.gradle.kts @@ -5,12 +5,13 @@ import org.jetbrains.kotlin.gradle.plugin.konan.tasks.KonanCacheTask import org.jetbrains.kotlin.gradle.plugin.tasks.KonanInteropTask +import org.jetbrains.kotlin.PlatformInfo +import org.jetbrains.kotlin.kotlinNativeDist 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 konanHome: String by extra(kotlinNativeDist.absolutePath) val jvmArgs: String by extra( mutableListOf().apply { addAll(HostManager.defaultJvmArgs) @@ -22,6 +23,7 @@ extra["org.jetbrains.kotlin.native.home"] = konanHome extra["konan.jvmArgs"] = jvmArgs plugins { + id("platform-manager") id("konan") } @@ -40,11 +42,9 @@ if (HostManager.host == KonanTarget.MACOS_ARM64) { project.configureJvmToolchain(JdkMajorVersion.JDK_17_0) } -val konanTargetList: List by project -val targetList: List by project -val cacheableTargets: List by project +val cacheableTargetNames = platformManager.hostPlatform.cacheableTargets -konanTargetList.forEach { target -> +enabledTargets(platformManager).forEach { target -> val targetName = target.visibleName val installTasks = mutableListOf>() val cacheTasks = mutableListOf>() @@ -84,7 +84,7 @@ konanTargetList.forEach { target -> } installTasks.add(klibInstallTask) - if (target in cacheableTargets) { + if (target.name in cacheableTargetNames) { val cacheTask = tasks.register("${libName}Cache", KonanCacheTask::class.java) { notCompatibleWithConfigurationCache("project used in execution time") this.target = targetName @@ -112,7 +112,7 @@ konanTargetList.forEach { target -> dependsOn(installTasks) } - if (target in cacheableTargets) { + if (target.name in cacheableTargetNames) { tasks.register("${targetName}Cache") { dependsOn(cacheTasks) @@ -122,14 +122,12 @@ konanTargetList.forEach { target -> } } -val hostName: String by project - val hostInstall by tasks.registering { - dependsOn("${hostName}Install") + dependsOn("${PlatformInfo.hostName}Install") } val hostCache by tasks.registering { - dependsOn("${hostName}Cache") + dependsOn("${PlatformInfo.hostName}Cache") } val cache by tasks.registering { diff --git a/kotlin-native/runtime/build.gradle.kts b/kotlin-native/runtime/build.gradle.kts index 75f4a8c8b0e..e543d1d2692 100644 --- a/kotlin-native/runtime/build.gradle.kts +++ b/kotlin-native/runtime/build.gradle.kts @@ -15,8 +15,7 @@ import org.jetbrains.kotlin.konan.file.File as KFile import org.jetbrains.kotlin.konan.target.Architecture as TargetArchitecture // 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 konanHome: String by extra(kotlinNativeDist.absolutePath) extra["org.jetbrains.kotlin.native.home"] = konanHome val kotlinVersion: String by rootProject.extra @@ -36,8 +35,7 @@ googletest { refresh = project.hasProperty("refresh-gtest") } -val hostName: String by project -val targetList: List by project +val targetList = enabledTargets(extensions.getByType()) bitcode { allTargets { @@ -519,15 +517,15 @@ dependencies { runtimeBitcode(project(":kotlin-native:runtime")) } -targetList.forEach { targetName -> +targetList.forEach { target -> // TODO: replace with a more convenient user-facing task that can build for a specific target. // like compileToBitcode with optional argument --target. - tasks.register("${targetName}Runtime") { - description = "Build all main runtime modules for $targetName" + tasks.register("${target}Runtime") { + description = "Build all main runtime modules for $target" group = CompileToBitcodeExtension.BUILD_TASK_GROUP val dependencies = runtimeBitcode.incoming.artifactView { attributes { - attribute(TargetWithSanitizer.TARGET_ATTRIBUTE, project.platformManager.targetByName(targetName).withSanitizer()) + attribute(TargetWithSanitizer.TARGET_ATTRIBUTE, target.withSanitizer()) } }.files dependsOn(dependencies) @@ -537,13 +535,13 @@ targetList.forEach { targetName -> val hostRuntime by tasks.registering { description = "Build all main runtime modules for host" group = CompileToBitcodeExtension.BUILD_TASK_GROUP - dependsOn("${hostName}Runtime") + dependsOn("${PlatformInfo.hostName}Runtime") } val hostRuntimeTests by tasks.registering { description = "Runs all runtime tests for host" group = CompileToBitcodeExtension.VERIFICATION_TASK_GROUP - dependsOn("${hostName}RuntimeTests") + dependsOn("${PlatformInfo.hostName}RuntimeTests") } tasks.named("assemble") { @@ -551,7 +549,7 @@ tasks.named("assemble") { } val hostAssemble by tasks.registering { - dependsOn("${hostName}Runtime") + dependsOn("${PlatformInfo.hostName}Runtime") } tasks.named("clean") { @@ -656,7 +654,7 @@ val stdlibTask = tasks.register("nativeStdlib") { } } -val cacheableTargetNames: List by project +val cacheableTargetNames = platformManager.hostPlatform.cacheableTargets cacheableTargetNames.forEach { targetName -> tasks.register("${targetName}StdlibCache", KonanCacheTask::class.java) { @@ -668,7 +666,7 @@ cacheableTargetNames.forEach { targetName -> dependsOn(":kotlin-native:${targetName}CrossDistRuntime") // stdlib cache links in runtime modules from the K/N distribution. - inputs.dir("$distDir/konan/targets/$targetName/native") + inputs.dir("$kotlinNativeDist/konan/targets/$targetName/native") } } diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/BuildPropertiesExt.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/BuildPropertiesExt.kt index 058f4e69f10..63d5ae872e0 100644 --- a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/BuildPropertiesExt.kt +++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/BuildPropertiesExt.kt @@ -64,4 +64,7 @@ val KotlinBuildProperties.isSwiftExportPluginPublishingEnabled: Boolean get() = getBoolean("kotlin.native.swift-export.enabled", false) val KotlinBuildProperties.limitTestTasksConcurrency: Boolean - get() = getBoolean("kotlin.build.limitTestTasksConcurrency", true) \ No newline at end of file + get() = getBoolean("kotlin.build.limitTestTasksConcurrency", true) + +val KotlinBuildProperties.konanDataDir: String? + get() = getOrNull("konan.data.dir") as String? \ No newline at end of file