[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5. Existing Tests

These macros test for particular system features that packages might need or want to use. If you need to test for a kind of feature that none of these macros check for, you can probably do it by calling primitive test macros with appropriate arguments (see section Writing Tests).

These tests print messages telling the user which feature they're checking for, and what they find. They cache their results for future configure runs (see section Caching Results).

Some of these macros set output variables. See section Substitutions in Makefiles, for how to get their values. The phrase "define name" is used below as a shorthand to mean "define the C preprocessor symbol name to the value 1". See section Defining C Preprocessor Symbols, for how to get those symbol definitions into your program.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1 Common Behavior

Much effort has been expended to make Autoconf easy to learn. The most obvious way to reach this goal is simply to enforce standard interfaces and behaviors, avoiding exceptions as much as possible. Because of history and inertia, unfortunately, there are still too many exceptions in Autoconf; nevertheless, this section describes some of the common rules.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1.1 Standard Symbols

All the generic macros that AC_DEFINE a symbol as a result of their test transform their argument values to a standard alphabet. First, argument is converted to upper case and any asterisks (`*') are each converted to `P'. Any remaining characters that are not alphanumeric are converted to underscores.

For instance,

 
AC_CHECK_TYPES([struct $Expensive*])

defines the symbol `HAVE_STRUCT__EXPENSIVEP' if the check succeeds.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1.2 Default Includes

Several tests depend upon a set of header files. Since these headers are not universally available, tests actually have to provide a set of protected includes, such as:

 
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

Unless you know exactly what you are doing, you should avoid using unconditional includes, and check the existence of the headers you include beforehand (see section Header Files).

Most generic macros use the following macro to provide the default set of includes:

Macro: AC_INCLUDES_DEFAULT ([include-directives]@c)

Expand to include-directives if defined, otherwise to:

 
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
#  include <memory.h>
# endif
# include <string.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif

If the default includes are used, then check for the presence of these headers and their compatibility, i.e., you don't need to run AC_HEADER_STDC, nor check for `stdlib.h' etc.

These headers are checked for in the same order as they are included. For instance, on some systems `string.h' and `strings.h' both exist, but conflict. Then HAVE_STRING_H is defined, not HAVE_STRINGS_H.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 Alternative Programs

These macros check for the presence or behavior of particular programs. They are used to choose between several alternative programs and to decide what to do once one has been chosen. If there is no macro specifically defined to check for a program you need, and you don't need to check for any special properties of it, then you can use one of the general program-check macros.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2.1 Particular Program Checks

These macros check for particular programs--whether they exist, and in some cases whether they support certain features.

Macro: AC_PROG_AWK

Check for gawk, mawk, nawk, and awk, in that order, and set output variable AWK to the first one that is found. It tries gawk first because that is reported to be the best implementation. The result can be overridden by setting the variable AWK or the cache variable ac_cv_prog_AWK.

Macro: AC_PROG_GREP

Look for the best available grep or ggrep that accepts the longest input lines possible, and that supports multiple `-e' options. Set the output variable GREP to whatever is chosen. See Limitations of Usual Tools, for more information about portability problems with the grep command family. The result can be overridden by setting the GREP variable and is cached in the ac_cv_path_GREP variable.

Macro: AC_PROG_EGREP

Check whether $GREP -E works, or else look for the best available egrep or gegrep that accepts the longest input lines possible. Set the output variable EGREP to whatever is chosen. The result can be overridden by setting the EGREP variable and is cached in the ac_cv_path_EGREP variable.

Macro: AC_PROG_FGREP

Check whether $GREP -F works, or else look for the best available fgrep or gfgrep that accepts the longest input lines possible. Set the output variable FGREP to whatever is chosen. The result can be overridden by setting the FGREP variable and is cached in the ac_cv_path_FGREP variable.

Macro: AC_PROG_INSTALL

Set output variable INSTALL to the name of a BSD-compatible install program, if one is found in the current PATH. Otherwise, set INSTALL to `dir/install-sh -c', checking the directories specified to AC_CONFIG_AUX_DIR (or its default directories) to determine dir (see section Outputting Files). Also set the variables INSTALL_PROGRAM and INSTALL_SCRIPT to `${INSTALL}' and INSTALL_DATA to `${INSTALL} -m 644'.

`@INSTALL@' is special, as its value may vary for different configuration files.

This macro screens out various instances of install known not to work. It prefers to find a C program rather than a shell script, for speed. Instead of `install-sh', it can also use `install.sh', but that name is obsolete because some make programs have a rule that creates `install' from it if there is no makefile. Further, this macro requires install to be able to install multiple files into a target directory in a single invocation.

Autoconf comes with a copy of `install-sh' that you can use. If you use AC_PROG_INSTALL, you must include either `install-sh' or `install.sh' in your distribution; otherwise configure produces an error message saying it can't find them--even if the system you're on has a good install program. This check is a safety measure to prevent you from accidentally leaving that file out, which would prevent your package from installing on systems that don't have a BSD-compatible install program.

If you need to use your own installation program because it has features not found in standard install programs, there is no reason to use AC_PROG_INSTALL; just put the file name of your program into your `Makefile.in' files.

The result of the test can be overridden by setting the variable INSTALL or the cache variable ac_cv_path_install.

Macro: AC_PROG_MKDIR_P

Set output variable MKDIR_P to a program that ensures that for each argument, a directory named by this argument exists, creating it and its parent directories if needed, and without race conditions when two instances of the program attempt to make the same directory at nearly the same time.

This macro uses the `mkdir -p' command if possible. Otherwise, it falls back on invoking install-sh with the `-d' option, so your package should contain `install-sh' as described under AC_PROG_INSTALL. An `install-sh' file that predates Autoconf 2.60 or Automake 1.10 is vulnerable to race conditions, so if you want to support parallel installs from different packages into the same directory you need to make sure you have an up-to-date `install-sh'. In particular, be careful about using `autoreconf -if' if your Automake predates Automake 1.10.

This macro is related to the AS_MKDIR_P macro (see section Programming in M4sh), but it sets an output variable intended for use in other files, whereas AS_MKDIR_P is intended for use in scripts like configure. Also, AS_MKDIR_P does not accept options, but MKDIR_P supports the `-m' option, e.g., a makefile might invoke $(MKDIR_P) -m 0 dir to create an inaccessible directory, and conversely a makefile should use $(MKDIR_P) -- $(FOO) if FOO might yield a value that begins with `-'. Finally, AS_MKDIR_P does not check for race condition vulnerability, whereas AC_PROG_MKDIR_P does.

`@MKDIR_P@' is special, as its value may vary for different configuration files.

The result of the test can be overridden by setting the variable MKDIR_P or the cache variable ac_cv_path_mkdir.

Macro: AC_PROG_LEX

If flex is found, set output variable LEX to `flex' and LEXLIB to `-lfl', if that library is in a standard place. Otherwise set LEX to `lex' and LEXLIB to `-ll', if found. If neither variant is available, set LEX to `:'; for packages that ship the generated `file.yy.c' alongside the source `file.l', this default allows users without a lexer generator to still build the package even if the timestamp for `file.l' is inadvertantly changed.

Define YYTEXT_POINTER if yytext defaults to `char *' instead of to `char []'. Also set output variable LEX_OUTPUT_ROOT to the base of the file name that the lexer generates; usually `lex.yy', but sometimes something else. These results vary according to whether lex or flex is being used.

You are encouraged to use Flex in your sources, since it is both more pleasant to use than plain Lex and the C source it produces is portable. In order to ensure portability, however, you must either provide a function yywrap or, if you don't use it (e.g., your scanner has no `#include'-like feature), simply include a `%noyywrap' statement in the scanner's source. Once this done, the scanner is portable (unless you felt free to use nonportable constructs) and does not depend on any library. In this case, and in this case only, it is suggested that you use this Autoconf snippet:

 
AC_PROG_LEX
if test "x$LEX" != xflex; then
  LEX="$SHELL $missing_dir/missing flex"
  AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
  AC_SUBST([LEXLIB], [''])
fi

The shell script missing can be found in the Automake distribution.

Remember that the user may have supplied an alternate location in LEX, so if Flex is required, it is better to check that the user provided something sufficient by parsing the output of `$LEX --version' than by simply relying on test "x$LEX" = xflex.

To ensure backward compatibility, Automake's AM_PROG_LEX invokes (indirectly) this macro twice, which causes an annoying but benign "AC_PROG_LEX invoked multiple times" warning. Future versions of Automake will fix this issue; meanwhile, just ignore this message.

As part of running the test, this macro may delete any file in the configuration directory named `lex.yy.c' or `lexyy.c'.

The result of this test can be influenced by setting the variable LEX or the cache variable ac_cv_prog_LEX.

Macro: AC_PROG_LN_S

If `ln -s' works on the current file system (the operating system and file system support symbolic links), set the output variable LN_S to `ln -s'; otherwise, if `ln' works, set LN_S to `ln', and otherwise set it to `cp -p'.

If you make a link in a directory other than the current directory, its meaning depends on whether `ln' or `ln -s' is used. To safely create links using `$(LN_S)', either find out which form is used and adjust the arguments, or always invoke ln in the directory where the link is to be created.

In other words, it does not work to do:

 
$(LN_S) foo /x/bar

Instead, do:

 
(cd /x && $(LN_S) foo bar)
Macro: AC_PROG_RANLIB

Set output variable RANLIB to `ranlib' if ranlib is found, and otherwise to `:' (do nothing).

Macro: AC_PROG_SED

Set output variable SED to a Sed implementation that conforms to Posix and does not have arbitrary length limits. Report an error if no acceptable Sed is found. See Limitations of Usual Tools, for more information about portability problems with Sed.

The result of this test can be overridden by setting the SED variable and is cached in the ac_cv_path_SED variable.

Macro: AC_PROG_YACC

If bison is found, set output variable YACC to `bison -y'. Otherwise, if byacc is found, set YACC to `byacc'. Otherwise set YACC to `yacc'. The result of this test can be influenced by setting the variable YACC or the cache variable ac_cv_prog_YACC.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2.2 Generic Program and File Checks

These macros are used to find programs not covered by the "particular" test macros. If you need to check the behavior of a program as well as find out whether it is present, you have to write your own test for it (see section Writing Tests). By default, these macros use the environment variable PATH. If you need to check for a program that might not be in the user's PATH, you can pass a modified path to use instead, like this:

 
AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
             [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
[/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])

You are strongly encouraged to declare the variable passed to AC_CHECK_PROG etc. as precious, See section Setting Output Variables, AC_ARG_VAR, for more details.

Macro: AC_CHECK_PROG (variable, prog-to-check-for,   value-if-found, [value-if-not-found]@c, [path = `$PATH']@c,   [reject]@c)

Check whether program prog-to-check-for exists in path. If it is found, set variable to value-if-found, otherwise to value-if-not-found, if given. Always pass over reject (an absolute file name) even if it is the first found in the search path; in that case, set variable using the absolute file name of the prog-to-check-for found that is not reject. If variable was already set, do nothing. Calls AC_SUBST for variable. The result of this test can be overridden by setting the variable variable or the cache variable ac_cv_prog_variable.

Macro: AC_CHECK_PROGS (variable, progs-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Check for each program in the blank-separated list progs-to-check-for existing in the path. If one is found, set variable to the name of that program. Otherwise, continue checking the next program in the list. If none of the programs in the list are found, set variable to value-if-not-found; if value-if-not-found is not specified, the value of variable is not changed. Calls AC_SUBST for variable. The result of this test can be overridden by setting the variable variable or the cache variable ac_cv_prog_variable.

Macro: AC_CHECK_TARGET_TOOL (variable, prog-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_PROG, but first looks for prog-to-check-for with a prefix of the target type as determined by AC_CANONICAL_TARGET, followed by a dash (see section Getting the Canonical System Type). If the tool cannot be found with a prefix, and if the build and target types are equal, then it is also searched for without a prefix.

As noted in Specifying target triplets, the target is rarely specified, because most of the time it is the same as the host: it is the type of system for which any compiler tool in the package produces code. What this macro looks for is, for example, a tool (assembler, linker, etc.) that the compiler driver (gcc for the GNU C Compiler) uses to produce objects, archives or executables.

Macro: AC_CHECK_TOOL (variable, prog-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_PROG, but first looks for prog-to-check-for with a prefix of the host type as specified by `--host', followed by a dash. For example, if the user runs `configure --build=x86_64-gnu --host=i386-gnu', then this call:

 
AC_CHECK_TOOL([RANLIB], [ranlib], [:])

sets RANLIB to `i386-gnu-ranlib' if that program exists in path, or otherwise to `ranlib' if that program exists in path, or to `:' if neither program exists.

When cross-compiling, this macro will issue a warning if no program prefixed with the host type could be found. For more information, see Specifying target triplets.

Macro: AC_CHECK_TARGET_TOOLS (variable, progs-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_TARGET_TOOL, each of the tools in the list progs-to-check-for are checked with a prefix of the target type as determined by AC_CANONICAL_TARGET, followed by a dash (see section Getting the Canonical System Type). If none of the tools can be found with a prefix, and if the build and target types are equal, then the first one without a prefix is used. If a tool is found, set variable to the name of that program. If none of the tools in the list are found, set variable to value-if-not-found; if value-if-not-found is not specified, the value of variable is not changed. Calls AC_SUBST for variable.

Macro: AC_CHECK_TOOLS (variable, progs-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_TOOL, each of the tools in the list progs-to-check-for are checked with a prefix of the host type as determined by AC_CANONICAL_HOST, followed by a dash (see section Getting the Canonical System Type). If none of the tools can be found with a prefix, then the first one without a prefix is used. If a tool is found, set variable to the name of that program. If none of the tools in the list are found, set variable to value-if-not-found; if value-if-not-found is not specified, the value of variable is not changed. Calls AC_SUBST for variable.

When cross-compiling, this macro will issue a warning if no program prefixed with the host type could be found. For more information, see Specifying target triplets.

Macro: AC_PATH_PROG (variable, prog-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_PROG, but set variable to the absolute name of prog-to-check-for if found. The result of this test can be overridden by setting the variable variable. A positive result of this test is cached in the ac_cv_path_variable variable.

Macro: AC_PATH_PROGS (variable, progs-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_PROGS, but if any of progs-to-check-for are found, set variable to the absolute name of the program found. The result of this test can be overridden by setting the variable variable. A positive result of this test is cached in the ac_cv_path_variable variable.

Macro: AC_PATH_PROGS_FEATURE_CHECK (variable,   progs-to-check-for, feature-test,   [action-if-not-found]@c, [path = `$PATH']@c)

This macro was introduced in Autoconf 2.62. If variable is not empty, then set the cache variable ac_cv_path_variable to its value. Otherwise, check for each program in the blank-separated list progs-to-check-for existing in path. For each program found, execute feature-test with ac_path_variable set to the absolute name of the candidate program. If no invocation of feature-test sets the shell variable ac_cv_path_variable, then action-if-not-found is executed. feature-test will be run even when ac_cv_path_variable is set, to provide the ability to choose a better candidate found later in path; to accept the current setting and bypass all futher checks, feature-test can execute ac_path_variable_found=:.

Note that this macro has some subtle differences from AC_CHECK_PROGS. It is designed to be run inside AC_CACHE_VAL, therefore, it should have no side effects. In particular, variable is not set to the final value of ac_cv_path_variable, nor is AC_SUBST automatically run. Also, on failure, any action can be performed, whereas AC_CHECK_PROGS only performs variable=value-if-not-found.

Here is an example, similar to what Autoconf uses in its own configure script. It will search for an implementation of m4 that supports the indir builtin, even if it goes by the name gm4 or is not the first implementation on PATH.

 
AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
  [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
    [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
      test "x$m4out" = x0 \
      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
    [AC_MSG_ERROR([could not find m4 that supports indir])])])
AC_SUBST([M4], [$ac_cv_path_M4])
Macro: AC_PATH_TARGET_TOOL (variable, prog-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_TARGET_TOOL, but set variable to the absolute name of the program if it is found.

Macro: AC_PATH_TOOL (variable, prog-to-check-for,   [value-if-not-found]@c, [path = `$PATH']@c)

Like AC_CHECK_TOOL, but set variable to the absolute name of the program if it is found.

When cross-compiling, this macro will issue a warning if no program prefixed with the host type could be found. For more information, see Specifying target triplets.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.3 Files

You might also need to check for the existence of files. Before using these macros, ask yourself whether a runtime test might not be a better solution. Be aware that, like most Autoconf macros, they test a feature of the host machine, and therefore, they die when cross-compiling.

Macro: AC_CHECK_FILE (file, [action-if-found]@c,   [action-if-not-found]@c)

Check whether file file exists on the native system. If it is found, execute action-if-found, otherwise do action-if-not-found, if given. The result of this test is cached in the ac_cv_file_file variable, with characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_FILES (files, [action-if-found]@c,   [action-if-not-found]@c)

Executes AC_CHECK_FILE once for each file listed in files. Additionally, defines `HAVE_file' (see section Standard Symbols) for each file found. The results of each test are cached in the ac_cv_file_file variable, with characters not suitable for a variable name mapped to underscores.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.4 Library Files

The following macros check for the presence of certain C, C++, or Fortran library archive files.

Macro: AC_CHECK_LIB (library, function,   [action-if-found]@c, [action-if-not-found]@c, [other-libraries]@c)

Test whether the library library is available by trying to link a test program that calls function function with the library. function should be a function provided by the library. Use the base name of the library; e.g., to check for `-lmp', use `mp' as the library argument.

action-if-found is a list of shell commands to run if the link with the library succeeds; action-if-not-found is a list of shell commands to run if the link fails. If action-if-found is not specified, the default action prepends `-llibrary' to LIBS and defines `HAVE_LIBlibrary' (in all capitals). This macro is intended to support building LIBS in a right-to-left (least-dependent to most-dependent) fashion such that library dependencies are satisfied as a natural side effect of consecutive tests. Linkers are sensitive to library ordering so the order in which LIBS is generated is important to reliable detection of libraries.

If linking with library results in unresolved symbols that would be resolved by linking with additional libraries, give those libraries as the other-libraries argument, separated by spaces: e.g., `-lXt -lX11'. Otherwise, this macro may fail to detect that library is present, because linking the test program can fail with unresolved symbols. The other-libraries argument should be limited to cases where it is desirable to test for one library in the presence of another that is not already in LIBS.

AC_CHECK_LIB requires some care in usage, and should be avoided in some common cases. Many standard functions like gethostbyname appear in the standard C library on some hosts, and in special libraries like nsl on other hosts. On some hosts the special libraries contain variant implementations that you may not want to use. These days it is normally better to use AC_SEARCH_LIBS([gethostbyname], [nsl]) instead of AC_CHECK_LIB([nsl], [gethostbyname]).

The result of this test is cached in the ac_cv_lib_library_function variable.

Macro: AC_SEARCH_LIBS (function, search-libs,   [action-if-found]@c, [action-if-not-found]@c, [other-libraries]@c)

Search for a library defining function if it's not already available. This equates to calling `AC_LINK_IFELSE([AC_LANG_CALL([], [function])])' first with no libraries, then for each library listed in search-libs.

Add `-llibrary' to LIBS for the first library found to contain function, and run action-if-found. If the function is not found, run action-if-not-found.

If linking with library results in unresolved symbols that would be resolved by linking with additional libraries, give those libraries as the other-libraries argument, separated by spaces: e.g., `-lXt -lX11'. Otherwise, this macro fails to detect that function is present, because linking the test program always fails with unresolved symbols.

The result of this test is cached in the ac_cv_search_function variable as `none required' if function is already available, as `no' if no library containing function was found, otherwise as the `-llibrary' option that needs to be added to LIBS.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5 Library Functions

The following macros check for particular C library functions. If there is no macro specifically defined to check for a function you need, and you don't need to check for any special properties of it, then you can use one of the general function-check macros.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5.1 Portability of C Functions

Most usual functions can either be missing, or be buggy, or be limited on some architectures. This section tries to make an inventory of these portability issues. By definition, this list always requires additions. Please help us keeping it as complete as possible.

exit

On ancient hosts, exit returned int. This is because exit predates void, and there was a long tradition of it returning int.

On current hosts, the problem more likely is that exit is not declared, due to C++ problems of some sort or another. For this reason we suggest that test programs not invoke exit, but return from main instead.

free

The C standard says a call free (NULL) does nothing, but some old systems don't support this (e.g., NextStep).

isinf
isnan

The C99 standard says that isinf and isnan are macros. On some systems just macros are available (e.g., HP-UX and Solaris 10), on some systems both macros and functions (e.g., glibc 2.3.2), and on some systems only functions (e.g., IRIX 6 and Solaris 9). In some cases these functions are declared in nonstandard headers like <sunmath.h> and defined in non-default libraries like `-lm' or `-lsunmath'.

The C99 isinf and isnan macros work correctly with long double arguments, but pre-C99 systems that use functions typically assume double arguments. On such a system, isinf incorrectly returns true for a finite long double argument that is outside the range of double.

The best workaround for these issues is to use gnulib modules isinf and isnan (see section Gnulib). But a lighter weight solution involves code like the following.

 
#include <math.h>

#ifndef isnan
# define isnan(x) \
    (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
     : sizeof (x) == sizeof (double) ? isnan_d (x) \
     : isnan_f (x))
static inline int isnan_f  (float       x) { return x != x; }
static inline int isnan_d  (double      x) { return x != x; }
static inline int isnan_ld (long double x) { return x != x; }
#endif

#ifndef isinf
# define isinf(x) \
    (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
     : sizeof (x) == sizeof (double) ? isinf_d (x) \
     : isinf_f (x))
static inline int isinf_f  (float       x)
{ return !isnan (x) && isnan (x - x); }
static inline int isinf_d  (double      x)
{ return !isnan (x) && isnan (x - x); }
static inline int isinf_ld (long double x)
{ return !isnan (x) && isnan (x - x); }
#endif

Use AC_C_INLINE (see section C Compiler Characteristics) so that this code works on compilers that lack the inline keyword. Some optimizing compilers mishandle these definitions, but systems with that bug typically have many other floating point corner-case compliance problems anyway, so it's probably not worth worrying about.

malloc

The C standard says a call malloc (0) is implementation dependent. It can return either NULL or a new non-null pointer. The latter is more common (e.g., the GNU C Library) but is by no means universal. AC_FUNC_MALLOC can be used to insist on non-NULL (see section Particular Function Checks).

putenv

Posix prefers setenv to putenv; among other things, putenv is not required of all Posix implementations, but setenv is.

Posix specifies that putenv puts the given string directly in environ, but some systems make a copy of it instead (e.g., glibc 2.0, or BSD). And when a copy is made, unsetenv might not free it, causing a memory leak (e.g., FreeBSD 4).

On some systems putenv ("FOO") removes `FOO' from the environment, but this is not standard usage and it dumps core on some systems (e.g., AIX).

On MinGW, a call putenv ("FOO=") removes `FOO' from the environment, rather than inserting it with an empty value.

realloc

The C standard says a call realloc (NULL, size) is equivalent to malloc (size), but some old systems don't support this (e.g., NextStep).

signal handler

Normally signal takes a handler function with a return type of void, but some old systems required int instead. Any actual int value returned is not used; this is only a difference in the function prototype demanded.

All systems we know of in current use return void. The int was to support K&R C, where of course void is not available. The obsolete macro AC_TYPE_SIGNAL (see AC_TYPE_SIGNAL) can be used to establish the correct type in all cases.

In most cases, it is more robust to use sigaction when it is available, rather than signal.

snprintf

The C99 standard says that if the output array isn't big enough and if no other errors occur, snprintf and vsnprintf truncate the output and return the number of bytes that ought to have been produced. Some older systems return the truncated length (e.g., GNU C Library 2.0.x or IRIX 6.5), some a negative value (e.g., earlier GNU C Library versions), and some the buffer length without truncation (e.g., 32-bit Solaris 7). Also, some buggy older systems ignore the length and overrun the buffer (e.g., 64-bit Solaris 7).

sprintf

The C standard says sprintf and vsprintf return the number of bytes written. On some ancient systems (SunOS 4 for instance) they return the buffer pointer instead, but these no longer need to be worried about.

sscanf

On various old systems, e.g., HP-UX 9, sscanf requires that its input string be writable (though it doesn't actually change it). This can be a problem when using gcc since it normally puts constant strings in read-only memory (see Incompatibilities of GCC: (gcc)Incompatibilities section `Incompatibilities' in Using and Porting the GNU Compiler Collection). Apparently in some cases even having format strings read-only can be a problem.

strerror_r

Posix specifies that strerror_r returns an int, but many systems (e.g., GNU C Library version 2.2.4) provide a different version returning a char *. AC_FUNC_STRERROR_R can detect which is in use (see section Particular Function Checks).

strnlen

AIX 4.3 provides a broken version which produces the following results:

 
strnlen ("foobar", 0) = 0
strnlen ("foobar", 1) = 3
strnlen ("foobar", 2) = 2
strnlen ("foobar", 3) = 1
strnlen ("foobar", 4) = 0
strnlen ("foobar", 5) = 6
strnlen ("foobar", 6) = 6
strnlen ("foobar", 7) = 6
strnlen ("foobar", 8) = 6
strnlen ("foobar", 9) = 6
sysconf

_SC_PAGESIZE is standard, but some older systems (e.g., HP-UX 9) have _SC_PAGE_SIZE instead. This can be tested with #ifdef.

unlink

The Posix spec says that unlink causes the given file to be removed only after there are no more open file handles for it. Some non-Posix hosts have trouble with this requirement, though, and some DOS variants even corrupt the file system.

unsetenv

On MinGW, unsetenv is not available, but a variable `FOO' can be removed with a call putenv ("FOO="), as described under putenv above.

va_copy

The C99 standard provides va_copy for copying va_list variables. It may be available in older environments too, though possibly as __va_copy (e.g., gcc in strict pre-C99 mode). These can be tested with #ifdef. A fallback to memcpy (&dst, &src, sizeof (va_list)) gives maximum portability.

va_list

va_list is not necessarily just a pointer. It can be a struct (e.g., gcc on Alpha), which means NULL is not portable. Or it can be an array (e.g., gcc in some PowerPC configurations), which means as a function parameter it can be effectively call-by-reference and library routines might modify the value back in the caller (e.g., vsnprintf in the GNU C Library 2.1).

Signed >>

Normally the C >> right shift of a signed type replicates the high bit, giving a so-called "arithmetic" shift. But care should be taken since Standard C doesn't require that behavior. On those few processors without a native arithmetic shift (for instance Cray vector systems) zero bits may be shifted in, the same as a shift of an unsigned type.

Integer /

C divides signed integers by truncating their quotient toward zero, yielding the same result as Fortran. However, before C99 the standard allowed C implementations to take the floor or ceiling of the quotient in some cases. Hardly any implementations took advantage of this freedom, though, and it's probably not worth worrying about this issue nowadays.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5.2 Particular Function Checks

These macros check for particular C functions--whether they exist, and in some cases how they respond when given certain arguments.

Macro: AC_FUNC_ALLOCA

Check how to get alloca. Tries to get a builtin version by checking for `alloca.h' or the predefined C preprocessor macros __GNUC__ and _AIX. If this macro finds `alloca.h', it defines HAVE_ALLOCA_H.

If those attempts fail, it looks for the function in the standard C library. If any of those methods succeed, it defines HAVE_ALLOCA. Otherwise, it sets the output variable ALLOCA to `${LIBOBJDIR}alloca.o' and defines C_ALLOCA (so programs can periodically call `alloca (0)' to garbage collect). This variable is separate from LIBOBJS so multiple programs can share the value of ALLOCA without needing to create an actual library, in case only some of them use the code in LIBOBJS. The `${LIBOBJDIR}' prefix serves the same purpose as in LIBOBJS (see section AC_LIBOBJ vs. LIBOBJS).

This macro does not try to get alloca from the System V R3 `libPW' or the System V R4 `libucb' because those libraries contain some incompatible functions that cause trouble. Some versions do not even contain alloca or contain a buggy version. If you still want to use their alloca, use ar to extract `alloca.o' from them instead of compiling `alloca.c'.

Source files that use alloca should start with a piece of code like the following, to declare it properly.

 
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
#elif defined __GNUC__
# define alloca __builtin_alloca
#elif defined _AIX
# define alloca __alloca
#elif defined _MSC_VER
# include <malloc.h>
# define alloca _alloca
#else
# include <stddef.h>
# ifdef  __cplusplus
extern "C"
# endif
void *alloca (size_t);
#endif
Macro: AC_FUNC_CHOWN

If the chown function is available and works (in particular, it should accept `-1' for uid and gid), define HAVE_CHOWN. The result of this macro is cached in the ac_cv_func_chown_works variable.

Macro: AC_FUNC_CLOSEDIR_VOID

If the closedir function does not return a meaningful value, define CLOSEDIR_VOID. Otherwise, callers ought to check its return value for an error indicator.

Currently this test is implemented by running a test program. When cross compiling the pessimistic assumption that closedir does not return a meaningful value is made.

The result of this macro is cached in the ac_cv_func_closedir_void variable.

This macro is obsolescent, as closedir returns a meaningful value on current systems. New programs need not use this macro.

Macro: AC_FUNC_ERROR_AT_LINE

If the error_at_line function is not found, require an AC_LIBOBJ replacement of `error'.

The result of this macro is cached in the ac_cv_lib_error_at_line variable.

Macro: AC_FUNC_FNMATCH

If the fnmatch function conforms to Posix, define HAVE_FNMATCH. Detect common implementation bugs, for example, the bugs in Solaris 2.4.

Unlike the other specific AC_FUNC macros, AC_FUNC_FNMATCH does not replace a broken/missing fnmatch. This is for historical reasons. See AC_REPLACE_FNMATCH below.

The result of this macro is cached in the ac_cv_func_fnmatch_works variable.

This macro is obsolescent. New programs should use Gnulib's fnmatch-posix module. See section Gnulib.

Macro: AC_FUNC_FNMATCH_GNU

Behave like AC_REPLACE_FNMATCH (replace) but also test whether fnmatch supports GNU extensions. Detect common implementation bugs, for example, the bugs in the GNU C Library 2.1.

The result of this macro is cached in the ac_cv_func_fnmatch_gnu variable.

This macro is obsolescent. New programs should use Gnulib's fnmatch-gnu module. See section Gnulib.

Macro: AC_FUNC_FORK

This macro checks for the fork and vfork functions. If a working fork is found, define HAVE_WORKING_FORK. This macro checks whether fork is just a stub by trying to run it.

If `vfork.h' is found, define HAVE_VFORK_H. If a working vfork is found, define HAVE_WORKING_VFORK. Otherwise, define vfork to be fork for backward compatibility with previous versions of autoconf. This macro checks for several known errors in implementations of vfork and considers the system to not have a working vfork if it detects any of them. It is not considered to be an implementation error if a child's invocation of signal modifies the parent's signal handler, since child processes rarely change their signal handlers.

Since this macro defines vfork only for backward compatibility with previous versions of autoconf you're encouraged to define it yourself in new code:

 
#ifndef HAVE_WORKING_VFORK
# define vfork fork
#endif
Macro: AC_FUNC_FSEEKO

If the fseeko function is available, define HAVE_FSEEKO. Define _LARGEFILE_SOURCE if necessary to make the prototype visible on some systems (e.g., glibc 2.2). Otherwise linkage problems may occur when compiling with AC_SYS_LARGEFILE on largefile-sensitive systems where off_t does not default to a 64bit entity. All systems with fseeko also supply ftello.

Macro: AC_FUNC_GETGROUPS

If the getgroups function is available and works (unlike on Ultrix 4.3, where `getgroups (0, 0)' always fails), define HAVE_GETGROUPS. Set GETGROUPS_LIBS to any libraries needed to get that function. This macro runs AC_TYPE_GETGROUPS.

Macro: AC_FUNC_GETLOADAVG

Check how to get the system load averages. To perform its tests properly, this macro needs the file `getloadavg.c'; therefore, be sure to set the AC_LIBOBJ replacement directory properly (see Generic Function Checks, AC_CONFIG_LIBOBJ_DIR).

If the system has the getloadavg function, define HAVE_GETLOADAVG, and set GETLOADAVG_LIBS to any libraries necessary to get that function. Also add GETLOADAVG_LIBS to LIBS. Otherwise, require an AC_LIBOBJ replacement for `getloadavg' with source code in `dir/getloadavg.c', and possibly define several other C preprocessor macros and output variables:

  1. Define C_GETLOADAVG.
  2. Define SVR4, DGUX, UMAX, or UMAX4_3 if on those systems.
  3. If `nlist.h' is found, define HAVE_NLIST_H.
  4. If `struct nlist' has an `n_un.n_name' member, define HAVE_STRUCT_NLIST_N_UN_N_NAME. The obsolete symbol NLIST_NAME_UNION is still defined, but do not depend upon it.
  5. Programs may need to be installed set-group-ID (or set-user-ID) for getloadavg to work. In this case, define GETLOADAVG_PRIVILEGED, set the output variable NEED_SETGID to `true' (and otherwise to `false'), and set KMEM_GROUP to the name of the group that should own the installed program.

The AC_FUNC_GETLOADAVG macro is obsolescent. New programs should use Gnulib's getloadavg module. See section Gnulib.

Macro: AC_FUNC_GETMNTENT

Check for getmntent in the standard C library, and then in the `sun', `seq', and `gen' libraries, for UNICOS, IRIX 4, PTX, and UnixWare, respectively. Then, if getmntent is available, define HAVE_GETMNTENT and set ac_cv_func_getmntent to yes. Otherwise set ac_cv_func_getmntent to no.

The result of this macro can be overridden by setting the cache variable ac_cv_search_getmntent.

Macro: AC_FUNC_GETPGRP

Define GETPGRP_VOID if it is an error to pass 0 to getpgrp; this is the Posix behavior. On older BSD systems, you must pass 0 to getpgrp, as it takes an argument and behaves like Posix's getpgid.

 
#ifdef GETPGRP_VOID
  pid = getpgrp ();
#else
  pid = getpgrp (0);
#endif

This macro does not check whether getpgrp exists at all; if you need to work in that situation, first call AC_CHECK_FUNC for getpgrp.

The result of this macro is cached in the ac_cv_func_getpgrp_void variable.

This macro is obsolescent, as current systems have a getpgrp whose signature conforms to Posix. New programs need not use this macro.

Macro: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK

If `link' is a symbolic link, then lstat should treat `link/' the same as `link/.'. However, many older lstat implementations incorrectly ignore trailing slashes.

It is safe to assume that if lstat incorrectly ignores trailing slashes, then other symbolic-link-aware functions like unlink also incorrectly ignore trailing slashes.

If lstat behaves properly, define LSTAT_FOLLOWS_SLASHED_SYMLINK, otherwise require an AC_LIBOBJ replacement of lstat.

The result of this macro is cached in the ac_cv_func_lstat_dereferences_slashed_symlink variable.

Macro: AC_FUNC_MALLOC

If the malloc function is compatible with the GNU C library malloc (i.e., `malloc (0)' returns a valid pointer), define HAVE_MALLOC to 1. Otherwise define HAVE_MALLOC to 0, ask for an AC_LIBOBJ replacement for `malloc', and define malloc to rpl_malloc so that the native malloc is not used in the main project.

Typically, the replacement file `malloc.c' should look like (note the `#undef malloc'):

#include <config.h>
#undef malloc

#include <sys/types.h>

void *malloc ();

/* Allocate an N-byte block of memory from the heap.
   If N is zero, allocate a 1-byte block.  */

void *
rpl_malloc (size_t n)
{
  if (n == 0)
    n = 1;
  return malloc (n);
}

The result of this macro is cached in the ac_cv_func_malloc_0_nonnull variable.

Macro: AC_FUNC_MBRTOWC

Define HAVE_MBRTOWC to 1 if the function mbrtowc and the type mbstate_t are properly declared.

The result of this macro is cached in the ac_cv_func_mbrtowc variable.

Macro: AC_FUNC_MEMCMP

If the memcmp function is not available, or does not work on 8-bit data (like the one on SunOS 4.1.3), or fails when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary (such as the one on NeXT x86 OpenStep), require an AC_LIBOBJ replacement for `memcmp'.

The result of this macro is cached in the ac_cv_func_memcmp_working variable.

This macro is obsolescent, as current systems have a working memcmp. New programs need not use this macro.

Macro: AC_FUNC_MKTIME

If the mktime function is not available, or does not work correctly, require an AC_LIBOBJ replacement for `mktime'. For the purposes of this test, mktime should conform to the Posix standard and should be the inverse of localtime.

The result of this macro is cached in the ac_cv_func_working_mktime variable.

Macro: AC_FUNC_MMAP

If the mmap function exists and works correctly, define HAVE_MMAP. This checks only private fixed mapping of already-mapped memory.

The result of this macro is cached in the ac_cv_func_mmap_fixed_mapped variable.

Macro: AC_FUNC_OBSTACK

If the obstacks are found, define HAVE_OBSTACK, else require an AC_LIBOBJ replacement for `obstack'.

The result of this macro is cached in the ac_cv_func_obstack variable.

Macro: AC_FUNC_REALLOC

If the realloc function is compatible with the GNU C library realloc (i.e., `realloc (NULL, 0)' returns a valid pointer), define HAVE_REALLOC to 1. Otherwise define HAVE_REALLOC to 0, ask for an AC_LIBOBJ replacement for `realloc', and define realloc to rpl_realloc so that the native realloc is not used in the main project. See AC_FUNC_MALLOC for details.

The result of this macro is cached in the ac_cv_func_realloc_0_nonnull variable.

Macro: AC_FUNC_SELECT_ARGTYPES

Determines the correct type to be passed for each of the select function's arguments, and defines those types in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234, and SELECT_TYPE_ARG5 respectively. SELECT_TYPE_ARG1 defaults to `int', SELECT_TYPE_ARG234 defaults to `int *', and SELECT_TYPE_ARG5 defaults to `struct timeval *'.

This macro is obsolescent, as current systems have a select whose signature conforms to Posix. New programs need not use this macro.

Macro: AC_FUNC_SETPGRP

If setpgrp takes no argument (the Posix version), define SETPGRP_VOID. Otherwise, it is the BSD version, which takes two process IDs as arguments. This macro does not check whether setpgrp exists at all; if you need to work in that situation, first call AC_CHECK_FUNC for setpgrp.

The result of this macro is cached in the ac_cv_func_setpgrp_void variable.

This macro is obsolescent, as current systems have a setpgrp whose signature conforms to Posix. New programs need not use this macro.

Macro: AC_FUNC_STAT
Macro: AC_FUNC_LSTAT

Determine whether stat or lstat have the bug that it succeeds when given the zero-length file name as argument. The stat and lstat from SunOS 4.1.4 and the Hurd (as of 1998-11-01) do this.

If it does, then define HAVE_STAT_EMPTY_STRING_BUG (or HAVE_LSTAT_EMPTY_STRING_BUG) and ask for an AC_LIBOBJ replacement of it.

The results of these macros are cached in the ac_cv_func_stat_empty_string_bug and the ac_cv_func_lstat_empty_string_bug variables, respectively.

These macros are obsolescent, as no current systems have the bug. New programs need not use these macros.

Macro: AC_FUNC_STRCOLL

If the strcoll function exists and works correctly, define HAVE_STRCOLL. This does a bit more than `AC_CHECK_FUNCS(strcoll)', because some systems have incorrect definitions of strcoll that should not be used.

The result of this macro is cached in the ac_cv_func_strcoll_works variable.

Macro: AC_FUNC_STRERROR_R

If strerror_r is available, define HAVE_STRERROR_R, and if it is declared, define HAVE_DECL_STRERROR_R. If it returns a char * message, define STRERROR_R_CHAR_P; otherwise it returns an int error number. The Thread-Safe Functions option of Posix requires strerror_r to return int, but many systems (including, for example, version 2.2.4 of the GNU C Library) return a char * value that is not necessarily equal to the buffer argument.

The result of this macro is cached in the ac_cv_func_strerror_r_char_p variable.

Macro: AC_FUNC_STRFTIME

Check for strftime in the `intl' library, for SCO Unix. Then, if strftime is available, define HAVE_STRFTIME.

This macro is obsolescent, as no current systems require the `intl' library for strftime. New programs need not use this macro.

Macro: AC_FUNC_STRTOD

If the strtod function does not exist or doesn't work correctly, ask for an AC_LIBOBJ replacement of `strtod'. In this case, because `strtod.c' is likely to need `pow', set the output variable POW_LIB to the extra library needed.

This macro caches its result in the ac_cv_func_strtod variable and depends upon the result in the ac_cv_func_pow variable.

Macro: AC_FUNC_STRTOLD

If the strtold function exists and conforms to C99, define HAVE_STRTOLD.

This macro caches its result in the ac_cv_func_strtold variable.

Macro: AC_FUNC_STRNLEN

If the strnlen function is not available, or is buggy (like the one from AIX 4.3), require an AC_LIBOBJ replacement for it.

This macro caches its result in the ac_cv_func_strnlen_working variable.

Macro: AC_FUNC_UTIME_NULL

If `utime (file, NULL)' sets file's timestamp to the present, define HAVE_UTIME_NULL.

This macro caches its result in the ac_cv_func_utime_null variable.

This macro is obsolescent, as all current systems have a utime that behaves this way. New programs need not use this macro.

Macro: AC_FUNC_VPRINTF

If vprintf is found, define HAVE_VPRINTF. Otherwise, if _doprnt is found, define HAVE_DOPRNT. (If vprintf is available, you may assume that vfprintf and vsprintf are also available.)

This macro is obsolescent, as all current systems have vprintf. New programs need not use this macro.

Macro: AC_REPLACE_FNMATCH

If the fnmatch function does not conform to Posix (see AC_FUNC_FNMATCH), ask for its AC_LIBOBJ replacement.

The files `fnmatch.c', `fnmatch_loop.c', and `fnmatch_.h' in the AC_LIBOBJ replacement directory are assumed to contain a copy of the source code of GNU fnmatch. If necessary, this source code is compiled as an AC_LIBOBJ replacement, and the `fnmatch_.h' file is linked to `fnmatch.h' so that it can be included in place of the system <fnmatch.h>.

This macro caches its result in the ac_cv_func_fnmatch_works variable.

This macro is obsolescent, as it assumes the use of particular source files. New programs should use Gnulib's fnmatch-posix module, which provides this macro along with the source files. See section Gnulib.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5.3 Generic Function Checks

These macros are used to find functions not covered by the "particular" test macros. If the functions might be in libraries other than the default C library, first call AC_CHECK_LIB for those libraries. If you need to check the behavior of a function as well as find out whether it is present, you have to write your own test for it (see section Writing Tests).

Macro: AC_CHECK_FUNC (function, [action-if-found]@c,   [action-if-not-found]@c)

If C function function is available, run shell commands action-if-found, otherwise action-if-not-found. If you just want to define a symbol if the function is available, consider using AC_CHECK_FUNCS instead. This macro checks for functions with C linkage even when AC_LANG(C++) has been called, since C is more standardized than C++. (see section Language Choice, for more information about selecting the language for checks.)

This macro caches its result in the ac_cv_func_function variable.

Macro: AC_CHECK_FUNCS (function…, [action-if-found]@c,   [action-if-not-found]@c)

For each function enumerated in the blank-or-newline-separated argument list, define HAVE_function (in all capitals) if it is available. If action-if-found is given, it is additional shell code to execute when one of the functions is found. You can give it a value of `break' to break out of the loop on the first match. If action-if-not-found is given, it is executed when one of the functions is not found.

Results are cached for each function as in AC_CHECK_FUNC.

Macro: AC_CHECK_FUNCS_ONCE (function…)

For each function enumerated in the blank-or-newline-separated argument list, define HAVE_function (in all capitals) if it is available. This is a once-only variant of AC_CHECK_FUNCS. It generates the checking code at most once, so that configure is smaller and faster; but the checks cannot be conditionalized and are always done once, early during the configure run.


Autoconf follows a philosophy that was formed over the years by those who have struggled for portability: isolate the portability issues in specific files, and then program as if you were in a Posix environment. Some functions may be missing or unfixable, and your package must be ready to replace them.

Suitable replacements for many such problem functions are available from Gnulib (see section Gnulib).

Macro: AC_LIBOBJ (function)

Specify that `function.c' must be included in the executables to replace a missing or broken implementation of function.

Technically, it adds `function.$ac_objext' to the output variable LIBOBJS if it is not already in, and calls AC_LIBSOURCE for `function.c'. You should not directly change LIBOBJS, since this is not traceable.

Macro: AC_LIBSOURCE (file)

Specify that file might be needed to compile the project. If you need to know what files might be needed by a `configure.ac', you should trace AC_LIBSOURCE. file must be a literal.

This macro is called automatically from AC_LIBOBJ, but you must call it explicitly if you pass a shell variable to AC_LIBOBJ. In that case, since shell variables cannot be traced statically, you must pass to AC_LIBSOURCE any possible files that the shell variable might cause AC_LIBOBJ to need. For example, if you want to pass a variable $foo_or_bar to AC_LIBOBJ that holds either "foo" or "bar", you should do:

 
AC_LIBSOURCE([foo.c])
AC_LIBSOURCE([bar.c])
AC_LIBOBJ([$foo_or_bar])

There is usually a way to avoid this, however, and you are encouraged to simply call AC_LIBOBJ with literal arguments.

Note that this macro replaces the obsolete AC_LIBOBJ_DECL, with slightly different semantics: the old macro took the function name, e.g., foo, as its argument rather than the file name.

Macro: AC_LIBSOURCES (files)

Like AC_LIBSOURCE, but accepts one or more files in a comma-separated M4 list. Thus, the above example might be rewritten:

 
AC_LIBSOURCES([foo.c, bar.c])
AC_LIBOBJ([$foo_or_bar])
Macro: AC_CONFIG_LIBOBJ_DIR (directory)

Specify that AC_LIBOBJ replacement files are to be found in directory, a name relative to the top level of the source tree. The replacement directory defaults to `.', the top level directory, and the most typical value is `lib', corresponding to `AC_CONFIG_LIBOBJ_DIR([lib])'.

configure might need to know the replacement directory for the following reasons: (i) some checks use the replacement files, (ii) some macros bypass broken system headers by installing links to the replacement headers (iii) when used in conjunction with Automake, within each makefile, directory is used as a relative path from $(top_srcdir) to each object named in LIBOBJS and LTLIBOBJS, etc.


It is common to merely check for the existence of a function, and ask for its AC_LIBOBJ replacement if missing. The following macro is a convenient shorthand.

Macro: AC_REPLACE_FUNCS (function…)

Like AC_CHECK_FUNCS, but uses `AC_LIBOBJ(function)' as action-if-not-found. You can declare your replacement function by enclosing the prototype in `#ifndef HAVE_function'. If the system has the function, it probably declares it in a header file you should be including, so you shouldn't redeclare it lest your declaration conflict.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6 Header Files

The following macros check for the presence of certain C header files. If there is no macro specifically defined to check for a header file you need, and you don't need to check for any special properties of it, then you can use one of the general header-file check macros.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.1 Portability of Headers

This section tries to collect knowledge about common headers, and the problems they cause. By definition, this list always requires additions. Please help us keeping it as complete as possible.

`limits.h'

C99 says that `limits.h' defines LLONG_MIN, LLONG_MAX, and ULLONG_MAX, but many almost-C99 environments (e.g., default GCC 4.0.2 + glibc 2.4) do not define them.

`inttypes.h' vs. `stdint.h'

The C99 standard says that `inttypes.h' includes `stdint.h', so there's no need to include `stdint.h' separately in a standard environment. Some implementations have `inttypes.h' but not `stdint.h' (e.g., Solaris 7), but we don't know of any implementation that has `stdint.h' but not `inttypes.h'.

`linux/irda.h'

It requires `linux/types.h' and `sys/socket.h'.

`linux/random.h'

It requires `linux/types.h'.

`net/if.h'

On Darwin, this file requires that `sys/socket.h' be included beforehand. One should run:

 
AC_CHECK_HEADERS([sys/socket.h])
AC_CHECK_HEADERS([net/if.h], [], [],
[#include <stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
])
`netinet/if_ether.h'

On Darwin, this file requires that `stdio.h' and `sys/socket.h' be included beforehand. One should run:

 
AC_CHECK_HEADERS([sys/socket.h])
AC_CHECK_HEADERS([netinet/if_ether.h], [], [],
[#include <stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
])
`stdint.h'

See above, item `inttypes.h' vs. `stdint.h'.

`stdlib.h'

On many systems (e.g., Darwin), `stdio.h' is a prerequisite.

`sys/mount.h'

On FreeBSD 4.8 on ia32 and using gcc version 2.95.4, `sys/params.h' is a prerequisite.

`sys/ptem.h'

On Solaris 8, `sys/stream.h' is a prerequisite.

`sys/socket.h'

On Darwin, `stdlib.h' is a prerequisite.

`sys/ucred.h'

On Tru64 5.1, `sys/types.h' is a prerequisite.

`X11/extensions/scrnsaver.h'

Using XFree86, this header requires `X11/Xlib.h', which is probably so required that you might not even consider looking for it.

 
AC_CHECK_HEADERS([X11/extensions/scrnsaver.h], [], [],
[[#include <X11/Xlib.h>
]])

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.2 Particular Header Checks

These macros check for particular system header files--whether they exist, and in some cases whether they declare certain symbols.

Macro: AC_HEADER_ASSERT

Check whether to enable assertions in the style of `assert.h'. Assertions are enabled by default, but the user can override this by invoking configure with the `--disable-assert' option.

Macro: AC_HEADER_DIRENT

Check for the following header files. For the first one that is found and defines `DIR', define the listed C preprocessor macro:

`dirent.h'

HAVE_DIRENT_H

`sys/ndir.h'

HAVE_SYS_NDIR_H

`sys/dir.h'

HAVE_SYS_DIR_H

`ndir.h'

HAVE_NDIR_H

The directory-library declarations in your source code should look something like the following:

 
#include <sys/types.h>
#ifdef HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen ((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) ((dirent)->d_namlen)
# ifdef HAVE_SYS_NDIR_H
#  include <sys/ndir.h>
# endif
# ifdef HAVE_SYS_DIR_H
#  include <sys/dir.h>
# endif
# ifdef HAVE_NDIR_H
#  include <ndir.h>
# endif
#endif

Using the above declarations, the program would declare variables to be of type struct dirent, not struct direct, and would access the length of a directory entry name by passing a pointer to a struct dirent to the NAMLEN macro.

This macro also checks for the SCO Xenix `dir' and `x' libraries.

This macro is obsolescent, as all current systems with directory libraries have <dirent.h>. New programs need not use this macro.

Also see AC_STRUCT_DIRENT_D_INO and AC_STRUCT_DIRENT_D_TYPE (see section Particular Structure Checks).

Macro: AC_HEADER_MAJOR

If `sys/types.h' does not define major, minor, and makedev, but `sys/mkdev.h' does, define MAJOR_IN_MKDEV; otherwise, if `sys/sysmacros.h' does, define MAJOR_IN_SYSMACROS.

Macro: AC_HEADER_RESOLV

Checks for header `resolv.h', checking for prerequisites first. To properly use `resolv.h', your code should contain something like the following:

#ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#  include <netinet/in.h>   /* inet_ functions / structs */
#endif
#ifdef HAVE_ARPA_NAMESER_H
#  include <arpa/nameser.h> /* DNS HEADER struct */
#endif
#ifdef HAVE_NETDB_H
#  include <netdb.h>
#endif
#include <resolv.h>

Macro: AC_HEADER_STAT

If the macros S_ISDIR, S_ISREG, etc. defined in `sys/stat.h' do not work properly (returning false positives), define STAT_MACROS_BROKEN. This is the case on Tektronix UTekV, Amdahl UTS and Motorola System V/88.

This macro is obsolescent, as no current systems have the bug. New programs need not use this macro.

Macro: AC_HEADER_STDBOOL

If `stdbool.h' exists and conforms to C99, define HAVE_STDBOOL_H to 1; if the type _Bool is defined, define HAVE__BOOL to 1. To fulfill the C99 requirements, your `system.h' could contain the following code:

#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#else
# ifndef HAVE__BOOL
#  ifdef __cplusplus
typedef bool _Bool;
#  else
#   define _Bool signed char
#  endif
# endif
# define bool _Bool
# define false 0
# define true 1
# define __bool_true_false_are_defined 1
#endif

Alternatively you can use the `stdbool' package of Gnulib (see section Gnulib); it packages the above code into a replacement header and contains a few other bells and whistles.

This macro caches its result in the ac_cv_header_stdbool_h variable.

Macro: AC_HEADER_STDC

Define STDC_HEADERS if the system has C header files conforming to ANSI C89 (ISO C90). Specifically, this macro checks for `stdlib.h', `stdarg.h', `string.h', and `float.h'; if the system has those, it probably has the rest of the C89 header files. This macro also checks whether `string.h' declares memchr (and thus presumably the other mem functions), whether `stdlib.h' declare free (and thus presumably malloc and other related functions), and whether the `ctype.h' macros work on characters with the high bit set, as the C standard requires.

If you use this macro, your code can refer to STDC_HEADERS to determine whether the system has conforming header files (and probably C library functions).

This macro caches its result in the ac_cv_header_stdc variable.

This macro is obsolescent, as current systems have conforming header files. New programs need not use this macro.

Nowadays `string.h' is part of the C standard and declares functions like strcpy, and `strings.h' is standardized by Posix and declares BSD functions like bcopy; but historically, string functions were a major sticking point in this area. If you still want to worry about portability to ancient systems without standard headers, there is so much variation that it is probably easier to declare the functions you use than to figure out exactly what the system header files declare. Some ancient systems contained a mix of functions from the C standard and from BSD; some were mostly standard but lacked `memmove'; some defined the BSD functions as macros in `string.h' or `strings.h'; some had only the BSD functions but `string.h'; some declared the memory functions in `memory.h', some in `string.h'; etc. It is probably sufficient to check for one string function and one memory function; if the library had the standard versions of those then it probably had most of the others. If you put the following in `configure.ac':

 
# This example is obsolescent.
# Nowadays you can omit these macro calls.
AC_HEADER_STDC
AC_CHECK_FUNCS([strchr memcpy])

then, in your code, you can use declarations like this:

 
/* This example is obsolescent.
   Nowadays you can just #include <string.h>.  */
#ifdef STDC_HEADERS
# include <string.h>
#else
# ifndef HAVE_STRCHR
#  define strchr index
#  define strrchr rindex
# endif
char *strchr (), *strrchr ();
# ifndef HAVE_MEMCPY
#  define memcpy(d, s, n) bcopy ((s), (d), (n))
#  define memmove(d, s, n) bcopy ((s), (d), (n))
# endif
#endif

If you use a function like memchr, memset, strtok, or strspn, which have no BSD equivalent, then macros don't suffice to port to ancient hosts; you must provide an implementation of each function. An easy way to incorporate your implementations only when needed (since the ones in system C libraries may be hand optimized) is to, taking memchr for example, put it in `memchr.c' and use `AC_REPLACE_FUNCS([memchr])'.

Macro: AC_HEADER_SYS_WAIT

If `sys/wait.h' exists and is compatible with Posix, define HAVE_SYS_WAIT_H. Incompatibility can occur if `sys/wait.h' does not exist, or if it uses the old BSD union wait instead of int to store a status value. If `sys/wait.h' is not Posix compatible, then instead of including it, define the Posix macros with their usual interpretations. Here is an example:

 
#include <sys/types.h>
#ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h>
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
#endif
#ifndef WIFEXITED
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
#endif

This macro caches its result in the ac_cv_header_sys_wait_h variable.

This macro is obsolescent, as current systems are compatible with Posix. New programs need not use this macro.

_POSIX_VERSION is defined when `unistd.h' is included on Posix systems. If there is no `unistd.h', it is definitely not a Posix system. However, some non-Posix systems do have `unistd.h'.

The way to check whether the system supports Posix is:

 
#ifdef HAVE_UNISTD_H
# include <sys/types.h>
# include <unistd.h>
#endif

#ifdef _POSIX_VERSION
/* Code for Posix systems.  */
#endif

Macro: AC_HEADER_TIME

If a program may include both `time.h' and `sys/time.h', define TIME_WITH_SYS_TIME. On some ancient systems, `sys/time.h' included `time.h', but `time.h' was not protected against multiple inclusion, so programs could not explicitly include both files. This macro is useful in programs that use, for example, struct timeval as well as struct tm. It is best used in conjunction with HAVE_SYS_TIME_H, which can be checked for using AC_CHECK_HEADERS([sys/time.h]).

 
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

This macro caches its result in the ac_cv_header_time variable.

This macro is obsolescent, as current systems can include both files when they exist. New programs need not use this macro.

Macro: AC_HEADER_TIOCGWINSZ

If the use of TIOCGWINSZ requires `<sys/ioctl.h>', then define GWINSZ_IN_SYS_IOCTL. Otherwise TIOCGWINSZ can be found in `<termios.h>'.

Use:

 
#ifdef HAVE_TERMIOS_H
# include <termios.h>
#endif

#ifdef GWINSZ_IN_SYS_IOCTL
# include <sys/ioctl.h>
#endif

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.3 Generic Header Checks

These macros are used to find system header files not covered by the "particular" test macros. If you need to check the contents of a header as well as find out whether it is present, you have to write your own test for it (see section Writing Tests).

Macro: AC_CHECK_HEADER (header-file, [action-if-found]@c,   [action-if-not-found]@c, [includes]@c)

If the system header file header-file is compilable, execute shell commands action-if-found, otherwise execute action-if-not-found. If you just want to define a symbol if the header file is available, consider using AC_CHECK_HEADERS instead.

includes is decoded to determine the appropriate include directives. If omitted or empty, `configure' will check for both header existence (with the preprocessor) and usability (with the compiler), using AC_INCLUDES_DEFAULT for the compile test. If there is a discrepancy between the results, a warning is issued to the user, and the compiler results are favored (see section Header Present But Cannot Be Compiled). In general, favoring the compiler results means that a header will be treated as not found even though the file exists, because you did not provide enough prerequisites.

Providing a non-empty includes argument allows the code to provide any prerequisites prior to including the header under test; it is common to use the argument AC_INCLUDES_DEFAULT (see section Default Includes). With an explicit fourth argument, no preprocessor test is needed. As a special case, an includes of exactly `-' triggers the older preprocessor check, which merely determines existence of the file in the preprocessor search path; this should only be used as a last resort (it is safer to determine the actual prerequisites and perform a compiler check, or else use AC_PREPROC_IFELSE to make it obvious that only a preprocessor check is desired).

This macro caches its result in the ac_cv_header_header-file variable, with characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_HEADERS (header-file…,   [action-if-found]@c, [action-if-not-found]@c,   [includes]@c)

For each given system header file header-file in the blank-separated argument list that exists, define HAVE_header-file (in all capitals). If action-if-found is given, it is additional shell code to execute when one of the header files is found. You can give it a value of `break' to break out of the loop on the first match. If action-if-not-found is given, it is executed when one of the header files is not found.

includes is interpreted as in AC_CHECK_HEADER, in order to choose the set of preprocessor directives supplied before the header under test.

This macro caches its result in the ac_cv_header_header-file variable, with characters not suitable for a variable name mapped to underscores.

Previous versions of Autoconf merely checked whether the header was accepted by the preprocessor. This was changed because the old test was inappropriate for typical uses. Headers are typically used to compile, not merely to preprocess, and the old behavior sometimes accepted headers that clashed at compile-time (see section Header Present But Cannot Be Compiled). If you need to check whether a header is preprocessable, you can use AC_PREPROC_IFELSE (see section Running the Preprocessor).

Actually requiring a header to compile improves the robustness of the test, but it also requires that you make sure that headers that must be included before the header-file be part of the includes, (see section Default Includes). If looking for `bar.h', which requires that `foo.h' be included before if it exists, we suggest the following scheme:

AC_CHECK_HEADERS([foo.h])
AC_CHECK_HEADERS([bar.h], [], [],
[#ifdef HAVE_FOO_H
# include <foo.h>
#endif
])

The following variant generates smaller, faster configure files if you do not need the full power of AC_CHECK_HEADERS.

Macro: AC_CHECK_HEADERS_ONCE (header-file…)

For each given system header file header-file in the blank-separated argument list that exists, define HAVE_header-file (in all capitals). This is a once-only variant of AC_CHECK_HEADERS. It generates the checking code at most once, so that configure is smaller and faster; but the checks cannot be conditionalized and are always done once, early during the configure run. Thus, this macro is only safe for checking headers that do not have prerequisites beyond what AC_INCLUDES_DEFAULT provides.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.7 Declarations

The following macros check for the declaration of variables and functions. If there is no macro specifically defined to check for a symbol you need, then you can use the general macros (see section Generic Declaration Checks) or, for more complex tests, you may use AC_COMPILE_IFELSE (see section Running the Compiler).


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.7.1 Particular Declaration Checks

There are no specific macros for declarations.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.7.2 Generic Declaration Checks

These macros are used to find declarations not covered by the "particular" test macros.

Macro: AC_CHECK_DECL (symbol, [action-if-found]@c,   [action-if-not-found]@c, [includes = `AC_INCLUDES_DEFAULT']@c)

If symbol (a function, variable, or constant) is not declared in includes and a declaration is needed, run the shell commands action-if-not-found, otherwise action-if-found. includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see section Default Includes), which are used prior to the declaration under test.

This macro actually tests whether symbol is defined as a macro or can be used as an r-value, not whether it is really declared, because it is much safer to avoid introducing extra declarations when they are not needed.

This macro caches its result in the ac_cv_have_decl_symbol variable, with characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_DECLS (symbols, [action-if-found]@c,   [action-if-not-found]@c, [includes = `AC_INCLUDES_DEFAULT']@c)

For each of the symbols (comma-separated list), define HAVE_DECL_symbol (in all capitals) to `1' if symbol is declared, otherwise to `0'. If action-if-not-found is given, it is additional shell code to execute when one of the function declarations is needed, otherwise action-if-found is executed.

includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see section Default Includes), which are used prior to the declarations under test.

This macro uses an M4 list as first argument:

 
AC_CHECK_DECLS([strdup])
AC_CHECK_DECLS([strlen])
AC_CHECK_DECLS([malloc, realloc, calloc, free])
AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])

Unlike the other `AC_CHECK_*S' macros, when a symbol is not declared, HAVE_DECL_symbol is defined to `0' instead of leaving HAVE_DECL_symbol undeclared. When you are sure that the check was performed, use HAVE_DECL_symbol in #if:

 
#if !HAVE_DECL_SYMBOL
extern char *symbol;
#endif

If the test may have not been performed, however, because it is safer not to declare a symbol than to use a declaration that conflicts with the system's one, you should use:

 
#if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
void *malloc (size_t *s);
#endif

You fall into the second category only in extreme situations: either your files may be used without being configured, or they are used during the configuration. In most cases the traditional approach is enough.

This macro caches its results in ac_cv_have_decl_symbol variables, with characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_DECLS_ONCE (symbols)

For each of the symbols (comma-separated list), define HAVE_DECL_symbol (in all capitals) to `1' if symbol is declared in the default include files, otherwise to `0'. This is a once-only variant of AC_CHECK_DECLS. It generates the checking code at most once, so that configure is smaller and faster; but the checks cannot be conditionalized and are always done once, early during the configure run.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.8 Structures

The following macros check for the presence of certain members in C structures. If there is no macro specifically defined to check for a member you need, then you can use the general structure-member macros (see section Generic Structure Checks) or, for more complex tests, you may use AC_COMPILE_IFELSE (see section Running the Compiler).


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.8.1 Particular Structure Checks

The following macros check for certain structures or structure members.

Macro: AC_STRUCT_DIRENT_D_INO

Perform all the actions of AC_HEADER_DIRENT (see section Particular Header Checks). Then, if struct dirent contains a d_ino member, define HAVE_STRUCT_DIRENT_D_INO.

HAVE_STRUCT_DIRENT_D_INO indicates only the presence of d_ino, not whether its contents are always reliable. Traditionally, a zero d_ino indicated a deleted directory entry, though current systems hide this detail from the user and never return zero d_ino values. Many current systems report an incorrect d_ino for a directory entry that is a mount point.

Macro: AC_STRUCT_DIRENT_D_TYPE

Perform all the actions of AC_HEADER_DIRENT (see section Particular Header Checks). Then, if struct dirent contains a d_type member, define HAVE_STRUCT_DIRENT_D_TYPE.

Macro: AC_STRUCT_ST_BLOCKS

If struct stat contains an st_blocks member, define HAVE_STRUCT_STAT_ST_BLOCKS. Otherwise, require an AC_LIBOBJ replacement of `fileblocks'. The former name, HAVE_ST_BLOCKS is to be avoided, as its support will cease in the future.

This macro caches its result in the ac_cv_member_struct_stat_st_blocks variable.

Macro: AC_STRUCT_TM

If `time.h' does not define struct tm, define TM_IN_SYS_TIME, which means that including `sys/time.h' had better define struct tm.

This macro is obsolescent, as `time.h' defines struct tm in current systems. New programs need not use this macro.

Macro: AC_STRUCT_TIMEZONE

Figure out how to get the current timezone. If struct tm has a tm_zone member, define HAVE_STRUCT_TM_TM_ZONE (and the obsoleted HAVE_TM_ZONE). Otherwise, if the external array tzname is found, define HAVE_TZNAME; if it is declared, define HAVE_DECL_TZNAME.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.8.2 Generic Structure Checks

These macros are used to find structure members not covered by the "particular" test macros.

Macro: AC_CHECK_MEMBER (aggregate.member,   [action-if-found]@c, [action-if-not-found]@c,   [includes = `AC_INCLUDES_DEFAULT']@c)

Check whether member is a member of the aggregate aggregate. If no includes are specified, the default includes are used (see section Default Includes).

 
AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
                [AC_MSG_ERROR([We need `passwd.pw_gecos'!])],
                [[#include <pwd.h>]])

You can use this macro for submembers:

 
AC_CHECK_MEMBER(struct top.middle.bot)

This macro caches its result in the av_cv_member_aggregate_member variable, with characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_MEMBERS (members, [action-if-found]@c,   [action-if-not-found]@c, [includes = `AC_INCLUDES_DEFAULT']@c)

Check for the existence of each `aggregate.member' of members using the previous macro. When member belongs to aggregate, define HAVE_aggregate_member (in all capitals, with spaces and dots replaced by underscores). If action-if-found is given, it is executed for each of the found members. If action-if-not-found is given, it is executed for each of the members that could not be found.

includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see section Default Includes), which are used prior to the members under test.

This macro uses M4 lists:

 
AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9 Types

The following macros check for C types, either builtin or typedefs. If there is no macro specifically defined to check for a type you need, and you don't need to check for any special properties of it, then you can use a general type-check macro.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.1 Particular Type Checks

These macros check for particular C types in `sys/types.h', `stdlib.h', `stdint.h', `inttypes.h' and others, if they exist.

The Gnulib stdint module is an alternate way to define many of these symbols; it is useful if you prefer your code to assume a C99-or-better environment. See section Gnulib.

Macro: AC_TYPE_GETGROUPS

Define GETGROUPS_T to be whichever of gid_t or int is the base type of the array argument to getgroups.

This macro caches the base type in the ac_cv_type_getgroups variable.

Macro: AC_TYPE_INT8_T

If `stdint.h' or `inttypes.h' does not define the type int8_t, define int8_t to a signed integer type that is exactly 8 bits wide and that uses two's complement representation, if such a type exists. If you are worried about porting to hosts that lack such a type, you can use the results of this macro in C89-or-later code as follows:

 
#if HAVE_STDINT_H
# include <stdint.h>
#endif
#if defined INT8_MAX || defined int8_t
 code using int8_t
#else
 complicated alternative using >8-bit 'signed char'
#endif

This macro caches the type in the ac_cv_c_int8_t variable.

Macro: AC_TYPE_INT16_T

This is like AC_TYPE_INT8_T, except for 16-bit integers.

Macro: AC_TYPE_INT32_T

This is like AC_TYPE_INT8_T, except for 32-bit integers.

Macro: AC_TYPE_INT64_T

This is like AC_TYPE_INT8_T, except for 64-bit integers.

Macro: AC_TYPE_INTMAX_T

If `stdint.h' or `inttypes.h' defines the type intmax_t, define HAVE_INTMAX_T. Otherwise, define intmax_t to the widest signed integer type.

Macro: AC_TYPE_INTPTR_T

If `stdint.h' or `inttypes.h' defines the type intptr_t, define HAVE_INTPTR_T. Otherwise, define intptr_t to a signed integer type wide enough to hold a pointer, if such a type exists.

Macro: AC_TYPE_LONG_DOUBLE

If the C compiler supports a working long double type, define HAVE_LONG_DOUBLE. The long double type might have the same range and precision as double.

This macro caches its result in the ac_cv_type_long_double variable.

This macro is obsolescent, as current C compilers support long double. New programs need not use this macro.

Macro: AC_TYPE_LONG_DOUBLE_WIDER

If the C compiler supports a working long double type with more range or precision than the double type, define HAVE_LONG_DOUBLE_WIDER.

This macro caches its result in the ac_cv_type_long_double_wider variable.

Macro: AC_TYPE_LONG_LONG_INT

If the C compiler supports a working long long int type, define HAVE_LONG_LONG_INT. However, this test does not test long long int values in preprocessor #if expressions, because too many compilers mishandle such expressions. See section Preprocessor Arithmetic.

This macro caches its result in the ac_cv_type_long_long_int variable.

Macro: AC_TYPE_MBSTATE_T

Define HAVE_MBSTATE_T if <wchar.h> declares the mbstate_t type. Also, define mbstate_t to be a type if <wchar.h> does not declare it.

This macro caches its result in the ac_cv_type_mbstate_t variable.

Macro: AC_TYPE_MODE_T

Define mode_t to a suitable type, if standard headers do not define it.

This macro caches its result in the ac_cv_type_mode_t variable.

Macro: AC_TYPE_OFF_T

Define off_t to a suitable type, if standard headers do not define it.

This macro caches its result in the ac_cv_type_off_t variable.

Macro: AC_TYPE_PID_T

Define pid_t to a suitable type, if standard headers do not define it.

This macro caches its result in the ac_cv_type_pid_t variable.

Macro: AC_TYPE_SIZE_T

Define size_t to a suitable type, if standard headers do not define it.

This macro caches its result in the ac_cv_type_size_t variable.

Macro: AC_TYPE_SSIZE_T

Define ssize_t to a suitable type, if standard headers do not define it.

This macro caches its result in the ac_cv_type_ssize_t variable.

Macro: AC_TYPE_UID_T

Define uid_t and gid_t to suitable types, if standard headers do not define them.

This macro caches its result in the ac_cv_type_uid_t variable.

Macro: AC_TYPE_UINT8_T

If `stdint.h' or `inttypes.h' does not define the type uint8_t, define uint8_t to an unsigned integer type that is exactly 8 bits wide, if such a type exists. This is like AC_TYPE_INT8_T, except for unsigned integers.

Macro: AC_TYPE_UINT16_T

This is like AC_TYPE_UINT8_T, except for 16-bit integers.

Macro: AC_TYPE_UINT32_T

This is like AC_TYPE_UINT8_T, except for 32-bit integers.

Macro: AC_TYPE_UINT64_T

This is like AC_TYPE_UINT8_T, except for 64-bit integers.

Macro: AC_TYPE_UINTMAX_T

If `stdint.h' or `inttypes.h' defines the type uintmax_t, define HAVE_UINTMAX_T. Otherwise, define uintmax_t to the widest unsigned integer type.

Macro: AC_TYPE_UINTPTR_T

If `stdint.h' or `inttypes.h' defines the type uintptr_t, define HAVE_UINTPTR_T. Otherwise, define uintptr_t to an unsigned integer type wide enough to hold a pointer, if such a type exists.

Macro: AC_TYPE_UNSIGNED_LONG_LONG_INT

If the C compiler supports a working unsigned long long int type, define HAVE_UNSIGNED_LONG_LONG_INT. However, this test does not test unsigned long long int values in preprocessor #if expressions, because too many compilers mishandle such expressions. See section Preprocessor Arithmetic.

This macro caches its result in the ac_cv_type_unsigned_long_long_int variable.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.2 Generic Type Checks

These macros are used to check for types not covered by the "particular" test macros.

Macro: AC_CHECK_TYPE (type, [action-if-found]@c,   [action-if-not-found]@c, [includes = `AC_INCLUDES_DEFAULT']@c)

Check whether type is defined. It may be a compiler builtin type or defined by the includes. includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see section Default Includes), which are used prior to the type under test.

In C, type must be a type-name, so that the expression `sizeof (type)' is valid (but `sizeof ((type))' is not). The same test is applied when compiling for C++, which means that in C++ type should be a type-id and should not be an anonymous `struct' or `union'.

This macro caches its result in the ac_cv_type_type variable, with `*' mapped to `p' and other characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_TYPES (types, [action-if-found]@c,   [action-if-not-found]@c, [includes = `AC_INCLUDES_DEFAULT']@c)

For each type of the types that is defined, define HAVE_type (in all capitals). Each type must follow the rules of AC_CHECK_TYPE. If no includes are specified, the default includes are used (see section Default Includes). If action-if-found is given, it is additional shell code to execute when one of the types is found. If action-if-not-found is given, it is executed when one of the types is not found.

This macro uses M4 lists:

 
AC_CHECK_TYPES([ptrdiff_t])
AC_CHECK_TYPES([unsigned long long int, uintmax_t])
AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])

Autoconf, up to 2.13, used to provide to another version of AC_CHECK_TYPE, broken by design. In order to keep backward compatibility, a simple heuristic, quite safe but not totally, is implemented. In case of doubt, read the documentation of the former AC_CHECK_TYPE, see Obsolete Macros.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10 Compilers and Preprocessors

All the tests for compilers (AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77) define the output variable EXEEXT based on the output of the compiler, typically to the empty string if Posix and `.exe' if a DOS variant.

They also define the output variable OBJEXT based on the output of the compiler, after `.c' files have been excluded, typically to `o' if Posix, `obj' if a DOS variant.

If the compiler being used does not produce executables, the tests fail. If the executables can't be run, and cross-compilation is not enabled, they fail too. See section Manual Configuration, for more on support for cross compiling.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.1 Specific Compiler Characteristics

Some compilers exhibit different behaviors.

Static/Dynamic Expressions

Autoconf relies on a trick to extract one bit of information from the C compiler: using negative array sizes. For instance the following excerpt of a C source demonstrates how to test whether `int' objects are 4 bytes wide:

 
static int test_array[sizeof (int) == 4 ? 1 : -1];

To our knowledge, there is a single compiler that does not support this trick: the HP C compilers (the real ones, not only the "bundled") on HP-UX 11.00. They incorrectly reject the above program with the diagnostic "Variable-length arrays cannot have static storage." This bug comes from HP compilers' mishandling of sizeof (int), not from the ? 1 : -1, and Autoconf works around this problem by casting sizeof (int) to long int before comparing it.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.2 Generic Compiler Characteristics

Macro: AC_CHECK_SIZEOF (type-or-expr, [unused]@c,   [includes = `AC_INCLUDES_DEFAULT']@c)

Define SIZEOF_type-or-expr (see section Standard Symbols) to be the size in bytes of type-or-expr, which may be either a type or an expression returning a value that has a size. If the expression `sizeof (type-or-expr)' is invalid, the result is 0. includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see section Default Includes), which are used prior to the expression under test.

This macro now works even when cross-compiling. The unused argument was used when cross-compiling.

For example, the call

 
AC_CHECK_SIZEOF([int *])

defines SIZEOF_INT_P to be 8 on DEC Alpha AXP systems.

This macro caches its result in the ac_cv_sizeof_type-or-expr variable, with `*' mapped to `p' and other characters not suitable for a variable name mapped to underscores.

Macro: AC_CHECK_ALIGNOF (type, [includes = `AC_INCLUDES_DEFAULT']@c)

Define ALIGNOF_type (see section Standard Symbols) to be the alignment in bytes of type. `type y;' must be valid as a structure member declaration. If `type' is unknown, the result is 0. If no includes are specified, the default includes are used (see section Default Includes).

This macro caches its result in the ac_cv_alignof_type-or-expr variable, with `*' mapped to `p' and other characters not suitable for a variable name mapped to underscores.

Macro: AC_COMPUTE_INT (var, expression,   [includes = `AC_INCLUDES_DEFAULT']@c, [action-if-fails]@c)

Store into the shell variable var the value of the integer expression. The value should fit in an initializer in a C variable of type signed long. To support cross compilation (in which case, the macro only works on hosts that use twos-complement arithmetic), it should be possible to evaluate the expression at compile-time. If no includes are specified, the default includes are used (see section Default Includes).

Execute action-if-fails if the value cannot be determined correctly.

Macro: AC_LANG_WERROR

Normally Autoconf ignores warnings generated by the compiler, linker, and preprocessor. If this macro is used, warnings count as fatal errors for the current language. This macro is useful when the results of configuration are used where warnings are unacceptable; for instance, if parts of a program are built with the GCC `-Werror' option. If the whole program is built using `-Werror' it is often simpler to put `-Werror' in the compiler flags (CFLAGS, etc.).

Macro: AC_OPENMP

OpenMP (http://www.openmp.org/) specifies extensions of C, C++, and Fortran that simplify optimization of shared memory parallelism, which is a common problem on multicore CPUs.

If the current language is C, the macro AC_OPENMP sets the variable OPENMP_CFLAGS to the C compiler flags needed for supporting OpenMP. OPENMP_CFLAGS is set to empty if the compiler already supports OpenMP, if it has no way to activate OpenMP support, or if the user rejects OpenMP support by invoking `configure' with the `--disable-openmp' option.

OPENMP_CFLAGS needs to be used when compiling programs, when preprocessing program source, and when linking programs. Therefore you need to add $(OPENMP_CFLAGS) to the CFLAGS of C programs that use OpenMP. If you preprocess OpenMP-specific C code, you also need to add $(OPENMP_CFLAGS) to CPPFLAGS. The presence of OpenMP support is revealed at compile time by the preprocessor macro _OPENMP.

Linking a program with OPENMP_CFLAGS typically adds one more shared library to the program's dependencies, so its use is recommended only on programs that actually require OpenMP.

If the current language is C++, AC_OPENMP sets the variable OPENMP_CXXFLAGS, suitably for the C++ compiler. The same remarks hold as for C.

If the current language is Fortran 77 or Fortran, AC_OPENMP sets the variable OPENMP_FFLAGS or OPENMP_FCFLAGS, respectively. Similar remarks as for C hold, except that CPPFLAGS is not used for Fortran, and no preprocessor macro signals OpenMP support.

For portability, it is best to avoid spaces between `#' and `pragma omp'. That is, write `#pragma omp', not `# pragma omp'. The Sun WorkShop 6.2 C compiler chokes on the latter.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.3 C Compiler Characteristics

The following macros provide ways to find and exercise a C Compiler. There are a few constructs that ought to be avoided, but do not deserve being checked for, since they can easily be worked around.

Don't use lines containing solitary backslashes

They tickle a bug in the HP-UX C compiler (checked on HP-UX 10.20, 11.00, and 11i). When given the following source:

 
#ifdef __STDC__
/\
* A comment with backslash-newlines in it.  %{ %} *\
\
/
char str[] = "\\
" A string with backslash-newlines in it %{ %} \\
"";
char apostrophe = '\\
\
'\
';
#endif

the compiler incorrectly fails with the diagnostics "Non-terminating comment at end of file" and "Missing `#endif' at end of file." Removing the lines with solitary backslashes solves the problem.

Don't compile several files at once if output matters to you

Some compilers, such as HP's, report names of files being compiled when given more than one file operand. For instance:

 
$ cc a.c b.c
a.c:
b.c:

This can cause problems if you observe the output of the compiler to detect failures. Invoking `cc -c a.c && cc -c b.c && cc -o c a.o b.o' solves the issue.

Don't rely on #error failing

The IRIX C compiler does not fail when #error is preprocessed; it simply emits a diagnostic and continues, exiting successfully. So, instead of an error directive like #error "Unsupported word size" it is more portable to use an invalid directive like #Unsupported word size in Autoconf tests. In ordinary source code, #error is OK, since installers with inadequate compilers like IRIX can simply examine these compilers' diagnostic output.

Don't rely on correct #line support

On Solaris, c89 (at least Sun C 5.3 through 5.8) diagnoses #line directives whose line numbers are greater than 32767. Nothing in Posix makes this invalid. That is why Autoconf stopped issuing #line directives.

Macro: AC_PROG_CC ([compiler-search-list]@c)

Determine a C compiler to use. If CC is not already set in the environment, check for gcc and cc, then for other C compilers. Set output variable CC to the name of the compiler found.

This macro may, however, be invoked with an optional first argument which, if specified, must be a blank-separated list of C compilers to search for. This just gives the user an opportunity to specify an alternative search list for the C compiler. For example, if you didn't like the default order, then you could invoke AC_PROG_CC like this:

 
AC_PROG_CC([gcc cl cc])

If the C compiler does not handle function prototypes correctly by default, try to add an option to output variable CC to make it so. This macro tries various options that select standard-conformance modes on various systems.

After calling this macro you can check whether the C compiler has been set to accept ANSI C89 (ISO C90); if not, the shell variable ac_cv_prog_cc_c89 is set to `no'. See also AC_C_PROTOTYPES below.

If using the GNU C compiler, set shell variable GCC to `yes'. If output variable CFLAGS was not already set, set it to `-g -O2' for the GNU C compiler (`-O2' on systems where GCC does not accept `-g'), or `-g' for other compilers.

Many Autoconf macros use a compiler, and thus call `AC_REQUIRE([AC_PROG_CC])' to ensure that the compiler has been determined before the body of the outermost AC_DEFUN macro. Although AC_PROG_CC is safe to directly expand multiple times, it performs certain checks (such as the proper value of EXEEXT) only on the first invocation. Therefore, care must be used when invoking this macro from within another macro rather than at the top level (see section Expanded Before Required).

Macro: AC_PROG_CC_C_O

If the C compiler does not accept the `-c' and `-o' options simultaneously, define NO_MINUS_C_MINUS_O. This macro actually tests both the compiler found by AC_PROG_CC, and, if different, the first cc in the path. The test fails if one fails. This macro was created for GNU Make to choose the default C compilation rule.

For the compiler compiler, this macro caches its result in the ac_cv_prog_cc_compiler_c_o variable.

Macro: AC_PROG_CPP

Set output variable CPP to a command that runs the C preprocessor. If `$CC -E' doesn't work, `/lib/cpp' is used. It is only portable to run CPP on files with a `.c' extension.

Some preprocessors don't indicate missing include files by the error status. For such preprocessors an internal variable is set that causes other macros to check the standard error from the preprocessor and consider the test failed if any warnings have been reported. For most preprocessors, though, warnings do not cause include-file tests to fail unless AC_PROG_CPP_WERROR is also specified.

Macro: AC_PROG_CPP_WERROR

This acts like AC_PROG_CPP, except it treats warnings from the preprocessor as errors even if the preprocessor exit status indicates success. This is useful for avoiding headers that generate mandatory warnings, such as deprecation notices.

The following macros check for C compiler or machine architecture features. To check for characteristics not listed here, use AC_COMPILE_IFELSE (see section Running the Compiler) or AC_RUN_IFELSE (see section Checking Runtime Behavior).

Macro: AC_PROG_CC_STDC

If the C compiler cannot compile ISO Standard C (currently C99), try to add an option to output variable CC to make it work. If the compiler does not support C99, fall back to supporting ANSI C89 (ISO C90).

After calling this macro you can check whether the C compiler has been set to accept Standard C; if not, the shell variable ac_cv_prog_cc_stdc is set to `no'.

Macro: AC_PROG_CC_C89

If the C compiler is not in ANSI C89 (ISO C90) mode by default, try to add an option to output variable CC to make it so. This macro tries various options that select ANSI C89 on some system or another, preferring extended functionality modes over strict conformance modes. It considers the compiler to be in ANSI C89 mode if it handles function prototypes correctly.

After calling this macro you can check whether the C compiler has been set to accept ANSI C89; if not, the shell variable ac_cv_prog_cc_c89 is set to `no'.

This macro is called automatically by AC_PROG_CC.

Macro: AC_PROG_CC_C99

If the C compiler is not in C99 mode by default, try to add an option to output variable CC to make it so. This macro tries various options that select C99 on some system or another, preferring extended functionality modes over strict conformance modes. It considers the compiler to be in C99 mode if it handles _Bool, // comments, flexible array members, inline, signed and unsigned long long int, mixed code and declarations, named initialization of structs, restrict, va_copy, varargs macros, variable declarations in for loops, and variable length arrays.

After calling this macro you can check whether the C compiler has been set to accept C99; if not, the shell variable ac_cv_prog_cc_c99 is set to `no'.

Macro: AC_C_BACKSLASH_A

Define `HAVE_C_BACKSLASH_A' to 1 if the C compiler understands `\a'.

This macro is obsolescent, as current C compilers understand `\a'. New programs need not use this macro.

Macro: AC_C_BIGENDIAN ([action-if-true]@c, [action-if-false]@c,   [action-if-unknown]@c, [action-if-universal]@c)

If words are stored with the most significant byte first (like Motorola and SPARC CPUs), execute action-if-true. If words are stored with the least significant byte first (like Intel and VAX CPUs), execute action-if-false.

This macro runs a test-case if endianness cannot be determined from the system header files. When cross-compiling, the test-case is not run but grep'ed for some magic values. action-if-unknown is executed if the latter case fails to determine the byte sex of the host system.

In some cases a single run of a compiler can generate code for multiple architectures. This can happen, for example, when generating Mac OS X universal binary files, which work on both PowerPC and Intel architectures. In this case, the different variants might be for different architectures whose endiannesses differ. If configure detects this, it executes action-if-universal instead of action-if-unknown.

The default for action-if-true is to define `WORDS_BIGENDIAN'. The default for action-if-false is to do nothing. The default for action-if-unknown is to abort configure and tell the installer how to bypass this test. And finally, the default for action-if-universal is to ensure that `WORDS_BIGENDIAN' is defined if and only if a universal build is detected and the current code is big-endian; this default works only if autoheader is used (see section Using autoheader to Create `config.h.in').

If you use this macro without specifying action-if-universal, you should also use AC_CONFIG_HEADERS; otherwise `WORDS_BIGENDIAN' may be set incorrectly for Mac OS X universal binary files.

Macro: AC_C_CONST

If the C compiler does not fully support the const keyword, define const to be empty. Some C compilers that do not define __STDC__ do support const; some compilers that define __STDC__ do not completely support const. Programs can simply use const as if every C compiler supported it; for those that don't, the makefile or configuration header file defines it as empty.

Occasionally installers use a C++ compiler to compile C code, typically because they lack a C compiler. This causes problems with const, because C and C++ treat const differently. For example:

 
const int foo;

is valid in C but not in C++. These differences unfortunately cannot be papered over by defining const to be empty.

If autoconf detects this situation, it leaves const alone, as this generally yields better results in practice. However, using a C++ compiler to compile C code is not recommended or supported, and installers who run into trouble in this area should get a C compiler like GCC to compile their C code.

This macro caches its result in the ac_cv_c_const variable.

This macro is obsolescent, as current C compilers support const. New programs need not use this macro.

Macro: AC_C_RESTRICT

If the C compiler recognizes a variant spelling for the restrict keyword (__restrict, __restrict__, or _Restrict), then define restrict to that; this is more likely to do the right thing with compilers that support language variants where plain restrict is not a keyword. Otherwise, if the C compiler recognizes the restrict keyword, don't do anything. Otherwise, define restrict to be empty. Thus, programs may simply use restrict as if every C compiler supported it; for those that do not, the makefile or configuration header defines it away.

Although support in C++ for the restrict keyword is not required, several C++ compilers do accept the keyword. This macro works for them, too.

This macro caches `no' in the ac_cv_c_restrict variable if restrict is not supported, and a supported spelling otherwise.

Macro: AC_C_VOLATILE

If the C compiler does not understand the keyword volatile, define volatile to be empty. Programs can simply use volatile as if every C compiler supported it; for those that do not, the makefile or configuration header defines it as empty.

If the correctness of your program depends on the semantics of volatile, simply defining it to be empty does, in a sense, break your code. However, given that the compiler does not support volatile, you are at its mercy anyway. At least your program compiles, when it wouldn't before. See section Volatile Objects, for more about volatile.

In general, the volatile keyword is a standard C feature, so you might expect that volatile is available only when __STDC__ is defined. However, Ultrix 4.3's native compiler does support volatile, but does not define __STDC__.

This macro is obsolescent, as current C compilers support volatile. New programs need not use this macro.

Macro: AC_C_INLINE

If the C compiler supports the keyword inline, do nothing. Otherwise define inline to __inline__ or __inline if it accepts one of those, otherwise define inline to be empty.

Macro: AC_C_CHAR_UNSIGNED

If the C type char is unsigned, define __CHAR_UNSIGNED__, unless the C compiler predefines it.

These days, using this macro is not necessary. The same information can be determined by this portable alternative, thus avoiding the use of preprocessor macros in the namespace reserved for the implementation.

 
#include <limits.h>
#if CHAR_MIN == 0
# define CHAR_UNSIGNED 1
#endif
Macro: AC_C_STRINGIZE

If the C preprocessor supports the stringizing operator, define HAVE_STRINGIZE. The stringizing operator is `#' and is found in macros such as this:

 
#define x(y) #y

This macro is obsolescent, as current C compilers support the stringizing operator. New programs need not use this macro.

Macro: AC_C_FLEXIBLE_ARRAY_MEMBER

If the C compiler supports flexible array members, define FLEXIBLE_ARRAY_MEMBER to nothing; otherwise define it to 1. That way, a declaration like this:

 
struct s
  {
    size_t n_vals;
    double val[FLEXIBLE_ARRAY_MEMBER];
  };

will let applications use the "struct hack" even with compilers that do not support flexible array members. To allocate and use such an object, you can use code like this:

 
size_t i;
size_t n = compute_value_count ();
struct s *p =
   malloc (offsetof (struct s, val)
           + n * sizeof (double));
p->n_vals = n;
for (i = 0; i < n; i++)
  p->val[i] = compute_value (i);
Macro: AC_C_VARARRAYS

If the C compiler supports variable-length arrays, define HAVE_C_VARARRAYS. A variable-length array is an array of automatic storage duration whose length is determined at run time, when the array is declared.

Macro: AC_C_TYPEOF

If the C compiler supports GCC's typeof syntax either directly or through a different spelling of the keyword (e.g., __typeof__), define HAVE_TYPEOF. If the support is available only through a different spelling, define typeof to that spelling.

Macro: AC_C_PROTOTYPES

If function prototypes are understood by the compiler (as determined by AC_PROG_CC), define PROTOTYPES and __PROTOTYPES. Defining __PROTOTYPES is for the benefit of header files that cannot use macros that infringe on user name space.

This macro is obsolescent, as current C compilers support prototypes. New programs need not use this macro.

Macro: AC_PROG_GCC_TRADITIONAL

Add `-traditional' to output variable CC if using the GNU C compiler and ioctl does not work properly without `-traditional'. That usually happens when the fixed header files have not been installed on an old system.

This macro is obsolescent, since current versions of the GNU C compiler fix the header files automatically when installed.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.4 C++ Compiler Characteristics

Macro: AC_PROG_CXX ([compiler-search-list]@c)

Determine a C++ compiler to use. Check whether the environment variable CXX or CCC (in that order) is set; if so, then set output variable CXX to its value.

Otherwise, if the macro is invoked without an argument, then search for a C++ compiler under the likely names (first g++ and c++ then other names). If none of those checks succeed, then as a last resort set CXX to g++.

This macro may, however, be invoked with an optional first argument which, if specified, must be a blank-separated list of C++ compilers to search for. This just gives the user an opportunity to specify an alternative search list for the C++ compiler. For example, if you didn't like the default order, then you could invoke AC_PROG_CXX like this:

 
AC_PROG_CXX([gcc cl KCC CC cxx cc++ xlC aCC c++ g++])

If using the GNU C++ compiler, set shell variable GXX to `yes'. If output variable CXXFLAGS was not already set, set it to `-g -O2' for the GNU C++ compiler (`-O2' on systems where G++ does not accept `-g'), or `-g' for other compilers.

Macro: AC_PROG_CXXCPP

Set output variable CXXCPP to a command that runs the C++ preprocessor. If `$CXX -E' doesn't work, `/lib/cpp' is used. It is portable to run CXXCPP only on files with a `.c', `.C', `.cc', or `.cpp' extension.

Some preprocessors don't indicate missing include files by the error status. For such preprocessors an internal variable is set that causes other macros to check the standard error from the preprocessor and consider the test failed if any warnings have been reported. However, it is not known whether such broken preprocessors exist for C++.

Macro: AC_PROG_CXX_C_O

Test whether the C++ compiler accepts the options `-c' and `-o' simultaneously, and define CXX_NO_MINUS_C_MINUS_O, if it does not.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.5 Objective C Compiler Characteristics

Macro: AC_PROG_OBJC ([compiler-search-list]@c)

Determine an Objective C compiler to use. If OBJC is not already set in the environment, check for Objective C compilers. Set output variable OBJC to the name of the compiler found.

This macro may, however, be invoked with an optional first argument which, if specified, must be a blank-separated list of Objective C compilers to search for. This just gives the user an opportunity to specify an alternative search list for the Objective C compiler. For example, if you didn't like the default order, then you could invoke AC_PROG_OBJC like this:

 
AC_PROG_OBJC([gcc objcc objc])

If using the GNU Objective C compiler, set shell variable GOBJC to `yes'. If output variable OBJCFLAGS was not already set, set it to `-g -O2' for the GNU Objective C compiler (`-O2' on systems where gcc does not accept `-g'), or `-g' for other compilers.

Macro: AC_PROG_OBJCPP

Set output variable OBJCPP to a command that runs the Objective C preprocessor. If `$OBJC -E' doesn't work, `/lib/cpp' is used.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.6 Objective C++ Compiler Characteristics

Macro: AC_PROG_OBJCXX ([compiler-search-list]@c)

Determine an Objective C++ compiler to use. If OBJCXX is not already set in the environment, check for Objective C++ compilers. Set output variable OBJCXX to the name of the compiler found.

This macro may, however, be invoked with an optional first argument which, if specified, must be a blank-separated list of Objective C++ compilers to search for. This just gives the user an opportunity to specify an alternative search list for the Objective C++ compiler. For example, if you didn't like the default order, then you could invoke AC_PROG_OBJCXX like this:

 
AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])

If using the GNU Objective C++ compiler, set shell variable GOBJCXX to `yes'. If output variable OBJCXXFLAGS was not already set, set it to `-g -O2' for the GNU Objective C++ compiler (`-O2' on systems where gcc does not accept `-g'), or `-g' for other compilers.

Macro: AC_PROG_OBJCXXCPP

Set output variable OBJCXXCPP to a command that runs the Objective C++ preprocessor. If `$OBJCXX -E' doesn't work, `/lib/cpp' is used.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.7 Erlang Compiler and Interpreter Characteristics

Autoconf defines the following macros for determining paths to the essential Erlang/OTP programs:

Macro: AC_ERLANG_PATH_ERLC ([value-if-not-found]@c, [path = `$PATH']@c)

Determine an Erlang compiler to use. If ERLC is not already set in the environment, check for erlc. Set output variable ERLC to the complete path of the compiler command found. In addition, if ERLCFLAGS is not set in the environment, set it to an empty value.

The two optional arguments have the same meaning as the two last arguments of macro AC_PROG_PATH for looking for the erlc program. For example, to look for erlc only in the `/usr/lib/erlang/bin' directory:

 
AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
Macro: AC_ERLANG_NEED_ERLC ([path = `$PATH']@c)

A simplified variant of the AC_ERLANG_PATH_ERLC macro, that prints an error message and exits the configure script if the erlc program is not found.

Macro: AC_ERLANG_PATH_ERL ([value-if-not-found]@c, [path = `$PATH']@c)

Determine an Erlang interpreter to use. If ERL is not already set in the environment, check for erl. Set output variable ERL to the complete path of the interpreter command found.

The two optional arguments have the same meaning as the two last arguments of macro AC_PROG_PATH for looking for the erl program. For example, to look for erl only in the `/usr/lib/erlang/bin' directory:

 
AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
Macro: AC_ERLANG_NEED_ERL ([path = `$PATH']@c)

A simplified variant of the AC_ERLANG_PATH_ERL macro, that prints an error message and exits the configure script if the erl program is not found.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.10.8 Fortran Compiler Characteristics

The Autoconf Fortran support is divided into two categories: legacy Fortran 77 macros (F77), and modern Fortran macros (FC). The former are intended for traditional Fortran 77 code, and have output variables like F77, FFLAGS, and FLIBS. The latter are for newer programs that can (or must) compile under the newer Fortran standards, and have output variables like FC, FCFLAGS, and FCLIBS.

Except for two new macros AC_FC_SRCEXT and AC_FC_FREEFORM (see below), the FC and F77 macros behave almost identically, and so they are documented together in this section.

Macro: AC_PROG_F77 ([compiler-search-list]@c)

Determine a Fortran 77 compiler to use. If F77 is not already set in the environment, then check for g77 and f77, and then some other names. Set the output variable F77 to the name of the compiler found.

This macro may, however, be invoked with an optional first argument which, if specified, must be a blank-separated list of Fortran 77 compilers to search for. This just gives the user an opportunity to specify an alternative search list for the Fortran 77 compiler. For example, if you didn't like the default order, then you could invoke AC_PROG_F77 like this:

 
AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90])

If using g77 (the GNU Fortran 77 compiler), then set the shell variable G77 to `yes'. If the output variable FFLAGS was not already set in the environment, then set it to `-g -02' for g77 (or `-O2' where g77 does not accept `-g'). Otherwise, set FFLAGS to `-g' for all other Fortran 77 compilers.

Macro: AC_PROG_FC ([compiler-search-list]@c, [dialect]@c)

Determine a Fortran compiler to use. If FC is not already set in the environment, then dialect is a hint to indicate what Fortran dialect to search for; the default is to search for the newest available dialect. Set the output variable FC to the name of the compiler found.

By default, newer dialects are preferred over older dialects, but if dialect is specified then older dialects are preferred starting with the specified dialect. dialect can currently be one of Fortran 77, Fortran 90, or Fortran 95. However, this is only a hint of which compiler name to prefer (e.g., f90 or f95), and no attempt is made to guarantee that a particular language standard is actually supported. Thus, it is preferable that you avoid the dialect option, and use AC_PROG_FC only for code compatible with the latest Fortran standard.

This macro may, alternatively, be invoked with an optional first argument which, if specified, must be a blank-separated list of Fortran compilers to search for, just as in AC_PROG_F77.

If the output variable FCFLAGS was not already set in the environment, then set it to `-g -02' for GNU g77 (or `-O2' where g77 does not accept `-g'). Otherwise, set FCFLAGS to `-g' for all other Fortran compilers.

Macro: AC_PROG_F77_C_O
Macro: AC_PROG_FC_C_O

Test whether the Fortran compiler accepts the options `-c' and `-o' simultaneously, and define F77_NO_MINUS_C_MINUS_O or FC_NO_MINUS_C_MINUS_O, respectively, if it does not.

The following macros check for Fortran compiler characteristics. To check for characteristics not listed here, use AC_COMPILE_IFELSE (see section Running the Compiler) or AC_RUN_IFELSE (see section Checking Runtime Behavior), making sure to first set the current language to Fortran 77 or Fortran via AC_LANG([Fortran 77]) or AC_LANG(Fortran) (see section Language Choice).

Macro: AC_F77_LIBRARY_LDFLAGS
Macro: AC_FC_LIBRARY_LDFLAGS

Determine the linker flags (e.g., `-L' and `-l') for the Fortran intrinsic and runtime libraries that are required to successfully link a Fortran program or shared library. The output variable FLIBS or FCLIBS is set to these flags (which should be included after LIBS when linking).

This macro is intended to be used in those situations when it is necessary to mix, e.g., C++ and Fortran source code in a single program or shared library (see (automake)Mixing Fortran 77 With C and C++ section `Mixing Fortran 77 With C and C++' in GNU Automake).

For example, if object files from a C++ and Fortran compiler must be linked together, then the C++ compiler/linker must be used for linking (since special C++-ish things need to happen at link time like calling global constructors, instantiating templates, enabling exception support, etc.).

However, the Fortran intrinsic and runtime libraries must be linked in as well, but the C++ compiler/linker doesn't know by default how to add these Fortran 77 libraries. Hence, this macro was created to determine these Fortran libraries.

The macros AC_F77_DUMMY_MAIN and AC_FC_DUMMY_MAIN or AC_F77_MAIN and AC_FC_MAIN are probably also necessary to link C/C++ with Fortran; see below.

Macro: AC_F77_DUMMY_MAIN ([action-if-found]@c, [action-if-not-found]@c)
Macro: AC_FC_DUMMY_MAIN ([action-if-found]@c, [action-if-not-found]@c)

With many compilers, the Fortran libraries detected by AC_F77_LIBRARY_LDFLAGS or AC_FC_LIBRARY_LDFLAGS provide their own main entry function that initializes things like Fortran I/O, and which then calls a user-provided entry function named (say) MAIN__ to run the user's program. The AC_F77_DUMMY_MAIN and AC_FC_DUMMY_MAIN or AC_F77_MAIN and AC_FC_MAIN macros figure out how to deal with this interaction.

When using Fortran for purely numerical functions (no I/O, etc.) often one prefers to provide one's own main and skip the Fortran library initializations. In this case, however, one may still need to provide a dummy MAIN__ routine in order to prevent linking errors on some systems. AC_F77_DUMMY_MAIN or AC_FC_DUMMY_MAIN detects whether any such routine is required for linking, and what its name is; the shell variable F77_DUMMY_MAIN or FC_DUMMY_MAIN holds this name, unknown when no solution was found, and none when no such dummy main is needed.

By default, action-if-found defines F77_DUMMY_MAIN or FC_DUMMY_MAIN to the name of this routine (e.g., MAIN__) if it is required. action-if-not-found defaults to exiting with an error.

In order to link with Fortran routines, the user's C/C++ program should then include the following code to define the dummy main if it is needed:

 
#ifdef F77_DUMMY_MAIN
#  ifdef __cplusplus
     extern "C"
#  endif
   int F77_DUMMY_MAIN() { return 1; }
#endif

(Replace F77 with FC for Fortran instead of Fortran 77.)

Note that this macro is called automatically from AC_F77_WRAPPERS or AC_FC_WRAPPERS; there is generally no need to call it explicitly unless one wants to change the default actions.

Macro: AC_F77_MAIN
Macro: AC_FC_MAIN

As discussed above, many Fortran libraries allow you to provide an entry point called (say) MAIN__ instead of the usual main, which is then called by a main function in the Fortran libraries that initializes things like Fortran I/O. The AC_F77_MAIN and AC_FC_MAIN macros detect whether it is possible to utilize such an alternate main function, and defines F77_MAIN and FC_MAIN to the name of the function. (If no alternate main function name is found, F77_MAIN and FC_MAIN are simply defined to main.)

Thus, when calling Fortran routines from C that perform things like I/O, one should use this macro and declare the "main" function like so:

 
#ifdef __cplusplus
  extern "C"
#endif
int F77_MAIN(int argc, char *argv[]);

(Again, replace F77 with FC for Fortran instead of Fortran 77.)

Macro: AC_F77_WRAPPERS
Macro: AC_FC_WRAPPERS

Defines C macros F77_FUNC (name, NAME), FC_FUNC (name, NAME), F77_FUNC_(name, NAME), and FC_FUNC_(name, NAME) to properly mangle the names of C/C++ identifiers, and identifiers with underscores, respectively, so that they match the name-mangling scheme used by the Fortran compiler.

Fortran is case-insensitive, and in order to achieve this the Fortran compiler converts all identifiers into a canonical case and format. To call a Fortran subroutine from C or to write a C function that is callable from Fortran, the C program must explicitly use identifiers in the format expected by the Fortran compiler. In order to do this, one simply wraps all C identifiers in one of the macros provided by AC_F77_WRAPPERS or AC_FC_WRAPPERS. For example, suppose you have the following Fortran 77 subroutine:

 
      subroutine foobar (x, y)
      double precision x, y
      y = 3.14159 * x
      return
      end

You would then declare its prototype in C or C++ as:

 
#define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
#ifdef __cplusplus
extern "C"  /* prevent C++ name mangling */
#endif
void FOOBAR_F77(double *x, double *y);

Note that we pass both the lowercase and uppercase versions of the function name to F77_FUNC so that it can select the right one. Note also that all parameters to Fortran 77 routines are passed as pointers (see (automake)Mixing Fortran 77 With C and C++ section `Mixing Fortran 77 With C and C++' in GNU Automake).

(Replace F77 with FC for Fortran instead of Fortran 77.)

Although Autoconf tries to be intelligent about detecting the name-mangling scheme of the Fortran compiler, there may be Fortran compilers that it doesn't support yet. In this case, the above code generates a compile-time error, but some other behavior (e.g., disabling Fortran-related features) can be induced by checking whether F77_FUNC or FC_FUNC is defined.

Now, to call that routine from a C program, we would do something like:

 
{
    double x = 2.7183, y;
    FOOBAR_F77 (&x, &y);
}

If the Fortran identifier contains an underscore (e.g., foo_bar), you should use F77_FUNC_ or FC_FUNC_ instead of F77_FUNC or FC_FUNC (with the same arguments). This is because some Fortran compilers mangle names differently if they contain an underscore.

Macro: AC_F77_FUNC (name, [shellvar]@c)
Macro: AC_FC_FUNC (name, [shellvar]@c)

Given an identifier name, set the shell variable shellvar to hold the mangled version name according to the rules of the Fortran linker (see also AC_F77_WRAPPERS or AC_FC_WRAPPERS). shellvar is optional; if it is not supplied, the shell variable is simply name. The purpose of this macro is to give the caller a way to access the name-mangling information other than through the C preprocessor as above, for example, to call Fortran routines from some language other than C/C++.

Macro: AC_FC_SRCEXT (ext, [action-if-success]@c,   [action-if-failure]@c)

By default, the FC macros perform their tests using a `.f' extension for source-code files. Some compilers, however, only enable newer language features for appropriately named files, e.g., Fortran 90 features only for `.f90' files. On the other hand, some other compilers expect all source files to end in `.f' and require special flags to support other file name extensions. The AC_FC_SRCEXT macro deals with both of these issues.

The AC_FC_SRCEXT tries to get the FC compiler to accept files ending with the extension .ext (i.e., ext does not contain the dot). If any special compiler flags are needed for this, it stores them in the output variable FCFLAGS_ext. This extension and these flags are then used for all subsequent FC tests (until AC_FC_SRCEXT is called again).

For example, you would use AC_FC_SRCEXT(f90) to employ the `.f90' extension in future tests, and it would set the FCFLAGS_f90 output variable with any extra flags that are needed to compile such files.

The FCFLAGS_ext can not be simply absorbed into FCFLAGS, for two reasons based on the limitations of some compilers. First, only one FCFLAGS_ext can be used at a time, so files with different extensions must be compiled separately. Second, FCFLAGS_ext must appear immediately before the source-code file name when compiling. So, continuing the example above, you might compile a `foo.f90' file in your makefile with the command:

 
foo.o: foo.f90
     $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90'

If AC_FC_SRCEXT succeeds in compiling files with the ext extension, it calls action-if-success (defaults to nothing). If it fails, and cannot find a way to make the FC compiler accept such files, it calls action-if-failure (defaults to exiting with an error message).

Macro: AC_FC_FREEFORM ([action-if-success]@c, [action-if-failure]@c)

The AC_FC_FREEFORM tries to ensure that the Fortran compiler ($FC) allows free-format source code (as opposed to the older fixed-format style from Fortran 77). If necessary, it may add some additional flags to FCFLAGS.

This macro is most important if you are using the default `.f' extension, since many compilers interpret this extension as indicating fixed-format source unless an additional flag is supplied. If you specify a different extension with AC_FC_SRCEXT, such as `.f90' or `.f95', then AC_FC_FREEFORM ordinarily succeeds without modifying FCFLAGS.

If AC_FC_FREEFORM succeeds in compiling free-form source, it calls action-if-success (defaults to nothing). If it fails, it calls action-if-failure (defaults to exiting with an error message).


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.11 System Services

The following macros check for operating system services or capabilities.

Macro: AC_PATH_X

Try to locate the X Window System include files and libraries. If the user gave the command line options `--x-includes=dir' and `--x-libraries=dir', use those directories.

If either or both were not given, get the missing values by running xmkmf (or an executable pointed to by the XMKMF environment variable) on a trivial `Imakefile' and examining the makefile that it produces. Setting XMKMF to `false' disables this method.

If this method fails to find the X Window System, configure looks for the files in several directories where they often reside. If either method is successful, set the shell variables x_includes and x_libraries to their locations, unless they are in directories the compiler searches by default.

If both methods fail, or the user gave the command line option `--without-x', set the shell variable no_x to `yes'; otherwise set it to the empty string.

Macro: AC_PATH_XTRA

An enhanced version of AC_PATH_X. It adds the C compiler flags that X needs to output variable X_CFLAGS, and the X linker flags to X_LIBS. Define X_DISPLAY_MISSING if X is not available.

This macro also checks for special libraries that some systems need in order to compile X programs. It adds any that the system needs to output variable X_EXTRA_LIBS. And it checks for special X11R6 libraries that need to be linked with before `-lX11', and adds any found to the output variable X_PRE_LIBS.

Macro: AC_SYS_INTERPRETER

Check whether the system supports starting scripts with a line of the form `#!/bin/sh' to select the interpreter to use for the script. After running this macro, shell code in `configure.ac' can check the shell variable interpval; it is set to `yes' if the system supports `#!', `no' if not.

Macro: AC_SYS_LARGEFILE

Arrange for 64-bit file offsets, known as large-file support. On some hosts, one must use special compiler options to build programs that can access large files. Append any such options to the output variable CC. Define _FILE_OFFSET_BITS and _LARGE_FILES if necessary.

Large-file support can be disabled by configuring with the `--disable-largefile' option.

If you use this macro, check that your program works even when off_t is wider than long int, since this is common when large-file support is enabled. For example, it is not correct to print an arbitrary off_t value X with printf ("%ld", (long int) X).

The LFS introduced the fseeko and ftello functions to replace their C counterparts fseek and ftell that do not use off_t. Take care to use AC_FUNC_FSEEKO to make their prototypes available when using them and large-file support is enabled.

Macro: AC_SYS_LONG_FILE_NAMES

If the system supports file names longer than 14 characters, define HAVE_LONG_FILE_NAMES.

Macro: AC_SYS_POSIX_TERMIOS

Check to see if the Posix termios headers and functions are available on the system. If so, set the shell variable ac_cv_sys_posix_termios to `yes'. If not, set the variable to `no'.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.12 Posix Variants

The following macro makes it possible to use features of Posix that are extensions to C, as well as platform extensions not defined by Posix.

Macro: AC_USE_SYSTEM_EXTENSIONS

This macro was introduced in Autoconf 2.60. If possible, enable extensions to C or Posix on hosts that normally disable the extensions, typically due to standards-conformance namespace issues. This should be called before any macros that run the C compiler. The following preprocessor macros are defined where appropriate:

_GNU_SOURCE

Enable extensions on GNU/Linux.

__EXTENSIONS__

Enable general extensions on Solaris.

_POSIX_PTHREAD_SEMANTICS

Enable threading extensions on Solaris.

_TANDEM_SOURCE

Enable extensions for the HP NonStop platform.

_ALL_SOURCE

Enable extensions for AIX 3, and for Interix.

_POSIX_SOURCE

Enable Posix functions for Minix.

_POSIX_1_SOURCE

Enable additional Posix functions for Minix.

_MINIX

Identify Minix platform. This particular preprocessor macro is obsolescent, and may be removed in a future release of Autoconf.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.13 Erlang Libraries

The following macros check for an installation of Erlang/OTP, and for the presence of certain Erlang libraries. All those macros require the configuration of an Erlang interpreter and an Erlang compiler (see section Erlang Compiler and Interpreter Characteristics).

Macro: AC_ERLANG_SUBST_ERTS_VER

Set the output variable ERLANG_ERTS_VER to the version of the Erlang runtime system (as returned by Erlang's erlang:system_info(version) function). The result of this test is cached if caching is enabled when running configure. The ERLANG_ERTS_VER variable is not intended to be used for testing for features of specific ERTS versions, but to be used for substituting the ERTS version in Erlang/OTP release resource files (.rel files), as shown below.

Macro: AC_ERLANG_SUBST_ROOT_DIR

Set the output variable ERLANG_ROOT_DIR to the path to the base directory in which Erlang/OTP is installed (as returned by Erlang's code:root_dir/0 function). The result of this test is cached if caching is enabled when running configure.

Macro: AC_ERLANG_SUBST_LIB_DIR

Set the output variable ERLANG_LIB_DIR to the path of the library directory of Erlang/OTP (as returned by Erlang's code:lib_dir/0 function), which subdirectories each contain an installed Erlang/OTP library. The result of this test is cached if caching is enabled when running configure.

Macro: AC_ERLANG_CHECK_LIB (library, [action-if-found]@c,   [action-if-not-found]@c)

Test whether the Erlang/OTP library library is installed by calling Erlang's code:lib_dir/1 function. The result of this test is cached if caching is enabled when running configure. action-if-found is a list of shell commands to run if the library is installed; action-if-not-found is a list of shell commands to run if it is not. Additionally, if the library is installed, the output variable `ERLANG_LIB_DIR_library' is set to the path to the library installation directory, and the output variable `ERLANG_LIB_VER_library' is set to the version number that is part of the subdirectory name, if it is in the standard form (library-version). If the directory name does not have a version part, `ERLANG_LIB_VER_library' is set to the empty string. If the library is not installed, `ERLANG_LIB_DIR_library' and `ERLANG_LIB_VER_library' are set to "not found". For example, to check if library stdlib is installed:

 
AC_ERLANG_CHECK_LIB([stdlib],
  [echo "stdlib version \"$ERLANG_LIB_VER_stdlib\""
   echo "is installed in \"$ERLANG_LIB_DIR_stdlib\""],
  [AC_MSG_ERROR([stdlib was not found!])])

The `ERLANG_LIB_VER_library' variables (set by AC_ERLANG_CHECK_LIB) and the ERLANG_ERTS_VER variable (set by AC_ERLANG_SUBST_ERTS_VER) are not intended to be used for testing for features of specific versions of libraries or of the Erlang runtime system. Those variables are intended to be substituted in Erlang release resource files (.rel files). For instance, to generate a `example.rel' file for an application depending on the stdlib library, `configure.ac' could contain:

 
AC_ERLANG_SUBST_ERTS_VER
AC_ERLANG_CHECK_LIB([stdlib],
  [],
  [AC_MSG_ERROR([stdlib was not found!])])
AC_CONFIG_FILES([example.rel])

The `example.rel.in' file used to generate `example.rel' should contain:

 
{release,
    {"@PACKAGE@", "@VERSION@"},
    {erts, "@ERLANG_ERTS_VER@"},
    [{stdlib, "@ERLANG_LIB_VER_stdlib@"},
     {@PACKAGE@, "@VERSION@"}]}.

In addition to the above macros, which test installed Erlang libraries, the following macros determine the paths to the directories into which newly built Erlang libraries are to be installed:

Macro: AC_ERLANG_SUBST_INSTALL_LIB_DIR

Set the ERLANG_INSTALL_LIB_DIR output variable to the directory into which every built Erlang library should be installed in a separate subdirectory. If this variable is not set in the environment when configure runs, its default value is $ERLANG_LIB_DIR, which value is set by the AC_ERLANG_SUBST_LIB_DIR macro.

Macro: AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (library, version)

Set the `ERLANG_INSTALL_LIB_DIR_library' output variable to the directory into which the built Erlang library library version version should be installed. If this variable is not set in the environment when configure runs, its default value is `$ERLANG_INSTALL_LIB_DIR/library-version', the value of the ERLANG_INSTALL_LIB_DIR variable being set by the AC_ERLANG_SUBST_INSTALL_LIB_DIR macro.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on January, 20 2010 using texi2html 1.76.