Map Kotlin/Native compilation to the supported-platform KPM variants

This commit is contained in:
Sergey Igushkin
2022-02-01 18:00:01 +04:00
committed by Space
parent 736a33b182
commit c67f80e1f3
7 changed files with 94 additions and 50 deletions
@@ -71,8 +71,8 @@ interface KotlinTargetConfigurator<KotlinTargetType : KotlinTarget> {
}
abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>(
protected val createDefaultSourceSets: Boolean,
protected val createTestCompilation: Boolean
internal val createDefaultSourceSets: Boolean,
internal val createTestCompilation: Boolean
) : KotlinTargetConfigurator<KotlinTargetType> {
protected open fun setupCompilationDependencyFiles(compilation: KotlinCompilation<KotlinCommonOptions>) {
@@ -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)
}
@@ -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<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>(
protected val project: Project
) : KotlinTargetPreset<R> {
protected abstract fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<T, R>
protected abstract fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator<R>
protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<T>): String? =
target.targetName
@@ -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<out Zip> =
checkNotNull(
target.project.locateTask<Jar>(
target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
.compilationDetails.let { it as VariantMappedCompilationDetails<*> }
.variant.let { it as KotlinJvmVariant }
.outputsJarTaskName
)
)
}
@@ -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<out KotlinNativeVariantInternal>
) : 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)
)
}
}
@@ -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<T : KotlinTarget>(
private val legacyModelTargetConfigurator: AbstractKotlinTargetConfigurator<T>,
) : AbstractKotlinTargetConfigurator<T>(true, legacyModelTargetConfigurator.createDefaultSourceSets),
KotlinTargetConfigurator<T> 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<AbstractKotlinTargetConfigurator>.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<R : KotlinTargetTestRun<*>, T : KotlinTargetWithTests<*, R>, C>(
private val legacyModelTargetWithTestsConfigurator: C
) :
KpmAwareTargetConfigurator<T>(legacyModelTargetWithTestsConfigurator),
KotlinTargetWithTestsConfigurator<R, T>
where C : AbstractKotlinTargetConfigurator<T>,
C : KotlinTargetWithTestsConfigurator<R, T> {
override fun configureTarget(target: T) {
super<KotlinTargetWithTestsConfigurator>.configureTarget(target)
}
override val testRunClass: Class<R>
get() = legacyModelTargetWithTestsConfigurator.testRunClass
override fun createTestRun(name: String, target: T): R =
legacyModelTargetWithTestsConfigurator.createTestRun(name, target)
}
@@ -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