第1章 初めてLinux/UNIX系OSにふれる
エンジニアのための最初の一歩(10)

開発環境(3)

 

1.3開発環境(その3)

autoconf(その2)

configureの作成

 autoconfは,m4注7マクロプロセッサを使ってconfigure.inからconfigureスクリプトを作成します.configure.inには,作成するパッケージが必要としている機能をテストするマクロを順次呼び出す形で記述します.

 実際にどのようにconfigureが作られるのかについて,CD-ROMのイメージファイルを作成するツールであるmkisofsパッケージを例に説明します.
 まず初めに,configure.inを作成します.mkisofsのconfigure.inをリスト1に示します.

(リスト1)mkisofsパッケージのconfigure.in

 

dnlで始まる行はコメント

dnl $Id: configure.in,v 1.5 1997/12/15 12:47:57 eric Exp $

dnl   Process this file with autoconf to produce a configure script.

AC_INIT(mkisofs.c) 

 このパッケージがmkisofsであることを特定するファイル名を指定する

AC_CONFIG_HEADER(config.h) 

 configureが生成するCプリプロセッサのシンボル.パッケージの全ファイルがインクルードされる

AC_PROG_CC 使用するCコンパイラを決定

AC_CONST Cコンパイラがconstをサポートしているかをチェック

AC_HEADER_MAJOR ‘major’, ‘minor’, and ‘makedev’のチェック

AC_HEADER_DIRENT 

 ディレクトリライブラリ関連のへッダファイルのチェック  

if test -z "$ac_header_dirent"; then

AC_DEFINE(NODIR) プリプロセッサマクロ NODIR を 1にする

fi

AC_CHECK_FUNCS(memmove sbrk strdup)

AC_CHECK_HEADERS(sys/mkdev.h sys/sysmacros.h malloc.h termios.h sys/types.h)

AC_CHECK_HEADERS(unistd.h string.h strings.h sys/stat.h sys/fcntl.h)

 libcの関数,インクルードファイルをチェック

AC_PROG_INSTALL   installプログラムをチェック

AC_OUTPUT(Makefile diag/Makefile) configureが作成するファイル

 次に,リスト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 
日樫 英孝/増田 佳泰/山岡 賢一/船木 陸議/ 羅 正華/森 友一朗/祐安 重夫/岩田 孝清/海老原 祐太郎/g新部 裕/ 齊藤 正伸

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.