makefile

Системы сборки — make

Поговорим на тему сборки проекта. В данной статье рассмотрим как писать простенькие Make-файлы, для сборки проектов на языках C или C++. Конкретно мы будем компилировать проект на gcc стандарта C99.

Что такое и зачем нужен make? Это специальная утилита для автоматической компиляции кода в объектные модули и сборки из данных модулей исполняемого файла. Используется много где в операционных системах *nix, как я понимаю. Но конкретно мы будем работать на Linux, в библиотеках которых данная утилита крайне широко распространена.

Суть в том, что в процессе разработки ПО появляется необходимость тестирования. Но компилировать постоянно весь проект (а если он очень большой и над ним работает много программистов) не очень удобно. Поэтому make снова в этой ситуации нам поможет. То есть, не удалять результаты объектных файлов прошлых компиляций, а перекомпилировать лишь нужный модуль, что явно быстрее, чем весь проект.

Для начала рассмотрим простой пример сборки. Допустим, у нас есть небольшая программа, которая пишет 5 раз фразу "Hello make" в консоль. Напишем Makefile для нашей простой программы с таким содержанием:

В первой строке нашего Makefile написана цель сборки "all:". Названия целей можно писать любое. Но, обычно для имени конечной цели (главная сборка проекта) пишут именно "all". Я читал, что при вызове make без явного указания цели, то автоматически выполняется цель "all" (но мои эксперименты показали, что в Makefile без цели "all" выполняется первая цель в списке). Через двоеточие указываются зависимости для цели. То есть, прежде чем выполнится цель "all", сперва будут выполняться ее зависимости, в нашем случае это "BinDir". На второй строке идет команда для выполнения. Команды обязательно отделяются табуляцией! Таков синтаксис, без табуляции команды будут игнорироваться утилитой и ничего не выполнится. В качестве команд можно писать все, что необходимо. В нашем случае, мы просто компилируем нашу программу в директорию ./bin (которая создается в цели "BinDir") с помощью компилятора gcc. Последняя цель "clean" чистит результаты сборки проекта - то есть мы просто удалили каталог проекта bin. Это запись является традиционная для Makefile'ов, поэтому писать подобные цели - хороший тон.

Вызов утилиты происходит в каталоге, где находится Makefile с помощью команды в консоли make [цель]. Указание цели при вызове make может быть пустой, как я уже выше писал, тогда просто выполнится первая цель в списке. Процесс сборки и выполнения показан на картинке ниже.

makefile

Для более сложной задачи, допустим, у нас есть дистрибутив Ubuntu 14.04, есть небольшой проект на C99 - надо написать Makefile. Пускай сам проект лежит в директории /home/tetraquark/Bomberta. Тут находится файл конфига приложения - settings и сам файл Makefile для утилиты make. Все заголовочные файлы лежат тут: /home/tetraquark/Bomberta/include, файлы с исходным кодом тут: /home/tetraquark/Bomberta/src. В Makefile'ах есть возможность использовать переменные и всю мощь bash скриптов. Вообще, стоит поискать и посмотреть примеры реализаций в разных библиотеках под Linux на C, в которых чаще всего используется именно make. Например, zlib, ncurses и другие. Вот так выглядит реализация Makefile для нашего проекта:

Это не самая лучшая и удобная реализация, можно придумать и додумать что-то свое под нужды проекта. Следующий шаг автоматизации сборки - написание скрипта, например, на bash, который исходя из входных настроек будет генерировать нужный Makefile с нужными параметрами. Такие скрипты также создаются разработчиками, чаще всего они имеют название "Configure".

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">