1.3開発環境(その3) autoconf(その2) configureの作成 autoconfは,m4注7マクロプロセッサを使ってconfigure.inからconfigureスクリプトを作成します.configure.inには,作成するパッケージが必要としている機能をテストするマクロを順次呼び出す形で記述します. 実際にどのようにconfigureが作られるのかについて,CD-ROMのイメージファイルを作成するツールであるmkisofsパッケージを例に説明します.
次に,リスト1の処理の内容を説明します. まず,AC_CONFIG_HEADERを使ってconfig.hにプリプロセッサ用のシンボルを出力するよう指定されています.したがって,mkisofsのすべてのソースコードは,config.hをインクルードしなければなりません. AC_CONFIG_HEADER以下の行は,各機能のチェックです.autoconfには,すでに200以上のチェック用マクロが用意されています.これらのマクロは通常,“/usr/share/autoconf/”にあります.これらを使って,configure.inの中にチェックしたい機能を記述します. もし,すでに用意されたマクロでは不十分な場合,m4を使ってaclocal.m4またはacsite.m4に記述します.xemacsではシェアードライブラリに関するフラグなどをaclocal.m4に記述しています. mkisofsでは新たにマクロを追加していないので,aclocal.m4はありません.AC_CONFIG_HEADERを使ってconfig.hにプリプロセッサ用のシンボルを出力するよう指定されています. 次に,acconfig.hを作成します.acconfig.hには,configure.inで追加したプリプロセッサ用のシンボル(ここではNODIRだけ)を定義します.ただし,configure.inの中でプリプロセッサ用のシンボルを定義していなければacconfig.hは必要ありません. これで準備ができましたので,autoconfを実行してconfigureを作成し,autoheaderでconfig.h.inを作成します.autoheaderは,configure.inとacconfig.hをスキャンして必要なシンボルを見つけ,config.h.inへ出力します.このconfig.h.inは,configureを実行する際のテンプレートになります. これらのシンボルがどのように定義されるかを見てみます.たとえば,ソースコードのtree.cの中には,以下のようなディレクティブがあります. # ifndef HAVE_MEMMOVE # define memmove(d,s,n)bcopy((s),(d),(n)) # endif memmoveの関数がない場合には,代わりにbcopyを使うようになっています.プリプロセッサのシンボルはHAVE_MEMMOVEになっています.configure.inでは,AC_CHECK_FUNCSでmemmoveという関数をチェックするように指定しているので,作成されたconfigureではmemmove関数をチェックします. configureはmemmoveを使ったテスト用のCプログラムを作成・コンパイルして,本当にmemmoveが存在するかをチェックします.ここで存在していれば,HAVE_MEMMOVEをconfig.hの中で#defineします.config.hはtree.cでインクルードされていますから,HAVE_MEMMOVEの結果はtree.cに反映されます. もし,AC_CONFIG_HEADERを使わなければ,作成したconfigure.inだけからconfigureを生成することができます.AC_CONFIG_HEADERを使わない場合はプリプロセッサ用のシンボル,たとえばHAVE_MEMMOVEは-DHAVE_MEMMOVEという引き数の形でコンパイラに渡されます.テストする機能が多い場合にはコンパイラの引き数は長大になり,場合によってはOSのコマンドラインの長さの制限にかかってしまいます. そこで,通常はAC_CONFIG_HEADERを使ってヘッダファイルにシンボルを定義し,これを各プログラムでインクルードします.普通はconfig.hという名前を使い,すべてのソースファイルでconfig.hをインクルードします. 注:7 国と言語,文字コードなどの設定をまとめたデータ.m4は,Macro processor for UNIX.標準的なマクロプロセッサ Copyright 2000 |
|
Copyright 1997-2001 CQ Publishing Co.,Ltd.