Kotlin/Native で Hello World してみます。
Kotlin なので IDEA を使いましょう。
Plugin 最新化
Kotlin Plugin を最新化しておきます。
Update
ボタンで更新。プラグインのインストールが終わると再起動を求められる。
Restart IntelliJ IDEA
で再起動。
プロジェクトの作成
Create New Project
で Kotlin/Native
を選択。
Next
Java 11 だと Gradle のビルドでエラー(sun.misc.Unsafe が変更された影響がここにも)になるので、ここでは GradleJVM は 1.8 を選択。
hello として Finish
。
プロジェクト構成
以下のような感じになる。
Gradle タスクの runMainReleaseExecutableMacos
を実行すると実行可能ファイルが作成される(初回はそれなりに時間がかかる)。
ビルド成功すれば main.kexe
ができてるのでそのまま実行できる。
$ ./build/bin/macos/mainReleaseExecutable/main.kexe Hello, Kotlin/Native!
サンプルソース
プラグインが生成するデフォルトのサンプルソースは以下のようになっている。
package sample fun hello(): String = "Hello, Kotlin/Native!" fun main() { println(hello()) }
テストコードは以下の感じ。
package sample import kotlin.test.Test import kotlin.test.assertTrue class SampleTests { @Test fun testHello() { assertTrue("Kotlin/Native" in hello()) } }
build.gradle は以下。
plugins { id 'kotlin-multiplatform' version '1.3.21' } repositories { mavenCentral() } kotlin { // For ARM, should be changed to iosArm32 or iosArm64 // For Linux, should be changed to e.g. linuxX64 // For MacOS, should be changed to e.g. macosX64 // For Windows, should be changed to e.g. mingwX64 macosX64("macos") { compilations.main { // Comment to generate Kotlin/Native library (KLIB) instead of executable file: outputKinds("executable") // Change to specify fully qualified name of your application's entry point: entryPoint 'sample.main' } } sourceSets { // Note: To enable common source sets please comment out 'kotlin.import.noCommonSourceSets' property // in gradle.properties file and re-import your project in IDE. macosMain { } macosTest { } } } task runProgram { def buildType = 'RELEASE' // Change to 'DEBUG' to run application with debug symbols. dependsOn kotlin.targets.macos.compilations.main.linkTaskName('EXECUTABLE', buildType) doLast { def programFile = kotlin.targets.macos.compilations.main.getBinary('EXECUTABLE', buildType) exec { executable programFile args '' } } }
まとめ
最近の流れ通り Kotlin コンパイラが LLVM のフロントエンドとなり、LLVM IR を生成し、LLVM によりターゲットプラットフォームの実行バイナリを吐く流れです。
プラグイン使えば超お手軽ですね。
ただ、既存の Java ライブラリの jar などをを含めたネイティブアプリケーションの作成は現時点ではサポートされないので、微妙なところではあります。