diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppCompositeBuildIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppCompositeBuildIT.kt index 5a94fc3b655..2f5c3dc1b5a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppCompositeBuildIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/MppCompositeBuildIT.kt @@ -364,4 +364,14 @@ class MppCompositeBuildIT : KGPBaseTest() { } } } + + @GradleTest + @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_0) + fun `test sample7`(gradleVersion: GradleVersion) { + val producer = project("mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild", gradleVersion) + project("mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/consumerBuild", gradleVersion, defaultBuildOptions) { + settingsGradleKts.toFile().replaceText("", producer.projectPath.toUri().path) + build("projects") + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/consumerBuild/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/consumerBuild/settings.gradle.kts new file mode 100644 index 00000000000..606ba488a50 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/consumerBuild/settings.gradle.kts @@ -0,0 +1,7 @@ +pluginManagement { + includeBuild("") +} + +plugins { + id("org.jetbrains.example.gradle.plugin") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/build.gradle.kts new file mode 100644 index 00000000000..f501f90f327 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + `java-gradle-plugin` + kotlin("jvm") +} + +repositories { + mavenLocal() + mavenCentral() +} + +gradlePlugin { + plugins { + create("exampleGradlePlugin") { + id = "org.jetbrains.example.gradle.plugin" + implementationClass = "ExampleGradlePlugin" + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/src/main/kotlin/ExampleGradlePlugin.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/src/main/kotlin/ExampleGradlePlugin.kt new file mode 100644 index 00000000000..b1e563f29d0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/example-gradle-plugin/src/main/kotlin/ExampleGradlePlugin.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2023 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. + */ + +import org.gradle.api.Plugin +import org.gradle.api.initialization.Settings + +class ExampleGradlePlugin : Plugin { + override fun apply(target: Settings) { + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/multiplatform-subproject/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/multiplatform-subproject/build.gradle.kts new file mode 100644 index 00000000000..72c2b4b815e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/multiplatform-subproject/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + mavenCentral() +} + +kotlin { + jvm() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/settings.gradle.kts new file mode 100644 index 00000000000..3c9421d4904 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mpp-composite-build/sample7-KT-59863-pluginManagement.includeBuild/producerBuild/settings.gradle.kts @@ -0,0 +1 @@ +include("example-gradle-plugin", "multiplatform-subproject") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index 658829bb44f..d05bc7c285f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -10,11 +10,11 @@ import com.google.gson.JsonObject import com.google.gson.JsonParser import com.google.gson.stream.JsonWriter import org.gradle.api.Project +import org.gradle.api.plugins.ExtensionAware import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope @@ -419,10 +419,12 @@ internal object GlobalProjectStructureMetadataStorage { fun propertyName(buildName: String, projectPath: String) = "$propertyPrefix.$buildName.path.$projectPath" fun registerProjectStructureMetadata(project: Project, metadataProvider: () -> KotlinProjectStructureMetadata) { - project.compositeBuildRootProject.extensions.extraProperties.set( - propertyName(project.currentBuildId().name, project.path), - { metadataProvider().toJson() } - ) + project.compositeBuildRootProject { + (it as ExtensionAware).extensions.extraProperties.set( + propertyName(project.currentBuildId().name, project.path), + { metadataProvider().toJson() } + ) + } } fun getProjectStructureMetadataProvidersFromAllGradleBuilds(project: Project): Map> { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt index 9007108a16c..98e3c17bab4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleUtils.kt @@ -17,7 +17,13 @@ import kotlin.reflect.KClass val Gradle.projectCacheDir get() = startParameter.projectCacheDir ?: this.rootProject.projectDir.resolve(".gradle") -internal val Project.compositeBuildRootProject: Project get() = generateSequence(project.gradle) { it.parent }.last().rootProject +internal val Project.compositeBuildRootGradle: Gradle get() = generateSequence(project.gradle) { it.parent }.last() +internal val Project.compositeBuildRootProject: Project get() = compositeBuildRootGradle.rootProject + +/** + * Run block function on root project of the root build in composite build only when a root project becomes available + */ +internal fun Project.compositeBuildRootProject(block: (Project) -> Unit) = compositeBuildRootGradle.rootProject(block) internal fun , P : BuildServiceParameters> Gradle.registerClassLoaderScopedBuildService( serviceClass: KClass,