@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 Заголовочные файлы конфигурации, для
дополнительной информации об этом способе вывода результатов.
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")
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.