diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt index 32815eb60e0..0f781b4f1ad 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt @@ -34,7 +34,12 @@ fun defaultResolver(repositories: List, targetManager: TargetManager): S defaultResolver(repositories, Distribution(targetManager)) fun defaultResolver(repositories: List, distribution: Distribution): SearchPathResolver = - KonanLibrarySearchPathResolver(repositories, distribution.klib, distribution.localKonanDir) + KonanLibrarySearchPathResolver( + repositories, + distribution.targetManager, + distribution.klib, + distribution.localKonanDir + ) fun SearchPathResolver.resolveImmediateLibraries(libraryNames: List, target: KonanTarget, @@ -94,8 +99,13 @@ fun SearchPathResolver.resolveLibrariesRecursive(libraryNames: List, ) } -class KonanLibrarySearchPathResolver(repositories: List, - val distributionKlib: String?, val localKonanDir: String?, val skipCurrentDir: Boolean = false): SearchPathResolver { +class KonanLibrarySearchPathResolver( + repositories: List, + val targetManager: TargetManager?, + val distributionKlib: String?, + val localKonanDir: String?, + val skipCurrentDir: Boolean = false +): SearchPathResolver { val localHead: File? get() = localKonanDir?.File()?.klib @@ -103,6 +113,9 @@ class KonanLibrarySearchPathResolver(repositories: List, val distHead: File? get() = distributionKlib?.File() + val distPlatformHead: File? + get() = targetManager?.let { distHead?.child(targetManager.targetName) } + val currentDirHead: File? get() = if (!skipCurrentDir) File.userDir else null @@ -112,7 +125,7 @@ class KonanLibrarySearchPathResolver(repositories: List, // This is the place where we specify the order of library search. override val searchRoots: List by lazy { - (listOf(currentDirHead) + repoRoots + listOf(localHead, distHead)).filterNotNull() + (listOf(currentDirHead) + repoRoots + listOf(localHead, distHead, distPlatformHead)).filterNotNull() } private fun found(candidate: File): File? { @@ -145,7 +158,7 @@ class KonanLibrarySearchPathResolver(repositories: List, // The libraries from the default root are linked automatically. val defaultRoot: File? - get() = if (distHead?.exists ?: false) distHead else null + get() = if (distPlatformHead?.exists ?: false) distPlatformHead else null override fun defaultLinks(nostdlib: Boolean, noDefaultLibs: Boolean): List { val defaultLibs = defaultRoot?.listFiles.orEmpty() diff --git a/klib/platform.gradle b/klib/platform.gradle index 08b1d832ed6..638dd19ccbc 100644 --- a/klib/platform.gradle +++ b/klib/platform.gradle @@ -11,13 +11,14 @@ buildscript { def taskName = "${gradle.startParameter.projectProperties['name']}" String konanHome = gradle.startParameter.projectProperties['konan.home'] List libraries = gradle.startParameter.projectProperties.libraries.split(" ").findAll { !it.isEmpty() } +String targetName = gradle.startParameter.projectProperties.target konanInterop { "$taskName" { defFile gradle.startParameter.projectProperties.defFile - target gradle.startParameter.projectProperties.target + target targetName noDefaultLibs true - extraOpts libraries.collectMany { ["-library", "$konanHome/klib/$it"] } + extraOpts libraries.collectMany { ["-library", "$konanHome/klib/$targetName/$it"] } } } @@ -25,10 +26,15 @@ def suffix = gradle.startParameter.projectProperties['suffix'] def klibProgram = suffix?"$konanHome/bin/klib.$suffix" : "$konanHome/bin/klib" task klibInstall(type:Exec) { + String repo = "$konanHome/klib/$targetName" + doFirst { + new File(repo).mkdirs() + } + dependsOn konanInterop["$taskName"].interopProcessingTask commandLine klibProgram, 'install', konanInterop["$taskName"].interopProcessingTask.klib, '-repository', - "$konanHome/klib" + repo } 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 06880f57212..e16395d84db 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 @@ -133,17 +133,33 @@ class Library(val name: String, val requestedRepository: String?, val target: St val currentAbiVersion = 1 fun libraryInRepo(repository: File, name: String): File { - val resolver = KonanLibrarySearchPathResolver(listOf(repository.absolutePath), null, null, skipCurrentDir = true) + val resolver = KonanLibrarySearchPathResolver( + repositories = listOf(repository.absolutePath), + targetManager = null, + distributionKlib = null, + localKonanDir = null, + skipCurrentDir = true + ) return resolver.resolve(name) } fun libraryInCurrentDir(name: String): File { - val resolver = KonanLibrarySearchPathResolver(emptyList(), null, null) + val resolver = KonanLibrarySearchPathResolver( + repositories = emptyList(), + targetManager = null, + distributionKlib = null, + localKonanDir = null + ) return resolver.resolve(name) } fun libraryInRepoOrCurrentDir(repository: File, name: String): File { - val resolver = KonanLibrarySearchPathResolver(listOf(repository.absolutePath), null, null) + val resolver = KonanLibrarySearchPathResolver( + repositories = listOf(repository.absolutePath), + targetManager = null, + distributionKlib = null, + localKonanDir = null + ) return resolver.resolve(name) } diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/file/NoJavaUtil.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/file/NoJavaUtil.kt index 981f86de830..8eba3adff6c 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/file/NoJavaUtil.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/file/NoJavaUtil.kt @@ -59,6 +59,8 @@ data class File constructor(internal val javaPath: Path) { return result } + fun child(name: String) = File(this, name) + fun copyTo(destination: File) { Files.copy(javaPath, destination.javaPath, StandardCopyOption.REPLACE_EXISTING) }