Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Linux-инструменты для Windows-программистов
Назад Компиляция и сборка приложений Вперед

Создание проектов, сборка make

Многократно выполняемая сборка приложений проекта, с учётом зависимостей и обновлений, делается утилитой make, которая использует оформленный сценарий сборки. По умолчанию имя файла сценария сборки - Makefile. Утилита make обеспечивает полную сборку указанной цели в сценарии сборки, например:

$ make
$ make clean

Если цель не указывается, то выполняется первая последовательная цель в файле сценария 5.

Утилита make существует в разных ОС, из-за особенностей выполнения, наряду с «родной» реализацией во многих ОС присутствует GNU реализация gmake, и поведение этих реализаций может достаточно существенно отличаться, а в сценариях сборки указываться имя конкретной из утилит. В Linux:

$ ls -l /usr/bin/*make
...
lrwxrwxrwx 1 root root      4 Окт 28  2008 /usr/bin/gmake -> make
...
-rwxr-xr-x 1 root root 162652 Май 25  2008 /usr/bin/make 

$ make --version
GNU Make 3.81
...

Может использоваться и любой другой сценарный файл сборки:

$ make -f Makefile.my

Утилита make автоматически определяет какие части большой программы должны быть перекомпилированы, и выполняет необходимые для этого действия. На самом деле, область применения make не ограничивается только сборкой программ. Её можно использовать ее для решения любых задач, где одни файлы должны автоматически обновляться при изменении других файлов.

Простейший Makefile состоит из синтаксических конструкций всего двух типов: целей и макроопределений. Описание цели состоит из трех частей: имени цели, списка зависимостей и списка команд интерпретатора shell, требуемых для построения цели. Имя цели — непустой список файлов, которые предполагается создать. Список зависимостей — список файлов, в зависимости от которых строится цель. Имя цели и список зависимостей составляют заголовок цели, записываются в одну строку и разделяются двоеточием (':'). Список команд записывается со следующей строки, причем все команды начинаются с обязательного символа табуляции. Любая строка в последовательности списка команд, не начинающаяся с табуляции (ещё одна команда) или '#' (комментарий) — считается завершением текущей цели и началом новой.

Утилита make имеет много умалчиваемых значений, важнейшими из которых являются правила обработки суффиксов, а также определения внутренних переменных окружения. Эти данные называются базой данных make и могут быть рассмотрены:

$ make -p >make.suffix

make: *** Не заданы цели и не найден make-файл.  Останов.

$ cat make.suffix
# GNU Make 3.81
# Copyright (C) 2006  Free Software Foundation, Inc.
...
# База данных Make, напечатана Thu Apr 14 14:48:51 2011
...
CC = cc
LD = ld
AR = ar
CXX = g++
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.C = $(COMPILE.cc)
...
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch...
# Implicit Rules
...
%.o: %.c
#  команды, которые следует выполнить (встроенные):
        $(COMPILE.c) $(OUTPUT_OPTION) $<
...

Подавляющее большинство интегрированных сред разработки (IDE) или пакетов созданий переносимых инсталляций (таких как automake & autoconf) ставят своей задачей создание сценарного файла Makefile для утилиты make.


5. Бытует заблуждение, что по умолчанию выполняется некая цель all, но это неверно, просто этим именем часто называют первую по порядку цель, но её может попросту не быть среди других.


Предыдущий раздел: Оглавление Следующий раздел:
Некоторые сравнения   Сборка модулей ядра