Rewrite :shared:buildSrc to Java to avoid dependency on kotlin stdlib (KTI-118)

Composite build hangs on some version combination after start using 1.4.255-SNAPSHOT in
Kotlin build. This is probably caused by kotlin-stdlib substitution in buildSrc build.

(cherry picked from commit 89c57b281e57cb576aa7739c22fbc2c44a704110)
This commit is contained in:
Nikolay Krasko
2020-04-01 20:15:41 +03:00
committed by Vasily Levchenko
parent 380503d726
commit 5cfbe29a0a
3 changed files with 108 additions and 80 deletions
+1 -10
View File
@@ -15,23 +15,14 @@
*/
buildscript {
ext.rootBuildDirectory = "$rootDir/../.."
apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle"
apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle"
}
apply plugin: 'kotlin'
apply plugin: 'java'
repositories {
maven {
url buildKotlinCompilerRepo
}
mavenCentral()
}
dependencies {
compile gradleApi()
compile localGroovy()
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
}
@@ -0,0 +1,107 @@
package org.jetbrains.kotlin;
import groovy.lang.Closure;
import org.gradle.api.DefaultTask;
import org.gradle.api.Task;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.OutputFile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VersionGenerator extends DefaultTask {
@OutputDirectory
public File getVersionSourceDirectory() {
return getProject().file("build/generated");
}
@OutputFile
public File getVersionFile() {
return getProject().file(getVersionSourceDirectory().getPath() + "/org/jetbrains/kotlin/konan/CompilerVersionGenerated.kt");
}
@Input
public String getKonanVersion() {
return getProject().getProperties().get("konanVersion").toString();
}
// TeamCity passes all configuration parameters into a build script as project properties.
// Thus we can use them here instead of environment variables.
@Optional
@Input
public String getBuildNumber() {
Object property = getProject().findProperty("build.number");
if (property == null) return null;
return property.toString();
}
@Input
public String getMeta() {
Object konanMetaVersionProperty = getProject().getProperties().get("konanMetaVersion");
if (konanMetaVersionProperty == null) {
return "MetaVersion.DEV";
}
return "MetaVersion." + konanMetaVersionProperty.toString().toUpperCase();
}
private final static Pattern versionPattern = Pattern.compile(
"^(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-M(\\p{Digit}))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?$"
);
@SuppressWarnings("NullableProblems")
@Override
public Task configure(@SuppressWarnings("NullableProblems") Closure closure) {
Task result = super.configure(closure);
doFirst(task -> {
Matcher matcher = versionPattern.matcher(getKonanVersion());
if (!matcher.matches()) {
throw new IllegalArgumentException("Cannot parse Kotlin/Native version: $konanVersion");
}
int major = Integer.parseInt(matcher.group(1));
int minor = Integer.parseInt(matcher.group(2));
String maintenanceStr = matcher.group(3);
int maintenance = maintenanceStr != null ? Integer.parseInt(maintenanceStr) : 0;
String milestoneStr = matcher.group(4);
int milestone = milestoneStr != null ? Integer.parseInt(milestoneStr) : -1;
String buildNumber = getBuildNumber();
getProject().getLogger().info("BUILD_NUMBER: " + getBuildNumber());
int build = -1;
if (buildNumber != null) {
String[] buildNumberSplit = buildNumber.split("-");
build = Integer.parseInt(buildNumberSplit[buildNumberSplit.length - 1]); // //7-dev-buildcount
}
try (PrintWriter printWriter = new PrintWriter(getVersionFile())) {
printWriter.println(
"package org.jetbrains.kotlin.konan\n" +
"\n" +
"internal val currentCompilerVersion: CompilerVersion =\n" +
" CompilerVersionImpl(\n" +
getMeta() + ", " + major + ", " + minor + ",\n" +
maintenance + ", " + milestone + ", "+ build + ")\n" +
"\n" +
"val CompilerVersion.Companion.CURRENT: CompilerVersion\n" +
" get() = currentCompilerVersion"
);
} catch (FileNotFoundException e) {
throw new IllegalStateException(e);
}
});
return result;
}
}
@@ -1,70 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package org.jetbrains.kotlin
import groovy.lang.Closure
import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.tasks.*
import java.io.File
open class VersionGenerator: DefaultTask() {
@OutputDirectory
val versionSourceDirectory = project.file("build/generated")
@OutputFile
val versionFile:File = project.file("${versionSourceDirectory.path}/org/jetbrains/kotlin/konan/CompilerVersionGenerated.kt")
val konanVersion: String
@Input get() = project.properties["konanVersion"].toString()
val buildNumber: String?
// TeamCity passes all configuration parameters into a build script as project properties.
// Thus we can use them here instead of environment variables.
@Optional @Input get() = project.findProperty("build.number")?.toString()
val meta: String
@Input get() = project.properties["konanMetaVersion"]?.let {
"MetaVersion.${it.toString().toUpperCase()}"
} ?: "MetaVersion.DEV"
private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-M(\\p{Digit}))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex()
override fun configure(closure: Closure<*>): Task {
val result = super.configure(closure)
doFirst {
val content = buildString {
operator fun String.unaryPlus() = this@buildString.append(this)
val (majorStr, minorStr, maintenanceStr, milestoneStr) =
versionPattern.matchEntire(konanVersion)?.destructured
?: throw IllegalArgumentException("Cannot parse Kotlin/Native version: $konanVersion")
val major = majorStr.toInt()
val minor = minorStr.toInt()
val maintenance = maintenanceStr.toIntOrNull() ?: 0
val milestone = milestoneStr.toIntOrNull() ?: -1
project.logger.info("BUILD_NUMBER: $buildNumber")
val build = buildNumber?.let {
it.split("-").last().toInt() //7-dev-buildcount
}?: -1
+ """
|package org.jetbrains.kotlin.konan
|
|internal val currentCompilerVersion: CompilerVersion =
| CompilerVersionImpl($meta, $major, $minor, $maintenance, $milestone, $build)
|
|val CompilerVersion.Companion.CURRENT: CompilerVersion
| get() = currentCompilerVersion
""".trimMargin()
}
versionFile.printWriter().use {
it.println(content)
}
}
return result
}
}