configureでいろいろ設定する
autotoolsのちょっとしたまとめを書く
autotoolsの導入
全く初めての状態からの導入は以下の記事から
Autoconf, Automakeを使う - なんとな~くしあわせ?の日記
ライセンスについては以下から
autoconfのライセンス考察 - なんとな~くしあわせ?の日記
autotoolsテクニック編
まずちょっとしたトリビア
- configureおよびMakefile.amに見られる接頭辞は、そのその関数がどの部位で使われているか示している
- AC_INIT、AC_SUBSTなどはAutoconf
- AM_CONDITIONAL、AM_SILENT_RULESなどはAutomake
C言語で書かれたライブラリの有無チェック
AC_CHECK_LIBを使う
Libraries - Autoconf
AC_CHECK_LIB(ライブラリの名前,関数名,ライブラリが有る場合の処理,ライブラリが無い場合の処理)
AC_CHECK_LIB(z,gzclose,LIBS="-lz $LIBS" has_zlib=1,has_zlib=0) if test $has_zlib = 0; then AC_MSG_ERROR("ERROR: cannot find zlib.") fi
C++言語で書かれたライブラリの有無チェック
AC_TRY_LINKとAC_LANG_PUSH、AC_LANG_POPを使う
実はAC_CHECK_LIBではC++のライブラリの関数チェックが出来ないので以下のようにしてみる。AC_LANG_PUSH/POPを行うと、その間のコンパイルチェックをC++でやってくれる。
AC_MSG_CHECKING([for some_cpp_lib]) AC_LANG_PUSH(C++) SAVE_LIBS="$LIBS" LIBS="$LIBS -lsome_cpp_lib" AC_TRY_LINK([#include <some_cpp_lib.hpp>], [SomeCppLib object;], has_some_cpp_lib=1, has_some_cpp_lib=0) AC_LANG_POP(C++) if test $has_some_cpp_lib = 0; then AC_MSG_RESULT([no]) else AC_MSG_RESULT([yes]) fi
boolean値をconfigureの中で使用する
AM_CONDITIONALを使う
AM_CONDITIONAL(THIS_IS_IT, false)
上記のようにすれば、THIS_IS_ITの変数にfalseが入る。これの使いドコロは、上記の変数がMakefile.amで使用できる点だ。
# trueならバイナリは foo/barをビルド if THIS_IS_IT noinst_PROGRAMS = foo bar else # falseならバイナリは fooをビルド noinst_PROGRAMS = foo endif
ちなみにAutomakeではshellのようなif ~ else ~ fiは使えない。あくまでMakefileなので…if else endifで頑張ってください。
もっと色々やりたい
- ぶっちゃけconfigure.ac上にシェルのコマンドを書いても大丈夫です。でもちょっとかっこ悪い。
行儀よく色々やりたい
- m4の世界へ行きましょう(行きたくない)。文字列操作とかいろいろ出来るみたいです。
Programming in M4sugar - Autoconf
- 先人が作ったマクロを使いましょう
Autoconf Macro Archive - Documentation - introduction.htm
おすすめはAX_CXX_COMPILE_STDCXX_11、C++11のフラグを自動でチェックして入れてくれる。