Skip to content

コンピレーションの構成

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

各ターゲットには、デフォルトのコンピレーションとして以下が含まれます。

Compilations

製品コードと単体テスト以外のものをコンパイルする必要がある場合、たとえば結合テストやパフォーマンステストの場合は、カスタムコンピレーションを作成できます。

アーティファクトがどのように生成されるかを以下で構成できます。

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

すべてのコンピレーションを構成する

この例では、すべてのターゲットに共通するコンパイラオプションを構成します。

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 {
                // Import main and its classpath as dependencies and establish internal visibility
                associateWith(main)
                defaultSourceSet {
                    dependencies {
                        implementation(kotlin("test-junit"))
                        /* ... */
                    }
                }
                
                // Create a test task to run the tests produced by this compilation:
                testRuns.create("integration") {
                    // Configure the test task
                    setExecutionSourceFrom(integrationTest)
                }
            }
        }
    }
}
groovy
kotlin {
    jvm {
        compilations.create('integrationTest') {
            def main = compilations.main
            // Import main and its classpath as dependencies and establish internal visibility
            associateWith(main)
            defaultSourceSet {
                dependencies {
                    implementation kotlin('test-junit')
                    /* ... */
                }
            }

            // Create a test task to run the tests produced by this compilation
            testRuns.create('integration') {
                // Configure the test task
                setExecutionSourceFrom(compilations.integrationTest)
            }
        }
    }
}

コンピレーションを関連付けることで、メインコンピレーションの出力を依存関係として追加し、コンピレーション間のinternal可視性を確立します。

カスタムコンピレーションは他のケースでも必要です。たとえば、最終的なアーティファクトで異なるJVMバージョンのコンピレーションを結合したい場合や、すでにGradleでソースセットを設定していてマルチプラットフォームプロジェクトに移行したい場合などです。

androidTargetのカスタムコンピレーションを作成するには、Android Gradleプラグインを通じてビルドバリアントを設定してください。

JVMのコンピレーション

マルチプラットフォームプロジェクトでjvmターゲットを宣言すると、Kotlin Multiplatformプラグインは自動的にJavaソースセットを作成し、それらをJVMターゲットのコンピレーションに含めます。

共通ソースセットにはJavaリソースを含めることができないため、それらをマルチプラットフォームプロジェクトの対応する子ディレクトリに配置する必要があります。たとえば:

Java source files

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

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

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

kotlin
// Shared module's `build.gradle.kts` file
plugins {
    kotlin("multiplatform") version "2.2.0"
}

kotlin {
    // Specify the JVM target
    jvm {
        // Add the task for JAR generation
        tasks.named<Jar>(artifactsTaskName).configure {
            // Configure the task
        }
    }

    sourceSets {
        jvmMain {
            dependencies {
                // Add JVM-specific dependencies
            }
        }
    }
}
groovy
// Shared module's `build.gradle` file
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '2.2.0'
}

kotlin {
    // Specify the JVM target
    jvm {
        // Add the task for JAR generation
        tasks.named<Jar>(artifactsTaskName).configure {
            // Configure the task
        }
    }

    sourceSets {
        jvmMain {
            dependencies {
                // Add JVM-specific dependencies
            }
        }
    }
}

このターゲットはKotlin Multiplatformプラグインによって公開され、Javaプラグインに固有の手順は必要ありません。

ネイティブ言語との相互運用性を構成する

Kotlinはネイティブ言語との相互運用性を提供し、特定のコンピレーションのためにこれを構成するDSLを提供します。

ネイティブ言語サポートされているプラットフォームコメント
Cすべてのプラットフォーム
Objective-CAppleプラットフォーム (macOS, iOS, watchOS, tvOS)
Swift via Objective-CAppleプラットフォーム (macOS, iOS, watchOS, tvOS)Kotlinは@objc属性でマークされたSwift宣言のみを使用できます。

コンピレーションは複数のネイティブライブラリと対話できます。ビルドファイルの定義ファイルまたはcinteropsブロックで利用可能なプロパティを使用して相互運用性を構成します。

