[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7. Создание макросов

Когда вы пишете тест свойства, который будет применяться в более чем одном пакете программного обеспечения, то лучше всего оформить его в виде нового макроса. В этом разделе приводятся некоторые инструкции и указания по написанию макросов Autoconf.

7.1 Определение макросов  Базовый формат макросов Autoconf.
7.2 Имена макросов  
7.3 Заключение в кавычки  
7.4 Зависимости между макросами  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 Определение макросов

Макросы 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] [ ? ]

7.2 Имена макросов

Все макросы Autoconf названы именами, состоящими из заглавных букв и начинающихся с префикса `AC_', для того, чтобы избежать конфликтов с другим текстом. Все переменные командного процессора, которые используются для внутренних целей в этих макросах, как правило, называются именами из прописных букв и начинаются с `ac_'. Чтобы ваши макросы не конфликтовали с существующими или будущими макросами Autoconf, вы должны использовать собственный префикс для ваших макросов и переменных командного процессора. В качестве возможных значений вы можете использовать ваши инициалы, сокращенное название вашей организации или пакета программ.

Большинство имен макросов Autoconf следуют соглашению о структуре имени, которое показывает какой тип свойства проверяется данным макросом. Имена макросов состоят из нескольких слов, которые разделены символами подчеркивания, продвигаясь от общих слов к более специфическим. Имена соответствующих переменных кэша используют то же соглашение по именованию (see section 6.3.1 Имена переменных кэша для получения дополнительной информации о них).

Первое слово имени после префикса `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.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 Заключение в кавычки

Макросы, которые вызываются другими макросами, оцениваются программой 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] [ ? ]

7.4 Зависимости между макросами

Некоторые макросы Autoconf зависят от других макросов, которые должны быть вызваны первыми для того, чтобы работа производилась правильно. Autoconf предоставляет способпроверки вызововн екоторых макросов и способ предоставления пользователю информацию о макросах, вызывающихся в порядке, приводимом к неправильному выполнению.

7.4.1 Требуемые макросы  
7.4.2 Предлагаемый порядок  
7.4.3 Устаревшие макросы  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4.1 Требуемые макросы

Макрос, который вы можете написать, может нуждаться в значениях, вычисленных перед этим другими макросами. Например, 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])


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4.2 Предлагаемый порядок

Некоторые макросы должны быть вызваны до других макросов, если оба они вызываются, но не требуют, чтобы другие макросы были вызваны. Например, макрос, изменяющий поведение компилятора 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 для того, чтобы показать, что он был вызван.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4.3 Устаревшие макросы

Технология настройки и переносимости развивалась многие годы. Часто разрабатывались лучшие решения отдельных проблем, или систематизировались специальные подходы. Этот процесс происходил во многих частях 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.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on February, 19 2004 using texi2html