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>( abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>(
protected val createDefaultSourceSets: Boolean, internal val createDefaultSourceSets: Boolean,
protected val createTestCompilation: Boolean internal val createTestCompilation: Boolean
) : KotlinTargetConfigurator<KotlinTargetType> { ) : KotlinTargetConfigurator<KotlinTargetType> {
protected open fun setupCompilationDependencyFiles(compilation: KotlinCompilation<KotlinCommonOptions>) { 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? // FIXME check composite builds, it's likely that resolvedVariantProvider fails on them?
val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath) val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath)
val kotlinVariantName = when (dependencyModule) { 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) else -> resolvedGradleVariantName?.let(::kotlinVariantNameFromPublishedVariantName)
} }
@@ -6,16 +6,13 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>( abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>(
protected val project: Project protected val project: Project
) : KotlinTargetPreset<R> { ) : KotlinTargetPreset<R> {
protected abstract fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<T, R> protected abstract fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator<R>
protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<T>): String? = protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<T>): String? =
target.targetName target.targetName
@@ -9,24 +9,14 @@ import groovy.lang.Closure
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.BasePluginExtension 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.KotlinJvmOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl 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.*
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject import org.jetbrains.kotlin.gradle.plugin.mpp.filterModuleName
import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget 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( open class KotlinJvmVariant(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
@@ -77,34 +67,4 @@ class KotlinMappedJvmCompilationFactory(
VariantMappedCompilationDetailsWithRuntime(variant, target), 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.Project
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions 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.NativeCompileOptions
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -210,3 +210,18 @@ internal class KotlinNativeVariantCompilationData(
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings } 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.MavenPublicationCoordinatesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability 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.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.newDependencyFilesHolder
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.project.model.KotlinAttributeKey import org.jetbrains.kotlin.project.model.KotlinAttributeKey