diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt b/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt index 15ff531d781..4e34964249f 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt @@ -16,7 +16,18 @@ interface KonanVersion : Serializable { fun toString(showMeta: Boolean, showBuild: Boolean): String - companion object + companion object { + // major.minor.patch-meta-build where patch, meta and build are optional. + private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex() + + fun fromString(version: String) : KonanVersion { + val (major, minor, maintenance, metaString, build) = + versionPattern.matchEntire(version)?.destructured ?: + throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version") + val meta = metaString.ifEmpty { "release" }.let { MetaVersion.valueOf(it.toUpperCase()) } + return KonanVersionImpl(meta, major.toInt(), minor.toInt(), maintenance.toIntOrNull() ?: 0, build.toIntOrNull() ?: -1) + } + } } data class KonanVersionImpl( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt index 8fc1f15a976..64163ee527c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt @@ -20,6 +20,7 @@ import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.file.FileCollection import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader +import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.util.DependencyDirectories @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.konan.util.DependencyDirectories internal enum class KotlinNativeProjectProperty(val propertyName: String) { KONAN_HOME_OVERRIDE ("org.jetbrains.kotlin.native.home"), KONAN_JVM_ARGS ("org.jetbrains.kotlin.native.jvmArgs"), + KONAN_VERSION ("org.jetbrains.kotlin.native.version"), KONAN_USE_ENVIRONMENT_VARIABLES("org.jetbrains.kotlin.native.useEnvironmentVariables") } @@ -49,6 +51,11 @@ internal val Project.konanHome: String file(it).absolutePath } ?: NativeCompilerDownloader(project).compilerDirectory.absolutePath +internal val Project.konanVersion: KonanVersion + get() = project.findProperty(KotlinNativeProjectProperty.KONAN_VERSION)?.let { + KonanVersion.fromString(it.toString()) + } ?: NativeCompilerDownloader.DEFAULT_KONAN_VERSION + internal interface KonanToolRunner: Named { val mainClass: String val classpath: FileCollection diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index 6119e0e8bb3..8c9e1bc3dd7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -11,10 +11,7 @@ import org.gradle.api.internal.file.FileResolver import org.gradle.api.plugins.JavaPlugin import org.gradle.internal.cleanup.BuildOutputCleanupRegistry import org.gradle.internal.reflect.Instantiator -import org.jetbrains.kotlin.compilerRunner.KotlinNativeProjectProperty -import org.jetbrains.kotlin.compilerRunner.hasProperty -import org.jetbrains.kotlin.compilerRunner.konanHome -import org.jetbrains.kotlin.compilerRunner.setProperty +import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt index 5c532b57e7f..8d65f4f1138 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt @@ -154,7 +154,7 @@ open class KotlinNativeCompile : AbstractCompile() { // endregion. val kotlinNativeVersion: String - @Input get() = NativeCompilerDownloader(project).compilerVersion.toString() + @Input get() = project.konanVersion.toString() // We manually register this property as output file or directory depending on output kind. @Internal diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/NativeCompilerDownloader.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/NativeCompilerDownloader.kt index 025b42708d2..821ce638c87 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/NativeCompilerDownloader.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/NativeCompilerDownloader.kt @@ -10,7 +10,7 @@ import org.gradle.api.artifacts.repositories.ArtifactRepository import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout import org.gradle.api.file.FileTree import org.gradle.api.logging.Logger -import org.jetbrains.kotlin.compilerRunner.KonanCompilerRunner +import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.KonanVersionImpl import org.jetbrains.kotlin.konan.MetaVersion @@ -18,9 +18,13 @@ import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.util.DependencyDirectories import java.io.File -class NativeCompilerDownloader(val project: Project) { +class NativeCompilerDownloader( + val project: Project, + val compilerVersion: KonanVersion = project.konanVersion +) { internal companion object { + val DEFAULT_KONAN_VERSION = KonanVersionImpl(MetaVersion.RELEASE, 0, 9, 0) const val BASE_DOWNLOAD_URL = "https://download.jetbrains.com/kotlin/native/builds" } @@ -88,7 +92,7 @@ class NativeCompilerDownloader(val project: Project) { val archive = configuration.files.single() logger.info("Use Kotlin/Native compiler archive: ${archive.absolutePath}") - logger.lifecycle("Unpacking Kotlin/Native compiler (version $versionString)...") + logger.lifecycle("Unpack Kotlin/Native compiler (version $versionString)...") project.copy { it.from(archiveFileTree(archive)) it.into(DependencyDirectories.localKonanDir) @@ -100,9 +104,6 @@ class NativeCompilerDownloader(val project: Project) { val compilerDirectory: File get() = DependencyDirectories.localKonanDir.resolve("kotlin-native-$simpleOsName-$compilerVersion") - // TODO: Support project property for Kotlin/Native compiler version - val compilerVersion: KonanVersion = KonanVersionImpl(MetaVersion.RELEASE, 0, 9, 0) - fun downloadIfNeeded() { if (KonanCompilerRunner(project).classpath.isEmpty) { downloadAndExtract()