Skip to content

コンパイルの設定

Kotlinマルチプラットフォームプロジェクトは、アーティファクトを生成するためにコンパイルを使用します。各ターゲットは、プロダクション用やテスト用など、1つ以上のコンパイルを持つことができます。

各ターゲットにおいて、デフォルトのコンパイルには以下が含まれます:

コンパイル

プロダクションコードやユニットテスト以外のもの(例:統合テストやパフォーマンス性能テスト)をコンパイルする必要がある場合は、カスタムコンパイルを作成できます。

アーティファクトの生成方法は、以下のレベルで設定できます:

全ターゲットまたは特定のターゲットで利用可能なコンパイルパラメータのリストおよびコンパイラオプションを参照してください。

全てのコンパイルを設定する

この例では、全てのターゲットで共通のコンパイラオプションを設定します:

kotlin
kotlin {
    compilerOptions {
        allWarningsAsErrors.set(true)
    }
}
groovy
kotlin {
    compilerOptions {
        allWarningsAsErrors = true
    }
}

1つのターゲットのコンパイルを設定する

kotlin
kotlin {
    jvm {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_1_8)
        }
    }
}
groovy
kotlin {
    jvm {
        compilerOptions {
            jvmTarget = JvmTarget.JVM_1_8
        }
    }
}

特定のコンパイルを1つ設定する

kotlin
kotlin {
    jvm {
        val main by compilations.getting {
            compileTaskProvider.configure {
                compilerOptions {
                    jvmTarget.set(JvmTarget.JVM_1_8)
                }
            }
        }
    }
}
groovy
kotlin {
    jvm {
        compilations.main {
            compileTaskProvider.configure {
                compilerOptions {
                    jvmTarget = JvmTarget.JVM_1_8
                }
            }
        }
    }
}

カスタムコンパイルを作成する

プロダクションコードやユニットテスト以外(例:統合テストやパフォーマンス性能テスト)をコンパイルする必要がある場合は、カスタムコンパイルを作成します。

カスタムコンパイルの場合、すべての依存関係を手動で設定する必要があります。カスタムコンパイルのデフォルトソースセットは、commonMain および commonTest ソースセットに依存しません。

例えば、jvm ターゲットの統合テスト用にカスタムコンパイルを作成するには、integrationTest コンパイルと main コンパイルの間に associateWith 関係を設定します:

kotlin
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)
            }
        }
    }
}
groovy
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リソースを含めることができないため、それらはマルチプラットフォームプロジェクトの対応する子ディレクトリに配置する必要があります。例:

Javaソースファイル

現在、Kotlin Multiplatform Gradleプラグインは、Javaプラグインによって設定される一部のタスクを置き換えます:

  • JARタスク:標準の jar の代わりに、アーティファクト名に基づいたターゲット固有のタスクを使用します。例えば、jvm() ターゲット宣言の場合は jvmJarjvm("desktop") の場合は desktopJar となります。
  • テストタスク:標準の test の代わりに、アーティファクト名に基づいたターゲット固有のタスクを使用します。例えば、jvmTest となります。
  • リソース処理:*ProcessResources タスクの代わりに、リソースは対応するコンパイルタスクによって処理されます。

これらのタスクは、ターゲットが宣言されると自動的に作成されます。ただし、必要に応じてJARタスクを手動で定義し、設定することも可能です:

kotlin
// 共有モジュールの `build.gradle.kts` ファイル
plugins {
    kotlin("multiplatform") version "2.3.0"
}

kotlin {
    // JVMターゲットを指定
    jvm {
        // JAR生成用のタスクを追加
        tasks.named<Jar>(artifactsTaskName).configure {
            // タスクを設定
        }
    }

    sourceSets {
        jvmMain {
            dependencies {
                // JVM固有の依存関係を追加
            }
        }
    }
}
groovy
// 共有モジュールの `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-CAppleプラットフォーム (macOS, iOS, watchOS, tvOS)
Swift (Objective-C経由)Appleプラットフォーム (macOS, iOS, watchOS, tvOS)Kotlinは @objc 属性が付与されたSwift宣言のみを使用できます。

1つのコンパイルで複数のネイティブライブラリとやり取りできます。定義ファイル(definition file)のプロパティ、またはビルドファイルの cinterops ブロックを使用して相互運用を設定します:

kotlin
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 { /* ... */ }
        }
    }
}
groovy
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
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 のリソースと一緒にコピーされます。
  • jvmMaincommonMain言語設定は一貫している必要があります。

言語設定の一貫性は以下の方法でチェックされます:

  • 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のドキュメントを参照してください。