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.