Урок 0. make и Makefile: история создания и зачем они нужны

Утилита make и её файл-манифест Makefile появились не вчера: им почти полвека. Этот урок — короткая историческая справка перед практикой, чтобы было понятно, откуда всё это взялось и почему устроено именно так.

Белл Лабс, 1976 год

Место действия — исследовательский центр Bell Laboratories в Мюррей-Хилл, то самое, где Кен Томпсон и Деннис Ритчи создавали Unix. Среди коллег по отделу был программист Стюарт Фельдман (Stuart Feldman) — соавтор, к слову, первого компилятора Fortran 77.

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

Идея Фельдмана

Фельдман заметил: машина сама может понять, что пересобирать, если описать зависимости «из чего получается что» и сравнивать время изменения файлов — пересобирать только то, что устарело. Описание зависимостей он предложил хранить в отдельном файле, а для его обработки написал утилиту make. Так в апреле 1976 года родилась пара «Makefile + make», которой мы пользуемся до сих пор.

В 1978 году Фельдман описал своё творение в статье «Make — A Program for Maintaining Computer Programs», а сама утилита вышла в большой мир вместе с релизами Unix конца 1970-х.

Интересная деталь: то самое требование начинать рецепт с TAB, о которое мы споткнёмся в первом же практическом уроке, — прямое следствие экономии Фельдмана.
Разбирать сложную грамматику ему не хотелось, и таб стал простым однозначным маркером «дальше идёт команда». Так что теперь с 1976 года все пользователи живут с этим подходом ;)

Путь к нашим дням

Изначально make предназначалась для сборки программ на C — так её использует и ядро Linux. В 1988 году в рамках проекта GNU появилась своя версия, GNU make, написанная Ричардом Столлманом и Роландом Макгратом, — именно она по умолчанию стоит в Linux сегодня. Свои вариации есть и в мире BSD. А в 2003 году make получила престижную премию ACM Software System Award, которую до этого получали, например, Java и World Wide Web — неплохая компания для утилиты из 1976 года.

Сегодня make чаще всего используют не столько для компиляции, сколько как «пульт управления проектом»: длинные и сложно запоминающиеся команды прячут в Makefile под короткими именами-целями. Так делают с docker-окружением, тестами, деплоем — и с генерацией конфигурационных файлов, чему и посвящён наш курс.

Мини-практика

Проверьте, какая версия make установлена у вас:

make --version
GNU Make 4.3
Built for x86_64-pc-linux-gnu

Скорее всего, у вас тоже GNU Make — как и у авторов большинства Makefile-ов, которые вы встретите.

Все уроки курса собраны в списке уроков. Подробнее про историю можно почитать в статье Википедии и оригинальной статье Фельдмана 1978 года.