Clause
← All dokumentation

Det engelska originalet har ändrats sedan översättningen gjordes, så delar av den kan vara inaktuella. Läs på engelska

Översatt från det engelska originalet · 1e3a39c8-dirty · 2026-10-26

TOML-projekt

Ett projektmanifest väljer ordnade grupper av Erlang-källfiler och konfigurerar varje mål oberoende. Alla CLI-åtgärder godtar projekt. Se det fungerande exemplet.

Manifest (schema 1)

schema_version = 1

[[targets]]
name = "app"
sources = ["main.erl", "src/workers/*.erl", "shared/**/*.erl"]
source_dirs = ["src/support"]
output = "build/app"
entry = "main:main"
build_dir = "build"

[targets.options]
source_search_paths = ["src", "generated"]
include_dirs = ["include", "vendor/include"]
defines = ["DEBUG", "LIMIT=100", 'LABEL="demo"']
enable_features = ["maybe_expr"]
disable_features = ["compr_assign"]
ignore_dirs = ["src/legacy", "deps/*/test"]
ignore_modules = ["telemetry", "*_SUITE"]
keep_exports = false
shell = false
cache_inference_in_dirs = ["deps/*"]

[targets.options.applications]
my_dependency = "vendor/my_dependency"

CLI och val av mål

clau [options] <source.erl>...
clau [options] --project <path> [--target <name>]...
clau --new-project <filename>

Varje valt mål är en separat kompileringsbatch med egna preprocessorsessioner. Planeringen (avkoda, välja, söka, kontrollera utdatakollisioner) avslutas innan någon källfil körs; körningen bearbetar sedan mål/filer i ordning och låser fast fel. Nyttolastutdata går till stdout i mål-/filordning utan rubriker (utom målraderna från --print-inputs); kontext och diagnostik går till stderr. Ett mål med diagnostik namnges en gång, på en rad <manifest> [target <name>]: före den första; själva diagnostiken (error: file:line:col: message) har inget verktygs- eller målprefix.

./build/debug/bin/clau --parse-check --project examples/project/project.toml
./build/debug/bin/clau --print-ast --project examples/project/project.toml --target tests --target app

Körbara filer

clau --project FILE [--target T]... (ingen --emit, ingen kontroll-/utskriftsåtgärd) länkar varje valt mål som har en output- eller entry-nyckel, eller som CLI-flaggorna -o/--entry avser, till en körbar fil per mål:

./build/debug/bin/clau --project tests/fixtures/linking/project/project.toml

Skapa ett projekt

--new-project <filename> skriver ett annoterat manifest och ingenting annat.

Byggkatalog

Varje projektmål har en byggkatalog där Clause håller sina egna temporära filer och sina cacher: målets build_dir, relativ till manifestet, som standard <manifest-dir>/build. --build-dir DIR (relativ till anropet) ersätter den för varje valt mål. Positionella indata får ingen om inte --build-dir anges.

Byggcacher

Resultat som är värda att behålla mellan körningar ligger under <build_dir>/cache; --no-cache varken läser eller skriver dem. De är svaren från laddaren av parse transforms och värd-OTP:ns lista över klistriga (sticky) moduler, så att ett varmt bygge inte startar någon erl på värden för moduler vars transformindata inte har ändrats, varje batchs kompileringsutfall, och inferensresultaten för moduler i konfigurerade kataloger.

Inferenscache

Biblioteksmoduler (källfiler från OTP:s stdlib, kernel, compiler och syntax_tools som hittas via source_search_paths, Clauses eget bibliotek) ändras sällan, så moduler i konfigurerade kataloger behåller sina typinferensresultat i byggcachen, per modul, och senare kompileringar återanvänder dem i stället för att härleda dem igen.

Sökvägar och sökning

Katalogindex

