Урок 6. Makefile: зависимости — одна цель после другой

В уроке про переиспользование команд мы вызывали одну заготовку из разных целей. Теперь научимся выстраивать сами цели в цепочки: часто командам нужен «разогрев» — перед сборкой создать каталог, а пересборка — это вообще две операции: сначала убрать старое, потом собрать новое. Можно запускать две команды руками (make clean, затем make build), но make умеет делать это сам — через зависимости.

Зависимость: цель перед целью

Допишем после имени цели через двоеточие имя другой цели — и она выполнится первой:

build: prepare
	@echo "2. Собираем конфиг out/app.conf"
	@echo "# собрано командой make" > out/app.conf

prepare:
	@echo "1. Готовим каталог out/"
	@mkdir -p out

Читается так: «для build сначала нужен prepare». Запускаем:

make build
1. Готовим каталог out/
2. Собираем конфиг out/app.conf

Порядок виден по номерам в сообщениях: сначала зависимость, потом сама цель.

Несколько зависимостей

Зависимостей может быть несколько — перечислим их через пробел. Классическая пара «пересборка»:

rebuild: clean build
	@echo "3. Пересборка завершена"

clean:
	@echo "0. Чистим каталог out/"
	@rm -rf out

Теперь make rebuild — это вся цепочка сразу:

make rebuild
0. Чистим каталог out/
1. Готовим каталог out/
2. Собираем конфиг out/app.conf
3. Пересборка завершена

Правила простые: сначала выполняются все зависимости слева направо, а рецепт самой цели — в самом конце. Один запуск — четыре шага, и порядок гарантирован.

У механизма есть и справочная заметка про вызов одной команды после другой, и про вызов перед данной — это ровно про него.

Задание

  1. Добавьте цель show, зависящую от build и выводящую содержимое out/app.conf. Проверьте, что make show сам собирает конфиг, если тот ещё не создан.
  2. Поменяйте в rebuild порядок зависимостей на build clean и запустите — объясните себе, почему результат получился «испорченным».

В следующем уроке научимся передавать целям параметры: make config APP_ENV=prod. Полный план — в списке уроков курса.

Пример этого урока лежит в репозитории: lesson06-deps.