Skip to content

Kotlin Gradleプラグインのコンパイラオプション

Kotlinの各リリースには、サポートされているターゲット(JVM、JavaScript、サポートされているプラットフォーム向けのネイティブバイナリ)のコンパイラが含まれています。

これらのコンパイラは、以下によって使用されます。

  • IDE: Kotlinプロジェクトの__Compile__または__Run__ボタンをクリックしたとき。
  • Gradle: コンソールまたはIDEでgradle buildを呼び出したとき。
  • Maven: コンソールまたはIDEでmvn compileまたはmvn test-compileを呼び出したとき。

コマンドラインコンパイラの操作チュートリアルで説明されているように、コマンドラインからKotlinコンパイラを手動で実行することもできます。

オプションの定義方法

Kotlinコンパイラには、コンパイルプロセスを調整するための多数のオプションがあります。

Gradle DSLでは、コンパイラオプションの包括的な設定が可能です。Kotlin MultiplatformおよびJVM/Androidプロジェクトで利用できます。

Gradle DSLを使用すると、ビルドスクリプト内でコンパイラオプションを次の3つのレベルで設定できます。

Kotlin compiler options levels

上位レベルの設定は、下位レベルの規約(デフォルト)として使用されます。

  • 拡張レベルで設定されたコンパイラオプションは、commonMainnativeMaincommonTestのような共有ソースセットを含む、ターゲットレベルのオプションのデフォルトになります。
  • ターゲットレベルで設定されたコンパイラオプションは、compileKotlinJvmcompileTestKotlinJvmタスクのような、コンパイルユニット(タスク)レベルのオプションのデフォルトになります。

逆に、下位レベルで行われた設定は、上位レベルの関連する設定をオーバーライドします。

  • タスクレベルのコンパイラオプションは、ターゲットまたは拡張レベルの関連する設定をオーバーライドします。
  • ターゲットレベルのコンパイラオプションは、拡張レベルの関連する設定をオーバーライドします。

どのレベルのコンパイラ引数がコンパイルに適用されているかを確認するには、GradleのロギングDEBUGレベルを使用します。 JVMおよびJS/WASMタスクの場合、ログ内で"Kotlin compiler args:"という文字列を検索します。Nativeタスクの場合、"Arguments ="という文字列を検索します。

TIP

サードパーティ製プラグインの作者の場合、オーバーライドの問題を避けるためにプロジェクトレベルで設定を適用するのが最善です。これには新しいKotlinプラグインDSL拡張タイプを使用できます。この設定については、ご自身で明示的に文書化することをお勧めします。

拡張レベル

すべてのターゲットと共有ソースセットの共通コンパイラオプションは、トップレベルのcompilerOptions {}ブロックで設定できます。

kotlin
kotlin {
    compilerOptions {
        optIn.add("kotlin.RequiresOptIn")
    }
}

ターゲットレベル

JVM/Androidターゲットのコンパイラオプションは、target {}ブロック内のcompilerOptions {}ブロックで設定できます。

kotlin
kotlin {
    target { 
        compilerOptions {
            optIn.add("kotlin.RequiresOptIn")
        }
    }
}

Kotlin Multiplatformプロジェクトでは、特定のターゲット内でコンパイラオプションを設定できます。例えば、jvm { compilerOptions {}}です。詳細については、Multiplatform Gradle DSL referenceを参照してください。

コンパイルユニットレベル

特定のコンパイルユニットまたはタスクのコンパイラオプションは、タスク設定内のcompilerOptions {}ブロックで設定できます。

Kotlin
tasks.named<KotlinJvmCompile>("compileKotlin"){
    compilerOptions {
        optIn.add("kotlin.RequiresOptIn")
    }
}

KotlinCompilationを介して、コンパイルユニットレベルでコンパイラオプションにアクセスして設定することもできます。

Kotlin
kotlin {
    target {
        val main by compilations.getting {
            compileTaskProvider.configure {
                compilerOptions {

                }
            }
        }
    }
}

JVM/AndroidおよびKotlin Multiplatformとは異なるターゲットのプラグインを設定したい場合は、対応するKotlinコンパイルタスクのcompilerOptions {}プロパティを使用します。以下の例は、KotlinとGroovy DSLの両方でこの設定を行う方法を示しています。

kotlin
tasks.named("compileKotlin", org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask::class.java) {
    compilerOptions {
        apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
    }
}
groovy
tasks.named('compileKotlin', org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask.class) {
    compilerOptions {
        apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
    }
}

