configure.acの修正

autoscanツールで生成したconfigure.scan(ac)の雛形をアプリケーションに対応させるよう修正していきます。まずconfigure.acに必須のマクロ定義からみていきます。

AC_INIT

AC_INITマクロはconfigure.acでは必須のマクロです。アプリケーションの名称・バージョン・バグレポートの送信先メールアドレス・tarアーカイブ名を指定します。当コンテンツのサンプルではtarアーカイブ名称は省略してます。

AC_INIT([sample],[1.0.0],[bugs@example.com])

ここでの指定した内容は、configureスクリプトによって下記のプリプロセッサとして展開されます。

例えばアプリケーションで次のコード実装をしておけばバージョンを表示することができます。

if (argc == 2 && strcmp(argv[1],"--version")==0)
{
#ifdef PACKAGE_STRING
  cout << PACKAGE_STRING << end;
#else
  cout "sorry. version unknown." << endl;
#endif
  exit(0);
}

AC_CONFIG_FILES

AC_CONFIG_FILESもconfigure.acの必須マクロですが、自動生成されていませんので手動で追加します。このマクロではconfigureマクロに生成させるファイルを指定します。多くの場合、makefileの作成を指示することになると思います。

本コンテンツのサンプルでは、カレントディレクトリにアプリケーション本体用のmakefileを作成するよう指定します。(アプリケーション用ライブラリとしてlibcsvも作成しますがそれについては後述しますのでここでは本体のみのmakefile作成だけを指定します。)

AC_CONFIG_FILES([makefile])

AC_OUTPUT

このマクロはconfigure.acの最後に配置します。特に引数はありません。configureの生成すべきファイル(ここでは、AC_CONFIG_FILESで指定したmakefile)をこのマクロが生成します。

その他自動生成されたマクロ

その他autoscanによって自動生成されたマクロについて簡単に説明します。

AC_PREREQ
このconfigure.acを処理できるautoconfのバージョンを指定します。ここで指定したバージョン以下のautoconfを使用するとエラーとなります。configure.acの先頭に記述します。
AC_CONFIG_SRCDIR
パッケージに含まれるソースファイルをひとつだけ指定します。プログラムソースをオブジェクトファイル(*.o)とは別のディレクトリに配置している場合などに指定します。ここで指定したファイルが存在するディレクトリをconfugureスクリプトはソースファイルの配置場所とみなします。本、サンプルのようにカレントディレクトリにプログラムソースを配置する場合でも指定しておくほうが良いと思います。
AC_CONFIG_HEADER
プリプロセッサマクロ定義ヘッダを作成するマクロ。このマクロは第1引数で指定されたヘッダテンプレートを元にプリプロセッサ定義ヘッダを生成します。
AC_PROG_CXX
C++コンパイラを調べるマクロ。環境変数CXXを調べます。環境変数CXXが設定されていなければc++,g++,gccの順でコンパイラを検索します。
AC_PROG_CC
Cコンパイラを調べるマクロ。環境変数CCを調べます。環境変数CCが設定されていなければgccを設定します。
AC_HEADER_STDBOOL
ANSI-C準拠のヘッダファイルが存在するか否かをチェックするマクロです。存在する場合はSTDC_HEADERSが定義されます。
AC_C_CONST
コンパイラがANSI-C constをサポートとするか否かをチェックするマクロです。

サンプルパッケージをautoscanした結果出力されたconfigure.scan(ac)はこれだけでした。これくらいであれば手動で記述してもかまわないように感じますがアプリケーションパッケージが大きくなればなるほどautoscanは有用なツールとなると思います。

autoheader/config.h

ところで上のversionを表示するサンプルコードはPACKAGE_STRINGというプリプロセッサマクロを使用して実装されているわけですが、この定義を行っているのがAC_CONFIG_HEADERマクロです。このマクロはconfigu.h.inというヘッダテンプレートをもとにconfig.hというファイルを生成します。このヘッダには、configureスクリプトで定義されたプリプロセッサやチェック結果などが反映されておりプログラムはこのヘッダをincludeすることでconfigureスクリプトの実行結果を参照することができるわけです。したがってconfigureの結果をハンドルしてなにか操作をしたい場合はプログラムにこのヘッダをincludeする必要があります。

ところで、このconfig.hをconfigureスクリプトが作成するにはテンプレートファイルが必要となるわけですが、このテンプレートを生成するのがautoheaderツールです。このツールは編集したconfigure.acをスキャンし必要なプリプロセッサマクロをヘッダテンプレートとして作成します。したがってこのツールを使えば必要なマクロ定義を意識することはあまりないと言えます。