AC_ARG_ENABLEではまった
初歩的な話ですが、automake, autoconf, libtoolを使ってconfigureのオプションを追加したときがあります。
具体的には./configureに対して、./configure –enable-hogeなど、環境によってオプションを追加したりします。
で、簡単な事なんだけど、小一時間はまったのでメモっておきます。
前提知識
autoconfでenableオプションを有効にするには以下の、マクロの知識が必要となります。
あと、libtoolなどの細かい説明はここでは割愛させていただきます。
AC_ARG_ENABLE(feature, help-text, [if-given], [if-not-given])
configureが受け取る追加のパッケージオプション(たとえば–enable-zlibなど)を指定することができる。アクションシェルコードは、シェル変数enablevalに設定されているすのオプションへの任意の引数にアクセスできる。たとえば–enable-buffers=128を使用すると、configureがenablevalを128に設定する。
AM_CONDITIONAL(name, testcode)
第一引数は条件の名前で、もう1つはその条件の真偽を判定するために使われるシェルステートメント。シェルコードtestcodeが成功(0)の状態を返す場合は、条件は真になる。configure.in内の条件は、自動的にそのプロジェクト内のどのMakefile.amでも使用可能になる。
configure.inの設定
この二つのマクロを使って、enableオプションを設定します。
いろいろ方法はあると思いますが、そして、この方法が一般的であるかどうかは一切保障がないのですが、僕は以下の方法で追加しています。
たとえば、fcgiというCGIのプログラムがあるのですが、通常の環境ではこれを使わず普通のCGIを使う、fcgiが入っている環境ではfcgiを有効にしたい。ということがあるとしますね。
そんなときはまず、configure.inに以下のような記述を書きます。
AC_ARG_ENABLE(fcgi, ## 1
AS_HELP_STRING([--enable-fcgi], [build with fcgi]), ## 2
enable_fcgi="$enableval", ## 3
enable_fcgi="no" ## 4
)
AM_CONDITIONAL(ENABLE_FCGI, test "$enable_fcgi" = "yes") ## 5
- ##1のfcgiの部分、このオプションの名前となります。具体的には./configure-xxxのxxx部分の名前となります。
- ##2 は./configure –helpをしたときのヘルプメッセージとなります。同じ書式で書けばOKです。
- ##3 enableの時の処理です。enableオプションにしたときには$enable_fcgiはyesが代入されているので、enable_fcgiにyesが代入されます。
- ##4 はenableにしていないときの処理です、つまり、enable_fcgiがnoになります。
- ##5 はtestコマンドを使って、enable_fcgiがyesなら、ENABLE_FCGI、を有効にするという設定です。(テストコマンドについてはここらへんを参照してください)
Makefile.amの設定
Makefile.amには以下のようにして、条件分岐を作ってあげます。
./configure –enable-fcgiであれば、bin_PROGRAMSにhoge.fcgiというfcgiをinlucdeしたプログラムをビルドする、といった仕組みの場合です。
bin_PROGRAMS = main_prog
if ENABLE_INTERFACE
bin_PROGRAMS += hoge.fcgi
endif
if ENABLE_INTERFACE
hoge_fcgi_CPPFLAGS = -Wall
hoge_fcgi_LDFLAGS = -lfcgi
hoge_fcgi_SOURCES = hoge.cpp
endif
簡単ではありますが、こんな感じでうまくいくと思います。
間違いなどがありましたらぜひご連絡くださいー。