Uppslagningar efter namn sonderar inte varje kandidatkatalog. Ett index per anrop av clau, delat av alla mål, håller postnamnen för varje genomsökt katalog: listade en gång, icke-rekursivt, när en uppslagning först behöver dem, eller registrerade av de rekursiva genomgångar som expanderar ** i sources, source_dirs, source_search_paths, include_dirs och transform_paths, så att ingen katalog listas två gånger. Det besvarar missarna i modulsökningen (biblioteket, sedan source_search_paths), transformkällfiler, literala sources som hittas via source_search_paths, och lösning av inkluderingar (den inkluderande filens katalog, arbetskatalogen, inkluderingskataloger i ordning, sedan include_lib-applikationer); en kandidat som indexet innehåller öppnas eller kontrolleras fortfarande som tidigare, så företräde, ignore_dirs och felrapporter ändras inte. Inkluderingsnamn med katalogdelar (sub/x.hrl) slås upp i den katalog de namnger; namn med ..-steg, absoluta namn, relativa kataloger och listningar som misslyckas sonderas som tidigare.

Ignorerade källfiler

ignore_dirs och ignore_modules håller källfiler utanför ett mål utan att ta bort dem från trädet, t.ex. medföljande tester, äldre kod eller moduler som endast spelar roll under OTP. En ignorerad källfil hoppas över tyst: den läses, parsas, kompileras eller länkas aldrig, så den kan till och med innehålla syntaxfel.

[targets.options]
source_search_paths = ["deps/**"]
ignore_dirs = ["deps/*/test", "src/legacy"]
ignore_modules = ["telemetry", "*_SUITE"]

Effektiva alternativ

InställningKombination av manifest och CLI
include_dirsManifestets ordning, efter CLI-flaggan -I (sista CLI--I söks först); en post med jokertecken (deps/*/include, apps/**/include) expanderas på plats till de befintliga kataloger den matchar, sorterade efter sökvägens UTF-8-byte (** matchar också ingen, symboliska länkar till kataloger hoppas över); ett mönster utan träffar är ett fel
source_search_pathsReservrötter för literala källfiler och de moduler som målet namnger men inte listar; mönster expanderas som för include_dirs (utan träff: unmatched source search path pattern)
definesManifestet först, sedan CLI; dubbletter mellan dem är fel
applicationsManifestets map; CLI-poster ersätter matchande namn
Listor över språkfunktionerManifestets inställningar, sedan ordnade CLI-ändringar; CLI vinner
outputPer mål, endast körbara mål; CLI-flaggan -o åsidosätter för ett enda valt mål
entryPer mål; CLI-flaggan --entry åsidosätter för ett enda valt mål
cache_inference_in_dirsImplicita OTP-mönster, sedan manifestets, sedan CLI-flaggan --cache-inference-in-dirs (inferenscache)

Byggberoende

Kompilatorprivat toml++ 3.4.0 (MIT), endast headerfiler, med undantag, ej släppt syntax avstängd. Arkivets SHA-256 8517f65938a4faae9ccf8ebb36631a38c1cadfb5efa85d9a72e15b9e97d25155.

Byggcachen använder SQLite 3.54.0-amalgamationen (public domain), kompilerad enbart in i kompilatorns cachebibliotek (clause_sqlite, utan projektets varningsflaggor). CMake laddar ned https://www.sqlite.org/2026/sqlite-amalgamation-3540000.zip till thirdparty/ på varje värd och verifierar dess SHA-256 68e913b0fe8ec6b4e5f391c594a28872884e80d6cd042a1e50c957be46b5aa4d; -DCLAUSE_SQLITE_ROOT=<directory with sqlite3.c and sqlite3.h> har företräde och stänger av nedladdningen.

Gränser

Manifestets storlek 1 MiB; högst 1 024 mål och 100 000 TOML-noder. Varje källexpansion tillåter 100 000 besökta poster, 128 katalognivåer och 16 000 000 jokerteckenövergångar. Uttömning är ett explicit fel; detta är arbetsgränser, inte tidsfrister för I/O.