JVMをターゲットにする

前述のとおり、JVM/Androidプロジェクトのコンパイラオプションは、拡張、ターゲット、コンパイルユニットレベル(タスク)で定義できます。

デフォルトのJVMコンパイルタスクは、プロダクションコードにはcompileKotlin、テストコードにはcompileTestKotlinと呼ばれます。カスタムソースセットのタスクは、compile<Name>Kotlinパターンに従って命名されます。

ターミナルでgradlew tasks --allコマンドを実行し、Other tasksグループでcompile*Kotlinタスク名を検索することで、Androidコンパイルタスクのリストを確認できます。

留意すべきいくつかの重要な詳細点があります。

  • android.kotlinOptionskotlin.compilerOptionsの設定ブロックは互いにオーバーライドします。最後の(最も低い)ブロックが適用されます。
  • kotlin.compilerOptionsは、プロジェクト内のすべてのKotlinコンパイルタスクを設定します。
  • kotlin.compilerOptions DSLによって適用された設定は、tasks.named<KotlinJvmCompile>("compileKotlin") { }(またはtasks.withType<KotlinJvmCompile>().configureEach { })のアプローチを使用してオーバーライドできます。

JavaScriptをターゲットにする

JavaScriptコンパイルタスクは、プロダクションコードにはcompileKotlinJs、テストコードにはcompileTestKotlinJs、カスタムソースセットにはcompile<Name>KotlinJsと呼ばれます。

単一のタスクを設定するには、その名前を使用します。

kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

val compileKotlin: KotlinCompilationTask<*> by tasks

compileKotlin.compilerOptions.suppressWarnings.set(true)
groovy
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named('compileKotlin', KotlinCompilationTask) {
    compilerOptions {
        suppressWarnings = true
    }
}

Gradle Kotlin DSLを使用する場合、最初にプロジェクトのtasksからタスクを取得する必要があることに注意してください。

JSターゲットと共通ターゲットには、それぞれKotlin2JsCompileおよびKotlinCompileCommonタイプを使用します。

ターミナルでgradlew tasks --allコマンドを実行し、Other tasksグループでcompile*KotlinJSタスク名を検索することで、JavaScriptコンパイルタスクのリストを確認できます。

すべてのKotlinコンパイルタスク

プロジェクト内のすべてのKotlinコンパイルタスクを設定することも可能です。

kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named<KotlinCompilationTask<*>>("compileKotlin").configure {
    compilerOptions { /*...*/ }
}
groovy
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named('compileKotlin', KotlinCompilationTask) {
    compilerOptions { /*...*/ }
}

すべてのコンパイラオプション

Gradleコンパイラのオプションの完全なリストを以下に示します。

共通属性

名前説明指定可能な値デフォルト値
optInopt-inコンパイラ引数のリストを設定するためのプロパティlistOf( /* opt-ins */ )emptyList()
progressiveModeプログレッシブコンパイラモードを有効にしますtrue, falsefalse
extraWarningstrueの場合に警告を発する追加の宣言、式、型に関するコンパイラチェックを有効にしますtrue, falsefalse

JVM固有の属性

名前説明指定可能な値デフォルト値
javaParametersメソッドパラメータに対するJava 1.8リフレクション用のメタデータを生成しますfalse
jvmTarget生成されるJVMバイトコードのターゲットバージョン"1.8", "9", "10", ..., "22", "23"。また、コンパイラオプションの型も参照"1.8"
noJdkJavaランタイムをクラスパスに自動的に含めないfalse
jvmTargetValidationModeWARNING, ERROR, IGNOREERROR

JVMとJavaScriptに共通の属性

名前説明指定可能な値デフォルト値
allWarningsAsErrors警告がある場合にエラーとして報告しますfalse
suppressWarnings警告を生成しませんfalse
verbose詳細なロギング出力を有効にします。Gradleのデバッグログレベルが有効な場合にのみ機能しますfalse
freeCompilerArgs追加のコンパイラ引数のリスト。実験的な-X引数もここで使用できます。追加引数のfreeCompilerArgs経由での使用例を参照[]
apiVersion宣言の使用をバンドルされたライブラリの指定されたバージョンからのものに制限します"1.8", "1.9", "2.0", "2.1", "2.2" (EXPERIMENTAL)
languageVersion指定されたKotlinバージョンとのソース互換性を提供します"1.8", "1.9", "2.0", "2.1", "2.2" (EXPERIMENTAL)

