[Gradle] Improve NativeDistributionCommonizerTask's cold startup performance

This is done by removing support for Gradle's UP-TO-DATE checker
in favour of our own 'NativeDistributionCommonizationCache'
This commit is contained in:
sebastian.sellmair
2021-08-26 21:56:47 +02:00
committed by Space
parent e802ef27f1
commit ae88689e58
2 changed files with 19 additions and 43 deletions
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.LogLevel.INFO
import org.gradle.internal.os.OperatingSystem
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.gradle.internals.DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX
import org.jetbrains.kotlin.gradle.util.reportSourceSetCommonizerDependencies
import org.jetbrains.kotlin.incremental.testingUtils.assertEqualDirectories
import org.jetbrains.kotlin.konan.target.HostManager
@@ -38,9 +37,9 @@ class CommonizerIT : BaseGradleIT() {
assertSuccessful()
}
build("commonize", "--rerun-tasks", "-Pkotlin.mpp.enableNativeDistributionCommonizationCache=true") {
build("commonize", "-Pkotlin.mpp.enableNativeDistributionCommonizationCache=true") {
assertTasksExecuted(":commonizeNativeDistribution")
assertContains("Native Distribution Commonization: Cache hit")
assertNativeDistributionCommonizationCacheHit()
assertContains("Native Distribution Commonization: All available targets are commonized already")
assertContains("Native Distribution Commonization: Lock acquired")
assertContains("Native Distribution Commonization: Lock released")
@@ -48,7 +47,7 @@ class CommonizerIT : BaseGradleIT() {
assertSuccessful()
}
build("commonize", "--rerun-tasks", "-Pkotlin.mpp.enableNativeDistributionCommonizationCache=false") {
build("commonize", "-Pkotlin.mpp.enableNativeDistributionCommonizationCache=false") {
assertTasksExecuted(":commonizeNativeDistribution")
assertContains("Native Distribution Commonization: Cache disabled")
assertContains(commonizerOutput)
@@ -69,7 +68,7 @@ class CommonizerIT : BaseGradleIT() {
}
build(":commonize") {
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksUpToDate(":cinteropCurlTargetA")
assertTasksUpToDate(":cinteropCurlTargetB")
assertTasksUpToDate(":commonizeCInterop")
@@ -81,7 +80,7 @@ class CommonizerIT : BaseGradleIT() {
buildGradleKts.writeText(originalBuildGradleKtsContent.replace("curl", "curl2"))
build(":commonize") {
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksExecuted(":cinteropCurl2TargetA")
assertTasksExecuted(":cinteropCurl2TargetB")
assertTasksExecuted(":commonizeCInterop")
@@ -90,7 +89,7 @@ class CommonizerIT : BaseGradleIT() {
buildGradleKts.writeText(originalBuildGradleKtsContent.lineSequence().filter { "curl" !in it }.joinToString("\n"))
build(":commonize") {
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksNotExecuted(":cinteropCurlTargetA")
assertTasksNotExecuted(":cinteropCurlTargetB")
assertSuccessful()
@@ -116,7 +115,7 @@ class CommonizerIT : BaseGradleIT() {
}
build(":commonize", "-Pkotlin.mpp.enableCInteropCommonization=true") {
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksExecuted(":cinteropCurlTargetA")
assertTasksExecuted(":cinteropCurlTargetB")
assertTasksExecuted(":commonizeCInterop")
@@ -124,7 +123,7 @@ class CommonizerIT : BaseGradleIT() {
}
build(":commonize", "-Pkotlin.mpp.enableCInteropCommonization=false") {
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksNotExecuted(":cinteropCurlTargetA")
assertTasksNotExecuted(":cinteropCurlTargetB")
assertTasksNotExecuted(":commonizeCInterop")
@@ -251,7 +250,7 @@ class CommonizerIT : BaseGradleIT() {
assertSuccessful()
assertTasksUpToDate(":cinteropWithPosixTargetA")
assertTasksUpToDate(":cinteropWithPosixTargetB")
assertTasksUpToDate(":commonizeNativeDistribution")
assertNativeDistributionCommonizationCacheHit()
assertTasksUpToDate(":commonizeCInterop")
}
}
@@ -520,7 +519,7 @@ class CommonizerIT : BaseGradleIT() {
build(":assemble", testSourceSetsDependingOnMainParameter) {
assertTestSourceSetsDependingOnMainParameter()
assertSuccessful()
assertTasksUpToDate(":commonizeNativeDistribution")
assertContains("Native Distribution Commonization: Cache hit")
assertTasksUpToDate(":commonizeCInterop")
}
@@ -637,6 +636,10 @@ class CommonizerIT : BaseGradleIT() {
}
}
}
private fun CompiledProject.assertNativeDistributionCommonizationCacheHit() {
assertContains("Native Distribution Commonization: Cache hit")
}
}
private data class TargetSubstitution(val value: String, val isCompilable: Boolean, val isExecutable: Boolean) {
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.tasks.*
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.resolveCommonizedDirectory
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
@@ -18,9 +21,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMON_LIBS_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR
import java.io.File
import java.net.URLEncoder
@@ -32,41 +33,13 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
internal val commonizerTargets: Set<SharedCommonizerTarget>
get() = project.getAllCommonizerTargets()
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:IgnoreEmptyDirectories
@get:InputDirectory
@Suppress("unused") // Only for up-to-date checker. The directory with the original common libs.
val originalCommonLibrariesDirectory = konanHome
.resolve(KONAN_DISTRIBUTION_KLIB_DIR)
.resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR)
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:IgnoreEmptyDirectories
@get:InputDirectory
@Suppress("unused") // Only for up-to-date checker. The directory with the original platform libs.
val originalPlatformLibrariesDirectory = konanHome
.resolve(KONAN_DISTRIBUTION_KLIB_DIR)
.resolve(KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR)
@get:OutputDirectories
@Suppress("unused") // Only for up-to-date checker.
@get:Internal
val outputDirectories: Set<File>
get() {
val rootOutputDirectory = getRootOutputDirectory()
return commonizerTargets.map { target -> resolveCommonizedDirectory(rootOutputDirectory, target) }.toSet()
}
/*
Ensures that only one CommonizerTask can run at a time.
This is necessary because of the success-marker mechanism of this task.
This is a phantom file: No one has the intention to actually create this output file.
However, telling Gradle that all those tasks rely on the same output file will enforce
non-parallel execution.
*/
@get:OutputFile
@Suppress("unused")
val taskMutex: File = project.rootProject.file(".commonizer-phantom-output")
@get:Internal
internal val commonizerRunner = KotlinNativeCommonizerToolRunner(project)