Алексей Махоткин

домашняя страница

Automake

Go to the first, previous, next, last section, table of contents.


Построение программ

В каталоге, содержащем исходные тексты, из которых будет построена программа (в отличие от библиотеки), в основном используется макрос `PROGRAMS’. Программы могут быть установлены в каталоги bindir, sbindir, libexecdir, pkglibdir, или же вообще не устанавливаться (`noinst’).

Например:

bin_PROGRAMS = hello

В этом простом примере результирующий `Makefile.in’ будет содержать код для генерации программы с именем hello. Переменная hello_SOURCES используется для указания того, какие файлы исходных текстов будут использованы для компиляции исполняемого файла:

hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h 

В результате этого каждый упомянутый в этой переменной файл `.c’ будет скомпилирован в соответствующий файл `.o’. Затем все они компонуются для создания `hello’.

Если переменная `prog_SOURCES’ необходима, но не указана, то она получает значение по умолчанию, равное единственному файлу `prog.c’.

В одном каталоге могут компилироваться несколько программ. Эти программы могут совместно использовать один и тот же исходный файл, который должен быть указан в каждом определении `_SOURCES’.

Заголовочные файлы, перечисленные в определении `_SOURCES’, включаются в дистрибутив, а в других случаях игнорируются. В том случае, если это не очень удобно, вы не должны включать файл, созданный `configure’ в переменную `_SOURCES’; этот файл не должен распространяться. Файлы Lex (`.l’) и Yacc (`.y’) также должны быть перечислены; смотрите раздел section Поддержка Yacc и Lex.

Automake должен знать все файлы исходных текстов, которые могут участвовать в компиляции программы, даже если не все файлы будут использоваться в каждом конкретном случае. Файлы, которые компилируются только при выполнении определенных условий, должны быть перечислены в соответствующей переменной `EXTRA_’. Например, если `hello-linux.c’ будет, в зависимости от условий, включен в программу hello, то файл `Makefile.am’ должен содержать:

EXTRA_hello_SOURCES = hello-linux.c

Иногда также полезно аналогичным образом определить во время конфигурации, какие программы будут скомпилированы. Например, GNU cpio создает программы mt и rmt только при выполнении определенных условий.

В этом случае вы должны уведомить Automake обо всех программах, которые могут быть построены, но в то же время заставить сгенерированный файл `Makefile.in’ использовать программы, заданные при выполнении configure. Это делается подстановкой значений при выполнении configure в каждом определении `_PROGRAMS’. А все программы, которые можно создать, перечисляются в переменной EXTRA_PROGRAMS.

Если вы хотите скомпоновать программу с библиотеками, которые не найдены configure, то для этого вы должны использовать переменную LDADD. Эта переменная может использоваться для добавления ключей в командную строку компоновщика.

Иногда несколько программ компилируются в одном каталоге, но при этом у них различные требования к компоновке. В этом случае для переопределения глобальной переменной LDADD вы можете использовать переменную `prog_LDADD’ (где prog является именем программы, как оно появляется в некоторых переменных `_PROGRAMS’, и обычно записывается буквами в нижнем регистре). Если эта переменная существует для заданной программы, то программа компонуется без использования LDADD.

Например, в GNU cpio, pax, cpio и mt компонуются с библиотекой `libcpio.a’. Однако, программа rmt, создаваемая в том же каталоге, не имеет такого требования к компоновке. Более того, программы mt и rmt создаются только на определенных типах машин. Вот как выглядит `src/Makefile.am’ из поставки cpio (в сокращенном виде):

bin_PROGRAMS = cpio pax @MT@
libexec_PROGRAMS = @RMT@
EXTRA_PROGRAMS = mt rmt

LDADD = ../lib/libcpio.a @INTLLIBS@
rmt_LDADD =

cpio_SOURCES = …
pax_SOURCES = …
mt_SOURCES = …
rmt_SOURCES = …

`prog_LDADD’ не подходит для передачи специфических для программы флагов компоновщика (за исключением `-l’ и `-L’). Для передачи таких флагов используйте переменную `prog_LDFLAGS’.

Также иногда полезно собирать программу, в зависимости от цели, которая не является частью этой программы. Это может быть сделано с использованием переменной `prog_DEPENDENCIES’. Каждая программа зависит от содержимого такой переменной, но никакой дополнительной интерпретации не производится.

Если переменная `prog_DEPENDENCIES’ не определена, то она будет вычислена Automake. Автоматически присвоенная ей величина является содержимым переменной `prog_LDADD’ с большинством подстановок `configure’. Ключи `-l’ и `-L’ удаляются. Остающимися подстановками `configure’ являются только `@LIBOBJS@’ и `@ALLOCA@’; они остаются потому, что они заведомо не приведут к генерации неправильных значений для `prog_DEPENDENCIES’.


Go to the first, previous, next, last section, table of contents.

Comments