manpagez: man pages & more
info autoconf
Home | html | info | man

File: autoconf.info,  Node: Particular Functions,  Next: Generic Functions,  Prev: Function Portability,  Up: Library Functions

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 for the ‘alloca’ function.  Define ‘HAVE_ALLOCA_H’ if
     ‘alloca.h’ defines a working ‘alloca’.  If not, look for a builtin
     alternative.  If either method succeeds, define ‘HAVE_ALLOCA’.
     Otherwise, set the output variable ‘ALLOCA’ to
     ‘${LIBOBJDIR}alloca.o’ and define ‘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’ (*note AC_LIBOBJ vs
     LIBOBJS::).

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

          #include 
          #include 
          #ifdef HAVE_ALLOCA_H
          # include 
          #elif !defined alloca
          # ifdef __GNUC__
          #  define alloca __builtin_alloca
          # elif defined _MSC_VER
          #  include 
          #  define alloca _alloca
          # elif !defined HAVE_ALLOCA
          #  ifdef  __cplusplus
          extern "C"
          #  endif
          void *alloca (size_t);
          # endif
          #endif

     If you don't want to maintain this piece of code in your package
     manually, you can instead use the Gnulib module ‘alloca-opt’ or
     ‘alloca’.  *Note Gnulib::.

 -- 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.

     If you want a workaround, that is, a ‘chown’ function that is
     available and works, you can use the Gnulib module ‘chown’.  *Note
     Gnulib::.

 -- 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.

     The ‘AC_FUNC_ERROR_AT_LINE’ macro is obsolescent.  New programs
     should use Gnulib's ‘error’ module.  *Note Gnulib::.

 -- Macro: AC_FUNC_FNMATCH
     If the ‘fnmatch’ function conforms to Posix, define ‘HAVE_FNMATCH’.

     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.  *Note 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.  *Note 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.

     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

     The results of this macro are cached in the ‘ac_cv_func_fork_works’
     and ‘ac_cv_func_vfork_works’ variables.  In order to override the
     test, you also need to set the ‘ac_cv_func_fork’ and
     ‘ac_cv_func_vfork’ variables.

 -- Macro: AC_FUNC_FSEEKO
     If the ‘fseeko’ and ‘ftello’ functions are available, define
     ‘HAVE_FSEEKO’.  Define ‘_LARGEFILE_SOURCE’ if necessary to make the
     prototype visible.

     Configure scripts that use ‘AC_FUNC_FSEEKO’ should normally also
     use ‘AC_SYS_LARGEFILE’ to ensure that ‘off_t’ can represent all
     supported file sizes.  *Note AC_SYS_LARGEFILE::.

     The Gnulib module ‘fseeko’ invokes ‘AC_FUNC_FSEEKO’ and also
     contains workarounds for other portability problems of ‘fseeko’.
     *Note Gnulib::.

 -- Macro: AC_FUNC_GETGROUPS
     Perform all the checks performed by ‘AC_TYPE_GETGROUPS’ (*note
     AC_TYPE_GETGROUPS::).  Then, if the ‘getgroups’ function is
     available and known to work correctly, define ‘HAVE_GETGROUPS’.
     Set the output variable ‘GETGROUPS_LIB’ to any libraries needed to
     get that function.

     This macro relies on a list of systems with known, serious bugs in
     ‘getgroups’.  If this list mis-identifies your system's ‘getgroups’
     as buggy, or as not buggy, you can override it by setting the cache
     variable ‘ac_cv_func_getgroups_works’ in a ‘config.site’ file
     (*note Site Defaults::).  Please also report the error to the
     Autoconf Bugs mailing list .

     The Gnulib module ‘getgroups’ provides workarounds for additional,
     less severe portability problems with this function.

 -- 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
     *note Generic Functions::, ‘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’ 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.  *Note 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’.

     The ‘AC_FUNC_GETMNTENT’ macro is obsolescent.  New programs should
     use Gnulib's ‘mountlist’ module.  *Note Gnulib::.

 -- 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.

     The ‘AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK’ macro is obsolescent.
     New programs should use Gnulib's ‘lstat’ module.  *Note Gnulib::.

 -- 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 
     #undef malloc
     
     #include 
     
     /* 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.

     If you don't want to maintain a ‘malloc.c’ file in your package
     manually, you can instead use the Gnulib module ‘malloc-gnu’.

 -- 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.

     The Gnulib module ‘mbrtowc’ not only ensures that the function is
     declared, but also works around other portability problems of this
     function.

 -- Macro: AC_FUNC_MEMCMP
     If the ‘memcmp’ function is not available or does not work, 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.

     The ‘AC_FUNC_MKTIME’ macro is obsolescent.  New programs should use
     Gnulib's ‘mktime’ module.  *Note Gnulib::.

 -- 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.

     Note: This macro asks for more than what an average program needs
     from ‘mmap’.  In particular, the use of ‘MAP_FIXED’ fails on HP-UX
     11, whereas ‘mmap’ otherwise works fine on this platform.

 -- 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.

     The ‘AC_FUNC_OBSTACK’ macro is obsolescent.  New programs should
     use Gnulib's ‘obstack’ module.  *Note Gnulib::.

 -- 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.

     If you don't want to maintain a ‘realloc.c’ file in your package
     manually, you can instead use the Gnulib module ‘realloc-gnu’.

 -- 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’.  This macro also does not
     check for the Solaris variant of ‘setpgrp’, which returns a ‘pid_t’
     instead of an ‘int’; portable code should only use the return value
     by comparing it against ‘-1’ to check for errors.

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

     This macro is obsolescent, as all forms of ‘setpgrp’ are also
     obsolescent.  New programs should use the Posix function ‘setpgid’,
     which takes two process IDs as arguments (like the BSD ‘setpgrp’).

 -- 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.

     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.  But it does not
     check against a known bug of this function on Solaris 10.

     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.

     The Gnulib module ‘strerror_r’ not only ensures that the function
     has the return type specified by Posix, but also works around other
     portability problems of this function.

 -- 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.

     The ‘AC_FUNC_STRTOD’ macro is obsolescent.  New programs should use
     Gnulib's ‘strtod’ module.  *Note Gnulib::.

 -- Macro: AC_FUNC_STRTOLD
     If the ‘strtold’ function exists and conforms to C99 or later,
     define ‘HAVE_STRTOLD’.

     This macro caches its result in the ‘ac_cv_func_strtold’ variable.

     The Gnulib module ‘strtold’ not only ensures that the function
     exists, but also works around other portability problems of this
     function.

 -- 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.

     The ‘AC_FUNC_STRNLEN’ macro is obsolescent.  New programs should
     use Gnulib's ‘strnlen’ module.  *Note Gnulib::.

 -- 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 ‘’.

     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.
     *Note Gnulib::.

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.