From d2c6489de9d1d04df2c55158f3cd3fba4dedc277 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 13 Apr 2022 13:33:11 +0200 Subject: [PATCH] [Gradle] Mark tasks that not compatible with configuration cache Gradle 7.4 offers new API that allow to exclude task configuration from being stored in Configuration Cache. GCC should be supported in further releases. * KotlinNativeCompile -- KT-43293 * GenerateProjectStructureMetadata and TransformKotlinGranularMetadata -- KT-49933 cherry-picked from 7bdde5f4c025f2f55c0038a8d58e0ea78a0ff151 ^KT-51946 Verification Pending --- .../kotlin/gradle/HierarchicalMppIT.kt | 36 +++++++++++++++++++ .../build.gradle.kts | 24 +++++++++++++ .../lib/build.gradle.kts | 18 ++++++++++ .../lib/src/commonMain/kotlin/Common.kt | 3 ++ .../settings.gradle.kts | 2 ++ .../src/commonMain/kotlin/Common.kt | 3 ++ .../mpp/GenerateProjectStructureMetadata.kt | 6 ++++ .../mpp/TransformKotlinGranularMetadata.kt | 5 +++ .../targets/native/tasks/KotlinNativeTasks.kt | 4 +++ .../kotlin/gradle/utils/configurationCache.kt | 15 +++++++- 10 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/src/commonMain/kotlin/Common.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/src/commonMain/kotlin/Common.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt index 0b1dc2300c2..f01bca8b8a5 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt @@ -717,6 +717,42 @@ class HierarchicalMppIT : KGPBaseTest() { } } + @GradleTest + @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_4, maxVersion = TestVersions.Gradle.G_7_4) + @DisplayName("KT-51946: Temporarily mark HMPP tasks as notCompatibleWithConfigurationCache for Gradle 7.4") + fun testHmppTasksAreNotIncludedInGradleConfigurationCache(gradleVersion: GradleVersion, @TempDir tempDir: Path) { + with(project("hmppGradleConfigurationCache", gradleVersion = gradleVersion, localRepoDir = tempDir)) { + val options = buildOptions.copy(configurationCache = true, configurationCacheProblems = BaseGradleIT.ConfigurationCacheProblems.FAIL) + + build(":lib:publish") { + assertTasksExecuted(":lib:publish") + } + + build("clean", "assemble", buildOptions = options) { + assertTasksExecuted( + ":generateProjectStructureMetadata", + ":transformCommonMainDependenciesMetadata" + ) + assertOutputContains( + """Task `:generateProjectStructureMetadata` of type `.+`: invocation of 'Task\.project' at execution time is unsupported""" + .toRegex() + ) + assertOutputContains( + """Task `:transformCommonMainDependenciesMetadata` of type `.+`: invocation of 'Task.project' at execution time is unsupported""" + .toRegex() + ) + } + + build("clean", "assemble", buildOptions = options) { + assertOutputContains("Configuration cache entry discarded") + assertTasksExecuted( + ":generateProjectStructureMetadata", + ":transformCommonMainDependenciesMetadata" + ) + } + } + } + private fun TestProject.testDependencyTransformations( subproject: String? = null, check: BuildResult.(reports: Iterable) -> Unit diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/build.gradle.kts new file mode 100644 index 00000000000..270be58937a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + kotlin("multiplatform") +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + maven("") + } +} + +kotlin { + jvm() + linuxX64() + + sourceSets { + val commonMain by getting { + dependencies { + implementation("test:lib:1.0") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/build.gradle.kts new file mode 100644 index 00000000000..6ed2385d078 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + kotlin("multiplatform") + `maven-publish` +} + +kotlin { + jvm() + linuxX64() +} + +group = "test" +version = "1.0" + +publishing { + repositories { + maven("") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/src/commonMain/kotlin/Common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/src/commonMain/kotlin/Common.kt new file mode 100644 index 00000000000..9bd2881abbc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/lib/src/commonMain/kotlin/Common.kt @@ -0,0 +1,3 @@ +package com.example + +fun commonMainLib() = "commonMainLib" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/settings.gradle.kts new file mode 100644 index 00000000000..ec8f2b4d5cc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "hmppGradleConfigurationCache" +include("lib") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/src/commonMain/kotlin/Common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/src/commonMain/kotlin/Common.kt new file mode 100644 index 00000000000..8fc8c698596 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hmppGradleConfigurationCache/src/commonMain/kotlin/Common.kt @@ -0,0 +1,3 @@ +package com.example + +fun commonMainApp() = commonMainLib() + "commonMainApp" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt index 5b0915a16f2..df8a83e0d94 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt @@ -10,9 +10,15 @@ import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction +import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCache import java.io.File open class GenerateProjectStructureMetadata : DefaultTask() { + + init { + notCompatibleWithConfigurationCache("Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info") + } + @get:Internal internal lateinit var lazyKotlinProjectStructureMetadata: Lazy diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt index fd735d0eb57..563334f727c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/TransformKotlinGranularMetadata.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigur import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvider import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies import org.jetbrains.kotlin.gradle.utils.getValue +import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCache import java.io.File import javax.inject.Inject @@ -28,6 +29,10 @@ open class TransformKotlinGranularMetadata val kotlinSourceSet: KotlinSourceSet ) : DefaultTask() { + init { + notCompatibleWithConfigurationCache("Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info") + } + @get:OutputDirectory val outputsDir: File by project.provider { project.buildDir.resolve("kotlinSourceSetMetadata/${kotlinSourceSet.name}") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index bbca57bec76..a901cfddee9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -313,6 +313,10 @@ constructor( ) : AbstractKotlinNativeCompile, StubK2NativeCompilerArguments>(objectFactory), KotlinCompile { + init { + notCompatibleWithConfigurationCache("Task $name does not support Gradle Configuration Cache. Check KT-43293 for more info") + } + @get:Input override val outputKind = LIBRARY diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt index 315afc519b9..1e7debf2e9b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.Project +import org.gradle.api.Task import org.gradle.api.invocation.Gradle internal fun isConfigurationCacheAvailable(gradle: Gradle) = @@ -25,4 +26,16 @@ internal fun Project.getSystemProperty(key: String): String? { } internal fun unavailableValueError(propertyName: String): Nothing = - error("'$propertyName' should be available at configuration time but unavailable on configuration cache reuse") \ No newline at end of file + error("'$propertyName' should be available at configuration time but unavailable on configuration cache reuse") + +fun Task.notCompatibleWithConfigurationCache(reason: String) { + if (!isGradleVersionAtLeast(7, 4)) return + try { + val taskClass = Task::class.java + val method = taskClass.getMethod("notCompatibleWithConfigurationCache", String::class.java) + + method.invoke(this, reason) + } catch (e: ReflectiveOperationException) { + logger.warn("Can't mark task $this as notCompatibleWithConfigurationCache due to reflection issue", e) + } +} \ No newline at end of file