次: , 前: Writing Test Programs, 上: Writing Tests


6.3 プリプロセッサの実行

いくつかのソースファイルでプリプロセッサを実行する必要があるときもありま す.通常はプロジェクトをコンパイルする必要があり,プリプロセッサ を実行する必要があることは滅多に無いので,そうすることは,普通は悪 い考えです.そのため,きっとプリプロセッサではなくコンパイラを実行した いと思うでしょう.安易な道をたどる誘惑に逆らってください.

それにもかかわらず,プリプロセッサを実行する必要がある場合, AC_PREPROC_IFELSEを使用してください.

— マクロ: AC_PREPROC_IFELSE (input, [action-if-true], [action-if-false])

inputで現在の言語(see Language Choice)のプリプロセッサを実行し, 成功したらシェルコマンドaction-if-trueを実行し,そうでなければ action-if-falseを実行します.inputAC_LANG_PROGRAMと その仲間で作成することが可能です.

このマクロはCPPFLAGSを使用しますが,-g-Oなど は多くのCプリプロセッサで有効なオプションではないので,CFLAGS は 使用しません.

予期せぬ異常終了は,通常AC_MSG_FAILUREで報告します.

例えば以下のようにします.

     AC_INIT(Autoconf Documentation, 2.59, bug-autoconf@gnu.org)
     AC_DEFINE([HELLO_WORLD], ["Hello, World\n"])
     AC_PREPROC_IFELSE(
        [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
                         [[fputs (hw, stdout);]])],
        [AC_MSG_RESULT([OK])],
        [AC_MSG_FAILURE([unexpected preprocessor failure])])

結果は以下のようになります.

     checking for gcc... gcc
     checking for C compiler default output... a.out
     checking whether the C compiler works... yes
     checking whether we are cross compiling... no
     checking for suffix of executables...
     checking for suffix of object files... o
     checking whether we are using the GNU C compiler... yes
     checking whether gcc accepts -g... yes
     checking for gcc option to accept ANSI C... none needed
     checking how to run the C preprocessor... gcc -E
     OK

マクロAC_TRY_CPP(see Obsolete Macros)は, AC_PREPROC_IFELSEの役目を果たすために使用されていましたが,その引 数を二重の引用符で囲んでいるので,精巧なソースで使用することが不可能でし た.マクロAC_TRY_CPPAC_PREPROC_IFELSEをような古い使い方 を取り除くことも推奨しますが,最初にコンパイラではなくプリプロセッ サを実行する必要があるのかを確かめることを推奨します.
— マクロ: AC_EGREP_HEADER (pattern, header-file, action-if-found, [action-if-not-found])

システムヘッダファイルheader-fileでのプリプロセッサの実行での出力 が拡張正規表現のpatternにマッチする場合,シェルコマンド action-if-foundを実行し,それ以外ではaction-if-not-foundを実 行します.

— マクロ: AC_EGREP_CPP (pattern, program, [action-if-found], [action-if-not-found])

programがCやC++プログラムのテキストで,そのなかではシェル変数,バッ ククオート,そしてバックスラッシュの代入が実行されたものになっています. programでのプリプロセッサの実行での出力が拡張正規表現の patternにマッチする場合,シェルコマンドaction-if-foundを実行 し,それ以外ではaction-if-not-foundを実行します.