コンパイルの設定
Kotlinマルチプラットフォームプロジェクトは、アーティファクトを生成するためにコンパイルを使用します。各ターゲットは、プロダクション用やテスト用など、1つ以上のコンパイルを持つことができます。
各ターゲットにおいて、デフォルトのコンパイルには以下が含まれます:
- JVM、JS、Nativeターゲット用の
mainおよびtestコンパイル。 - Androidターゲット用の、Androidビルドバリアントごとのコンパイル。
プロダクションコードやユニットテスト以外のもの(例:統合テストやパフォーマンス性能テスト)をコンパイルする必要がある場合は、カスタムコンパイルを作成できます。
アーティファクトの生成方法は、以下のレベルで設定できます:
- プロジェクト内の全てのコンパイルを一括で設定。
- 1つのターゲットに複数のコンパイルが含まれる場合があるため、特定のターゲットの全コンパイルを設定。
- 特定のコンパイルを個別に設定。
全ターゲットまたは特定のターゲットで利用可能なコンパイルパラメータのリストおよびコンパイラオプションを参照してください。
全てのコンパイルを設定する
この例では、全てのターゲットで共通のコンパイラオプションを設定します:
kotlin {
compilerOptions {
allWarningsAsErrors.set(true)
}
}kotlin {
compilerOptions {
allWarningsAsErrors = true
}
}1つのターゲットのコンパイルを設定する
kotlin {
jvm {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
}kotlin {
jvm {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
}
}
}特定のコンパイルを1つ設定する
kotlin {
jvm {
val main by compilations.getting {
compileTaskProvider.configure {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
}
}
}kotlin {
jvm {
compilations.main {
compileTaskProvider.configure {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
}
}
}
}
}カスタムコンパイルを作成する
プロダクションコードやユニットテスト以外(例:統合テストやパフォーマンス性能テスト)をコンパイルする必要がある場合は、カスタムコンパイルを作成します。
カスタムコンパイルの場合、すべての依存関係を手動で設定する必要があります。カスタムコンパイルのデフォルトソースセットは、commonMain および commonTest ソースセットに依存しません。
例えば、jvm ターゲットの統合テスト用にカスタムコンパイルを作成するには、integrationTest コンパイルと main コンパイルの間に associateWith 関係を設定します:
kotlin {
jvm {
compilations {
val main by getting
val integrationTest by creating {
// main とそのクラスパスを依存関係としてインポートし、internal 可視性を確立します
associateWith(main)
defaultSourceSet {
dependencies {
implementation(kotlin("test-junit"))
/* ... */
}
}
}
// このコンパイルによって生成されたテストを実行するためのテストタスクを作成します:
testRuns.create("integration") {
// テストタスクを設定します
setExecutionSourceFrom(integrationTest)
}
}
}
}kotlin {
jvm {
compilations.create('integrationTest') {
def main = compilations.main
// main とそのクラスパスを依存関係としてインポートし、internal 可視性を確立します
associateWith(main)
defaultSourceSet {
dependencies {
implementation kotlin('test-junit')
/* ... */
}
}
}
// このコンパイルによって生成されたテストを実行するためのテストタスクを作成します
testRuns.create('integration') {
// テストタスクを設定します
setExecutionSourceFrom(compilations.integrationTest)
}
}
}コンパイルを関連付ける(associating)ことで、メインコンパイルの出力を依存関係として追加し、コンパイル間での internal 可視性を確立します。
カスタムコンパイルは、他のケースでも必要になります。例えば、最終的なアーティファクトで異なるJVMバージョンのコンパイルを組み合わせたい場合や、既にGradleでソースセットを設定していてマルチプラットフォームプロジェクトに移行したい場合などです。
android用のカスタムコンパイルを作成するには、Android Gradle プラグインを通じてビルドバリアントを設定してください。
JVM用のコンパイル
マルチプラットフォームプロジェクトで jvm ターゲットを宣言すると、Kotlin Multiplatform Gradleプラグインは自動的にJavaソースセットを作成し、JVMターゲットのコンパイルに含めます。
共通ソースセット(common source sets)にはJavaリソースを含めることができないため、それらはマルチプラットフォームプロジェクトの対応する子ディレクトリに配置する必要があります。例:

