Согласно 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