Se ha publicado la versión ForgeZero 1.9.0 (fz), una herramienta de consola para proyectos en lenguajes C, C++ y ensamblador (NASM, GAS, FASM). Esta herramienta no requiere la creación de un Makefile o de otros archivos de configuración para su uso básico. El código del proyecto está escrito en Go y se distribuye bajo la licencia MIT.
ForgeZero identifica el tipo de archivo y selecciona automáticamente el backend necesario. Cada archivo de código se compila en un archivo objeto, tras lo cual se verifica la duplicación de símbolos globales en todos los objetos y se lleva a cabo la vinculación en un único archivo ejecutable. Los archivos compilados se almacenan en caché y solo se recompilan después de realizar cambios en los archivos de código relacionados. También es posible rastrear cambios en el sistema de archivos y recompilar después de actualizar los archivos de código.
Se admiten compiladores GCC, Clang, G++, Clang++; ensambladores NASM, GAS, FASM; enlazadores LD, GCC, Clang; archivadores AR. Advertencias obligatorias para C y C++: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". Por defecto, se incluyen los sanitizadores AddressSanitizer y UndefinedBehaviorSanitizer (se pueden desactivar con la opción -sanitize=false). Se admiten plataformas Linux, macOS, Windows (WSL2 y experimentalmente de forma nativa).
Principales cambios en la versión 1.9.0:
- Se ha añadido la opción "-target" , que permite realizar compilaciones cruzadas para cualquier arquitectura con el conjunto de herramientas correspondiente. Fz determina automáticamente los nombres del compilador, enlazador y archivador basándose en el identificador proporcionado (por ejemplo, "arm-linux-gnueabihf-gcc"). Se admiten todas las plataformas de destino estándar de GNU, incluidas arm-linux-gnueabihf, aarch64-linux-gnu y riscv64-linux-gnu.
- Se ha implementado el soporte para el protocolo LSP (Language Server Protocol). La opción "-compile-commands" genera un archivo compile_commands.json (Base de Datos de Compilación) en el directorio raíz del proyecto. Este archivo es leído por los lenguajes servidores clangd y ccls, proporcionando autocompletado, navegación de código y diagnóstico en editores que son compatibles con LSP (Neovim, VSCode, CLion, Emacs, entre otros).
- El comando fz "-update" antes de instalar una nueva versión ahora guarda el archivo binario actual en /usr/local/bin/fz.old, lo que permite retroceder a la versión anterior sin necesidad de reinstalar.
- Se ha corregido un error en el que, en proyectos multidirectorios, los archivos con nombres base idénticos de diferentes subcarpetas sobrescribían los archivos objeto entre sí. Los nombres de los archivos objeto ahora se generan en función de la ruta relativa completa al archivo de origen.
- Se ha implementado el modo interactivo «fz -shell» para la construcción de archivos individuales.
- Se ha añadido cobertura de pruebas para los comandos SplitCommand, CmdSet y CmdBuild. La cobertura de pruebas del paquete del vinculador ha aumentado del 17% al 60%, y la cobertura de todos los paquetes ha superado el 40%.
- Se ha agregado un mecanismo de sustitución CheckTool para probar escenarios con componentes faltantes de la cadena de herramientas.
Cambios en versiones anteriores:
- En la versión 1.8.0, se implementó la construcción de bibliotecas estáticas (-type static / -lib), se garantizó la unicidad de los nombres de los archivos objeto en proyectos multidirectorios, y se corrigieron errores en la subsistema de construcción relacionados con la navegación de la ruta «..».
- En la versión 1.7.0, se añadió la compilación paralela (-j N, 0 — auto-detección del número de núcleos), soporte para scripts de vinculador (-T) y dirección del 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 estrictas banderas de advertencia que para C.
- En la versión 1.6.0, se añadieron la inicialización del proyecto (fz -init, crea .fz.yaml, .fzignore, README.md), soporte para el formato bin (-format bin) para cargadores y firmware, campos de configuración libs, flags.cc, flags.asm, flags.ld.
- En la versión 1.5.0, se implementaron múltiples directorios de fuentes (source_dirs), listas explícitas de archivos (source_files), plantillas de inclusión/exclusión, campo libs para bibliotecas del vinculador, archivo .fzignore, y fusión jerárquica de archivos de configuración.
Fuente: opennet.ru
