πŸš€ ForgeZero v1.9.0 β€” «АрхитСктор»: LSP-интСграция, кросс-компиляция ΠΈ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Π°Ρ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ

Если Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π° C ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ гоняСтС gcc ΠΈΠ»ΠΈ страдаСтС с Makefile β€” самоС врСмя ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ForgeZero (fz). Π­Ρ‚ΠΎ zero-config build tool для C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ настройки ΠΈ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π’ вСрсии 1.9.0 β€” Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… направлСния: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° IDE Ρ‡Π΅Ρ€Π΅Π· LSP, нативная кросс-компиляция, критичСский Π±Π°Π³-фикс ΠΈ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ прирост покрытия тСстами.

1. LSP ΠΈ IDE β€” Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π²ΠΈΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Один Ρ„Π»Π°Π³ fz -compile-commands Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ compile_commands.json β€” Compilation Database, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ всС соврСмСнныС языковыС сСрвСры: clangd, ccls ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Π§Ρ‚ΠΎ это Π΄Π°Ρ‘Ρ‚ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅: Neovim + clangd β€” Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, поиск использований. VSCode + clang β€” Ρ‚ΠΎ ΠΆΠ΅ самоС, Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠΉ настройки. CLion, Helix, Emacs β€” любой Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ с LSP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚ΠΈΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ автоматичСски.

Π”ΠΎ этого fz Π±Ρ‹Π» быстрым способом ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ это полноцСнная срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ β€” Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π²ΠΈΠ΄ΠΈΡ‚ вСсь Π³Ρ€Π°Ρ„ зависимостСй ΠΈ пСрСстаёт Π²Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Β«Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»Β».

2. ΠšΡ€ΠΎΡΡ-компиляция β€” собираСм ΠΏΠΎΠ΄ ARM с x86-ΠΌΠ°ΡˆΠΈΠ½Ρ‹

Команда fz -target arm-linux-gnuebihf β€” ΠΈ всё. fz сам Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ прСфиксныС компиляторы ΠΈ Π»ΠΈΠ½ΠΊΠ΅Ρ€Ρ‹, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½Ρƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΡˆΡŒ target triple, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ fz Π±Π΅Ρ€Ρ‘Ρ‚ Π½Π° сСбя.

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для arm-linux-gnuebihf (ARMv7 hard-float: Raspberry Pi, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠ΄Π½ΠΎΠΏΠ»Π°Ρ‚Π½ΠΈΠΊΠΎΠ²) ΠΈ любого стандартного GNU-Ρ‚Ρ€ΠΈΠΏΠ»Π°. Одна ΠΊΠΎΠΌΠ°Π½Π΄Π° β€” Π±ΠΈΠ½Π°Ρ€ΡŒ для ARM Π³ΠΎΡ‚ΠΎΠ², Π½Π΅ вставая с x86-крСсла.

3. ΠΠ°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ β€” скучная Ρ‡Π°ΡΡ‚ΡŒ, которая Π½Π° самом Π΄Π΅Π»Π΅ Π²Π°ΠΆΠ½Π°

ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° выросло с 48% Π΄ΠΎ 60%+. Π›ΠΈΠ½ΠΊΠ΅Ρ€ β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· самых Ρ‚Ρ‘ΠΌΠ½Ρ‹Ρ… мСст Π² любом build tool. ΠŸΠΎΠΊΡ€Ρ‹Π»ΠΈ самыС Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ сцСнарии: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ошибки Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ воспроизводятся ΠΈ ловятся тСстами, Π° Π½Π΅ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‚ Π² CI Π² 3 Π½ΠΎΡ‡ΠΈ.

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π±Π°Π³: коллизия ΠΈΠΌΡ‘Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΈΠΊΠ° β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, _.o. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Ρ‚ΠΈΡ…ΠΎΠ΅ Π·Π°Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΈ сборка Π»ΠΈΠ±ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚, Π»ΠΈΠ±ΠΎ β€” Ρ‡Ρ‚ΠΎ Ρ…ΡƒΠΆΠ΅ β€” собираСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΌΠΎΠ»Ρ‡Π°.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Π½Π° основС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΊ исходнику. Π‘Ρ‹Π»ΠΎ: src/utils/log.c β†’ _.o. Π‘Ρ‚Π°Π»ΠΎ: src/utils/log.c β†’ src_utils_log.o. ΠœΡƒΠ»ΡŒΡ‚ΠΈ-Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π±Π΅Π· ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠ².

4. UX ΠΈ инфраструктура

Π£ΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ с ΠΎΡ‚ΠΊΠ°Ρ‚ΠΎΠΌ. РаньшС fz -update просто скачивала Π½ΠΎΠ²Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€ΡŒ ΠΈ замСняла старый. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ старая вСрсия сохраняСтся Π² /usr/local/bin/fz.old. Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ β€” ΠΎΡ‚ΠΊΠ°Ρ‚ Π² ΠΎΠ΄Π½ΠΎ дСйствиС.

ВСсты для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°. fz ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ встроСнной консоли. Π’Π΅ΠΏΠ΅Ρ€ΡŒ это ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΎ тСстами: парсинг ΠΊΠΎΠΌΠ°Π½Π΄ (SplitCommand), установка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (CmdSet), запуск сборки ΠΈΠ· шСлла (CmdBuild). Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ большС Π½Π΅ дСрТится Π½Π° чСстном словС.

5. Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠ΅ стандарты ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’ΠΎ всСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ JSON-ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°Ρ… fz Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ Ρ„Π»Π°Π³ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: -Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion.

Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΡ‚ΡŒ. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилируСтся Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ с этими Ρ„Π»Π°Π³Π°ΠΌΠΈ β€” Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ чистый ΠΊΠΎΠ΄. fz Π½Π΅ просто собираСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅. ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ ошибки β€” это Π½Π΅ паранойя, это Π³ΠΈΠ³ΠΈΠ΅Π½Π°.

Π˜Ρ‚ΠΎΠ³ΠΎ: Ρ‡Ρ‚ΠΎ вошло Π² v1.9.0

-compile-commands β€” гСнСрация compile_commands.json для LSP/IDE ΠšΡ€ΠΎΡΡ-компиляция β€” -target с Π°Π²Ρ‚ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½Π° Ѐикс ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΈΠΊΠΎΠ² β€” ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ .o-Ρ„Π°ΠΉΠ»Ρ‹, ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° β€” 48% β†’ 60%+ Π£ΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ β€” fz -update бэкапит старый Π±ΠΈΠ½Π°Ρ€ΡŒ Π² fz.old ВСсты шСлл-Ρ€Π΅ΠΆΠΈΠΌΠ° β€” SplitCommand, CmdSet, CmdBuild ΠΏΠΎΠΊΡ€Ρ‹Ρ‚Ρ‹ тСстами Π€Π»Π°Π³ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” -Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion

НазваниС «АрхитСктор» Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π½Π΅ случайно. v1.9.0 Π·Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚ для использования fz Π² ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… β€” ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… скриптов Π΄ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-Ρ‚Π°Ρ€Π³Π΅Ρ‚Π½Ρ‹Ρ… embedded-систСм.

Вопросы, Π±Π°Π³ΠΈ, поТСлания β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях.

ДокумСнтация - https://github.com/forgezero-cli/forgezero

11