Makefile — это файл с инструкциями для утилиты make, которая нужна для автоматической сборки проекта.
Что такое make и зачем она нужна
Во время работы над проектом создаются несколько файлов. Это набор кода, сохраненный в документе с определенным расширением. Например, для C++ код сохраняется в файлы .CPP. Чтобы набор кода стал исполняемым и превратился в файл, который можно запустить, его необходимо скомпилировать. Для этого используется специальная программа — компилятор. Она преобразует текст, написанный на языке программирования, в машинный код. Для C++ часто используют g++, бесплатный компилятор из набора gcc.
Компилятор превращает набор кода в объектные файлы, или модули. С помощью линковщика они соединяет все воедино с учетом зависимостей и связей между исходниками. Результат — готовый исполняемый файл.
Утилита make автоматизирует процесс — разработчику достаточно набрать одну команду в консоли. Она преобразует исходный код в модули, а их — в исполняемые файлы, которые можно запустить. Так создаются библиотеки и разнообразные программные продукты. Makefile показывает программе правила, по которым нужно выполнять преобразования.
Make работает на Linux и системах на базе Unix — для этих ОС утилита считается основным средством сборки программ. В Windows тоже есть концепция Makefile, но управляет этими файлами утилита nmake. У make две версии: для платформы BSD и для GNU. Первая используется в операционных системах FreeBSD, OpenBSD и NetBSD, вторая — в MacOS и Linux. Утилита обычно есть в ОС по умолчанию.
Для чего нужен Makefile
Чаще всего утилиту и файлы Makefile используют разработчики, пишущие код в операционных системах семейства Unix и Linux. Но мейкфайлы могут потребоваться и программистам, работающим под Windows. Чаще всего они применяются:
- для выдачи инструкций программе make, которая автоматизирует работу по сборке;
- возможности собрать программный проект и превратить его в исполняемый файл в одно касание;
- правильной обработки зависимостей и сущностей в коде;
- корректной компиляции, преобразования кода;
- ускорения и упрощения программирования, в первую очередь на языках C и C++.
Что такое правила Makefile
Makefile одновременно является и инструкцией, и исполняемым файлом, который запускает утилита make. Он содержит код на специальном скриптовом языке, описывающий конечные условия — они должны выполняться при сборке проекта. Это называется правилами.
Синтаксис правил в целом такой:
цель: зависимости
команды
Цель. Файл, который программа make должна сгенерировать после запуска. Это может быть модуль или исполняемый файл. В Makefile указываются его будущее имя и расширение. Иногда цель — не файл, а действие. Это бывает нужно, если программист использует утилиту make, чтобы сделать что-то, а не собрать проект.
Цель по умолчанию — all без зависимостей. Это означает, что утилита make при исполнении инструкции сразу перейдет к командам.
Зависимости. Это начальные условия, файлы и действия, от которых зависит цель. Их может не быть — тогда make начнет сразу выполнять команды ниже. Но если зависимости есть, утилита сначала проверит их и выполнит все связанные с ними действия. Только после этого она перейдет к цели.
Неочевидный момент: в одном мейкфайле чаще всего несколько целей, и каждая из них может быть зависимостью для другой. Тогда одна цель будет выполняться в зависимости от другой.
Например, если цель А — начальное условие для цели Б, то цель Б выполнится только после цели А.
Действия. Их еще называют способами. Это команды для консоли, системные вызовы и так далее. Они описываются после цели и зависимостей. Когда начальные условия будут выполнены, утилита make перейдет к действиям, выполнит их, а результат запишет в цель.
Что содержит Makefile
Разберем содержимое Makefile подробнее. Правила тоже бывают разными, а для более удобной записи существует вспомогательный синтаксис.
Явные правила. Это записи, которые описывают, как и какие файлы надо преобразовать. Это самый простой способ описать преобразования в Makefile: действия, условия и цели указываются напрямую.
Неявные правила. Также называются негласными. Это более сложный случай: в правилах не пишется напрямую, что должна сделать утилита make. В них используются переменные, а значит, особенности выполнения могут меняться.
Например, разработчик собирает проект. Он может создать явное правило, где в действиях четко пропишет, какой компилятор вызвать для обработки исходного кода. Но для большей гибкости он может пойти другим путем: вместо прямого указания компилятора подставить переменную, специальную структуру для хранения данных. А в переменную по ходу выполнения скрипта можно записать любое название компилятора. Например, в зависимости от того или иного условия.
В результате проект соберется с одним или другим компилятором — это будет зависеть от значения переменной на момент выполнения правила.
Определения переменных. Не правила, а строки, в которых описываются переменные. Так им присваиваются значения, которые автоматически подставятся в действия, где используются переменные.
Выглядит это так:
<название переменной> = <значение переменной>
Содержимое переменной считается строкой. Ее можно подставлять в правила следующим образом: $(<имя переменной>).
Директивы. Разнообразные конструкции, которые расширяют возможности Makefile. Например, с помощью соответствующих директив можно создать в файле условие «если — то», которое выполнит определенное действие, если истинно какое-либо выражение. Можно подключить к нему другие мейкфайлы, приостановить выполнение текущего файла и открыть другой, чтобы он отработал первым.
На этом возможности директив не ограничиваются. Конструкции нужны для создания сложных мейкфайлов.
Комментарии. Текст, который ничего не делает — только описывает происходящее. Он не влияет на выполнение мейкфайла и нужен для разработчиков. Там находится краткая документация или справка, которая рассказывает человеку, что именно происходит в тот или иной момент.
Комментарий в Makefile — это строка, которая начинается с #. Весь текст до конца строки после этого символа считается частью комментария.
Когда и как выполняется Makefile
Когда разработчик решает собрать проект или выполнить другое действие, он вызывает программу make с помощью консоли. Одноименная команда запускает мейкфайл и выполняет инструкции, которые в нем описаны, — разработчику остается только пользоваться результатом.
- Если набрать команду make без дополнительных флагов, то утилита попытается найти мейкфайл в текущей папке и запустить его.
- Если набрать make -f <название Makefile>, то программа начнет выполнять заранее заданный мейкфайл.
У команды make много параметров разной сложности для гибкой работы с утилитой. С ними можно ознакомиться в официальной документации, которая в том числе есть во внутренних мануалах операционных систем.
Как начать пользоваться make и Makefile
Для работы необходима только операционная система на базе Unix. Это любая ОС платформы BSD, MacOS или ОС семейства Linux: Debian, Ubuntu, Gentoo и другие. В эти ОС утилита make встроена по умолчанию. Можно сразу начать ей пользоваться и создавать мейкфайлы.
Если у вас Windows, необходимо или установить вторую ОС, или воспользоваться аналогом make под названием nmake. Утилита входит в состав Microsoft Visual Studio, большого набора программного обеспечения для разработчиков.
0 комментариев