Skip to content

Commit 899de2e

Browse files
committed
prep for klib extract
1 parent 37762e1 commit 899de2e

File tree

3 files changed

+123
-16
lines changed

3 files changed

+123
-16
lines changed

modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() {
229229
}
230230
}
231231

232-
233232
runner.build {
234233
checkKLibDump("/examples/classes/Subclasses.klib.dump")
235234
}

modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ import dev.adamko.kotlin.binary_compatibility_validator.internal.*
44
import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVJvmTarget
55
import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVKLibTarget
66
import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget
7-
import dev.adamko.kotlin.binary_compatibility_validator.workers.JvmSignaturesWorker
8-
import dev.adamko.kotlin.binary_compatibility_validator.workers.KLibInferSignaturesWorker
9-
import dev.adamko.kotlin.binary_compatibility_validator.workers.KLibMergeWorker
10-
import dev.adamko.kotlin.binary_compatibility_validator.workers.KLibSignaturesWorker
7+
import dev.adamko.kotlin.binary_compatibility_validator.workers.*
118
import java.io.File
129
import javax.inject.Inject
1310
import org.gradle.api.NamedDomainObjectContainer
@@ -184,6 +181,23 @@ constructor(
184181

185182
val (supportedKLibTargets, unsupportedKLibTargets) =
186183
klibTargets.partition { it.supportedByCurrentHost.get() }
184+
185+
generateSupportedKLibTargets(workQueue, supportedKLibTargets)
186+
generateUnsupportedKLibTargets(workQueue, unsupportedKLibTargets)
187+
188+
workQueue.await()
189+
190+
val allTargetDumpFiles =
191+
supportedTargetsDir.walk().filter { it.isFile }.toSet() union
192+
unsupportedTargetsDir.walk().filter { it.isFile }.toSet()
193+
194+
mergeDumpFiles(workQueue, allTargetDumpFiles, outputApiBuildDir.asFile)
195+
}
196+
197+
private fun generateSupportedKLibTargets(
198+
workQueue: WorkQueue,
199+
supportedKLibTargets: List<BCVKLibTarget>
200+
) {
187201
logger.lifecycle("[$path] generating ${supportedKLibTargets.size} supported KLib targets : ${supportedKLibTargets.joinToString { it.name }}")
188202

189203
val supportedKLibGenDuration = measureTime {
@@ -195,8 +209,14 @@ constructor(
195209
}
196210
workQueue.await()
197211
}
212+
198213
logger.lifecycle("[$path] finished generating supported KLib targets in $supportedKLibGenDuration")
214+
}
199215

216+
private fun generateUnsupportedKLibTargets(
217+
workQueue: WorkQueue,
218+
unsupportedKLibTargets: List<BCVKLibTarget>
219+
) {
200220
logger.lifecycle("[$path] generating ${unsupportedKLibTargets.size} unsupported KLib targets : ${unsupportedKLibTargets.joinToString { it.name }}")
201221

202222
val unsupportedKLibGenDuration = measureTime {
@@ -210,30 +230,32 @@ constructor(
210230
)
211231
}
212232
}
213-
logger.lifecycle("[$path] finished generating unsupported KLib targets in $unsupportedKLibGenDuration")
214233

215-
workQueue.await()
234+
logger.lifecycle("[$path] finished generating unsupported KLib targets in $unsupportedKLibGenDuration")
235+
}
216236

217-
val allTargetDumpFiles =
218-
supportedTargetsDir.walk().filter { it.isFile }.toSet() union
219-
unsupportedTargetsDir.walk().filter { it.isFile }.toSet()
220237

238+
private fun mergeDumpFiles(
239+
workQueue: WorkQueue,
240+
allTargetDumpFiles: Set<File>,
241+
outputApiBuildDir: File
242+
) {
221243
logger.lifecycle("[$path] merging ${allTargetDumpFiles.size} dump files : ${allTargetDumpFiles.joinToString { it.name }}")
222244

223245
workQueue.merge(
224246
projectName.get(),
225247
targetDumpFiles = allTargetDumpFiles,
226-
outputDir = outputApiBuildDir.asFile,
248+
outputDir = outputApiBuildDir,
227249
)
228250
workQueue.await()
229251

230-
logger.lifecycle(
231-
"[$path] merged ${allTargetDumpFiles.size} dump files : ${
232-
outputApiBuildDir.asFile.walk().filter { it.isFile }.toList()
233-
}"
234-
)
252+
if (logger.isLifecycleEnabled) {
253+
val fileNames = outputApiBuildDir.walk().filter { it.isFile }.toList()
254+
logger.lifecycle("[$path] merged ${allTargetDumpFiles.size} dump files : $fileNames")
255+
}
235256
}
236257