DANGER

将来のリリースでfreeCompilerArgs属性を非推奨にする予定です。Kotlin Gradle DSLで不足しているオプションがある場合は、課題を提出してください。

freeCompilerArgsを介した追加引数の使用例

freeCompilerArgs属性を使用して、追加の(実験的なものを含む)コンパイラ引数を指定できます。この属性に単一の引数を追加することも、引数のリストを追加することもできます。

kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

kotlin {
    compilerOptions {
        // Specifies the version of the Kotlin API and the JVM target
        apiVersion.set(KotlinVersion.KOTLIN_2_1)
        jvmTarget.set(JvmTarget.JVM_1_8)
        
        // Single experimental argument
        freeCompilerArgs.add("-Xexport-kdoc")

        // Single additional argument
        freeCompilerArgs.add("-Xno-param-assertions")

        // List of arguments
        freeCompilerArgs.addAll(
            listOf(
                "-Xno-receiver-assertions",
                "-Xno-call-assertions"
            )
        ) 
    }
}
groovy
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
// ...

tasks.named('compileKotlin', KotlinCompilationTask) {
    compilerOptions {
        // Specifies the version of the Kotlin API and the JVM target
        apiVersion = KotlinVersion.KOTLIN_2_1
        jvmTarget = JvmTarget.JVM_1_8
        
        // Single experimental argument
        freeCompilerArgs.add("-Xexport-kdoc")
        
        // Single additional argument, can be a key-value pair
        freeCompilerArgs.add("-Xno-param-assertions")
        
        // List of arguments
        freeCompilerArgs.addAll(["-Xno-receiver-assertions", "-Xno-call-assertions"])
    }
}

TIP

freeCompilerArgs属性は、拡張ターゲット、およびコンパイルユニット(タスク)の各レベルで利用可能です。

languageVersionの設定例

言語バージョンを設定するには、次の構文を使用します。

kotlin
kotlin {
    compilerOptions {
        languageVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_1)
    }
}
groovy
tasks
    .withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask.class)
    .configureEach {
        compilerOptions.languageVersion =
            org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_1
    }

また、コンパイラオプションの型も参照してください。

JavaScript固有の属性

名前説明指定可能な値デフォルト値
friendModulesDisabled内部宣言のエクスポートを無効にしますfalse
mainmain関数が実行時に呼び出されるべきかどうかを指定しますJsMainFunctionExecutionMode.CALL, JsMainFunctionExecutionMode.NO_CALLJsMainFunctionExecutionMode.CALL
moduleKindコンパイラによって生成されるJSモジュールの種類JsModuleKind.MODULE_AMD, JsModuleKind.MODULE_PLAIN, JsModuleKind.MODULE_ES, JsModuleKind.MODULE_COMMONJS, JsModuleKind.MODULE_UMDnull
sourceMapソースマップを生成しますfalse
sourceMapEmbedSourcesソースファイルをソースマップに埋め込みますJsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_INLINING, JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_NEVER, JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_ALWAYSnull
sourceMapNamesPolicyKotlinコードで宣言した変数名と関数名をソースマップに追加します。動作の詳細については、コンパイラリファレンスを参照してくださいJsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_FQ_NAMES, JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES, JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_NOnull
sourceMapPrefixソースマップ内のパスに指定されたプレフィックスを追加しますnull
target特定のECMAバージョン向けのJSファイルを生成します"es5", "es2015""es5"
useEsClasses生成されたJavaScriptコードでES2015クラスを使用できるようにします。ES2015ターゲットを使用する場合はデフォルトで有効null

コンパイラオプションの型

一部のcompilerOptionsでは、String型ではなく新しい型を使用します。

オプション
jvmTargetJvmTargetcompilerOptions.jvmTarget.set(JvmTarget.JVM_11)
apiVersionlanguageVersionKotlinVersioncompilerOptions.languageVersion.set(KotlinVersion.KOTLIN_2_1)
mainJsMainFunctionExecutionModecompilerOptions.main.set(JsMainFunctionExecutionMode.NO_CALL)
moduleKindJsModuleKindcompilerOptions.moduleKind.set(JsModuleKind.MODULE_ES)
sourceMapEmbedSourcesJsSourceMapEmbedModecompilerOptions.sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_INLINING)
sourceMapNamesPolicyJsSourceMapNamesPolicycompilerOptions.sourceMapNamesPolicy.set(JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_FQ_NAMES)

次のステップ

詳細については、以下を参照してください。