[Gradle] Simplify wiring target compiler options to compilations options

Now it happens as a default postConfigure action in factories for all
KotlinCompilations including external one.

^KT-57292 In Progress
This commit is contained in:
Yahor Berdnikau
2023-08-02 15:30:13 +02:00
committed by Space Team
parent 3a148f97b5
commit 8469b8cbb5
10 changed files with 68 additions and 131 deletions
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.*
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetInclusion
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.DefaultKotlinCompilationDependencyConfigurationsFactory
@@ -46,10 +44,6 @@ class KotlinCommonCompilationFactory internal constructor(
We therefore can create the container inline
*/
compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) },
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationCommonCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinCommonCompilation = target.project.objects.newInstance(
@@ -8,5 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
internal val DefaultKotlinCompilationPostConfigure = KotlinCompilationImplFactory.PostConfigure.composite(
KotlinCompilationRegisterInSourceSetsConfigurator
KotlinCompilationRegisterInSourceSetsConfigurator,
KotlinCompilationCompilerOptionsFromTargetConfigurator
)
@@ -9,14 +9,33 @@ import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.plugin.mpp.DecoratedKotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.moduleNameForCompilation
internal class KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(
private val targetCompilerOptions: KotlinJvmCompilerOptions
) : KotlinCompilationImplFactory.PostConfigure {
internal object KotlinCompilationCompilerOptionsFromTargetConfigurator : KotlinCompilationImplFactory.PostConfigure {
override fun configure(compilation: DecoratedKotlinCompilation<*>) {
val jvmCompilerOptions = compilation.compilerOptions.options as KotlinJvmCompilerOptions
when (val compilationCompilerOptions = compilation.compilerOptions.options) {
is KotlinJvmCompilerOptions -> compilation.configureJvmCompilerOptions(compilationCompilerOptions)
is KotlinJsCompilerOptions -> compilation.configureJsCompilerOptions(compilationCompilerOptions)
is KotlinNativeCompilerOptions -> {
if (compilation.target is KotlinMetadataTarget) {
// Shared native compilation, for example, 'appleMain'
compilation.configureCommonCompilerOptions(compilationCompilerOptions)
} else {
compilation.configureNativeCompilerOptions(compilationCompilerOptions)
}
}
else -> compilation.configureCommonCompilerOptions(compilationCompilerOptions)
}
}
private fun DecoratedKotlinCompilation<*>.configureJvmCompilerOptions(
jvmCompilerOptions: KotlinJvmCompilerOptions
) {
val targetCompilerOptions = requireTargetCompilerOptionsType<KotlinJvmCompilerOptions>()
KotlinJvmCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
jvmCompilerOptions
@@ -24,37 +43,20 @@ internal class KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(
jvmCompilerOptions.moduleName.convention(
moduleNameForCompilation(
compilation.compilationName,
compilationName,
targetCompilerOptions.moduleName
).orElse(compilation.moduleNameForCompilation())
).orElse(moduleNameForCompilation())
)
}
}
internal class KotlinCompilationNativeCompilerOptionsFromTargetConfigurator(
private val targetCompilerOptions: KotlinNativeCompilerOptions
) : KotlinCompilationImplFactory.PostConfigure {
override fun configure(compilation: DecoratedKotlinCompilation<*>) {
val nativeCompilerOptions = compilation.compilerOptions.options as KotlinNativeCompilerOptions
KotlinNativeCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
nativeCompilerOptions
)
private fun DecoratedKotlinCompilation<*>.configureJsCompilerOptions(
jsCompilerOptions: KotlinJsCompilerOptions
) {
// Ignoring legacy JS target
if (target is KotlinWithJavaTarget<*, *>) return
nativeCompilerOptions.moduleName.convention(
moduleNameForCompilation(
compilation.compilationName,
targetCompilerOptions.moduleName
)
)
}
}
val targetCompilerOptions = requireTargetCompilerOptionsType<KotlinJsCompilerOptions>()
internal class KotlinCompilationJsCompilerOptionsFromTargetConfigurator(
private val targetCompilerOptions: KotlinJsCompilerOptions
) : KotlinCompilationImplFactory.PostConfigure {
override fun configure(compilation: DecoratedKotlinCompilation<*>) {
val jsCompilerOptions = compilation.compilerOptions.options as KotlinJsCompilerOptions
KotlinJsCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
jsCompilerOptions
@@ -62,21 +64,46 @@ internal class KotlinCompilationJsCompilerOptionsFromTargetConfigurator(
jsCompilerOptions.moduleName.convention(
moduleNameForCompilation(
compilation.compilationName,
compilationName,
targetCompilerOptions.moduleName
).orElse(compilation.moduleNameForCompilation())
).orElse(moduleNameForCompilation())
)
}
}
internal class KotlinCompilationCommonCompilerOptionsFromTargetConfigurator(
private val targetCompilerOptions: KotlinCommonCompilerOptions
) : KotlinCompilationImplFactory.PostConfigure {
override fun configure(compilation: DecoratedKotlinCompilation<*>) {
val commonCompilerOptions = compilation.compilerOptions.options
KotlinCommonCompilerOptionsHelper.syncOptionsAsConvention(
private fun DecoratedKotlinCompilation<*>.configureNativeCompilerOptions(
nativeCompilerOptions: KotlinNativeCompilerOptions
) {
val targetCompilerOptions = requireTargetCompilerOptionsType<KotlinNativeCompilerOptions>()
KotlinNativeCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
nativeCompilerOptions
)
nativeCompilerOptions.moduleName.convention(
moduleNameForCompilation(
compilationName,
targetCompilerOptions.moduleName
)
)
}
private fun DecoratedKotlinCompilation<*>.configureCommonCompilerOptions(
commonCompilerOptions: KotlinCommonCompilerOptions
) {
KotlinCommonCompilerOptionsHelper.syncOptionsAsConvention(
target.compilerOptions,
commonCompilerOptions
)
}
}
private inline fun <reified T : KotlinCommonCompilerOptions> DecoratedKotlinCompilation<*>.requireTargetCompilerOptionsType(): T {
val targetCompilerOptions = compilation.target.compilerOptions
require(targetCompilerOptions is T) {
"${compilation.compilationName} target ${compilation.target.name}:${compilation.target::class.qualifiedName} has incorrect 'compilerOptions' type " +
"${targetCompilerOptions::class.qualifiedName}"
}
return targetCompilerOptions
}
}
@@ -86,8 +86,6 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
artifactsTaskLocator = artifactsTaskLocator
)
target.wireCompilerOptionsToCompilations(descriptor.platformType)
target.setupApiElements(apiElementsConfiguration)
target.setupApiElements(apiElementsPublishedConfiguration)
target.setupRuntimeElements(runtimeElementsConfiguration)
@@ -148,42 +146,3 @@ private fun ExternalKotlinTargetImpl.setupRuntimeElements(configuration: Configu
private fun ExternalKotlinTargetImpl.setupSourcesElements(configuration: Configuration) {
configuration.configureSourcesPublicationAttributes(this)
}
private fun ExternalKotlinTargetImpl.wireCompilerOptionsToCompilations(platformType: KotlinPlatformType) {
when (platformType) {
KotlinPlatformType.androidJvm,
KotlinPlatformType.jvm -> {
compilations.configureEach {
KotlinJvmCompilerOptionsHelper.syncOptionsAsConvention(
compilerOptions as KotlinJvmCompilerOptions,
it.compilerOptions.options as KotlinJvmCompilerOptions
)
}
}
KotlinPlatformType.wasm,
KotlinPlatformType.js -> {
compilations.configureEach {
KotlinJsCompilerOptionsHelper.syncOptionsAsConvention(
compilerOptions as KotlinJsCompilerOptions,
it.compilerOptions.options as KotlinJsCompilerOptions
)
}
}
KotlinPlatformType.common -> {
compilations.configureEach {
KotlinCommonCompilerOptionsHelper.syncOptionsAsConvention(
compilerOptions,
it.compilerOptions.options
)
}
}
KotlinPlatformType.native -> {
compilations.configureEach {
KotlinNativeCompilerOptionsHelper.syncOptionsAsConvention(
compilerOptions as KotlinNativeCompilerOptions,
it.compilerOptions.options as KotlinNativeCompilerOptions
)
}
}
}
}
@@ -15,8 +15,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsIrCompilationSourceSetsContainerFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsKotlinCompilationDependencyConfigurationsFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJsCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJsCompilerOptionsFactory
@@ -42,10 +40,6 @@ class KotlinJsIrCompilationFactory internal constructor(
sourcesJarTask(compilation, compilation.target.targetName, artifactNameAppendix)
}
},
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationJsCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinJsIrCompilation = target.project.objects.newInstance(
@@ -11,9 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifie
import org.jetbrains.kotlin.gradle.plugin.hierarchy.KotlinSourceSetTreeClassifier.Property
import org.jetbrains.kotlin.gradle.plugin.hierarchy.sourceSetTreeClassifier
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinAndroidCompilationAssociator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.AndroidCompilationSourceSetsContainerFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJvmCompilerOptionsFactory
@@ -38,10 +36,6 @@ class KotlinJvmAndroidCompilationFactory internal constructor(
),
compilationAssociator = KotlinAndroidCompilationAssociator,
compilationSourceSetsContainerFactory = AndroidCompilationSourceSetsContainerFactory(target, variant),
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinJvmAndroidCompilation {
@@ -6,8 +6,6 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinJvmCompilationAssociator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJvmCompilerOptionsFactory
@@ -21,10 +19,6 @@ open class KotlinJvmCompilationFactory internal constructor(
KotlinCompilationImplFactory(
compilerOptionsFactory = KotlinJvmCompilerOptionsFactory,
compilationAssociator = KotlinJvmCompilationAssociator,
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override val itemClass: Class<KotlinJvmCompilation>
@@ -8,13 +8,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions
import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPreConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJsCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJvmCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinJvmCompilationAssociator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationDependencyConfigurationsFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationTaskNamesContainerFactory
@@ -63,16 +58,6 @@ class KotlinWithJavaCompilationFactory<KotlinOptionsType : KotlinCommonOptions,
compilation.compileDependencyFiles = project.filesProvider { javaSourceSet.compileClasspath }
compilation.runtimeDependencyFiles = project.filesProvider { javaSourceSet.runtimeClasspath }
},
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
if (target.platformType == KotlinPlatformType.js || target.platformType == KotlinPlatformType.common) {
// JS/Legacy or Common/legacy (KotlinCommonPlugin) targets uses KotlinWithJavaCompilation,
// but as they are deprecated - we are ignoring it
null
} else {
KotlinCompilationJvmCompilerOptionsFromTargetConfigurator(target.compilerOptions)
}
)
)
return project.objects.newInstance(
@@ -6,8 +6,6 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationNativeCompilerOptionsFromTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetInclusion
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinNativeCompilationAssociator
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
@@ -31,10 +29,6 @@ open class KotlinNativeCompilationFactory internal constructor(
compilationSourceSetInclusion = KotlinCompilationSourceSetInclusion(
KotlinCompilationSourceSetInclusion.NativeAddSourcesToCompileTask
),
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationNativeCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinNativeCompilation {
@@ -7,7 +7,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.*
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetInclusion
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer
@@ -53,10 +52,6 @@ open class KotlinSharedNativeCompilationFactory internal constructor(
We therefore can create the container inline
*/
compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) },
postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite(
DefaultKotlinCompilationPostConfigure,
KotlinCompilationCommonCompilerOptionsFromTargetConfigurator(target.compilerOptions)
)
)
override fun create(name: String): KotlinSharedNativeCompilation {