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

UnixForum





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

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux
Назад Приложение Б: Краткая справка по утилите make Вперед

Приложение Б: Краткая справка по утилите make

При модульном программировании работать с утилитой make приходится постоянно. Более того, «работать» это сильно мягко сказано: приходится постоянно переписывать сценарный файл Makefile, причём для довольно изощрённых случаев. Детальное описание make доступно [23]. Здесь же приведём только самую краткую справку (главным образом для напоминания о умалчиваемых значениях переменных make).

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

$ make --version

	GNU Make 3.81 
	Copyright (C) 2006  Free Software Foundation, Inc. 
	...

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

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

$ make

$ make clean

Если цель не указывается, то выполняется первая последовательная цель в файле сценария (почему-то существует суеверие, что собирается цель с именем all — просто цель all ставится в файле выше всех остальных). Может использоваться и любой другой сценарный файл сборки, тогда он указывается так:

$ make -f Makefile.my

Сценарий 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) $<
	...

Все эти значения (переменных: CC, LD, AR, EXTRA_CFLAGS, ... ) могут использоваться файлом сценария как неявные определения с значениями по умолчанию.


Предыдущий раздел: Оглавление Следующий раздел:
Приложение А: сборка и установка ядра   Приложение В: Пример - открытые VoIP PBX: Asterisk, FreeSwitch, и другие