258+
237259
@OptIn(BCVExperimentalApi::class)
238260
private fun WorkQueue.submit(
239261
target: BCVKLibTarget,
@@ -300,5 +322,24 @@ constructor(
300322
this@worker.targetDumpFiles.from(targetDumpFiles)
301323
}
302324
}
325+
326+
@OptIn(BCVExperimentalApi::class)
327+
private fun WorkQueue.extract(
328+
target: BCVKLibTarget,
329+
targetDumpFiles: Set<File>,
330+
outputDir: File,
331+
) {
332+
val task = this@BCVApiGenerateTask
333+
334+
@OptIn(BCVInternalApi::class)
335+
submit(KLibExtractWorker::class) worker@{
336+
this@worker.taskPath.set(task.path)
337+
this@worker.strictValidation.set(target.strictValidation)
338+
339+
// this@worker.inputAbiFile.set()
340+
// this@worker.outputAbiFile.set()
341+
// this@worker.supportedTargets.set()
342+
}
343+
}
303344
//endregion
304345
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package dev.adamko.kotlin.binary_compatibility_validator.workers
2+
3+
import dev.adamko.kotlin.binary_compatibility_validator.internal.BCVExperimentalApi
4+
import dev.adamko.kotlin.binary_compatibility_validator.internal.BCVInternalApi
5+
import java.io.Serializable
6+
import kotlinx.validation.ExperimentalBCVApi
7+
import kotlinx.validation.KlibValidationSettings
8+
import kotlinx.validation.api.klib.KlibDump
9+
import kotlinx.validation.api.klib.KlibTarget
10+
import kotlinx.validation.api.klib.saveTo
11+
import org.gradle.api.file.RegularFileProperty
12+
import org.gradle.api.logging.Logger
13+
import org.gradle.api.logging.Logging
14+
import org.gradle.api.provider.Property
15+
import org.gradle.api.provider.SetProperty
16+
import org.gradle.workers.WorkAction
17+
import org.gradle.workers.WorkParameters
18+
19+
@BCVInternalApi
20+
@BCVExperimentalApi
21+
@OptIn(ExperimentalBCVApi::class)
22+
abstract class KLibExtractWorker : WorkAction<KLibExtractWorker.Parameters> {
23+
24+
@BCVInternalApi
25+
interface Parameters : WorkParameters, Serializable {
26+
// val projectName: Property<String>
27+
/** Merged KLib dump that should be filtered by this task. */
28+
val inputAbiFile: RegularFileProperty
29+
/** A path to the resulting dump file. */
30+
val outputAbiFile: RegularFileProperty
31+
/** Provider returning targets supported by the host compiler. */
32+
val supportedTargets: SetProperty<String>
33+
/** Refer to [KlibValidationSettings.strictValidation] for details. */
34+
val strictValidation: Property<Boolean>
35+
/**
36+
* [Task path][org.gradle.api.Task.getPath] of the task that invoked this worker,
37+
* for log messages
38+
*/
39+
val taskPath: Property<String>
40+
}
41+
42+
override fun execute() {
43+
val inputAbiFile = parameters.inputAbiFile.get().asFile
44+
val supportedTargets = parameters.supportedTargets.get()
45+
val strictValidation = parameters.strictValidation.getOrElse(false)
46+
val outputAbiFile = parameters.outputAbiFile.get().asFile
47+
48+
if (inputAbiFile.length() == 0L) {
49+
error("Project ABI file $inputAbiFile is empty")
50+
}
51+
val dump = KlibDump.from(inputAbiFile)
52+
val enabledTargets = supportedTargets.map { KlibTarget.parse(it).targetName }
53+
// Filter out only unsupported files.
54+
// That ensures that target renaming will be caught and reported as a change.
55+
val targetsToRemove = dump.targets.filter { it.targetName !in enabledTargets }
56+
if (targetsToRemove.isNotEmpty() && strictValidation) {
57+
error("Validation could not be performed as some targets are not available and strictValidation mode is enabled")
58+
}
59+
dump.remove(targetsToRemove)
60+
dump.saveTo(outputAbiFile)
61+
}
62+
63+
@BCVInternalApi
64+
companion object {
65+
private val logger: Logger = Logging.getLogger(KLibExtractWorker::class.java)
66+
}
67+
}

0 commit comments

Comments
 (0)