Next: Running the Compiler, Previous: Writing Test Programs, Up: Writing Tests
Sometimes one might need to run the preprocessor on some source file. Usually it is a bad idea, as you typically need to compile your project, not merely run the preprocessor on it; therefore you certainly want to run the compiler, not the preprocessor. Resist the temptation of following the easiest path.
Nevertheless, if you need to run the preprocessor, then use
AC_PREPROC_IFELSE.
Run the preprocessor of the current language (see Language Choice) on the input, run the shell commands action-if-true on success, action-if-false otherwise. The input can be made by
AC_LANG_PROGRAMand friends.This macro uses
CPPFLAGS, but notCFLAGS, because -g, -O, etc. are not valid options to many C preprocessors.It is customary to report unexpected failures with
AC_MSG_FAILURE.
For instance:
AC_INIT(Autoconf Documentation, 2.59a, 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])])
results in:
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
The macro
AC_TRY_CPP (see Obsolete Macros) used to play the
role of AC_PREPROC_IFELSE, but double quotes its argument, making
it impossible to use it to elaborate sources. You are encouraged to
get rid of your old use of the macro AC_TRY_CPP in favor of
AC_PREPROC_IFELSE, but, in the first place, are you sure you need
to run the preprocessor and not the compiler?
If the output of running the preprocessor on the system header file header-file matches the extended regular expression pattern, execute shell commands action-if-found, otherwise execute action-if-not-found.
program is the text of a C or C++ program, on which shell variable, back quote, and backslash substitutions are performed. If the output of running the preprocessor on program matches the extended regular expression pattern, execute shell commands action-if-found, otherwise execute action-if-not-found.