Makefile
makefile — это файл, содержащий набор инструкций, используемых утилитой make в инструментарии автоматизации сборки.
Makefile | |
---|---|
MIME-тип | text/x-makefile |
Тип формата | Автоматизация сборки |
Стандарт(ы) | POSIX |
Обзор
Чаще всего makefile содержит указания для утилиты make о том, как компилировать и компоновать программу. Например, для языков программирования С/С++ исходный файл C или C++ должен быть перекомпилирован при каждом своем изменении. Если меняется заголовочный файл, каждый C/C++ исходный файл, включающий его, должен быть перекомпилирован, чтобы быть безопасным. Каждая компиляция создает объектный файл, соответствующий исходному файлу. Наконец, если исходный файл был скомпилирован, то все объектные файлы, будь то вновь созданные или сохраненные с предыдущих компиляций, должны быть скомпонованы вместе, чтобы собрать новый исполняемый файл программы[1]. Эти инструкции вместе со своими зависимостями указаны в makefile. Если с последней компиляции ни один из файлов, необходимых для сборки, не менялся, то при компиляции ничего не происходит. Для больших проектов, использование make-файлов может значительно сократить время сборки приложений при изменении всего лишь нескольких исходных файлов.
Операционная система
Unix-подобные ОС
Make-файлы возникли на Unix-подобных системах и остаются основным средством сборки программ в данных окружениях.
Microsoft Windows
Windows поддерживает различные виды make-файлов при помощи утилиты nmake. Стандартные make-файлы из Unix-подобных ОС могут быть выполнены в операционной системе Windows в среде Cygwin.
Содержание
Make-файлы состоят из 5 составляющих: явных правил, неявных правил, определений переменных, директив и комментариев.
- Явное правило сообщает, когда и как нужно преобразовать один или несколько файлов, которые называются целевыми правилами. В явном правиле перечисляются и другие файлы, от которых зависят цели, называемые зависимостями цели, а также указывается способ, используемый для создания или обновления цели.
- Негласное правило сообщает, когда и как преобразовать класс файлы, исходя из их названия. Оно содержит описание, как цель может влиять на файлы с именем, похожим на цель, и указывает способ для создания или обновления такой цели.
- Определение переменной является строкой, в которой указывается текстовое строковое значение переменной, которая может быть подставлена в текст позже.
- Директива указывает утилите make на выполнение чего-либо особенного при чтении файла makefile (например, чтение другого make-файла).
- Комментарии в строке makefile начинаются с символа ‘#’. Сам комментарий и остальная часть строки игнорируется.
Правила
Make-файл содержит «правила» в следующей форме:
target: dependencies
system command(s)
Целью обычно является имя файла, который генерируется программой; примеры целей — исполняемые или объектные файлы. Цель может также являться именем действия, которое необходимо выполнить, например, «clean».
Зависимость (также называется предварительным условием) — это файл, используемый в качестве входных данных для создания цели. Цель часто зависит от нескольких файлов. Однако, правило, указывающее способ для цели, не должно иметь любых предварительных условий. Например, правило, содержащее команду delete («удалить»), связано с целью clean («очистить»), не имеющей предварительного условия.
Системная команд(ы) (также называемая способом) — это действие, которое выполняет утилита make. Способ может содержать более одной команды, либо в той же строке или каждая в своей строке.
Выполнение
make-файл выполняется при помощи команды make
, например, make [options] [target1 target2 ...]
.
По умолчанию, когда утилита make ищет make-файл и если имя make-файла не было указано в качестве параметра, то make пробует следующие имена по порядку: makefile и Makefile.
Пример
Простой makefile, который описывает, как исполняемый файл с именем edit зависит от четырех объектных файлов, которые, в свою очередь, зависят от четырех C-исходников и двух заголовочных файлов.
edit: main.o kbd.o command.o display.o
cc -o edit main.o kbd.o command.o display.o
main.o: main.c defs.h
cc -c main.c
kbd.o: kbd.c defs.h command.h
cc -c kbd.c
command.o: command.c defs.h command.h
cc -c command.c
display.o: display.c defs.h
cc -c display.c
clean:
rm edit main.o kbd.o command.o display.o
Чтобы использовать этот make-файл для создания исполняемого файла edit, необходимо набрать команду make
. Чтобы использовать этот make-файл для удаления исполняемого файла и всех объектных файлов из каталога, необходимо набрать команду make clean
.