ForgeZero 1.9.0 (fz)، یک ابزار ساخت خط فرمان برای پروژههای نوشته شده به زبانهای C، C++ و اسمبلی (NASM، GAS، FASM)، منتشر شده است. این ابزار برای استفاده اولیه نیازی به Makefile یا سایر فایلهای پیکربندی ندارد. کد پروژه با زبان Go نوشته شده و تحت مجوز MIT است.
ForgeZero نوع فایل را تشخیص میدهد و به طور خودکار backend مناسب را انتخاب میکند. هر فایل کد در یک فایل شیء کامپایل میشود، سپس نمادهای سراسری تکراری در تمام اشیاء بررسی شده و به یک فایل اجرایی واحد پیوند داده میشوند. فایلهای کامپایل شده ذخیره میشوند و فقط پس از اعمال تغییرات در فایلهای کد مرتبط، دوباره کامپایل میشوند. به صورت اختیاری، ردیابی تغییرات سیستم فایل و کامپایل مجدد پس از بهروزرسانی فایل کد امکانپذیر است.
کامپایلرهای پشتیبانیشده عبارتند از GCC، Clang، G++ و Clang++؛ اسمبلرها NASM، GAS و FASM؛ لینکرها LD، GCC و Clang هستند؛ و از بایگانیکننده AR نیز پشتیبانی میشود. هشدارهای اجباری برای C و C++ عبارتند از: "-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion". ضدعفونیکنندههای AddressSanitizer و UndefinedBehaviorSanitizer بهطور پیشفرض فعال هستند (میتوان آنها را با پرچم -sanitize=false غیرفعال کرد). پلتفرمهای پشتیبانیشده عبارتند از: Linux, macOS, Windows (WSL2 و به صورت آزمایشی بومی).
اصل تغییرات در نسخه 1.9.0:
- پرچم "-target" اضافه شد که امکان کامپایل متقابل را برای هر معماری با ابزارهای پیشوند مناسب فراهم میکند. fz به طور خودکار نام کامپایلر، پیونددهنده و بایگانیکننده را بر اساس شناسه مشخص شده (مثلاً "arm-linux-gnueabihf-gcc") تعیین میکند. همه پلتفرمهای هدف استاندارد GNU از جمله arm-linux-gnueabihf، aarch64-linux-gnu و riscv64-linux-gnu پشتیبانی میشوند.
- پشتیبانی از پروتکل سرور زبان (LSP) پیادهسازی شده است. پرچم "-compile-commands" یک فایل compile_commands.json (پایگاه داده کامپایل) در ریشه پروژه ایجاد میکند. این فایل توسط زبان خوانده میشود. سرورها clangd و ccls، که تکمیل خودکار، ناوبری کد و تشخیص خطا را در ویرایشگرهایی که از LSP پشتیبانی میکنند (Neovim، VSCode، CLion، Emacs و غیره) ارائه میدهند.
- دستور fz "-update" اکنون قبل از نصب نسخه جدید، فایل باینری فعلی را در /usr/local/bin/fz.old ذخیره میکند و به شما امکان میدهد بدون نصب مجدد، به نسخه قبلی برگردید.
- اشکالی که در پروژههای چند دایرکتوری وجود داشت و در آن فایلهایی با نامهای پایه یکسان از زیردایرکتوریهای مختلف، فایلهای شیء یکدیگر را رونویسی میکردند، برطرف شد. نام فایلهای شیء اکنون بر اساس مسیر نسبی کامل به فایل منبع تولید میشوند.
- حالت تعاملی "fz -shell" برای ساخت فایلهای تکی پیادهسازی شد.
- پوشش تست برای دستورات SplitCommand، CmdSet و CmdBuild اضافه شده است. پوشش تست برای بسته linker از ۱۷٪ به ۶۰٪ افزایش یافته است و پوشش برای همه بستهها از ۴۰٪ فراتر رفته است.
- یک مکانیزم جایگزینی CheckTool برای آزمایش سناریوهایی با اجزای زنجیره ابزار از دست رفته اضافه شد.
تغییرات نسبت به نسخههای قبلی:
- نسخه ۱.۸.۰ اسمبلی کتابخانههای ایستا (-type static / -lib) را پیادهسازی میکند، منحصر به فرد بودن نام فایلهای شیء را در پروژههای چند مسیره تضمین میکند و خطاهای مربوط به پیمایش مسیر ".." در زیرسیستم اسمبلی را برطرف میکند.
- نسخه ۱.۷.۰ کامپایل موازی (-j N, 0 — تشخیص خودکار تعداد هستهها)، پشتیبانی از اسکریپتهای لینکر (-T) و آدرسهای نقطه ورودی (-Ttext)، حالت تعاملی (fz -shell)، انتخاب صریح فرمت خروجی (elf32، elf64، bin)، کامپایل فایلهای C++ (.cpp، .cc، .cxx) با همان پرچمهای هشدار دقیق مانند C را اضافه میکند.
- نسخه ۱.۶.۰ مقداردهی اولیه پروژه (fz -init، ایجاد .fz.yaml، .fzignore، README.md)، پشتیبانی از فرمت bin (-format bin) برای بوت لودرها و میانافزار، و فیلدهای پیکربندی libs، flags.cc، flags.asm، flags.ld را اضافه میکند.
- نسخه ۱.۵.۰ چندین دایرکتوری منبع (source_dirs)، فهرستهای صریح فایل (source_files)، الگوهای شامل/غیرشامل، یک فیلد libs برای کتابخانههای لینکر، فایل .fzignore و ادغام چند سطحی فایلهای پیکربندی را معرفی میکند.
منبع: opennet.ru
