Обнаружение макроса препроцессора в другой библиотеке с помощью Autoconf
У меня есть установленная библиотека, мы назовем ее "custom_lib", с которой я ссылаюсь.
Я хочу проверить, была ли эта библиотека установлена с определенной опцией.
Заголовочный файл options.h в этой библиотеке содержит список макросов препроцессора, например:
#undef THIS
#define THIS
#undef THAT
#define THAT
#undef WE_WANT_THIS_ONE
#define WE_WANT_THIS_ONE
В другом проекте у меня есть в моем файле configure.ac этот тест:
OPTION_FOUND="no"
AC_CHECK_HEADERS(custom_lib/options.h)
AC_MSG_CHECKING([is libary configured with --enable-we_want_this_one])
#AC_EGREP_HEADER([ string to match ],
# [ header file ],
# [ action if found ],
# [ action if not found ])
AC_EGREP_HEADER([[WE_WANT_THIS_ONE]],
[custom_lib/options.h],
[OPTION_FOUND="yes"],
[OPTION_FOUND="no"])
if test "$OPTION_FOUND" = "yes"
then
# If we have WE_WANT_THIS_ONE check to see which compiler is being used
if test "$GCC" = "yes"
then
if test "$CC" != "icc"
then
#if compiler is not icc then add these flags
CFLAGS="$CFLAGS -maes -msse4"
fi
fi
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
Затем я запускаю autreconf и запускаю./configure, который всегда возвращает это сообщение:
checking custom_lib/options.h usability... yes
checking custom_lib/options.h presence... yes
checking for custom_lib/options.h... yes
checking is library configured with --enable-we_want_this_one... no
Я делаю что-то неправильно. Что нужно изменить в тесте, который у меня есть в configure.ac, чтобы autoconf мог определять макрос препроцессора в options.h?
1 ответ
AC_EGREP_HEADER
макрос не выполняет grep для текста тестируемого заголовка, а для вывода препроцессора, работающего с этим файлом.
- Макрос: AC_EGREP_HEADER (шаблон, файл заголовка, действие-если-найдено, [действие-если-не-найдено])
Если выходные данные запуска препроцессора в заголовочном файле системного заголовочного файла соответствуют расширенному шаблону регулярных выражений, выполните команды оболочки action-if-found, в противном случае выполните action-if-not-found.
Вы могли бы использовать AC_COMPILE_IFELSE
макрос вместо. Например (не проверено):
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include "custom_lib/options.h"
#ifndef WE_WANT_THIS_ONE
# error macro not defined
#endif
]])], [OPTION_FOUND="yes"], [OPTION_FOUND="no"])