Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

03.11.2024

./configure; make; make install

📖 Розгорнута відповідь на питання, для чого я використаю make. Make - це найстаріша система для збірки, тобто така що запускає на машині розробника специфічні для проєкту інструкції. Компіляцію, запуск тестів, налаштування середовища… власне, всі команди, які властиві проєкту, можна зібрати в набір Make-файлів та спростити команді життя.

🎅 Make - система, стара як Unix, їй майже 50 років, тому вона має деякі анахронічні особливості. В серці Make лежить можливість запускати команди для кожного файлу окремо та пропускати команду, якщо вихідний файл новіший за вхідний. Бачите, в C збірка починається з компіляції кожного файлу з кодом у проміжний файл .obj, а потім вони складаються (лінкуються) в виконуваний файл. Тож в Make вбудований не тільки кеш збірки, а й домовленості, які з сучасними проєктами рідко справджуються.

🍃 Втім, я постійно беру Make для власних та робочих проєктів (з одним"але" 👇.) ЇЇ головна перевага: вона вже встановлена в будь-якому середовищі розробки та не залежить від мов програмування. Тож для роботи з Make не потрібно спочатку підготувати залежності Node, Ruby, Python тощо. Особливо на CI та в Docker це дуже зручно. Також синтаксис Make-файлів стислий та складається тільки з шелскриптів та мінімальної розмітки. Якщо вже комусь доведеться його вивчити, то вчити там небагато.

🚷 Власне, найбільший недолік Make для мене це як раз розбіжності з тими ж шелскриптами. Змінні оточення та вкладені виклики $() тут доступні тільки через власний синтаксис — це не складно, але копіпастити з оболонки не вийде. Але це дрібниці.

🍝 Звісно, у Make є безліч альтернатив. Найменш люблю скрипти в package.json. Коментарів — дзуськи! Лапки — маскуй! Залежності — тільки через зовнішній виклик. Жах.

🍣 А моя улюблена альтернатива — це Rake в Ruby. Її я беру там, де скрипти можна спростити метапрограмуванням або параметризацією. Бо в Rake можна писати на Ruby - наприклад, робити запити до серверів чи перетворювати дані. А для виклику оболонки в Ruby є синтаксис зі зворотними лапками `echo "Hello World!"`, в якому не потрібно маскувати звичайні лапки. Та який-не-який Ruby теж встановлений на більшості систем.

🤙 Наприклад, в одному з проєктів в мене Rakefile, який генерує комбінації команд на кшталт rake start:foo:test та rake stop:bar:dev для запуску оточення Docker. Та на тому ж проєкті Makefile, який збирає виконувані файли Go з вкладених тек (make -C cmd/baz) в паралелі (і таке можливо! make -j 8).

🪶 Що мені цікаво спробувати, це сучасний підхід “документація як система збірки” на кшталт xc. Але, в 9 випадках з 10, Make повністю вистачає. (А в десятому допоможе Rake.)