A fost publicat release-ul ForgeZero 1.9.0 (fz), un instrument de linie de comandă pentru compilarea proiectelor în limbajele C, C++ și assembler (NASM, GAS, FASM). Instrumentul nu necesită crearea unui Makefile sau a altor fișiere de configurare pentru utilizarea de bază. Codul proiectului este scris în limbajul Go și este distribuit sub licența MIT.
ForgeZero determină tipul de fișier și alege automat backend-ul necesar. Fiecare fișier de cod este compilat într-un fișier obiect, după care se verifică simbolurile globale duplicate în toate obiectele și se realizează linkarea într-un singur fișier executabil. Fișierele compilate sunt stocate în cache și sunt recompilate doar după ce au fost efectuate modificări în fișierele de cod asociate. Este posibilă urmărirea opțională a modificărilor în FS și recompilarea după actualizarea fișierelor de cod.
Sunt suportate compilatoarele GCC, Clang, G++, Clang++; asamblorii NASM, GAS, FASM; linkerii LD, GCC, Clang; arhivatorul AR. Avertismentele obligatorii pentru C și C++: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". Sanitizerele AddressSanitizer și UndefinedBehaviorSanitizer sunt activate în mod implicit (pot fi dezactivate cu flagul -sanitize=false). Sunt suportate platformele Linux, macOS, Windows (WSL2 și experimental nativ).
Principalele modificări în versiunea 1.9.0:
- A fost adăugat flagul "-target" , care permite realizarea de cross-compilation pentru arhitecturi arbitrare, în condițiile în care există uneltele corespunzătoare. fz determină autonom numele compilatorului, linkerului și arhivatorului în funcție de identificatorul specificat (de exemplu, "arm-linux-gnueabihf-gcc"). Sunt suportate orice platforme țintă standard GNU, inclusiv arm-linux-gnueabihf, aarch64-linux-gnu și riscv64-linux-gnu.
- A fost implementat suportul pentru protocolul LSP (Language Server Protocol). Flagul "-compile-commands" generează un fișier compile_commands.json (Compilation Database) în rădăcina proiectului. Fișierul este citit de limbajele servers clangd și ccls, asigurând funcționarea completării automate, navigației în cod și diagnosticării în editorii care suportă LSP (Neovim, VSCode, CLion, Emacs etc.).
- Comanda fz "-update" înainte de instalarea unei noi versiuni acum salvează fișierul binar curent în /usr/local/bin/fz.old, ceea ce permite revenirea la versiunea anterioară fără reinstalare.
- A fost rezolvată o eroare prin care în proiectele multi-director, fișierele cu aceleași nume de bază din subdirectoare diferite se suprascriau reciproc. Numele fișierelor obiect sunt acum generate pe baza căii relative complete către fișierul sursă.
- A fost implementat modul interactiv „fz -shell” pentru compilarea fișierelor individuale.
- A fost adăugată acoperire de testare pentru comenzile SplitCommand, CmdSet și CmdBuild. Acoperirea cu teste a pachetului de legare a crescut de la 17% la 60%, iar acoperirea tuturor pachetelor a depășit 40%.
- A fost adăugat mecanismul de substituție CheckTool pentru testarea scenariilor cu componentele lipsite din toolchain.
Modificările versiunilor anterioare:
- În versiunea 1.8.0 a fost implementată compilarea bibliotecilor statice (-type static / -lib), s-a asigurat unicitatea numelui fișierelor obiect în proiectele multi-director, s-au corectat erori în subsistemul de compilare legate de traversarea căii „..”.
- În versiunea 1.7.0 s-au adăugat compilarea paralelă (-j N, 0 - auto-detectarea numărului de nuclee), suport pentru scripturi de legare (-T) și adresa punctului de intrare (-Ttext), modul interactiv (fz -shell), selecția explicită a formatului de ieșire (elf32, elf64, bin), compilarea fișierelor C++ (.cpp, .cc, .cxx) cu aceleași semnale stricte de avertizare ca pentru C.
- În versiunea 1.6.0 au fost adăugate inițializarea proiectului (fz -init, creează .fz.yaml, .fzignore, README.md), suport pentru formatul bin (-format bin) pentru bootloadere și firmware-uri, câmpuri de configurare libs, flags.cc, flags.asm, flags.ld.
- În versiunea 1.5.0 au fost implementate directoare sursă multiple (source_dirs), liste explicite de fișiere (source_files), modele include/exclude, câmpul libs pentru bibliotecile de legare, fișierul .fzignore, fuziunea multi-nivel a fișierelor de configurare.
Sursa: opennet.ro
