Foi lançado o ForgeZero 1.9.0 (fz), uma ferramenta de linha de comando para compilação de projetos escritos em C, C++ e linguagens assembly (NASM, GAS, FASM). A ferramenta não requer um Makefile ou outros arquivos de configuração para uso básico. O código do projeto é escrito em Go e licenciado sob a licença MIT.
O ForgeZero detecta o tipo de arquivo e seleciona automaticamente o backend apropriado. Cada arquivo de código é compilado em um arquivo objeto, verificado quanto a símbolos globais duplicados em todos os objetos e vinculado em um único arquivo executável. Os arquivos compilados são armazenados em cache e recompilados somente após alterações serem feitas nos arquivos de código associados. Opcionalmente, é possível rastrear alterações no sistema de arquivos e recompilar após atualizações de arquivos de código.
Os compiladores suportados são GCC, Clang, G++ e Clang++; os assembladores são NASM, GAS e FASM; os linkers são LD, GCC e Clang; e o arquivador AR é suportado. Os avisos obrigatórios para C e C++ são: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". Os sanitizadores AddressSanitizer e UndefinedBehaviorSanitizer estão habilitados por padrão (podem ser desabilitados com a flag -sanitize=false). As plataformas suportadas são: Linux, macOS, Windows (WSL2 e experimentalmente nativo).
A configuração correta na versão 1.9.0:
- Adicionada a flag "-target" , que permite a compilação cruzada para qualquer arquitetura com as ferramentas de prefixo apropriadas. O fz determina automaticamente os nomes do compilador, do linker e do arquivador com base no identificador especificado (por exemplo, "arm-linux-gnueabihf-gcc"). Todas as plataformas de destino GNU padrão são suportadas, incluindo arm-linux-gnueabihf, aarch64-linux-gnu e riscv64-linux-gnu.
- O suporte ao Protocolo de Servidor de Linguagem (LSP) foi implementado. A flag "-compile-commands" gera um arquivo compile_commands.json (Banco de Dados de Compilação) na raiz do projeto. O arquivo é lido pelo programa de linguagem. servidores clangd e ccls, que fornecem autocompletar, navegação de código e diagnósticos em editores que suportam LSP (Neovim, VSCode, CLion, Emacs, etc.).
- O comando "-update" do fz agora salva o binário atual em /usr/local/bin/fz.old antes de instalar uma nova versão, permitindo que você retorne à versão anterior sem reinstalar.
- Corrigido um bug em projetos com múltiplos diretórios, onde arquivos com nomes base idênticos em subdiretórios diferentes sobrescreviam os arquivos objeto uns dos outros. Os nomes dos arquivos objeto agora são gerados com base no caminho relativo completo para o arquivo de origem.
- Implementado o modo interativo "fz -shell" para criação de arquivos individuais.
- A cobertura de testes foi ampliada para os comandos SplitCommand, CmdSet e CmdBuild. A cobertura de testes para o pacote do linker aumentou de 17% para 60%, e a cobertura para todos os pacotes ultrapassou 40%.
- Adicionado um mecanismo de substituição do CheckTool para testar cenários com componentes de cadeia de ferramentas ausentes.
Alterações em relação às versões anteriores:
- A versão 1.8.0 implementa a montagem de bibliotecas estáticas (-type static / -lib), garante a unicidade dos nomes de arquivos objeto em projetos com múltiplos diretórios e corrige erros no subsistema de montagem relacionados à travessia do caminho ".."
- A versão 1.7.0 adiciona compilação paralela (-j N, 0 — detecção automática do número de núcleos), suporte para scripts de linker (-T) e endereços de ponto de entrada (-Ttext), modo interativo (fz -shell), seleção explícita do formato de saída (elf32, elf64, bin), compilação de arquivos C++ (.cpp, .cc, .cxx) com as mesmas flags de aviso rigorosas que para C.
- A versão 1.6.0 adiciona inicialização de projeto (fz -init, cria .fz.yaml, .fzignore, README.md), suporte ao formato binário (-format bin) para bootloaders e firmware, e campos de configuração libs, flags.cc, flags.asm, flags.ld.
- A versão 1.5.0 introduz múltiplos diretórios de origem (source_dirs), listas de arquivos explícitas (source_files), padrões de inclusão/exclusão, um campo libs para bibliotecas de vinculação, o arquivo .fzignore e a mesclagem multinível de arquivos de configuração.
Fonte: opennet.ru
