[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Когда вы пишете тест свойства, который будет применяться в более чем одном пакете программного обеспечения, то лучше всего оформить его в виде нового макроса. В этом разделе приводятся некоторые инструкции и указания по написанию макросов Autoconf.
7.1 Определение макросов Базовый формат макросов Autoconf. 7.2 Имена макросов 7.3 Заключение в кавычки 7.4 Зависимости между макросами
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Макросы Autoconf определяются с помощью макроса AC_DEFUN
, который
подобен встроенному макросу define
программы m4
. В
добавление к определению макроса, AC_DEFUN
добавляет к нему
некий код, использующийся для ограничения порядка вызова
макросов (see section 7.4.1 Требуемые макросы).
Определение макроса Autoconf выглядит примерно следующим образом:
AC_DEFUN(macro-name, [macro-body]) |
Квадратные скобки не показывают необязательный параметр: они должны присутствовать в определении макроса для избежания проблем расширения макроса (see section 7.3 Заключение в кавычки). Вы можете ссылаться на передаваемые макросу параметры с помощью переменных `$1', `$2' и т.п.
Для ввода комментариев в m4
используйте встроенный макрос
m4
dnl
; он заставляет m4
игнорировать текст до
начала новой строки. Он не нужен между определениями макросов в файлах
`acsite.m4' и `aclocal.m4', поскольку весь вывод удаляется до
вызова AC_INIT
.
See section `How to define new macros' in GNU m4, для
более полной информации о написании макросов m4
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Все макросы Autoconf названы именами, состоящими из заглавных букв и начинающихся с префикса `AC_', для того, чтобы избежать конфликтов с другим текстом. Все переменные командного процессора, которые используются для внутренних целей в этих макросах, как правило, называются именами из прописных букв и начинаются с `ac_'. Чтобы ваши макросы не конфликтовали с существующими или будущими макросами Autoconf, вы должны использовать собственный префикс для ваших макросов и переменных командного процессора. В качестве возможных значений вы можете использовать ваши инициалы, сокращенное название вашей организации или пакета программ.
Большинство имен макросов Autoconf следуют соглашению о структуре имени, которое показывает какой тип свойства проверяется данным макросом. Имена макросов состоят из нескольких слов, которые разделены символами подчеркивания, продвигаясь от общих слов к более специфическим. Имена соответствующих переменных кэша используют то же соглашение по именованию (see section 6.3.1 Имена переменных кэша для получения дополнительной информации о них).
Первое слово имени после префикса `AC_' обычно сообщает категорию тестируемого свойства. Вот какие категории используются Autoconf для специфических макросов, один из типов которых вы вероятно захотите написать. Они также используются для наименования переменных кэша, только уже прописными буквами. Используйте перечисленные категории при написании ваших макросов; если нужной категории нет, то вы можете вводит собственные.
C
DECL
FUNC
GROUP
HEADER
LIB
PATH
PROG
STRUCT
SYS
TYPE
VAR
После категории следует имя тестируемого свойства. Любые дополнительные
слова в имени макроса указывают на специфические аспекты тестируемого
свойства. Например, AC_FUNC_UTIME_NULL
проверяет поведение
функции utime
при вызове ее с указателем равным NULL
.
Макрос, являющийся внутренней подпрограммой другого макроса, должен
иметь имя, начинающееся с имени этого макроса, за которым следует
одно или несколько слов, описывающих что делает этот макрос. Например,
макрос AC_PATH_X
имеет внутренние макросы AC_PATH_X_XMKMF
и AC_PATH_X_DIRECT
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Макросы, которые вызываются другими макросами, оцениваются программой
m4
несколько раз; каждая оценка может потребовать другого уровня
кавычек для предотвращения нежелательных расширений макросов или
встроенных возможностей m4
, таких как `define' и
`$1'. Кавычки также требуются вокруг аргументов макросов,
содержащих запятые, поскольку запятые разделяют аргументы макроса. Также
хорошей привычкой является заключение в кавычки аргументов, содержащих
символы новой строки или вызовы других макросов.
Autoconf изменяет символ-кавычку программы m4
со значений по
умолчанию ``' и `'' на `[' и `]', поскольку многие
из макросов используют не сочетаемые ``' и `''. Однако в
нескольких местах макросам необходимо использование символов-скобок
(обычно в тексте программ на языке C или в регулярных выражениях). В
этих местах макросы используют встроенную команду m4
changequote
для временного изменения символа-кавычек на `<<'
и `>>'. (Иногда, если им нет нужды заключать в кавычки что-либо, то
они запрещают заключение в кавычки установкой символов-кавычек равных
пустым символам). Вот пример использования:
AC_TRY_LINK( changequote(<<, >>)dnl <<#include <time.h> #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ #endif>>, changequote([, ])dnl [atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no) |
Когда вы создаете скрипт configure
, используя только что
написанные макросы, то тщательно проверьте, нужно ли добавить
дополнительные символы-кавычки в эти макросы. Если одно или несколько
слов исчезнут в выводе m4
, то вам необходимо добавить
дополнительные символы-кавычки. Если вы сомневаетесь, то просто добавьте
кавычки.
Однако также возможно поместить слишком много уровней кавычек. Если это
случается, то полученный скрипт configure
будет содержать
не-расширенный макрос. Программа autoconf
выполняет проверку этой
проблемы, выполняя команду `grep AC_ configure'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Некоторые макросы Autoconf зависят от других макросов, которые должны быть вызваны первыми для того, чтобы работа производилась правильно. Autoconf предоставляет способпроверки вызововн екоторых макросов и способ предоставления пользователю информацию о макросах, вызывающихся в порядке, приводимом к неправильному выполнению.
7.4.1 Требуемые макросы 7.4.2 Предлагаемый порядок 7.4.3 Устаревшие макросы
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Макрос, который вы можете написать, может нуждаться в значениях,
вычисленных перед этим другими макросами. Например,
AC_DECL_YYTEXT
проверяет вывод flex
или lex
, так
что он зависит от AC_PROG_LEX
, который должен быть вызван перед
этим для установки переменной командного процессора LEX
.
Вместо того, чтобы заставлять пользователя макросов помнить все
зависимости между макросами, вы можете использовать макрос
AC_REQUIRE
для автоматического отслеживания
зависимости. AC_REQUIRE
может помочь в обеспечении вызова макроса
только по мере необходимости, и будет вызываться только один раз.
m4
с именем macro-name еще не был вызван, то
необходимо вызвать его (без каких-либо аргументов). Убедитесь, что вы
поместили имя macro-name в квадратные кавычки. macro-name
должен быть определен с использованием макроса AC_DEFUN
или
должен содержать вызов макроса AC_PROVIDE
для того, чтобы
указать, что он был вызван.
Альтернативой этому использованию AC_DEFUN
является использование
define
и вызов макроса AC_PROVIDE
. Поскольку этот подход
не предотвращает вложенных сообщений, то эта техника является
устаревшей.
AC_PROVIDE
. Для простого получения этого имени используйте
встроенную переменную m4
с именем $0
, примерно так:
AC_PROVIDE([$0]) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Некоторые макросы должны быть вызваны до других макросов, если оба они вызываются, но не требуют, чтобы другие макросы были вызваны. Например, макрос, изменяющий поведение компилятора C, должен быть вызван до любого из макросов, запускающих компилятор C. Многие из этих зависимостей упоминаются в документации.
Autoconf предоставляет макрос AC_BEFORE
для предупреждения
пользователя о тех случаях, когда эти макросы вызываются в неправильном
порядке в файле `configure.in'. Предупреждение выдается при
создании скрипта configure
из файла `configure.in', а не при
запуске созданного configure
. Например, AC_PROG_CPP
проверяет, может ли компилятор C запустить препроцессор C с ключом
`-E'. Он должен быть вызван после любого из макросов, который
изменяет поведение используемого компилятора C, такого как
AC_PROG_CC
. Так что макрос AC_PROG_CC
должен содержать:
AC_BEFORE([$0], [AC_PROG_CPP])dnl |
Это вызывает выдачу предупреждения пользователю, если вызов
AC_PROG_CPP
уже произошел до вызова макроса AC_PROG_CC
.
m4
выдать предупреждающее сообщение в стандартный
поток сообщений об ошибках в том случае, если макрос
called-macro-name уже был вызван. this-macro-name должен
быть именем макроса, вызывающим AC_BEFORE
. Макрос
called-macro-name должен быть определен макросом AC_DEFUN
или должен содержать вызов AC_PROVIDE
для того, чтобы показать,
что он был вызван.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Технология настройки и переносимости развивалась многие годы. Часто
разрабатывались лучшие решения отдельных проблем, или
систематизировались специальные подходы. Этот процесс происходил во
многих частях Autoconf. Результатом этого является то, что некоторые
макросы в настоящее время считаются устаревшими; они до сих пор
работают, но не считаются лучшим способом решения. Autoconf
предоставляет макрос AC_OBSOLETE
, который предупреждает
пользователей создающих скрипты configure
о том, что они
используют устаревшие макросы, чтобы поощрить их к использованию
современных макросов. Простой вызов этого макроса выглядит так:
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl |
m4
выдать сообщение в стандартный поток сообщений об
ошибках, которое говорит, что макрос this-macro-name устарел, и
выдает имя файла и номер строки, где был вызван этот макрос,
this-macro-name должен быть именем макроса, который производит
вызов AC_OBSOLETE
. Если задан аргумент suggestion, то он
выдается в конце предупреждающего сообщения; например, он может быть
советом о том, что нужно использовать вместо this-macro-name.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |