From 8a4b5efa9e9b1f1bbb2ae1b32f3d7a2449db7856 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Wed, 16 Dec 2020 13:51:12 +0100 Subject: [PATCH] [build][native] don't ever fix dist, take it with API --- kotlin-native/backend.native/build.gradle | 5 ++-- .../backend.native/tests/build.gradle | 13 +++++----- .../org/jetbrains/kotlin/KonanTest.groovy | 2 ++ .../org/jetbrains/kotlin/CacheTesting.kt | 10 +------ .../main/kotlin/org/jetbrains/kotlin/Utils.kt | 26 ++++++++++--------- kotlin-native/build.gradle | 2 +- kotlin-native/cmd/run_konan | 1 + kotlin-native/cmd/run_konan.bat | 2 +- kotlin-native/endorsedLibraries/build.gradle | 6 ++--- .../kotlinx.cli/build.gradle | 5 +++- .../kotlinx.cli/gradle.properties | 1 - .../kotlin/gradle/plugin/konan/KonanPlugin.kt | 6 ++--- .../gradle/plugin/konan/KonanToolRunner.kt | 2 ++ .../plugin/konan/tasks/KonanCacheTask.kt | 3 ++- .../konan/tasks/KonanCompilerDownloadTask.kt | 3 ++- .../src/main/kotlin/KonanHomeProvider.kt | 9 +++++-- 16 files changed, 52 insertions(+), 44 deletions(-) diff --git a/kotlin-native/backend.native/build.gradle b/kotlin-native/backend.native/build.gradle index b8118cd5ca5..9c7c91f9f84 100644 --- a/kotlin-native/backend.native/build.gradle +++ b/kotlin-native/backend.native/build.gradle @@ -1,6 +1,6 @@ import org.jetbrains.kotlin.CopyCommonSources import org.jetbrains.kotlin.konan.target.HostManager - +import org.jetbrains.kotlin.* /* * Copyright 2010-2018 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. @@ -239,9 +239,10 @@ targetList.each { target -> task("${target}Stdlib", type: JavaExec) { main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' // This task depends on distCompiler, so the compiler jar is already in the dist directory. - classpath = fileTree("${rootProject.projectDir}/dist/konan/lib") { + classpath = fileTree("${UtilsKt.getKotlinNativeDist(project)}/konan/lib") { include "*.jar" } + systemProperties "konan.home": UtilsKt.getKotlinNativeDist(project) jvmArgs = konanJvmArgs def testAnnotationCommon = project(":kotlin-test:kotlin-test-annotations-common").files("src/main/kotlin").files def testCommon = project(":kotlin-test:kotlin-test-common").files("src/main/kotlin").files diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 4b27a900e3a..b1145567350 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4398,7 +4398,7 @@ standaloneTest("jsinterop_math") { "$jsinterop -pkg kotlinx.interop.wasm.math -o $buildDir/jsmath -target wasm32".execute().waitFor() } - dependsOn ':wasm32PlatformLibs' + dependsOn ':kotlin-native:wasm32PlatformLibs' enabled = (project.testTarget == 'wasm32') goldValue = "e = 2.718281828459045, pi = 3.141592653589793, sin(pi) = 1.2246467991473532E-16, sin(pi/2) = 1.0, ln(1) = 0.0, ln(e) = 1.0\n" source = "jsinterop/math.kt" @@ -4707,9 +4707,8 @@ if (isAppleTarget(project)) { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" artifactName "test-library" - - if (!useCustomDist) { - dependsOn ":kotlin-native:${target.name}CrossDistRuntime", ':kotlin-native:distCompiler' + delegate.getByTarget(target.name).configure{ + UtilsKt.dependsOnDist(it) } extraOpts "-Xshort-module-name=MyLibrary" @@ -4735,8 +4734,8 @@ if (isAppleTarget(project)) { srcDir "objcexport/library" artifactName "test-library" - if (!useCustomDist) { - dependsOn ":kotlin-native:${target.name}CrossDistRuntime", ':kotlin-native:distCompiler' + delegate.getByTarget(target.name).configure{ + UtilsKt.dependsOnDist(it) } extraOpts "-Xshort-module-name=MyLibrary" @@ -5051,7 +5050,7 @@ private void configureStdlibTest(KonanGTest task, boolean inWorker) { extraOpts inWorker ? '-trw' : '-tr', '-Xverify-ir', '-Xopt-in=kotlin.RequiresOptIn,kotlin.ExperimentalStdlibApi', - "-friend-modules", project.rootProject.file("${project.properties['konan.home']}/klib/common/stdlib").absolutePath + "-friend-modules", project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath extraOpts project.globalTestArgs } } diff --git a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy index 87c5b198dfd..9ee3ed16055 100644 --- a/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy +++ b/kotlin-native/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy @@ -21,6 +21,7 @@ import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.TaskAction import org.gradle.process.ExecResult import org.jetbrains.kotlin.utils.DFS +import org.jetbrains.kotlin.* import java.nio.file.Paths import java.util.function.Function @@ -83,6 +84,7 @@ class RunExternalTestGroup extends JavaExec implements CompilerRunner { include '*.jar' } jvmArgs "-Xmx4G" + jvmArgs "-Dkonan.home=${UtilsKt.getKotlinNativeDist(project)}" enableAssertions = true def sources = File.createTempFile(name,".lst") sources.deleteOnExit() diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CacheTesting.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CacheTesting.kt index a4f45191653..cbb3ba2313e 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CacheTesting.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CacheTesting.kt @@ -35,15 +35,7 @@ fun configureCacheTesting(project: Project): CacheTesting? { cacheDir.mkdirs() } - if (!(project.property("useCustomDist") as Boolean)) { - val tasks = listOf( - "${target}CrossDist", - "${target}CrossDistRuntime", - "distCompiler" - ).map { task -> project.rootProject.tasks.getByName(task) } - - dependsOn(tasks) - } + dependsOnDist() commandLine( "$dist/bin/konanc", diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt index 6b64da79aa4..3995e9b83f4 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt @@ -50,10 +50,15 @@ val Project.testOutputFramework val Project.testOutputExternal get() = (findProperty("testOutputExternal") as File).toString() +val validPropertiesNames = listOf("kotlin.native.home", + "org.jetbrains.kotlin.native.home", + "konan.home") + val Project.kotlinNativeDist - get() = this.rootProject.file(findProperty("kotlin.native.home") - ?: findProperty("org.jetbrains.kotlin.native.home") - ?: findProperty("konan.home") ?: "dist") + get() = rootProject.file(validPropertiesNames.firstOrNull{ hasProperty(it) }?.let{ findProperty(it) } ?: "dist") + +val kotlinNativeHome + get() = validPropertiesNames.mapNotNull(System::getProperty).first() val Project.useCustomDist get() = hasProperty("kotlin.native.home") || @@ -132,15 +137,12 @@ fun Project.dependsOnDist(taskName: String) { } fun Task.dependsOnDist() { - // We don't build the compiler if a custom dist path is specified. - if (!(project.findProperty("useCustomDist") as Boolean)) { - dependsOn(":kotlin-native:dist") - val target = project.testTarget - if (target != HostManager.host) { - // if a test_target property is set then tests should depend on a crossDist - // otherwise, runtime components would not be build for a target. - dependsOn(":kotlin-native:${target.name}CrossDist") - } + dependsOn(":kotlin-native:dist") + val target = project.testTarget + if (target != HostManager.host) { + // if a test_target property is set then tests should depend on a crossDist + // otherwise, runtime components would not be build for a target. + dependsOn(":kotlin-native:${target.name}CrossDist") } } diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 26174be3005..9552698a28a 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -65,7 +65,7 @@ if (isMac()) { } ext { - distDir = rootProject.file('dist') + distDir = UtilsKt.getKotlinNativeDist(project) dependenciesDir = DependencyProcessor.defaultDependenciesRoot experimentalEnabled = project.hasProperty("org.jetbrains.kotlin.native.experimentalTargets") platformManager = new PlatformManager(DistributionKt.buildDistribution(projectDir.absolutePath), diff --git a/kotlin-native/cmd/run_konan b/kotlin-native/cmd/run_konan index 310806dc301..8a0304d6586 100755 --- a/kotlin-native/cmd/run_konan +++ b/kotlin-native/cmd/run_konan @@ -66,6 +66,7 @@ java_opts=(-ea \ -Xmx3G \ -XX:TieredStopAtLevel=1 \ -Dfile.encoding=UTF-8 \ + -Dkonan.home=$KONAN_HOME \ ${JAVA_OPTS}) # Unset some environment variables which are set by XCode and may potentially affect the tool executed. diff --git a/kotlin-native/cmd/run_konan.bat b/kotlin-native/cmd/run_konan.bat index 7cc74d98b4f..1ae0043c403 100644 --- a/kotlin-native/cmd/run_konan.bat +++ b/kotlin-native/cmd/run_konan.bat @@ -57,11 +57,11 @@ set "KONAN_JAR=%KONAN_LIB%\kotlin-native.jar" set TROVE_JAR="%KONAN_LIB%\trove4j.jar" set "KONAN_CLASSPATH=%KONAN_JAR%;%TROVE_JAR%" - set JAVA_OPTS=-ea ^ -Xmx3G ^ -XX:TieredStopAtLevel=1 ^ -Dfile.encoding=UTF-8 ^ + -Dkonan.home=%_KONAN_HOME% ^ %JAVA_OPTS% set LIBCLANG_DISABLE_CRASH_RECOVERY=1 diff --git a/kotlin-native/endorsedLibraries/build.gradle b/kotlin-native/endorsedLibraries/build.gradle index d335ede8626..ca73717134d 100644 --- a/kotlin-native/endorsedLibraries/build.gradle +++ b/kotlin-native/endorsedLibraries/build.gradle @@ -59,7 +59,7 @@ targetList.each { target -> def cacheTask = task("${target}Cache") endorsedLibrariesList.each { library -> - def dist = rootProject.file("dist") + def dist = UtilsKt.getKotlinNativeDist(project) task("${target}${library.taskName}Cache", type: KonanCacheTask) { it.target = target originalKlib = file("${project.buildDir}/${library.name}") @@ -78,7 +78,7 @@ targetList.each { target -> endorsedLibrariesList.each { library -> task("${library.taskName}CommonSources", type: Zip) { - destinationDirectory = file("${rootProject.projectDir}/dist/sources") + destinationDirectory = file("${UtilsKt.getKotlinNativeDist(project)}/dist/sources") archiveFileName = "${library.name}-common-sources.zip" includeEmptyDirs = false @@ -87,7 +87,7 @@ endorsedLibrariesList.each { library -> from(library.project.file('src/main/kotlin')) } task("${library.taskName}NativeSources", type: Zip) { - destinationDirectory = file("${rootProject.projectDir}/dist/sources") + destinationDirectory = file("${UtilsKt.getKotlinNativeDist(project)}/dist/sources") archiveFileName = "${library.name}-native-sources.zip" includeEmptyDirs = false diff --git a/kotlin-native/endorsedLibraries/kotlinx.cli/build.gradle b/kotlin-native/endorsedLibraries/kotlinx.cli/build.gradle index 1ab6e38b1a9..34e6d6ca03c 100644 --- a/kotlin-native/endorsedLibraries/kotlinx.cli/build.gradle +++ b/kotlin-native/endorsedLibraries/kotlinx.cli/build.gradle @@ -1,5 +1,6 @@ import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.util.PlatformLibsInfo +import org.jetbrains.kotlin.* buildscript { repositories { @@ -82,9 +83,11 @@ targetList.each { target -> dependsOn ":kotlin-native:distCompiler" dependsOn ":kotlin-native:${target}CrossDistRuntime" + def kotlinNativeDist = UtilsKt.getKotlinNativeDist(project) + systemProperties "konan.home": kotlinNativeDist main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' // This task depends on distCompiler, so the compiler jar is already in the dist directory. - classpath = fileTree("${rootProject.projectDir}/dist/konan/lib") { + classpath = fileTree("$kotlinNativeDist/konan/lib") { include "*.jar" } jvmArgs = konanJvmArgs diff --git a/kotlin-native/endorsedLibraries/kotlinx.cli/gradle.properties b/kotlin-native/endorsedLibraries/kotlinx.cli/gradle.properties index 23a0cc91ff7..9e2c413981a 100644 --- a/kotlin-native/endorsedLibraries/kotlinx.cli/gradle.properties +++ b/kotlin-native/endorsedLibraries/kotlinx.cli/gradle.properties @@ -1,2 +1 @@ -org.jetbrains.kotlin.native.home=../../dist org.jetbrains.kotlin.native.jvmArgs=-Xmx6G \ No newline at end of file diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt index f2361603437..9a6ac4e9208 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.buildDistribution import org.jetbrains.kotlin.konan.target.customerDistribution import org.jetbrains.kotlin.konan.util.DependencyProcessor +import org.jetbrains.kotlin.* import java.io.File import javax.inject.Inject @@ -87,8 +88,7 @@ internal fun Project.setProperty(property: KonanPlugin.ProjectProperty, value: A // konanHome extension is set by downloadKonanCompiler task. internal val Project.konanHome: String get() { - assert(hasProperty(KonanPlugin.ProjectProperty.KONAN_HOME)) - return project.file(getProperty(KonanPlugin.ProjectProperty.KONAN_HOME)).canonicalPath + return project.kotlinNativeDist.absolutePath } internal val Project.konanVersion: CompilerVersion @@ -346,7 +346,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME) // Set additional project properties like org.jetbrains.kotlin.native.home, konan.build.targets etc. - if (!project.hasProperty(ProjectProperty.KONAN_HOME)) { + if (!project.useCustomDist) { project.setProperty(ProjectProperty.KONAN_HOME, project.konanCompilerDownloadDir()) project.setProperty(ProjectProperty.DOWNLOAD_COMPILER, true) } diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt index 65e3e24a931..d08a93970e2 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.util.DependencyProcessor import java.nio.file.Files +import org.jetbrains.kotlin.* internal interface KonanToolRunner: Named { val mainClass: String @@ -105,6 +106,7 @@ internal abstract class KonanCliRunner( .escapeQuotesForWindows() .toMap() ) + exec.systemProperty("konan.home", project.kotlinNativeDist.absolutePath) exec.args(listOf(toolName) + transformArgs(args)) this@KonanCliRunner.blacklistEnvironment.forEach { environment.remove(it) } exec.environment(environment) diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt index 5f40a175ce8..474e262b4b1 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt @@ -7,6 +7,7 @@ import org.jetbrains.kotlin.gradle.plugin.konan.KonanCompilerRunner import org.jetbrains.kotlin.gradle.plugin.konan.konanHome import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.PlatformManager +import org.jetbrains.kotlin.* import java.io.File enum class KonanCacheKind(val outputKind: CompilerOutputKind) { @@ -45,7 +46,7 @@ open class KonanCacheTask: DefaultTask() { @Input /** Path to a compiler distribution that is used to build this cache. */ val compilerDistributionPath: Property = project.objects.property(File::class.java).apply { - set(project.provider { project.file(project.konanHome) }) + set(project.provider { project.kotlinNativeDist }) } @TaskAction diff --git a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompilerDownloadTask.kt b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompilerDownloadTask.kt index ee3d9256916..6333aa9ece9 100644 --- a/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompilerDownloadTask.kt +++ b/kotlin-native/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompilerDownloadTask.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.konan.MetaVersion import org.jetbrains.kotlin.konan.util.DependencyProcessor import org.jetbrains.kotlin.konan.util.DependencySource import java.io.IOException +import org.jetbrains.kotlin.* open class KonanCompilerDownloadTask : DefaultTask() { @@ -40,7 +41,7 @@ open class KonanCompilerDownloadTask : DefaultTask() { @TaskAction fun downloadAndExtract() { if (!project.hasProperty(KonanPlugin.ProjectProperty.DOWNLOAD_COMPILER)) { - val konanHome = project.getProperty(KonanPlugin.ProjectProperty.KONAN_HOME) + val konanHome = project.kotlinNativeDist logger.info("Use a user-defined compiler path: $konanHome") } else { try { diff --git a/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt b/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt index adf669b2818..d05a67b8b3a 100644 --- a/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt +++ b/kotlin-native/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt @@ -1,11 +1,16 @@ package org.jetbrains.kotlin.konan.util import org.jetbrains.kotlin.utils.PathUtil +import org.jetbrains.kotlin.* import java.io.File import java.nio.file.Paths object KonanHomeProvider { - + internal val validPropertiesNames = listOf("kotlin.native.home", + "org.jetbrains.kotlin.native.home", + "konan.home") + internal val kotlinNativeHome + get() = validPropertiesNames.mapNotNull(System::getProperty).first() /** * Determines a path to the current Kotlin/Native distribution. * @@ -15,7 +20,7 @@ object KonanHomeProvider { * Otherwise an IllegalStateException is thrown. */ fun determineKonanHome(): String { - val propertyValue = System.getProperty("konan.home") + val propertyValue = kotlinNativeHome return if (propertyValue != null) { File(propertyValue).absolutePath } else {