Aller au contenu

Compilateur Kotlin

Compilez du Kotlin 2.5 avec elide kotlinc ou dans le build d'un projet Elide, avec des plugins de compilateur intégrés comme serialization et Metro, et des JAR d'ABI.

Sur cette page

Elide intègre Kotlin 2.5.0-Beta1. Une distribution limitée à l’exécution signale que kotlinc nécessite la distribution complète.

Compiler des fichiers source

// Hello.kt
fun main() = println("Hello!")
elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt
0:12 / 0:12

Les options de kotlinc se placent après -- ; celles d’Elide, avant. elide kotlinc --help liste celles d’Elide, elide kotlinc -- -help celles de kotlinc.

elide java n’ajoute pas la bibliothèque standard Kotlin : le code qui l’appelle (listOf, joinToString) y échoue donc :

fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))
CommandeRésultat
elide kotlinc -- -d out Hello.kt puis elide java -- -cp out HelloKtNoClassDefFoundError: kotlin/collections/CollectionsKt
elide kotlinc -- -include-runtime -d hello.jar Hello.ktÉchec de la compilation
elide run Hello.ktHello Kotlin
elide build avec un artefact Jvm.JvmApplicationScript de démarrage avec la bibliothèque standard dans lib/

Options d’Elide

OptionRôle
--incrementalConserver l’état incrémental dans .dev/artifacts/kotlinc/incremental/, indexé par chemin de sortie.
--incremental-cache-dir DIRStocker l’état incrémental dans DIR.
--plugins LISTActiver exactement ces plugins intégrés : metro, serialization, atomicfu, power-assert.
--metro, --no-metroForcer l’activation ou la désactivation du plugin d’injection de dépendances Metro.
--testsActiver les plugins de test (power-assert).
--max-errors NErreurs affichées ; 0 les affiche toutes. Les avertissements sont dédupliqués et jamais limités.
--report-used-deps PATHÉcrire les entrées du classpath référencées par la sortie (strict deps de Bazel).
--persistent_workerS’exécuter comme worker persistant Bazel, en singleplex ou multiplex.
--abi-onlyExpérimental : n’écrire qu’un JAR d’ABI dans -d.

JAR d’ABI

elide kotlinc --abi-only -- -d header.jar src/**/*.kt

Le JAR contient les signatures publiques et protégées, @Metadata, les corps inline pertinents pour l’ABI, les valeurs const et les marqueurs d’arguments par défaut. Une ABI inchangée produit un JAR identique octet pour octet : les modifications de corps laissent donc les dépendants en cache.

ELIDE_KOTLINC_ABI_STRIP=1 saute la génération de code des corps. Laissez-la non définie quand l’ABI inclut des déclarations générées par des plugins, comme le $serializer de kotlinx.serialization. Les workers l’acceptent par requête.

Construire des projets

elide build compile les source sets Kotlin trouvés par convention ou déclarés dans elide.pkl.

kotlin {
  apiLevel = "auto"
  languageLevel = "auto"
  compilerOptions {
    allWarningsAsErrors = true
    optIn { "kotlin.time.ExperimentalTime" }
    freeCompilerArgs { "-Xcontext-parameters" }
  }
}
PropriétéSignificationValeur par défaut
kotlin.apiLevel, kotlin.languageLevel"1.9" … "2.5", "latest" ou "stable"."auto"
compilerOptions.optInMarqueurs passés via -opt-in.aucun
compilerOptions.progressiveMode, .extraWarnings, .allWarningsAsErrors, .suppressWarnings, .verboseLes options kotlinc correspondantes.false
compilerOptions.freeCompilerArgsArguments supplémentaires du compilateur.aucun
compilerOptions.apiVersion, .languageVersion, .jvmTargetVersions par compilation ; "auto" suit le projet."auto"
compilerOptions.javaParametersÉmettre les métadonnées de paramètres pour la réflexion Java.false
compilerOptions.jvmTargetValidationMode"ERROR", "WARNING" ou "IGNORE" en cas d’écart entre les cibles Kotlin et Java."ERROR"
compilerOptions.noStdlib, .noJdkRetirer la bibliothèque standard ou le JDK du classpath.false
compilerOptions.includeRuntimeNon pris en charge : true fait échouer la compilation Kotlin. Empaquetez avec un artefact Jvm.JvmApplication.false
compilerOptions.incrementalBuilds de projet incrémentaux.true

Chaque compilation écrit ses arguments dans kotlinc.args, à côté de sa sortie.

Plugins et fonctionnalités

kotlin.featuresEffetValeur par défaut
kotlinxBibliothèques KotlinX sur les racines de dépendances Kotlin.true
defaultPluginsSuite de plugins intégrés.true
serializationPlugin et runtime kotlinx.serialization.kotlinx && defaultPlugins
coroutinesRuntime kotlinx.coroutines.kotlinx
atomicfuPlugin et runtime kotlinx.atomicfu.kotlinx && defaultPlugins
powerAssertPlugin Power Assert.defaultPlugins
metroPlugin d’injection de dépendances Metro.defaultPlugins
reflectionkotlin-reflect implicite.true
testingBibliothèques de test Kotlin sur les source sets de test.true
kotlin {
  features {
    metro = false
  }
  plugins {
    ["org.jetbrains.kotlinx.serialization"] {
      ["mode"] = "json"
    }
  }
}

dependencies {
  maven {
    kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
  }
}
  • Chaque entrée de plugins devient -P plugin:<id>:<key>=<value>, triée par identifiant puis par clé.
  • Les plugins tiers vont dans le groupe kotlinPlugins et nécessitent un ManagedKotlinToolchain ou un CustomKotlinToolchain. Le compilateur intégré avertit Custom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be applied et compile sans eux.
  • Un plugin intégré absent de la distribution est ignoré, avec ses options, et un avertissement est émis.
  • Les bibliothèques Kotlin implicites ne vont qu’aux racines de dépendances qui contiennent des sources Kotlin. reflection = false retire kotlin-reflect ; compilerOptions.noStdlib = true le retire ainsi que la bibliothèque standard. Les dépendances déclarées sont conservées.
  • project("core").friend() expose les déclarations internal d’un projet voisin ; voir Espaces de travail.
  • Un source set voit les déclarations internal des source sets dont il dépend dans le même projet : chaque source set nommé dans son dependsOn (main pour un source set de test qui l’omet), ainsi que ceux dont ces derniers dépendent.

Choisir une chaîne d’outils

import "elide:Kotlin.pkl" as Kotlin

kotlin {
  toolchain = "embedded"                                       // the default
  // toolchain = new Kotlin.ManagedKotlinToolchain { version = "2.4.0" }
  // toolchain = new Kotlin.CustomKotlinToolchain { path = "/opt/kotlinc" }
}
Chaîne d’outilsComportement
"embedded"Le Kotlin intégré à Elide.
ManagedKotlinToolchainTélécharge cette version (préversions comprises) avec sa bibliothèque standard, reflect, ses bibliothèques de test et ses plugins Kotlin. Les versions de KotlinX, de Metro et des autres composants tiers ne changent pas ; vérifiez qu’elles correspondent.
CustomKotlinToolchainUne distribution Kotlin locale ; les plugins intégrés qui lui manquent sont ignorés.

La chaîne d’outils s’applique aux builds de projet ; elide kotlinc utilise toujours le compilateur intégré.

KAPT et KSP ne sont pas pris en charge. Le code Kotlin qui utilise des types Java générés doit les obtenir d’un source set ou d’un projet en amont.

Exemples

Partez d’un modèle :

elide init --template ktjvm       # Kotlin app with a test

Cette page vous a-t-elle aidé ?