diff --git a/libraries/stdlib/gradle.properties b/libraries/stdlib/gradle.properties index 7ac86c2a54662..5452accd8975b 100644 --- a/libraries/stdlib/gradle.properties +++ b/libraries/stdlib/gradle.properties @@ -1,4 +1,4 @@ kotlin.internal.suppressGradlePluginErrors=PreHMPPFlagsError kotlin.mpp.enableCompatibilityMetadataVariant=true kotlin.internal.mpp.createDefaultMultiplatformPublications=false -kotlin.internal.archivesTaskOutputAsFriendModule=false \ No newline at end of file +kotlin.build.archivesTaskOutputAsFriendModule=false \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 05974d1be63d2..325d4c3458e92 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -709,6 +709,8 @@ internal class PropertiesProvider private constructor(private val project: Proje val KOTLIN_APPLE_COCOAPODS_EXECUTABLE = property("kotlin.apple.cocoapods.bin") val KOTLIN_APPLE_ALLOW_EMBED_AND_SIGN_WITH_COCOAPODS = property("kotlin.apple.deprecated.allowUsingEmbedAndSignWithCocoaPodsDependencies") val KOTLIN_SWIFT_EXPORT_ENABLED = property("kotlin.swift-export.enabled") + val KOTLIN_NATIVE_ENABLE_KLIBS_CROSSCOMPILATION = property("kotlin.native.enableKlibsCrossCompilation") + val KOTLIN_ARCHIVES_TASK_OUTPUT_AS_FRIEND_ENABLED = property("kotlin.build.archivesTaskOutputAsFriendModule") /** * Internal properties: builds get big non-suppressible warning when such properties are used @@ -728,7 +730,6 @@ internal class PropertiesProvider private constructor(private val project: Proje property("$KOTLIN_INTERNAL_NAMESPACE.incremental.enableUnsafeOptimizationsForMultiplatform") val KOTLIN_KLIBS_KT64115_WORKAROUND_ENABLED = property("$KOTLIN_INTERNAL_NAMESPACE.klibs.enableWorkaroundForKT64115") val KOTLIN_COLLECT_FUS_METRICS_ENABLED = property("$KOTLIN_INTERNAL_NAMESPACE.collectFUSMetrics") - val KOTLIN_ARCHIVES_TASK_OUTPUT_AS_FRIEND_ENABLED = property("$KOTLIN_INTERNAL_NAMESPACE.archivesTaskOutputAsFriendModule") } companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KT69330StableFriendPathsArchiveTaskDependencyTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KT69330StableFriendPathsArchiveTaskDependencyTest.kt new file mode 100644 index 0000000000000..2430653b3bc37 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/KT69330StableFriendPathsArchiveTaskDependencyTest.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.regressionTests + +import org.gradle.api.internal.project.ProjectInternal +import org.jetbrains.kotlin.gradle.dependencyResolutionTests.mavenCentralCacheRedirector +import org.jetbrains.kotlin.gradle.dsl.kotlinJvmExtension +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_ARCHIVES_TASK_OUTPUT_AS_FRIEND_ENABLED +import org.jetbrains.kotlin.gradle.plugin.mpp.decoratedInstance +import org.jetbrains.kotlin.gradle.util.* +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class KT69330StableFriendPathsArchiveTaskDependencyTest { + @Test + fun `test KT-69330 - Task dependency is created so friendPaths are stable at compile time`() { + val project = setupProject() + + assertTrue(hasTestJarDependencyInTest(project), "Expected that test jar is part of the generated friendPath") + + project.tasks.getByName("compileTestKotlin").assertDependsOn(project.tasks.getByName("jar")) + } + + + @Test + fun `test KT-69330 - archivesTaskOutputAsFriendModule=false disables the generation of friendPaths with associated archive`() { + val project = setupProject() + + project.propertiesExtension[KOTLIN_ARCHIVES_TASK_OUTPUT_AS_FRIEND_ENABLED] = "false" + + assertFalse(hasTestJarDependencyInTest(project), "Expected that test jar is not a part of the generated friendPath") + + project.tasks.getByName("compileTestKotlin").assertNotDependsOn(project.tasks.getByName("jar")) + } + + private fun setupProject(): ProjectInternal { + val project = buildProject() + project.plugins.apply("java-library") + project.applyKotlinJvmPlugin() + project.repositories.mavenLocal() + project.repositories.mavenCentralCacheRedirector() + return project + } + + private fun hasTestJarDependencyInTest(project: ProjectInternal): Boolean { + val testCompilationImpl = project.kotlinJvmExtension.target.compilations.getByName("test").decoratedInstance.compilation + return testCompilationImpl.friendPaths.any { + it.files.any { file -> + file.invariantSeparatorsPath.endsWith("build/libs/test.jar") + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/assertions.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/assertions.kt index 6839e53a397ba..f5f31cf1714f1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/assertions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/assertions.kt @@ -23,6 +23,12 @@ fun Task.assertDependsOn(other: Task) { } } +fun Task.assertNotDependsOn(other: Task) { + if (isDependsOn(other)) { + fail("Expected ${this.path} not to depend on ${other.path}") + } +} + fun Task.assertNoCircularTaskDependencies() { data class TaskAndDependants( val task: Task,