Урок 2. Makefile: несколько целей и цель по умолчанию

В первом уроке мы создали Makefile с одной целью hello, а в задании добавили к ней вторую. Целей в файле может быть сколько угодно — сейчас разберёмся, как make выбирает, что именно выполнять.

Несколько целей

Дополним наш файл ещё двумя целями:

hello:
	echo "Привет, мир!"

date:
	date

help:
	echo "make hello - поприветствовать мир"
	echo "make date  - показать дату и время"
	echo "make help  - эта справка"

Каждая цель — отдельная «команда». Цель date просто выполняет одноимённую команду date — имя цели и имя команды могут совпадать, путаницы не возникнет:

make date
date
Пн 26 окт 2026 19:46:42 MSK

Цель по умолчанию

А что будет, если запустить make без аргументов? Выполнится первая цель файла — у нас это hello:

make
echo "Привет, мир!"
Привет, мир!

Правило простое: цель по умолчанию — первая описанная в Makefile, и выполняется только она одна. Остальные цели запускаются лишь по имени: make date.

Цель-справка

Когда целей становится много, помнить их все уже сложно. Хорошая практика — завести цель help (её же называют about), которая печатает список доступных команд:

make help
echo "make hello - поприветствовать мир"
make hello - поприветствовать мир
echo "make date  - показать дату и время"
make date  - показать дату и время
echo "make help  - эта справка"
make help  - эта справка

Работает, но шумновато: перед каждой строкой вывода печатается сама команда. Так и задумано — в следующем уроке познакомимся с символом @ и сделаем вывод чистым.

Именно поэтому в больших проектах первой целью часто делают справку: набрал make — и сразу видно, что вообще можно сделать.

Задание

  1. Добавьте в свой файл цель date и цель-справку help (или about) с описанием всех команд.
  2. Переставьте цели так, чтобы запуск make без аргументов показывал справку.
  3. Запустите несуществующую цель, например make foo, и посмотрите, что ответит make.

В следующем уроке разберём символ @ и «тихий» вывод. Полный план — в списке уроков курса.

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