go to the first, previous, next, last section, table of contents.
построение программ и библиотекбольшая часть функциональности automake направлена на то, чтобы облегчить компиляцию программ и библиотек. построение программ
в каталоге, содержащем исходные тексты, из которых будет построена
программа (в отличие от библиотеки), в основном используется
макрос `programs'. программы могут быть установлены в каталоги
например: bin_programs = hello
в этом простом примере результирующий `makefile.in' будет
содержать код для генерации программы с именем 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' будет, в зависимости от условий, включен в
программу extra_hello_sources = hello-linux.c
иногда также полезно аналогичным образом определить во время
конфигурации, какие программы будут скомпилированы. например, gnu
в этом случае вы должны уведомить automake обо всех программах, которые
могут быть построены, но в то же время заставить сгенерированный файл
`makefile.in' использовать программы, заданные при выполнении
если вы хотите скомпоновать программу с библиотеками, которые не найдены
иногда несколько программ компилируются в одном каталоге, но при этом у
них различные требования к компоновке. в этом случае для
переопределения глобальной переменной
например, в gnu 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'. построение библиотеки
построение библиотеки по большей части аналогично построению программы.
в этом случае именем основной переменной является `libraries'. библиотеки могут
быть установлены в каталоги смотри главу see section построение разделяемых библиотек, где описано, как компилировать разделяемые библиотеки, используя программу libtool и основную переменную `ltlibraries'. каждая переменная `_libraries' является списком библиотек, которые должны быть построены. например, для того, чтобы создать библиотеку с именем `libcpio.a', но не устанавливать ее, вы должны написать: noinst_libraries = libcpio.a файлы исходных текстов для библиотек определяются точно так же, как и для программ, через переменные `_sources'. заметьте, что имя библиотеки является канонизированным (see section как именуются порожденные переменные), так что переменная `_sources' для `liblob.a' является равной `liblob_a_sources', а не `liblob.a_sources'.
дополнительные объекты могут быть добавлены в библиотеку, используя
переменную `library_libadd'. это можно использовать для
объектов, определенных libcpio_a_libadd = @libobjs@ @alloca@ специальная обработка переменных `libobjs' и `alloca'
automake явно распознает использование переменных
использование построение разделяемых библиотекпостроение разделяемой библиотеки является относительно сложной задачей. для помощи в платформонезависимом построении разделяемых библиотек была создана программа gnu libtool (see section `введение' in руководство libtool). automake использует libtool для построения библиотек, указанных в переменной `ltlibraries'. каждая переменная `_ltlibraries' является списком разделяемых библиотек, которые нужно построить. например, для создания библиотеки с именем `libgettext.a' и соответствующей ей разделяемой библиотеки, а также их установки в `libdir', вы должны написать: lib_ltlibraries = libgettext.la
заметьте, что разделяемые библиотеки должны быть установлены, так
что использование для каждой библиотеки переменная `library_libadd' содержит имена дополнительных объектов libtool (файлы `.lo'), которые будет добавляться в разделяемую библиотеку. переменная `library_ldflags' содержит любые дополнительные флаги libtool, такие как `-version-info' или `-static'.
в то время как обычные библиотеки могут включать
для библиотек, устанавливаемых в некоторый каталог, automake будет
автоматически снабжать их соответствующим ключом `-rpath'. однако
для библиотек, определенных во время конфигурации (и таким образом
перечисленных в переменной для подробного описания смотрите see section `руководство libtool' in руководство libtool. переменные, используемые при построении программиногда полезно знать, какие переменные `makefile' automake использует для компиляции; например, вам в некоторых случаях может быть необходимо использовать ваш собственный способ компиляции.
некоторые переменные наследуются от autoconf: это также есть некоторые дополнительные переменные, определенные самим automake:
поддержка yacc и lexв automake есть некоторая поддержка yacc и lex.
automake предполагает, что файлы с расширением `.c', которые
создаются расширение имени yacc-файла используется для определения расширения имени готового файла на языках `c' или `c++'. файлы с расширением `.y' будут превращены в файлы с расширением `.c'; аналогично `.yy' станут `.cc'; `.y++' станут `c++'; и `.yxx' станут `.cxx'.
подобным образом исходные тексты на вы не должны явно упоминать промежуточные файлы (на `c' или `c++') в переменных `sources'; вы должны указывать только список исходных файлов.
промежуточные файлы, созданные
если был обнаружен исходный текст на
аналогичным образом, если есть исходный текст
automake делает возможным включение в одну программу нескольких исходных
файлов
для
мы рекомендуем использование следующего приема с переименованием
объектов, который используется в #define yymaxdepth c_maxdepth #define yyparse c_parse #define yylex c_lex #define yyerror c_error #define yylval c_lval #define yychar c_char #define yydebug c_debug #define yypact c_pact #define yyr1 c_r1 #define yyr2 c_r2 #define yydef c_def #define yychk c_chk #define yypgo c_pgo #define yyact c_act #define yyexca c_exca #define yyerrflag c_errflag #define yynerrs c_nerrs #define yyps c_ps #define yypv c_pv #define yys c_s #define yy_yys c_yys #define yystate c_state #define yytmp c_tmp #define yyv c_v #define yy_yyv c_yyv #define yyval c_val #define yylloc c_lloc #define yyreds c_reds #define yytoks c_toks #define yylhs c_yylhs #define yylen c_yylen #define yydefred c_yydefred #define yydgoto c_yydgoto #define yysindex c_yysindex #define yyrindex c_yyrindex #define yygindex c_yygindex #define yytable c_yytable #define yycheck c_yycheck #define yyname c_yyname #define yyrule c_yyrule
для каждого `#define' замените префикс `c_' на то, что вы
хотите использовать. эти определения работают для программ поддержка c++automake полностью поддерживает c++.
любой пакет, содержащий код на c++, должен определить переменную
`cxx' в файле `configure.in'; самым простым способом сделать
это является использование макроса несколько дополнительных переменных определяются при обнаружении исходных файлов на c++:
поддержка fortran 77automake полностью поддерживает fortran 77.
любой пакет, содержащий исходные тексты на языке fortran 77, должен
определить выходную переменную `f77' в файле `configure.in';
самым простым способом является использование макроса при использовании исходных текстов на fortran 77 определяются несколько дополнительных переменных:
automake может вдобавок к компиляции выполнять предварительную обработку исходных файлов на fortran 77 и ratfor(1). automake также содержит некоторую поддержку для создания программ и разделяемых библиотек, которые написаны на смеси fortran 77 и других языков (see section использование fortran 77 с c и c++). это описывается в следующих разделах. предварительная обработка файлов fortran 77файл `n.f' автоматически создается из файла `n.f' или `n.r'. это правило запускает препроцессор для преобразования исходных текстов fortran 77 или ratfor с директивами препроцессора в строгий исходный текст fortran 77. вот точные команды, которые используются для этого:
компиляция файлов fortran 77`n.o' автоматически создается из `n.f', `n.f' или `n.r' запуском компилятора fortran 77. для компиляции используются следующий команды:
использование fortran 77 с c и c++в настоящее время automake предоставляет ограниченную поддержку создания программ и разделяемых библиотек, которые являются смесью fortran 77 и c и/или c++. однако существует много других вопросов, возникающих при смешивании кода на fortran 77 с кодом на других языках, которые в настоящее время не обрабатываются automake, но обрабатываются другими пакетами(2). automake может предоставить вам помощь двумя способами:
если automake определяет, что программа или разделяемая библиотека
(упомянутые в каких-либо основных переменных например, рассмотрим следующий `makefile.am': bin_programs = foo foo_sources = main.cc foo.f foo_ldadd = libfoo.la @flibs@ pkglib_ltlibraries = libfoo.la libfoo_la_sources = bar.f baz.c zardoz.cc libfoo_la_libadd = $(flibs)
в этом случае automake будет настаивать, чтобы макрос
как выбирается компоновщикследующая диаграмма показывает, как automake производит выбор соответствующего компоновщика.
например, если используемый код на fortran 77, c и c++ компонуется в
одну программу, то выбирается компоновщик c++. в этом случае, если
компоновщики c или fortran 77 требуют какие-либо специальные библиотеки,
которые не подключаются компоновщиком c++, то они должны быть вручную
добавлены пользователем в переменные \ linker source \ code \ c c++ fortran ----------------- +---------+---------+---------+ | | | | c | x | | | | | | | +---------+---------+---------+ | | | | c++ | | x | | | | | | +---------+---------+---------+ | | | | fortran | | | x | | | | | +---------+---------+---------+ | | | | c + c++ | | x | | | | | | +---------+---------+---------+ | | | | c + fortran | | | x | | | | | +---------+---------+---------+ | | | | c++ + fortran | | x | | | | | | +---------+---------+---------+ | | | | c + c++ + fortran | | x | | | | | | +---------+---------+---------+ использование fortran 77 с autoconfимеющаяся в automake поддержка fortran 77 требует наличия свежей версии autoconf, которая поддерживает fortran 77. полная поддержка fortran 77 была добавлена в autoconf 2.13, так что вы можете использовать эту версию autoconf или более позднюю. поддержка других языковв настоящее время automake включает в себя полную поддержку только c, c++ (see section поддержка c++) и fortran 77 (see section поддержка fortran 77). поддержка других языков находится в зачаточном состоянии и будет улучшена по требованию пользователей. автоматическая де-ansi-фикацияхотя стандарты gnu позволяют использование ansi c, это может привести к ограничению переносимости пакета на некоторые старые компиляторы (особенно sunos). automake позволяет вам обойти проблему с такими машинами путем де-ansi-фикации каждого исходного файла перед компиляцией.
если в `makefile.am' переменная
это заставит считать каждый исходный текст на языке c соответствующим
ansi c. если доступен компилятор, соответствующий ansi c,
то он будет использован. в противном случае для
преобразования исходных файлов в стандарт k&r будет использована
программа
программа
поддержка де-ansi-фикации требует наличия файлов `ansi2knr.c' и
`ansi2knr.1' в том же пакете, где находятся и исходные тексты на
ansi c; эти файлы поставляются в комплекте automake. файл
`configure.in' должен также содержать вызов макроса
automake также работает в тех случаях, когда файлы automake_options = ../lib/ansi2knr если никакой префикс не задан, то считается, что файлы находятся в текущем каталоге.
файлы, перечисленные в переменной # this is necessary so that .o files in libobjs are also built via # the ansi2knr-filtering rules. libobjs=`echo $libobjs|sed 's/\.o /\$u.o /g;s/\.o$/\$u.o/'` автоматическое отслеживание зависимостейдля разработчика зачастую мучительно бывает постоянно обновлять файл `makefile.in' при изменении зависимостей включаемых в проект файлов. automake предоставляет возможность автоматического отслеживания изменения зависимостей и записи информации о них в сгенерированный `makefile.in'.
в настоящее время эта поддержка требует использования gnu
когда вы решаете создать дистрибутив, то цель при добавлении зависимостей в `makefile.in', из них автоматически удаляются все специфические для данной системы зависимости. это может быть сделано перечислением файлов в переменной `omit_dependencies'. например, automake удаляет все ссылки на системные заголовочные файлы. иногда полезно указать, чтобы были удалены отдельные заголовочные файлы. например, если ваш файл `configure.in' использует макрос `am_with_regex', то любая зависимость от файла `rx.h' или `regex.h' должны быть удалена, потому что правильное значение не может быть известно до того, как пользователь выполнит конфигурацию пакета. оказывается, automake достаточно умен для обработки именно этого случая использования заголовочных файлов библиотеки регулярных выражений. он также автоматически убирает зависимость от `libintl.h' при использовании `am_gnu_gettext'.
автоматическое отслеживание зависимостей может быть запрещено помещением
если вы распаковываете дистрибутив, созданный файлы зависимостей помещаются в подкаталог с именем `.deps' каталога, где происходит построение. эти зависимости являются специфическими для машины. можете удалить их, если хотите; они будут автоматически пересозданы при следующей сборке. go to the first, previous, next, last section, table of contents. |