Prepare for enabling HMPP by default and migrating the flags (KT-40245)
* Add a new single flag for enabling HMPP:
kotlin.mpp.hierarchicalStructureSupport
When this flag is enabled:
* The old HMPP flags gets enabled, too, for old consumers
* The commonizer gets enabled as well
* An internal flag is set to indicate that the old flags were set by
the plugin
* Add an internal flag that we should flip when HMPP becomes the
default: kotlin.internal.mpp.hierarchicalStructureByDefault
With this flag is enabled:
* All MPP projects will use the composite artifact and
compile metadata with the KLIB compiler
* The compatibility metadata artifact will be gone
* The new HMPP flag is enabled by default
* Add consistency checks for new VS old flags
Issue #KT-40245
This commit is contained in:
committed by
teamcityserver
parent
352c624601
commit
d0f207071c
+68
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.HierarchicalStructureOptInMigrationArtifactContentIT.Mode.*
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.junit.runners.Parameterized
|
||||||
|
import java.util.zip.ZipFile
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@RunWith(Parameterized::class)
|
||||||
|
internal class HierarchicalStructureOptInMigrationArtifactContentIT : BaseGradleIT() {
|
||||||
|
enum class Mode {
|
||||||
|
FLIPPED_DEFAULT, FLIPPED_DISABLE, NON_FLIPPED_DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@Parameterized.Parameters(name = "{0}")
|
||||||
|
@JvmStatic
|
||||||
|
fun params() = Mode.values().map { arrayOf(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameter(0)
|
||||||
|
lateinit var mode: Mode
|
||||||
|
|
||||||
|
@ExperimentalStdlibApi
|
||||||
|
@Test
|
||||||
|
@Suppress("NON_EXHAUSTIVE_WHEN")
|
||||||
|
fun testArtifactFormatAndContent() = with(transformProjectWithPluginsDsl("new-mpp-published")) {
|
||||||
|
projectDir.resolve("gradle.properties").delete()
|
||||||
|
|
||||||
|
build(
|
||||||
|
*buildList {
|
||||||
|
add("clean")
|
||||||
|
add("publish")
|
||||||
|
when (mode) {
|
||||||
|
FLIPPED_DISABLE, FLIPPED_DEFAULT -> add("-Pkotlin.internal.mpp.hierarchicalStructureByDefault=true")
|
||||||
|
}
|
||||||
|
when (mode) {
|
||||||
|
FLIPPED_DISABLE -> add("-Pkotlin.mpp.hierarchicalStructureSupport=false")
|
||||||
|
}
|
||||||
|
}.toTypedArray(),
|
||||||
|
) {
|
||||||
|
assertSuccessful()
|
||||||
|
val metadataJarEntries = ZipFile(
|
||||||
|
projectDir.resolve("../repo/com/example/bar/my-lib-bar/1.0/my-lib-bar-1.0.jar")
|
||||||
|
).use { zip ->
|
||||||
|
zip.entries().asSequence().toList().map { it.name }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode != NON_FLIPPED_DEFAULT) {
|
||||||
|
assertTrue { metadataJarEntries.any { "commonMain" in it } }
|
||||||
|
}
|
||||||
|
|
||||||
|
val hasJvmAndJsMainEntries = metadataJarEntries.any { "jvmAndJsMain" in it }
|
||||||
|
val shouldHaveJvmAndJsMainEntries = when (mode) {
|
||||||
|
FLIPPED_DISABLE, NON_FLIPPED_DEFAULT -> false
|
||||||
|
FLIPPED_DEFAULT -> true
|
||||||
|
}
|
||||||
|
assertEquals(shouldHaveJvmAndJsMainEntries, hasJvmAndJsMainEntries)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+133
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.util.modify
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.junit.runners.Parameterized
|
||||||
|
|
||||||
|
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
|
||||||
|
@RunWith(Parameterized::class)
|
||||||
|
internal class MppFlagsMigrationIT : BaseGradleIT() {
|
||||||
|
internal data class TestCase(
|
||||||
|
var hierarchiesByDefault: Boolean = false,
|
||||||
|
var hierarchiesSupportFlag: Boolean? = null,
|
||||||
|
var granularMetadataFlag: Boolean? = null,
|
||||||
|
var dependencyPropagationFlag: Boolean? = null,
|
||||||
|
var expectedToPass: Boolean = true,
|
||||||
|
var expectedPhraseInOutput: String? = null,
|
||||||
|
) {
|
||||||
|
constructor(configure: TestCase.() -> Unit) : this() {
|
||||||
|
configure()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameter(0)
|
||||||
|
lateinit var testCase: TestCase
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
private val testCases = buildList {
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
granularMetadataFlag = true
|
||||||
|
expectedToPass = true
|
||||||
|
expectedPhraseInOutput = "It is safe to remove the property."
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
granularMetadataFlag = false
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "Multiplatform Hierarchical Structures support is now enabled by default"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
dependencyPropagationFlag = false
|
||||||
|
expectedToPass = true
|
||||||
|
expectedPhraseInOutput = "It is safe to remove the property"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
dependencyPropagationFlag = true
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "Kotlin/Native dependencies commonization is now enabled by default"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
hierarchiesSupportFlag = false
|
||||||
|
granularMetadataFlag = true
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "Conflicting properties"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
hierarchiesSupportFlag = false
|
||||||
|
granularMetadataFlag = false
|
||||||
|
expectedToPass = true
|
||||||
|
expectedPhraseInOutput = "is redundant"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = true
|
||||||
|
hierarchiesSupportFlag = false
|
||||||
|
dependencyPropagationFlag = false
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "Conflicting properties"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = false
|
||||||
|
hierarchiesSupportFlag = false
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "not yet supported"
|
||||||
|
})
|
||||||
|
add(TestCase {
|
||||||
|
hierarchiesByDefault = false
|
||||||
|
hierarchiesSupportFlag = true
|
||||||
|
expectedToPass = false
|
||||||
|
expectedPhraseInOutput = "not yet supported"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "{0}")
|
||||||
|
@JvmStatic
|
||||||
|
fun testCases() = testCases.map { arrayOf(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val testProject by lazy {
|
||||||
|
Project("new-mpp-published").apply {
|
||||||
|
setupWorkingDir()
|
||||||
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
@Test
|
||||||
|
fun doTest() {
|
||||||
|
val args = buildList {
|
||||||
|
with(testCase) {
|
||||||
|
if (hierarchiesByDefault)
|
||||||
|
add("-Pkotlin.internal.mpp.hierarchicalStructureByDefault=true")
|
||||||
|
if (hierarchiesSupportFlag != null)
|
||||||
|
add("-Pkotlin.mpp.hierarchicalStructureSupport=$hierarchiesSupportFlag")
|
||||||
|
if (granularMetadataFlag != null)
|
||||||
|
add("-Pkotlin.mpp.enableGranularSourceSetsMetadata=$granularMetadataFlag")
|
||||||
|
if (dependencyPropagationFlag != null) {
|
||||||
|
add("-Pkotlin.native.enableDependencyPropagation=$dependencyPropagationFlag")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// just run the configuration phase:
|
||||||
|
testProject.build(*args.toTypedArray()) {
|
||||||
|
if (testCase.expectedToPass)
|
||||||
|
assertSuccessful()
|
||||||
|
else
|
||||||
|
assertFailed()
|
||||||
|
|
||||||
|
testCase.expectedPhraseInOutput?.let { assertContains(it, ignoreCase = true) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
-2
@@ -11,6 +11,9 @@ import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW
|
||||||
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsPlugin.Companion.NOWARN_2JS_FLAG
|
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsPlugin.Companion.NOWARN_2JS_FLAG
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty
|
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat
|
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat
|
||||||
@@ -146,10 +149,23 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
get() = booleanProperty("kotlin.android.buildTypeAttribute.keep") ?: false
|
get() = booleanProperty("kotlin.android.buildTypeAttribute.keep") ?: false
|
||||||
|
|
||||||
val enableGranularSourceSetsMetadata: Boolean?
|
val enableGranularSourceSetsMetadata: Boolean?
|
||||||
get() = booleanProperty("kotlin.mpp.enableGranularSourceSetsMetadata")
|
get() = booleanProperty(KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA)
|
||||||
|
|
||||||
|
val hierarchicalStructureSupport: Boolean
|
||||||
|
get() = booleanProperty(KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT) ?: mppHierarchicalStructureByDefault
|
||||||
|
|
||||||
|
val nativeDependencyPropagation: Boolean?
|
||||||
|
get() = booleanProperty(KOTLIN_NATIVE_DEPENDENCY_PROPAGATION)
|
||||||
|
|
||||||
|
var mpp13XFlagsSetByPlugin: Boolean
|
||||||
|
get() = booleanProperty("kotlin.internal.mpp.13X.flags.setByPlugin") ?: false
|
||||||
|
set(value) { project.extensions.extraProperties.set("kotlin.internal.mpp.13X.flags.setByPlugin") { "$value" } }
|
||||||
|
|
||||||
|
val mppHierarchicalStructureByDefault: Boolean
|
||||||
|
get() = booleanProperty("kotlin.internal.mpp.hierarchicalStructureByDefault") ?: false
|
||||||
|
|
||||||
val enableCompatibilityMetadataVariant: Boolean
|
val enableCompatibilityMetadataVariant: Boolean
|
||||||
get() = booleanProperty("kotlin.mpp.enableCompatibilityMetadataVariant") ?: true
|
get() = booleanProperty("kotlin.mpp.enableCompatibilityMetadataVariant") ?: !mppHierarchicalStructureByDefault
|
||||||
|
|
||||||
val enableKotlinToolingMetadataArtifact: Boolean
|
val enableKotlinToolingMetadataArtifact: Boolean
|
||||||
get() = booleanProperty("kotlin.mpp.enableKotlinToolingMetadataArtifact") ?: true
|
get() = booleanProperty("kotlin.mpp.enableKotlinToolingMetadataArtifact") ?: true
|
||||||
@@ -381,6 +397,12 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
localProperties.getProperty(propName)
|
localProperties.getProperty(propName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal object PropertyNames {
|
||||||
|
internal const val KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA = "kotlin.mpp.enableGranularSourceSetsMetadata"
|
||||||
|
internal const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT = "kotlin.mpp.hierarchicalStructureSupport"
|
||||||
|
internal const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation"
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
internal const val KOTLIN_NATIVE_HOME = "kotlin.native.home"
|
internal const val KOTLIN_NATIVE_HOME = "kotlin.native.home"
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
|
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
|
||||||
|
|
||||||
interface KotlinMetadataCompilation<T : KotlinCommonOptions> : KotlinCompilation<T>
|
interface KotlinMetadataCompilation<T : KotlinCommonOptions> : KotlinCompilation<T>
|
||||||
@@ -28,7 +29,7 @@ class KotlinCommonCompilation(
|
|||||||
get() = super.compileKotlinTask as KotlinCompileCommon
|
get() = super.compileKotlinTask as KotlinCompileCommon
|
||||||
|
|
||||||
internal val isKlibCompilation: Boolean
|
internal val isKlibCompilation: Boolean
|
||||||
get() = PropertiesProvider(target.project).enableGranularSourceSetsMetadata == true && !forceCompilationToKotlinMetadata
|
get() = target.project.isKotlinGranularMetadataEnabled && !forceCompilationToKotlinMetadata
|
||||||
|
|
||||||
internal var forceCompilationToKotlinMetadata: Boolean = false
|
internal var forceCompilationToKotlinMetadata: Boolean = false
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -11,7 +11,6 @@ import org.gradle.api.Project
|
|||||||
import org.gradle.api.attributes.Attribute
|
import org.gradle.api.attributes.Attribute
|
||||||
import org.gradle.api.attributes.AttributeContainer
|
import org.gradle.api.attributes.AttributeContainer
|
||||||
import org.gradle.api.file.DuplicatesStrategy
|
import org.gradle.api.file.DuplicatesStrategy
|
||||||
import org.gradle.api.file.FileCollection
|
|
||||||
import org.gradle.api.internal.plugins.DslObject
|
import org.gradle.api.internal.plugins.DslObject
|
||||||
import org.gradle.api.plugins.JavaBasePlugin
|
import org.gradle.api.plugins.JavaBasePlugin
|
||||||
import org.gradle.api.tasks.SourceTask
|
import org.gradle.api.tasks.SourceTask
|
||||||
@@ -26,6 +25,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
|||||||
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
|
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.handleHierarchicalStructureFlagsMigration
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.*
|
import org.jetbrains.kotlin.gradle.plugin.sources.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
|
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
@@ -58,8 +58,6 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
|
|||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.0"))
|
checkGradleCompatibility("the Kotlin Multiplatform plugin", GradleVersion.version("6.0"))
|
||||||
|
|
||||||
project.plugins.apply(JavaBasePlugin::class.java)
|
|
||||||
|
|
||||||
if (PropertiesProvider(project).mppStabilityNoWarn != true) {
|
if (PropertiesProvider(project).mppStabilityNoWarn != true) {
|
||||||
SingleWarningPerBuild.show(
|
SingleWarningPerBuild.show(
|
||||||
project,
|
project,
|
||||||
@@ -69,6 +67,10 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleHierarchicalStructureFlagsMigration(project)
|
||||||
|
|
||||||
|
project.plugins.apply(JavaBasePlugin::class.java)
|
||||||
|
|
||||||
val targetsContainer = project.container(KotlinTarget::class.java)
|
val targetsContainer = project.container(KotlinTarget::class.java)
|
||||||
val kotlinMultiplatformExtension = project.extensions.getByType(KotlinMultiplatformExtension::class.java)
|
val kotlinMultiplatformExtension = project.extensions.getByType(KotlinMultiplatformExtension::class.java)
|
||||||
val targetsFromPreset = TargetFromPresetExtension(kotlinMultiplatformExtension)
|
val targetsFromPreset = TargetFromPresetExtension(kotlinMultiplatformExtension)
|
||||||
|
|||||||
+122
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.plugin.mpp.internal
|
||||||
|
|
||||||
|
import org.gradle.api.GradleException
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.getOrPut
|
||||||
|
|
||||||
|
internal fun handleHierarchicalStructureFlagsMigration(project: Project) {
|
||||||
|
with(PropertiesProvider(project)) {
|
||||||
|
checkHmppFeatureFlagsForConsistency(project)
|
||||||
|
|
||||||
|
if (hierarchicalStructureSupport) {
|
||||||
|
if (project === project.rootProject)
|
||||||
|
project.extensions.extraProperties.getOrPut(PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA) { "true" }
|
||||||
|
project.extensions.extraProperties.getOrPut(PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION) { "false" }
|
||||||
|
PropertiesProvider(project).mpp13XFlagsSetByPlugin = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun PropertiesProvider.checkHmppFeatureFlagsForConsistency(project: Project) {
|
||||||
|
if (mppHierarchicalStructureByDefault) {
|
||||||
|
if (hierarchicalStructureSupport) {
|
||||||
|
if (project === project.rootProject) {
|
||||||
|
when (enableGranularSourceSetsMetadata) {
|
||||||
|
true -> warnGranularMetadataTrueHasNoEffect(project)
|
||||||
|
false -> errorGranularMetadataFalseUnsupported()
|
||||||
|
null -> Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
when (nativeDependencyPropagation) {
|
||||||
|
false -> if (!mpp13XFlagsSetByPlugin) warningDependencyPropagationFalseHasNoEffect(project)
|
||||||
|
true -> errorDependencyPropagationTrueUnsupported()
|
||||||
|
null -> Unit
|
||||||
|
}
|
||||||
|
} else { // hierarchicalStructureSupport is false
|
||||||
|
if (project === project.rootProject) {
|
||||||
|
when (enableGranularSourceSetsMetadata) {
|
||||||
|
true -> errorGranularMetadataTrueConflictsWithNewFlag()
|
||||||
|
false -> warningGranularMetadataFalseRedundantWithNewFlag(project)
|
||||||
|
null -> Unit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mpp13XFlagsSetByPlugin && nativeDependencyPropagation == false)
|
||||||
|
errorDependencyPropagationFalseConflictsWithNewFlag()
|
||||||
|
}
|
||||||
|
} else { // mppHierarchicalStructureByDefault is false
|
||||||
|
if (project.findProperty(PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT) != null)
|
||||||
|
throw GradleException("The property '${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}' is not yet supported.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun errorDependencyPropagationFalseConflictsWithNewFlag() {
|
||||||
|
throw GradleException(
|
||||||
|
"Conflicting properties: '${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}=false' (enabling Kotlin/Native " +
|
||||||
|
"dependencies commonization) " +
|
||||||
|
"and '${PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION}=false'"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun warningGranularMetadataFalseRedundantWithNewFlag(project: Project) {
|
||||||
|
SingleWarningPerBuild.show(
|
||||||
|
project,
|
||||||
|
"The property '${PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA}=false' is redundant with " +
|
||||||
|
"'${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}=false'\n"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun errorGranularMetadataTrueConflictsWithNewFlag() {
|
||||||
|
throw GradleException(
|
||||||
|
"Conflicting properties: '${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}=false' and " +
|
||||||
|
"'${PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA}=true'."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun warningDependencyPropagationFalseHasNoEffect(project: Project) {
|
||||||
|
SingleWarningPerBuild.show(
|
||||||
|
project,
|
||||||
|
"The property '${PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION}=false' has no effect in this and future " +
|
||||||
|
"Kotlin versions, as Kotlin/Native dependency commonization is now enabled by default. " +
|
||||||
|
"It is safe to remove the property.\n"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun errorDependencyPropagationTrueUnsupported() {
|
||||||
|
throw GradleException(
|
||||||
|
"Kotlin/Native dependencies commonization is now enabled by default for all projects with Native-shared code, " +
|
||||||
|
"and the property '${PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION}=true' is not supported anymore. " +
|
||||||
|
"It is possible to temporarily disable Hierarchical Structures support altogether with the following Gradle " +
|
||||||
|
"property:\n\n" +
|
||||||
|
" ${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}=false\n\n" +
|
||||||
|
"If you are facing any issues with shared code and Hierarchical Structures support, please report them " +
|
||||||
|
"at https://kotl.in/issue\n"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun errorGranularMetadataFalseUnsupported() {
|
||||||
|
throw GradleException(
|
||||||
|
"Kotlin Multiplatform Hierarchical Structures support is now enabled by default for all projects, and the " +
|
||||||
|
"property '${PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA}=false' is not supported anymore. " +
|
||||||
|
"If you need to temporarily revert to the old behavior, please use the following Gradle property:\n\n" +
|
||||||
|
" ${PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT}=false\n\n" +
|
||||||
|
"If you are facing any issues with shared code and Hierarchical Structures support, please report them " +
|
||||||
|
"at https://kotl.in/issue"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun warnGranularMetadataTrueHasNoEffect(project: Project) {
|
||||||
|
SingleWarningPerBuild.show(
|
||||||
|
project,
|
||||||
|
"The property '${PropertyNames.KOTLIN_MPP_ENABLE_GRANULAR_SOURCE_SETS_METADATA}=true' has no effect in this and future " +
|
||||||
|
"Kotlin versions, as Hierarchical Structures support is now enabled by default. " +
|
||||||
|
"It is safe to remove the property.\n"
|
||||||
|
)
|
||||||
|
}
|
||||||
+16
-2
@@ -41,8 +41,19 @@ internal const val ALL_COMPILE_METADATA_CONFIGURATION_NAME = "allSourceSetsCompi
|
|||||||
internal const val ALL_RUNTIME_METADATA_CONFIGURATION_NAME = "allSourceSetsRuntimeDependenciesMetadata"
|
internal const val ALL_RUNTIME_METADATA_CONFIGURATION_NAME = "allSourceSetsRuntimeDependenciesMetadata"
|
||||||
|
|
||||||
internal val Project.isKotlinGranularMetadataEnabled: Boolean
|
internal val Project.isKotlinGranularMetadataEnabled: Boolean
|
||||||
get() = project.topLevelExtension is KotlinPm20ProjectExtension ||
|
get() = project.topLevelExtension is KotlinPm20ProjectExtension || with(PropertiesProvider(rootProject)) {
|
||||||
PropertiesProvider(rootProject).enableGranularSourceSetsMetadata == true
|
mppHierarchicalStructureByDefault || // then we want to use KLIB granular compilation & artifacts even if it's just commonMain
|
||||||
|
hierarchicalStructureSupport ||
|
||||||
|
enableGranularSourceSetsMetadata == true
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val Project.shouldCompileIntermediateSourceSetsToMetadata: Boolean
|
||||||
|
get() = project.topLevelExtension is KotlinPm20ProjectExtension || with(PropertiesProvider(rootProject)) {
|
||||||
|
when {
|
||||||
|
!hierarchicalStructureSupport && mppHierarchicalStructureByDefault -> false
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal val Project.isCompatibilityMetadataVariantEnabled: Boolean
|
internal val Project.isCompatibilityMetadataVariantEnabled: Boolean
|
||||||
get() = PropertiesProvider(this).enableCompatibilityMetadataVariant == true
|
get() = PropertiesProvider(this).enableCompatibilityMetadataVariant == true
|
||||||
@@ -569,6 +580,9 @@ internal fun dependsOnClosureWithInterCompilationDependencies(project: Project,
|
|||||||
* Those compilations will be created but the corresponding tasks will be disabled.
|
* Those compilations will be created but the corresponding tasks will be disabled.
|
||||||
*/
|
*/
|
||||||
internal fun getCommonSourceSetsForMetadataCompilation(project: Project): Set<KotlinSourceSet> {
|
internal fun getCommonSourceSetsForMetadataCompilation(project: Project): Set<KotlinSourceSet> {
|
||||||
|
if (!project.shouldCompileIntermediateSourceSetsToMetadata)
|
||||||
|
return setOf(project.multiplatformExtension.sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME))
|
||||||
|
|
||||||
val compilationsBySourceSet: Map<KotlinSourceSet, Set<KotlinCompilation<*>>> =
|
val compilationsBySourceSet: Map<KotlinSourceSet, Set<KotlinCompilation<*>>> =
|
||||||
compilationsBySourceSets(project)
|
compilationsBySourceSets(project)
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -11,10 +11,9 @@ import org.jetbrains.kotlin.commonizer.*
|
|||||||
import org.jetbrains.kotlin.compilerRunner.konanHome
|
import org.jetbrains.kotlin.compilerRunner.konanHome
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.compareVersionNumbers
|
import org.jetbrains.kotlin.gradle.plugin.compareVersionNumbers
|
||||||
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
|
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet
|
import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
@@ -76,7 +75,7 @@ private fun File.listLibraryFiles(): List<File> = listFiles().orEmpty()
|
|||||||
|
|
||||||
|
|
||||||
private val Project.isNativeDependencyPropagationEnabled: Boolean
|
private val Project.isNativeDependencyPropagationEnabled: Boolean
|
||||||
get() = (findProperty("kotlin.native.enableDependencyPropagation") as? String)?.toBoolean() ?: true
|
get() = PropertiesProvider(this).nativeDependencyPropagation ?: true
|
||||||
|
|
||||||
//for reflection call from KotlinCommonizerModelBuilder
|
//for reflection call from KotlinCommonizerModelBuilder
|
||||||
// DO NOT REFACTOR THIS FUNCTION!
|
// DO NOT REFACTOR THIS FUNCTION!
|
||||||
|
|||||||
Reference in New Issue
Block a user