Урок 8. Makefile: генерация конфига из переменных

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

Перенаправление вывода: > и >>

Трюк не make, а самой оболочки командной строки: вывод команды можно отправить в файл. Один символ > записывает строку в файл (создавая новый или затирая старый), два — >> — дописывают в конец:

echo "первая строка" > file.txt
echo "вторая строка" >> file.txt

Генерируем конфиг

Соберём цель, которая создаёт config/app.conf построчно:

APP_NAME = my-app
PORT = 8080
DEBUG = true
CONFIG = config/app.conf

generate:
	@mkdir -p config
	@echo "# конфиг приложения $(APP_NAME)" > $(CONFIG)
	@echo "port = $(PORT)" >> $(CONFIG)
	@echo "debug = $(DEBUG)" >> $(CONFIG)
	@echo "Создан файл $(CONFIG)"

Запускаем:

make generate
Создан файл config/app.conf

Обратите внимание: первая строка с > создаёт файл заново, а остальные дописываются >>. Если бы везде стоял >, в файле осталась бы только последняя строка — попробуйте, это полезное «чувство».

Показать и убрать

Дополним парой целей, которые нам уже знакомы:

show:
	@cat $(CONFIG)

clean:
	@rm -f $(CONFIG)
	@echo "Удалён файл $(CONFIG)"

Проверяем всё вместе:

make show
# конфиг приложения my-app
port = 8080
debug = true

make clean
Удалён файл config/app.conf

Пара show/clean — классика: почти в любом рабочем Makefile вы встретите именно такие имена.

Задание

  1. Добавьте в генерируемый конфиг настройку log_level со своим значением.
  2. Сделайте порт настраиваемым при запуске — make generate PORT=9090 должен писать в конфиг новый порт, не правя файл (приём из урока про параметры командной строки).

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

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