Se ha lanzado ForgeZero 1.9.0 (fz), una herramienta de compilación por línea de comandos para proyectos escritos en C, C++ y lenguajes ensamblador (NASM, GAS, FASM). La herramienta no requiere un Makefile ni otros archivos de configuración para su uso básico. El código del proyecto está escrito en Go y tiene licencia MIT.
ForgeZero detecta el tipo de archivo y selecciona automáticamente el backend adecuado. Cada archivo de código se compila en un archivo objeto, se comprueba si hay símbolos globales duplicados en todos los objetos y se enlaza en un único archivo ejecutable. Los archivos compilados se almacenan en caché y se vuelven a compilar solo después de que se realicen cambios en los archivos de código asociados. Opcionalmente, es posible realizar un seguimiento de los cambios en el sistema de archivos y recompilar después de actualizar los archivos de código.
Los compiladores compatibles son GCC, Clang, G++ y Clang++; los ensambladores son NASM, GAS y FASM; los enlazadores son LD, GCC y Clang; y se admite el archivador AR. Las advertencias obligatorias para C y C++ son: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". Los sanitizadores AddressSanitizer y UndefinedBehaviorSanitizer están habilitados por defecto (se pueden deshabilitar con la bandera -sanitize=false). Las plataformas compatibles son: Linux, macOS, Windows (WSL2 y experimentalmente nativo).
Características de la versión 1.9.0:
- Se agregó la bandera "-target". , que permite la compilación cruzada para cualquier arquitectura con las herramientas de prefijo adecuadas. fz determina automáticamente los nombres del compilador, el enlazador y el archivador en función del identificador especificado (por ejemplo, "arm-linux-gnueabihf-gcc"). Se admiten todas las plataformas de destino GNU estándar, incluidas arm-linux-gnueabihf, aarch64-linux-gnu y riscv64-linux-gnu.
- Se ha implementado la compatibilidad con el Protocolo de servidor de lenguaje (LSP). La bandera "-compile-commands" genera un archivo compile_commands.json (Base de datos de compilación) en la raíz del proyecto. El archivo es leído por el lenguaje. servidores clangd y ccls, que proporcionan autocompletado, navegación de código y diagnósticos en editores que admiten LSP (Neovim, VSCode, CLion, Emacs, etc.).
- El comando fz "-update" ahora guarda el binario actual en /usr/local/bin/fz.old antes de instalar una nueva versión, lo que permite volver a la versión anterior sin necesidad de reinstalar.
- Se corrigió un error en proyectos con varios directorios donde archivos con nombres base idénticos de diferentes subdirectorios sobrescribían los archivos objeto de los demás. Ahora, los nombres de los archivos objeto se generan a partir de la ruta relativa completa al archivo fuente.
- Se implementó el modo interactivo "fz -shell" para compilar archivos individuales.
- Se ha añadido cobertura de pruebas para los comandos SplitCommand, CmdSet y CmdBuild. La cobertura de pruebas para el paquete del enlazador ha aumentado del 17 % al 60 %, y la cobertura para todos los paquetes ha superado el 40 %.
- Se ha añadido un mecanismo de sustitución de CheckTool para probar escenarios con componentes de la cadena de herramientas faltantes.
Cambios respecto a versiones anteriores:
- La versión 1.8.0 implementa el ensamblaje de bibliotecas estáticas (-type static / -lib), garantiza la unicidad de los nombres de los archivos objeto en proyectos multidirectorio y corrige errores en el subsistema de ensamblaje relacionados con el recorrido de la ruta ".."
- La versión 1.7.0 añade compilación paralela (-j N, 0 — autodetección del número de núcleos), compatibilidad con scripts de enlazador (-T) y direcciones de punto de entrada (-Ttext), modo interactivo (fz -shell), selección explícita del formato de salida (elf32, elf64, bin), compilación de archivos C++ (.cpp, .cc, .cxx) con las mismas banderas de advertencia estrictas que para C.
- La versión 1.6.0 añade la inicialización del proyecto (fz -init, crea .fz.yaml, .fzignore, README.md), compatibilidad con el formato bin (-format bin) para gestores de arranque y firmware, y campos de configuración libs, flags.cc, flags.asm, flags.ld.
- La versión 1.5.0 introduce múltiples directorios de origen (source_dirs), listas de archivos explícitas (source_files), patrones de inclusión/exclusión, un campo libs para las bibliotecas del enlazador, el archivo .fzignore y la fusión multinivel de archivos de configuración.
Fuente: opennet.ru
