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)) }