Makefile

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++.

Читайте также: Кому и для чего нужен 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, большого набора программного обеспечения для разработчиков.

Освойте новую профессию

(рейтинг: 5, голосов: 3)
Добавить комментарий