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