Autoconf - Создание макросов
Go to the first, previous, next, last section, table of contents.
Создание макросов
@anchor{Writing Macros}
Когда вы пишете тест свойства, который будет применяться в более чем одном пакете программного обеспечения, то лучше всего оформить его в виде нового макроса. В этом разделе приводятся некоторые инструкции и указания по написанию макросов Autoconf.
Определение макросов
@anchor{Macro Definitions}
Макросы Autoconf определяются с помощью макроса AC_DEFUN
, который
подобен встроенному макросу define
программы m4
. В
добавление к определению макроса, AC_DEFUN
добавляет к нему
некоторый код, который используется для ограничения порядка вызовы
макросов (see section Требуемые макросы).
Определение макроса Autoconf выглядит примерно следующим образом:
AC_DEFUN(macro-name, [macro-body])
Квадратные скобки не показывают необязательный параметр: они должны присутствовать в определении макроса для избежания проблем расширения макроса (see section Заключение в кавычки). Вы можете ссылаться на передаваемые макросу параметры с помощью переменных `$1', `$2' и т.п.
Для ввода комментариев в m4
, используйте встроенный макрос
m4
dnl
; он заставляет m4
игнорировать текст до
начала новой строки. Он не нужен между определениями макросов в файлах
`acsite.m4' и `aclocal.m4', поскольку весь вывод удаляется до
вызова AC_INIT
.
See section `How to define new macros' in GNU m4, для
более полной информации о написании макросов m4
.
Имена макросов
@anchor{Macro Names}
Все макросы Autoconf названы именами, состоящими из букв заглавных букв и начинающихся с префикса `AC_', для того, чтобы избежать конфликтов с другим текстом. Все переменные командного процессора, которые используются для внутренних целей в этих макросах, как правило называются именами из прописных букв и начинаются с `ac_'. Чтобы обеспечить, что ваши макросы не конфликтовали с существующими или будущими макросами Autoconf, вы должны использовать собственный префикс для ваших макросов и переменных командного процессора. В качестве возможных значений вы можете использовать ваши инициалы, или сокращенное название вашей организации или пакета программ.
Большинство имен макросов Autoconf следуют соглашению о структуре имени, которое показывает какой тип свойства проверяемого данным макросом. Имена макросов состоит из нескольких слов, который разделены символами подчеркивания, продвигаясь от общих слов к более специфическим. Имена соответствующих переменных кэша используют то же соглашение по именованию (see section Имена переменных кэша, для получения дополнительной информации о них).
Первое слово имени после префикса `AC_' обычно сообщает категорию тестируемого свойства. Вот какие категории используются Autoconf для специфических макросов, один из типов которых вы вероятно захотите написать. Они также используются для именования переменных кэша, только используя прописные буквы. Используйте перечисленные категории при написании ваших макросов; если нужной категории нет, то вы можете вводит собственные.
C
- Встроенные возможности языка C.
DECL
- Объявления переменных C в заголовочных файлах.
FUNC
- Функции в библиотеках.
GROUP
- Группа UNIX владеющая файлами.
HEADER
- Заголовочные файлы.
LIB
- Библиотеки C.
PATH
- Полные путевые имена файлов, включая программы.
PROG
- Базовые имена программ.
STRUCT
- Определения структур C в заголовочных файлах.
SYS
- Свойства операционной системы.
TYPE
- Встроенные или объявленные типы C.
VAR
- Переменные C в библиотеках.
После категории следует имя тестируемого свойства. Любые дополнительные
слова в имени макроса указывают на специфические аспекты тестируемого
свойства. Например, AC_FUNC_UTIME_NULL
проверяет поведение
функции utime
при вызове ее с указателем равным NULL
.
Макрос, который является внутренней подпрограммой другого макроса должен
иметь имя, которое начинается с имени этого макроса, за которым следует
одно или несколько слов, описывающих что делает этот макрос. Например,
макрос AC_PATH_X
имеет внутренние макросы AC_PATH_X_XMKMF
и AC_PATH_X_DIRECT
.
Заключение в кавычки
@anchor{Quoting}
Макросы, которые вызываются другими макросами оцениваются программой
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'.
Зависимости между макросами
@anchor{Dependencies Between Macros}
Некоторые макросы Autoconf зависят от других макросов, которые должны быть вызваны первыми для того, чтобы работа производилась правильно. Autoconf предоставляет способ для того, чтобы проверить, что некоторые макросы были вызваны, и способ предоставления пользователю информацию о макросах, которые вызываются в порядке, которые может привести к неправильному выполнению.
Требуемые макросы
@anchor{Prerequisite Macros}
Макрос, которое вы можете написать, может нуждаться в значениях, которые
перед этим были вычислены другими макросами. Например,
AC_DECL_YYTEXT
проверяет вывод flex
или lex
, так
что он зависит от AC_PROG_LEX
, который должен быть вызван перед
этим для установки переменной командного процессора LEX
.
Вместо того, чтобы заставлять пользователя макросов помнить все
зависимости между макросами, вы можете использовать макрос
AC_REQUIRE
для того, чтобы автоматически отслеживать
зависимости. AC_REQUIRE
может помочь в обеспечении того, что
макрос вызывается только когда это необходимо, и будет вызываться только
раз.
- Macro: AC_REQUIRE (macro-name)
-
Если макрос
m4
с именем macro-name еще не был вызван, то необходимо вызвать его (без каких-либо аргументов). Убедитесь, что вы поместили имя macro-name в квадратные кавычки. macro-name должен быть определен с использованием макросаAC_DEFUN
или должен содержать вызов макросаAC_PROVIDE
для того, чтобы указать, что он был вызван.
Альтернативой этому использованию AC_DEFUN
является использование
define
и вызов макроса AC_PROVIDE
. Поскольку этот подход
не предотвращает вложенных сообщений, то эта техника является
устаревшей.
- Macro: AC_PROVIDE (this-macro-name)
-
Запоминает тот факт, что макрос this-macro-name был вызван.
this-macro-name должен быть именем макроса, который вызывает
AC_PROVIDE
. Для простого получения этого имени используйте встроенную переменнуюm4
с именем$0
, примерно так:AC_PROVIDE([$0])
Предлагаемый порядок
@anchor{Suggested Ordering}
Некоторые макросы должны быть вызваны до других макросов, если оба макроса вызываются, но не требует, чтобы другие макросы были вызваны. Например, макрос, который изменяет поведение компилятора 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
.
- Macro: AC_BEFORE (this-macro-name, called-macro-name)
-
Заставляет
m4
выдать предупреждающее сообщение в стандартный поток сообщений об ошибках в том случае, если макроса called-macro-name уже был вызван. this-macro-name должен быть именем макроса, который вызываетAC_BEFORE
. Макрос called-macro-name должен быть определен используя макросAC_DEFUN
или должен содержать вызовAC_PROVIDE
для того, чтобы показать, что он был вызван.
Устаревшие макросы
@anchor{Obsolete Macros}
Технология настройки и переносимости развивалась многие годы. Часто
разрабатывались лучшие решения отдельных проблем, или
систематизировались специальные подходы. Этот процесс происходил во
многих частях Autoconf. Результатом этого является то, что некоторые
макросы в настоящее время считаются устаревшими; они до сих пор
работают, но не считаются лучшим способом решения. Autoconf
предоставляет макрос AC_OBSOLETE
, который предупреждает
пользователей создающих скрипты configure
о том, что они
используют устаревшие макросы, чтобы поощрить их к использованию
современных макросов. Простой вызов этого макроса выглядит так:
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
- Macro: AC_OBSOLETE (this-macro-name [, suggestion])
-
Заставляет
m4
выдать сообщение в стандартный поток сообщений об ошибках, которое говорит о том, что макрос this-macro-name является устаревшим, и выдает имя файла и номер строки где был вызван этот макрос this-macro-name должен именем макроса, который производит вызовAC_OBSOLETE
. Если задан аргумент suggestion, то он выдается в конце предупреждающего сообщения; например, он может быть советом о том, что нужно использовать вместо this-macro-name.
Go to the first, previous, next, last section, table of contents.