diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/build.gradle index aade8c6eb54..3d00e4ed29e 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/build.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/nativeForCurrentSystem/build.gradle @@ -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 { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/build.gradle index 659368ebfc2..e5a5e25ba51 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/build.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleNativeTarget/build.gradle @@ -8,13 +8,7 @@ repositories { mavenCentral() } kotlin { - linuxX64 { - binaries { - executable { - entryPoint = 'MAIN CLASS' - } - } - } + linuxX64() sourceSets { linuxX64Main { diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/nativeConsoleApp/main.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/nativeConsoleApp/main.kt.vm new file mode 100644 index 00000000000..1ea23888886 --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/nativeConsoleApp/main.kt.vm @@ -0,0 +1,3 @@ +fun main() { + println("Hello, Kotlin/Native!") +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/ir.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/ir.kt index f6374053eb8..798329534af 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/ir.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/ir.kt @@ -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 ) : TargetConfigurationIR { - override val name: String + override val targetName: String get() = targetAccess.nonDefaultName ?: targetAccess.type.name override fun withReplacedIrs(irs: List): 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 ) : TargetConfigurationIR { override fun withReplacedIrs(irs: List): 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" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/native.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/native.kt index 910bb3726cd..5790eed47cf 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/native.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/multiplatform/native.kt @@ -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() { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt index d5576670d0b..ed9c9d60ada 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt @@ -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 { 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" } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt index d1d30fb559f..9c88de7e9b1 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt @@ -27,7 +27,8 @@ object Plugins { KotlinTestTemplatePlugin(context), ConsoleJvmApplicationTemplatePlugin(context), KtorTemplatesPlugin(context), - JsTemplatesPlugin(context) + JsTemplatesPlugin(context), + NativeConsoleApplicationTemplatePlugin(context) ) } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt new file mode 100644 index 00000000000..f2c30c24f07 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt @@ -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()) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 7ba55699260..e7e2f10c234 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -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> + get() = listOf( + KotlinPlugin::modules withValue listOf( + Module( + "app", + ModuleKind.multiplatform, + MppModuleConfigurator, + emptyList(), + subModules = listOf( + ModuleType.native.createDefaultTarget("native").apply { + mainSourceset?.withTemplate(NativeConsoleApplicationTemplate()) + } + ) + ) + ) + ) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/NativeConsoleApplicationTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/NativeConsoleApplicationTemplate.kt new file mode 100644 index 00000000000..3f9963d59c8 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/NativeConsoleApplicationTemplate.kt @@ -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 = setOf(ModuleType.native) + override val sourcesetTypes: Set = 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 = buildList { + +FileTemplateDescriptor("$id/main.kt.vm", sourcesPath("main.kt")) + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt index 3fb4f5a02bb..44414e06d54 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt @@ -86,7 +86,7 @@ class SimpleJsClientTemplate : Template() { val jvmTarget = buildFileIR.targets.firstOrNull { target -> target.safeAs()?.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") diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index bd361d9f235..63d60817873 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -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()