blob: ce79eb340985c5b39f9718def1c32d1bd00f0d6a [file] [log] [blame]
import org.jetbrains.kotlin.BuildRegister
import org.jetbrains.kotlin.MPPTools
import org.jetbrains.kotlin.UtilsKt
import org.jetbrains.kotlin.konan.target.DistributionKt
import org.jetbrains.kotlin.konan.target.PlatformManager
buildscript {
ext.rootBuildDirectory = file('..')
ext {
def properties = new java.util.Properties()
properties.load(new java.io.FileReader(project.file("../../gradle.properties")))
properties.each { k, v->
def key = k as String
set(key, project.findProperty(key) ?: v)
}
}
ext["withoutEmbedabble"] = true
UtilsKt.kotlinInit(project, findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean())
ext["bootstrapKotlinRepo"] = BootstrapKt.getBootstrapKotlinRepo(project)
ext["bootstrapKotlinVersion"] = BootstrapKt.getBootstrapKotlinVersion(project)
apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle"
apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle"
dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${kotlinBuildProperties.buildGradlePluginVersion}")
}
}
plugins {
id("kotlin.native.build-tools-conventions")
id("org.jetbrains.kotlin.multiplatform") apply false
}
repositories {
mavenCentral()
}
def globalProperties = new java.util.Properties()
ext.kotlin_root = project.file("../..").absolutePath
project.logger.info("kotlin_root: $kotlin_root")
globalProperties.load(new java.io.FileReader(project.file("$kotlin_root/gradle.properties")))
ext.kotlinNativeVersionInResources = true
def platformManager = new PlatformManager(DistributionKt.buildDistribution(UtilsKt.getKotlinNativeDist(project).path), false)
def kotlinDist = null
if (hasProperty("kotlin_dist")) {
kotlinDist = file(findProperty("kotlin_dist"))
ext["notationMapping"] = [':kotlin-stdlib-common' : project.file("${kotlinDist}/kotlinc/lib/kotlin-stdlib.jar").absolutePath,
':kotlin-test:kotlin-test-common' : project.file("${kotlinDist}/kotlinc/lib/kotlin-test.jar").absolutePath,
':kotlin-test:kotlin-test-annotations-common': project.file("${kotlinDist}/kotlinc/lib/kotlin-test.jar").absolutePath,
':kotlin-test:kotlin-test-junit' : project.file("${kotlinDist}/kotlinc/lib/kotlin-test-junit.jar").absolutePath,
':kotlin-stdlib-jdk8' : project.file("${kotlinDist}/kotlinc/lib/kotlin-stdlib-jdk8.jar").absolutePath]
ext.targetList = []
}
subprojects { proj ->
globalProperties.each { k, v->
def key = k as String
def value = project.findProperty(key) ?: v
proj.logger.info("${proj.name}<<<[$key] = $value>>>")
proj.ext.set(key, value)
}
UtilsKt.kotlinInit(proj, findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() ?: false)
proj.ext.platformManager = platformManager
proj.ext["bootstrapKotlinRepo"] = BootstrapKt.getBootstrapKotlinRepo(proj)
proj.ext["bootstrapKotlinVersion"] = BootstrapKt.getBootstrapKotlinVersion(proj)
proj.ext["kotlin.native.home"] = proj.projectDir.relativePath(UtilsKt.getKotlinNativeDist(project))
proj.ext["konan.home"] = proj.ext["kotlin.native.home"]
proj.ext["kotlin.native.enabled"] = true
proj.logger.info("${proj.name}<<<[kotlin.native.home] = ${proj.ext["kotlin.native.home"]}")
if (project.hasProperty("kotlin_dist")) {
proj.ext["kotlin_dist"] = kotlinDist.path
proj.logger.info("${proj.name}<<<[kotlin_dist] = ${proj.ext["kotlin_dist"]}>>>")
}
proj.ext["buildNumber"] = findProperty("build.number")?.toString() ?: defaultSnapshotVersion
proj.ext["kotlinVersion"] = findProperty("deployVersion")?.toString()?.identity { deploySnapshotStr ->
if (deploySnapshotStr != "default.snapshot") deploySnapshotStr else defaultSnapshotVersion
} ?: proj.ext["buildNumber"]
proj.logger.info("${proj.name}<<<[kotlinVersion] = ${proj.ext["kotlinVersion"]}>>>")
proj.repositories {
mavenCentral()
}
}
def rootBuildDirectory = projectDir.parentFile
task buildAnalyzer(type: GradleBuild) {
buildFile = "../tools/benchmarksAnalyzer/build.gradle"
tasks = [":${getAnalyzerTargetName()}Binaries".toString()]
startParameter.setProjectProperties(this.project.gradle.startParameter.projectProperties)
}
task konanRun {
subprojects.findAll {
!it.name.contains("videoplayer")
}.each {
dependsOn "${it.path}:konanRun"
}
}
task jvmRun {
doFirst {
if (findProperty("kotlin_dist") == null) {
throw new StopExecutionException("Please specify location of kotlin's dist in 'kotlin_dist' property")
}
}
subprojects.each {
if (it.name != "endorsedLibraries" && it.name != "kotlinx.cli") {
dependsOn "${it.path}:jvmRun"
}
}
}
task clean {
subprojects.each {
if (it.name != "endorsedLibraries") {
dependsOn "${it.path}:clean"
}
}
doLast {
delete "${buildDir.absolutePath}"
}
}
defaultTasks 'konanRun'
private static String getAnalyzerTargetName() {
// Copy-pasted from tools/benchmarksAnalyzer/build.gradle.
String target = System.getProperty("os.name")
if (target == 'Linux') return 'linux'
if (target.startsWith('Windows')) return 'windows'
if (target.startsWith('Mac'))
if (System.getProperty("os.arch") == "aarch64")
return 'macosArm64'
else
return 'macosX64'
return 'unknown'
}
private String findAnalyzerBinary() {
String result = "${projectDir}/../${analyzerToolDirectory}/${getAnalyzerTargetName()}/" +
"${analyzerTool}ReleaseExecutable/${analyzerTool}${MPPTools.getNativeProgramExtension()}"
}
private String getUploadedFile(String fileName) {
def teamcityConfig = System.getenv("TEAMCITY_BUILD_PROPERTIES_FILE")
if (teamcityConfig) {
def buildProperties = new Properties()
buildProperties.load(new FileInputStream(teamcityConfig))
def buildNumber = buildProperties.getProperty("build.number")
def target = System.getProperty("os.name").replaceAll("\\s", "")
return "${target}/${buildNumber}/${fileName}"
}
return null
}
private def uploadBenchmarkResultToArtifactory(String fileName) {
def teamcityConfig = System.getenv("TEAMCITY_BUILD_PROPERTIES_FILE")
if (teamcityConfig) {
def uploadedFile = getUploadedFile(fileName)
def buildProperties = new Properties()
buildProperties.load(new FileInputStream(teamcityConfig))
def password = buildProperties.getProperty("artifactory.apikey")
MPPTools.uploadFileToArtifactory("${artifactoryUrl}", "${artifactoryRepo}",
uploadedFile, "${buildDir.absolutePath}/${fileName}", password)
}
}
// Register external benchmarks reports (e.g. results of libraries benchmarks)
task registerExternalBenchmarks {
doLast {
def reports = externalReports.split(';')
def jsonReports = []
reports.each {
def reportFile = new File(buildDir, it)
if (!reportFile.exists())
return
def lines = reportFile.readLines()
if (lines.size < 4) {
project.logger.warn("Couldn't use report to register benchmarks. Wrong format.")
return
}
def name = lines[0]
def options = lines[1]
if (!options.startsWith("OPTIONS")) {
project.logger.warn("Couldn't use report to register benchmarks. Wrong format in options description.")
return
}
def optionsList = options.replace("OPTIONS ", "").replaceAll("\\[|\\]", "").split(",\\s*").toList()
def status = lines[2]
def compileTime = null
def codeSize = null
lines.drop(3).each {
if (it.startsWith("COMPILE_TIME")) {
compileTime = it
}
if (it.startsWith("CODE_SIZE")) {
codeSize = it
}
}
// Create benchmarks report.
def properties = [
"cpu": System.getProperty("os.arch"),
"os": System.getProperty("os.name"),
"jdkVersion": System.getProperty("java.version"),
"jdkVendor": System.getProperty("java.vendor"),
"kotlinVersion": kotlinVersion,
"type": "native",
"compilerVersion": kotlinVersion,
"flags": optionsList,
"benchmarks": "[]"]
if (compileTime != null) {
def compileBenchmark = MPPTools.toCompileBenchmark(compileTime, status, name)
properties += ["compileTime": [compileBenchmark]]
}
if (codeSize != null) {
properties += ["codeSize": MPPTools.toCodeSizeBenchmark(codeSize, status, name)]
}
def output = MPPTools.createJsonReport(properties)
def jsonFile = new File(buildDir, it.replace(".txt", ".json"))
jsonFile.write(output)
jsonReports.add(jsonFile)
}
def merged = MPPTools.mergeReports(jsonReports)
if (!merged.isEmpty()) {
mkdir buildDir.absolutePath
new File(buildDir, externalBenchmarksReport).write(merged)
uploadBenchmarkResultToArtifactory(externalBenchmarksReport)
}
}
}
task registerBuild(type: BuildRegister) {
onlyBranch = project.findProperty('kotlin.register.branch')
def uploadedFile = getUploadedFile(nativeJson)
if (uploadedFile != null) {
println("Use file from Artifacrory $uploadedFile")
fileWithResult = uploadedFile
}
// Get bundle size.
bundleSize = null
if (project.findProperty('kotlin.bundleBuild') != null) {
def dist = findProperty('kotlin.native.home') ?: 'dist'
dist = (new File(dist)).isAbsolute() ? dist : "${project.getProjectDir()}/$dist"
bundleSize = (new File(dist)).directorySize()
}
buildNumberSuffix = project.findProperty('buildNumberSuffix')
}
task registerExternalBuild(type: BuildRegister) {
onlyBranch = project.findProperty('kotlin.register.branch')
def uploadedFile = getUploadedFile(externalBenchmarksReport)
if (uploadedFile != null) {
println("Use file from Artifacrory $uploadedFile")
fileWithResult = uploadedFile
} else {
fileWithResult = externalBenchmarksReport
}
}
registerExternalBenchmarks.finalizedBy registerExternalBuild
def mergeReports(String fileName) {
def reports = []
subprojects.each {
def reportFile = new File("${it.buildDir.absolutePath}/${fileName}")
if (reportFile.exists()) {
reports.add(reportFile)
}
}
def output = MPPTools.mergeReports(reports)
mkdir buildDir.absolutePath
new File("${buildDir.absolutePath}/${fileName}").write(output)
}
task mergeNativeReports {
doLast {
mergeReports(nativeJson)
uploadBenchmarkResultToArtifactory(nativeJson)
}
}
task mergeJvmReports {
doLast {
mergeReports(jvmJson)
uploadBenchmarkResultToArtifactory(jvmJson)
}
}
subprojects.each {
if (it.name != "endorsedLibraries" && it.name != "kotlinx.cli") {
it.afterEvaluate {
it.jvmJsonReport.finalizedBy mergeJvmReports
it.konanJsonReport.finalizedBy mergeNativeReports
}
}
}
task teamCityStat(type:Exec) {
def analyzer = findAnalyzerBinary()
if (getAnalyzerTargetName() == 'windows') {
def mingwPath = new File(System.getenv("MINGW64_DIR") ?: "C:/msys64/mingw64")
def pathEnv = getEnvironment()["PATH"]
environment("PATH", "${mingwPath.toString()}/bin" + (pathEnv ? ";$pathEnv" : ""))
}
commandLine analyzer, "-r", "teamcity",
"--artifactory-url", "https://repo.labs.intellij.net/kotlin-native-benchmarks",
"--teamcity-url", "http://buildserver.labs.intellij.net",
"--server-url", findProperty("kotlin.native.performance.server.url")?.toString() ?: "http://localhost:3000",
"${buildDir.absolutePath}/${nativeJson}"
}
task cinterop {
dependsOn 'clean'
dependsOn 'cinterop:konanRun'
}
task framework {
dependsOn 'clean'
dependsOn 'framework:konanRun'
}
task helloworld {
dependsOn 'clean'
dependsOn 'helloworld:konanRun'
}
task objcinterop {
dependsOn 'clean'
dependsOn 'objcinterop:konanRun'
}
task ring {
dependsOn 'clean'
dependsOn 'ring:konanRun'
}
task numerical {
dependsOn 'clean'
dependsOn 'numerical:konanRun'
}
task startup {
dependsOn 'clean'
dependsOn 'startup:konanRun'
}
task swiftinterop {
dependsOn 'clean'
dependsOn 'swiftinterop:konanRun'
}
task videoplayer {
dependsOn 'clean'
dependsOn 'videoplayer:konanRun'
}
task KotlinVsSwift {
dependsOn 'clean'
dependsOn 'KotlinVsSwift:konanRun'
}