Урок 5. Makefile: переиспользование команд через переменные

В уроке про переменные мы хранили в них короткие значения — имя, порт, путь. Но в переменную можно положить и целую команду. Именно так в настоящих Makefile-ах прячут длинные вызовы: список аргументов однажды описывается вверху файла, а в рецептах остаётся короткое имя.

Учебный конфиг

Работать будем с файлом конфигурации. Создайте в папке урока файл config/app.conf с таким содержимым:

# учебный конфиг
debug = false
port = 8080

Команда в переменной

Вынесем в переменную команду чтения конфига:

CONFIG_DIR = config
CAT_CONFIG = cat $(CONFIG_DIR)/app.conf

show:
	@$(CAT_CONFIG)

lines:
	@echo "Строк в конфиге:"
	@$(CAT_CONFIG) | wc -l

Проверяем:

make show
# учебный конфиг
debug = false
port = 8080

Переменная CAT_CONFIG хранит целую команду — и заодно показывает приём из прошлого урока: одна переменная (CONFIG_DIR) подставляется в другую. Если путь к конфигам изменится — правим одну строку, и обе цели продолжат работать.

Переиспользование: команда как часть команды

А вот вторая цель. Запуск make lines даёт:

make lines
Строк в конфиге:
3

Присмотритесь к её рецепту: $(CAT_CONFIG) | wc -l — переменная-команда используется не только «как есть», но и как часть более длинной команды, к которой дописывается пайп и продолжение. Это и есть переиспользование в полном смысле: одна заготовка, много применений — вместо копипасты cat config/app.conf в каждую цель.

Задание

  1. Добавьте цель, которая выводит из конфига только строку с настройкой порта (подсказка: grep).
  2. Вынесите в переменную какую-нибудь команду из своих прошлых целей и используйте её минимум в двух целях.

В следующем уроке научимся выстраивать цели в цепочки: чтобы одна выполнялась строго после другой — например, очистка перед пересборкой. Полный план — в списке уроков курса.

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