[Gradle] Avoid early reading of Project.buildDir in compilation tasks

#KT-61292 Fixed
This commit is contained in:
Alexander.Likhachev
2023-08-17 15:50:54 +02:00
committed by Space Team
parent 7c5a826fd8
commit 4d1ea3c441
6 changed files with 21 additions and 24 deletions
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.gradle.mpp
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.OS
import kotlin.io.path.absolutePathString
import kotlin.io.path.appendText
import kotlin.io.path.readText
import kotlin.test.assertEquals
@DisplayName("Broken task configuration avoidance doesn't lead to build failures at least with simple setups")
class BrokenLazyConfigurationIT : KGPBaseTest() {
@@ -78,7 +76,6 @@ class BrokenLazyConfigurationIT : KGPBaseTest() {
}
}
@Disabled
@MppGradlePluginTests
@GradleTest
@DisplayName("Changing build directory after task configuration doesn't lead to failures")
@@ -14,6 +14,7 @@ import org.gradle.api.artifacts.Dependency
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.Usage
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.provider.Provider
@@ -135,7 +136,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
)
val interopTask = registerTask<CInteropProcess>(interop.interopProcessingTaskName, listOf(params)) {
it.destinationDir = provider { klibOutputDirectory(compilationInfo).resolve("cinterop") }
it.destinationDir = klibOutputDirectory(compilationInfo).dir("cinterop").map { it.asFile }
it.group = INTEROP_GROUP
it.description = "Generates Kotlin/Native interop library '${interop.name}' " +
"for compilation '${compilation.compilationName}'" +
@@ -390,7 +391,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
"compilation in target '${compilationInfo.targetDisambiguationClassifier}'."
it.enabled = konanTarget.enabledOnCurrentHost
it.destinationDirectory.set(project.klibOutputDirectory(compilationInfo).resolve("klib"))
it.destinationDirectory.set(project.klibOutputDirectory(compilationInfo).dir("klib"))
val propertiesProvider = PropertiesProvider(project)
if (propertiesProvider.useK2 == true) {
it.compilerOptions.useK2.set(true)
@@ -443,9 +444,11 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
private fun Project.klibOutputDirectory(
compilation: KotlinCompilationInfo,
): File {
): DirectoryProperty {
val targetSubDirectory = compilation.targetDisambiguationClassifier?.let { "$it/" }.orEmpty()
return buildDir.resolve("classes/kotlin/$targetSubDirectory${compilation.compilationName}")
return project.objects.directoryProperty().value(
layout.buildDirectory.dir("classes/kotlin/$targetSubDirectory${compilation.compilationName}")
)
}
private fun addCompilerPlugins(compilation: AbstractKotlinNativeCompilation) {
@@ -5,10 +5,7 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.*
import org.gradle.api.logging.Logging
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
@@ -51,7 +48,7 @@ import org.jetbrains.kotlin.gradle.tasks.cleanOutputsAndLocalState as cleanOutpu
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constructor(
objectFactory: ObjectFactory,
workerExecutor: WorkerExecutor
workerExecutor: WorkerExecutor,
) : AbstractKotlinCompileTool<T>(objectFactory),
CompileUsingKotlinDaemonWithNormalization,
UsesBuildMetricsService,
@@ -68,7 +65,8 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
cacheOnlyIfEnabledForKotlin()
}
private val layout = project.layout
@get:Inject
internal abstract val projectLayout: ProjectLayout
@get:Inject
internal abstract val fileSystemOperations: FileSystemOperations
@@ -257,8 +255,8 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
buildMetrics.measure(GradleBuildTime.BACKUP_OUTPUT) {
TaskOutputsBackup(
fileSystemOperations,
layout.buildDirectory,
layout.buildDirectory.dir("snapshot/kotlin/$name"),
projectLayout.buildDirectory,
projectLayout.buildDirectory.dir("snapshot/kotlin/$name"),
outputsToRestore = allOutputFiles() - taskOutputsBackupExcludes.get(),
logger
).also {
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_JS
import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_UNZIPPED_KLIB
import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_ZIPPED_KLIB
import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJsOptionsCompat
import org.jetbrains.kotlin.gradle.utils.getFile
import org.jetbrains.kotlin.gradle.utils.isParentOf
import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.gradle.utils.toPathsArray
@@ -54,7 +55,7 @@ import javax.inject.Inject
abstract class Kotlin2JsCompile @Inject constructor(
override val compilerOptions: KotlinJsCompilerOptions,
objectFactory: ObjectFactory,
workerExecutor: WorkerExecutor
workerExecutor: WorkerExecutor,
) : AbstractKotlinCompile<K2JSCompilerArguments>(objectFactory, workerExecutor),
KotlinCompilationTask<KotlinJsCompilerOptions>,
UsesLibraryFilterCachingService,
@@ -329,7 +330,7 @@ abstract class Kotlin2JsCompile @Inject constructor(
ClasspathChanges.NotAvailableForJSCompiler,
taskBuildCacheableOutputDirectory.get().asFile,
rootProjectDir = rootProjectDir,
buildDir = buildDir,
buildDir = projectLayout.buildDirectory.getFile(),
multiModuleICSettings = multiModuleICSettings,
preciseCompilationResultsBackup = preciseCompilationResultsBackup.get(),
keepIncrementalCompilationCachesInMemory = keepIncrementalCompilationCachesInMemory.get(),
@@ -353,7 +354,6 @@ abstract class Kotlin2JsCompile @Inject constructor(
}
private val rootProjectDir = project.rootDir
private val buildDir = project.buildDir
private fun validateOutputDirectory() {
val outputFile = outputFileProperty.get()
@@ -57,7 +57,7 @@ import javax.inject.Inject
abstract class KotlinCompile @Inject constructor(
final override val compilerOptions: KotlinJvmCompilerOptions,
workerExecutor: WorkerExecutor,
objectFactory: ObjectFactory
objectFactory: ObjectFactory,
) : AbstractKotlinCompile<K2JVMCompilerArguments>(objectFactory, workerExecutor),
K2MultiplatformCompilationTask,
@Suppress("TYPEALIAS_EXPANSION_DEPRECATION") KotlinJvmCompileDsl {
@@ -301,7 +301,6 @@ abstract class KotlinCompile @Inject constructor(
}
private val projectRootDir = project.rootDir
private val buildDir = project.buildDir
override fun callCompilerAsync(
args: K2JVMCompilerArguments,
@@ -313,8 +312,8 @@ abstract class KotlinCompile @Inject constructor(
val gradlePrintingMessageCollector = GradlePrintingMessageCollector(logger, args.allWarningsAsErrors)
val gradleMessageCollector =
GradleErrorMessageCollector(
gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)
)
gradlePrintingMessageCollector, kotlinPluginVersion = getKotlinPluginVersion(logger)
)
val outputItemCollector = OutputItemsCollectorImpl()
val compilerRunner = compilerRunner.get()
@@ -325,7 +324,7 @@ abstract class KotlinCompile @Inject constructor(
classpathChanges = getClasspathChanges(inputChanges),
workingDir = taskBuildCacheableOutputDirectory.get().asFile,
rootProjectDir = projectRootDir,
buildDir = buildDir,
buildDir = projectLayout.buildDirectory.getFile(),
usePreciseJavaTracking = usePreciseJavaTracking,
disableMultiModuleIC = disableMultiModuleIC,
multiModuleICSettings = multiModuleICSettings,
@@ -117,7 +117,7 @@ internal abstract class TestReportService : BuildService<TestReportService.TestR
"${TestReportService::class.java.canonicalName}_${project.path}",
TestReportService::class.java
) { spec ->
spec.parameters.testTasksStateFile.set(project.buildDir.resolve("test-results/kotlin-test-tasks-state.bin"))
spec.parameters.testTasksStateFile.set(project.layout.buildDirectory.file("test-results/kotlin-test-tasks-state.bin"))
}.also { serviceProvider ->
SingleActionPerProject.run(project, UsesTestReportService::class.java.name) {
project.tasks.withType<UsesTestReportService>().configureEach { task ->