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.compile.JavaCompile
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
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.plugin.KotlinCompilationWithResources import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
open class KotlinJvmCompilation( open class KotlinJvmCompilation(
@@ -7,10 +7,12 @@
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.AbstractKotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinMappedJvmCompilationFactory 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.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator
@@ -30,10 +32,12 @@ class KotlinJvmTargetPreset(
KotlinMappedJvmCompilationFactory(forTarget) KotlinMappedJvmCompilationFactory(forTarget)
else KotlinJvmCompilationFactory(forTarget) else KotlinJvmCompilationFactory(forTarget)
override fun createKotlinTargetConfigurator() = override fun createKotlinTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinJvmTarget> {
if (PropertiesProvider(project).experimentalKpmModelMapping) val configurator = KotlinJvmTargetConfigurator()
KotlinMappedJvmTargetConfigurator() return if (project.hasKpmModel)
else KotlinJvmTargetConfigurator() KpmAwareTargetWithTestsConfigurator(configurator)
else configurator
}
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm 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.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
class KotlinNativeCompilationFactory( open class KotlinNativeCompilationFactory(
val target: KotlinNativeTarget val target: KotlinNativeTarget
) : KotlinCompilationFactory<KotlinNativeCompilation> { ) : KotlinCompilationFactory<KotlinNativeCompilation> {
@@ -140,6 +140,10 @@ open class KotlinNativeTarget @Inject constructor(
String::class.java String::class.java
) )
} }
internal val isKpm: Boolean
get() = project.hasKpmModel &&
AbstractKotlinNativeTargetPreset.kpmVariantClass(konanTarget) != null
} }
private val hostManager by lazy { HostManager() } 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.compilerRunner.konanVersion
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider 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.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.targets.native.internal.* import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader 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 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 { override fun createTarget(name: String): T {
setupNativeCompiler() setupNativeCompiler()
@@ -77,7 +84,10 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
disambiguationClassifier = name disambiguationClassifier = name
preset = this@AbstractKotlinNativeTargetPreset preset = this@AbstractKotlinNativeTargetPreset
val compilationFactory = KotlinNativeCompilationFactory(this) val compilationFactory =
if (isKpm)
KotlinMappedNativeCompilationFactory(this, checkNotNull(kpmVariantClass))
else KotlinNativeCompilationFactory(this)
compilations = project.container(compilationFactory.itemClass, compilationFactory) compilations = project.container(compilationFactory.itemClass, compilationFactory)
} }
@@ -106,6 +116,16 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
companion object { companion object {
private const val KOTLIN_NATIVE_HOME_PRIVATE_PROPERTY = "konanHome" 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) : open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTarget>(name, project, konanTarget) { AbstractKotlinNativeTargetPreset<KotlinNativeTarget>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinTargetConfigurator<KotlinNativeTarget> = override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTarget> {
KotlinNativeTargetConfigurator() val configurator = KotlinNativeTargetConfigurator<KotlinNativeTarget>()
return if (isKpm)
KpmAwareTargetConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTarget { override fun instantiateTarget(name: String): KotlinNativeTarget {
return project.objects.newInstance(KotlinNativeTarget::class.java, project, konanTarget) 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) : open class KotlinNativeTargetWithHostTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithHostTests>(name, project, konanTarget) { AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithHostTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithHostTestsConfigurator = override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTargetWithHostTests> {
KotlinNativeTargetWithHostTestsConfigurator() val configurator = KotlinNativeTargetWithHostTestsConfigurator()
return if (isKpm)
KpmAwareTargetWithTestsConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTargetWithHostTests = override fun instantiateTarget(name: String): KotlinNativeTargetWithHostTests =
project.objects.newInstance(KotlinNativeTargetWithHostTests::class.java, project, konanTarget) 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) : open class KotlinNativeTargetWithSimulatorTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithSimulatorTests>(name, project, konanTarget) { AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithSimulatorTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithSimulatorTestsConfigurator = override fun createTargetConfigurator(): AbstractKotlinTargetConfigurator<KotlinNativeTargetWithSimulatorTests> {
KotlinNativeTargetWithSimulatorTestsConfigurator() val configurator = KotlinNativeTargetWithSimulatorTestsConfigurator()
return if (isKpm)
KpmAwareTargetConfigurator(configurator)
else configurator
}
override fun instantiateTarget(name: String): KotlinNativeTargetWithSimulatorTests = override fun instantiateTarget(name: String): KotlinNativeTargetWithSimulatorTests =
project.objects.newInstance(KotlinNativeTargetWithSimulatorTests::class.java, project, konanTarget) project.objects.newInstance(KotlinNativeTargetWithSimulatorTests::class.java, project, konanTarget)