forgezero
- title
- forgezero
- type
- toolbox
- summary
- Инструмент сборки без Makefile, объединяющий NASM/GAS/FASM/GCC в одной команде со строгими проверками
- tags
- go, assembly, build-tool, nasm, gas, fasm, c, watchlist
- language
- Go
- license
- MIT
- created
- 2026-05-19
- updated
- 2026-07-22
- lang
- ru
- translation_of
- forgezero
- source_updated
- 2026-07-22
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Инструмент сборки в виде единого бинарника для ассемблера и C/C++, объединяющий NASM, GAS, FASM, GCC, Clang и LD в одной команде fz. Полностью избавляет от Makefile: достаточно указать файл или каталог, утилита сама выберет нужный бэкенд по расширению и скомпонует бинарник. Целевая аудитория - те, кто пишет на .asm и bare-metal C: авторы ядер, загрузчиков и прошивок, которым надоело вручную связывать nasm -felf64 + ld -T linker.ld на каждой итерации.
Отслеживается здесь, так как настройки по умолчанию для инструмента сборки непривычно бескомпромиссны, а набор возможностей v1.9 шире, чем можно судить по числу звёзд. Внесён в watchlist - подробности в разделе "Статус" ниже.
Примечательные архитектурные решения
Строгий C по умолчанию. Каждый .c файл собирается с -Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion без возможности их отключить. Те же флаги действуют и для C++ (-Wpedantic применим и к ISO C++). Предупреждения останавливают сборку. Никаких -Wno-anything.
Санитайзеры включены по умолчанию. -fsanitize=address,undefined для любой сборки C/C++, если не указан -sanitize=false. Флаг -strict добавляет -fsanitize-address-use-after-return=always (только для Clang) и -fsanitize-address-use-after-scope. Большинство инструментов сборки оставляют санитайзеры выключенными - здесь всё наоборот: отличная ставка на корректность, но неудобно для релизных сборок (их нужно не забыть отключить).
Три режима линковки. -mode auto последовательно пробует gcc -> gcc -no-pie -> ld. -mode c принудительно вызывает gcc/clang (для программ с libc). -mode raw вызывает ld напрямую без C runtime - вариант для ядер и загрузчиков, который работает в связке с -T <script> и -Ttext <addr> для управления раскладкой памяти. Из-за конфликтов флагов санитайзеров -type static не сочетается с -mode raw.
Проверка символов перед линковкой. Перед компоновкой fz прогоняет nm (запасные варианты: objdump, readelf) по всем объектным файлам и отказывается линковать, если какой-либо глобальный символ объявлен дважды. Это перехватывает классические ошибки вроде "двух _start" или дубликатов функций до того, как линкер выдаст своё невнятное сообщение. Отключается флагом -no-symbol-check, если используются weak-символы.
Кэш сборки по ключу (SHA-256 исходника, debug, mode, target). Хранится в .fz_cache/. Наличие компонента target означает, что смена -target arm-linux-gnueabihf корректно инвалидирует кэш, а не переиспользует нативные объектные файлы.
Многоуровневое слияние конфигураций. /etc/fz/fz.yaml (системный) -> ~/.config/fz/fz.yaml (пользовательский) -> .fz.yaml (проектный) -> флаги CLI. Каждый уровень переопределяет предыдущий. Общесистемный уровень необычен - большинство инструментов останавливаются на пользовательском.
Защита от коллизий имён объектных файлов. src/sub/hello.asm компилируется в src_sub_hello_asm.o вместо hello.o, благодаря чему многокаталожные проекты с одинаковыми базовыми именами файлов (например, несколько utils.c) собираются без проблем. Это исправление появилось в v1.8 после обнаружения очевидного бага.
Интерфейс командной строки
fz -asm hello.asm # single file
fz -cc main.cpp # C or C++
fz -dir ./src # recursive scan + link
fz -dir ./src -type static -lib mylib # produces libmylib.a
fz -cc main.c -target arm-linux-gnueabihf # cross-compile
fz -compile-commands # emit compile_commands.json for clangd
fz -dir ./src -watch # fsnotify, 500ms debounce
fz -dir ./src -json # CI-shaped JSON report
fz -shell # REPL
fz -init # scaffolds .fz.yaml, .fzignore, README.md
Флаг -j N задаёт параллельную сборку, -j 0 задействует все ядра. Кросс-компиляция ищет инструменты с префиксами (<triple>-gcc, <triple>-g++, <triple>-ar) в PATH и завершается с кодом 2, если они не найдены.
Поддерживаемые расширения: .asm (NASM), .s / .S (GAS, последний с препроцессингом C), .fasm (требуется отдельная установка flatassembler.net), .c, .cpp / .cc / .cxx. Всё остальное молча пропускается.
Что интересно, а что нет
Действительно новые вещи - это позиция "строгие предупреждения и санитайзеры по умолчанию", а также предварительная проверка символов до вызова линкера. Всё остальное (кэш сборки, режим отслеживания изменений, JSON-вывод, генерация compile_commands, REPL, параллельная сборка) сделано добротно, но вполне стандартно - ценность в том, что это объединено с поддержкой ассемблера, тогда как большинство современных инструментов сборки ориентируются на C/C++/Rust.
Другой способ избавиться от Makefile - вообще не писать инструмент сборки. ultimate-gojust закрывает те же задачи для Go (сборка с пробросом версий, кросс-компиляция, тесты, линтинг, watch, миграции) в виде единого Justfile, который копируется в проект и не требует ничего, кроме just. Компромисс обычный: fz может навязывать свои настройки по умолчанию, так как сам управляет вызовом компилятора, тогда как Justfile - это просто текст, который любой может отредактировать в обход ограничений.
Кросс-компиляция реализована через поиск префиксов GNU triple, а не через вызов clang с -target. Поэтому riscv64-linux-gnu-gcc уже должен быть в PATH; свой toolchain fz не поставляет. Это делает его тонкой обёрткой над пакетами дистрибутива: нормальный подход, но кросс-компиляция сломается, как только в вашем дистрибутиве не окажется нужного пакета.
Статус
Репозиторию два месяца (создан 2026-03-15), один автор (alexvoste), 5 звёзд, лицензия MIT, репозиторий только что перенесён в организацию forgezero-cli. Несмотря на тег v1.9.0, проект явно находится на стадии до широкого внедрения. Агрессивный темп релизов (с 1.5 до 1.9 за два месяца) говорит о быстрой разработке одним человеком, а не о стабильном интерфейсе.
Поддержка macOS "в процессе". Поддержка Windows "экспериментальная" и требует MSYS2 + ручной установки NASM + ухищрений с Clang для работы санитайзеров. Так что реальная целевая платформа сегодня - Linux.
В списке watchlist - повторная проверка 2026-08-19. Интересно увидеть: появление второго контрибьютора, паритет поддержки macOS/Windows, способность концепции строгих умолчаний без обходных путей выдержать обратную связь от реальных пользователей, и сможет ли проект выйти за рамки ниши "пишу ядра ОС ради удовольствия".
Репозиторий
github.com/forgezero-cli/ForgeZero - Go, MIT, 5 звёзд, v1.9.0 (2026-05-18).