diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt index d116e233a8d..dc207598bb1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationCacheIT.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.gradle.report.BuildReportType import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.konan.target.HostManager import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path @DisplayName("Configuration cache") class ConfigurationCacheIT : AbstractConfigurationCacheIT() { @@ -126,14 +128,23 @@ class ConfigurationCacheIT : AbstractConfigurationCacheIT() { maxVersion = TestVersions.Gradle.G_8_1 ) @GradleTest - fun testCommonizer(gradleVersion: GradleVersion) { + fun testCommonizer(gradleVersion: GradleVersion, @TempDir konanHome: Path) { project("native-configuration-cache", gradleVersion) { - // results of :commonizeNativeDistribution is not cleanable so just check if it works with configuration cache on first run build( ":commonizeNativeDistribution", ) { assertOutputContains("0 problems were found storing the configuration cache.") } + + // Override kotlin native home location to be able to run clean native distribution commonization task + // since by default it is global location on host + val buildOptions = defaultBuildOptions.copy( + freeArgs = listOf("-Porg.jetbrains.kotlin.native.home=$konanHome") + ) + build(":cleanNativeDistributionCommonization", buildOptions = buildOptions) { + assertOutputContains("0 problems were found storing the configuration cache.") + } + testConfigurationCacheOf(":lib:commonizeCInterop") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt index c056584722c..b85d22c4530 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt @@ -8,6 +8,10 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.file.FileSystemOperations +import org.gradle.api.provider.Property +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.compilerRunner.maybeCreateCommonizerClasspathConfiguration import org.jetbrains.kotlin.gradle.internal.isInIdeaSync @@ -18,6 +22,8 @@ import org.jetbrains.kotlin.gradle.plugin.ide.ideaImportDependsOn import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask +import java.io.File +import javax.inject.Inject internal val Project.isCInteropCommonizationEnabled: Boolean get() = PropertiesProvider(this).enableCInteropCommonization @@ -140,7 +146,7 @@ internal val Project.commonizeNativeDistributionTask: TaskProvider? +internal val Project.cleanNativeDistributionCommonizerTask: TaskProvider? get() { val commonizeNativeDistributionTask = commonizeNativeDistributionTask ?: return null return rootProject.locateOrRegisterTask( @@ -149,15 +155,25 @@ internal val Project.cleanNativeDistributionCommonizerTask: TaskProvider - val files = commonizerDirectory.get().listFiles().orEmpty().toSet() - lockFile - delete(*files.toTypedArray()) - } - } + commonizerDirectory.set(commonizeNativeDistributionTask.map { it.rootOutputDirectory }) } ) } + +internal abstract class CleanNativeDistributionCommonizerTask : DefaultTask() { + @get:Inject + abstract val fileSystemOperations: FileSystemOperations + + @get:OutputDirectory + abstract val commonizerDirectory: Property + + @TaskAction + fun action() { + NativeDistributionCommonizerLock(commonizerDirectory.get()).withLock { lockFile -> + val files = commonizerDirectory.get().listFiles().orEmpty().toSet() - lockFile + fileSystemOperations.delete { + it.delete(files) + } + } + } +}