Алексей Махоткин

домашняя страница

Autoconf

Go to the first, previous, next, last section, table of contents.


Определение символов препроцессора С

@anchor{Defining Symbols}

Обычно после проверки какой-либо возможности устанавливается символ препроцессора, отражающий результат проверки. Это происходит при вызове макроса AC_DEFINE или AC_DEFINE_UNQUOTED.

По умолчанию макрос AC_OUTPUT помещает символы, определенные этими макросами в выходную переменную DEFS, которая по одному ключу `-Dsymbol=value на каждый символ. В отличии от Autoconf версии 1, переменная DEFS не определена в течении работы configure. Для проверки того, определен ли уже какой-либо символ препроцессора C, проверьте значение соответствующей переменной кэша, как показано в этом примере:

AC_CHECK_FUNC(vprintf, AC_DEFINE(HAVE_VPRINTF))
if test “$ac_cv_func_vprintf” != yes; then
AC_CHECK_FUNC(_doprnt, AC_DEFINE(HAVE_DOPRNT))
fi

Если был вызван макрос AC_CONFIG_HEADER, то AC_OUTPUT вместо определения переменной DEFS создает заголовочный файл путем подстановки правильных значений в директивы #define, заданные в файле-шаблоне. See section Заголовочные файлы конфигурации, для дополнительной информации об этом способе вывода результатов.

Macro: AC_DEFINE (variable [, value [, description]])
Определяет переменную препроцессора C variable. Если аргумент value задан, то устанавливает переменную variable в это значение (без изменений), в противном случае устанавливает ее равной 1. value не должен содержать символов перевода строки, а если вы не используете AC_CONFIG_HEADER, то он не должен содержать символы `#’, поскольку make имеет склонен проглатывать их. Для использования переменной командного процессора (которая необходима, если нужно определить значение, содержащее символ, являющийся кавычкой в m4 `[’ или `]’) вам следует использовать AC_DEFINE_UNQUOTED. Аргумент description полезен только в том случае, если вы используете макрос AC_CONFIG_HEADER. В этом случае description будет помещен в созданный файл `config.h.in’ в качества комментария к определению символа; макросу не нужно быть упомянутым в `acconfig.h’. Следующий пример определяет переменную препроцессора C EQUATION со значением, равным строковой константе `”$a > $b”’:
AC_DEFINE(EQUATION, “$a > $b”)

Macro: AC_DEFINE_UNQUOTED (variable [, value [, description]])
Подобно AC_DEFINE, но над переменными variable и value выполняется ряд преобразований: подстановка переменных (`$’), подстановка результатов выполнения команд (“’) и экранирование символов обратной косой черты (`'). Символы одиночных и двойных кавычек в value не имеют специального смысла. Используйте этот макрос вместо AC_DEFINE, когда variable или value являются переменными командного процессора. Примеры:
AC_DEFINE_UNQUOTED(config_machfile, “${machfile}”)
AC_DEFINE_UNQUOTED(GETGROUPS_T, $ac_cv_type_getgroups)
AC_DEFINE_UNQUOTED(${ac_tr_hdr})

Из-за синтаксических странностей командного процессора Bourne не следует использовать точку с запятой для разделения вызовов макросов AC_DEFINE или AC_DEFINE_UNQUOTED от вызова других макросов или кода командного процессора; это может привести к синтаксическим ошибкам в результирующем скрипте configure. Вместо этого используйте пробелы или переводы строк. То есть, следует писать так:

AC_CHECK_HEADER(elf.h, AC_DEFINE(SVR4) LIBS=”$LIBS -lelf”)

либо так:

AC_CHECK_HEADER(elf.h,
  AC_DEFINE(SVR4)
  LIBS=”$LIBS -lelf”)

но не так:

AC_CHECK_HEADER(elf.h, AC_DEFINE(SVR4); LIBS=”$LIBS -lelf”)


Go to the first, previous, next, last section, table of contents.

Comments