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

This commit is contained in:
Sergey Igushkin
2021-12-06 18:23:42 +04:00
committed by Space
parent c67f80e1f3
commit dbb34a44f0
5 changed files with 54 additions and 16 deletions
@@ -10,9 +10,7 @@ import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
open class KotlinJvmCompilation(
@@ -7,10 +7,12 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinMappedJvmCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinMappedJvmTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmAwareTargetWithTestsConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator
@@ -30,10 +32,12 @@ class KotlinJvmTargetPreset(
KotlinMappedJvmCompilationFactory(forTarget)
else KotlinJvmCompilationFactory(forTarget)
override fun createKotlinTargetConfigurator() =
if (PropertiesProvider(project).experimentalKpmModelMapping)
KotlinMappedJvmTargetConfigurator()
else KotlinJvmTargetConfigurator()
override fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinJvmTarget> {
val configurator = KotlinJvmTargetConfigurator()
return if (project.hasKpmModel)
KpmAwareTargetWithTestsConfigurator(configurator)
else configurator
}
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm
@@ -9,7 +9,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
class KotlinNativeCompilationFactory(
open class KotlinNativeCompilationFactory(
val target: KotlinNativeTarget
) : KotlinCompilationFactory<KotlinNativeCompilation> {
@@ -140,6 +140,10 @@ open class KotlinNativeTarget @Inject constructor(
String::class.java
)
}
internal val isKpm: Boolean
get() = project.hasKpmModel &&
AbstractKotlinNativeTargetPreset.kpmVariantClass(konanTarget) != null
}
private val hostManager by lazy { HostManager() }
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.compilerRunner.konanVersion
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
@@ -65,10 +67,15 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
}
}
protected abstract fun createTargetConfigurator(): KotlinTargetConfigurator<T>
protected abstract fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<T>
protected abstract fun instantiateTarget(name: String): T
private val kpmVariantClass = kpmVariantClass(konanTarget)
protected val isKpm: Boolean
get() = project.hasKpmModel && kpmVariantClass != null
override fun createTarget(name: String): T {
setupNativeCompiler()
@@ -77,7 +84,10 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
disambiguationClassifier = name
preset = this@AbstractKotlinNativeTargetPreset
val compilationFactory = KotlinNativeCompilationFactory(this)
val compilationFactory =
if (isKpm)
KotlinMappedNativeCompilationFactory(this, checkNotNull(kpmVariantClass))
else KotlinNativeCompilationFactory(this)
compilations = project.container(compilationFactory.itemClass, compilationFactory)
}
@@ -106,6 +116,16 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
companion object {
private const val KOTLIN_NATIVE_HOME_PRIVATE_PROPERTY = "konanHome"
// FIXME: codegen
internal fun kpmVariantClass(konanTarget: KonanTarget): Class<out KotlinNativeVariantInternal>? = when (konanTarget) {
KonanTarget.IOS_ARM64 -> KotlinIosArm64Variant::class.java
KonanTarget.IOS_X64 -> KotlinIosX64Variant::class.java
KonanTarget.LINUX_X64 -> KotlinLinuxX64Variant::class.java
KonanTarget.MACOS_ARM64 -> KotlinMacosArm64Variant::class.java
KonanTarget.MACOS_X64 -> KotlinMacosX64Variant::class.java
else -> null
}
}
}
@@ -113,8 +133,12 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTarget>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinTargetConfigurator<KotlinNativeTarget> =
KotlinNativeTargetConfigurator()
override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTarget> {
val configurator = KotlinNativeTargetConfigurator<KotlinNativeTarget>()
return if (isKpm)
KpmAwareTargetConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTarget {
return project.objects.newInstance(KotlinNativeTarget::class.java, project, konanTarget)
@@ -124,8 +148,12 @@ open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget:
open class KotlinNativeTargetWithHostTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithHostTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithHostTestsConfigurator =
KotlinNativeTargetWithHostTestsConfigurator()
override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTargetWithHostTests> {
val configurator = KotlinNativeTargetWithHostTestsConfigurator()
return if (isKpm)
KpmAwareTargetWithTestsConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTargetWithHostTests =
project.objects.newInstance(KotlinNativeTargetWithHostTests::class.java, project, konanTarget)
@@ -134,8 +162,12 @@ open class KotlinNativeTargetWithHostTestsPreset(name: String, project: Project,
open class KotlinNativeTargetWithSimulatorTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithSimulatorTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithSimulatorTestsConfigurator =
KotlinNativeTargetWithSimulatorTestsConfigurator()
override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTargetWithSimulatorTests> {
val configurator = KotlinNativeTargetWithSimulatorTestsConfigurator()
return if (isKpm)
KpmAwareTargetConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTargetWithSimulatorTests =
project.objects.newInstance(KotlinNativeTargetWithSimulatorTests::class.java, project, konanTarget)