From 2d307964832672be14c93c83b6ed9b72a5df49c8 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Mon, 16 Nov 2020 14:39:37 +0700 Subject: [PATCH] Better checking of ABI compatibility. Split ${target}CheckAbiCompatibility into two: 1) check${targetName}PlatformAbiCompatibility -- check platform libs compatibility of the given target 2) checkStdlibAbiCompatibility -- check only stdlib. This approach allows to avoid repeated check of stdlib for each target. --- .../kotlin/CompareDistributionSignatures.kt | 62 ++++++++++++------- kotlin-native/build.gradle | 12 +++- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompareDistributionSignatures.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompareDistributionSignatures.kt index 1c71ebddd95..381cc7c551d 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompareDistributionSignatures.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompareDistributionSignatures.kt @@ -12,9 +12,6 @@ import java.io.File */ open class CompareDistributionSignatures : DefaultTask() { - @Input - lateinit var target: String - @Input lateinit var oldDistribution: String @@ -31,22 +28,52 @@ open class CompareDistributionSignatures : DefaultTask() { @Input var onMismatchMode: OnMismatchMode = OnMismatchMode.NOTIFY + sealed class Libraries { + object Standard : Libraries() + + class Platform(val target: String) : Libraries() + } + + @Input + lateinit var libraries: Libraries + + private fun computeDiff(): KlibDiff = when (val libraries = libraries) { + Libraries.Standard -> KlibDiff( + emptyList(), + emptyList(), + listOf(RemainingLibrary(newDistribution.stdlib(), oldDistribution.stdlib())) + ) + is Libraries.Platform -> { + val oldPlatformLibs = oldDistribution.platformLibs(libraries.target) + val oldPlatformLibsNames = oldPlatformLibs.list().toSet() + val newPlatformLibs = newDistribution.platformLibs(libraries.target) + val newPlatformLibsNames = newPlatformLibs.list().toSet() + KlibDiff( + (newPlatformLibsNames - oldPlatformLibsNames).map(newPlatformLibs::resolve), + (oldPlatformLibsNames - newPlatformLibsNames).map(oldPlatformLibs::resolve), + oldPlatformLibsNames.intersect(newPlatformLibsNames).map { + RemainingLibrary(newPlatformLibs.resolve(it), oldPlatformLibs.resolve(it)) + } + ) + } + } + @TaskAction fun run() { - val klibs = getKlibs(oldDistribution, newDistribution) - if (klibs.missingLibs.isNotEmpty()) { + val platformLibsDiff = computeDiff() + if (platformLibsDiff.missingLibs.isNotEmpty()) { messageBuilder.apply { - appendln("Following libraries are missing in the new distro:") - klibs.missingLibs.forEach { appendln(it) } + appendln("Following platform libraries are missing in the new distro:") + platformLibsDiff.missingLibs.forEach { appendln(it) } } } - if (klibs.newLibs.isNotEmpty()) { + if (platformLibsDiff.newLibs.isNotEmpty()) { messageBuilder.apply { - appendln("Following libraries were added:") - klibs.newLibs.forEach { appendln(it) } + appendln("Following platform libraries were added:") + platformLibsDiff.newLibs.forEach { appendln(it) } } } - for ((new, old) in klibs.remainingLibs) { + for ((new, old) in platformLibsDiff.remainingLibs) { val result = compareSignatures(new, old) if (result.run { newKlibOnly.isNotEmpty() || oldKlibOnly.isNotEmpty() }) { reportMismatch(result, new.name) @@ -92,19 +119,6 @@ open class CompareDistributionSignatures : DefaultTask() { private fun String.platformLibs(target: String): File = File("$this/klib/platform/$target") - private fun getKlibs(oldDistribution: String, newDistribution: String): KlibDiff { - val oldPlatformLibs = oldDistribution.platformLibs(target) - val oldPlatformLibsNames = oldPlatformLibs.list().toSet() - val newPlatformLibs = newDistribution.platformLibs(target) - val newPlatformLibsNames = newPlatformLibs.list().toSet() - return KlibDiff( - (newPlatformLibsNames - oldPlatformLibsNames).map(newPlatformLibs::resolve), - (oldPlatformLibsNames - newPlatformLibsNames).map(oldPlatformLibs::resolve), - oldPlatformLibsNames.intersect(newPlatformLibsNames).map { - RemainingLibrary(newPlatformLibs.resolve(it), oldPlatformLibs.resolve(it)) - } + RemainingLibrary(newDistribution.stdlib(), oldDistribution.stdlib()) - ) - } private fun getKlibSignatures(klib: File): List { val tool = if (HostManager.hostIsMingw) "klib.bat" else "klib" diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index 8cf97669123..75648adf60a 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -792,12 +792,20 @@ task compdb(type: Copy) { if (project.hasProperty("anotherDistro")) { targetList.each { targetName -> - task "${targetName}CheckAbiCompatibility"(type: CompareDistributionSignatures) { + task "${targetName}CheckPlatformAbiCompatibility"(type: CompareDistributionSignatures) { dependsOn "${targetName}PlatformLibs" - target = targetName + libraries = new CompareDistributionSignatures.Libraries.Platform(targetName) oldDistribution = project.findProperty("anotherDistro") onMismatchMode = CompareDistributionSignatures.OnMismatchMode.FAIL } } + + task "checkStdlibAbiCompatibility"(type: CompareDistributionSignatures) { + dependsOn "distRuntime" + + libraries = CompareDistributionSignatures.Libraries.Standard.INSTANCE + oldDistribution = project.findProperty("anotherDistro") + onMismatchMode = CompareDistributionSignatures.OnMismatchMode.FAIL + } }