Урок 7. Makefile: параметры командной строки и значение по умолчанию

В уроке про переменные мы задавали значения прямо в Makefile. Но бывает нужно одно и то же действие выполнять чуть по-разному: собрать конфиг для окружения разработки или «боевого», поднять приложение на другом порту. Заводить отдельные цели под каждый вариант расточительно — вместо этого у make есть параметры командной строки.

Передаём параметр

Допишем к команде запуска ИМЯ=значение — и переменная в Makefile получит это значение на один запуск:

make show APP_ENV=prod PORT=9090

Смотрите, как читаются переменные — так же, как в уроке про переменные:

APP_ENV ?= dev
PORT ?= 8080

show:
	@echo "Окружение: $(APP_ENV)"
	@echo "Порт:      $(PORT)"

Запускаем без параметров:

make show
Окружение: dev
Порт:      8080

И с параметрами:

make show APP_ENV=prod PORT=9090
Окружение: prod
Порт:      9090

Оператор ?= — значение по умолчанию

Запись APP_ENV ?= dev читается так: «взять dev, если APP_ENV ещё не задан» — например, не пришёл из командной строки. Это самый честный способ объявлять настройки: умолчание живёт в файле, а конкретный запуск может его переопределить.

Важно понимать: параметр действует только на этот запуск. Сам файл Makefile никак не меняется — следующий make show снова увидит dev.

Задание

  1. Объявите NAME ?= мир и сделайте цель-приветствие из первого урока параметризованной: make hello NAME=Вася должно приветствовать Васю, а просто make hello — «мир».
  2. Добавьте в свой show переменную APP_ENV — она ещё пригодится, когда в переиспользовании команд мы начнём работать с конфигами под разные окружения.

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

Про передачу параметров есть и справочная заметка. Пример этого урока лежит в репозитории: lesson07-args.