Wizard: add kotlin native console application template

This commit is contained in:
Ilya Kirillov
2020-01-15 16:11:28 +03:00
parent 9e96cd4507
commit 479f6a4402
12 changed files with 97 additions and 33 deletions
@@ -18,13 +18,7 @@ kotlin {
else if (isMingwX64) nativeTarget = mingwX64("myNative")
else throw new GradleException("Host OS is not supported in Kotlin/Native.")
nativeTarget.with {
binaries {
executable {
entryPoint = 'MAIN CLASS'
}
}
}
sourceSets {
myNativeMain {
@@ -8,13 +8,7 @@ repositories {
mavenCentral()
}
kotlin {
linuxX64 {
binaries {
executable {
entryPoint = 'MAIN CLASS'
}
}
}
linuxX64()
sourceSets {
linuxX64Main {
@@ -0,0 +1,3 @@
fun main() {
println("Hello, Kotlin/Native!")
}
@@ -26,7 +26,7 @@ data class TargetAccessIR(
}
interface TargetConfigurationIR : MultiplatformIR, IrsOwner {
val name: String
val targetName: String
}
fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when {
@@ -39,7 +39,7 @@ data class DefaultTargetConfigurationIR(
val targetAccess: TargetAccessIR,
override val irs: List<BuildSystemIR>
) : TargetConfigurationIR {
override val name: String
override val targetName: String
get() = targetAccess.nonDefaultName ?: targetAccess.type.name
override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR =
@@ -57,7 +57,8 @@ data class DefaultTargetConfigurationIR(
}
data class NonDefaultTargetConfigurationIR(
override val name: String,
val variableName: String,
override val targetName: String,
override val irs: List<BuildSystemIR>
) : TargetConfigurationIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR =
@@ -65,7 +66,7 @@ data class NonDefaultTargetConfigurationIR(
override fun GradlePrinter.renderGradle() {
if (irs.isNotEmpty()) {
+name
+variableName
when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> +".apply"
GradlePrinter.GradleDsl.GROOVY -> +".with"
@@ -3,7 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplat
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
class NativeTargetInternalIR(
data class NativeTargetInternalIR(
val mainClassFqName: String?
) : GradleIR {
override fun GradlePrinter.renderGradle() {
@@ -5,7 +5,6 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleImportIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.NativeTargetInternalIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.NonDefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
@@ -36,6 +35,8 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
override fun createTargetIrs(module: Module): List<BuildSystemIR> {
val moduleName = module.name
val variableName = "${moduleName}Target"
return buildList {
+CreateGradleValueIR("hostOs", RawGradleIR { +"System.getProperty(\"os.name\")" })
+CreateGradleValueIR("isMingwX64", RawGradleIR { +"hostOs.startsWith(\"Windows\")" })
@@ -44,7 +45,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+RawGradleIR {
when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> {
+"val $DEFAULT_TARGET_VARIABLE_NAME = when "
+"val $variableName = when "
inBrackets {
indent()
+"""hostOs == "Mac OS X" -> macosX64("$moduleName")"""; nlIndented()
@@ -54,10 +55,10 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
}
}
GradlePrinter.GradleDsl.GROOVY -> {
+"""KotlinNativeTargetWithTests $DEFAULT_TARGET_VARIABLE_NAME"""; nlIndented()
+"""if (hostOs == "Mac OS X") $DEFAULT_TARGET_VARIABLE_NAME = macosX64('$moduleName')"""; nlIndented()
+"""else if (hostOs == "Linux") $DEFAULT_TARGET_VARIABLE_NAME = linuxX64("$moduleName")"""; nlIndented()
+"""else if (isMingwX64) $DEFAULT_TARGET_VARIABLE_NAME = mingwX64("$moduleName")"""; nlIndented()
+"""KotlinNativeTargetWithTests $variableName"""; nlIndented()
+"""if (hostOs == "Mac OS X") $variableName = macosX64('$moduleName')"""; nlIndented()
+"""else if (hostOs == "Linux") $variableName = linuxX64("$moduleName")"""; nlIndented()
+"""else if (isMingwX64) $variableName = mingwX64("$moduleName")"""; nlIndented()
+"""else throw new GradleException("Host OS is not supported in Kotlin/Native.")""";
}
}
@@ -65,8 +66,9 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
}
+NonDefaultTargetConfigurationIR(
DEFAULT_TARGET_VARIABLE_NAME,
createInnerTargetIrs(module)
variableName = variableName,
targetName = moduleName,
irs = createInnerTargetIrs(module)
)
}
}
@@ -76,6 +78,4 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests")
}
}
private const val DEFAULT_TARGET_VARIABLE_NAME = "nativeTarget"
}
@@ -27,7 +27,8 @@ object Plugins {
KotlinTestTemplatePlugin(context),
ConsoleJvmApplicationTemplatePlugin(context),
KtorTemplatesPlugin(context),
JsTemplatesPlugin(context)
JsTemplatesPlugin(context),
NativeConsoleApplicationTemplatePlugin(context)
)
}
}
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2020 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.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.templates.NativeConsoleApplicationTemplate
class NativeConsoleApplicationTemplatePlugin(context: Context) : TemplatePlugin(context) {
val addTemplate by addTemplateTask(NativeConsoleApplicationTemplate())
}
@@ -4,6 +4,8 @@ import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.MppModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.NativeForCurrentSystemTarget
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.defaultTarget
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
@@ -53,7 +55,8 @@ sealed class ProjectTemplate : DisplayableSettingItem {
JvmConsoleApplication,
JvmServerJsClient,
MultiplatformLibrary,
AndroidApplication
AndroidApplication,
NativeConsoleApplication
)
}
}
@@ -231,3 +234,27 @@ object AndroidApplication : ProjectTemplate() {
)
)
}
object NativeConsoleApplication : ProjectTemplate() {
override val title = "Native Console Application"
override val htmlDescription = title
override val suggestedProjectName = "myNativeConsoleApp"
override val projectKind = ProjectKind.Multiplatform
override val setsPluginSettings: List<SettingWithValue<*, *>>
get() = listOf(
KotlinPlugin::modules withValue listOf(
Module(
"app",
ModuleKind.multiplatform,
MppModuleConfigurator,
emptyList(),
subModules = listOf(
ModuleType.native.createDefaultTarget("native").apply {
mainSourceset?.withTemplate(NativeConsoleApplicationTemplate())
}
)
)
)
)
}
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2019 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.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.SourcesetIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.NativeTargetInternalIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
class NativeConsoleApplicationTemplate : Template() {
override val title: String = "Native Console Application"
override val htmlDescription: String = title
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.native)
override val sourcesetTypes: Set<SourcesetType> = setOf(SourcesetType.main)
override val id: String = "nativeConsoleApp"
override fun updateTargetIr(sourceset: SourcesetIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
targetConfigurationIR.withIrs(NativeTargetInternalIR("main"))
override fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR): List<FileTemplateDescriptor> = buildList {
+FileTemplateDescriptor("$id/main.kt.vm", sourcesPath("main.kt"))
}
}
@@ -86,7 +86,7 @@ class SimpleJsClientTemplate : Template() {
val jvmTarget = buildFileIR.targets.firstOrNull { target ->
target.safeAs<DefaultTargetConfigurationIR>()?.targetAccess?.type == ModuleSubType.jvm
} as? DefaultTargetConfigurationIR ?: return@transformBuildFile null
val jvmTargetName = jvmTarget.name
val jvmTargetName = jvmTarget.targetName
val webPackTaskName = "${jsSourcesetName}BrowserWebpack"
val jvmJarTaskAccess = GradleByNameTaskAccessIR("${jvmTargetName}Jar", "Jar")
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.TargetConfigurator
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
@@ -92,7 +93,7 @@ abstract class Template : SettingsOwner {
val targetsUpdater = when (sourceset) {
is SourcesetModuleIR -> { target: TargetConfigurationIR ->
if (target.name == sourceset.targetName) updateTargetIr(sourceset, target)
if (target.targetName == sourceset.targetName) updateTargetIr(sourceset, target)
else target
}
else -> idFunction()