From c67f80e1f394cf17712cd36feb116dc44d323358 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 1 Feb 2022 18:00:01 +0400 Subject: [PATCH] Map Kotlin/Native compilation to the supported-platform KPM variants --- .../gradle/plugin/KotlinTargetConfigurator.kt | 4 +- .../plugin/mpp/GradleProjectModuleBuilder.kt | 5 +- .../gradle/plugin/mpp/kotlinTargetPresets.kt | 7 +- .../plugin/mpp/pm20/KotlinJvmVariant.kt | 42 +----------- .../plugin/mpp/pm20/KotlinNativeVariant.kt | 17 ++++- .../mpp/pm20/KpmAwareTargetConfigurator.kt | 68 +++++++++++++++++++ .../plugin/mpp/pm20/abstractVariants.kt | 1 + 7 files changed, 94 insertions(+), 50 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 5e9d82f1d9a..e8cc0faca62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -71,8 +71,8 @@ interface KotlinTargetConfigurator { } abstract class AbstractKotlinTargetConfigurator( - protected val createDefaultSourceSets: Boolean, - protected val createTestCompilation: Boolean + internal val createDefaultSourceSets: Boolean, + internal val createTestCompilation: Boolean ) : KotlinTargetConfigurator { protected open fun setupCompilationDependencyFiles(compilation: KotlinCompilation) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt index 7d9b0406c14..0198429c799 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt @@ -300,7 +300,10 @@ class GradleModuleVariantResolver : ModuleVariantResolver { // FIXME check composite builds, it's likely that resolvedVariantProvider fails on them? val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath) val kotlinVariantName = when (dependencyModule) { - is KotlinGradleModule -> dependencyModule.variants.single { resolvedGradleVariantName in it.gradleVariantNames }.name + is KotlinGradleModule -> { + dependencyModule.variants.singleOrNull { resolvedGradleVariantName in it.gradleVariantNames }?.name + ?: return VariantResolution.Unknown(requestingVariant, dependencyModule) + } else -> resolvedGradleVariantName?.let(::kotlinVariantNameFromPublishedVariantName) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index 003bc4ff4ff..8b24f3a9cce 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -6,16 +6,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation -import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset +import org.jetbrains.kotlin.gradle.plugin.* abstract class KotlinOnlyTargetPreset, T : KotlinCompilation<*>>( protected val project: Project ) : KotlinTargetPreset { - protected abstract fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator + protected abstract fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = target.targetName diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt index 228cff75e79..e32184010ba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt @@ -9,24 +9,14 @@ import groovy.lang.Closure import org.gradle.api.artifacts.Configuration import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.Project -import org.gradle.api.attributes.AttributeContainer import org.gradle.api.file.FileCollection import org.gradle.api.plugins.BasePluginExtension -import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.bundling.Jar -import org.gradle.api.tasks.bundling.Zip import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject -import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.mpp.filterModuleName import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget -import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator -import org.jetbrains.kotlin.gradle.tasks.locateTask -import org.jetbrains.kotlin.project.model.refinesClosure -import java.util.concurrent.Callable open class KotlinJvmVariant( containingModule: KotlinGradleModule, @@ -77,34 +67,4 @@ class KotlinMappedJvmCompilationFactory( VariantMappedCompilationDetailsWithRuntime(variant, target), ) } -} - -class KotlinMappedJvmTargetConfigurator : KotlinJvmTargetConfigurator() { - override fun defineConfigurationsForTarget(target: KotlinJvmTarget) = Unit // done in KPM - override fun configureCompilationDefaults(target: KotlinJvmTarget) { - // everything else is done in KPM, but KPM doesn't have resources processing yet - target.compilations.all { compilation -> - configureResourceProcessing( - compilation, - target.project.files(Callable { compilation.allKotlinSourceSets.map { it.resources } }) - ) - } - } - - override fun configureCompilations(target: KotlinJvmTarget) { - target.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) - target.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME) - } - - override fun configureArchivesAndComponent(target: KotlinJvmTarget) = Unit // done in KPM - - override fun createArchiveTasks(target: KotlinJvmTarget): TaskProvider = - checkNotNull( - target.project.locateTask( - target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) - .compilationDetails.let { it as VariantMappedCompilationDetails<*> } - .variant.let { it as KotlinJvmVariant } - .outputsJarTaskName - ) - ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariant.kt index fb02bf49d65..868e4f23914 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariant.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions -import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings +import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.NativeCompileOptions import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.konan.target.KonanTarget @@ -210,3 +210,18 @@ internal class KotlinNativeVariantCompilationData( override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings } } + +internal class KotlinMappedNativeCompilationFactory( + target: KotlinNativeTarget, + private val variantClass: Class +) : KotlinNativeCompilationFactory(target) { + override fun create(name: String): KotlinNativeCompilation { + val module = target.project.kpmModules.maybeCreate(name) + val variant = module.fragments.create(target.name, variantClass) + + return KotlinNativeCompilation( + target.konanTarget, + VariantMappedCompilationDetails(variant, target) + ) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt new file mode 100644 index 00000000000..240617b5107 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt @@ -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.plugin.mpp.pm20 + +import org.jetbrains.kotlin.gradle.plugin.* +import java.util.concurrent.Callable + +internal open class KpmAwareTargetConfigurator( + private val legacyModelTargetConfigurator: AbstractKotlinTargetConfigurator, +) : AbstractKotlinTargetConfigurator(true, legacyModelTargetConfigurator.createDefaultSourceSets), + KotlinTargetConfigurator by legacyModelTargetConfigurator { + // NB: this override enforces calls to other overridden functions; without it, the delegate would call its own ones + override fun configureTarget(target: T) = super.configureTarget(target) + + override fun defineConfigurationsForTarget(target: T) = Unit // done in KPM + + override fun configureCompilationDefaults(target: T) { + // everything else is done in KPM, but KPM doesn't have resources processing yet + target.compilations.all { compilation -> + if (compilation is KotlinCompilationWithResources<*>) { + configureResourceProcessing( + compilation, + target.project.files(Callable { compilation.allKotlinSourceSets.map { it.resources } }) + ) + } + } + } + + override fun configureCompilations(target: T) { + target.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) + if (legacyModelTargetConfigurator.createTestCompilation) { + target.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME) + } + } + + override fun configureArchivesAndComponent(target: T) = Unit // done in KPM + + override fun configureBuild(target: T) { + legacyModelTargetConfigurator.configureBuild(target) + } + + override fun configureSourceSet(target: T) { + legacyModelTargetConfigurator.configureSourceSet(target) + } +} + +internal class KpmAwareTargetWithTestsConfigurator, T : KotlinTargetWithTests<*, R>, C>( + private val legacyModelTargetWithTestsConfigurator: C +) : + KpmAwareTargetConfigurator(legacyModelTargetWithTestsConfigurator), + KotlinTargetWithTestsConfigurator + + where C : AbstractKotlinTargetConfigurator, + C : KotlinTargetWithTestsConfigurator { + + override fun configureTarget(target: T) { + super.configureTarget(target) + } + + override val testRunClass: Class + get() = legacyModelTargetWithTestsConfigurator.testRunClass + + override fun createTestRun(name: String, target: T): R = + legacyModelTargetWithTestsConfigurator.createTestRun(name, target) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt index 1effd9b1472..d4ca5afde5a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinCompilationOutput import org.jetbrains.kotlin.gradle.plugin.mpp.MavenPublicationCoordinatesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.newDependencyFilesHolder import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.project.model.KotlinAttributeKey