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 if (isMingwX64) nativeTarget = mingwX64("myNative")
else throw new GradleException("Host OS is not supported in Kotlin/Native.") else throw new GradleException("Host OS is not supported in Kotlin/Native.")
nativeTarget.with {
binaries {
executable {
entryPoint = 'MAIN CLASS'
}
}
}
sourceSets { sourceSets {
myNativeMain { myNativeMain {
@@ -8,13 +8,7 @@ repositories {
mavenCentral() mavenCentral()
} }
kotlin { kotlin {
linuxX64 { linuxX64()
binaries {
executable {
entryPoint = 'MAIN CLASS'
}
}
}
sourceSets { sourceSets {
linuxX64Main { linuxX64Main {
@@ -0,0 +1,3 @@
fun main() {
println("Hello, Kotlin/Native!")
}
@@ -26,7 +26,7 @@ data class TargetAccessIR(
} }
interface TargetConfigurationIR : MultiplatformIR, IrsOwner { interface TargetConfigurationIR : MultiplatformIR, IrsOwner {
val name: String val targetName: String
} }
fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when { fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when {
@@ -39,7 +39,7 @@ data class DefaultTargetConfigurationIR(
val targetAccess: TargetAccessIR, val targetAccess: TargetAccessIR,
override val irs: List<BuildSystemIR> override val irs: List<BuildSystemIR>
) : TargetConfigurationIR { ) : TargetConfigurationIR {
override val name: String override val targetName: String
get() = targetAccess.nonDefaultName ?: targetAccess.type.name get() = targetAccess.nonDefaultName ?: targetAccess.type.name
override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR = override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR =
@@ -57,7 +57,8 @@ data class DefaultTargetConfigurationIR(
} }
data class NonDefaultTargetConfigurationIR( data class NonDefaultTargetConfigurationIR(
override val name: String, val variableName: String,
override val targetName: String,
override val irs: List<BuildSystemIR> override val irs: List<BuildSystemIR>
) : TargetConfigurationIR { ) : TargetConfigurationIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR = override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR =
@@ -65,7 +66,7 @@ data class NonDefaultTargetConfigurationIR(
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
if (irs.isNotEmpty()) { if (irs.isNotEmpty()) {
+name +variableName
when (dsl) { when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> +".apply" GradlePrinter.GradleDsl.KOTLIN -> +".apply"
GradlePrinter.GradleDsl.GROOVY -> +".with" 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.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
class NativeTargetInternalIR( data class NativeTargetInternalIR(
val mainClassFqName: String? val mainClassFqName: String?
) : GradleIR { ) : GradleIR {
override fun GradlePrinter.renderGradle() { 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.CreateGradleValueIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleImportIR 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.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.ir.buildsystem.gradle.multiplatform.NonDefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
@@ -36,6 +35,8 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
override fun createTargetIrs(module: Module): List<BuildSystemIR> { override fun createTargetIrs(module: Module): List<BuildSystemIR> {
val moduleName = module.name val moduleName = module.name
val variableName = "${moduleName}Target"
return buildList { return buildList {
+CreateGradleValueIR("hostOs", RawGradleIR { +"System.getProperty(\"os.name\")" }) +CreateGradleValueIR("hostOs", RawGradleIR { +"System.getProperty(\"os.name\")" })
+CreateGradleValueIR("isMingwX64", RawGradleIR { +"hostOs.startsWith(\"Windows\")" }) +CreateGradleValueIR("isMingwX64", RawGradleIR { +"hostOs.startsWith(\"Windows\")" })
@@ -44,7 +45,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+RawGradleIR { +RawGradleIR {
when (dsl) { when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> { GradlePrinter.GradleDsl.KOTLIN -> {
+"val $DEFAULT_TARGET_VARIABLE_NAME = when " +"val $variableName = when "
inBrackets { inBrackets {
indent() indent()
+"""hostOs == "Mac OS X" -> macosX64("$moduleName")"""; nlIndented() +"""hostOs == "Mac OS X" -> macosX64("$moduleName")"""; nlIndented()
@@ -54,10 +55,10 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
} }
} }
GradlePrinter.GradleDsl.GROOVY -> { GradlePrinter.GradleDsl.GROOVY -> {
+"""KotlinNativeTargetWithTests $DEFAULT_TARGET_VARIABLE_NAME"""; nlIndented() +"""KotlinNativeTargetWithTests $variableName"""; nlIndented()
+"""if (hostOs == "Mac OS X") $DEFAULT_TARGET_VARIABLE_NAME = macosX64('$moduleName')"""; nlIndented() +"""if (hostOs == "Mac OS X") $variableName = macosX64('$moduleName')"""; nlIndented()
+"""else if (hostOs == "Linux") $DEFAULT_TARGET_VARIABLE_NAME = linuxX64("$moduleName")"""; nlIndented() +"""else if (hostOs == "Linux") $variableName = linuxX64("$moduleName")"""; nlIndented()
+"""else if (isMingwX64) $DEFAULT_TARGET_VARIABLE_NAME = mingwX64("$moduleName")"""; nlIndented() +"""else if (isMingwX64) $variableName = mingwX64("$moduleName")"""; nlIndented()
+"""else throw new GradleException("Host OS is not supported in Kotlin/Native.")"""; +"""else throw new GradleException("Host OS is not supported in Kotlin/Native.")""";
} }
} }
@@ -65,8 +66,9 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
} }
+NonDefaultTargetConfigurationIR( +NonDefaultTargetConfigurationIR(
DEFAULT_TARGET_VARIABLE_NAME, variableName = variableName,
createInnerTargetIrs(module) targetName = moduleName,
irs = createInnerTargetIrs(module)
) )
} }
} }
@@ -76,6 +78,4 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests") +GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests")
} }
} }
private const val DEFAULT_TARGET_VARIABLE_NAME = "nativeTarget"
} }
@@ -27,7 +27,8 @@ object Plugins {
KotlinTestTemplatePlugin(context), KotlinTestTemplatePlugin(context),
ConsoleJvmApplicationTemplatePlugin(context), ConsoleJvmApplicationTemplatePlugin(context),
KtorTemplatesPlugin(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.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator 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.moduleConfigurators.defaultTarget
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
@@ -53,7 +55,8 @@ sealed class ProjectTemplate : DisplayableSettingItem {
JvmConsoleApplication, JvmConsoleApplication,
JvmServerJsClient, JvmServerJsClient,
MultiplatformLibrary, 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 -> val jvmTarget = buildFileIR.targets.firstOrNull { target ->
target.safeAs<DefaultTargetConfigurationIR>()?.targetAccess?.type == ModuleSubType.jvm target.safeAs<DefaultTargetConfigurationIR>()?.targetAccess?.type == ModuleSubType.jvm
} as? DefaultTargetConfigurationIR ?: return@transformBuildFile null } as? DefaultTargetConfigurationIR ?: return@transformBuildFile null
val jvmTargetName = jvmTarget.name val jvmTargetName = jvmTarget.targetName
val webPackTaskName = "${jsSourcesetName}BrowserWebpack" val webPackTaskName = "${jsSourcesetName}BrowserWebpack"
val jvmJarTaskAccess = GradleByNameTaskAccessIR("${jvmTargetName}Jar", "Jar") 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.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* 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.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.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
@@ -92,7 +93,7 @@ abstract class Template : SettingsOwner {
val targetsUpdater = when (sourceset) { val targetsUpdater = when (sourceset) {
is SourcesetModuleIR -> { target: TargetConfigurationIR -> is SourcesetModuleIR -> { target: TargetConfigurationIR ->
if (target.name == sourceset.targetName) updateTargetIr(sourceset, target) if (target.targetName == sourceset.targetName) updateTargetIr(sourceset, target)
else target else target
} }
else -> idFunction() else -> idFunction()