2015-09-22 7 views
3

У меня есть установленная библиотека, которую мы будем называть «custom_lib», с которой я связываюсь.Обнаружить макрос препроцессора в другой библиотеке с помощью Autoconf

Я хочу проверить, была ли эта библиотека установлена ​​с определенной опцией.

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?

ответ

4

AC_EGREP_HEADER макрос не выполняет grep в тексте тестируемого заголовка, а на выходе препроцессора, запущенного в этом файле.

От autoconf manual:

- Макро: макрос AC_EGREP_HEADER (рисунок, заголовок-файл, действия в случае обретенного [действия, если-не-найден])

Если выхода бега препроцессор в системном заголовочном файле заголовочный файл соответствует расширенному шаблону регулярного выражения, выполните команды оболочки action-if-found, иначе выполните действие-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"]) 
+0

Работы! Огромное спасибо. Мне пришлось изменить вашу строку include, поскольку это установленная библиотека: #include Kaleb