アプリケーション用のconfigure.ac

いよいよアプリケーション固有の設定をおこないます。冒頭記したように、本コンテンツのサンプルアプリケーションはcsvファイルを扱うライブラリ(libcsv)およびMySQL用クライアントライブラリを使用するアプリケーションです。したがってアプリケーションのビルドには両ライブラリ本体と(あれば)ライブラリ用ヘッダファイルが必要となります。

MySQLヘッダ・ライブラリのようにシステムによって異なるパスにインストールされているリソースを参照する必要があるケースでは、configureスクリプトであらかじめその存在等をチェックしておくことでmakefileを適切に生成することができるようになります。

ここでは、アプリケーションが参照する外部ライブラリ用のヘッダ

の格納パス(とその存在)を確認し、makefileが参照するヘッダファイルとライブラリのサーチパスを設定します。標準以外に置かれたヘッダファイルやライブラリは明示的にサーチパスに追加しないとエラーとなりますから、あらかじめmakefileにサーチパスを追加するため、configureスクリプトで調べておくわけです。

MySQLのインストール確認

外部パッケージを使用する場合のチェックはオプション--with-package[=value]を使用します。configure.acではAC_ARG_WITHマクロを使用してこのオプションを制御します。

AC_ARG_WITH(パッケージ名,[ヘルプ記述],
  [指定があるときの処理],[指定がないときの処理])

オプションに与える[=value]は$withvalで参照できます。多くの場合外部パッケージのインストール先などを指定しますが、任意の値を要求することができます。[=value]を省略した場合は--with-*****の場合はyes、--without-*****の場合はnoがデフォルトとなります。

サンプルアプリケーションではmysql.hヘッダファイルおよびmysqlライブラリ検索のため、--with-mysql[=path to mysql_config]を指定するものとします。(mysqlに付属するmysql_configスクリプトを利用してインクルードパスとライブラリを取得します)

AC_ARG_WITH([mysql],
  AC_HELP_STRING(
    [--with-mysqll@<:@=PATH@:>@],[PATH is path to 'mysql_config']),
  [WITH_MYSQL=$withval],[WITH_MYSQL=yes])

最初にAC_ARG_WITHマクロで、オプション指定の値を取得しWITH_MYSQL変数にセットします。--with-mysqlオプションそのものが指定されなかった場合や=valueが省力された場合はWITH_MYSQL変数にはyesを指定します。

if test "$WITH_MYSQL" = "yes"; then
  AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
else
  MYSQL_CONFIG=$WITH_MYSQL
fi

次に、configureオプションに--with-mysql[=value]オプションが与えられたかをチェックします。サンプルアプリケーションではMySQLが必須ですのでオプションがなければエラーとしてconfigureスクリプトを終了します。valueが省略された場合(WITH_MYSQL変数が'yes')はAC_PATH_PROGマクロでmysql_configのパスを検索しMYSQL_CONFIG変数にセットします。valueが明示的に指定された場合はその値をMYSQL_CONFIG変数にセットします。

ここで、使用しているAC_PATH_PROGマクロは第二引数に指定したモジュールが存在するか否かを調べ、存在すればそのパスを返すマクロです。書式は

AC_PATH_PROG(変数,プログラム,[見つからなかった時の処理],[検索パス])

で、今回の例では第三・第四パラメータは省略しています。この設定では、configure時に--with-mysqlオプションを省略した場合はmysql_configをデフォルトの検索パスから検出します。

MYSQL_INCLUDE="`$MYSQL_CONFIG --include`"
MYSQL_LIBS="`$MYSQL_CONFIG --libs`"
if ! test "$MYSQL_INCLUDE" || ! test "$MYSQL_LIBS"; then
  AC_MSG_ERROR(mysql_config not exists or not executable, use --with-mysql=path-to-mysql_config)
fi

最後に、mysql_configスクリプトを実行してMySQLヘッダファイルのパスとMySQLライブラリの配置パスを取得しそれぞれMYSQL_INCLUDE/MYSQL_LIBS変数にセットします。

libcsv用ヘッダファイルの確認

サンプルライブラリlibcsvは静的ライブラリとしてリンクしますので、ヘッダおよびアーカイブlibcsv.aはシステムにはインストールされずパッケージに同梱されています。ですのでここでのチェックはヘッダファイルが同梱されているか否かのチェックということになります。(本来、パッケージアーカイブに同梱されて配布されるのですから、このようなチェックは必要ないともいえます。が....そこはサンプルですのでご容赦ください。)

LIBCSV=`find . -name 'ccvs.h' -print | sed 's/\/ccsv\.h$//'`
if ! test "$LIBCSV"; then
  AC_MSG_ERROR([ccsv.h not found]))
fi

独自のm4マクロを定義することもできますが、通常のシェルスクリプトを書いてチェックすることもできます。ここでは、カレント以下ccsv.hファイルを検索し見つかったヘッダファイルのディレクトリを取り出しています。ヘッダが見つからない場合エラーメッセージを出力しスクリプトを終了するマクロを実行します。これで、ソースパッケージに間違いなくccsv.hが含まれていることを確認し、その格納パスを取得できました。

AC_SUBSTマクロの実行

ここまでで、ccsv.hとmysql.hの配置パスおよびmysqlのライブラリとその格納位置を確定できました。ただし、ここで取得した値はあくまでもconfigureスクリプト内でのみ有効な変数であり、このままでは実際のmakefileでは反映できません。これらの値をmakefileへ反映可能とするためにはAC_SUBSTマクロを使います。

AC_SUBST(LIBCSV)
AC_SUBST(MYSQL_INCLUDE)
AC_SUBST(MYSQL_LIBS)

これで外部参照が可能になります。後は、makefile.am(makefile.in)で@LIBCSV@のように記述することでconfigureスクリプトが自動的にこの値を置換してくれます。この部分に関してはmakefile.amを生成するところで確認します。

AC_CHECK_HEADER/AC_CHECK_LIB

標準的なGNUのパス(/usr/local/include,/usr/local/lib)にインストールされたパッケージのヘッダやライブラリの存在有無をチェックするにはAC_CHECK_HEADER/AC_CHECK_LIBマクロを使います。仮に、今回のサンプルで使用するlibcsvが/usr/local/include、/usr/local/libにインストールされている場合、

AC_CHECK_HEADER([ccsv.h],,AC_MSG_ERROR([ccsv.h not found]))
AC_CHECK_LIB([csv],[getline],,AC_MSG_ERROR(libcsv not found))

というように指定できます。標準以外のパスにインストールされている場合でもconfigure時に--includedir=DIRや--libdir=DIRを使用することで対処もできますが異なるパスにインストールされた複数のヘッダやライブラリのチェックはできませんのでその場合は独自のチェックをおこなうことになります。

本サンプルでもlibcsvはパッケージに同梱されるためAC_CHECK_HEADERマクロを使用せず独自のチェックをおこないます。