
Take — минимальная система сборки на C++ с конфигом на TOML вместо Makefile
Roit_liasp 5 минут назад Take — минимальная система сборки на C++ с конфигом на TOML вместо Makefile Простой 6 мин 207 C++ * Open source * Кейс Из песочницы Всем привет! Недавно я написал свою систему сборки — Take...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. Roit_liasp 5 минут назад Take — минимальная система сборки на C++ с конфигом на TOML вместо Makefile Простой 6 мин 207 C++ * Open source * Кейс Из песочницы Всем привет! Недавно я написал свою систему сборки — Take (C++17, без внешних зависимостей если не считать один header only TOML‑парсер). Идея простая: взять привычную модель Make (именованные цели, зависимости между ними, шелл команды), но выкинуть табы, $@/$< и прочую магию синтаксиса Makefile, а вместо этого настраивать всё через обычный .
Получилось вот так:default = "build" CXX = "gcc" FLAGS = "-O2 -Wall -Wextra" OUT = "msin" desc = "Build msin" run = [ "${CXX} ${FLAGS} -Iinclude src/main. c -o ${OUT}", ] desc = "Install msin (sudo or su)" run = [ "install -d /usr/local/bin", "install -m 755 ${OUT} /usr/local/bin/msin", ] desc = "Clean build" run = Каждая секция (кроме служебной ) — это отдельная «функция»: именованный набор шагов, который можно запустить командой take <имя>. Например, take build соберёт проект, а take install — поставит бинарник в /usr/local/bin.
Технические детали
Переменные и подстановкаВ можно объявить произвольные переменные и подставлять их через ${VAR} в любую команду run. Это просто текстовая подстановка на этапе загрузки конфига — никакой отдельной DSL для выражений нет, и это осознанное решение: чем меньше синтаксиса нужно держать в голове, тем быстрее пишется конфиг. Кроме пользовательских переменных, Take прокидывает несколько встроенных:${TAKE_FUNC} — имя текущей выполняемой функции;${TAKE_DIR} — директория, где лежит take.
toml;${ARGS} — всё, что передано после -- в командной строке. Плюс есть доступ к переменным окружения через ${env:VARNAME}. Зависимости между функциямиФункция может зависеть от других через deps: desc = "Build msin" run = desc = "Install after build" deps = run = take install сначала выполнит build, и только потом свои собственные команды.
Внутри это обычный обход графа зависимостей с отслеживанием уже выполненных функций и детектом циклов — если где‑то в цепочке deps образуется цикл, Take сразу упадёт с понятной ошибкой вместо ухода в бесконечную рекурсию. Пример ошибки при ручной остановке сборки:roit@Debian:/sdisk/p/progect/p/msin$ take ==> take build — Build msin $ gcc -O2 -Wall -Wextra -Iinclude src/main. c: In function ‘handle_encrypt’: src/main.
c:48:55: warning: unused parameter ‘filename’ 48 | void handle_encrypt(const char* password, const char* filename) { | ~~~~~~~~~~~~^~~~~~~~ ^Ctake: error: The command finished with code 1: gcc -O2 -Wall -Wextra -Iinclude src/main.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





