2012-08-10 3 views
3

У меня есть проект autotools. Я хочу исключить некоторые файлы из проекта, если пользователь настраивает его во время сборки. Например, если сборка настроена с помощью -no-gui, файлы, связанные с GUI, не должны включаться в сборку.Как условно компилировать в проекте autotools?

  1. Что такое стандартный макрос для такого флага в autoconf? Что-то, что можно настроить с помощью --disable-gui?

  2. Как установить связь между этой опцией configure и automake входными файлами?

У меня есть вводная книга Calcote Autotools здесь. Если вы можете указать указатели на вовлеченные макросы, я могу найти их в книге или в сети.

Спасибо,

Elan.

ответ

12

Согласно the autoconf manual, правильный способ сделать это с аргументом --enable-FEATURE до configure. Это делается с использованием макроса AC_ARG_ENABLE. Четыре аргумента в отношении AC_ARG_ENABLE приведены в заказе, FEATURE, HELP-STRING, ACTION-IF-GIVEN, ACTION-IF-NOT-GIVEN. Таким образом, в configure.ac:

AC_ARG_ENABLE([gui], 
    [AS_HELP_STRING([--disable-gui], [Enable GUI support @<:@[email protected]:>@])], 
    [:], 
    [enable_gui=check]) 

AS_HELP_STRING обертывания строки помощи красиво и @<:@ и @:>@ являются quadrigraphs которые расширяются до [ и ] на выходе ./configure --help. Даже если я указал пустой ACTION-IF-GIVEN, configure будет еще множество enable_gui к yes или no, в зависимости от того, был ли принят --enable-gui или --disable-gui (который является псевдонимом для --enable-gui=no).

Таким образом, переменная оболочки $enable_gui будет либо yes, no, либо check. Это полезно для плохих упаковщиков, которые делают дистрибутивные пакеты, так как считается, что это плохая форма для создания дополнительной поддержки, основанной только на проверке. См. Статью gentoo о automagic dependencies, но упаковщики предпочли бы, чтобы сборка завершилась неудачей, чем молчание, не включив требуемую функцию.

Теперь, если $enable_gui - yes или check, мы хотим проверить зависимости и сбой, если мы включили эту функцию вручную. Поскольку я не знаю, от какой библиотеки зависит ваш gui, я просто собираюсь использовать pkg-config, чтобы проверить gtk+-2.0. Четыре аргумента в PKG_CHECK_MODULES (предоставленные pkg-config пакета), в порядке, VARIABLE, MODULES, ACTION-IF-FOUND и ACTION-IF-NOT-FOUND:

AS_IF([test "$enable_gui" != "no"], 
    [PKG_CHECK_MODULES([GTK], 
    [gtk+-2.0], 
    [enable_gui=yes], 
    [AS_IF([test "$enable_gui" = "yes"], 
     [AC_MSG_ERROR([gtk+-2.0 required, but not found.])], 
     [enable_gui=no])])]) 

Причина мы используем AS_IF вместо того, чтобы просто писать нормальную оболочку if -expression так, что autoconf расширяет все, что может потребоваться вложенный макрос (здесь PKG_CHECK_MODULES зависит от макросов, таких как PKG_PROG_PKG_CONFIG). Вы можете проверить, что это делает правильные вещи во всех случаях, делая что-то вроде ./configure --enable-gui PKG_CONFIG=/bin/false.

В любом случае, мы решили, что enable_gui=check в enable_gui=yes или enable_gui=no. Теперь мы должны передать это automake. Используемый макрос - AM_CONDITIONAL. Его аргументы, для того, CONDITIONAL (название, используемое в Makefile.am) и CONDITION (тест оболочки установить CONDITIONAL):

AM_CONDITIONAL([ENABLE_GUI], [test "$enable_gui" = "yes"]) 

Теперь мы переходим к Makefile.am, я буду считать простую программу с несколькими дополнительными источниками:

# You probably have something real for these. 
AM_CFLAGS = 
LDADD = 

bin_PROGRAMS = elanprog 
elanprog_SOURCES = elanprog.c elanfile.c 

if ENABLE_GUI 
AM_CFLAGS += $(GTK_CFLAGS) 
LDADD += $(GTK_LIBS) 
elanprog_SOURCES += elangui.c 
endif 

 Смежные вопросы

  • Нет связанных вопросов^_^