The most important guideline to bear in mind when checking for
features is to mimic as much as possible the intended use.
Unfortunately, old versions of AC_CHECK_HEADER
and
AC_CHECK_HEADERS
failed to follow this idea, and called
the preprocessor, instead of the compiler, to check for headers. As a
result, incompatibilities between headers went unnoticed during
configuration, and maintainers finally had to deal with this issue
elsewhere.
The transition began with Autoconf 2.56. As of Autoconf 2.64 both
checks are performed, and configure
complains loudly if the
compiler and the preprocessor do not agree. However, only the compiler
result is considered. As of Autoconf 2.70, only the compiler check is
performed.
Consider the following example:
$ cat number.h typedef int number; $ cat pi.h const number pi = 3; $ cat configure.ac AC_INIT([Example], [1.0], [bug-example@example.org]) AC_CHECK_HEADERS([pi.h]) $ autoconf -Wall $ ./configure CPPFLAGS='-I.' checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether the compiler supports GNU C... yes checking whether gcc accepts -g... yes checking for gcc option to enable C11 features... -std=gnu11 checking for sys/types.h... yes checking for sys/stat.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking for pi.h... no
The proper way to handle this case is using the fourth argument (see Generic Header Checks):
$ cat configure.ac AC_INIT([Example], [1.0], [bug-example@example.org]) AC_CHECK_HEADERS([number.h pi.h], [], [], [[#ifdef HAVE_NUMBER_H # include <number.h> #endif ]]) $ autoconf -Wall $ ./configure CPPFLAGS='-I.' checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether the compiler supports GNU C... yes checking whether gcc accepts -g... yes checking for gcc option to enable C11 features... -std=gnu11 checking for number.h... yes checking for pi.h... yes
See Particular Header Checks, for a list of headers with their prerequisites.