なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

configureでいろいろ設定する

autotoolsのちょっとしたまとめを書く

autotoolsの導入

全く初めての状態からの導入は以下の記事から

Autoconf, Automakeを使う - なんとな~くしあわせ?の日記

ライセンスについては以下から

autoconfのライセンス考察 - なんとな~くしあわせ?の日記

autotoolsテクニック編

まずちょっとしたトリビア
  • configureおよびMakefile.amに見られる接頭辞は、そのその関数がどの部位で使われているか示している
  1. AC_INIT、AC_SUBSTなどはAutoconf
  2. 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で頑張ってください。

動的リンクライブラリをクロスプラットフォームでビルドする

libtoolと連携します、以下の二行を追加してなんやかんやすればできます。

AC_LIBTOOL_WIN32_DLL
LT_INIT
もっと色々やりたい
  • ぶっちゃけconfigure.ac上にシェルのコマンドを書いても大丈夫です。でもちょっとかっこ悪い。
行儀よく色々やりたい
  • m4の世界へ行きましょう(行きたくない)。文字列操作とかいろいろ出来るみたいです。


Programming in M4sugar - Autoconf

  • 先人が作ったマクロを使いましょう

Autoconf Macro Archive - Documentation - introduction.htm

おすすめはAX_CXX_COMPILE_STDCXX_11C++11のフラグを自動でチェックして入れてくれる。