[Gradle] Avoid early reading of Project.buildDir in compilation tasks
#KT-61292 Fixed
This commit is contained in:
committed by
Space Team
parent
7c5a826fd8
commit
4d1ea3c441
-3
@@ -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")
|
||||
|
||||
+7
-4
@@ -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) {
|
||||
|
||||
+6
-8
@@ -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 {
|
||||
|
||||
+3
-3
@@ -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()
|
||||
|
||||
+4
-5
@@ -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,
|
||||
|
||||
+1
-1
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user