From c59896b6d18eb334f2f8d7ca726b10e7c51a2db8 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 10 Oct 2019 03:57:10 +0300 Subject: [PATCH] Moved library resolver with attributes to Kotlin. Introduced a hierarchy of resolvers. --- .../konan/library/SearchPathResolver.kt | 73 +++++++------------ .../gradle/plugin/konan/KonanLibrariesSpec.kt | 2 +- 2 files changed, 27 insertions(+), 48 deletions(-) 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 b550aa19b78..7c8b3e7fdfc 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 @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.util.Logger const val KONAN_STDLIB_NAME = "stdlib" -interface SearchPathResolverWithTarget: SearchPathResolverWithAttributes { +interface SearchPathResolverWithTarget: SearchPathResolverWithAttributes { val target: KonanTarget } @@ -21,7 +21,7 @@ fun defaultResolver( target: KonanTarget, distribution: Distribution = Distribution(), compatibleCompilerVersions: List = emptyList() -): SearchPathResolverWithTarget = defaultResolver(repositories, emptyList(), target, distribution, compatibleCompilerVersions) +): SearchPathResolverWithTarget = defaultResolver(repositories, emptyList(), target, distribution, compatibleCompilerVersions) fun defaultResolver( repositories: List, @@ -31,7 +31,7 @@ fun defaultResolver( compatibleCompilerVersions: List = emptyList(), logger: Logger = DummyLogger, skipCurrentDir: Boolean = false -): SearchPathResolverWithTarget = KonanLibraryProperResolver( +): SearchPathResolverWithTarget = KonanLibraryProperResolver( repositories, directLibs, target, @@ -40,20 +40,29 @@ fun defaultResolver( distribution.klib, distribution.localKonanDir.absolutePath, skipCurrentDir, - logger) + logger +) internal class KonanLibraryProperResolver( repositories: List, directLibs: List, override val target: KonanTarget, - override val knownAbiVersions: List?, - override val knownCompilerVersions: List?, + knownAbiVersions: List?, + knownCompilerVersions: List?, distributionKlib: String?, localKonanDir: String?, skipCurrentDir: Boolean, - override val logger: Logger = DummyLogger -) : KotlinLibrarySearchPathResolver(repositories, directLibs, distributionKlib, localKonanDir, skipCurrentDir, logger), - SearchPathResolverWithTarget + override val logger: Logger +) : KotlinLibraryProperResolverWithAttributes( + repositories, directLibs, + knownAbiVersions, + knownCompilerVersions, + distributionKlib, + localKonanDir, + skipCurrentDir, + logger, + {file: File, isDefaultLink: Boolean -> createKonanLibrary(file, target, isDefaultLink)} +), SearchPathResolverWithTarget { override val distPlatformHead: File? get() = distributionKlib?.File()?.child("platform")?.child(target.visibleName) @@ -69,47 +78,17 @@ internal class KonanLibraryProperResolver( logger.fatal("Could not find \"$givenPath\" in ${searchRoots.map { it.absolutePath }}.") } } -} -internal fun SearchPathResolverWithTarget.libraryMatch(candidate: KonanLibraryImpl, unresolved: UnresolvedLibrary): Boolean { - val resolverTarget = this.target - val candidatePath = candidate.libraryFile.absolutePath + override fun libraryMatch(candidate: KonanLibrary, unresolved: UnresolvedLibrary): Boolean { + val resolverTarget = this.target + val candidatePath = candidate.libraryFile.absolutePath - val candidateCompilerVersion = candidate.versions.compilerVersion - val candidateAbiVersion = candidate.versions.abiVersion - val candidateLibraryVersion = candidate.versions.libraryVersion - - if (!candidate.targetList.contains(resolverTarget.visibleName)) { - logger.warning("skipping $candidatePath. The target doesn't match. Expected '$resolverTarget', found ${candidate.targetList}") - return false - } - - val abiVersionMatch = candidateAbiVersion != null && - knownAbiVersions != null && - knownAbiVersions!!.contains(candidateAbiVersion) - - val compilerVersionMatch = candidateCompilerVersion != null && - knownCompilerVersions != null && - knownCompilerVersions!!.any { it.compatible(candidateCompilerVersion) } - - if (!abiVersionMatch && !compilerVersionMatch) { - logger.warning("skipping $candidatePath. The abi versions don't match. Expected '${knownAbiVersions}', found '${candidateAbiVersion}'") - - if (knownCompilerVersions != null) { - val expected = knownCompilerVersions?.map { it.toString(false, false) } - val found = candidateCompilerVersion?.toString(true, true) - logger.warning("The compiler versions don't match either. Expected '${expected}', found '${found}'") + if (!candidate.targetList.contains(resolverTarget.visibleName)) { + logger.warning("skipping $candidatePath. The target doesn't match. Expected '$resolverTarget', found ${candidate.targetList}") + return false } - return false + return super.libraryMatch(candidate, unresolved) } - - if (candidateLibraryVersion != unresolved.libraryVersion && - candidateLibraryVersion != null && - unresolved.libraryVersion != null) { - logger.warning("skipping $candidatePath. The library versions don't match. Expected '${unresolved.libraryVersion}', found '${candidateLibraryVersion}'") - return false - } - - return true } + 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 869bdf5414c..2f297f4759a 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 @@ -153,7 +153,7 @@ open class KonanLibrariesSpec(val task: KonanArtifactWithLibrariesTask, val proj ) ) - fun asFiles(resolver: SearchPathResolver): List = mutableListOf().apply { + fun asFiles(resolver: SearchPathResolver<*>): List = mutableListOf().apply { files.flatMapTo(this) { it.files } addAll(artifactFiles) addAll(task.platformConfiguration.files)