autoconf のマニュアルによると、これを行う正しい方法は への--enable-FEATURE
引数を使用することconfigure
です。これは、マクロを使用して行われAC_ARG_ENABLE
ます。への 4 つの引数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 @<:@check@:>@])],
[:],
[enable_gui=check])
AS_HELP_STRING
はヘルプ文字列を適切にラップし、 および はおよび@<:@
の出力に展開さ@:>@
れる四角形です。空の ,を指定しましたが、 or ( のエイリアス) が渡されたかどうかに応じて、orに設定されます。[
]
./configure --help
ACTION-IF-GIVEN
configure
enable_gui
yes
no
--enable-gui
--disable-gui
--enable-gui=no
したがって、シェル変数は、またはの$enable_gui
いずれかになります。これは、チェックだけに基づいてオプションのサポートを構築するのは不適切な形式と見なされているため、配布パッケージを作成する貧弱なパッケージャーの利益のためです。automagic dependenciesに関する gentoo の記事を参照してください。ただし、パッケージ作成者は、必要な機能を黙って含めないよりも、ビルドが失敗することを好むでしょう。yes
no
check
ここで、$enable_gui
がyes
またはcheck
の場合、依存関係をチェックし、機能を手動で有効にした場合は失敗します。あなたの GUI が依存しているライブラリがわからないのでpkg-config
、gtk+-2.0
. PKG_CHECK_MODULES
(パッケージによって提供される)への 4 つの引数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
使用する理由は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