Урок 5. Makefile: переиспользование команд через переменные
Primary tabs
Forums:
В уроке про переменные мы хранили в них короткие значения — имя, порт, путь. Но в переменную можно положить и целую команду. Именно так в настоящих 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 в каждую цель.
Задание
- Добавьте цель, которая выводит из конфига только строку с настройкой порта (подсказка:
grep). - Вынесите в переменную какую-нибудь команду из своих прошлых целей и используйте её минимум в двух целях.
В следующем уроке научимся выстраивать цели в цепочки: чтобы одна выполнялась строго после другой — например, очистка перед пересборкой. Полный план — в списке уроков курса.
Пример этого урока лежит в репозитории: lesson05-reuse.
- Log in to post comments
- 12 reads