kotlin
kotlin {
    linuxX64 { // Replace with a target you need.
        compilations.getByName("main") {
            val myInterop by cinterops.creating {
                // Def-file describing the native API.
                // The default path is src/nativeInterop/cinterop/<interop-name>.def
                definitionFile.set(project.file("def-file.def"))
                
                // Package to place the Kotlin API generated.
                packageName("org.sample")
                
                // Options to be passed to compiler by cinterop tool.
                compilerOpts("-Ipath/to/headers")
              
                // Directories to look for headers.
                includeDirs.apply {
                    // Directories for header search (an equivalent of the -I<path> compiler option).
                    allHeaders("path1", "path2")
                    
                    // Additional directories to search headers listed in the 'headerFilter' def-file option.
                    // -headerFilterAdditionalSearchPrefix command line option equivalent.
                    headerFilterOnly("path1", "path2")
                }
                // A shortcut for includeDirs.allHeaders.
                includeDirs("include/directory", "another/directory")
            }
            
            val anotherInterop by cinterops.creating { /* ... */ }
        }
    }
}
groovy
kotlin {
    linuxX64 { // Replace with a target you need.
        compilations.main {
            cinterops {
                myInterop {
                    // Def-file describing the native API.
                    // The default path is src/nativeInterop/cinterop/<interop-name>.def
                    definitionFile = project.file("def-file.def")
                    
                    // Package to place the Kotlin API generated.
                    packageName 'org.sample'
                    
                    // Options to be passed to compiler by cinterop tool.
                    compilerOpts '-Ipath/to/headers'
                    
                    // Directories for header search (an equivalent of the -I<path> compiler option).
                    includeDirs.allHeaders("path1", "path2")
                    
                    // Additional directories to search headers listed in the 'headerFilter' def-file option.
                    // -headerFilterAdditionalSearchPrefix command line option equivalent.
                    includeDirs.headerFilterOnly("path1", "path2")
                    
                    // A shortcut for includeDirs.allHeaders.
                    includeDirs("include/directory", "another/directory")
                }
                
                anotherInterop { /* ... */ }
            }
        }
    }
}

Androidのコンピレーション

Androidターゲット用にデフォルトで作成されるコンピレーションは、Androidビルドバリアントに結び付けられています。各ビルドバリアントに対して、同じ名前のKotlinコンピレーションが作成されます。

次に、各バリアント用にコンパイルされる各Androidソースセットに対して、そのソースセット名にターゲット名がプレフィックスとして付けられたKotlinソースセットが作成されます。たとえば、AndroidソースセットdebugandroidTargetという名前のKotlinターゲットの場合、KotlinソースセットはandroidDebugとなります。これらのKotlinソースセットは、バリアントのコンピレーションに適切に追加されます。

デフォルトのソースセットcommonMainは、各本番(アプリケーションまたはライブラリ)バリアントのコンピレーションに追加されます。commonTestソースセットも同様に、単体テストおよび計装テストバリアントのコンピレーションに追加されます。

kaptによるアノテーション処理もサポートされていますが、現在の制限により、Androidターゲットがkaptの依存関係が構成される前に作成されている必要があり、これはKotlinソースセットの依存関係内ではなく、トップレベルのdependencies {}ブロックで行う必要があります。

kotlin
kotlin {
    androidTarget { /* ... */ }
}

dependencies {
    kapt("com.my.annotation:processor:1.0.0")
}

ソースセット階層のコンピレーション

KotlinはdependsOn関係を使用してソースセット階層を構築できます。

Source set hierarchy

ソースセットjvmMainがソースセットcommonMainに依存している場合:

  • jvmMainが特定のターゲット用にコンパイルされるたびに、commonMainもそのコンピレーションに参加し、JVMクラスファイルなどの同じターゲットバイナリ形式にコンパイルされます。
  • jvmMainのソースは、commonMainの宣言(内部宣言を含む)を「参照」し、commonMain依存関係implementation依存関係として指定されたものも含む)も参照します。
  • jvmMainは、commonMain期待される宣言に対してプラットフォーム固有の実装を含めることができます。
  • commonMainのリソースは常に処理され、jvmMainのリソースとともにコピーされます。
  • jvmMaincommonMain言語設定は一貫している必要があります。

言語設定は、次のような方法で一貫性がチェックされます。

  • jvmMainは、commonMainlanguageVersion以上であるlanguageVersionを設定する必要があります。
  • jvmMainは、commonMainが有効にしているすべての不安定な言語機能を有効にする必要があります(バグ修正機能にはそのような要件はありません)。
  • jvmMainは、commonMainが使用するすべての実験的アノテーションを使用する必要があります。
  • apiVersion、バグ修正言語機能、およびprogressiveModeは任意に設定できます。

GradleのIsolated Projects機能を構成する

この機能は実験的であり、現在Gradleではプレアルファ状態にあります。Gradle 8.10以降のバージョンでのみ、評価目的でご利用ください。この機能は、いつでも削除または変更される可能性があります。この機能に関するフィードバックをYouTrackでお待ちしております。オプトインが必要です(詳細は下記参照)。

GradleはIsolated Projects機能を提供しており、個々のプロジェクトを「分離」することでビルドパフォーマンスを向上させます。この機能は、プロジェクト間でビルドスクリプトとプラグインを分離し、並行して安全に実行できるようにします。

この機能を有効にするには、Gradleの指示に従ってシステムプロパティを設定してください。

Isolated Projects機能の詳細については、Gradleのドキュメントを参照してください。