[Commonizer] Introduce success marker file in Gradle task
The success marker file is written to the disk only upon successful commonization. If something goes wrong, this file is not written to the disk. So the subsequent call of 'runCommonizer' task will be considered not up-to-date. ^KT-40120
This commit is contained in:
+45
-6
@@ -35,6 +35,9 @@ internal data class CommonizerSubtaskParams(
|
|||||||
// (common first, then platforms in the same order as in 'orderedTargetNames').
|
// (common first, then platforms in the same order as in 'orderedTargetNames').
|
||||||
@get:OutputDirectories val resultingLibsDirs: List<File>,
|
@get:OutputDirectories val resultingLibsDirs: List<File>,
|
||||||
|
|
||||||
|
// Only for up-to-date checker. The file exists if and only if a commonizer subtask was successfully accomplished.
|
||||||
|
@get:OutputFile val successMarker: File,
|
||||||
|
|
||||||
@get:Internal val destinationDir: File
|
@get:Internal val destinationDir: File
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -61,6 +64,9 @@ internal data class CommonizerTaskParams(
|
|||||||
lateinit var failurePostActions: List<() -> Unit>
|
lateinit var failurePostActions: List<() -> Unit>
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val SUCCESS_MARKER = ".commonized"
|
||||||
|
private const val SUCCESS_MARKER_CONTENT = "1"
|
||||||
|
|
||||||
fun build(
|
fun build(
|
||||||
kotlinVersion: String,
|
kotlinVersion: String,
|
||||||
targetGroups: List<Set<KonanTarget>>,
|
targetGroups: List<Set<KonanTarget>>,
|
||||||
@@ -77,9 +83,11 @@ internal data class CommonizerTaskParams(
|
|||||||
val orderedTargetNames = targets.map { it.name }.sorted()
|
val orderedTargetNames = targets.map { it.name }.sorted()
|
||||||
if (orderedTargetNames.size == 1) {
|
if (orderedTargetNames.size == 1) {
|
||||||
// no need to commonize, just use the libraries from the distribution
|
// no need to commonize, just use the libraries from the distribution
|
||||||
|
val successMarker = successMarker(distributionLibsDir).also(::writeSuccess)
|
||||||
buildSubtask(
|
buildSubtask(
|
||||||
destinationDir = distributionLibsDir,
|
destinationDir = distributionLibsDir,
|
||||||
orderedTargetNames = orderedTargetNames
|
orderedTargetNames = orderedTargetNames,
|
||||||
|
successMarker = successMarker
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val discriminator = buildString {
|
val discriminator = buildString {
|
||||||
@@ -89,7 +97,11 @@ internal data class CommonizerTaskParams(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val destinationDir = baseDestinationDir.resolve(discriminator)
|
val destinationDir = baseDestinationDir.resolve(discriminator)
|
||||||
if (!destinationDir.isDirectory) {
|
val successMarker = successMarker(destinationDir)
|
||||||
|
|
||||||
|
if (!isSuccess(successMarker)) {
|
||||||
|
successMarker.delete()
|
||||||
|
|
||||||
val parentDir = destinationDir.parentFile
|
val parentDir = destinationDir.parentFile
|
||||||
parentDir.mkdirs()
|
parentDir.mkdirs()
|
||||||
|
|
||||||
@@ -107,13 +119,20 @@ internal data class CommonizerTaskParams(
|
|||||||
commandLineArguments += "-targets"
|
commandLineArguments += "-targets"
|
||||||
commandLineArguments += orderedTargetNames.joinToString(separator = ",")
|
commandLineArguments += orderedTargetNames.joinToString(separator = ",")
|
||||||
|
|
||||||
successPostActions.add { renameDirectory(destinationTmpDir, destinationDir) }
|
successPostActions.add {
|
||||||
failurePostActions.add { renameToTempAndDelete(destinationTmpDir) }
|
renameDirectory(destinationTmpDir, destinationDir)
|
||||||
|
writeSuccess(successMarker)
|
||||||
|
}
|
||||||
|
|
||||||
|
failurePostActions.add {
|
||||||
|
renameToTempAndDelete(destinationTmpDir)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildSubtask(
|
buildSubtask(
|
||||||
destinationDir = destinationDir,
|
destinationDir = destinationDir,
|
||||||
orderedTargetNames = orderedTargetNames
|
orderedTargetNames = orderedTargetNames,
|
||||||
|
successMarker = successMarker
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,11 +165,31 @@ internal data class CommonizerTaskParams(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildSubtask(destinationDir: File, orderedTargetNames: List<String>) = CommonizerSubtaskParams(
|
private fun buildSubtask(
|
||||||
|
destinationDir: File,
|
||||||
|
orderedTargetNames: List<String>,
|
||||||
|
successMarker: File
|
||||||
|
) = CommonizerSubtaskParams(
|
||||||
orderedTargetNames = orderedTargetNames,
|
orderedTargetNames = orderedTargetNames,
|
||||||
resultingLibsDirs = resultingLibsDirs(destinationDir, orderedTargetNames),
|
resultingLibsDirs = resultingLibsDirs(destinationDir, orderedTargetNames),
|
||||||
|
successMarker = successMarker,
|
||||||
destinationDir = destinationDir
|
destinationDir = destinationDir
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private fun successMarker(destinationDir: File) = destinationDir.resolve(SUCCESS_MARKER)
|
||||||
|
private fun isSuccess(successMarker: File) = successMarker.isFile && successMarker.readText() == SUCCESS_MARKER_CONTENT
|
||||||
|
|
||||||
|
private fun writeSuccess(successMarker: File) {
|
||||||
|
if (successMarker.exists()) {
|
||||||
|
when {
|
||||||
|
successMarker.isDirectory -> renameToTempAndDelete(successMarker)
|
||||||
|
isSuccess(successMarker) -> return
|
||||||
|
else -> successMarker.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
successMarker.writeText(SUCCESS_MARKER_CONTENT)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user