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,