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 throw new GradleException("Host OS is not supported in Kotlin/Native.")
|
||||
|
||||
nativeTarget.with {
|
||||
binaries {
|
||||
executable {
|
||||
entryPoint = 'MAIN CLASS'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
myNativeMain {
|
||||
|
||||
|
||||
+1
-7
@@ -8,13 +8,7 @@ repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
kotlin {
|
||||
linuxX64 {
|
||||
binaries {
|
||||
executable {
|
||||
entryPoint = 'MAIN CLASS'
|
||||
}
|
||||
}
|
||||
}
|
||||
linuxX64()
|
||||
sourceSets {
|
||||
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 {
|
||||
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"
|
||||
|
||||
+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.plugins.printer.GradlePrinter
|
||||
|
||||
class NativeTargetInternalIR(
|
||||
data class NativeTargetInternalIR(
|
||||
val mainClassFqName: String?
|
||||
) : GradleIR {
|
||||
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.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"
|
||||
}
|
||||
|
||||
+2
-1
@@ -27,7 +27,8 @@ object Plugins {
|
||||
KotlinTestTemplatePlugin(context),
|
||||
ConsoleJvmApplicationTemplatePlugin(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.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())
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
+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 ->
|
||||
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")
|
||||
|
||||
|
||||
+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.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()
|
||||
|
||||
Reference in New Issue
Block a user