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