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

Bygga Clause

Så bygger man clau och clause_runtime, konfigurerar bygget, kör testerna och använder utvecklarverktygen. Testdesign och resultat finns i validering.

Krav

På macOS (Erlang valfritt):

xcode-select --install
brew install cmake boost tomlplusplus llvm@23 erlang

Konfigurera och bygga

cmake --preset debug                    # build/debug, single configuration
cmake --build --preset debug

På Windows, från ett x64-utvecklarskal med clang-cl och ninja i PATH:

cmake --preset windows                  # build/windows, Ninja Multi-Config
cmake --build --preset windows-debug
cmake --build --preset windows-release

Förinställningen debug lägger clau i build/debug/bin; förinställningen windows i build/windows/bin/<Config>/clau.exe, med runtime i build/windows/lib/<Config>/clause_runtime.lib. clau hittar runtime-arkivet och modulerna i library/ relativt till sin egen plats.

Omslag

Miljövariabler som åsidosätter: BUILD_DIR, TOOL_BUILD_DIR, BUILD_TYPE, JOBS, CMAKE, CTEST, CMAKE_ARGS, CLANG_FORMAT.

MakefileWindowsGör
make buildmake-build.batBygger clau i build/tool utan tester (batchskriptet bygger Release och även runtime)
make test, make test-fullmake-test.batKonfigurerar build/debug med tester, bygger allt, kör CTest
make format, make format-allmake-format.batKör clang-format på ändrade (eller, med FORMAT_SCOPE=all, alla) C++-filer
make benchmarkmake-benchmark.batRelease-bygge i build/bench, sedan jämförelse med värdens OTP
make cleanmake-clean.batTar bort build/ och cmake-build*/

Batchskripten går själva in i Visual Studio x64-miljön vid behov, lägger till %ProgramFiles%\LLVM\bin i PATH när clang-cl saknas och konfigurerar om en byggkatalog som skapats med en annan generator eller kompilator; sätt CLAUSE_TOOLCHAIN=default för att behålla CMakes eget val. clau.bat (Windows) och run-macos.sh bygger först build/tool och kör sedan clau med alla argument, med anroparens arbetskatalog och slutstatus bevarade.

Konfigurationsalternativ

AlternativSyfte
-DBUILD_TESTING=ONBygg tester och deras hjälpprogram (standard OFF)
-DCLAUSE_BUILD_COMPILER=OFFBygg endast det LLVM-fria runtime-biblioteket
-DCLAUSE_BUILD_RUNTIME=OFFBygg endast kompilatorn
-DLLVM_DIR=/prefix/lib/cmake/llvmVälj en LLVM 23.1.x SDK (en ogiltig explicit sökväg misslyckas)
-DCLAUSE_DOWNLOAD_LLVM=OFFKräv en installerad SDK
-DCLAUSE_BOOST_ROOT=..., -DCLAUSE_TOML_ROOT=..., -DCLAUSE_SQLITE_ROOT=..., -DCLAUSE_PCRE2_ROOT=...Välj källkod eller installation för ett beroende (konfiguration utan nätverk)
-DCLAUSE_CLANG_EXECUTABLE=C:/path/to/clang.exeVälj den körbara Clang-filen för Windows
-DCLAUSE_OTP_AUDITS=ON, -DCLAUSE_ESCRIPT=/path/to/escriptAktivera valfria live-granskningar mot OTP och välj vilken OTP 29 som används
-DCLAUSE_TEST_DEBUG_INFO=ONBygg testprogram med felsökningsinformation (för att felsöka en krasch)
-DCLAUSE_OPTIMIZED_COMPILER=OFFBygg clau och kompilatorbiblioteken utan optimering i Debug (för att felsöka en clau-krasch)

Anmärkningar för Windows: standard-CRT är /MDd (Debug) eller /MD; en explicit CMAKE_MSVC_RUNTIME_LIBRARY måste matcha LLVM SDK:n. MSVC cl fungerar i en separat byggkatalog; MinGW stöds inte. Projektets mål behandlar varningar som fel och inkluderar beroenden som SYSTEM-headers, så undvik att lägga till beroendesökvägar via globala -I-flaggor som CXXFLAGS (i CLion, rensa ett cachat värde med -DCMAKE_CXX_FLAGS:STRING=); använd rotalternativen i stället.

Tester

cmake --preset debug -DBUILD_TESTING=ON
cmake --build --preset debug
ctest --preset debug-fast                # or windows-debug-fast
ctest --preset debug -j 16               # full mode

CLAUSE_TEST_MODE=fast (förinställningarna *-fast, make test, make-test.bat) kör en reducerad matris av optimeringar och drivrutiner och hoppar över tester märkta full_only; full (standard när inget anges, make test-full, TEST_MODE=full) kör allt. Varje test reserverar två CTest-platser, så -j N kör N/2 tester samtidigt.

Kvalitetskontroll

Lizard och clang-tidy, fastlåsta i tools/requirements-quality.txt och installerade i .venv-quality/ (använd .venv-quality/bin/python utanför Windows):

python -m venv .venv-quality
.venv-quality/Scripts/python -m pip install -r tools/requirements-quality.txt
cmake --build build/debug --target check-quality       # changed files
cmake --build build/debug --target check-quality-all   # whole tree

check-quality kontrollerar filer ändrade sedan HEAD (eller CLAUSE_QUALITY_BASE) plus en översättningsenhet per ändrad header (check-quality-all täcker alla beroende enheter) och kräver ett bygge med både kompilator och runtime aktiverade; check-complexity-all och check-clang-tidy-all kör ett verktyg. cmake/CheckClangTidy.cmake godtar QUALITY_SHARD=K/N för att dela upp en lång körning.

Prestandamätningar och listningar

make benchmark / make-benchmark.bat bygger en Release-version av clau i build/bench och jämför programmen benchmarks/bench_*.erl med värdens OTP och en äldre Clause-commit; benchmarks/run.py --help listar alternativen (prestandamätningar). De ingår aldrig i testerna.

benchmarks/compile_times.py mäter tiden för själva clau: det kör en kompileringsarbetslast (--workload W1, eller clau-argument efter --) flera gånger på prestandakärnorna med --no-cache --print-stage-times och rapporterar median, minimum och spridning för varje fas och inferenspass, de långsammaste inferenskomponenterna och om passräknare och stdout stämmer överens mellan körningarna. Med --baseline <clau.exe> alternerar de två byggena och sammanställningen visar deras förhållande. Det vägrar mäta medan byggen, tester eller en annan clau körs, om inte --force-noisy anges, och skriver JSON till build/bench/compile-times/.

decompile-debug.bat <module> och decompile-release.bat <module> skriver Debug- eller Release-assemblerkoden för en Clause-C++-källfil till <module>.debug.asm / <module>.release.asm, med källrader och avkodade namn (tools/asm.py, clang-cl-byggen; --function TEXT filtrerar).