Opublikowano wydanie ForgeZero 1.9.0 (fz), konsolowego narzędzia do kompilacji dla projektów w językach C, C++ i asemblerze (NASM, GAS, FASM). Narzędzie nie wymaga tworzenia pliku Makefile ani innych plików konfiguracyjnych do podstawowego użycia. Kod projektu jest napisany w języku Go i jest dostępny na licencji MIT.
ForgeZero określa typ pliku i automatycznie wybiera niezbędny backend. Każdy plik z kodem jest kompilowany do pliku obiektowego, po czym następuje sprawdzenie duplikujących globalnych symboli we wszystkich obiektach oraz łączenie ich w jeden plik wykonywalny. Skompilowane pliki są buforowane i ponownie kompilowane tylko po wprowadzeniu zmian w powiązanych z nimi plikach z kodem. Istnieje opcjonalne śledzenie zmian w systemie plików i ponowna kompilacja po aktualizacji plików z kodem.
Obsługiwane kompilatory to GCC, Clang, G++, Clang++; asemblerzy NASM, GAS, FASM; linkerzy LD, GCC, Clang; archiwizator AR. Obowiązkowe ostrzeżenia dla C i C++: „-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion”. Domyślnie włączone są sanitizery AddressSanitizer i UndefinedBehaviorSanitizer (można je wyłączyć flagą -sanitize=false). Obsługiwane platformy to Linux, macOS, Windows (WSL2 i eksperymentalnie natywnie).
Główne zmiany w wersji 1.9.0:
- Dodano flagę „-target” , umożliwiającą przeprowadzanie cross-kompilacji dla dowolnej architektury przy posiadaniu odpowiednich narzędzi prefiksowych. fz samodzielnie określa nazwy kompilatora, linkera i archiwizatora na podstawie podanego identyfikatora (np. „arm-linux-gnueabihf-gcc”). Obsługiwane są wszelkie standardowe cele GNU, w tym arm-linux-gnueabihf, aarch64-linux-gnu i riscv64-linux-gnu.
- Wprowadzono wsparcie dla protokołu LSP (Language Server Protocol). Flaga „-compile-commands” generuje plik compile_commands.json (Compilation Database) w głównym katalogu projektu. Plik jest odczytywany przez języki serwerami clangd i ccls, zapewniając funkcje autouzupełniania, nawigacji po kodzie oraz diagnostyki w edytorach wspierających LSP (Neovim, VSCode, CLion, Emacs i in.).
- Polecenie fz „-update” przed zainstalowaniem nowej wersji teraz zapisuje aktualny plik binarny w /usr/local/bin/fz.old, co pozwala na powrót do poprzedniej wersji bez ponownej instalacji.
- Naprawiono błąd, w którym w projektach wielokatalogowych pliki o tych samych podstawowych nazwach z różnych podkatalogów nadpisywały pliki obiektowe nawzajem. Nazwy plików obiektowych są teraz tworzone na podstawie pełnej względnej ścieżki do pliku źródłowego.
- Wprowadzono interaktywny tryb „fz -shell” do budowy pojedynczych plików.
- Dodano pokrycie testowe dla poleceń SplitCommand, CmdSet i CmdBuild. Pokrycie testami pakietu łączenia zwiększyło się z 17% do 60%, a pokrycie wszystkich pakietów przekroczyło 40%.
- Dodano mechanizm podmiany CheckTool do testowania scenariuszy z brakującymi komponentami łańcucha narzędzi.
Zmiany w poprzednich wydaniach:
- W wersji 1.8.0 wprowadzono budowę statycznych bibliotek (-type static / -lib), zapewniono unikalność nazw plików obiektowych w projektach wielokatalogowych, poprawiono błędy w podsystemie budowy związane z przechodzeniem przez ścieżkę „..”.
- W wersji 1.7.0 dodano kompilację równoległą (-j N, 0 — automatyczne określenie liczby rdzeni), wsparcie dla skryptów linkera (-T) oraz adresu punktu wejścia (-Ttext), interaktywny tryb (fz -shell), jawny wybór formatu wyjścia (elf32, elf64, bin), kompilację plików C++ (.cpp, .cc, .cxx) z tymi samymi surowymi flagami ostrzeżeń co dla C.
- W wersji 1.6.0 dodano inicjalizację projektu (fz -init, tworzy .fz.yaml, .fzignore, README.md), wsparcie dla formatu bin (-format bin) dla ładowarek i oprogramowania układowego, pola konfiguracyjne libs, flags.cc, flags.asm, flags.ld.
- W wersji 1.5.0 wprowadzono wiele katalogów źródłowych (source_dirs), jawne listy plików (source_files), szablony include/exclude, pole libs dla bibliotek łączenia, plik .fzignore oraz wielopoziomowe łączenie plików konfiguracyjnych.
Źródło: opennet.ru
