diff --git a/TeamCityBuild.xml b/TeamCityBuild.xml
index 63791c042ef..a83a565137c 100644
--- a/TeamCityBuild.xml
+++ b/TeamCityBuild.xml
@@ -75,14 +75,7 @@
-
-
-
+
diff --git a/core/util.runtime/build.gradle.kts b/core/util.runtime/build.gradle.kts
index 9cd37dca39e..7b7fc6cf1cb 100644
--- a/core/util.runtime/build.gradle.kts
+++ b/core/util.runtime/build.gradle.kts
@@ -20,3 +20,6 @@ tasks.withType {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
}
+
+if (project.hasProperty("teamcity"))
+tasks["compileJava"].dependsOn(":prepare:build.version:writeCompilerVersion")
\ No newline at end of file
diff --git a/libraries/stdlib/build.gradle b/libraries/stdlib/build.gradle
index b4cd6415aa5..1952e3be385 100644
--- a/libraries/stdlib/build.gradle
+++ b/libraries/stdlib/build.gradle
@@ -128,6 +128,7 @@ compileBuiltinsKotlin {
}
}
compileKotlin {
+ dependsOn(":prepare:build.version:writeStdlibVersion")
kotlinOptions {
freeCompilerArgs = [
"-version",
diff --git a/libraries/stdlib/src/kotlin/util/KotlinVersion.kt b/libraries/stdlib/src/kotlin/util/KotlinVersion.kt
index 9594db9740c..847ec90f94e 100644
--- a/libraries/stdlib/src/kotlin/util/KotlinVersion.kt
+++ b/libraries/stdlib/src/kotlin/util/KotlinVersion.kt
@@ -68,8 +68,7 @@ public class KotlinVersion(val major: Int, val minor: Int, val patch: Int) : Com
/**
* Returns the current version of the Kotlin standard library.
*/
- // TODO: get from metadata or hardcode automatically during build
@kotlin.jvm.JvmField
- public val CURRENT: KotlinVersion = KotlinVersion(1, 2, 0)
+ public val CURRENT: KotlinVersion = KotlinVersion(1, 2, 0) // value is written here automatically during build
}
}
diff --git a/prepare/build.version/build.gradle.kts b/prepare/build.version/build.gradle.kts
index 093c438af82..d283d96e858 100644
--- a/prepare/build.version/build.gradle.kts
+++ b/prepare/build.version/build.gradle.kts
@@ -4,31 +4,66 @@ import java.io.File
val buildVersionFilePath = "${rootProject.extra["distDir"]}/build.txt"
val buildVersion by configurations.creating
+val buildNumber: String by rootProject.extra
+val kotlinVersion: String by rootProject.extra
-val prepare = task("prepare") {
- val versionString = rootProject.extra["buildNumber"].toString()
+val writeBuildNumber by tasks.creating {
val versionFile = File(buildVersionFilePath)
- outputs.file(buildVersionFilePath)
- outputs.upToDateWhen {
- (versionFile.exists() && versionFile.readText().trim() == versionString).also {
- if (!it) {
- logger.info("$versionFile is not up-to-date: ${versionFile.takeIf { it.exists() }?.readText()?.trim()}")
- }
- }
- }
+ inputs.property("version", buildNumber)
+ outputs.file(versionFile)
doLast {
versionFile.parentFile.mkdirs()
- versionFile.writeText(versionString)
+ versionFile.writeText(buildNumber)
}
}
+fun replaceVersion(versionFile: File, versionPattern: String, replacement: (MatchResult) -> String) {
+ check(versionFile.isFile) { "Version file $versionFile is not found" }
+ val text = versionFile.readText()
+ val pattern = Regex(versionPattern)
+ val match = pattern.find(text) ?: error("Version pattern is missing in file $versionFile")
+ val newValue = replacement(match)
+ versionFile.writeText(text.replaceRange(match.groups[1]!!.range, newValue))
+}
+
+val writeStdlibVersion by tasks.creating {
+ val versionFile = rootDir.resolve("libraries/stdlib/src/kotlin/util/KotlinVersion.kt")
+ inputs.property("version", kotlinVersion)
+ outputs.file(versionFile)
+ doLast {
+ replaceVersion(versionFile, """val CURRENT: KotlinVersion = KotlinVersion\((\d+, \d+, \d+)\)""") {
+ val (major, minor, _, optPatch) = Regex("""^(\d+)\.(\d+)(\.(\d+))?""").find(kotlinVersion)?.destructured ?: error("Cannot parse current version $kotlinVersion")
+ val newVersion = "$major, $minor, ${optPatch.takeIf { it.isNotEmpty() } ?: "0" }"
+ logger.lifecycle("Writing new standard library version components: $newVersion")
+ newVersion
+ }
+ }
+}
+
+val writeCompilerVersion by tasks.creating {
+ val versionFile = rootDir.resolve("core/util.runtime/src/org/jetbrains/kotlin/config/KotlinCompilerVersion.java")
+ inputs.property("version", kotlinVersion)
+ outputs.file(versionFile)
+ doLast {
+ replaceVersion(versionFile, """public static final String VERSION = "([^"]+)"""") {
+ logger.lifecycle("Writing new compiler version: $kotlinVersion")
+ kotlinVersion
+ }
+ }
+}
+
+val writeVersions by tasks.creating {
+ dependsOn(writeBuildNumber, writeStdlibVersion, writeCompilerVersion)
+}
+
+
artifacts.add(buildVersion.name, file(buildVersionFilePath)) {
- builtBy(prepare)
+ builtBy(writeBuildNumber)
}
val distKotlinHomeDir: String by rootProject.extra
val dist by task {
- from(prepare)
+ from(writeBuildNumber)
into(File(distKotlinHomeDir))
}