Давайте будем честны. Вручную вводить длинные команды компиляции gcc — это боль. Ситуация быстро ухудшается, когда ваша кодовая база разрастается, подключает несколько библиотек, и вы постоянно что-то подкручиваете. В итоге вы получаете кошмар с копированием и вставкой, который ломается, если вы пропустите один флаг.
На сцену выходят makefiles.
Они существуют по одной причине: чтобы заставить вас перестать вручную вводить одну и ту же последовательность компиляции снова и снова. Вместо того чтобы запоминать точные флаги и порядок объектных файлов, вы пишете рецепт. Затем вы просто вводите make.
Как на самом деле работает Makefile
Вы начинаете с создания файла с именем буквально makefile. Без расширения. Только имя. Внутри вы определяете зависимости.
Вот базовая структура для небольшого проекта на C:
Обратите внимание на отступы. Здесь новички часто спотыкаются. Этот пробел перед gcc? Это должен быть символ табуляции. Не восемь пробелов. Табуляция. Если вы используете пробелы, make выдаст загадочную ошибку, и вы потратите десять минут, гадая, почему ваш синтаксис выглядит нормально для человеческого глаза, но не для машины. Каждая строка команды под зависимостью должна начинаться с табуляции. Определения зависимостей сами должны быть прижаты к левому краю. Без исключений.
Логика зависимостей
В makefile есть два типа строк. Первый — это строки зависимостей. Они выглядят как цель: зависимости.
main.o: main.c util.h
Это переводится как: «Мне нужен main.o. Чтобы получить его, мне нужны main.c и util.h ».
Второй тип — это исполняемая строка. Она находится под зависимостью и начинается с табуляции. Это команда, которая запускается, если make решает, что нужно пересобрать цель.
Система работает по простому принципу: если любой файл в правой части двоеточия новее файла в левой части, запускаются команды ниже. Изменили util.h? make видит это, знает, что main.o и util.o зависят от него, и пересобирает их. Это автоматизирует логику.
Правило цели
Есть одно золотое правило для начала вашего makefile. Первая указанная цель — это та, которую make пытается построить по умолчанию.
В приведенном выше примере main — это первая строка. Поэтому, когда вы запускаете make без аргументов, он собирает конечный исполняемый файл.
main: main.o util.o
gcc -o main main.o util.o
Если вы измените main.o, это запустит пересборку main. Если вы измените main.c, это запустит main.o, который затем запустит main. Это цепная реакция. Вам не нужно управлять этим. Вы просто редактируете исходный код и запускаете make.
Что делать, если я не на Unix?
Если вы используете Windows или среду IDE, такую как Visual Studio или Xcode, вы можете не увидеть makefile в традиционном смысле. Не паникуйте. Ваш компилятор, вероятно, имеет эквивалентный функционал.
Интегрированные среды разработки часто имеют системы сборки «под капотом». Ищите «Конфигурации сборки» или «Свойства проекта». Они делают то же самое: отслеживают зависимости и пересобирают только то, что изменилось. Но если вы придерживаетесь командной строки, make является стандартом.
Более широкая картина
Использование make — это не


































