Программирование

Make

Что такое Make?

Make написал Stuart Feldman в Bell Labs в 1976 году. Цель была не собирать всё заново. Makefile хранит цель, зависимость и команду. Цель — имя файла, который получается. Зависимость — файл, который должен быть готов раньше. Начало строки команды должно быть табом, не пробелом. Если написан пробел, Make останавливается. Широко используемый вид в Linux — GNU Make. Он кладёт свои добавления поверх старого Make. Сама команда — другая программа: компилятор, скрипт или копирование.

Для чего нужен Make?

Make нужен, чтобы в большом проекте заново собрать только изменившуюся часть. Он может и маленькую повторяющуюся команду привязать к одной цели.

  • Заново собрать только изменившийся файл в программе на C
  • Открыть тест одним именем цели
  • Сделать команду уборки отдельной целью
  • Держать несколько шагов под одним именем

Что можно делать с Make?

Через Make проверяют, устарела ли цель. Если файл не менялся, команду снова не запускают. Это не компилятор. Компилятор вызывают внутри строки. Если таб или путь неверны, сборка остаётся тихой или наполовину сделанной. Результат нужно читать из Makefile.

Сложно ли освоить Make?

Написать одну цель легко. Трудность в табе и в зависимости. Пробел похож на таб, но Make его не принимает. Если не записать зависимость, старый файл считается новым и команда пропускается. Если одна цель в двух местах, работает последнее правило. Если часы неверны, Make считает файл свежим или старым.

Плюсы и ограничения

Плюс: неизменившаяся часть не собирается заново, правило лежит в одном файле, инструмент старый и распространённый. Ограничение: ошибка таба случается часто, и большой Makefile трудно читать. Make — не Cargo и не npm. Он вызывает написанную тобой команду, когда приходит время.

Основные понятия

Цель — имя, которое нужно получить. Зависимость — файл, готовый раньше неё. Команда — сам этот шаг.

  • Цель стоит слева в строке
  • Команда начинается с таба
  • Неизменившийся файл заново не собирается
  • make запускает названную цель

Короткий пример

Это короткое правило, которое собирает одну программу из двух объектных файлов. Пробел в строке команды должен быть табом.

app: main.o util.o
	gcc -o app main.o util.o

Частые вопросы

  • Make — язык программирования? Нет. Он вызывает твою команду, если файл старый.
  • Make и Cargo — одно и то же? Нет. Cargo для Rust. Make привязывает написанную тобой команду к цели.
  • Команда может начинаться с пробела? Нет. Традиционный Make хочет таб. Строку с пробелом он командой не считает.