Autoconf/configureスクリプトを使ってアプリケーションの設定を自動化
みなさん、こんにちは、
kaoruです。
はじめに
UNIX環境でアプリケーションをインストールしたことがある方には、次のコマンドはおなじみだと思います。
./configure make make install
これらのコマンドは通常はC/C++で書かれたアプリケーションで利用されることが多いのですが、PHPやPythonなど、スクリプト言語で書かれたアプリケーションであっても利用価値があります。
とはいえ、スクリプト言語の開発者にはあまり馴染みがないと思いますので、簡単に紹介をしたいと思います。
Autoconf/configureスクリプトを利用するメリット
よくある設定ファイルを直接書き換えるような方法だと、書き換えた設定ファイルをバージョン管理システムに登録できないので、困ってしまいます。環境ごとに設定ファイルを複数用意して、全部バージョン管理するような方法だと、一箇所を修正すると全部のファイルを忘れずに修正しないといけなくなります。
また、設定ファイルに誤りがあっても、すぐにはわからないという問題があります。configureスクリプトはシェルスクリプトですから、どんな方法のエラーチェックも可能です。
configureスクリプトとは
configureスクリプトの役割はテンプレートとなるテキストファイルを入力として、文字列置換を行い、出力となるファイルを書き出すことです。よくある入力ファイルはMakefile.inで、出力ファイルはMakefileなのですが、ここでは、config.iniというスクリプト言語用の設定ファイルを出力することを考えてみましょう。
テンプレートファイルの書き方
出力したいファイルのファイル名の末尾に「.in」をつけたファイル名を用意します。
置き換えたい場所に、@変数名@というプレースホルダーの記述をします。ここでいう変数名はシェルの変数名で、configureスクリプトから渡されます。
configure.acの書き方
こちらは、autoconfのマニュアルを見てほしいのですが、ポイントとしてはAC_SUBSTというマクロを使うことで、先ほどのテンプレートファイルで指定したプレースホルダーの記述を置換することができます。
configureスクリプトの生成方法
シェルのプロンプトから
autoreconf
と入力するだけで、configure.acからconfigureスクリプトが生成されます。
configureスクリプトの使い方
./configure –help とすると、おなじみのヘルプが表示されます。
サンプル
config/config.ini.in
BASE_DIR = @abs_srcdir@ MASTER_DB = @MASTER_DB@ SLAVE_DB = @SLAVE_DB@ IMAGE_DIR = @IMAGE_DIR@
configure.ac
AC_PREREQ(2.59) AC_INIT(MyProject, 1.00) AC_CONFIG_SRCDIR([config/config.ini.in]) AC_ARG_ENABLE( [image-dir], AS_HELP_STRING([--enable-image-dir=ARG], [画像ファイルの置き場所]), [IMAGE_DIR=$enableval], [IMAGE_DIR=$prefix/htdocs/image] ) AC_SUBST(IMAGE_DIR) AC_ARG_ENABLE( [master-db], AS_HELP_STRING([--enable-master-db=ARG], [マスターDBのDSN]), [MASTER_DB=$enableval], [MASTER_DB=] ) AC_SUBST(MASTER_DB) AC_ARG_ENABLE( [slave-db], AS_HELP_STRING([--enable-slave-db=ARG], [スレイブDBのDSN]), [SLAVE_DB=$enableval], [SLAVE_DB=] ) AC_SUBST(SLAVE_DB) AC_CONFIG_FILES([config/config.ini]) AC_OUTPUT
サンプルの実行例
autoreconf
./configure --enable-image-dir=/home/test/image --enable-master-db="mysql:host=master-db01.sample port=3306 user=web_user" --enable-slave-db="mysql:slave-db01.sample port=3306 user=web_user"
次のようなメッセージが表示されます。
configure: creating ./config.status config.status: creating config/config.ini
config/config.ini が生成されているはずなので、確認してみてください。