Wizard: add kotlin native console application template
This commit is contained in:
+1
-7
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
+1
-7
@@ -8,13 +8,7 @@ repositories {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
kotlin {
|
kotlin {
|
||||||
linuxX64 {
|
linuxX64()
|
||||||
binaries {
|
|
||||||
executable {
|
|
||||||
entryPoint = 'MAIN CLASS'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
linuxX64Main {
|
linuxX64Main {
|
||||||
|
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
fun main() {
|
||||||
|
println("Hello, Kotlin/Native!")
|
||||||
|
}
|
||||||
+5
-4
@@ -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"
|
||||||
|
|||||||
+1
-1
@@ -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() {
|
||||||
|
|||||||
+10
-10
@@ -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"
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -27,7 +27,8 @@ object Plugins {
|
|||||||
KotlinTestTemplatePlugin(context),
|
KotlinTestTemplatePlugin(context),
|
||||||
ConsoleJvmApplicationTemplatePlugin(context),
|
ConsoleJvmApplicationTemplatePlugin(context),
|
||||||
KtorTemplatesPlugin(context),
|
KtorTemplatesPlugin(context),
|
||||||
JsTemplatesPlugin(context)
|
JsTemplatesPlugin(context),
|
||||||
|
NativeConsoleApplicationTemplatePlugin(context)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+13
@@ -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())
|
||||||
|
}
|
||||||
+28
-1
@@ -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())
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
+30
@@ -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"))
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -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")
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user