ForgeZero 1.9.0 (fz), een commandoregel-buildtool voor projecten geschreven in C, C++ en assembleertalen (NASM, GAS, FASM), is uitgebracht. De tool vereist geen Makefile of andere configuratiebestanden voor basisgebruik. De projectcode is geschreven in Go en is gelicentieerd onder de MIT-licentie.
ForgeZero detecteert het bestandstype en selecteert automatisch de juiste backend. Elk codebestand wordt gecompileerd tot een objectbestand, vervolgens gecontroleerd op dubbele globale symbolen in alle objecten en gekoppeld tot één uitvoerbaar bestand. Gecompileerde bestanden worden in de cache opgeslagen en alleen opnieuw gecompileerd nadat er wijzigingen zijn aangebracht in de bijbehorende codebestanden. Optioneel is het mogelijk om wijzigingen in het bestandssysteem bij te houden en opnieuw te compileren na updates van codebestanden.
De ondersteunde compilers zijn GCC, Clang, G++ en Clang++; de assemblers zijn NASM, GAS en FASM; de linkers zijn LD, GCC en Clang; en de AR-archiver wordt ondersteund. Verplichte waarschuwingen voor C en C++ zijn: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". De sanitizers AddressSanitizer en UndefinedBehaviorSanitizer zijn standaard ingeschakeld (ze kunnen worden uitgeschakeld met de vlag -sanitize=false). De ondersteunde platforms zijn: Linux, macOS, Windows (WSL2 en experimenteel native).
Belangrijkste wijzigingen in versie 1.9.0:
- De "-target"-vlag is toegevoegd. Dit maakt cross-compilatie mogelijk voor elke architectuur met de juiste prefix-tools. fz bepaalt automatisch de namen van de compiler, linker en archiver op basis van de opgegeven identifier (bijv. "arm-linux-gnueabihf-gcc"). Alle standaard GNU-doelplatformen worden ondersteund, waaronder arm-linux-gnueabihf, aarch64-linux-gnu en riscv64-linux-gnu.
- Ondersteuning voor het Language Server Protocol (LSP) is geïmplementeerd. De vlag "-compile-commands" genereert een bestand compile_commands.json (compilatiedatabase) in de projectmap. Dit bestand wordt door de taalmodule gelezen. servers clangd en ccls bieden automatische aanvulling, codenavigatie en diagnostiek in editors die LSP ondersteunen (Neovim, VSCode, CLion, Emacs, enz.).
- Het commando fz "-update" slaat nu het huidige binaire bestand op in /usr/local/bin/fz.old voordat een nieuwe versie wordt geïnstalleerd, waardoor u kunt terugkeren naar de vorige versie zonder opnieuw te hoeven installeren.
- Er is een bug verholpen in projecten met meerdere mappen, waarbij bestanden met identieke basisnamen uit verschillende submappen elkaars objectbestanden overschreven. Objectbestandsnamen worden nu gegenereerd op basis van het volledige relatieve pad naar het bronbestand.
- De interactieve modus "fz -shell" is geïmplementeerd voor het bouwen van afzonderlijke bestanden.
- Testdekking is toegevoegd voor de commando's SplitCommand, CmdSet en CmdBuild. De testdekking voor het linkerpakket is gestegen van 17% naar 60%, en de dekking voor alle pakketten samen is boven de 40% uitgekomen.
- Er is een vervangingsmechanisme voor CheckTool toegevoegd voor het testen van scenario's met ontbrekende toolchain-componenten.
Wijzigingen ten opzichte van eerdere versies:
- Versie 1.8.0 implementeert het samenstellen van statische bibliotheken (-type static / -lib), garandeert de uniciteit van objectbestandsnamen in projecten met meerdere mappen en corrigeert fouten in het samenstellingssubsysteem met betrekking tot het doorlopen van het pad "..".
- Versie 1.7.0 voegt parallelle compilatie toe (-j N, 0 — automatische detectie van het aantal cores), ondersteuning voor linker-scripts (-T) en entry point-adressen (-Ttext), interactieve modus (fz -shell), expliciete selectie van uitvoerformaat (elf32, elf64, bin), compilatie van C++-bestanden (.cpp, .cc, .cxx) met dezelfde strikte waarschuwingsvlaggen als voor C.
- Versie 1.6.0 voegt projectinitialisatie toe (fz -init, maakt .fz.yaml, .fzignore, README.md aan), ondersteuning voor bin-formaat (-format bin) voor bootloaders en firmware, en configuratievelden libs, flags.cc, flags.asm, flags.ld.
- Versie 1.5.0 introduceert meerdere bronmappen (source_dirs), expliciete bestandslijsten (source_files), include/exclude-patronen, een libs-veld voor linkerbibliotheken, het .fzignore-bestand en het samenvoegen van configuratiebestanden op meerdere niveaus.
Bron: opennet.ru
