Макрос автоконфигурации для чтения определения из файла заголовка и записи в config.h

#macros #autoconf

#макросы #Автоконфигурация

Вопрос:

Я нахожусь в процессе преобразования из устаревшей среды сборки в ту, которая использует Autotools. У меня есть устаревший файл заголовка, который содержит большое количество значений конфигурации и который включает в себя ряд других заголовков. Я пытаюсь написать макрос, который может выбирать определенные значения из заголовка устаревшей конфигурации и записывать их в config.h . Я смог написать приведенный ниже макрос, который проверяет, равно ли определение некоторому значению, и выполнить некоторое действие. Я хотел бы добавить шаг, который автоматически записывает определенное значение в config.h .

 AC_DEFUN([ZENO_CHECK_CONFIG],
    [
        AC_CHECK_HEADERS([legacy_config.h])
        AS_IF([test "x$ac_cv_header_legacy_config_h" = "xyes"],
            [
            AC_MSG_CHECKING([for definition of $1])
            AC_EGREP_CPP([test_true],
                [
#include <legacy_config.h>
#if defined($1) amp;amp; $1 == $2
test_true
#endif
                ],
                [AC_MSG_RESULT([enabled])
                $3],
                [AC_MSG_RESULT([disabled])
                $4]
            )
            ]
        )
    ]
)
  

Ответ №1:

Просто используйте AC_DEFINE или, возможно, AC_DEFINE_UNQUOTED:

 ...
            [AC_MSG_RESULT([enabled])
             AC_DEFINE($1, $2)
            $3],
            [AC_MSG_RESULT([disabled])
             AC_DEFINE($1, something)
            $4]
...
  

Комментарии:

1. Это сработало бы, если бы проверка была true однако я хотел бы написать define независимо от значения.

2. Итак, что происходит, когда проверка ложна?

3. Я бы хотел записать фактическое определенное значение из заголовка устаревшей конфигурации в config.h независимо от проверки. Фактически просто «скопируйте» его из заголовка устаревшей конфигурации в config.h .

4. в этом случае может быть полезенавтозапуск .

Ответ №2:

 dnl -------------------------------------------------------------------  
dnl check if libmqmsgque.la was build with libconfig
                                                                        
dnl # 1. add include directory
CPPFLAGS="-I$abs_builddir/../../.. $CPPFLAGS"

AC_MSG_CHECKING([for NHI1 'HAVE_LIBCONFIG' in 'msgque_config.h'])

dnl # 2. compile and run small program with failure on not found
AC_RUN_IFELSE([
  AC_LANG_PROGRAM([#include "msgque_config.h"], [                                                                               
    #ifdef HAVE_LIBCONFIG  
      return 0;  
    #else
      return 1;                                                                                                                 
    #endif  
  ])   
],[    
  AC_MSG_RESULT([found])
  AC_DEFINE(HAVE_LIBCONFIG,[1],[libmqmsgque was build with libconfig])  
],[
  AC_MSG_RESULT([not found])  
])