いくつかのソースファイルでプリプロセッサを実行する必要があるときもありま す.通常はプロジェクトをコンパイルする必要があり,プリプロセッサ を実行する必要があることは滅多に無いので,そうすることは,普通は悪 い考えです.そのため,きっとプリプロセッサではなくコンパイラを実行した いと思うでしょう.安易な道をたどる誘惑に逆らってください.
それにもかかわらず,プリプロセッサを実行する必要がある場合,
AC_PREPROC_IFELSEを使用してください.
inputで現在の言語(see Language Choice)のプリプロセッサを実行し, 成功したらシェルコマンドaction-if-trueを実行し,そうでなければ action-if-falseを実行します.inputは
AC_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_CPPのAC_PREPROC_IFELSEをような古い使い方
を取り除くことも推奨しますが,最初にコンパイラではなくプリプロセッ
サを実行する必要があるのかを確かめることを推奨します.