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 190b84277cc..0d418413b2a 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
@@ -1152,6 +1152,36 @@ open class HierarchicalMppIT : KGPBaseTest() {
}
}
+ @GradleTest
+ @DisplayName("It should be possible to disable default publications for stdlib and other kotlin libraries")
+ fun `test disable default publications`(gradleVersion: GradleVersion, @TempDir tempDir: Path) {
+ project("mppCustomPublicationLayout", gradleVersion = gradleVersion, localRepoDir = tempDir) {
+ build(":libWithCustomLayout:publishKotlinPublicationToMavenRepository") {
+ listOf("jvm.jar", "linuxArm64.klib", "linuxX64.klib")
+ .map { tempDir.resolve("test/libWithCustomLayout/1.0/libWithCustomLayout-1.0-$it") }
+ .forEach { if (!it.exists()) fail("Artifact $it does not exist") }
+ }
+
+ build(":libWithDefaultLayout:publish") {
+ val pom = tempDir.resolve("test/libWithDefaultLayout-jvm/1.0/libWithDefaultLayout-jvm-1.0.pom").readText()
+ val expectedDependency = """
+ |
+ | test
+ | libWithCustomLayout
+ | 1.0
+ | compile
+ |
+ """.trimMargin()
+
+ if (expectedDependency !in pom) {
+ fail("Expected to find:\n$expectedDependency\nin pom file:\n$pom")
+ }
+ }
+
+ build(":app:assemble")
+ }
+ }
+
private fun TestProject.testDependencyTransformations(
subproject: String? = null,
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts
new file mode 100644
index 00000000000..c47a9f442b2
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts
@@ -0,0 +1,24 @@
+plugins {
+ kotlin("multiplatform")
+}
+
+repositories {
+ maven("")
+}
+
+
+kotlin {
+ targetHierarchy.default()
+
+ jvm()
+ linuxX64()
+ linuxArm64()
+
+ sourceSets {
+ commonMain {
+ dependencies {
+ api("test:libWithDefaultLayout:1.0")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt
new file mode 100644
index 00000000000..5ce0f75b1bb
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt
@@ -0,0 +1,6 @@
+package app
+
+fun app() {
+ lib.libWithDefaultLayout()
+ lib.libWithCustomLayout()
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts
new file mode 100644
index 00000000000..edb5d3e9a30
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts
@@ -0,0 +1,10 @@
+plugins {
+ kotlin("multiplatform") apply false
+}
+
+allprojects {
+ repositories {
+ mavenLocal()
+ mavenCentral()
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts
new file mode 100644
index 00000000000..e68b4e44fd1
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts
@@ -0,0 +1,45 @@
+plugins {
+ kotlin("multiplatform")
+ `maven-publish`
+}
+
+group = "test"
+version = "1.0"
+
+kotlin {
+ targetHierarchy.default()
+
+ jvm()
+ linuxX64()
+ linuxArm64()
+}
+
+// Gradle magical spell to access SoftwareComponentFactory
+abstract class SoftwareComponentFactoryProvider @Inject constructor(
+ val softwareComponentFactory: SoftwareComponentFactory
+)
+val softwareComponentFactoryProvider = project.objects.newInstance()
+val customComponent = softwareComponentFactoryProvider.softwareComponentFactory.adhoc("customKotlin")
+
+afterEvaluate {
+ kotlin.targets.all {
+ val configuration = configurations.getByName(apiElementsConfigurationName)
+ configuration.artifacts.forEach {
+ it as ConfigurablePublishArtifact
+ it.classifier = targetName
+ }
+ customComponent.addVariantsFromConfiguration(configuration) {}
+ }
+}
+
+publishing {
+ repositories {
+ maven("")
+ }
+
+ publications {
+ create("kotlin") {
+ from(customComponent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties
new file mode 100644
index 00000000000..fae7a15540a
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties
@@ -0,0 +1 @@
+kotlin.internal.mpp.createDefaultMultiplatformPublications=false
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt
new file mode 100644
index 00000000000..38aafe2cf1f
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt
@@ -0,0 +1,6 @@
+package lib
+
+fun libWithCustomLayout() {
+
+}
+
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts
new file mode 100644
index 00000000000..da7769933fd
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts
@@ -0,0 +1,33 @@
+plugins {
+ kotlin("multiplatform")
+ `maven-publish`
+}
+
+group = "test"
+version = "1.0"
+
+repositories {
+ maven("")
+}
+
+kotlin {
+ targetHierarchy.default()
+
+ jvm()
+ linuxX64()
+ linuxArm64()
+
+ sourceSets {
+ commonMain {
+ dependencies {
+ api(project(":libWithCustomLayout"))
+ }
+ }
+ }
+}
+
+publishing {
+ repositories {
+ maven("")
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt
new file mode 100644
index 00000000000..ac03529b7df
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt
@@ -0,0 +1,6 @@
+package lib
+
+fun libWithDefaultLayout() {
+ libWithCustomLayout()
+}
+
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts
new file mode 100644
index 00000000000..c48317bf4a6
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts
@@ -0,0 +1,5 @@
+include(
+ ":libWithDefaultLayout",
+ ":libWithCustomLayout",
+ ":app"
+)
\ 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 06ea89d5143..65a12b2e6de 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
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_ABI_SNAPSHOT
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_COMPILER_KEEP_INCREMENTAL_COMPILATION_CACHES_IN_MEMORY
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP
+import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_JS_KARMA_BROWSERS
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_GRADLE_PLUGIN_COMPATIBILITY_NO_WARN
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN
@@ -509,6 +510,9 @@ internal class PropertiesProvider private constructor(private val project: Proje
val suppressExperimentalICOptimizationsWarning: Boolean
get() = booleanProperty(KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING) ?: false
+ val createDefaultMultiplatformPublications: Boolean
+ get() = booleanProperty(KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS) ?: true
+
/**
* Retrieves a comma-separated list of browsers to use when running karma tests for [target]
* @see KOTLIN_JS_KARMA_BROWSERS
@@ -594,6 +598,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
const val KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP = "kotlin.compiler.preciseCompilationResultsBackup"
const val KOTLIN_COMPILER_KEEP_INCREMENTAL_COMPILATION_CACHES_IN_MEMORY = "kotlin.compiler.keepIncrementalCompilationCachesInMemory"
const val KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING = "kotlin.compiler.suppressExperimentalICOptimizationsWarning"
+ const val KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS = "kotlin.internal.mpp.createDefaultMultiplatformPublications"
}
companion object {
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt
index 3613a2cb66f..21612f8ecb1 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
+import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
@@ -28,9 +29,11 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnab
import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataTask
internal fun configurePublishingWithMavenPublish(project: Project) = project.pluginManager.withPlugin("maven-publish") {
- project.extensions.configure(PublishingExtension::class.java) { publishing ->
- createRootPublication(project, publishing)
- createTargetPublications(project, publishing)
+ if (project.kotlinPropertiesProvider.createDefaultMultiplatformPublications) {
+ project.extensions.configure(PublishingExtension::class.java) { publishing ->
+ createRootPublication(project, publishing)
+ createTargetPublications(project, publishing)
+ }
}
project.components.add(project.multiplatformExtension.rootSoftwareComponent)
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt
index 8b8c059154d..9dedd13f6eb 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent
+import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsageContext.MavenScope
import org.jetbrains.kotlin.gradle.utils.getValue
@@ -152,6 +153,10 @@ private fun associateDependenciesWithActualModuleDependencies(
val dependencyProjectKotlinExtension = dependencyProject.multiplatformExtensionOrNull
?: return@associate noMapping
+ // Non-default publication layouts are not supported for pom rewriting
+ if (!dependencyProject.kotlinPropertiesProvider.createDefaultMultiplatformPublications)
+ return@associate noMapping
+
val resolved = resolvedDependencies[Triple(dependency.group!!, dependency.name, dependency.version!!)]
?: return@associate noMapping