Как стать автором
Обновить

Комментарии 20

Вот только сейчас Make не справляется с поставленными для него задачами (из-за использования mtime для определения свежести целей) и требует изучения нового декларативного языка (а точнее одного или сразу нескольких диалектов Make). Можно ничего нового не изучать и писать на любимом языке, полностью выполняя все аналогичные задачи: habr.com/ru/post/517490
из-за использования mtime для определения свежести целей

А что с mtime случилось?

apenwarr.ca/log/20181113 — mtime крайне мало даёт гарантий.

Я дочитал до такого перла, как


surprising result that a newly-created file is almost always created in the past:

и засомневался, стоит ли читать дальше.

Проблема make в языке.
Декларативность — супер, но писать что то большое и сложное — по факту можно, но после тебя эти авгиевы конюшни никто не разгребет.
Проблема в отсутвии областей видимости, глобальности всего и вся.
И этот таб — это анахронизм позапрошлого века.
и то что строки после таб это не bash команды, вот это пипец плохо.

Утилита, которой уже 44 года, довольно неплохо сохранилась.
Да, сейчас её можно ругать, но это все равно что ругать ассемблер за его низкоуровневость.

Большое и сложное можно написать на более других языках (qmake, cmake). И получится тот же Makefile.

И этот таб — это анахронизм позапрошлого века.

Ага… как отступы в питоне или фортране…

Чтоб не «началось»: «Это сарказм».
Кстати, недавно попалась на глаза рекомендация использовать make -j N, если нужно распараллелить на N потоков какой-нибудь процесс, имеющий внутренние зависимости (без зависимостей — справится и xargs -P).

Эта рекомендация актуальна для сборки проектов, время сборки которых изменяется в минутах или часах (а не в миллисекнудах, как в статье).
Собственно, в реальной жизни обычно так и приходится запускать make -j4 (по количеству ядер), обычно об этом пишут в инструкциях по сборке.
Там ещё много всякого есть, так то ))

Интересно, откуда взялось слово .PHONY?

И опять пример с make где в очередной раз собирается проект на C.
Это скучно и тривиально.
У меня в мейк оборачивает Terraform, не слишком удобно но избавляет от необходимости помнить длинные наборы параметров или просто искать их в истории шелла.
Разработчик с которым я сотрудничаю оборачивает kubectl. Не идеально, конечно но его устраивает.
Вот описание такой системы и возможных альтернатив было бы интересно почитать.
Или манипуляции с переменными среды.
Или еще чего не совсем стандартного.

Пример использования make в непрограммистской жизни:


BMPS := $(wildcard *.bmp)
PNGS := $(patsubst %.bmp,%.png,$(BMPS))

.PHONY: all
all: $(PNGS)

%.png: %.bmp
        convert $< $@
        touch -r $< $@
        rm $<

Немного более сложная версия этого Makefile конвертирует и складывает в папочку скриншоты Дальнобойщиков 2 (глупая игра при каждом запуске раз нумерует файлы с 1, затирая старые снимки).


P.S. Главный и абсолютно неизлечимый недостаток make — невозможность обрабатывать файлы с пробелами. Он мог бы быть гораздо полезнее в обиходе.

Либо я не понял суть проблемы либо у меня все работает.

all: hello\ world.c
		g++ -g -o hello hello\ world.c

А вот уже так


SOURCES := $(wildcard *.c)
all: $(SOURCES)
        g++ -g -o hello "$<"

не работает, думает, что hello и world.c — это две разные зависимости.

Если что, то распараллелить команды можно и через GNU parallel (небольшая программа на Perl): parallel «convert {} {.}.png && touch -r {} {.}.png && rm {}» ::: *.bmp. Плюс не будет проблем с пробелом.

Да, parallel классный. Он и по сети распаллеливать могёт. Было дело, я все компы в офисе припряг пережимать огромный архив, раскидав части через parallel+ssh.


И синтаксис у него удобный, гораздо лучше, чем у xargs, например.

У нас все банально на работе.


make используется для сборки debian-пакетов сайтов и для простого выполнения каких-то обслуживающих скриптов на продакшене:


make update_rt_indexes


И всё, и админу не нужно помнить, судо там или не судо и какие параметры. Параметры по умолчанию подставляются. Туда же — make help.


А, ну еще на машине разработки ряд задач сделан не через баш-макросы, а командами make, например make setup_env или make sync_db_replica.


P.S. Но я видел и make-file, обслуживающий зоопарк докера.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий