From cc631f1f99cdccf158761124b3c38f064c203c39 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Thu, 7 May 2020 15:21:11 +0700 Subject: [PATCH] Get rid of konan.home in the compiler This patch uses a path to a jar containing compiler classes to determine the distribution path instead of relying on the konan.home system property. However this property still may be used to specify the distribution path e.g. when the distribution isn't fully built and the compiler is executed from classes located in a build directory. --- Interop/Runtime/build.gradle | 1 + .../jvm/kotlin/kotlinx/cinterop/JvmUtils.kt | 3 +- Interop/StubGenerator/build.gradle | 20 +++++----- .../native/interop/gen/jvm/ToolConfig.kt | 3 +- .../kotlin/native/interop/gen/jvm/main.kt | 3 +- backend.native/build.gradle | 13 ++++--- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 1 + .../kotlin/backend/konan/KonanConfig.kt | 8 ++-- .../backend/konan/KonanConfigurationKeys.kt | 2 + .../org/jetbrains/kotlin/KonanTest.groovy | 2 +- .../kotlin/NativeInteropPlugin.groovy | 2 + cmd/run_konan | 3 -- cmd/run_konan.bat | 2 - dependencyPacker/build.gradle.kts | 4 +- endorsedLibraries/kotlinx.cli/build.gradle | 10 +++-- klib/build.gradle | 12 +++--- .../org/jetbrains/kotlin/cli/klib/main.kt | 6 ++- .../kotlin/cli/klib/test/ContentsTest.kt | 5 ++- konan/konan.properties | 2 +- .../konan/library/SearchPathResolver.kt | 2 +- .../jetbrains/kotlin/konan/target/Platform.kt | 4 +- .../gradle/plugin/konan/KonanLibrariesSpec.kt | 2 +- .../kotlin/gradle/plugin/konan/KonanPlugin.kt | 2 +- .../gradle/plugin/konan/KonanToolRunner.kt | 6 --- .../plugin/konan/tasks/KonanCacheTask.kt | 1 + .../plugin/konan/tasks/KonanCompileTask.kt | 2 +- .../plugin/konan/tasks/KonanInteropTask.kt | 2 +- .../gradle/plugin/test/KonanProject.groovy | 14 ++++--- .../plugin/test/PathSpecification.groovy | 2 +- utilities/basic-utils/build.gradle.kts | 7 +++- .../src/main/kotlin/KonanHomeProvider.kt | 39 +++++++++++++++++++ utilities/cli-runner/build.gradle | 9 +++-- .../utilities/GeneratePlatformLibraries.kt | 3 +- .../kotlin/cli/utilities/InteropCompiler.kt | 3 +- 34 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt diff --git a/Interop/Runtime/build.gradle b/Interop/Runtime/build.gradle index d2b94ee2e63..3965f849e61 100644 --- a/Interop/Runtime/build.gradle +++ b/Interop/Runtime/build.gradle @@ -66,6 +66,7 @@ repositories { } dependencies { + compile project(":utilities:basic-utils") compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" } diff --git a/Interop/Runtime/src/jvm/kotlin/kotlinx/cinterop/JvmUtils.kt b/Interop/Runtime/src/jvm/kotlin/kotlinx/cinterop/JvmUtils.kt index 3502988c57d..d1943be26b7 100644 --- a/Interop/Runtime/src/jvm/kotlin/kotlinx/cinterop/JvmUtils.kt +++ b/Interop/Runtime/src/jvm/kotlin/kotlinx/cinterop/JvmUtils.kt @@ -16,6 +16,7 @@ package kotlinx.cinterop +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import java.io.File import java.nio.file.Files import java.nio.file.Paths @@ -93,7 +94,7 @@ fun loadKonanLibrary(name: String) { System.loadLibrary(name) } catch (e: UnsatisfiedLinkError) { val fullLibraryName = System.mapLibraryName(name) - val dir = "${System.getProperty("konan.home")}/konan/nativelib" + val dir = "${KonanHomeProvider.determineKonanHome()}/konan/nativelib" try { System.load("$dir/$fullLibraryName") } catch (e: UnsatisfiedLinkError) { diff --git a/Interop/StubGenerator/build.gradle b/Interop/StubGenerator/build.gradle index aa5dc0151a8..a71dba8192f 100644 --- a/Interop/StubGenerator/build.gradle +++ b/Interop/StubGenerator/build.gradle @@ -30,16 +30,18 @@ repositories { } dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" - compile "org.jetbrains.kotlin:kotlin-compiler:$kotlinVersion" - compile project(':Interop:Indexer') - compile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion" - compile project(path: ":endorsedLibraries:kotlinx.cli", configuration: "jvmRuntimeElements") - compile "org.jetbrains.kotlinx:kotlinx-metadata-klib:0.0.1-dev-5" + implementation project(":Interop:Indexer") + implementation project(":utilities:basic-utils") + api project(path: ":endorsedLibraries:kotlinx.cli", configuration: "jvmRuntimeElements") - testCompile "junit:junit:4.12" - testCompile "org.jetbrains.kotlin:kotlin-test-junit:$buildKotlinVersion" - testCompile "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion" + api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + api "org.jetbrains.kotlin:kotlin-compiler:$kotlinVersion" + api "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion" + api "org.jetbrains.kotlinx:kotlinx-metadata-klib:0.0.1-dev-5" + + testImplementation "junit:junit:4.12" + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$buildKotlinVersion" + testImplementation "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion" } compileKotlin { diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt index b9cad75e27e..fa38a9a686a 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/ToolConfig.kt @@ -20,12 +20,13 @@ import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.PlatformManager import org.jetbrains.kotlin.konan.target.customerDistribution +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform class ToolConfig(userProvidedTargetName: String?, flavor: KotlinPlatform) { - private val konanHome = System.getProperty("konan.home") + private val konanHome = KonanHomeProvider.determineKonanHome() private val distribution = customerDistribution(konanHome) private val platformManager = PlatformManager(distribution) private val targetManager = platformManager.targetManager(userProvidedTargetName) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 23f394f22b0..91fcf436ffe 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.konan.library.* import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.KonanTarget +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.packageFqName import org.jetbrains.kotlin.library.resolver.impl.KotlinLibraryResolverImpl @@ -406,7 +407,7 @@ private fun getLibraryResolver( repos, libraries.filter { it.contains(org.jetbrains.kotlin.konan.file.File.separator) }, target, - Distribution() + Distribution(KonanHomeProvider.determineKonanHome()) ).libraryResolver() } diff --git a/backend.native/build.gradle b/backend.native/build.gradle index 40a9146d628..f9b42caf955 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -153,6 +153,8 @@ dependencies { kotlinCommonSources(it) { transitive = false } } + compilerCompile project(":utilities:basic-utils") + compilerCompile "com.google.protobuf:protobuf-java:${protobufVersion}" compilerCompile kotlinCompilerModule @@ -192,12 +194,10 @@ final List stdLibSrc = [ ] // These files are built before the 'dist' is complete, -// so we provide custom values for konan.home, --runtime etc +// so we provide a custom value for --runtime targetList.each { target -> - def konanJvmArgs = [*HostManager.regularJvmArgs, - "-Dkonan.home=${rootProject.projectDir}/dist" - ] + def konanJvmArgs = [*HostManager.regularJvmArgs] def defaultArgs = ['-nopack', '-nostdlib', '-no-default-libs', '-no-endorsed-libs'] if (target != "wasm32") defaultArgs += '-g' @@ -208,7 +208,10 @@ targetList.each { target -> task("${target}Stdlib", type: JavaExec) { main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' - classpath = project.configurations.cli_bc + // This task depends on distCompiler, so the compiler jar is already in the dist directory. + classpath = fileTree("${rootProject.projectDir}/dist/konan/lib") { + include "*.jar" + } jvmArgs = konanJvmArgs args = [*konanArgs, '-output', project(':runtime').file("build/${target}Stdlib"), diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index aff46f4fba7..f733e725a14 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -113,6 +113,7 @@ class K2Native : CLICompiler() { with(KonanConfigKeys) { with(configuration) { + arguments.kotlinHome?.let { put(KONAN_HOME, it) } put(NODEFAULTLIBS, arguments.nodefaultlibs || !arguments.libraryToAddToCache.isNullOrEmpty()) put(NOENDORSEDLIBS, arguments.noendorsedlibs || !arguments.libraryToAddToCache.isNullOrEmpty()) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index f9b58ae3309..eb7d2b8dcf8 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -20,15 +20,17 @@ import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.library.KonanLibrary import org.jetbrains.kotlin.konan.properties.loadProperties import org.jetbrains.kotlin.konan.target.* +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder class KonanConfig(val project: Project, val configuration: CompilerConfiguration) { internal val distribution = Distribution( - false, - null, - configuration.get(KonanConfigKeys.RUNTIME_FILE)) + configuration.get(KonanConfigKeys.KONAN_HOME) ?: KonanHomeProvider.determineKonanHome(), + false, + configuration.get(KonanConfigKeys.RUNTIME_FILE) + ) internal val platformManager = PlatformManager(distribution) internal val targetManager = platformManager.targetManager(configuration.get(KonanConfigKeys.TARGET)) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 9718a1e8058..db2e3df553e 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -48,6 +48,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("generate test runner") val INCLUDED_BINARY_FILES: CompilerConfigurationKey> = CompilerConfigurationKey.create("included binary file paths") + val KONAN_HOME: CompilerConfigurationKey + = CompilerConfigurationKey.create("overridden compiler distribution path") val LIBRARY_FILES: CompilerConfigurationKey> = CompilerConfigurationKey.create("library file paths") val LIBRARY_VERSION: CompilerConfigurationKey diff --git a/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy b/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy index 959610072ac..158b9520538 100644 --- a/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy +++ b/build-tools/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy @@ -79,7 +79,7 @@ class RunExternalTestGroup extends JavaExec { classpath = project.fileTree("$dist.canonicalPath/konan/lib/") { include '*.jar' } - jvmArgs "-Dkonan.home=${dist.canonicalPath}", "-Xmx4G" + jvmArgs "-Xmx4G" enableAssertions = true def sources = File.createTempFile(name,".lst") sources.deleteOnExit() diff --git a/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy b/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy index 240448a3ea9..5db18fb4552 100644 --- a/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy +++ b/build-tools/src/main/groovy/org/jetbrains/kotlin/NativeInteropPlugin.groovy @@ -204,6 +204,8 @@ class NamedNativeInteropConfig implements Named { new File(project.findProject(":Interop:Indexer").buildDir, "nativelibs"), new File(project.findProject(":Interop:Runtime").buildDir, "nativelibs") ).asPath + // Set the konan.home property because we run the cinterop tool not from a distribution jar + // so it will not be able to determine this path by itself. systemProperties "konan.home": project.rootProject.projectDir environment "LIBCLANG_DISABLE_CRASH_RECOVERY": "1" diff --git a/cmd/run_konan b/cmd/run_konan index 68577a3fb75..310806dc301 100755 --- a/cmd/run_konan +++ b/cmd/run_konan @@ -62,12 +62,9 @@ findHome() { } KONAN_HOME="$(findHome)" -NATIVE_LIB="${KONAN_HOME}/konan/nativelib" - java_opts=(-ea \ -Xmx3G \ -XX:TieredStopAtLevel=1 \ - "-Dkonan.home=${KONAN_HOME}" \ -Dfile.encoding=UTF-8 \ ${JAVA_OPTS}) diff --git a/cmd/run_konan.bat b/cmd/run_konan.bat index 31d5c6b801a..7cc74d98b4f 100644 --- a/cmd/run_konan.bat +++ b/cmd/run_konan.bat @@ -51,7 +51,6 @@ if not "!ARG!" == "" ( goto again ) -set "NATIVE_LIB=%_KONAN_HOME%\konan\nativelib" set "KONAN_LIB=%_KONAN_HOME%\konan\lib" set "KONAN_JAR=%KONAN_LIB%\kotlin-native.jar" @@ -62,7 +61,6 @@ set "KONAN_CLASSPATH=%KONAN_JAR%;%TROVE_JAR%" set JAVA_OPTS=-ea ^ -Xmx3G ^ -XX:TieredStopAtLevel=1 ^ - "-Dkonan.home=%_KONAN_HOME%" ^ -Dfile.encoding=UTF-8 ^ %JAVA_OPTS% diff --git a/dependencyPacker/build.gradle.kts b/dependencyPacker/build.gradle.kts index ae00d0679e3..0f53b258637 100644 --- a/dependencyPacker/build.gradle.kts +++ b/dependencyPacker/build.gradle.kts @@ -20,9 +20,7 @@ inline fun createLlvmPackingTask( blacklist: File?, crossinline additionalConfiguration: T.() -> Unit ) { - val distribution = Distribution( - konanHomeOverride = rootProject.projectDir.absolutePath - ) + val distribution = Distribution(rootProject.projectDir.absolutePath) val reducedLlvmAppendix = distribution.properties .getProperty("reducedLlvmAppendix") val propertiesLoader = object : KonanPropertiesLoader( diff --git a/endorsedLibraries/kotlinx.cli/build.gradle b/endorsedLibraries/kotlinx.cli/build.gradle index f9b975ff83d..002440a53d0 100644 --- a/endorsedLibraries/kotlinx.cli/build.gradle +++ b/endorsedLibraries/kotlinx.cli/build.gradle @@ -72,9 +72,7 @@ def commonSrc = new File("$projectDir/src/main/kotlin") def nativeSrc = new File("$projectDir/src/main/kotlin-native") targetList.each { target -> - def konanJvmArgs = [*HostManager.regularJvmArgs, - "-Dkonan.home=${rootProject.projectDir}/dist", - ] + def konanJvmArgs = [*HostManager.regularJvmArgs] def defaultArgs = ['-nopack', '-no-default-libs', '-no-endorsed-libs'] if (target != "wasm32") defaultArgs += '-g' @@ -88,10 +86,14 @@ targetList.each { target -> // See :endorsedLibraries.ext for full endorsedLibraries list. def moduleName = endorsedLibraries[project].name + dependsOn ":distCompiler" dependsOn ":${target}CrossDistRuntime" main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' - classpath = project(":backend.native").configurations.cli_bc + // This task depends on distCompiler, so the compiler jar is already in the dist directory. + classpath = fileTree("${rootProject.projectDir}/dist/konan/lib") { + include "*.jar" + } jvmArgs = konanJvmArgs args = [*konanArgs, '-output', outputFile, diff --git a/klib/build.gradle b/klib/build.gradle index 12434cf124d..4801efdb132 100644 --- a/klib/build.gradle +++ b/klib/build.gradle @@ -41,15 +41,17 @@ repositories { } dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" - compile project(path: ':backend.native', configuration: 'cli_bc') - testCompile "junit:junit:4.12" - testCompile "org.jetbrains.kotlin:kotlin-test-junit:$buildKotlinVersion" - testCompile "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + implementation project(path: ':backend.native', configuration: 'cli_bc') + implementation project(":utilities:basic-utils") + testImplementation "junit:junit:4.12" + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$buildKotlinVersion" + testImplementation "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion" } test { dependsOn 'cleanTest' + // Specify a path to the distribution that is used in the tests. systemProperty('konan.home', getProperty("org.jetbrains.kotlin.native.home")) dependsOn konanArtifacts.collect { it.getByTarget('host') } if (useCustomDist) { diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index e5a4c507e34..422dfe4e0f7 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.konan.library.KonanLibrary import org.jetbrains.kotlin.konan.library.resolverByName +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.library.metadata.parseModuleHeader import org.jetbrains.kotlin.storage.LockBasedStorageManager import java.lang.System.out @@ -170,7 +171,7 @@ class Library(val name: String, val requestedRepository: String?, val target: St if (!module.isNativeStdlib()) { val resolver = resolverByName( emptyList(), - distributionKlib = Distribution().klib, + distributionKlib = Distribution(KonanHomeProvider.determineKonanHome()).klib, skipCurrentDir = true, logger = KlibToolLogger) resolver.defaultLinks(false, true, true) @@ -202,7 +203,8 @@ fun libraryInRepoOrCurrentDir(repository: File, name: String) = fun main(args: Array) { val command = Command(args) - val targetManager = PlatformManager().targetManager(command.options["-target"]?.last()) + val targetManager = PlatformManager(KonanHomeProvider.determineKonanHome()) + .targetManager(command.options["-target"]?.last()) val target = targetManager.targetName val repository = command.options["-repository"]?.last() diff --git a/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt b/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt index afbc6fce32e..ba526e7eb1d 100644 --- a/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt +++ b/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/ContentsTest.kt @@ -33,7 +33,8 @@ class ContentsTest { @Test fun `Stdlib content should be printed without exceptions`() { val output = StringBuilder() - Library(Distribution().stdlib, null, "host").contents(output) + val distributionPath = System.getProperty("konan.home") + Library(Distribution(distributionPath).stdlib, null, "host").contents(output) } @Test @@ -357,6 +358,6 @@ class ContentsTest { } companion object { - val LIBRARY_DIRECTORY = Paths.get("build/konan/libs").resolve( HostManager.hostName) + val LIBRARY_DIRECTORY = Paths.get("build/konan/libs").resolve(HostManager.hostName) } } \ No newline at end of file diff --git a/konan/konan.properties b/konan/konan.properties index 0f839583877..c3c965954a8 100644 --- a/konan/konan.properties +++ b/konan/konan.properties @@ -21,7 +21,7 @@ dependenciesUrl = https://download.jetbrains.com/kotlin/native dependencyProfiles = default alt # Don't check dependencies on a server. -# If true, dependency downloader will throw an exception if a dependency isn't found in konan.home. +# If true, dependency downloader will throw an exception if a dependency isn't found in $KONAN_DATA_DIR/dependencies airplaneMode = false # if true, ignores Xcode version check. ignoreXcodeVersionCheck = false diff --git a/shared/src/library/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt b/shared/src/library/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt index c642ac17b75..da61e9703b2 100644 --- a/shared/src/library/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt +++ b/shared/src/library/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt @@ -18,7 +18,7 @@ interface SearchPathResolverWithTarget: SearchPathResolverWith fun defaultResolver( repositories: List, target: KonanTarget, - distribution: Distribution = Distribution(), + distribution: Distribution, compatibleCompilerVersions: List = emptyList() ): SearchPathResolverWithTarget = defaultResolver(repositories, emptyList(), target, distribution, compatibleCompilerVersions) diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt index 77e3e4d8f08..18bff4655bb 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt @@ -29,9 +29,11 @@ class Platform(val configurables: Configurables) } } -class PlatformManager(distribution: Distribution = Distribution(), experimental: Boolean = false) : +class PlatformManager(private val distribution: Distribution, experimental: Boolean = false) : HostManager(distribution, experimental) { + constructor(konanHome: String, experimental: Boolean = false): this(Distribution(konanHome), experimental) + private val loaders = filteredOutEnabledButNotSupported.map { it to loadConfigurables(it, distribution.properties, DependencyProcessor.defaultDependenciesRoot.absolutePath) }.toMap() diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanLibrariesSpec.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanLibrariesSpec.kt index 63e97ec282e..968a61185b3 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanLibrariesSpec.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanLibrariesSpec.kt @@ -155,7 +155,7 @@ open class KonanLibrariesSpec( defaultResolver( repos.map { it.absolutePath }, task.konanTarget, - Distribution(konanHomeOverride = project.konanHome) + Distribution(project.konanHome) ) ) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt index 0f41f54bef1..b58bbe2448f 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt @@ -345,7 +345,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME) - // Set additional project properties like konan.home, konan.build.targets etc. + // Set additional project properties like org.jetbrains.kotlin.native.home, konan.build.targets etc. if (!project.hasProperty(ProjectProperty.KONAN_HOME)) { project.setProperty(ProjectProperty.KONAN_HOME, project.konanCompilerDownloadDir()) project.setProperty(ProjectProperty.DOWNLOAD_COMPILER, true) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt index c5561933e1e..b26a217fd81 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanToolRunner.kt @@ -30,7 +30,6 @@ internal interface KonanToolRunner: Named { val classpath: FileCollection val jvmArgs: List val environment: Map - val additionalSystemProperties: Map fun run(args: List) fun run(vararg args: String) = run(args.toList()) @@ -70,10 +69,6 @@ internal abstract class KonanCliRunner( addAll(project.jvmArgs) } - override val additionalSystemProperties = mutableMapOf( - "konan.home" to konanHome - ) - override val environment = mutableMapOf("LIBCLANG_DISABLE_CRASH_RECOVERY" to "1") private fun String.escapeQuotes() = replace("\"", "\\\"") @@ -106,7 +101,6 @@ internal abstract class KonanCliRunner( .escapeQuotesForWindows() .toMap() ) - spec.systemProperties(additionalSystemProperties) spec.args(listOf(toolName) + transformArgs(args)) blacklistEnvironment.forEach { spec.environment.remove(it) } spec.environment(environment) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt index d602b416e06..3ff6c8ce028 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCacheTask.kt @@ -4,6 +4,7 @@ import org.gradle.api.DefaultTask import org.gradle.api.provider.Property import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.plugin.konan.KonanCompilerRunner +import org.jetbrains.kotlin.gradle.plugin.konan.hostManager import org.jetbrains.kotlin.gradle.plugin.konan.konanHome import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.HostManager diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt index 5248d60ab3c..800ee821e2e 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanCompileTask.kt @@ -329,7 +329,7 @@ abstract class KonanCompileTask: KonanBuildingTask(), KonanCompileSpec { val resolver = defaultResolver( repos.map { it.absolutePath }, konanTarget, - Distribution(konanHomeOverride = project.konanHome) + Distribution(project.konanHome) ) return KonanModelArtifactImpl( diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt index eb026bb2927..a0080060abf 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/tasks/KonanInteropTask.kt @@ -176,7 +176,7 @@ open class KonanInteropTask @Inject constructor(@Internal val workerExecutor: Wo val resolver = defaultResolver( repos.map { it.absolutePath }, konanTarget, - Distribution(konanHomeOverride = project.konanHome) + Distribution(project.konanHome) ) return KonanModelArtifactImpl( diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy index b6a26c79f78..65a93cbb3df 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy @@ -87,11 +87,7 @@ class KonanProject { this.targets = targets projectPath = projectDir.toPath() konanBuildDir = projectPath.resolve('build/konan').toFile() - def konanHome = System.getProperty("konan.home") ?: System.getProperty("org.jetbrains.kotlin.native.home") - if (konanHome == null) { - throw new IllegalStateException("konan.home isn't specified") - } - def konanHomeDir = new File(konanHome) + def konanHomeDir = new File(getKonanHome()) if (!konanHomeDir.exists() || !konanHomeDir.directory) { throw new IllegalStateException("konan.home doesn't exist or is not a directory: $konanHomeDir.canonicalPath") } @@ -370,4 +366,12 @@ class KonanProject { return value.replace('\\', '\\\\') } + static String getKonanHome() { + def konanHome = System.getProperty("konan.home") ?: System.getProperty("org.jetbrains.kotlin.native.home") + if (konanHome == null) { + throw new IllegalStateException("konan.home isn't specified") + } + return konanHome + } + } diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy index 460b94b57c7..14b16ce45ba 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy @@ -26,7 +26,7 @@ class PathSpecification extends BaseKonanSpecification { project.konanBuildDir.toPath().resolve(path).toFile().exists() } - def platformManager = new PlatformManager() + def platformManager = new PlatformManager(KonanProject.konanHome) def 'Plugin should provide a correct path to the artifacts created'() { expect: diff --git a/utilities/basic-utils/build.gradle.kts b/utilities/basic-utils/build.gradle.kts index e655d8d6cee..0f69edcbcd6 100644 --- a/utilities/basic-utils/build.gradle.kts +++ b/utilities/basic-utils/build.gradle.kts @@ -19,6 +19,11 @@ tasks.named("compileKotlin") { } } -dependencies { +// Convert to normal strings since originally these properties contain GStrings. +val kotlinCompilerModule = rootProject.ext["kotlinCompilerModule"].toString() +val kotlinStdLibModule = rootProject.ext["kotlinStdLibModule"].toString() +dependencies { + api(kotlinStdLibModule) + implementation(kotlinCompilerModule) } diff --git a/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt b/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt new file mode 100644 index 00000000000..adf669b2818 --- /dev/null +++ b/utilities/basic-utils/src/main/kotlin/KonanHomeProvider.kt @@ -0,0 +1,39 @@ +package org.jetbrains.kotlin.konan.util + +import org.jetbrains.kotlin.utils.PathUtil +import java.io.File +import java.nio.file.Paths + +object KonanHomeProvider { + + /** + * Determines a path to the current Kotlin/Native distribution. + * + * - If the system property "konan.home" is set, the method returns its value. + * - Otherwise, it determines a path to a jar containing this class. If this path corresponds to the jar path + * inside a distribution, the method calculates the path to the distribution on the basis of this jar path. + * Otherwise an IllegalStateException is thrown. + */ + fun determineKonanHome(): String { + val propertyValue = System.getProperty("konan.home") + return if (propertyValue != null) { + File(propertyValue).absolutePath + } else { + val jarPath = PathUtil.getResourcePathForClass(this::class.java) + + // Check that the path obtained really points to the distribution. + val expectedRelativeJarPath = Paths.get("konan/lib/kotlin-native.jar") + check(jarPath.toPath().endsWith(expectedRelativeJarPath)) { + val classesPath = if (jarPath.extension == "jar") jarPath else jarPath.parentFile + """ + Cannot determine a compiler distribution directory. + A path to compiler classes is not a part of a distribution: ${classesPath.absolutePath}. + Please set the konan.home system property to specify the distribution path manually. + """.trimIndent() + } + + // The compiler jar is located in /konan/lib. + jarPath.parentFile.parentFile.parentFile.absolutePath + } + } +} \ No newline at end of file diff --git a/utilities/cli-runner/build.gradle b/utilities/cli-runner/build.gradle index 97a00e22105..ba35f4d9b4c 100644 --- a/utilities/cli-runner/build.gradle +++ b/utilities/cli-runner/build.gradle @@ -22,8 +22,9 @@ compileKotlin { dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" - compile project(':backend.native') - compile project(':Interop:StubGenerator') - compile project(':klib') + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + implementation project(':backend.native') + implementation project(':Interop:StubGenerator') + implementation project(':klib') + implementation project(":utilities:basic-utils") } diff --git a/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt b/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt index 2c2c89a6fc8..492e84acdfb 100644 --- a/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt +++ b/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/GeneratePlatformLibraries.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.customerDistribution +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.konan.util.PlatformLibsInfo import org.jetbrains.kotlin.konan.util.visibleName import org.jetbrains.kotlin.native.interop.tool.CommonInteropArguments.Companion.DEFAULT_MODE @@ -120,7 +121,7 @@ fun generatePlatformLibraries(args: Array) { argParser.parse(args) - val distribution = customerDistribution() + val distribution = customerDistribution(KonanHomeProvider.determineKonanHome()) val target = HostManager(distribution).targetByName(targetName) val inputDirectory = inputDirectoryPath?.File() diff --git a/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt b/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt index 6cc4cb7246f..c2e7a97fdcc 100644 --- a/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt +++ b/utilities/cli-runner/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.cli.utilities import org.jetbrains.kotlin.cli.bc.SHORT_MODULE_NAME_ARG import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.PlatformManager +import org.jetbrains.kotlin.konan.util.KonanHomeProvider import org.jetbrains.kotlin.native.interop.gen.jvm.InternalInteropOptions import org.jetbrains.kotlin.native.interop.gen.jvm.interop import org.jetbrains.kotlin.native.interop.tool.* @@ -39,7 +40,7 @@ fun invokeInterop(flavor: String, args: Array): Array? { val repos = arguments.repo val targetRequest = if (arguments is CInteropArguments) arguments.target else (arguments as JSInteropArguments).target - val target = PlatformManager().targetManager(targetRequest).target + val target = PlatformManager(KonanHomeProvider.determineKonanHome()).targetManager(targetRequest).target val cinteropArgsToCompiler = interop(flavor, args, InternalInteropOptions(generatedDir.absolutePath,