[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.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")
|
||||||
|
|||||||
+7
-4
@@ -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) {
|
||||||
|
|||||||
+6
-8
@@ -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 {
|
||||||
|
|||||||
+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_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()
|
||||||
|
|||||||
+4
-5
@@ -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,
|
||||||
|
|||||||
+1
-1
@@ -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 ->
|
||||||
|
|||||||
Reference in New Issue
Block a user