Урок 9. Makefile: цветной вывод и export

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

Цвета через tput

Коды цветов терминалу отдаёт утилита tput: команда tput setaf N переключает цвет, tput sgr0 — сбрасывает оформление. Попробуйте прямо в консоли:

echo "Обычный и `tput setaf 2`зелёный`tput sgr0`"

Слово «зелёный» окрасится. Часто используемые номера: 1 — красный, 2 — зелёный, 3 — жёлтый, 6 — бирюзовый.

Цвета в Makefile

Объявим цвета переменными и используем в сообщениях:

export cyan = `tput setaf 6`
export green = `tput setaf 2`
export yellow = `tput setaf 3`
export reset = `tput sgr0`

hello:
	@echo "${cyan}Привет!)${reset}"

done:
	@echo "${yellow}Внимание:${reset} почти готово"
	@echo "${green}Готово!${reset}"

Запускаем:

make done
Внимание: почти готово
Готово!

В терминале «Внимание:» будет жёлтым, «Готово!» — зелёным. Фигурные скобки ${cyan} — та же подстановка переменной, что $(cyan), просто с цветами так привычнее читать.

Зачем export

Обычная переменная make живёт только внутри самого make: её значение подставляется в текст команд перед запуском. А слово export превращает её ещё и в переменную окружения — она передаётся всем запускаемым командам, включая ваши скрипты и утилиты, которые умеют читать настройки из окружения.

Проверить легко — заглянем в окружение из рецепта:

env.check:
	@env | grep cyan
make env.check
cyan=`tput setaf 6`

Переменная на месте. А теперь удалите слово export у cyan и повторите — grep уже ничего не найдёт: в окружении переменной нет, она осталась «внутренней» для make.

Задание

  1. Раскрасьте свою цель-справку из урока про несколько целей: имена команд — одним цветом, описания оставьте обычными.
  2. Покажите в своём Makefile, что export-переменная видна в окружении, а обычная — нет (приём с env | grep выше).

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

Про цветной вывод есть заметка про echo и цвета, а про окружение — заметка про вывод переменных окружения. Пример урока лежит в репозитории: lesson09-colors.