現在、Kotlin Multiplatform Gradleプラグインは、Javaプラグインによって設定される一部のタスクを置き換えます:
- JARタスク:標準の
jarの代わりに、アーティファクト名に基づいたターゲット固有のタスクを使用します。例えば、jvm()ターゲット宣言の場合はjvmJar、jvm("desktop")の場合はdesktopJarとなります。 - テストタスク:標準の
testの代わりに、アーティファクト名に基づいたターゲット固有のタスクを使用します。例えば、jvmTestとなります。 - リソース処理:
*ProcessResourcesタスクの代わりに、リソースは対応するコンパイルタスクによって処理されます。
これらのタスクは、ターゲットが宣言されると自動的に作成されます。ただし、必要に応じてJARタスクを手動で定義し、設定することも可能です:
// 共有モジュールの `build.gradle.kts` ファイル
plugins {
kotlin("multiplatform") version "2.3.0"
}
kotlin {
// JVMターゲットを指定
jvm {
// JAR生成用のタスクを追加
tasks.named<Jar>(artifactsTaskName).configure {
// タスクを設定
}
}
sourceSets {
jvmMain {
dependencies {
// JVM固有の依存関係を追加
}
}
}
}// 共有モジュールの `build.gradle` file
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '2.3.0'
}
kotlin {
// JVMターゲットを指定
jvm {
// JAR生成用のタスクを追加
tasks.named<Jar>(artifactsTaskName).configure {
// タスクを設定
}
}
sourceSets {
jvmMain {
dependencies {
// JVM固有の依存関係を追加
}
}
}
}このターゲットはKotlin Multiplatform Gradleプラグインによってパブリッシュ(公開)されるため、Javaプラグイン固有の手順は必要ありません。
ネイティブ言語との相互運用を設定する
Kotlinはネイティブ言語との相互運用性(Interop)を提供しており、特定のコンパイルに対してこれを設定するためのDSLを備えています。
| ネイティブ言語 | サポートされているプラットフォーム | 備考 |
|---|---|---|
| C | すべてのプラットフォーム | |
| Objective-C | Appleプラットフォーム (macOS, iOS, watchOS, tvOS) | |
| Swift (Objective-C経由) | Appleプラットフォーム (macOS, iOS, watchOS, tvOS) | Kotlinは @objc 属性が付与されたSwift宣言のみを使用できます。 |
1つのコンパイルで複数のネイティブライブラリとやり取りできます。定義ファイル(definition file)のプロパティ、またはビルドファイルの cinterops ブロックを使用して相互運用を設定します:
kotlin {
linuxX64 { // 必要なターゲットに置き換えてください。
compilations.getByName("main") {
val myInterop by cinterops.creating {
// ネイティブAPIを記述するDefファイル。
// デフォルトのパスは src/nativeInterop/cinterop/<interop-name>.def です。
definitionFile.set(project.file("def-file.def"))
// 生成されるKotlin APIを配置するパッケージ。
packageName("org.sample")
// cinterop ツールによってコンパイラに渡されるオプション。
compilerOpts("-Ipath/to/headers")
// ヘッダーを検索するディレクトリ。
includeDirs.apply {
// ヘッダー検索用のディレクトリ(コンパイラオプション -I<path> と同等)。
allHeaders("path1", "path2")
// Defファイルの 'headerFilter' オプションにリストされているヘッダーを検索する追加ディレクトリ。
// コマンドラインオプション -headerFilterAdditionalSearchPrefix と同等。
headerFilterOnly("path1", "path2")
}
// includeDirs.allHeaders のショートカット。
includeDirs("include/directory", "another/directory")
}
val anotherInterop by cinterops.creating { /* ... */ }
}
}
}kotlin {
linuxX64 { // 必要なターゲットに置き換えてください。
compilations.main {
cinterops {
myInterop {
// ネイティブAPIを記述するDefファイル。
// デフォルトのパスは src/nativeInterop/cinterop/<interop-name>.def です。
definitionFile = project.file("def-file.def")
// 生成されるKotlin APIを配置するパッケージ。
packageName 'org.sample'
// cinterop ツールによってコンパイラに渡されるオプション。
compilerOpts '-Ipath/to/headers'
// ヘッダー検索用のディレクトリ(コンパイラオプション -I<path> と同等)。
includeDirs.allHeaders("path1", "path2")
// Defファイルの 'headerFilter' オプションにリストされているヘッダーを検索する追加ディレクトリ。
// コマンドラインオプション -headerFilterAdditionalSearchPrefix と同等。
includeDirs.headerFilterOnly("path1", "path2")
// includeDirs.allHeaders のショートカット。
includeDirs("include/directory", "another/directory")
}
anotherInterop { /* ... */ }
}
}
}
}Android用のコンパイル
Androidターゲット用にデフォルトで作成されるコンパイルは、Androidビルドバリアントに関連付けられています。各ビルドバリアントに対して、同じ名前でKotlinコンパイルが作成されます。
そして、各バリアントでコンパイルされる各Androidソースセットに対して、そのソースセット名の前にターゲット名を付加した名前でKotlinソースセットが作成されます。例えば、Androidソースセット debug に対してはKotlinソースセット androidDebug(ターゲット名が android の場合)が作成されます。 これらのKotlinソースセットは、対応するバリアントのコンパイルに追加されます。
デフォルトのソースセット commonMain は、各プロダクション(アプリケーションまたはライブラリ)バリアントのコンパイルに追加されます。commonTest ソースセットも同様に、ユニットテストおよびインストルメンテッドテスト(instrumented test)バリアントのコンパイルに追加されます。
kapt によるアノテーション処理もサポートされていますが、現在の制限により、kapt 依存関係を設定する前に Android ターゲットを作成する必要があります。また、これらは Kotlin ソースセットの依存関係内ではなく、トップレベルの dependencies {} ブロックで行う必要があります。
kotlin {
android { /* ... */ }
}
dependencies {
kapt("com.my.annotation:processor:1.0.0")
}ソースセット階層のコンパイル
Kotlinは dependsOn 関係を使用してソースセット階層を構築できます。
ソースセット jvmMain がソースセット commonMain に依存している場合:
jvmMainが特定のターゲット向けにコンパイルされる際、commonMainもそのコンパイルに参加し、JVMクラスファイルなどの同じターゲットバイナリ形式にコンパイルされます。jvmMainのソースは、internal宣言を含むcommonMainの宣言を「見る」ことができ、またimplementation依存関係として指定されたものを含め、commonMainの依存関係も見ることができます。jvmMainは、commonMainの期待される宣言(expected declarations)に対して、プラットフォーム固有の実装を含むことができます。commonMainのリソースは常に処理され、jvmMainのリソースと一緒にコピーされます。jvmMainとcommonMainの言語設定は一貫している必要があります。
言語設定の一貫性は以下の方法でチェックされます:
jvmMainは、commonMainのものと同じかそれより新しいlanguageVersionを設定する必要があります。jvmMainは、commonMainが有効にしているすべての不安定な言語機能を有効にする必要があります(バグ修正機能についてはこの要件はありません)。jvmMainは、commonMainが使用しているすべての実験的アノテーションを使用する必要があります。apiVersion、バグ修正言語機能、およびprogressiveModeは任意に設定できます。
GradleのIsolated Projects機能を設定する
この機能は試験的(Experimental)であり、現在はGradleにおいてプレアルファ(pre-alpha)の状態です。Gradle バージョン 8.10 以降でのみ使用し、評価目的のみに留めてください。この機能はいつでも削除または変更される可能性があります。 YouTrack でのフィードバックをお待ちしております。使用にはオプトインが必要です(詳細は以下を参照)。
Gradleは Isolated Projects(プロジェクトの分離)機能を提供しており、個々のプロジェクトを互いに「分離」することでビルドパフォーマンスを向上させます。この機能は、プロジェクト間のビルドスクリプトとプラグインを分離し、安全に並列実行できるようにします。
この機能を有効にするには、Gradleの指示に従ってシステムプロパティを設定してください。
Isolated Projects機能の詳細については、Gradleのドキュメントを参照してください。
