\input texinfo @c -*-texinfo-*-
@comment ========================================================
@comment %**start of header
@setfilename autoconf.info
@include version.texi
@settitle Autoconf
@documentencoding UTF-8
@set txicodequoteundirected
@set txicodequotebacktick
@setchapternewpage odd
@finalout

@c @ovar(ARG)
@c ----------
@c The ARG is an optional argument.  To be used for macro arguments in
@c their documentation (@defmac).
@macro ovar{varname}
@r{[}@var{\varname\}@r{]}
@end macro

@c @dvar(ARG, DEFAULT)
@c -------------------
@c The ARG is an optional argument, defaulting to DEFAULT.  To be used
@c for macro arguments in their documentation (@defmac).
@macro dvar{varname, default}
@r{[}@var{\varname\} = @samp{\default\}@r{]}
@end macro

@c @dvarv(ARG, DEFAULT-VAR)
@c ------------------------
@c Same as @dvar{ARG, DEFAULT-VAR}, but with @var instead of @samp
@c around DEFAULT-VAR.
@macro dvarv{varname, default}
@r{[}@var{\varname\} = @var{\default\}@r{]}
@end macro

@c Handling the indexes with Texinfo yields several different problems.
@c
@c Because we want to drop out the AC_ part of the macro names in the
@c printed manual, but not in the other outputs, we need a layer above
@c the usual @acindex{} etc.  That's why we first define indexes such as
@c acx meant to become the macro @acindex.  First of all, using 'ac_'
@c does not work with makeinfo, and using 'ac1' doesn't work with TeX.
@c So use something more regular 'acx'.  Then you finish with a printed
@c index saying 'index is not existent'.  Of course: you ought to use
@c two letters :(  So you use capitals.
@c
@c Second, when defining a macro in the TeX world, following spaces are
@c eaten.  But then, since we embed @acxindex commands that use the end
@c of line as an end marker, the whole things wrecks itself.  So make
@c sure you do *force* an additional end of line, add a '@c'.
@c
@c Finally, you might want to get rid of TeX expansion, using --expand
@c with texi2dvi.  But then you wake up an old problem: we use macros
@c in @defmac etc. where TeX does perform the expansion, but not makeinfo.

@c Define an environment variable index, for variables users may set
@c in their environment or on the configure command line.
@defcodeindex ev
@c Define an output variable index, for commonly AC_SUBST'ed variables.
@defcodeindex ov
@c Define a cache variable index, for variables matching *_cv_*.
@defcodeindex CA
@c Other shell variables not fitting the above categories should be
@c listed in the predefined vrindex, which we merge in the concept index.
@syncodeindex vr cp
@c Define a CPP preprocessor macro index, for #define'd strings.
@defcodeindex cv
@c Define an Autoconf macro index that @defmac doesn't write to.
@defcodeindex AC
@c Define an Autotest macro index that @defmac doesn't write to.
@defcodeindex AT
@c Define an M4sugar macro index that @defmac doesn't write to.
@defcodeindex MS
@c Define an index for *foreign* programs: 'mv' etc.  Used for the
@c portability sections and so on.
@defindex pr

@c shortindexflag
@c --------------
@c Shall we factor AC_ out of the Autoconf macro index etc.?
@iftex
@set shortindexflag
@end iftex

@c @acindex{MACRO}
@c ---------------
@c Registering an AC_\MACRO\.
@ifset shortindexflag
@macro acindex{macro}
@ACindex \macro\
@c
@end macro
@end ifset
@ifclear shortindexflag
@macro acindex{macro}
@ACindex AC_\macro\
@end macro
@end ifclear

@c @ahindex{MACRO}
@c ---------------
@c Registering an AH_\MACRO\.
@macro ahindex{macro}
@ACindex AH_\macro\
@c
@end macro

@c @asindex{MACRO}
@c ---------------
@c Registering an AS_\MACRO\.
@ifset shortindexflag
@macro asindex{macro}
@MSindex \macro\
@c
@end macro
@end ifset
@ifclear shortindexflag
@macro asindex{macro}
@MSindex AS_\macro\
@end macro
@end ifclear

@c @atindex{MACRO}
@c ---------------
@c Registering an AT_\MACRO\.
@ifset shortindexflag
@macro atindex{macro}
@ATindex \macro\
@c
@end macro
@end ifset
@ifclear shortindexflag
@macro atindex{macro}
@ATindex AT_\macro\
@end macro
@end ifclear

@c @auindex{MACRO}
@c ---------------
@c Registering an AU_\MACRO\.
@macro auindex{macro}
@ACindex AU_\macro\
@c
@end macro

@c @hdrindex{MACRO}
@c ----------------
@c Indexing a header.
@macro hdrindex{macro}
@prindex @file{\macro\}
@c
@end macro

@c @msindex{MACRO}
@c ---------------
@c Registering an m4_\MACRO\.
@ifset shortindexflag
@macro msindex{macro}
@MSindex \macro\
@c
@end macro
@end ifset
@ifclear shortindexflag
@macro msindex{macro}
@MSindex m4_\macro\
@end macro
@end ifclear


@c @caindex{VARIABLE}
@c ------------------
@c Registering an ac_cv_\VARIABLE\ cache variable.
@ifset shortindexflag
@macro caindex{macro}
@CAindex \macro\
@end macro
@end ifset
@ifclear shortindexflag
@macro caindex{macro}
@CAindex ac_cv_\macro\
@end macro
@end ifclear

@c Define an index for functions: 'alloca' etc.  Used for the
@c portability sections and so on.  We can't use 'fn' (aka 'fnindex'),
@c since '@defmac' goes into it => we'd get all the macros too.

@c   FIXME: Aaarg!  It seems there are too many indices for TeX :(
@c
@c   ! No room for a new @write .
@c   l.112 @defcodeindex fu
@c
@c   so don't define yet another one :(  Just put some tags before each
@c   @prindex which is actually a @funindex.
@c
@c   @defcodeindex fu
@c
@c
@c   @c Put the programs and functions into their own index.
@c   @syncodeindex fu pr

@comment %**end of header
@comment ========================================================

@copying

This manual (@value{UPDATED}) is for GNU Autoconf
(version @value{VERSION}),
a package for creating scripts to configure source code packages using
templates and an M4 macro package.

Copyright @copyright{} 1992--1996, 1998--2017, 2020--2025 Free Software
Foundation, Inc.

@quotation
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover texts, and
no Back-Cover Texts.  A copy of the license is included in the section
entitled ``GNU Free Documentation License.''
@end quotation
@end copying



@dircategory Software development
@direntry
* Autoconf: (autoconf).         Create source code configuration scripts.
@end direntry

@dircategory Individual utilities
@direntry
* autoscan: (autoconf)autoscan Invocation.
                                Semi-automatic @file{configure.ac} writing
* ifnames: (autoconf)ifnames Invocation.        Listing conditionals in source.
* autoconf-invocation: (autoconf)autoconf Invocation.
                                How to create configuration scripts
* autoreconf: (autoconf)autoreconf Invocation.
                                Remaking multiple @command{configure} scripts
* autoheader: (autoconf)autoheader Invocation.
                                How to create configuration templates
* autom4te: (autoconf)autom4te Invocation.
                                The Autoconf executables backbone
* configure: (autoconf)configure Invocation.    Configuring a package.
* autoupdate: (autoconf)autoupdate Invocation.
                                Automatic update of @file{configure.ac}
* config.status: (autoconf)config.status Invocation. Recreating configurations.
* testsuite: (autoconf)testsuite Invocation.    Running an Autotest test suite.
@end direntry

@titlepage
@title Autoconf
@subtitle Creating Automatic Configuration Scripts
@subtitle for version @value{VERSION}, @value{UPDATED}
@author David MacKenzie
@author Ben Elliston
@author Akim Demaille
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@contents


@ifnottex
@node Top
@top Autoconf
@insertcopying
@end ifnottex

@c The master menu, created with texinfo-master-menu, goes here.

@menu
* Introduction::                Autoconf's purpose, strengths, and weaknesses
* The GNU Build System::        A set of tools for portable software packages
* Making configure Scripts::    How to organize and produce Autoconf scripts
* Setup::                       Initialization and output
* Existing Tests::              Macros that check for particular features
* Writing Tests::               How to write new feature checks
* Results::                     What to do with results from feature checks
* Programming in M4::           Layers on top of which Autoconf is written
* Programming in M4sh::         Shell portability layer
* Writing Autoconf Macros::     Adding new macros to Autoconf
* Portable Shell::              Shell script portability pitfalls
* Portable Make::               Makefile portability pitfalls
* Portable C and C++::          C and C++ portability pitfalls
* Manual Configuration::        Selecting features that can't be guessed
* Site Configuration::          Local defaults for @command{configure}
* Running configure Scripts::   How to use the Autoconf output
* config.status Invocation::    Recreating a configuration
* Obsolete Constructs::         Kept for backward compatibility
* Using Autotest::              Creating portable test suites
* FAQ::                         Frequent Autoconf Questions, with answers
* History::                     History of Autoconf
* GNU Free Documentation License::  License for copying this manual
* Indices::                     Indices of symbols, concepts, etc.

@detailmenu
 --- The Detailed Node Listing ---

The GNU Build System

* Automake::                    Escaping makefile hell
* Gnulib::                      The GNU portability library
* Libtool::                     Building libraries portably
* Pointers::                    More info on the GNU build system

Making @command{configure} Scripts

* Writing Autoconf Input::      What to put in an Autoconf input file
* autoscan Invocation::         Semi-automatic @file{configure.ac} writing
* ifnames Invocation::          Listing the conditionals in source code
* autoconf Invocation::         How to create configuration scripts
* autoreconf Invocation::       Remaking multiple @command{configure} scripts

Writing @file{configure.ac}

* Shell Script Compiler::       Autoconf as solution of a problem
* Autoconf Language::           Programming in Autoconf
* Autoconf Input Layout::       Standard organization of @file{configure.ac}

Initialization and Output Files

* Initializing configure::      Option processing etc.
* Versioning::                  Dealing with Autoconf versions
* Notices::                     Copyright, version numbers in @command{configure}
* Input::                       Where Autoconf should find files
* Output::                      Outputting results from the configuration
* Configuration Actions::       Preparing the output based on results
* Configuration Files::         Creating output files
* Makefile Substitutions::      Using output variables in makefiles
* Configuration Headers::       Creating a configuration header file
* Configuration Commands::      Running arbitrary instantiation commands
* Configuration Links::         Links depending on the configuration
* Subdirectories::              Configuring independent packages together
* Default Prefix::              Changing the default installation prefix

Substitutions in Makefiles

* Preset Output Variables::     Output variables that are always set
* Installation Directory Variables::  Other preset output variables
* Changed Directory Variables::  Warnings about @file{datarootdir}
* Build Directories::           Supporting multiple concurrent compiles
* Automatic Remaking::          Makefile rules for configuring

Configuration Header Files

* Header Templates::            Input for the configuration headers
* autoheader Invocation::       How to create configuration templates
* Autoheader Macros::           How to specify CPP templates

Existing Tests

* Common Behavior::             Macros' standard schemes
* Alternative Programs::        Selecting between alternative programs
* Files::                       Checking for the existence of files
* Libraries::                   Library archives that might be missing
* Library Functions::           C library functions that might be missing
* Header Files::                Header files that might be missing
* Declarations::                Declarations that may be missing
* Structures::                  Structures or members that might be missing
* Types::                       Types that might be missing
* Compilers and Preprocessors::  Checking for compiling programs
* System Services::             Operating system services
* C and POSIX Variants::        Kludges for C and POSIX variants
* Erlang Libraries::            Checking for the existence of Erlang libraries

Common Behavior

* Standard Symbols::            Symbols defined by the macros
* Default Includes::            Includes used by the generic macros

Alternative Programs

* Particular Programs::         Special handling to find certain programs
* Generic Programs::            How to find other programs

Library Functions

* Function Portability::        Pitfalls with usual functions
* Particular Functions::        Special handling to find certain functions
* Generic Functions::           How to find other functions

Header Files

* Header Portability::          Collected knowledge on common headers
* Particular Headers::          Special handling to find certain headers
* Generic Headers::             How to find other headers

Declarations

* Particular Declarations::     Macros to check for certain declarations
* Generic Declarations::        How to find other declarations

Structures

* Particular Structures::       Macros to check for certain structure members
* Generic Structures::          How to find other structure members

Types

* Particular Types::            Special handling to find certain types
* Generic Types::               How to find other types

Compilers and Preprocessors

* Specific Compiler Characteristics::  Some portability issues
* Generic Compiler Characteristics::  Language independent tests and features
* C Compiler::                  Checking its characteristics
* C++ Compiler::                Likewise
* Objective C Compiler::        Likewise
* Objective C++ Compiler::      Likewise
* Erlang Compiler and Interpreter::  Likewise
* Fortran Compiler::            Likewise
* Go Compiler::                 Likewise

Writing Tests

* Language Choice::             Selecting which language to use for testing
* Writing Test Programs::       Forging source files for compilers
* Running the Preprocessor::    Detecting preprocessor symbols
* Running the Compiler::        Detecting language or header features
* Running the Linker::          Detecting library features
* Runtime::                     Testing for runtime features
* Multiple Cases::              Tests for several possible values

Writing Test Programs

* Guidelines::                  General rules for writing test programs
* Test Functions::              Avoiding pitfalls in test programs
* Generating Sources::          Source program boilerplate

Results of Tests

* Defining Symbols::            Defining C preprocessor symbols
* Setting Output Variables::    Replacing variables in output files
* Special Chars in Variables::  Characters to beware of in variables
* Caching Results::             Speeding up subsequent @command{configure} runs
* Printing Messages::           Notifying @command{configure} users

Caching Results

* Cache Variable Names::        Shell variables used in caches
* Cache Files::                 Files @command{configure} uses for caching
* Cache Checkpointing::         Loading and saving the cache file

Programming in M4

* M4 Quotation::                Protecting macros from unwanted expansion
* Using autom4te::              The Autoconf executables backbone
* Programming in M4sugar::      Convenient pure M4 macros
* Debugging via autom4te::      Figuring out what M4 was doing

M4 Quotation

* Active Characters::           Characters that change the behavior of M4
* One Macro Call::              Quotation and one macro call
* Quoting and Parameters::      M4 vs. shell parameters
* Quotation and Nested Macros::  Macros calling macros
* Changequote is Evil::         Worse than INTERCAL: M4 + changequote
* Quadrigraphs::                Another way to escape special characters
* Balancing Parentheses::       Dealing with unbalanced parentheses
* Quotation Rule Of Thumb::     One parenthesis, one quote

Using @command{autom4te}

* autom4te Invocation::         A GNU M4 wrapper
* Customizing autom4te::        Customizing the Autoconf package

Programming in M4sugar

* Redefined M4 Macros::         M4 builtins changed in M4sugar
* Diagnostic Macros::           Diagnostic messages from M4sugar
* Diversion support::           Diversions in M4sugar
* Conditional constructs::      Conditions in M4
* Looping constructs::          Iteration in M4
* Evaluation Macros::           More quotation and evaluation control
* Text processing Macros::      String manipulation in M4
* Number processing Macros::    Arithmetic computation in M4
* Set manipulation Macros::     Set manipulation in M4
* Forbidden Patterns::          Catching unexpanded macros

Programming in M4sh

* Common Shell Constructs::     Portability layer for common shell constructs
* Polymorphic Variables::       Support for indirect variable names
* Initialization Macros::       Macros to establish a sane shell environment
* File Descriptor Macros::      File descriptor macros for input and output

Writing Autoconf Macros

* Macro Definitions::           Basic format of an Autoconf macro
* Macro Names::                 What to call your new macros
* Dependencies Between Macros::  What to do when macros depend on other macros
* Obsoleting Macros::           Warning about old ways of doing things
* Coding Style::                Writing Autoconf macros à la Autoconf

Dependencies Between Macros

* Prerequisite Macros::         Ensuring required information
* Suggested Ordering::          Warning about possible ordering problems
* One-Shot Macros::             Ensuring a macro is called only once

Portable Shell Programming

* Systemology::                 A zoology of operating systems
* Shellology::                  A zoology of shells
* Invoking the Shell::          Invoking the shell as a command
* Here-Documents::              Quirks and tricks
* File Descriptors::            FDs and redirections
* Signal Handling::             Shells, signals, and headaches
* File System Conventions::     File names
* Shell Pattern Matching::      Pattern matching
* Shell Substitutions::         Variable and command expansions
* Assignments::                 Varying side effects of assignments
* Parentheses::                 Parentheses in shell scripts
* Special Shell Variables::     Variables you should not change
* Shell Functions::             What to look out for if you use them
* Limitations of Builtins::     Portable use of not so portable /bin/sh
* Limitations of Usual Tools::  Portable use of portable tools

Portable Make Programming

* $< in Ordinary Make Rules::   $< in ordinary rules
* Failure in Make Rules::       Failing portably in rules
* Command Line Prefixes::       What's at the start of makefile command lines
* Special Chars in Names::      Special characters in macro names
* Backslash-Newline-Empty::     Empty lines after backslash-newline
* Backslash-Newline Comments::  Spanning comments across line boundaries
* Macros and Submakes::         @code{make macro=value} and submakes
* The Make Macro MAKEFLAGS::    @code{$(MAKEFLAGS)} portability issues
* The Make Macro SHELL::        @code{$(SHELL)} portability issues
* Parallel Make::               Parallel @command{make} quirks
* Comments in Make Rules::      Other problems with Make comments
* Newlines in Make Rules::      Using literal newlines in rules
* Comments in Make Macros::     Other problems with Make comments in macros
* Trailing whitespace in Make Macros::  Macro substitution problems
* Command-line Macros and whitespace::  Whitespace trimming of values
* obj/ and Make::               Don't name a subdirectory @file{obj}
* make -k Status::              Exit status of @samp{make -k}
* VPATH and Make::              @code{VPATH} woes
* Single Suffix Rules::         Single suffix rules and separated dependencies
* Timestamps and Make::         Sub-second timestamp resolution

@code{VPATH} and Make

* Variables listed in VPATH::   @code{VPATH} must be literal on ancient hosts
* VPATH and Double-colon::      Problems with @samp{::} on ancient hosts
* $< in Explicit Rules::        @code{$<} does not work in ordinary rules
* Automatic Rule Rewriting::    @code{VPATH} goes wild on Solaris
* Make Target Lookup::          More details about @code{VPATH} lookup

Portable C and C++ Programming

* Varieties of Unportability::  How to make your programs unportable
* Integer Overflow::            When integers get too large
* Preprocessor Arithmetic::     @code{#if} expression problems
* Null Pointers::               Properties of null pointers
* Buffer Overruns::             Subscript errors and the like
* Volatile Objects::            @code{volatile} and signals
* Floating Point Portability::  Portable floating-point arithmetic
* Exiting Portably::            Exiting and the exit status

Integer Overflow

* Integer Overflow Basics::     Why integer overflow is a problem
* Signed Overflow Examples::    Examples of code assuming wraparound
* Optimization and Wraparound::  Optimizations that break uses of wraparound
* Signed Overflow Advice::      Practical advice for signed overflow issues
* Signed Integer Division::     @code{INT_MIN / -1} and @code{INT_MIN % -1}

Manual Configuration

* Specifying Target Triplets::  Specifying target triplets
* Canonicalizing::              Getting the canonical system type
* Using System Type::           What to do with the system type

Site Configuration

* Help Formatting::             Customizing @samp{configure --help}
* External Software::           Working with other optional software
* Package Options::             Selecting optional features
* Pretty Help Strings::         Formatting help string
* Option Checking::             Controlling checking of @command{configure} options
* Site Details::                Configuring site details
* Transforming Names::          Changing program names when installing
* Site Defaults::               Giving @command{configure} local defaults

Transforming Program Names When Installing

* Transformation Options::      @command{configure} options to transform names
* Transformation Examples::     Sample uses of transforming names
* Transformation Rules::        Makefile uses of transforming names

Running @command{configure} Scripts

* Basic Installation::          Instructions for typical cases
* Installation Prerequisites::  What you need to install
* Compilers and Options::       Selecting compilers and optimization
* Multiple Architectures::      Compiling for multiple architectures at once
* Installation Names::          Installing in different directories
* Optional Features::           Selecting optional features
* System Types::                Specifying a system type
* Sharing Defaults::            Setting site-wide defaults for @command{configure}
* Defining Variables::          Specifying the compiler etc.
* configure Invocation::        Changing how @command{configure} runs

Obsolete Constructs

* Obsolete config.status Use::  Obsolete convention for @command{config.status}
* acconfig Header::             Additional entries in @file{config.h.in}
* autoupdate Invocation::       Automatic update of @file{configure.ac}
* Obsolete Macros::             Backward compatibility macros
* Autoconf 1::                  Tips for upgrading your files
* Autoconf 2.13::               Some fresher tips

Upgrading From Version 1

* Changed File Names::          Files you might rename
* Changed Makefiles::           New things to put in @file{Makefile.in}
* Changed Macros::              Macro calls you might replace
* Changed Results::             Changes in how to check test results
* Changed Macro Writing::       Better ways to write your own macros

Upgrading From Version 2.13

* Changed Quotation::           Broken code which used to work
* New Macros::                  Interaction with foreign macros
* Hosts and Cross-Compilation::  Bugward compatibility kludges
* AC_LIBOBJ vs LIBOBJS::        LIBOBJS is a forbidden token
* AC_ACT_IFELSE vs AC_TRY_ACT::  A more generic scheme for testing sources

Generating Test Suites with Autotest

* Using an Autotest Test Suite::  Autotest and the user
* Writing Testsuites::          Autotest macros
* testsuite Invocation::        Running @command{testsuite} scripts
* Making testsuite Scripts::    Using autom4te to create @command{testsuite}

Using an Autotest Test Suite

* testsuite Scripts::           The concepts of Autotest
* Autotest Logs::               Their contents

Frequent Autoconf Questions, with answers

* Distributing::                Distributing @command{configure} scripts
* Why GNU M4::                  Why not use the standard M4?
* Bootstrapping::               Autoconf and GNU M4 require each other?
* Why Not Imake::               Why GNU uses @command{configure} instead of Imake
* Defining Directories::        Passing @code{datadir} to program
* Autom4te Cache::              What is it?  Can I remove it?
* Present But Cannot Be Compiled::  Compiler and Preprocessor Disagree
* Expanded Before Required::    Expanded Before Required
* Debugging::                   Debugging @command{configure} scripts

History of Autoconf

* Genesis::                     Prehistory and naming of @command{configure}
* Exodus::                      The plagues of M4 and Perl
* Leviticus::                   The priestly code of portability arrives
* Numbers::                     Growth and contributors
* Deuteronomy::                 Approaching the promises of easy configuration

Indices

* Environment Variable Index::  Index of environment variables used
* Output Variable Index::       Index of variables set in output files
* Preprocessor Symbol Index::   Index of C preprocessor symbols defined
* Cache Variable Index::        Index of documented cache variables
* Autoconf Macro Index::        Index of Autoconf macros
* M4 Macro Index::              Index of M4, M4sugar, and M4sh macros
* Autotest Macro Index::        Index of Autotest macros
* Program & Function Index::    Index of those with portability problems
* Concept Index::               General index

@end detailmenu
@end menu

@c ============================================================= Introduction.

@node Introduction
@chapter Introduction
@cindex Introduction

@flushright
A physicist, an engineer, and a computer scientist were discussing the
nature of God.  ``Surely a Physicist,'' said the physicist, ``because
early in the Creation, God made Light; and you know, Maxwell's
equations, the dual nature of electromagnetic waves, the relativistic
consequences@enddots{}'' ``An Engineer!,'' said the engineer, ``because
before making Light, God split the Chaos into Land and Water; it takes
a hell of an engineer to handle that big amount of mud, and orderly
separation of solids from liquids@enddots{}'' The computer scientist
shouted: ``And the Chaos, where do you think it was coming from, hmm?''

---Anonymous
@end flushright
@c (via François Pinard)

Autoconf is a tool for producing shell scripts that automatically
configure software source code packages to adapt to many kinds of
POSIX-like systems.  The configuration scripts produced by Autoconf
are independent of Autoconf when they are run, so their users do not
need to have Autoconf.

The configuration scripts produced by Autoconf require no manual user
intervention when run; they do not normally even need an argument
specifying the system type.  Instead, they individually test for the
presence of each feature that the software package they are for might need.
(Before each check, they print a one-line message stating what they are
checking for, so the user doesn't get too bored while waiting for the
script to finish.)  As a result, they deal well with systems that are
hybrids or customized from the more common POSIX variants.  There is
no need to maintain files that list the features supported by each
release of each variant of POSIX.

For each software package that Autoconf is used with, it creates a
configuration script from a template file that lists the system features
that the package needs or can use.  After the shell code to recognize
and respond to a system feature has been written, Autoconf allows it to
be shared by many software packages that can use (or need) that feature.
If it later turns out that the shell code needs adjustment for some
reason, it needs to be changed in only one place; all of the
configuration scripts can be regenerated automatically to take advantage
of the updated code.

@c "Those who do not understand Unix are condemned to reinvent it, poorly."
@c --Henry Spencer, 1987 (see https://en.wikipedia.org/wiki/Unix_philosophy)
Those who do not understand Autoconf are condemned to reinvent it, poorly.
The primary goal of Autoconf is making the @emph{user's} life easier;
making the @emph{maintainer's} life easier is only a secondary goal.
Put another way, the primary goal is not to make the generation of
@file{configure} automatic for package maintainers (although patches
along that front are welcome, since package maintainers form the user
base of Autoconf); rather, the goal is to make @file{configure}
painless, portable, and predictable for the end user of each
@dfn{autoconfiscated} package.  And to this degree, Autoconf is highly
successful at its goal---most complaints to the Autoconf list are
about difficulties in writing Autoconf input, and not in the behavior of
the resulting @file{configure}.  Even packages that don't use Autoconf
will generally provide a @file{configure} script, and the most common
complaint about these alternative home-grown scripts is that they fail
to meet one or more of the GNU Coding Standards (@pxref{Configuration, , ,
standards, The GNU Coding Standards}) that users
have come to expect from Autoconf-generated @file{configure} scripts.

The Metaconfig package is similar in purpose to Autoconf, but the
scripts it produces require manual user intervention, which is quite
inconvenient when configuring large source trees.  Unlike Metaconfig
scripts, Autoconf scripts can support cross-compiling, if some care is
taken in writing them.

Autoconf does not solve all problems related to making portable
software packages---for a more complete solution, it should be used in
concert with other GNU build tools like Automake and
Libtool.  These other tools take on jobs like the creation of a
portable, recursive makefile with all of the standard targets,
linking of shared libraries, and so on.  @xref{The GNU Build System},
for more information.

Autoconf imposes some restrictions on the names of macros used with
@code{#if} in C programs (@pxref{Preprocessor Symbol Index}).

Autoconf requires GNU M4 version 1.4.8 or later in order to
generate the scripts.  It uses features that some versions of M4,
including GNU M4 1.3, do not have.  Autoconf works better
with GNU M4 version 1.4.16 or later, though this is not
required.

@xref{Autoconf 1}, for information about upgrading from version 1.
@xref{History}, for the story of Autoconf's development.  @xref{FAQ},
for answers to some common questions about Autoconf.

See the @uref{https://@/www.gnu.org/@/software/@/autoconf/,
Autoconf web page} for up-to-date information, details on the mailing
lists, pointers to a list of known bugs, etc.

Mail suggestions to @email{autoconf@@gnu.org, the Autoconf mailing
list}.  Past suggestions are
@uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf/, archived}.

Mail bug reports to @email{bug-autoconf@@gnu.org, the
Autoconf Bugs mailing list}.  Past bug reports are
@uref{https://@/lists.gnu.org/@/archive/@/html/@/bug-autoconf/, archived}.

If possible, first check that your bug is
not already solved in current development versions, and that it has not
been reported yet.  Be sure to include all the needed information and a
short @file{configure.ac} that demonstrates the problem.

Autoconf's development tree is accessible via @command{git}; see the
@uref{https://@/savannah.gnu.org/@/projects/@/autoconf/, Autoconf
Summary} for details, or view
@uref{https://@/git.savannah.gnu.org/@/cgit/@/autoconf.git, the actual
repository}.  Patches relative to the current @command{git} version can
be sent for review to the @email{autoconf-patches@@gnu.org, Autoconf
Patches mailing list}, with discussion on prior patches
@uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-@/patches/,
archived}; and all commits are posted in the read-only
@email{autoconf-commit@@gnu.org, Autoconf Commit mailing list}, which is
also @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-commit/,
archived}.

Because of its mission, the Autoconf package itself
includes only a set of often-used
macros that have already demonstrated their usefulness.  Nevertheless,
if you wish to share your macros, or find existing ones, see the
@uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
Archive}, which is kindly run by @email{simons@@cryp.to,
Peter Simons}.


@c ================================================= The GNU Build System

@node The GNU Build System
@chapter The GNU Build System
@cindex GNU build system

Autoconf solves an important problem---reliable discovery of
system-specific build and runtime information---but this is only one
piece of the puzzle for the development of portable software.  To this
end, the GNU project has developed a suite of integrated
utilities to finish the job Autoconf started: the GNU build
system, whose most important components are Autoconf, Automake, and
Libtool.  In this chapter, we introduce you to those tools, point you
to sources of more information, and try to convince you to use the
entire GNU build system for your software.

@menu
* Automake::                    Escaping makefile hell
* Gnulib::                      The GNU portability library
* Libtool::                     Building libraries portably
* Pointers::                    More info on the GNU build system
@end menu

@node Automake
@section Automake

The ubiquity of @command{make} means that a makefile is almost the
only viable way to distribute automatic build rules for software, but
one quickly runs into its numerous limitations.  Its lack of
support for automatic dependency tracking, recursive builds in
subdirectories, reliable timestamps (e.g., for network file systems), and
so on, mean that developers must painfully (and often incorrectly)
reinvent the wheel for each project.  Portability is non-trivial, thanks
to the quirks of @command{make} on many systems.  On top of all this is the
manual labor required to implement the many standard targets that users
have come to expect (@code{make install}, @code{make distclean},
@code{make uninstall}, etc.).  Since you are, of course, using Autoconf,
you also have to insert repetitive code in your @file{Makefile.in} to
recognize @code{@@CC@@}, @code{@@CFLAGS@@}, and other substitutions
provided by @command{configure}.  Into this mess steps @dfn{Automake}.
@cindex Automake

Automake allows you to specify your build needs in a @file{Makefile.am}
file with a vastly simpler and more powerful syntax than that of a plain
makefile, and then generates a portable @file{Makefile.in} for
use with Autoconf.  For example, the @file{Makefile.am} to build and
install a simple ``Hello world'' program might look like:

@example
bin_PROGRAMS = hello
hello_SOURCES = hello.c
@end example

@noindent
The resulting @file{Makefile.in} (~400 lines) automatically supports all
the standard targets, the substitutions provided by Autoconf, automatic
dependency tracking, @code{VPATH} building, and so on.  @command{make}
builds the @code{hello} program, and @code{make install} installs it
in @file{/usr/local/bin} (or whatever prefix was given to
@command{configure}, if not @file{/usr/local}).

The benefits of Automake increase for larger packages (especially ones
with subdirectories), but even for small programs the added convenience
and portability can be substantial.  And that's not all@enddots{}

@node Gnulib
@section Gnulib

GNU software has a well-deserved reputation for running on
many different types of systems.  While our primary goal is to write
software for the GNU system, many users and developers have
been introduced to us through the systems that they were already using.

@cindex Gnulib
Gnulib is a central location for common GNU code, intended to
be shared among free software packages.  Its components are typically
shared at the source level, rather than being a library that gets built,
installed, and linked against.  The idea is to copy files from Gnulib
into your own source tree.  There is no distribution tarball; developers
should just grab source modules from the repository.  The source files
are available online, under various licenses, mostly GNU
GPL or GNU LGPL.

Gnulib modules typically contain C source code along with Autoconf
macros used to configure the source code.  For example, the Gnulib
@code{stdckdint} module implements a @file{stdckdint.h} header that nearly
conforms to C23, even on older hosts that lack @file{stdckdint.h}.
This module contains a source file for the replacement header, along
with an Autoconf macro that arranges to use the replacement header on
older systems.

For more information, consult the Gnulib website,
@uref{https://@/www.gnu.org/@/software/@/gnulib/}.

@node Libtool
@section Libtool

Often, one wants to build not only programs, but libraries, so that
other programs can benefit from the fruits of your labor.  Ideally, one
would like to produce @emph{shared} (dynamically linked) libraries,
which can be used by multiple programs without duplication on disk or in
memory and can be updated independently of the linked programs.
Producing shared libraries portably, however, is the stuff of
nightmares---each system has its own incompatible tools, compiler flags,
and magic incantations.  Fortunately, GNU provides a solution:
@dfn{Libtool}.
@cindex Libtool

Libtool handles all the requirements of building shared libraries for
you, and at this time seems to be the @emph{only} way to do so with any
portability.  It also handles many other headaches, such as: the
interaction of Make rules with the variable suffixes of
shared libraries, linking reliably with shared libraries before they are
installed by the superuser, and supplying a consistent versioning system
(so that different versions of a library can be installed or upgraded
without breaking binary compatibility).  Although Libtool, like
Autoconf, can be used without Automake, it is most simply utilized in
conjunction with Automake---there, Libtool is used automatically
whenever shared libraries are needed, and you need not know its syntax.

@node Pointers
@section Pointers

Developers who are used to the simplicity of @command{make} for small
projects on a single system might be daunted at the prospect of
learning to use Automake and Autoconf.  As your software is
distributed to more and more users, however, you otherwise
quickly find yourself putting lots of effort into reinventing the
services that the GNU build tools provide, and making the
same mistakes that they once made and overcame.  (Besides, since
you're already learning Autoconf, Automake is a piece of cake.)

There are a number of places that you can go to for more information on
the GNU build tools.

@itemize @minus

@item Web

The project home pages for
@uref{https://@/www@/.gnu@/.org/@/software/@/autoconf/, Autoconf},
@uref{https://@/www@/.gnu@/.org/@/software/@/automake/, Automake},
@uref{https://@/www@/.gnu@/.org/@/software/@/gnulib/, Gnulib}, and
@uref{https://@/www@/.gnu@/.org/@/software/@/libtool/, Libtool}.

@item Automake Manual

@xref{Top, , Automake, automake, GNU Automake}, for more
information on Automake.

@item Books

The book @cite{GNU Autoconf, Automake and
Libtool}@footnote{@cite{GNU Autoconf, Automake and Libtool},
by G. V. Vaughan, B. Elliston, T. Tromey, and I. L. Taylor.  SAMS (originally
New Riders), 2000, ISBN 1578701902.} describes the complete GNU
build environment.  You can also find
@uref{https://@/www.sourceware.org/@/autobook/, the entire book on-line}.

@end itemize

@c ================================================= Making configure Scripts.

@node Making configure Scripts
@chapter Making @command{configure} Scripts
@cindex @file{aclocal.m4}
@cindex @command{configure}

The configuration scripts that Autoconf produces are by convention
called @command{configure}.  When run, @command{configure} creates several
files, replacing configuration parameters in them with appropriate
values.  The files that @command{configure} creates are:

@itemize @minus
@item
one or more @file{Makefile} files, usually one in each subdirectory of the
package (@pxref{Makefile Substitutions});

@item
optionally, a C header file, the name of which is configurable,
containing @code{#define} directives (@pxref{Configuration Headers});

@item
a shell script called @file{config.status} that, when run, recreates
the files listed above (@pxref{config.status Invocation});

@item
an optional shell script normally called @file{config.cache}
(created when using @samp{configure --config-cache}) that
saves the results of running many of the tests (@pxref{Cache Files});

@item
a file called @file{config.log} containing any messages produced by
compilers, to help debugging if @command{configure} makes a mistake.
@end itemize

@cindex @file{configure.ac}
To create a @command{configure} script with Autoconf, you need
to write an Autoconf input file @file{configure.ac} and run
@command{autoconf} on it.  If you write your own feature tests to
supplement those that come with Autoconf, you might also write files
called @file{aclocal.m4} and @file{acsite.m4}.  If you use a C header
file to contain @code{#define} directives, you might also run
@command{autoheader}, and you can distribute the generated file
@file{config.h.in} with the package.

Here is a diagram showing how the files that can be used in
configuration are produced.  Programs that are executed are suffixed by
@samp{*}.  Optional files are enclosed in square brackets (@samp{[]}).
@command{autoconf} and @command{autoheader} also read the installed Autoconf
macro files (by reading @file{autoconf.m4}).

@noindent
Files used in preparing a software package for distribution, when using
just Autoconf:
@example
your source files --> [autoscan*] --> [configure.scan] --> configure.ac

@group
configure.ac --.
               |   .------> autoconf* -----> configure
[aclocal.m4] --+---+
               |   `-----> [autoheader*] --> [config.h.in]
[acsite.m4] ---'
@end group

Makefile.in
@end example

@noindent
Additionally, if you use Automake, the following additional productions
come into play:

@example
@group
[acinclude.m4] --.
                 |
[local macros] --+--> aclocal* --> aclocal.m4
                 |
configure.ac ----'
@end group

@group
configure.ac --.
               +--> automake* --> Makefile.in
Makefile.am ---'
@end group
@end example

@noindent
Files used in configuring a software package:
@example
@group
                       .-------------> [config.cache]
configure* ------------+-------------> config.log
                       |
[config.h.in] -.       v            .-> [config.h] -.
               +--> config.status* -+               +--> make*
Makefile.in ---'                    `-> Makefile ---'
@end group
@end example

@menu
* Writing Autoconf Input::      What to put in an Autoconf input file
* autoscan Invocation::         Semi-automatic @file{configure.ac} writing
* ifnames Invocation::          Listing the conditionals in source code
* autoconf Invocation::         How to create configuration scripts
* autoreconf Invocation::       Remaking multiple @command{configure} scripts
@end menu

@node Writing Autoconf Input
@section Writing @file{configure.ac}

To produce a @command{configure} script for a software package, create a
file called @file{configure.ac} that contains invocations of the
Autoconf macros that test the system features your package needs or can
use.  Autoconf macros already exist to check for many features; see
@ref{Existing Tests}, for their descriptions.  For most other features,
you can use Autoconf template macros to produce custom checks; see
@ref{Writing Tests}, for information about them.  For especially tricky
or specialized features, @file{configure.ac} might need to contain some
hand-crafted shell commands; see @ref{Portable Shell, , Portable Shell
Programming}.  The @command{autoscan} program can give you a good start
in writing @file{configure.ac} (@pxref{autoscan Invocation}, for more
information).

@cindex @file{configure.in}
Previous versions of Autoconf promoted the name @file{configure.in},
which is somewhat ambiguous (the tool needed to process this file is not
described by its extension), and introduces a slight confusion with
@file{config.h.in} and so on (for which @samp{.in} means ``to be
processed by @command{configure}'').  Using @file{configure.ac} is now
preferred, while the use of @file{configure.in} will cause warnings
from @command{autoconf}.

@menu
* Shell Script Compiler::       Autoconf as solution of a problem
* Autoconf Language::           Programming in Autoconf
* Autoconf Input Layout::       Standard organization of @file{configure.ac}
@end menu

@node Shell Script Compiler
@subsection A Shell Script Compiler

Just as for any other computer language, in order to properly program
@file{configure.ac} in Autoconf you must understand @emph{what} problem
the language tries to address and @emph{how} it does so.

The problem Autoconf addresses is that the world is a mess.  After all,
you are using Autoconf in order to have your package compile easily on
all sorts of different systems, some of them being extremely hostile.
Autoconf itself bears the price for these differences: @command{configure}
must run on all those systems, and thus @command{configure} must limit itself
to their lowest common denominator of features.

Naturally, you might then think of shell scripts; who needs
@command{autoconf}?  A set of properly written shell functions is enough to
make it easy to write @command{configure} scripts by hand.  Sigh!
Unfortunately, even in 2008, where shells without any function support are
far and few between, there are pitfalls to avoid when making use of them.
Also, finding a Bourne shell that accepts shell functions is not trivial,
even though there is almost always one on interesting porting targets.

So, what is really needed is some kind of compiler, @command{autoconf},
that takes an Autoconf program, @file{configure.ac}, and transforms it
into a portable shell script, @command{configure}.

How does @command{autoconf} perform this task?

There are two obvious possibilities: creating a brand new language or
extending an existing one.  The former option is attractive: all
sorts of optimizations could easily be implemented in the compiler and
many rigorous checks could be performed on the Autoconf program
(e.g., rejecting any non-portable construct).  Alternatively, you can
extend an existing language, such as the @code{sh} (Bourne shell)
language.

Autoconf does the latter: it is a layer on top of @code{sh}.  It was
therefore most convenient to implement @command{autoconf} as a macro
expander: a program that repeatedly performs @dfn{macro expansions} on
text input, replacing macro calls with macro bodies and producing a pure
@code{sh} script in the end.  Instead of implementing a dedicated
Autoconf macro expander, it is natural to use an existing
general-purpose macro language, such as M4, and implement the extensions
as a set of M4 macros.


@node Autoconf Language
@subsection The Autoconf Language
@cindex quotation

The Autoconf language differs from many other computer
languages because it treats actual code the same as plain text.  Whereas
in C, for instance, data and instructions have different syntactic
status, in Autoconf their status is rigorously the same.  Therefore, we
need a means to distinguish literal strings from text to be expanded:
quotation.

When calling macros that take arguments, there must not be any white
space between the macro name and the open parenthesis.

@example
AC_INIT ([oops], [1.0]) # incorrect
AC_INIT([hello], [1.0]) # good
@end example

Arguments should
be enclosed within the quote characters @samp{[} and @samp{]}, and be
separated by commas.  Any leading blanks or newlines in arguments are ignored,
unless they are quoted.  You should always quote an argument that
might contain a macro name, comma, parenthesis, or a leading blank or
newline.  This rule applies recursively for every macro
call, including macros called from other macros.  For more details on
quoting rules, see @ref{Programming in M4}.

For instance:

@example
AC_CHECK_HEADER([stdio.h],
                [AC_DEFINE([HAVE_STDIO_H], [1],
                   [Define to 1 if you have <stdio.h>.])],
                [AC_MSG_ERROR([sorry, can't do anything for you])])
@end example

@noindent
is quoted properly.  You may safely simplify its quotation to:

@example
AC_CHECK_HEADER([stdio.h],
                [AC_DEFINE([HAVE_STDIO_H], 1,
                   [Define to 1 if you have <stdio.h>.])],
                [AC_MSG_ERROR([sorry, can't do anything for you])])
@end example

@noindent
because @samp{1} cannot contain a macro call.  Here, the argument of
@code{AC_MSG_ERROR} must be quoted; otherwise, its comma would be
interpreted as an argument separator.  Also, the second and third arguments
of @samp{AC_CHECK_HEADER} must be quoted, since they contain
macro calls.  The three arguments @samp{HAVE_STDIO_H}, @samp{stdio.h},
and @samp{Define to 1 if you have <stdio.h>.} do not need quoting, but
if you unwisely defined a macro with a name like @samp{Define} or
@samp{stdio} then they would need quoting.  Cautious Autoconf users
would keep the quotes, but many Autoconf users find such precautions
annoying, and would rewrite the example as follows:

@example
AC_CHECK_HEADER(stdio.h,
                [AC_DEFINE(HAVE_STDIO_H, 1,
                   [Define to 1 if you have <stdio.h>.])],
                [AC_MSG_ERROR([sorry, can't do anything for you])])
@end example

@noindent
This is safe, so long as you adopt good naming conventions and do not
define macros with names like @samp{HAVE_STDIO_H}, @samp{stdio}, or
@samp{h}.  Though it is also safe here to omit the quotes around
@samp{Define to 1 if you have <stdio.h>.} this is not recommended, as
message strings are more likely to inadvertently contain commas.

The following example is wrong and dangerous, as it is underquoted:

@example
AC_CHECK_HEADER(stdio.h,
                AC_DEFINE(HAVE_STDIO_H, 1,
                   Define to 1 if you have <stdio.h>.),
                AC_MSG_ERROR([sorry, can't do anything for you]))
@end example

In other cases, you may want to use text that also resembles a macro
call.  You must quote that text (whether just the potential problem, or
the entire line) even when it is not passed as a macro argument; and you
may also have to use @code{m4_pattern_allow} (@pxref{Forbidden
Patterns}), to declare your intention that the resulting configure file
will have a literal that resembles what would otherwise be reserved for
a macro name.  For example:

@example
dnl Simulate a possible future autoconf macro
m4_define([AC_DC], [oops])
dnl Underquoted:
echo "Hard rock was here!  --AC_DC"
dnl Correctly quoted:
m4_pattern_allow([AC_DC])
echo "Hard rock was here!  --[AC_DC]"
[echo "Hard rock was here!  --AC_DC"]
@end example

@noindent
which results in this text in @file{configure}:

@example
echo "Hard rock was here!  --oops"
echo "Hard rock was here!  --AC_DC"
echo "Hard rock was here!  --AC_DC"
@end example

@noindent
When you use the same text in a macro argument, you must therefore have
an extra quotation level (since one is stripped away by the macro
substitution).  In general, then, it is a good idea to @emph{use double
quoting for all literal string arguments}, either around just the
problematic portions, or over the entire argument:

@example
m4_pattern_allow([AC_DC])
AC_MSG_WARN([[AC_DC] stinks  --Iron Maiden])
AC_MSG_WARN([[AC_DC stinks  --Iron Maiden]])
@end example

It is also possible to avoid the problematic patterns in the first
place, by the use of additional escaping (either a quadrigraph, or
creative shell constructs), in which case it is no longer necessary to
use @code{m4_pattern_allow}:

@example
echo "Hard rock was here!  --AC""_DC"
AC_MSG_WARN([[AC@@&t@@_DC stinks  --Iron Maiden]])
@end example

You are now able to understand one of the constructs of Autoconf that
has been continually misunderstood@enddots{}  The rule of thumb is that
@emph{whenever you expect macro expansion, expect quote expansion};
i.e., expect one level of quotes to be lost.  For instance:

@example
AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [],
 [AC_MSG_ERROR([you lose])])
@end example

@noindent
is incorrect: here, the first argument of @code{AC_LANG_SOURCE} is
@samp{char b[10];} and is expanded once, which results in
@samp{char b10;}; and the @code{AC_LANG_SOURCE} is also expanded prior
to being passed to @code{AC_COMPILE_IFELSE}.  (There was an idiom common
in Autoconf's past to
address this issue via the M4 @code{changequote} primitive, but do not
use it!)  Let's take a closer look: the author meant the first argument
to be understood as a literal, and therefore it must be quoted twice;
likewise, the intermediate @code{AC_LANG_SOURCE} macro should be quoted
once so that it is only expanded after the rest of the body of
@code{AC_COMPILE_IFELSE} is in place:

@example
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [],
  [AC_MSG_ERROR([you lose])])
@end example

@noindent
Voilà, you actually produce @samp{char b[10];} this time!

On the other hand, descriptions (e.g., the last parameter of
@code{AC_DEFINE} or @code{AS_HELP_STRING}) are not literals---they
are subject to line breaking, for example---and should not be double quoted.
Even if these descriptions are short and are not actually broken, double
quoting them yields weird results.

Some macros take optional arguments, which this documentation represents
as @ovar{arg} (not to be confused with the quote characters).  You may
just leave them empty, or use @samp{[]} to make the emptiness of the
argument explicit, or you may simply omit the trailing commas.  The
three lines below are equivalent:

@example
AC_CHECK_HEADERS([stdio.h], [], [], [])
AC_CHECK_HEADERS([stdio.h],,,)
AC_CHECK_HEADERS([stdio.h])
@end example

It is best to put each macro call on its own line in
@file{configure.ac}.  Most of the macros don't add extra newlines; they
rely on the newline after the macro call to terminate the commands.
This approach makes the generated @command{configure} script a little
easier to read by not inserting lots of blank lines.  It is generally
safe to set shell variables on the same line as a macro call, because
the shell allows assignments without intervening newlines.

You can include comments in @file{configure.ac} files by starting them
with the @samp{#}.  For example, it is helpful to begin
@file{configure.ac} files with a line like this:

@example
# Process this file with autoconf to produce a configure script.
@end example

@node Autoconf Input Layout
@subsection Standard @file{configure.ac} Layout

The order in which @file{configure.ac} calls the Autoconf macros is not
important, with a few exceptions.  Every @file{configure.ac} must
contain a call to @code{AC_INIT} before the checks, and a call to
@code{AC_OUTPUT} at the end (@pxref{Output}).  Additionally, some macros
rely on other macros having been called first, because they check
previously set values of some variables to decide what to do.  These
macros are noted in the individual descriptions (@pxref{Existing
Tests}), and they also warn you when @command{configure} is created if they
are called out of order.

To encourage consistency, here is a suggested order for calling the
Autoconf macros.  Generally speaking, the things near the end of this
list are those that could depend on things earlier in it.  For example,
library functions could be affected by types and libraries.

@display
@group
Autoconf requirements
@code{AC_INIT(@var{package}, @var{version}, @var{bug-report-address})}
information on the package
checks for programs
checks for libraries
checks for header files
checks for types
checks for structures
checks for compiler characteristics
checks for library functions
checks for system services
@code{AC_CONFIG_FILES(@r{[}@var{file@dots{}}@r{]})}
@code{AC_OUTPUT}
@end group
@end display


@node autoscan Invocation
@section Using @command{autoscan} to Create @file{configure.ac}
@cindex @command{autoscan}

The @command{autoscan} program can help you create and/or maintain a
@file{configure.ac} file for a software package.  @command{autoscan}
examines source files in the directory tree rooted at a directory given
as a command line argument, or the current directory if none is given.
It searches the source files for common portability problems and creates
a file @file{configure.scan} which is a preliminary @file{configure.ac}
for that package, and checks a possibly existing @file{configure.ac} for
completeness.

When using @command{autoscan} to create a @file{configure.ac}, you
should manually examine @file{configure.scan} before renaming it to
@file{configure.ac}; it probably needs some adjustments.
Occasionally, @command{autoscan} outputs a macro in the wrong order
relative to another macro, so that @command{autoconf} produces a warning;
you need to move such macros manually.  Also, if you want the package to
use a configuration header file, you must add a call to
@code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}).  You might
also have to change or add some @code{#if} directives to your program in
order to make it work with Autoconf (@pxref{ifnames Invocation}, for
information about a program that can help with that job).

When using @command{autoscan} to maintain a @file{configure.ac}, simply
consider adding its suggestions.  The file @file{autoscan.log}
contains detailed information on why a macro is requested.

@command{autoscan} uses several data files (installed along with Autoconf)
to determine which macros to output when it finds particular symbols in
a package's source files.  These data files all have the same format:
each line consists of a symbol, one or more blanks, and the Autoconf macro to
output if that symbol is encountered.  Lines starting with @samp{#} are
comments.

@command{autoscan} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Print the names of the files it examines and the potentially interesting
symbols it finds in them.  This output can be voluminous.

@item --debug
@itemx -d
Don't remove temporary files.

@item --include=@var{dir}
@itemx -I @var{dir}
Append @var{dir} to the include path.  Multiple invocations accumulate.

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend @var{dir} to the include path.  Multiple invocations accumulate.
@end table

@node ifnames Invocation
@section Using @command{ifnames} to List Conditionals
@cindex @command{ifnames}

@command{ifnames} can help you write @file{configure.ac} for a software
package.  It prints the identifiers that the package already uses in C
preprocessor conditionals.  If a package has already been set up to have
some portability, @command{ifnames} can thus help you figure out what its
@command{configure} needs to check for.  It may help fill in some gaps in a
@file{configure.ac} generated by @command{autoscan} (@pxref{autoscan
Invocation}).

@command{ifnames} scans all of the C source files named on the command line
(or the standard input, if none are given) and writes to the standard
output a sorted list of all the identifiers that appear in those files
in @code{#if}, @code{#ifdef}, @code{#ifndef}, @code{#elif},
@code{#elifdef}, or @code{#elifndef} directives.
It prints each identifier on a line, followed by a
space-separated list of the files in which that identifier occurs.

@noindent
@command{ifnames} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.
@end table

@node autoconf Invocation
@section Using @command{autoconf} to Create @command{configure}
@cindex @command{autoconf}

To create @command{configure} from @file{configure.ac}, run the
@command{autoconf} program with no arguments.  @command{autoconf} processes
@file{configure.ac} with the M4 macro processor, using the
Autoconf macros.  If you give @command{autoconf} an argument, it reads that
file instead of @file{configure.ac} and writes the configuration script
to the standard output instead of to @command{configure}.  If you give
@command{autoconf} the argument @option{-}, it reads from the standard
input instead of @file{configure.ac} and writes the configuration script
to the standard output.

The Autoconf macros are defined in several files.  Some of the files are
distributed with Autoconf; @command{autoconf} reads them first.  Then it
looks for the optional file @file{acsite.m4} in the directory that
contains the distributed Autoconf macro files, and for the optional file
@file{aclocal.m4} in the current directory.  Those files can contain
your site's or the package's own Autoconf macro definitions
(@pxref{Writing Autoconf Macros}, for more information).  If a macro is
defined in more than one of the files that @command{autoconf} reads, the
last definition it reads overrides the earlier ones.

@command{autoconf} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Report processing steps.

@item --debug
@itemx -d
Don't remove the temporary files.

@item --force
@itemx -f
Remake @file{configure} even if newer than its input files.

@item --include=@var{dir}
@itemx -I @var{dir}
Append @var{dir} to the include path.  Multiple invocations accumulate.

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend @var{dir} to the include path.  Multiple invocations accumulate.

@item --output=@var{file}
@itemx -o @var{file}
Save output (script or trace) to @var{file}.  The file @option{-} stands
for the standard output.

@item --warnings=@var{category}[,@var{category}...]
@itemx -W@var{category}[,@var{category}...]
@evindex WARNINGS
Enable or disable warnings related to each @var{category}.
@xref{m4_warn}, for a comprehensive list of categories.
Special values include:

@table @samp
@item all
Enable all categories of warnings.

@item none
Disable all categories of warnings.

@item error
Treat all warnings as errors.

@item no-@var{category}
Disable warnings falling into @var{category}.
@end table

The environment variable @env{WARNINGS} may also be set to a
comma-separated list of warning categories to enable or disable.
It is interpreted exactly the same way as the argument of
@option{--warnings}, but unknown categories are silently ignored.
The command line takes precedence; for instance, if @env{WARNINGS}
is set to @code{obsolete}, but @option{-Wnone} is given on the
command line, no warnings will be issued.

Some categories of warnings are on by default.
Again, for details see @ref{m4_warn}.

@item --trace=@var{macro}[:@var{format}]
@itemx -t @var{macro}[:@var{format}]
Do not create the @command{configure} script, but list the calls to
@var{macro} according to the @var{format}.  Multiple @option{--trace}
arguments can be used to list several macros.  Multiple @option{--trace}
arguments for a single macro are not cumulative; instead, you should
just make @var{format} as long as needed.

The @var{format} is a regular string, with newlines if desired, and
several special escape codes.  It defaults to @samp{$f:$l:$n:$%}; see
@ref{autom4te Invocation}, for details on the @var{format}.

@item --initialization
@itemx -i
By default, @option{--trace} does not trace the initialization of the
Autoconf macros (typically the @code{AC_DEFUN} definitions).  This
results in a noticeable speedup, but can be disabled by this option.
@end table


It is often necessary to check the content of a @file{configure.ac}
file, but parsing it yourself is extremely fragile and error-prone.  It
is suggested that you rely upon @option{--trace} to scan
@file{configure.ac}.  For instance, to find the list of variables that
are substituted, use:

@example
@group
$ @kbd{autoconf -t AC_SUBST}
configure.ac:28:AC_SUBST:SHELL
configure.ac:28:AC_SUBST:PATH_SEPARATOR
@i{More traces deleted}
@end group
@end example

@noindent
The example below highlights the difference between @samp{$@@},
@samp{$*}, and @samp{$%}.

@example
@group
$ @kbd{cat configure.ac}
AC_DEFINE(This, is, [an
[example]])
$ @kbd{autoconf -t 'AC_DEFINE:@@: $@@}
*: $*
%: $%'
@@: [This],[is],[an
[example]]
*: This,is,an
[example]
%: This:is:an [example]
@end group
@end example

@noindent
The @var{format} gives you a lot of freedom:

@example
@group
$ @kbd{autoconf -t 'AC_SUBST:$$ac_subst@{"$1"@} = "$f:$l";'}
$ac_subst@{"SHELL"@} = "configure.ac:28";
$ac_subst@{"PATH_SEPARATOR"@} = "configure.ac:28";
@i{More traces deleted}
@end group
@end example

@noindent
A long @var{separator} can be used to improve the readability of complex
structures, and to ease their parsing (for instance when no single
character is suitable as a separator):

@example
@group
$ @kbd{autoconf -t 'AM_MISSING_PROG:$@{|:::::|@}*'}
ACLOCAL|:::::|aclocal|:::::|$missing_dir
AUTOCONF|:::::|autoconf|:::::|$missing_dir
AUTOMAKE|:::::|automake|:::::|$missing_dir
@i{More traces deleted}
@end group
@end example

@node autoreconf Invocation
@section Using @command{autoreconf} to Update @command{configure} Scripts
@cindex @command{autoreconf}

Installing the various components of the GNU Build System can be
tedious: running @command{autopoint} for Gettext, @command{automake} for
@file{Makefile.in} etc.@: in each directory.  It may be needed either
because some tools such as @command{automake} have been updated on your
system, or because some of the sources such as @file{configure.ac} have
been updated, or finally, simply in order to install the GNU Build
System in a fresh tree.

@command{autoreconf} runs @command{autoconf}, @command{autoheader},
@command{aclocal}, @command{automake}, @command{libtoolize}, @command{intltoolize},
@command{gtkdocize}, and @command{autopoint} (when appropriate) repeatedly
to update the GNU Build System in the specified directories and their
subdirectories (@pxref{Subdirectories}).  By default, it only remakes
those files that are older than their sources.  The environment variables
@env{AUTOM4TE}, @env{AUTOCONF}, @env{AUTOHEADER}, @env{AUTOMAKE}, @env{ACLOCAL},
@env{AUTOPOINT}, @env{LIBTOOLIZE}, @env{INTLTOOLIZE}, @env{GTKDOCIZE}, @env{M4},
and @env{MAKE} may be used to override the invocation of the respective tools.

If you install a new version of some tool, you can make
@command{autoreconf} remake @emph{all} of the files by giving it the
@option{--force} option.

@xref{Automatic Remaking}, for Make rules to automatically
rebuild @command{configure} scripts when their source files change.  That
method handles the timestamps of configuration header templates
properly, but does not pass @option{--autoconf-dir=@var{dir}} or
@option{--localdir=@var{dir}}.

@cindex Gettext
@cindex @command{autopoint}
Gettext supplies the @command{autopoint} command to add translation
infrastructure to a source package.  If you use @command{autopoint},
your @file{configure.ac} should invoke @code{AM_GNU_GETTEXT} and
one of @code{AM_GNU_GETTEXT_VERSION(@var{gettext-version})} or
@code{AM_GNU_GETTEXT_REQUIRE_VERSION(@var{min-gettext-version})}.
@xref{autopoint Invocation, , Invoking the @code{autopoint} Program,
gettext, GNU @code{gettext} utilities}, for further details.

@noindent
@command{autoreconf} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Print the name of each directory @command{autoreconf} examines and the
commands it runs.  If given two or more times, pass @option{--verbose}
to subordinate tools that support it.

@item --debug
@itemx -d
Don't remove the temporary files.

@item --force
@itemx -f
Consider all generated and standard auxiliary files to be obsolete.
This remakes even @file{configure} scripts and configuration headers
that are newer than their input files (@file{configure.ac} and, if
present, @file{aclocal.m4}).

If deemed appropriate, this option triggers calls to @samp{automake
--force-missing}.  Passing both @option{--force} and @option{--install}
to @command{autoreconf} will in turn undo any customizations to standard
files.  Note that the macro @code{AM_INIT_AUTOMAKE} has some options
which change the set of files considered to be standard.

@item --install
@itemx -i
Install any missing standard auxiliary files in the package.  By
default, files are copied; this can be changed with @option{--symlink}.

If deemed appropriate, this option triggers calls to
@samp{automake --add-missing},
@samp{libtoolize}, @samp{autopoint}, etc.

@item --no-recursive
Do not rebuild files in subdirectories to configure (see @ref{Subdirectories},
macro @code{AC_CONFIG_SUBDIRS}).

@item --symlink
@itemx -s
When used with @option{--install}, install symbolic links to the missing
auxiliary files instead of copying them.

@item --make
@itemx -m
When the directories were configured, update the configuration by
running @samp{./config.status --recheck && ./config.status}, and then
run @samp{make}.

@item --include=@var{dir}
@itemx -I @var{dir}
Append @var{dir} to the include path.  Multiple invocations accumulate.
Passed on to @command{aclocal}, @command{autoconf} and
@command{autoheader} internally.

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend @var{dir} to the include path.  Multiple invocations accumulate.
Passed on to @command{autoconf} and @command{autoheader} internally.

@item --warnings=@var{category}[,@var{category}...]
@itemx -W@var{category}[,@var{category}...]
@evindex WARNINGS
Enable or disable warnings related to each @var{category}.
@xref{m4_warn}, for a comprehensive list of categories.
Special values include:

@table @samp
@item all
Enable all categories of warnings.

@item none
Disable all categories of warnings.

@item error
Treat all warnings as errors.

@item no-@var{category}
Disable warnings falling into @var{category}.
@end table

The environment variable @env{WARNINGS} may also be set to a
comma-separated list of warning categories to enable or disable.
It is interpreted exactly the same way as the argument of
@option{--warnings}, but unknown categories are silently ignored.
The command line takes precedence; for instance, if @env{WARNINGS}
is set to @code{obsolete}, but @option{-Wnone} is given on the
command line, no warnings will be issued.

Some categories of warnings are on by default.
Again, for details see @ref{m4_warn}.
@end table

If you want @command{autoreconf} to pass flags that are not listed here
on to @command{aclocal}, set @code{ACLOCAL_AMFLAGS} in your @file{Makefile.am}.
Due to a limitation in the Autoconf implementation these flags currently
must be set on a single line in @file{Makefile.am}, without any
backslash-newlines or makefile comments.
Also, be aware that future Automake releases might
start flagging @code{ACLOCAL_AMFLAGS} as obsolescent, or even remove
support for it.

@c ========================================= Initialization and Output Files.

@node Setup
@chapter Initialization and Output Files

Autoconf-generated @command{configure} scripts need some information about
how to initialize, such as how to find the package's source files and
about the output files to produce.  The following sections describe the
initialization and the creation of output files.

@menu
* Initializing configure::      Option processing etc.
* Versioning::                  Dealing with Autoconf versions
* Notices::                     Copyright, version numbers in @command{configure}
* Input::                       Where Autoconf should find files
* Output::                      Outputting results from the configuration
* Configuration Actions::       Preparing the output based on results
* Configuration Files::         Creating output files
* Makefile Substitutions::      Using output variables in makefiles
* Configuration Headers::       Creating a configuration header file
* Configuration Commands::      Running arbitrary instantiation commands
* Configuration Links::         Links depending on the configuration
* Subdirectories::              Configuring independent packages together
* Default Prefix::              Changing the default installation prefix
@end menu

@node Initializing configure
@section Initializing @command{configure}

Every @command{configure} script must call @code{AC_INIT} before doing
anything else that produces output.  Calls to silent macros, such as
@code{AC_DEFUN}, may also occur prior to @code{AC_INIT}, although these
are generally used via @file{aclocal.m4}, since that is implicitly
included before the start of @file{configure.ac}.  The only other
required macro is @code{AC_OUTPUT} (@pxref{Output}).

@anchor{AC_INIT}
@defmac AC_INIT (@var{package}, @var{version}, @ovar{bug-report}, @
  @ovar{tarname}, @ovar{url})
@acindex{INIT}
Process any command-line arguments and perform initialization
and verification.

Set the name of the @var{package} and its @var{version}.  These are
typically used in @option{--version} support, including that of
@command{configure}.  The optional argument @var{bug-report} should be
the email to which users should send bug reports.  The package
@var{tarname} differs from @var{package}: the latter designates the full
package name (e.g., @samp{GNU Autoconf}), while the former is meant for
distribution tar ball names (e.g., @samp{autoconf}).  It defaults to
@var{package} with @samp{GNU } stripped, lower-cased, and all characters
other than alphanumerics and underscores are changed to @samp{-}.  If
provided, @var{url} should be the home page for the package.

Leading and trailing whitespace is stripped from all the arguments to
@code{AC_INIT}, and interior whitespace is collapsed to a single space.
This means that, for instance, if you want to put several email
addresses in @var{bug-report}, you can put each one on its own line:

@smallexample
@group
# We keep having problems with the mail hosting for
# gnomovision.example, so give people an alternative.
AC_INIT([Gnomovision], [17.0.1], [
    bugs@@gnomovision.example
    or gnomo-bugs@@reliable-email.example
])
@end group
@end smallexample

The arguments to @code{AC_INIT} may be computed by M4, when
@command{autoconf} is run.  For instance, if you want to include the
package's version number in the @var{tarname}, but you don't want to
repeat it, you can use a helper macro:

@smallexample
@group
m4_define([gnomo_VERSION], [17.0.1])
AC_INIT([Gnomovision],
        m4_defn([gnomo_VERSION]),
        [bugs@@gnomovision.example],
        [gnomo-]m4_defn([gnomo_VERSION]))
@end group
@end smallexample

This uses @code{m4_defn} to produce the expansion of
@code{gnomo_VERSION} @emph{as a quoted string}, so that if there happen
to be any more M4 macro names in @code{gnomo_VERSION}, they will not be
expanded. @xref{Defn,,Renaming Macros,m4,GNU m4 macro processor}.

Continuing this example, if you don't want to embed the version number
in @file{configure.ac} at all, you can use @code{m4_esyscmd} to look it
up somewhere else when @command{autoconf} is run:

@smallexample
@group
m4_define([gnomo_VERSION],
  m4_esyscmd([build-aux/git-version-gen .tarball-version]))
AC_INIT([Gnomovision],
        m4_defn([gnomo_VERSION]),
        [bugs@@gnomovision.example],
        [gnomo-]m4_defn([gnomo_VERSION]))
@end group
@end smallexample

This uses the utility script @command{git-version-gen} to look up
the package's version in its version control metadata.  This script
is part of Gnulib (@pxref{Gnulib}).

The arguments to @code{AC_INIT} are written into @file{configure} in
several different places.  Therefore, we strongly recommend that you
write any M4 logic in @code{AC_INIT} arguments to be evaluated
@emph{before} @code{AC_INIT} itself is evaluated.  For instance, in the
above example, the second argument to @code{m4_define} is @emph{not}
quoted, so the @code{m4_esyscmd} is evaluated only once, and
@code{gnomo_VERSION} is defined to the output of the command.  If the
second argument to @code{m4_define} were quoted, @code{m4_esyscmd} would
be evaluated each time the @var{version} or @var{tarname} arguments were
written to @file{configure}, and the command would be run repeatedly.

In some of the places where the arguments to @code{AC_INIT} are used,
within @file{configure}, shell evaluation cannot happen.  Therefore, the
arguments to @code{AC_INIT} may @emph{not} be computed when
@command{configure} is run.  If they contain any construct that isn't
always treated as literal by the shell (e.g.@: variable expansions),
@command{autoconf} will issue an error.

The @var{tarname} argument is used to construct filenames.  It should
not contain wildcard characters, white space, or anything else that
could be troublesome as part of a file or directory name.

Some of M4's active characters (notably parentheses, square brackets,
@samp{,} and @samp{#}) commonly appear in URLs and lists of email
addresses.  If any of these characters appear in an argument to AC_INIT,
that argument will probably need to be double-quoted to avoid errors
and mistranscriptions.  @xref{M4 Quotation}.

The following M4 macros (e.g., @code{AC_PACKAGE_NAME}), output variables
(e.g., @code{PACKAGE_NAME}), and preprocessor symbols (e.g.,
@code{PACKAGE_NAME}), are defined by @code{AC_INIT}:

@table @asis
@item @code{AC_PACKAGE_NAME}, @code{PACKAGE_NAME}
@acindex{PACKAGE_NAME}
@ovindex PACKAGE_NAME
@cvindex PACKAGE_NAME
Exactly @var{package}.

@item @code{AC_PACKAGE_TARNAME}, @code{PACKAGE_TARNAME}
@acindex{PACKAGE_TARNAME}
@ovindex PACKAGE_TARNAME
@cvindex PACKAGE_TARNAME
Exactly @var{tarname}, possibly generated from @var{package}.

@item @code{AC_PACKAGE_VERSION}, @code{PACKAGE_VERSION}
@acindex{PACKAGE_VERSION}
@ovindex PACKAGE_VERSION
@cvindex PACKAGE_VERSION
Exactly @var{version}.

@item @code{AC_PACKAGE_STRING}, @code{PACKAGE_STRING}
@acindex{PACKAGE_STRING}
@ovindex PACKAGE_STRING
@cvindex PACKAGE_STRING
Exactly @samp{@var{package} @var{version}}.

@item @code{AC_PACKAGE_BUGREPORT}, @code{PACKAGE_BUGREPORT}
@acindex{PACKAGE_BUGREPORT}
@ovindex PACKAGE_BUGREPORT
@cvindex PACKAGE_BUGREPORT
Exactly @var{bug-report}, if one was provided.  Typically an email
address, or URL to a bug management web page.

@item @code{AC_PACKAGE_URL}, @code{PACKAGE_URL}
@acindex{PACKAGE_URL}
@ovindex PACKAGE_URL
@cvindex PACKAGE_URL
Exactly @var{url}, if one was provided.  If @var{url} was empty, but
@var{package} begins with @samp{GNU }, then this defaults to
@samp{https://@/www.gnu.org/@/software/@/@var{tarname}/}, otherwise, no URL is
assumed.
@end table
@end defmac

If your @command{configure} script does its own option processing, it
should inspect @samp{$@@} or @samp{$*} immediately after calling
@code{AC_INIT}, because other Autoconf macros liberally use the
@command{set} command to process strings, and this has the side effect
of updating @samp{$@@} and @samp{$*}.  However, we suggest that you use
standard macros like @code{AC_ARG_ENABLE} instead of attempting to
implement your own option processing.  @xref{Site Configuration}.

@node Versioning
@section Dealing with Autoconf versions
@cindex Autoconf version
@cindex version, Autoconf

The following optional macros can be used to help choose the minimum
version of Autoconf that can successfully compile a given
@file{configure.ac}.

@defmac AC_PREREQ (@var{version})
@acindex{PREREQ}
@cindex Version
Ensure that a recent enough version of Autoconf is being used.  If the
version of Autoconf being used to create @command{configure} is
earlier than @var{version}, print an error message to the standard
error output and exit with failure (exit status is 63).  For example:

@example
AC_PREREQ([@value{VERSION}])
@end example

This macro may be used before @code{AC_INIT}.
@end defmac

@defmac AC_AUTOCONF_VERSION
@acindex{AUTOCONF_VERSION}
This macro was introduced in Autoconf 2.62.  It identifies the version
of Autoconf that is currently parsing the input file, in a format
suitable for @code{m4_version_compare} (@pxref{m4_version_compare}); in
other words, for this release of Autoconf, its value is
@samp{@value{VERSION}}.  One potential use of this macro is for writing
conditional fallbacks based on when a feature was added to Autoconf,
rather than using @code{AC_PREREQ} to require the newer version of
Autoconf.  However, remember that the Autoconf philosophy favors feature
checks over version checks.

You should not expand this macro directly; use
@samp{m4_defn([AC_AUTOCONF_VERSION])} instead.  This is because some
users might
have a beta version of Autoconf installed, with arbitrary letters
included in its version string.  This means it is possible for the
version string to contain the name of a defined macro, such that
expanding @code{AC_AUTOCONF_VERSION} would trigger the expansion of that
macro during rescanning, and change the version string to be different
than what you intended to check.
@end defmac

@node Notices
@section Notices in @command{configure}
@cindex Notices in @command{configure}

The following macros manage version numbers for @command{configure}
scripts.  Using them is optional.

@defmac AC_COPYRIGHT (@var{copyright-notice})
@acindex{COPYRIGHT}
@cindex Copyright Notice
State that, in addition to the Free Software Foundation's copyright on
the Autoconf macros, parts of your @command{configure} are covered by the
@var{copyright-notice}.

The @var{copyright-notice} shows up in both the head of
@command{configure} and in @samp{configure --version}.
@end defmac


@defmac AC_REVISION (@var{revision-info})
@acindex{REVISION}
@cindex Revision
Copy revision stamp @var{revision-info} into the @command{configure}
script, with any dollar signs or double-quotes removed.  This macro lets
you put a revision stamp from @file{configure.ac} into @command{configure}
that the traditional version control systems RCS and CVS can update,
without these systems changing it again when you check in the resulting
@command{configure}.  That way, you can determine easily which revision of
@file{configure.ac} a particular @command{configure} corresponds to.

For example, this line in @file{configure.ac}:

@example
AC_REVISION([$Revision: 1.30 $])
@end example

@noindent
produces this in @command{configure}:

@example
#!/bin/sh
# From configure.ac Revision: 1.30
@end example
@end defmac


@node Input
@section Configure Input: Source Code, Macros, and Auxiliary Files

The following macros help you manage the contents of your source tree.

@anchor{AC_CONFIG_SRCDIR}
@defmac AC_CONFIG_SRCDIR (@var{unique-file-in-source-dir})
@acindex{CONFIG_SRCDIR}
Distinguish this package's source directory from other source
directories that might happen to exist in the file system.
@var{unique-file-in-source-dir} should name a file that is unique to
this package.  @command{configure} will verify that this file exists in
@file{@var{srcdir}}, before it runs any other checks.

Use of this macro is strongly recommended.  It protects against people
accidentally specifying the wrong directory with @option{--srcdir}.
@xref{configure Invocation}, for more information.
@end defmac

Packages that use @command{aclocal} to generate @file{aclocal.m4}
should declare where local macros can be found using
@code{AC_CONFIG_MACRO_DIRS}.

@defmac AC_CONFIG_MACRO_DIRS (@var{dir1} [@var{dir2} ... @var{dirN}])
@defmacx AC_CONFIG_MACRO_DIR (@var{dir})
@acindex{CONFIG_MACRO_DIRS}
@acindex{CONFIG_MACRO_DIR}
@acindex{CONFIG_MACRO_DIR_TRACE}
Specify the given directories as the location of additional local Autoconf
macros.  These macros are intended for use by commands like
@command{autoreconf} or @command{aclocal} that trace macro calls; they should
be called directly from @file{configure.ac} so that tools that install
macros for @command{aclocal} can find the macros' declarations.  Tools
that want to learn which directories have been selected should trace
@code{AC_CONFIG_MACRO_DIR_TRACE}, which will be called once per directory.

AC_CONFIG_MACRO_DIRS is the preferred form, and can be called multiple
times and with multiple arguments; in such cases, directories in earlier
calls are expected to be searched before directories in later calls, and
directories appearing in the same call are expected to be searched in
the order in which they appear in the call.  For historical reasons, the
macro AC_CONFIG_MACRO_DIR can also be used once, if it appears first,
for tools such as older @command{libtool} that weren't prepared to
handle multiple directories.  For example, a usage like

@smallexample
AC_CONFIG_MACRO_DIR([dir1])
AC_CONFIG_MACRO_DIRS([dir2])
AC_CONFIG_MACRO_DIRS([dir3 dir4])
@end smallexample

will cause the trace of AC_CONFIG_MACRO_DIR_TRACE to appear four times,
and should cause the directories to be searched in this order:
@samp{dir1 dir2 dir3 dir4}.

Note that if you use @command{aclocal} from an Automake release prior to
1.13 to generate @file{aclocal.m4}, you must also set
@code{ACLOCAL_AMFLAGS = -I @var{dir1} [-I @var{dir2} ... -I @var{dirN}]}
in your top-level @file{Makefile.am}.  Due to a limitation in
the Autoconf implementation of @command{autoreconf}, these include
directives currently must be set on a single line in @file{Makefile.am},
without any backslash-newlines or makefile comments.
@end defmac

@prindex @command{config.guess}
@prindex @command{config.sub}
@prindex @command{install-sh}

Some Autoconf macros require auxiliary scripts.  @code{AC_PROG_INSTALL}
(@pxref{Particular Programs}) requires a
fallback implementation of @command{install} called @file{install-sh},
and the @code{AC_CANONICAL} macros (@pxref{Manual Configuration})
require the system-identification scripts @file{config.sub} and
@file{config.guess}.  Third-party tools, such as Automake and Libtool,
may require additional auxiliary scripts.

By default, @command{configure} looks for these scripts next to itself,
in @file{@var{srcdir}}.  For convenience when working with subdirectories
with their own configure scripts (@pxref{Subdirectories}), if the
scripts are not in @file{@var{srcdir}} it will also look in
@file{@var{srcdir}/..} and @file{@var{srcdir}/../..}.  All of the
scripts must be found in the same directory.

If these default locations are not adequate, or simply to reduce clutter
at the top level of the source tree, packages can use
@code{AC_CONFIG_AUX_DIR} to declare where to look for auxiliary scripts.

@defmac AC_CONFIG_AUX_DIR (@var{dir})
@acindex{CONFIG_AUX_DIR}
Look for auxiliary scripts in @var{dir}.  Normally, @var{dir} should be a
relative path, which is taken as relative to @file{@var{srcdir}}.
If @var{dir} is an absolute path or contains shell variables, however,
it is used as-is.

When the goal of using @code{AC_CONFIG_AUX_DIR} is to reduce clutter at
the top level of the source tree, the conventional name for @var{dir} is
@file{build-aux}.  If you need portability to DOS variants, do not name
the auxiliary directory @file{aux}.  @xref{File System Conventions}.
@end defmac

@defmac AC_REQUIRE_AUX_FILE (@var{file})
@acindex{REQUIRE_AUX_FILE}
@vrindex ac_aux_dir
Declare that @var{file} is an auxiliary script needed by this configure
script, and set the shell variable @code{ac_aux_dir} to the directory
where it can be found.  The value of @code{ac_aux_dir} is guaranteed to
end with a @samp{/}.

Macros that need auxiliary scripts must use this macro to register each
script they need.
@end defmac

@command{configure} checks for all the auxiliary scripts it needs on
startup, and exits with an error if any are missing.

@command{autoreconf} also detects missing auxiliary scripts.  When used
with the @option{--install} option, @command{autoreconf} will try to add
missing scripts to the directory specified by @code{AC_CONFIG_AUX_DIR},
or to the top level of the source tree if @code{AC_CONFIG_AUX_DIR} was
not used.  It can always do this for the scripts needed by Autoconf core
macros: @file{install-sh}, @file{config.sub}, and @file{config.guess}.
Many other commonly-needed scripts are installed by the third-party
tools that @command{autoreconf} knows how to run, such as @file{missing}
for Automake and @file{ltmain.sh} for Libtool.

If you are using Automake, auxiliary scripts will automatically be
included in the tarball created by @command{make dist}.  If you are
not using Automake you will need to arrange for auxiliary scripts to
be included in tarballs yourself.  Auxiliary scripts should normally
@emph{not} be checked into a version control system, for the same
reasons that @command{configure} shouldn't be.

The scripts needed by Autoconf core macros can be found in
@file{$(datadir)/autoconf/build-aux} of the Autoconf installation
(@pxref{Installation Directory Variables}).
@file{install-sh} can be downloaded from
@url{https://git.savannah.gnu.org/cgit/automake.git/plain/lib/install-sh}.
@file{config.sub} and @file{config.guess} can be downloaded from
@url{https://git.savannah.gnu.org/cgit/config.git/tree/}.

@node Output
@section Outputting Files
@cindex Outputting files

Every Autoconf script, e.g., @file{configure.ac}, should finish by
calling @code{AC_OUTPUT}.  That is the macro that generates and runs
@file{config.status}, which in turn creates the makefiles and any
other files resulting from configuration.  This is the only required
macro besides @code{AC_INIT} (@pxref{Input}).

@anchor{AC_OUTPUT}
@defmac AC_OUTPUT
@acindex{OUTPUT}
@cindex Instantiation
Generate @file{config.status} and launch it.  Call this macro once, at
the end of @file{configure.ac}.

@file{config.status} performs all the configuration actions: all the
output files (see @ref{Configuration Files}, macro
@code{AC_CONFIG_FILES}), header files (see @ref{Configuration Headers},
macro @code{AC_CONFIG_HEADERS}), commands (see @ref{Configuration
Commands}, macro @code{AC_CONFIG_COMMANDS}), links (see
@ref{Configuration Links}, macro @code{AC_CONFIG_LINKS}), subdirectories
to configure (see @ref{Subdirectories}, macro @code{AC_CONFIG_SUBDIRS})
are honored.

The location of your @code{AC_OUTPUT} invocation is the exact point
where configuration actions are taken: any code afterwards is
executed by @command{configure} once @command{config.status} was run.  If
you want to bind actions to @command{config.status} itself
(independently of whether @command{configure} is being run), see
@ref{Configuration Commands, , Running Arbitrary Configuration
Commands}.
@end defmac

Historically, the usage of @code{AC_OUTPUT} was somewhat different.
@xref{Obsolete Macros}, for a description of the arguments that
@code{AC_OUTPUT} used to support.


If you run @command{make} in subdirectories, you should run it using the
@command{make} variable @code{MAKE}.  Most versions of @command{make} set
@code{MAKE} to the name of the @command{make} program plus any options it
was given.  (But many do not include in it the values of any variables
set on the command line, so those are not passed on automatically.)
Some old versions of @command{make} do not set this variable.  The
following macro allows you to use it even with those versions.

@anchor{AC_PROG_MAKE_SET}
@defmac AC_PROG_MAKE_SET
@acindex{PROG_MAKE_SET}
@ovindex SET_MAKE
If the Make command, @code{$MAKE} if set or else @samp{make}, predefines
@code{$(MAKE)}, define output variable @code{SET_MAKE} to be empty.
Otherwise, define @code{SET_MAKE} to a macro definition that sets
@code{$(MAKE)}, such as @samp{MAKE=make}.  Calls @code{AC_SUBST} for
@code{SET_MAKE}.
@end defmac

If you use this macro, place a line like this in each @file{Makefile.in}
that runs @command{MAKE} on other directories:

@example
@@SET_MAKE@@
@end example



@node Configuration Actions
@section Performing Configuration Actions
@cindex Configuration actions

@file{configure} is designed so that it appears to do everything itself,
but there is actually a hidden slave: @file{config.status}.
@file{configure} is in charge of examining your system, but it is
@file{config.status} that actually takes the proper actions based on the
results of @file{configure}.  The most typical task of
@file{config.status} is to @emph{instantiate} files.

@acindex{CONFIG_@var{ITEMS}}
This section describes the common behavior of the four standard
instantiating macros: @code{AC_CONFIG_FILES}, @code{AC_CONFIG_HEADERS},
@code{AC_CONFIG_COMMANDS} and @code{AC_CONFIG_LINKS}.  They all
have this prototype:

@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
@c awful.
@example
AC_CONFIG_@var{ITEMS}(@var{tag}@dots{}, @r{[}@var{commands}@r{]}, @r{[}@var{init-cmds}@r{]})
@end example

@noindent
where the arguments are:

@table @var
@item tag@dots{}
A blank-or-newline-separated list of tags, which are typically the names of
the files to instantiate.

You are encouraged to use literals as @var{tags}.  In particular, you
should avoid

@example
AS_IF([@dots{}], [my_foos="$my_foos fooo"])
AS_IF([@dots{}], [my_foos="$my_foos foooo"])
AC_CONFIG_@var{ITEMS}([$my_foos])
@end example

@noindent
and use this instead:

@example
AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([fooo])])
AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([foooo])])
@end example

The macros @code{AC_CONFIG_FILES} and @code{AC_CONFIG_HEADERS} use
special @var{tag} values: they may have the form @samp{@var{output}} or
@samp{@var{output}:@var{inputs}}.  The file @var{output} is instantiated
from its templates, @var{inputs} (defaulting to @samp{@var{output}.in}).

@samp{AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])},
for example, asks for
the creation of the file @file{Makefile} that contains the expansion of the
output variables in the concatenation of @file{boiler/top.mk} and
@file{boiler/bot.mk}.

The special value @samp{-} might be used to denote the standard output
when used in @var{output}, or the standard input when used in the
@var{inputs}.  You most probably don't need to use this in
@file{configure.ac}, but it is convenient when using the command line
interface of @file{./config.status}, see @ref{config.status Invocation},
for more details.

The @var{inputs} may be absolute or relative file names.  In the latter
case they are first looked for in the build tree, and then in the source
tree.  Input files should be text files, and a line length below 2000
bytes should be safe.

@item commands
Shell commands output literally into @file{config.status}, and
associated with a tag that the user can use to tell @file{config.status}
which commands to run.  The commands are run each time a @var{tag}
request is given to @file{config.status}, typically each time the file
@file{@var{tag}} is created.

The variables set during the execution of @command{configure} are
@emph{not} available here: you first need to set them via the
@var{init-cmds}.  Nonetheless the following variables are pre-computed:

@table @code
@item srcdir
@vrindex srcdir
The name of the top source directory, assuming that the working
directory is the top build directory.  This
is what @command{configure}'s @option{--srcdir} option sets.

@item ac_top_srcdir
@vrindex ac_top_srcdir
The name of the top source directory, assuming that the working
directory is the current build directory.

@item ac_top_build_prefix
@vrindex ac_top_build_prefix
The name of the top build directory, assuming that the working
directory is the current build directory.
It can be empty, or else ends with a slash, so that you may concatenate
it.

@item ac_srcdir
@vrindex ac_srcdir
The name of the corresponding source directory, assuming that the
working directory is the current build directory.

@item tmp
@vrindex tmp
The name of a temporary directory within the build tree, which you
can use if you need to create additional temporary files.  The
directory is cleaned up when @command{config.status} is done or
interrupted.  Please use package-specific file name prefixes to
avoid clashing with files that @command{config.status} may use
internally.
@end table

@noindent
The @dfn{current} directory refers to the directory (or
pseudo-directory) containing the input part of @var{tags}.  For
instance, running

@example
AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [@dots{}], [@dots{}])
@end example

@noindent
 with @option{--srcdir=../package} produces the following values:

@example
# Argument of --srcdir
srcdir='../package'
# Reversing deep/dir
ac_top_build_prefix='../../'
# Concatenation of $ac_top_build_prefix and srcdir
ac_top_srcdir='../../../package'
# Concatenation of $ac_top_srcdir and deep/dir
ac_srcdir='../../../package/deep/dir'
@end example

@noindent
independently of @samp{in/in.in}.

@item init-cmds
Shell commands output @emph{unquoted} near the beginning of
@file{config.status}, and executed each time @file{config.status} runs
(regardless of the tag).  Because they are unquoted, for example,
@samp{$var} is output as the value of @code{var}.  @var{init-cmds}
is typically used by @file{configure} to give @file{config.status} some
variables it needs to run the @var{commands}.

You should be extremely cautious in your variable names: all the
@var{init-cmds} share the same name space and may overwrite each other
in unpredictable ways.  Sorry@enddots{}
@end table

All these macros can be called multiple times, with different
@var{tag} values, of course!


@node Configuration Files
@section Creating Configuration Files
@cindex Creating configuration files
@cindex Configuration file creation

Be sure to read the previous section, @ref{Configuration Actions}.

@anchor{AC_CONFIG_FILES}
@defmac AC_CONFIG_FILES (@var{file}@dots{}, @ovar{cmds}, @ovar{init-cmds})
@acindex{CONFIG_FILES}
Make @code{AC_OUTPUT} create each @file{@var{file}} by copying an input
file (by default @file{@var{file}.in}), substituting the output variable
values.
@c Before we used to have this feature, which was later rejected
@c because it complicates the writing of makefiles:
@c If the file would be unchanged, it is left untouched, to preserve
@c timestamp.
This macro is one of the instantiating macros; see @ref{Configuration
Actions}.  @xref{Makefile Substitutions}, for more information on using
output variables.  @xref{Setting Output Variables}, for more information
on creating them.  This macro creates the directory that the file is in
if it doesn't exist.  Usually, makefiles are created this way,
but other files, such as @file{.gdbinit}, can be specified as well.

Typical calls to @code{AC_CONFIG_FILES} look like this:

@example
AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
@end example

You can override an input file name by appending to @var{file} a
colon-separated list of input files.  Examples:

@example
AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
                [lib/Makefile:boiler/lib.mk])
@end example

@noindent
Doing this allows you to keep your file names acceptable to
DOS variants, or
to prepend and/or append boilerplate to the file.

The @var{file} names should not contain shell metacharacters.
@xref{Special Chars in Variables}.
@end defmac



@node Makefile Substitutions
@section Substitutions in Makefiles
@cindex Substitutions in makefiles
@cindex Makefile substitutions

Each subdirectory in a distribution that contains something to be
compiled or installed should come with a file @file{Makefile.in}, from
which @command{configure} creates a file @file{Makefile} in that directory.
To create @file{Makefile}, @command{configure} performs a simple variable
substitution, replacing occurrences of @samp{@@@var{variable}@@} in
@file{Makefile.in} with the value that @command{configure} has determined
for that variable.  Variables that are substituted into output files in
this way are called @dfn{output variables}.  They are ordinary shell
variables that are set in @command{configure}.  To make @command{configure}
substitute a particular variable into the output files, the macro
@code{AC_SUBST} must be called with that variable name as an argument.
Any occurrences of @samp{@@@var{variable}@@} for other variables are
left unchanged.  @xref{Setting Output Variables}, for more information
on creating output variables with @code{AC_SUBST}.

A software package that uses a @command{configure} script should be
distributed with a file @file{Makefile.in}, but no makefile; that
way, the user has to properly configure the package for the local system
before compiling it.

@xref{Makefile Conventions, , Makefile Conventions, standards, The
GNU Coding Standards}, for more information on what to put in
makefiles.

@menu
* Preset Output Variables::     Output variables that are always set
* Installation Directory Variables::  Other preset output variables
* Changed Directory Variables::  Warnings about @file{datarootdir}
* Build Directories::           Supporting multiple concurrent compiles
* Automatic Remaking::          Makefile rules for configuring
@end menu

@node Preset Output Variables
@subsection Preset Output Variables
@cindex Output variables

Some output variables are preset by the Autoconf macros.  Some of the
Autoconf macros set additional output variables, which are mentioned in
the descriptions for those macros.  @xref{Output Variable Index}, for a
complete list of output variables.  @xref{Installation Directory
Variables}, for the list of the preset ones related to installation
directories.  Below are listed the other preset ones, many of which are
precious variables (@pxref{Setting Output Variables},
@code{AC_ARG_VAR}).

The preset variables which are available during @file{config.status}
(@pxref{Configuration Actions}) may also be used during
@command{configure} tests.  For example, it is permissible to reference
@samp{$srcdir} when constructing a list of directories to pass via
the @option{-I} option during a compiler feature check.  When used in this
manner, coupled with the fact that @command{configure} is always run
from the top build directory, it is sufficient to use just
@samp{$srcdir} instead of @samp{$top_srcdir}.

@c Just say no to ASCII sorting!  We're humans, not computers.
@c These variables are listed as they would be in a dictionary:
@c actor
@c Actress
@c actress

@defvar CFLAGS
@evindex CFLAGS
@ovindex CFLAGS
Debugging and optimization options for the C compiler.  If it is not set
in the environment when @command{configure} runs, the default value is set
when you call @code{AC_PROG_CC} (or empty if you don't).  @command{configure}
uses this variable when compiling or linking programs to test for C features.

If a compiler option affects only the behavior of the preprocessor
(e.g., @option{-D@var{name}}), it should be put into @code{CPPFLAGS}
instead.  If it affects only the linker (e.g., @option{-L@var{directory}}),
it should be put into @code{LDFLAGS} instead.  If it
affects only the compiler proper, @code{CFLAGS} is the natural home for
it.  If an option affects multiple phases of the compiler, though,
matters get tricky:

@itemize @bullet
@item
If an option selects a 32-bit or 64-bit build on a bi-arch system, it
must be put direcly into @code{CC}, e.g., @code{CC='gcc -m64'}.  This is
necessary for @code{config.guess} to work right.
@item
Otherwise one approach is to put the option into @code{CC}.  Another is
to put it into both @code{CPPFLAGS} and @code{LDFLAGS}, but not into
@code{CFLAGS}.
@end itemize

However, remember that some @file{Makefile} variables are reserved by
the GNU Coding Standards for the use of the ``user''---the person
building the package.  For instance, @code{CFLAGS} is one such variable.

Sometimes package developers are tempted to set user variables such as
@code{CFLAGS} because it appears to make their job easier.  However, the
package itself should never set a user variable, particularly not to
include switches that are required for proper compilation of the
package.  Since these variables are documented as being for the package
builder, that person rightfully expects to be able to override any of
these variables at build time.  If the package developer needs to add
switches without interfering with the user, the proper way to do that is
to introduce an additional variable.  Automake makes this easy by
introducing @code{AM_CFLAGS} (@pxref{Flag Variables Ordering, , ,
automake, GNU Automake}), but the concept is the same even if
Automake is not used.
@end defvar

@defvar configure_input
@ovindex configure_input
A comment saying that the file was generated automatically by
@command{configure} and giving the name of the input file.
@code{AC_OUTPUT} adds a comment line containing this variable to the top
of every makefile it creates.  For other files, you should
reference this variable in a comment at the top of each input file.  For
example, an input shell script should begin like this:

@example
#!/bin/sh
# @@configure_input@@
@end example

@noindent
The presence of that line also reminds people editing the file that it
needs to be processed by @command{configure} in order to be used.
@end defvar

@defvar CPPFLAGS
@evindex CPPFLAGS
@ovindex CPPFLAGS
Preprocessor options for the C, C++, Objective C, and Objective C++
preprocessors and compilers.  If
it is not set in the environment when @command{configure} runs, the default
value is empty.  @command{configure} uses this variable when preprocessing
or compiling programs to test for C, C++, Objective C, and Objective C++
features.

This variable's contents should contain options like @option{-I},
@option{-D}, and @option{-U} that affect only the behavior of the
preprocessor.  Please see the explanation of @code{CFLAGS} for what you
can do if an option affects other phases of the compiler as well.

Currently, @command{configure} always links as part of a single
invocation of the compiler that also preprocesses and compiles, so it
uses this variable also when linking programs.  However, it is unwise to
depend on this behavior because the GNU Coding Standards do
not require it and many packages do not use @code{CPPFLAGS} when linking
programs.

@xref{Special Chars in Variables}, for limitations that @code{CPPFLAGS}
might run into.
@end defvar

@defvar CXXFLAGS
@evindex CXXFLAGS
@ovindex CXXFLAGS
Debugging and optimization options for the C++ compiler.  It acts like
@code{CFLAGS}, but for C++ instead of C.
@end defvar

@defvar DEFS
@ovindex DEFS
@option{-D} options to pass to the C compiler.  If @code{AC_CONFIG_HEADERS}
is called, @command{configure} replaces @samp{@@DEFS@@} with
@option{-DHAVE_CONFIG_H} instead (@pxref{Configuration Headers}).  This
variable is not defined while @command{configure} is performing its tests,
only when creating the output files.  @xref{Setting Output Variables}, for
how to check the results of previous tests.
@end defvar

@defvar ECHO_C
@defvarx ECHO_N
@defvarx ECHO_T
@ovindex ECHO_C
@ovindex ECHO_N
@ovindex ECHO_T
These obsolescent variables let you suppress the trailing newline from
@command{echo} for question-answer message pairs.
Nowadays it is better to use @code{AS_ECHO_N}.
@end defvar

@defvar ERLCFLAGS
@evindex ERLCFLAGS
@ovindex ERLCFLAGS
Debugging and optimization options for the Erlang compiler.  If it is not set
in the environment when @command{configure} runs, the default value is empty.
@command{configure} uses this variable when compiling
programs to test for Erlang features.
@end defvar

@defvar FCFLAGS
@evindex FCFLAGS
@ovindex FCFLAGS
Debugging and optimization options for the Fortran compiler.  If it
is not set in the environment when @command{configure} runs, the default
value is set when you call @code{AC_PROG_FC} (or empty if you don't).
@command{configure} uses this variable when compiling or linking
programs to test for Fortran features.
@end defvar

@defvar FFLAGS
@evindex FFLAGS
@ovindex FFLAGS
Debugging and optimization options for the Fortran 77 compiler.  If it
is not set in the environment when @command{configure} runs, the default
value is set when you call @code{AC_PROG_F77} (or empty if you don't).
@command{configure} uses this variable when compiling or linking
programs to test for Fortran 77 features.
@end defvar

@defvar LDFLAGS
@evindex LDFLAGS
@ovindex LDFLAGS
Options for the linker.  If it is not set
in the environment when @command{configure} runs, the default value is empty.
@command{configure} uses this variable when linking programs to test for
C, C++, Objective C, Objective C++, Fortran, and Go features.

This variable's contents should contain options like @option{-s} and
@option{-L} that affect only the behavior of the linker.  Please see the
explanation of @code{CFLAGS} for what you can do if an option also
affects other phases of the compiler.

Don't use this variable to pass library names
(@option{-l}) to the linker; use @code{LIBS} instead.
@end defvar

@defvar LIBS
@evindex LIBS
@ovindex LIBS
@option{-l} options to pass to the linker.  The default value is empty,
but some Autoconf macros may prepend extra libraries to this variable if
those libraries are found and provide necessary functions, see
@ref{Libraries}.  @command{configure} uses this variable when linking
programs to test for C, C++, Objective C, Objective C++, Fortran, and Go
features.
@end defvar

@defvar OBJCFLAGS
@evindex OBJCFLAGS
@ovindex OBJCFLAGS
Debugging and optimization options for the Objective C compiler.  It
acts like @code{CFLAGS}, but for Objective C instead of C.
@end defvar

@defvar OBJCXXFLAGS
@evindex OBJCXXFLAGS
@ovindex OBJCXXFLAGS
Debugging and optimization options for the Objective C++ compiler.  It
acts like @code{CXXFLAGS}, but for Objective C++ instead of C++.
@end defvar

@defvar GOFLAGS
@evindex GOFLAGS
@ovindex GOFLAGS
Debugging and optimization options for the Go compiler.  It acts like
@code{CFLAGS}, but for Go instead of C.
@end defvar

@defvar builddir
@ovindex builddir
Rigorously equal to @samp{.}.  Added for symmetry only.
@end defvar

@defvar abs_builddir
@ovindex abs_builddir
Absolute name of @code{builddir}.
@end defvar

@defvar top_builddir
@ovindex top_builddir
The relative name of the top level of the current build tree.  In the
top-level directory, this is the same as @code{builddir}.
@end defvar

@defvar top_build_prefix
@ovindex top_build_prefix
The relative name of the top level of the current build tree with final
slash if nonempty.  This is the same as @code{top_builddir}, except that
it contains zero or more runs of @code{../}, so it should not be
appended with a slash for concatenation.  This helps for @command{make}
implementations that otherwise do not treat @file{./file} and @file{file}
as equal in the top-level build directory.
@end defvar

@defvar abs_top_builddir
@ovindex abs_top_builddir
Absolute name of @code{top_builddir}.
@end defvar

@defvar srcdir
@ovindex srcdir
The name of the directory that contains the source code for
that makefile.
@end defvar

@defvar abs_srcdir
@ovindex abs_srcdir
Absolute name of @code{srcdir}.
@end defvar

@defvar top_srcdir
@ovindex top_srcdir
The name of the top-level source code directory for the
package.  In the top-level directory, this is the same as @code{srcdir}.
@end defvar

@defvar abs_top_srcdir
@ovindex abs_top_srcdir
Absolute name of @code{top_srcdir}.
@end defvar

@node Installation Directory Variables
@subsection Installation Directory Variables
@cindex Installation directories
@cindex Directories, installation

The following variables specify the directories for
package installation, see @ref{Directory Variables, , Variables for
Installation Directories, standards, The GNU Coding
Standards}, for more information.  Each variable corresponds to an
argument of @command{configure}; trailing slashes are stripped so that
expressions such as @samp{$@{prefix@}/lib} expand with only one slash
between directory names.  See the end of this section for
details on when and how to use these variables.

@defvar bindir
@ovindex bindir
The directory for installing executables that users run.
@end defvar

@defvar datadir
@ovindex datadir
The directory for installing idiosyncratic read-only
architecture-independent data.
@end defvar

@defvar datarootdir
@ovindex datarootdir
The root of the directory tree for read-only architecture-independent
data files.
@end defvar

@defvar docdir
@ovindex docdir
The directory for installing documentation files (other than Info and
man).
@end defvar

@defvar dvidir
@ovindex dvidir
The directory for installing documentation files in DVI format.
@end defvar

@defvar exec_prefix
@ovindex exec_prefix
The installation prefix for architecture-dependent files.  By default
it's the same as @code{prefix}.  You should avoid installing anything
directly to @code{exec_prefix}.  However, the default value for
directories containing architecture-dependent files should be relative
to @code{exec_prefix}.
@end defvar

@defvar htmldir
@ovindex htmldir
The directory for installing HTML documentation.
@end defvar

@defvar includedir
@ovindex includedir
The directory for installing C header files.
@end defvar

@defvar infodir
@ovindex infodir
The directory for installing documentation in Info format.
@end defvar

@defvar libdir
@ovindex libdir
The directory for installing object code libraries.
@end defvar

@defvar libexecdir
@ovindex libexecdir
The directory for installing executables that other programs run.
@end defvar

@defvar localedir
@ovindex localedir
The directory for installing locale-dependent but
architecture-independent data, such as message catalogs.  This directory
usually has a subdirectory per locale.
@end defvar

@defvar localstatedir
@ovindex localstatedir
The directory for installing modifiable single-machine data.  Content in
this directory typically survives a reboot.
@end defvar

@defvar runstatedir
@ovindex runstatedir
The directory for installing temporary modifiable single-machine data.
Content in this directory survives as long as the process is running
(such as pid files), as contrasted with @file{/tmp} that may be
periodically cleaned.  Conversely, this directory is typically cleaned
on a reboot.  By default, this is a subdirectory of
@code{localstatedir}.
@end defvar

@defvar mandir
@ovindex mandir
The top-level directory for installing documentation in man format.
@end defvar

@defvar oldincludedir
@ovindex oldincludedir
The directory for installing C header files for non-GCC compilers.
@end defvar

@defvar pdfdir
@ovindex pdfdir
The directory for installing PDF documentation.
@end defvar

@defvar prefix
@ovindex prefix
The common installation prefix for all files.  If @code{exec_prefix}
is defined to a different value, @code{prefix} is used only for
architecture-independent files.
@end defvar

@defvar psdir
@ovindex psdir
The directory for installing PostScript documentation.
@end defvar

@defvar sbindir
@ovindex sbindir
The directory for installing executables that system
administrators run.
@end defvar

@defvar sharedstatedir
@ovindex sharedstatedir
The directory for installing modifiable architecture-independent data.
@end defvar

@defvar sysconfdir
@ovindex sysconfdir
The directory for installing read-only single-machine data.
@end defvar


Most of these variables have values that rely on @code{prefix} or
@code{exec_prefix}.  It is deliberate that the directory output
variables keep them unexpanded: typically @samp{@@datarootdir@@} is
replaced by @samp{$@{prefix@}/share}, not @samp{/usr/local/share}, and
@samp{@@datadir@@} is replaced by @samp{$@{datarootdir@}}.

This behavior is mandated by the GNU Coding Standards, so that when
the user runs:

@table @samp
@item make
she can still specify a different prefix from the one specified to
@command{configure}, in which case, if needed, the package should hard
code dependencies corresponding to the make-specified prefix.

@item make install
she can specify a different installation location, in which case the
package @emph{must} still depend on the location which was compiled in
(i.e., never recompile when @samp{make install} is run).  This is an
extremely important feature, as many people may decide to install all
the files of a package grouped together, and then install links from
the final locations to there.
@end table

In order to support these features, it is essential that
@code{datarootdir} remains defined as @samp{$@{prefix@}/share},
so that its value can be expanded based
on the current value of @code{prefix}.

A corollary is that you should not use these variables except in
makefiles.  For instance, instead of trying to evaluate @code{datadir}
in @file{configure} and hard-coding it in makefiles using
e.g., @samp{AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])},
you should add
@option{-DDATADIR='$(datadir)'} to your makefile's definition of
@code{CPPFLAGS} (@code{AM_CPPFLAGS} if you are also using Automake).

Similarly, you should not rely on @code{AC_CONFIG_FILES} to replace
@code{bindir} and friends in your shell scripts and other files; instead,
let @command{make} manage their replacement.  For instance Autoconf
ships templates of its shell scripts ending with @samp{.in}, and uses a
makefile snippet similar to the following to build scripts like
@command{autoheader} and @command{autom4te}:

@example
@group
edit = sed \
        -e 's|@@bindir[@@]|$(bindir)|g' \
        -e 's|@@pkgdatadir[@@]|$(pkgdatadir)|g' \
        -e 's|@@prefix[@@]|$(prefix)|g'
@end group

@group
autoheader autom4te: Makefile
        rm -f $@@ $@@.tmp
        srcdir=''; \
          test -f ./$@@.in || srcdir=$(srcdir)/; \
          $(edit) $$@{srcdir@}$@@.in >$@@.tmp
@c $$ restore font-lock
        chmod +x $@@.tmp
        chmod a-w $@@.tmp
        mv $@@.tmp $@@
@end group

@group
autoheader: $(srcdir)/autoheader.in
autom4te: $(srcdir)/autom4te.in
@end group
@end example

Some details are noteworthy:

@table @asis
@item @samp{@@bindir[@@]}
The brackets prevent @command{configure} from replacing
@samp{@@bindir@@} in the Sed expression itself.
Brackets are preferable to a backslash here, since
POSIX says @samp{\@@} is not portable.

@item @samp{$(bindir)}
Don't use @samp{@@bindir@@}!  Use the matching makefile variable
instead.

@item @samp{$(pkgdatadir)}
The example takes advantage of the variable @samp{$(pkgdatadir)}
provided by Automake; it is equivalent to @samp{$(datadir)/$(PACKAGE)}.

@item @samp{/}
Don't use @samp{/} in the Sed expressions that replace file names since
most likely the
variables you use, such as @samp{$(bindir)}, contain @samp{/}.
Use a shell metacharacter instead, such as @samp{|}.

@item special characters
File names, file name components, and the value of @code{VPATH} should
not contain shell metacharacters or white
space.  @xref{Special Chars in Variables}.

@item dependency on @file{Makefile}
Since @code{edit} uses values that depend on the configuration specific
values (@code{prefix}, etc.)@: and not only on @code{VERSION} and so forth,
the output depends on @file{Makefile}, not @file{configure.ac}.

@item @samp{$@@}
The main rule is generic, and uses @samp{$@@} extensively to
avoid the need for multiple copies of the rule.

@item Separated dependencies and single suffix rules
You can't use them!  The above snippet cannot be (portably) rewritten
as:

@example
autoconf autoheader: Makefile
@group
.in:
        rm -f $@@ $@@.tmp
        $(edit) $< >$@@.tmp
        chmod +x $@@.tmp
        mv $@@.tmp $@@
@end group
@end example

@xref{Single Suffix Rules}, for details.

@item @samp{$(srcdir)}
Be sure to specify the name of the source directory,
otherwise the package won't support separated builds.
@end table

For the more specific installation of Erlang libraries, the following variables
are defined:

@defvar ERLANG_INSTALL_LIB_DIR
@ovindex ERLANG_INSTALL_LIB_DIR
@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
The common parent directory of Erlang library installation directories.
This variable is set by calling the @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR}
macro in @file{configure.ac}.
@end defvar

@defvar ERLANG_INSTALL_LIB_DIR_@var{library}
@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}
@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
The installation directory for Erlang library @var{library}.
This variable is set by using the
@samp{AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR}
macro in @file{configure.ac}.
@end defvar

@xref{Erlang Libraries}, for details.


@node Changed Directory Variables
@subsection Changed Directory Variables
@cindex @file{datarootdir}

In Autoconf 2.60, the set of directory variables has changed, and the
defaults of some variables have been adjusted
(@pxref{Installation Directory Variables}) to changes in the
GNU Coding Standards.  Notably, @file{datadir}, @file{infodir}, and
@file{mandir} are now expressed in terms of @file{datarootdir}.  If you are
upgrading from an earlier Autoconf version, you may need to adjust your files
to ensure that the directory variables are substituted correctly
(@pxref{Defining Directories}), and that a definition of @file{datarootdir} is
in place.  For example, in a @file{Makefile.in}, adding

@example
datarootdir = @@datarootdir@@
@end example

@noindent
is usually sufficient.  If you use Automake to create @file{Makefile.in},
it will add this for you.

To help with the transition, Autoconf warns about files that seem to use
@code{datarootdir} without defining it.  In some cases, it then expands
the value of @code{$datarootdir} in substitutions of the directory
variables.  The following example shows such a warning:

@example
$ @kbd{cat configure.ac}
AC_INIT
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
$ @kbd{cat Makefile.in}
prefix = @@prefix@@
datadir = @@datadir@@
$ @kbd{autoconf}
$ @kbd{configure}
configure: creating ./config.status
config.status: creating Makefile
config.status: WARNING:
               Makefile.in seems to ignore the --datarootdir setting
$ @kbd{cat Makefile}
prefix = /usr/local
datadir = $@{prefix@}/share
@end example

Usually one can easily change the file to accommodate both older and newer
Autoconf releases:

@example
$ @kbd{cat Makefile.in}
prefix = @@prefix@@
datarootdir = @@datarootdir@@
datadir = @@datadir@@
$ @kbd{configure}
configure: creating ./config.status
config.status: creating Makefile
$ @kbd{cat Makefile}
prefix = /usr/local
datarootdir = $@{prefix@}/share
datadir = $@{datarootdir@}
@end example

@acindex{DATAROOTDIR_CHECKED}
In some cases, however, the checks may not be able to detect that a suitable
initialization of @code{datarootdir} is in place, or they may fail to detect
that such an initialization is necessary in the output file.  If, after
auditing your package, there are still spurious @file{configure} warnings about
@code{datarootdir}, you may add the line

@example
AC_DEFUN([AC_DATAROOTDIR_CHECKED])
@end example

@noindent
to your @file{configure.ac} to disable the warnings.  This is an exception
to the usual rule that you should not define a macro whose name begins with
@code{AC_} (@pxref{Macro Names}).



@node Build Directories
@subsection Build Directories
@cindex Build directories
@cindex Directories, build

You can support compiling a software package for several architectures
simultaneously from the same copy of the source code.  The object files
for each architecture are kept in their own directory.

To support doing this, @command{make} uses the @code{VPATH} variable to
find the files that are in the source directory.  GNU Make
can do this.  Most other recent @command{make} programs can do this as
well, though they may have difficulties and it is often simpler to
recommend GNU @command{make} (@pxref{VPATH and Make}).  Older
@command{make} programs do not support @code{VPATH}; when using them, the
source code must be in the same directory as the object files.

If you are using GNU Automake, the remaining details in this
section are already covered for you, based on the contents of your
@file{Makefile.am}.  But if you are using Autoconf in isolation, then
supporting @code{VPATH} requires the following in your
@file{Makefile.in}:

@example
srcdir = @@srcdir@@
VPATH = @@srcdir@@
@end example

Do not set @code{VPATH} to the value of another variable (@pxref{Variables
listed in VPATH}.

@command{configure} substitutes the correct value for @code{srcdir} when
it produces @file{Makefile}.

Do not use the @command{make} variable @code{$<}, which expands to the
file name of the file in the source directory (found with @code{VPATH}),
except in implicit rules.  (An implicit rule is one such as @samp{.c.o},
which tells how to create a @file{.o} file from a @file{.c} file.)  Some
versions of @command{make} do not set @code{$<} in explicit rules; they
expand it to an empty value.

Instead, Make command lines should always refer to source
files by prefixing them with @samp{$(srcdir)/}.  It's safer
to quote the source directory name, in case it contains characters that
are special to the shell.  Because @samp{$(srcdir)} is expanded by Make,
single-quoting works and is safer than double-quoting.  For example:

@example
time.info: time.texinfo
        $(MAKEINFO) '$(srcdir)/time.texinfo'
@end example

@node Automatic Remaking
@subsection Automatic Remaking
@cindex Automatic remaking
@cindex Remaking automatically

You can put rules like the following in the top-level @file{Makefile.in}
for a package to automatically update the configuration information when
you change the configuration files.  This example includes all of the
optional files, such as @file{aclocal.m4} and those related to
configuration header files.  Omit from the @file{Makefile.in} rules for
any of these files that your package does not use.

The @samp{$(srcdir)/} prefix is included because of limitations in the
@code{VPATH} mechanism.

The @file{stamp-} files are necessary because the timestamps of
@file{config.h.in} and @file{config.h} are not changed if remaking
them does not change their contents.  This feature avoids unnecessary
recompilation.  You should include the file @file{stamp-h.in} in your
package's distribution, so that @command{make} considers
@file{config.h.in} up to date.  Don't use @command{touch}
(@pxref{touch, , Limitations of Usual Tools}); instead, use
@command{echo} (using
@command{date} would cause needless output differences).

@example
@group
$(srcdir)/configure: configure.ac aclocal.m4
        cd '$(srcdir)' && autoconf

# autoheader might not change config.h.in, so touch a stamp file.
$(srcdir)/config.h.in: stamp-h.in ;
$(srcdir)/stamp-h.in: configure.ac aclocal.m4
        cd '$(srcdir)' && autoheader
        echo timestamp > '$(srcdir)/stamp-h.in'

config.h: stamp-h ;
stamp-h: config.h.in config.status
        ./config.status

Makefile: Makefile.in config.status
        ./config.status

config.status: configure
        ./config.status --recheck
@end group
@end example

@noindent
(Be careful if you copy these lines directly into your makefile, as you
need to convert the indented lines to start with the tab character.)

In addition, you should use

@example
AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
@end example

@noindent
so @file{config.status} ensures that @file{config.h} is considered up to
date.  @xref{Output}, for more information about @code{AC_OUTPUT}.

@xref{config.status Invocation}, for more examples of handling
configuration-related dependencies.

@node Configuration Headers
@section Configuration Header Files
@cindex Configuration Header
@cindex @file{config.h}

When a package contains more than a few tests that define C preprocessor
symbols, the command lines to pass @option{-D} options to the compiler
can get quite long.  This causes two problems.  One is that the
@command{make} output is hard to visually scan for errors.  More
seriously, the command lines can exceed the length limits of some
operating systems.  As an alternative to passing @option{-D} options to
the compiler, @command{configure} scripts can create a C header file
containing @samp{#define} directives.  The @code{AC_CONFIG_HEADERS}
macro selects this kind of output.  Though it can be called anywhere
between @code{AC_INIT} and @code{AC_OUTPUT}, it is customary to call
it right after @code{AC_INIT}.

The package should @samp{#include} the configuration header file before
any other header files, to prevent inconsistencies in declarations (for
example, if it redefines @code{const}, or if it defines a macro like
@code{_FILE_OFFSET_BITS} that affects the behavior of system
headers). Note that it is okay to only include @file{config.h} from
@file{.c} files; the project's @file{.h} files can rely on
@file{config.h} already being included first by the corresponding
@file{.c} file.

To provide for VPATH builds, remember to pass the C compiler a @option{-I.}
option (or @option{-I..}; whichever directory contains @file{config.h}).
Even if you use @samp{#include "config.h"}, the preprocessor searches only
the directory of the currently read file, i.e., the source directory, not
the build directory.

With the appropriate @option{-I} option, you can use
@samp{#include <config.h>}.  Actually, it's a good habit to use it,
because in the rare case when the source directory contains another
@file{config.h}, the build directory should be searched first.


@defmac AC_CONFIG_HEADERS (@var{header} @dots{}, @ovar{cmds}, @ovar{init-cmds})
@acindex{CONFIG_HEADERS}
@cvindex HAVE_CONFIG_H
This macro is one of the instantiating macros; see @ref{Configuration
Actions}.  Make @code{AC_OUTPUT} create the file(s) in the
blank-or-newline-separated list @var{header} containing C preprocessor
@code{#define} statements, and replace @samp{@@DEFS@@} in generated
files with @option{-DHAVE_CONFIG_H} instead of the value of @code{DEFS}.
The usual name for @var{header} is @file{config.h};
@var{header} should not contain shell metacharacters.
@xref{Special Chars in Variables}.

If @var{header} already exists and its contents are identical to what
@code{AC_OUTPUT} would put in it, it is left alone.  Doing this allows
making some changes in the configuration without needlessly causing
object files that depend on the header file to be recompiled.

Usually the input file is named @file{@var{header}.in}; however, you can
override the input file name by appending to @var{header} a
colon-separated list of input files.  For example, you might need to make
the input file name acceptable to DOS variants:

@example
AC_CONFIG_HEADERS([config.h:config.hin])
@end example

@end defmac

@defmac AH_HEADER
@ahindex{HEADER}
This macro is defined as the name of the first declared config header
and undefined if no config headers have been declared up to this point.
A third-party macro may, for example, require use of a config header
without invoking AC_CONFIG_HEADERS twice, like this:

@example
AC_CONFIG_COMMANDS_PRE(
        [m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])])
@end example

@end defmac

@xref{Configuration Actions}, for more details on @var{header}.

@menu
* Header Templates::            Input for the configuration headers
* autoheader Invocation::       How to create configuration templates
* Autoheader Macros::           How to specify CPP templates
@end menu

@node Header Templates
@subsection Configuration Header Templates
@cindex Configuration Header Template
@cindex Header templates
@cindex @file{config.h.in}

Your distribution should contain a template file that looks as you want
the final header file to look, including comments, with @code{#undef}
statements which are used as hooks.  For example, suppose your
@file{configure.ac} makes these calls:

@example
AC_CONFIG_HEADERS([conf.h])
AC_CHECK_HEADERS([unistd.h])
@end example

@noindent
Then you could have code like the following in @file{conf.h.in}.
The @file{conf.h} created by @command{configure} defines @samp{HAVE_UNISTD_H}
to 1, if and only if the system has @file{unistd.h}.

@example
@group
/* Define as 1 if you have unistd.h.  */
#undef HAVE_UNISTD_H
@end group
@end example

The format of the template file is stricter than what the C preprocessor
is required to accept.  A directive line should contain only whitespace,
@samp{#undef}, and @samp{HAVE_UNISTD_H}.  The use of @samp{#define}
instead of @samp{#undef}, or of comments on the same line as
@samp{#undef}, is strongly discouraged.  Each hook should only be listed
once.  Other preprocessor lines, such as @samp{#ifdef} or
@samp{#include}, are copied verbatim from the template into the
generated header.

Since it is a tedious task to keep a template header up to date, you may
use @command{autoheader} to generate it, see @ref{autoheader Invocation}.

During the instantiation of the header, each @samp{#undef} line in the
template file for each symbol defined by @samp{AC_DEFINE} is changed to an
appropriate @samp{#define}. If the corresponding @samp{AC_DEFINE} has not
been executed during the @command{configure} run, the @samp{#undef} line is
commented out.  (This is important, e.g., for @samp{_POSIX_SOURCE}:
on many systems, it can be implicitly defined by the compiler, and
undefining it in the header would then break compilation of subsequent
headers.)

Currently, @emph{all} remaining @samp{#undef} lines in the header
template are commented out, whether or not there was a corresponding
@samp{AC_DEFINE} for the macro name; but this behavior is not guaranteed
for future releases of Autoconf.

Generally speaking, since you should not use @samp{#define}, and you
cannot guarantee whether a @samp{#undef} directive in the header
template will be converted to a @samp{#define} or commented out in the
generated header file, the template file cannot be used for conditional
definition effects.  Consequently, if you need to use the construct

@example
@group
#ifdef THIS
# define THAT
#endif
@end group
@end example

@noindent
you must place it outside of the template.
If you absolutely need to hook it to the config header itself, please put
the directives to a separate file, and @samp{#include} that file from the
config header template.  If you are using @command{autoheader}, you would
probably use @samp{AH_BOTTOM} to append the @samp{#include} directive.


@node autoheader Invocation
@subsection Using @command{autoheader} to Create @file{config.h.in}
@cindex @command{autoheader}

The @command{autoheader} program can create a template file of C
@samp{#define} statements for @command{configure} to use.
It searches for the first invocation of @code{AC_CONFIG_HEADERS} in
@file{configure} sources to determine the name of the template.
(If the first call of @code{AC_CONFIG_HEADERS} specifies more than one
input file name, @command{autoheader} uses the first one.)

It is recommended that only one input file is used.  If you want to append
a boilerplate code, it is preferable to use
@samp{AH_BOTTOM([#include <conf_post.h>])}.
File @file{conf_post.h} is not processed during the configuration then,
which make things clearer.  Analogically, @code{AH_TOP} can be used to
prepend a boilerplate code.

In order to do its job, @command{autoheader} needs you to document all
of the symbols that you might use.  Typically this is done via an
@code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED} call whose first argument
is a literal symbol and whose third argument describes the symbol
(@pxref{Defining Symbols}).  Alternatively, you can use
@code{AH_TEMPLATE} (@pxref{Autoheader Macros}), or you can supply a
suitable input file for a subsequent configuration header file.
Symbols defined by Autoconf's builtin tests are already documented properly;
you need to document only those that you
define yourself.

You might wonder why @command{autoheader} is needed: after all, why
would @command{configure} need to ``patch'' a @file{config.h.in} to
produce a @file{config.h} instead of just creating @file{config.h} from
scratch?  Well, when everything rocks, the answer is just that we are
wasting our time maintaining @command{autoheader}: generating
@file{config.h} directly is all that is needed.  When things go wrong,
however, you'll be thankful for the existence of @command{autoheader}.

The fact that the symbols are documented is important in order to
@emph{check} that @file{config.h} makes sense.  The fact that there is a
well-defined list of symbols that should be defined (or not) is
also important for people who are porting packages to environments where
@command{configure} cannot be run: they just have to @emph{fill in the
blanks}.

But let's come back to the point: the invocation of @command{autoheader}@dots{}

If you give @command{autoheader} an argument, it uses that file instead
of @file{configure.ac} and writes the header file to the standard output
instead of to @file{config.h.in}.  If you give @command{autoheader} an
argument of @option{-}, it reads the standard input instead of
@file{configure.ac} and writes the header file to the standard output.

@command{autoheader} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Report processing steps.

@item --debug
@itemx -d
Don't remove the temporary files.

@item --force
@itemx -f
Remake the template file even if newer than its input files.

@item --include=@var{dir}
@itemx -I @var{dir}
Append @var{dir} to the include path.  Multiple invocations accumulate.

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend @var{dir} to the include path.  Multiple invocations accumulate.

@item --warnings=@var{category}[,@var{category}...]
@itemx -W@var{category}[,@var{category}...]
@evindex WARNINGS
Enable or disable warnings related to each @var{category}.
@xref{m4_warn}, for a comprehensive list of categories.
Special values include:

@table @samp
@item all
Enable all categories of warnings.

@item none
Disable all categories of warnings.

@item error
Treat all warnings as errors.

@item no-@var{category}
Disable warnings falling into @var{category}.
@end table

The environment variable @env{WARNINGS} may also be set to a
comma-separated list of warning categories to enable or disable.
It is interpreted exactly the same way as the argument of
@option{--warnings}, but unknown categories are silently ignored.
The command line takes precedence; for instance, if @env{WARNINGS}
is set to @code{obsolete}, but @option{-Wnone} is given on the
command line, no warnings will be issued.

Some categories of warnings are on by default.
Again, for details see @ref{m4_warn}.
@end table



@node Autoheader Macros
@subsection Autoheader Macros
@cindex Autoheader macros

@command{autoheader} scans @file{configure.ac} and figures out which C
preprocessor symbols it might define.  It knows how to generate
templates for symbols defined by @code{AC_CHECK_HEADERS},
@code{AC_CHECK_FUNCS} etc., but if you @code{AC_DEFINE} any additional
symbol, you must define a template for it.  If there are missing
templates, @command{autoheader} fails with an error message.

The template for a @var{symbol} is created
by @command{autoheader} from
the @var{description} argument to an @code{AC_DEFINE};
see @ref{Defining Symbols}.

For special needs, you can use the following macros.


@defmac AH_TEMPLATE (@var{key}, @var{description})
@ahindex{TEMPLATE}
Tell @command{autoheader} to generate a template for @var{key}.  This macro
generates standard templates just like @code{AC_DEFINE} when a
@var{description} is given.

For example:

@example
AH_TEMPLATE([NULL_DEVICE],
  [Name of the file to open to get
   a null file, or a data sink.])
@end example

@noindent
generates the following template, with the description properly
justified.

@example
/* Name of the file to open to get a null file, or a data sink. */
#undef NULL_DEVICE
@end example
@end defmac


@defmac AH_VERBATIM (@var{key}, @var{template})
@ahindex{VERBATIM}
Tell @command{autoheader} to include the @var{template} as-is in the header
template file.  This @var{template} is associated with the @var{key},
which is used to sort all the different templates and guarantee their
uniqueness.  It should be a symbol that can be defined via @code{AC_DEFINE}.
@end defmac


@defmac AH_TOP (@var{text})
@ahindex{TOP}
Include @var{text} at the top of the header template file.
@end defmac


@defmac AH_BOTTOM (@var{text})
@ahindex{BOTTOM}
Include @var{text} at the bottom of the header template file.
@end defmac


Please note that @var{text} gets included ``verbatim'' to the template file,
not to the resulting config header, so it can easily get mangled when the
template is processed.  There is rarely a need for something other than

@example
AH_BOTTOM([#include <custom.h>])
@end example



@node Configuration Commands
@section Running Arbitrary Configuration Commands
@cindex Configuration commands
@cindex Commands for configuration

You can execute arbitrary commands before, during, and after
@file{config.status} is run.  The three following macros accumulate the
commands to run when they are called multiple times.
@code{AC_CONFIG_COMMANDS} replaces the obsolete macro
@code{AC_OUTPUT_COMMANDS}; see @ref{Obsolete Macros}, for details.

@anchor{AC_CONFIG_COMMANDS}
@defmac AC_CONFIG_COMMANDS (@var{tag}@dots{}, @ovar{cmds}, @ovar{init-cmds})
@acindex{CONFIG_COMMANDS}
Specify additional shell commands to run at the end of
@file{config.status}, and shell commands to initialize any variables
from @command{configure}.  Associate the commands with @var{tag}.
Since typically the @var{cmds} create a file, @var{tag} should
naturally be the name of that file.  If needed, the directory hosting
@var{tag} is created.  The @var{tag} should not contain shell
metacharacters.  @xref{Special Chars in Variables}.
This macro is one of the instantiating macros;
see @ref{Configuration Actions}.

Here is an unrealistic example:
@example
fubar=42
AC_CONFIG_COMMANDS([fubar],
  [AS_ECHO(["this is extra $fubar, and so on."])],
  [fubar=$fubar])
@end example

Here is a better one:
@example
AC_CONFIG_COMMANDS([timestamp], [echo >timestamp])
@end example
@end defmac

The following two macros look similar, but in fact they are not of the same
breed: they are executed directly by @file{configure}, so you cannot use
@file{config.status} to rerun them.

@c Yet it is good to leave them here.  The user sees them together and
@c decides which best fits their needs.

@defmac AC_CONFIG_COMMANDS_PRE (@var{cmds})
@acindex{CONFIG_COMMANDS_PRE}
Execute the @var{cmds} right before creating @file{config.status}.

This macro presents the last opportunity to call @code{AC_SUBST},
@code{AC_DEFINE}, or @code{AC_CONFIG_@var{ITEMS}} macros.
@end defmac

@defmac AC_CONFIG_COMMANDS_POST (@var{cmds})
@acindex{CONFIG_COMMANDS_POST}
Execute the @var{cmds} right after creating @file{config.status}.
@end defmac




@node Configuration Links
@section Creating Configuration Links
@cindex Configuration links
@cindex Links for configuration

You may find it convenient to create links whose destinations depend upon
results of tests.  One can use @code{AC_CONFIG_COMMANDS} but the
creation of relative symbolic links can be delicate when the package is
built in a directory different from the source directory.

@anchor{AC_CONFIG_LINKS}
@defmac AC_CONFIG_LINKS (@var{dest}:@var{source}@dots{}, @ovar{cmds}, @
  @ovar{init-cmds})
@acindex{CONFIG_LINKS}
@cindex Links
Make @code{AC_OUTPUT} link each of the existing files @var{source} to
the corresponding link name @var{dest}.  Makes a symbolic link if
possible, otherwise a hard link if possible, otherwise a copy.  The
@var{dest} and @var{source} names should be relative to the top level
source or build directory, and should not contain shell metacharacters.
@xref{Special Chars in Variables}.

This macro is one of the instantiating
macros; see @ref{Configuration Actions}.

For example, this call:

@example
AC_CONFIG_LINKS([host.h:config/$machine.h
                object.h:config/$obj_format.h])
@end example

@noindent
creates in the current directory @file{host.h} as a link to
@file{@var{srcdir}/config/$machine.h}, and @file{object.h} as a
link to @file{@var{srcdir}/config/$obj_format.h}.

The tempting value @samp{.} for @var{dest} is invalid: it makes it
impossible for @samp{config.status} to guess the links to establish.

One can then run:
@example
./config.status host.h object.h
@end example
@noindent
to create the links.
@end defmac



@node Subdirectories
@section Configuring Other Packages in Subdirectories
@cindex Configure subdirectories
@cindex Subdirectory configure

In most situations, calling @code{AC_OUTPUT} is sufficient to produce
makefiles in subdirectories.  However, @command{configure} scripts
that control more than one independent package can use
@code{AC_CONFIG_SUBDIRS} to run @command{configure} scripts for other
packages in subdirectories.

@defmac AC_CONFIG_SUBDIRS (@var{dir} @dots{})
@acindex{CONFIG_SUBDIRS}
@ovindex subdirs
Make @code{AC_OUTPUT} run @command{configure} in each subdirectory
@var{dir} in the given blank-or-newline-separated list.  Each @var{dir} should
be a literal, i.e., please do not use:

@example
@c If you change this example, adjust tests/torture.at:Non-literal AC_CONFIG_SUBDIRS.
if test "x$package_foo_enabled" = xyes; then
  my_subdirs="$my_subdirs foo"
fi
AC_CONFIG_SUBDIRS([$my_subdirs])
@end example

@noindent
because this prevents @samp{./configure --help=recursive} from
displaying the options of the package @code{foo}.  Instead, you should
write:

@example
AS_IF([test "x$package_foo_enabled" = xyes],
  [AC_CONFIG_SUBDIRS([foo])])
@end example

If a given @var{dir} is not found at @command{configure} run time, a
warning is reported; if the subdirectory is optional, write:

@example
AS_IF([test -d "$srcdir/foo"],
  [AC_CONFIG_SUBDIRS([foo])])
@end example

These examples use @code{AS_IF} instead of ordinary shell @code{if} to
avoid problems that Autoconf has with macro calls in shell conditionals
outside macro definitions.  @xref{Common Shell Constructs}.

If a given @var{dir} contains @command{configure.gnu}, it is run instead
of @command{configure}.  This is for packages that might use a
non-Autoconf script @command{Configure}, which can't be called through a
wrapper @command{configure} since it would be the same file on
case-insensitive file systems.

The subdirectory @command{configure} scripts are given the same command
line options that were given to this @command{configure} script, with minor
changes if needed, which include:

@itemize @minus
@item
adjusting a relative name for the cache file;

@item
adjusting a relative name for the source directory;

@item
propagating the current value of @code{$prefix}, including if it was
defaulted, and if the default values of the top level and of the subdirectory
@file{configure} differ.
@end itemize

This macro also sets the output variable @code{subdirs} to the list of
directories @samp{@var{dir} @dots{}}.  Make rules can use
this variable to determine which subdirectories to recurse into.

This macro may be called multiple times.
@end defmac

@node Default Prefix
@section Default Prefix
@cindex Install prefix
@cindex Prefix for install

By default, @command{configure} sets the prefix for files it installs to
@file{/usr/local}.  The user of @command{configure} can select a different
prefix using the @option{--prefix} and @option{--exec-prefix} options.
There are two ways to change the default: when creating
@command{configure}, and when running it.

Some software packages might want to install in a directory other than
@file{/usr/local} by default.  To accomplish that, use the
@code{AC_PREFIX_DEFAULT} macro.

@defmac AC_PREFIX_DEFAULT (@var{prefix})
@acindex{PREFIX_DEFAULT}
Set the default installation prefix to @var{prefix} instead of
@file{/usr/local}.
@end defmac

It may be convenient for users to have @command{configure} guess the
installation prefix from the location of a related program that they
have already installed.  If you wish to do that, you can call
@code{AC_PREFIX_PROGRAM}.

@anchor{AC_PREFIX_PROGRAM}
@defmac AC_PREFIX_PROGRAM (@var{program})
@acindex{PREFIX_PROGRAM}
If the user did not specify an installation prefix (using the
@option{--prefix} option), guess a value for it by looking for
@var{program} in @env{PATH}, the way the shell does.  If @var{program}
is found, set the prefix to the parent of the directory containing
@var{program}, else default the prefix as described above
(@file{/usr/local} or @code{AC_PREFIX_DEFAULT}).  For example, if
@var{program} is @code{gcc} and the @env{PATH} contains
@file{/usr/local/gnu/bin/gcc}, set the prefix to @file{/usr/local/gnu}.
@end defmac



@c ======================================================== Existing tests

@node Existing Tests
@chapter 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 (@pxref{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
@command{configure} runs (@pxref{Caching Results}).

Some of these macros set output variables.  @xref{Makefile
Substitutions}, for how to get their values.  The phrase ``define
@var{name}'' is used below as a shorthand to mean ``define the C
preprocessor symbol @var{name} to the value 1''.  @xref{Defining
Symbols}, for how to get those symbol definitions into your program.

@menu
* Common Behavior::             Macros' standard schemes
* Alternative Programs::        Selecting between alternative programs
* Files::                       Checking for the existence of files
* Libraries::                   Library archives that might be missing
* Library Functions::           C library functions that might be missing
* Header Files::                Header files that might be missing
* Declarations::                Declarations that may be missing
* Structures::                  Structures or members that might be missing
* Types::                       Types that might be missing
* Compilers and Preprocessors::  Checking for compiling programs
* System Services::             Operating system services
* C and POSIX Variants::        Kludges for C and POSIX variants
* Erlang Libraries::            Checking for the existence of Erlang libraries
@end menu

@node Common Behavior
@section Common Behavior
@cindex Common autoconf 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.

@menu
* Standard Symbols::            Symbols defined by the macros
* Default Includes::            Includes used by the generic macros
@end menu

@node Standard Symbols
@subsection Standard Symbols
@cindex Standard symbols

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

For instance,

@example
AC_CHECK_TYPES([struct $Expensive*])
@end example

@noindent
defines the symbol @samp{HAVE_STRUCT__EXPENSIVEP} if the check
succeeds.


@node Default Includes
@subsection Default Includes
@cindex Default includes
@cindex Includes, default
@hdrindex{assert.h}
@hdrindex{ctype.h}
@hdrindex{errno.h}
@hdrindex{float.h}
@hdrindex{iso646.h}
@hdrindex{limits.h}
@hdrindex{locale.h}
@hdrindex{math.h}
@hdrindex{setjmp.h}
@hdrindex{signal.h}
@hdrindex{stdarg.h}
@hdrindex{stddef.h}
@hdrindex{stdio.h}
@hdrindex{stdlib.h}
@hdrindex{string.h}
@hdrindex{time.h}
@hdrindex{wchar.h}
@hdrindex{wctype.h}

Test programs frequently need to include headers that may or may not be
available on the system whose features are being tested.  Each test can
use all the preprocessor macros that have been @code{AC_DEFINE}d by
previous tests, so for example one may write

@example
@group
#include <time.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
@end group
@end example

@noindent
if @file{sys/time.h} has already been tested for.

All hosted environments that are still of interest for portable code
provide all of the headers specified in C89 (as amended in 1995):
@file{assert.h}, @file{ctype.h}, @file{errno.h}, @file{float.h},
@file{iso646.h}, @file{limits.h}, @file{locale.h}, @file{math.h},
@file{setjmp.h}, @file{signal.h}, @file{stdarg.h}, @file{stddef.h},
@file{stdio.h}, @file{stdlib.h}, @file{string.h}, @file{time.h},
@file{wchar.h}, and @file{wctype.h}.  Most programs can safely include
these headers unconditionally.  A program not intended to be portable to
C89 can also safely include the C99-specified header @file{stdbool.h}.
Other headers, including headers from C99 and later revisions of the C
standard, might need to be tested for (@pxref{Header Files}) or their
bugs may need to be worked around (@pxref{Gnulib}).

If your program needs to be portable to a @emph{freestanding}
environment, such as an embedded OS that doesn't provide all of the
facilities of the C89 standard library, you may need to test for some of
the above headers as well.  Note that many Autoconf macros internally
assume that the complete set of C89 headers are available.

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

@defmac AC_INCLUDES_DEFAULT (@ovar{include-directives})
@acindex{INCLUDES_DEFAULT}
Expand to @var{include-directives} if present and nonempty, otherwise to:

@example
@group
#include <stddef.h>
#ifdef HAVE_STDIO_H
# include <stdio.h>
#endif
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
@end group
@end example

Using this macro without @var{include-directives} has the side effect of
checking for @file{stdio.h}, @file{stdlib.h}, @file{string.h},
@file{inttypes.h}, @file{stdint.h}, @file{strings.h},
@file{sys/types.h}, @file{sys/stat.h}, and @file{unistd.h}, as if by
@code{AC_CHECK_HEADERS_ONCE}.  For backward compatibility, the macro
@code{STDC_HEADERS} will be defined when both @file{stdlib.h} and
@file{string.h} are available.

@strong{Portability Note:} It is safe for most programs to assume the
presence of all of the headers required by the original 1990 C standard.
@code{AC_INCLUDES_DEFAULT} checks for @file{stdio.h}, @file{stdlib.h},
and @file{string.h}, even though they are in that list, because they
might not be available when compiling for a ``freestanding environment''
(in which most of the features of the C library are optional).  You
probably do not need to write @samp{#ifdef HAVE_STDIO_H} in your own
code.

@file{inttypes.h} and @file{stdint.h} were added to C in the 1999
revision of the standard, and @file{strings.h}, @file{sys/types.h},
@file{sys/stat.h}, and @file{unistd.h} are POSIX extensions.  You
@emph{should} guard uses of these headers with appropriate conditionals.
@end defmac

@defmac AC_CHECK_INCLUDES_DEFAULT
@acindex{CHECK_INCLUDES_DEFAULT}
Check for all the headers that @code{AC_INCLUDES_DEFAULT} would check
for as a side-effect, if this has not already happened.

This macro mainly exists so that @code{autoupdate} can replace certain
obsolete constructs with it. You should not need to use it yourself; in
fact, it is likely to be safe to delete it from any script in which it
appears.  (@code{autoupdate} does not know whether preprocessor macros
such as @code{HAVE_STDINT_H} are used in the program, nor whether they
would get defined as a side-effect of other checks.)
@end defmac

@node Alternative Programs
@section Alternative Programs
@cindex Programs, checking

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.

@menu
* Particular Programs::         Special handling to find certain programs
* Generic Programs::            How to find other programs
@end menu

@node Particular Programs
@subsection Particular Program Checks

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

@defmac AC_PROG_AR
@acindex{PROG_AR}
@ovindex AR
@c @caindex prog_AR
@c @caindex prog_ac_ct_AR
Set output variable @code{AR} to @samp{ar} if @code{ar} is found, and
otherwise to @samp{:} (do nothing).
@end defmac

@defmac AC_PROG_AWK
@acindex{PROG_AWK}
@ovindex AWK
@caindex prog_AWK
Check for the commands @command{gawk}, @command{mawk},
@command{nawk}, @command{awk}, and @code{busybox awk}, in that
order, and set output variable @code{AWK} to the first one that is found.
Try @code{gawk} first because that is reported to be the
best implementation.  The result can be overridden by setting the
variable @code{AWK} or the cache variable @code{ac_cv_prog_AWK}.

Using this macro avoids some pitfalls of older systems that have both
traditional @command{awk} (@pxref{awk, , Limitations of Usual Tools})
and better alternatives like @command{gawk}.
It also can help port to stripped-down systems that have only
@code{busybox awk}, although these systems could well have problems
with other build components that use plain @command{awk}.
@end defmac

@defmac AC_PROG_GREP
@acindex{PROG_GREP}
@ovindex GREP
@caindex prog_GREP
Look for the best available @code{grep} or @code{ggrep} that accepts the
longest input lines possible, and that supports multiple @option{-e} options.
Set the output variable @code{GREP} to whatever is chosen.
@xref{grep, , Limitations of Usual Tools}, for more information about
portability problems with the @command{grep} command family.  The result
can be overridden by setting the @code{GREP} variable and is cached in the
@code{ac_cv_path_GREP} variable.
@end defmac

@defmac AC_PROG_EGREP
@acindex{PROG_EGREP}
@ovindex EGREP
@caindex prog_EGREP
Check whether @code{$GREP -E} works, or else look for the best available
@code{egrep} or @code{gegrep} that accepts the longest input lines possible.
Set the output variable @code{EGREP} to whatever is chosen.  The result
can be overridden by setting the @code{EGREP} variable and is cached in the
@code{ac_cv_path_EGREP} variable.
@end defmac

@defmac AC_PROG_FGREP
@acindex{PROG_FGREP}
@ovindex FGREP
@caindex prog_FGREP
Check whether @code{$GREP -F} works, or else look for the best available
@code{fgrep} or @code{gfgrep} that accepts the longest input lines possible.
Set the output variable @code{FGREP} to whatever is chosen.  The result
can be overridden by setting the @code{FGREP} variable and is cached in the
@code{ac_cv_path_FGREP} variable.
@end defmac

@defmac AC_PROG_INSTALL
@acindex{PROG_INSTALL}
@ovindex INSTALL
@ovindex INSTALL_PROGRAM
@ovindex INSTALL_DATA
@ovindex INSTALL_SCRIPT
@caindex path_install
@prindex @command{install-sh}
Set output variable @code{INSTALL} to the name of a BSD-compatible
@command{install} program, if one is found in the current @env{PATH}.
Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c},
checking the directories specified to @code{AC_CONFIG_AUX_DIR} (or its
default directories) to determine @var{dir} (@pxref{Output}).  Also set
the variables @code{INSTALL_PROGRAM} and @code{INSTALL_SCRIPT} to
@samp{$@{INSTALL@}} and @code{INSTALL_DATA} to @samp{$@{INSTALL@} -m 644}.

@samp{@@INSTALL@@} is special, as its value may vary for different
configuration files.

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

Autoconf comes with a copy of @file{install-sh} that you can use.
If you use @code{AC_PROG_INSTALL}, you must include @file{install-sh} in
your distribution; otherwise @command{autoreconf} and @command{configure}
will produce an error message saying they can't find it---even if the
system you're on has a good @command{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 @command{install} program.

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

The result of the test can be overridden by setting the variable
@code{INSTALL} or the cache variable @code{ac_cv_path_install}.
@end defmac

@defmac AC_PROG_MKDIR_P
@acindex{PROG_MKDIR_P}
@ovindex MKDIR_P
@caindex path_mkdir
@prindex @command{install-sh}
Set output variable @code{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 equivalent of the @samp{mkdir -p} command.  Ancient
versions of @command{mkdir} are vulnerable to race conditions, so if you
want to support parallel installs from different packages into the same
directory you should use a non-ancient @command{mkdir}.

This macro is related to the @code{AS_MKDIR_P} macro (@pxref{Programming
in M4sh}), but it sets an output variable intended for use in other
files, whereas @code{AS_MKDIR_P} is intended for use in scripts like
@command{configure}.  Also, @code{AS_MKDIR_P} does not accept options,
but @code{MKDIR_P} supports the @option{-m} option, e.g., a makefile
might invoke @code{$(MKDIR_P) -m 0 dir} to create an inaccessible
directory, and conversely a makefile should use @code{$(MKDIR_P) --
$(FOO)} if @var{FOO} might yield a value that begins with @samp{-}.

The result of the test can be overridden by setting the variable
@code{MKDIR_P} or the cache variable @code{ac_cv_path_mkdir}.
@end defmac

@anchor{AC_PROG_LEX}
@defmac AC_PROG_LEX (@var{options})
@acindex{PROG_LEX}
@ovindex LEX
@ovindex LEXLIB
@cvindex YYTEXT_POINTER
@ovindex LEX_OUTPUT_ROOT
@caindex prog_LEX
Search for a lexical analyzer generator, preferring @code{flex}
to plain @code{lex}.  Output variable @code{LEX} is set to whichever
program is available.  If neither program is available, @code{LEX}
is set to @samp{:};
for packages that ship the generated @file{file.yy.c}
alongside the source @file{file.l}, this default allows users without a
lexer generator to still build the package even if the timestamp for
@file{file.l} is inadvertently changed.

The name of the program to use can be overridden by setting the
output variable @code{LEX} or the cache variable @code{ac_cv_prog_LEX}
when running @command{configure}.

If a lexical analyzer generator is found, this macro performs additional
checks for common portability pitfalls.  If these additional checks
fail, @code{LEX} is reset to @samp{:}; otherwise the following
additional macros and variables are provided.

Preprocessor macro @code{YYTEXT_POINTER} is defined if the lexer
skeleton, by default, declares @code{yytext} as a @samp{@w{char *}}
rather than a @samp{@w{char []}}.

Output variable @code{LEX_OUTPUT_ROOT} is set to the base of the file
name that the lexer generates; this is usually either @file{lex.yy} or
@file{lexyy}.

If generated lexers need a library to work, output variable
@code{LEXLIB} is set to a link option for that library (e.g.,
@option{-ll}), otherwise it is set to empty.

The @var{options} argument modifies the behavior of @code{AC_PROG_LEX}.
It should be a whitespace-separated list of options.  Currently there
are only two options, and they are mutually exclusive:

@table @code
@item yywrap
Indicate that the library in @code{LEXLIB} needs to define the function
@code{yywrap}.  If a library that defines this function cannot be found,
@code{LEX} will be reset to @samp{:}.

@item noyywrap
Indicate that the library in @code{LEXLIB} does not need to define the
function @code{yywrap}.  @command{configure} will not search for it at
all.
@end table

Prior to Autoconf 2.70, @code{AC_PROG_LEX} did not take any arguments,
and its behavior was different from either of the above possibilities:
it would search for a library that defines @code{yywrap}, and would set
@code{LEXLIB} to that library if it finds one.  However, if a library
that defines this function could not be found, @code{LEXLIB} would be
left empty and @code{LEX} would @emph{not} be reset.  This behavior was
due to a bug, but several packages came to depend on it, so
@code{AC_PROG_LEX} still does this if neither the @code{yywrap} nor the
@code{noyywrap} option is given.

Usage of @code{AC_PROG_LEX} without choosing one of the @code{yywrap}
or @code{noyywrap} options is deprecated.  It is usually better to
use @code{noyywrap} and define the @code{yywrap} function yourself,
as this almost always renders the @code{LEXLIB} unnecessary.

@strong{Caution:} As a side-effect of the test, this macro may delete
any file in the configure script's current working directory named
@file{lex.yy.c} or @file{lexyy.c}.

@strong{Caution:} Packages that ship a generated @file{lex.yy.c}
cannot assume that the definition of @code{YYTEXT_POINTER} matches
the code in that file.  They also cannot assume that @code{LEXLIB}
provides the library routines required by the code in that file.

If you use Flex to generate @file{lex.yy.c}, you can work around these
limitations by defining @code{yywrap} and @code{main} yourself
(rendering @code{-lfl} unnecessary), and by using either the
@option{--array} or @option{--pointer} options to control how
@code{yytext} is declared.  The code generated by Flex is also more
portable than the code generated by historical versions of Lex.

If you have used Flex to generate @file{lex.yy.c}, and especially if
your scanner depends on Flex features, we recommend you use this
Autoconf snippet to prevent the scanner being regenerated with
historical Lex:

@example
AC_PROG_LEX
AS_IF([test "x$LEX" != xflex],
  [LEX="$SHELL $missing_dir/missing flex"
   AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
   AC_SUBST([LEXLIB], [''])])
@end example

The shell script @command{missing} can be found in the Automake
distribution.

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

@anchor{AC_PROG_LN_S}
@defmac AC_PROG_LN_S
@acindex{PROG_LN_S}
@ovindex LN_S
If @samp{ln -s} works on the current file system (the operating system
and file system support symbolic links), set the output variable
@code{LN_S} to @samp{ln -s}; otherwise, if @samp{ln} works, set
@code{LN_S} to @samp{ln}, and otherwise set it to @samp{cp -pR}.

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

In other words, it does not work to do:
@example
$(LN_S) foo /x/bar
@end example

Instead, do:

@example
(cd /x && $(LN_S) foo bar)
@end example
@end defmac

@defmac AC_PROG_RANLIB
@acindex{PROG_RANLIB}
@ovindex RANLIB
@c @caindex prog_RANLIB
@c @caindex prog_ac_ct_RANLIB
Set output variable @code{RANLIB} to @samp{ranlib} if @code{ranlib}
is found, and otherwise to @samp{:} (do nothing).
@end defmac

@defmac AC_PROG_SED
@acindex{PROG_SED}
@ovindex SED
@caindex path_SED
Set output variable @code{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.  @xref{sed, , Limitations of Usual Tools}, for more
information about portability problems with Sed.

The result of this test can be overridden by setting the @code{SED} variable
and is cached in the @code{ac_cv_path_SED} variable.
@end defmac

@defmac AC_PROG_YACC
@acindex{PROG_YACC}
@evindex YACC
@evindex YFLAGS
@ovindex YACC
@caindex prog_YACC
If @code{bison} is found, set output variable @code{YACC} to @samp{bison
-y}.  Otherwise, if @code{byacc} is found, set @code{YACC} to
@samp{byacc}.  Otherwise set @code{YACC} to @samp{yacc}.
The result of this test can be influenced by setting the variable
@code{YACC} or the cache variable @code{ac_cv_prog_YACC}.
@end defmac

@node Generic Programs
@subsection 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
(@pxref{Writing Tests}).  By default, these macros use the environment
variable @env{PATH}.  If you need to check for a program that might not
be in the user's @env{PATH}, you can pass a modified path to use
instead, like this:

@example
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])
@end example

You are strongly encouraged to declare the @var{variable} passed to
@code{AC_CHECK_PROG} etc.@: as precious.  @xref{Setting Output Variables},
@code{AC_ARG_VAR}, for more details.

@anchor{AC_CHECK_PROG}
@defmac AC_CHECK_PROG (@var{variable}, @var{prog-to-check-for}, @
  @var{value-if-found}, @ovar{value-if-not-found}, @dvar{path, $PATH}, @
  @ovar{reject})
@acindex{CHECK_PROG}
@caindex prog_@var{variable}
Check whether program @var{prog-to-check-for} exists in @var{path}.  If
it is found, set @var{variable} to @var{value-if-found}, otherwise to
@var{value-if-not-found}, if given.  Always pass over @var{reject} (an
absolute file name) even if it is the first found in the search path; in
that case, set @var{variable} using the absolute file name of the
@var{prog-to-check-for} found that is not @var{reject}.  If
@var{variable} was already set, do nothing.  Calls @code{AC_SUBST} for
@var{variable}.  The result of this test can be overridden by setting the
@var{variable} variable or the cache variable
@code{ac_cv_prog_@var{variable}}.
@end defmac

@anchor{AC_CHECK_PROGS}
@defmac AC_CHECK_PROGS (@var{variable}, @var{progs-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{CHECK_PROGS}
@caindex prog_@var{variable}
Check for each program in the blank-separated list
@var{progs-to-check-for} existing in the @var{path}.  If one is found, set
@var{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 @var{variable} to @var{value-if-not-found}; if
@var{value-if-not-found} is not specified, the value of @var{variable}
is not changed.  Calls @code{AC_SUBST} for @var{variable}.  The result of
this test can be overridden by setting the @var{variable} variable or the
cache variable @code{ac_cv_prog_@var{variable}}.
@end defmac

@defmac AC_CHECK_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{CHECK_TARGET_TOOL}
Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
with a prefix of the target type as determined by
@code{AC_CANONICAL_TARGET}, followed by a dash (@pxref{Canonicalizing}).
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 @ref{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, @emph{a tool @r{(assembler, linker, etc.)}@: that the
compiler driver @r{(@command{gcc} for the GNU C Compiler)}
uses to produce objects, archives or executables}.
@end defmac

@defmac AC_CHECK_TOOL (@var{variable}, @var{prog-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{CHECK_TOOL}
@c @caindex prog_@var{VARIABLE}
@c @caindex prog_ac_ct_@var{VARIABLE}
Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
with a prefix of the host type as specified by @option{--host}, followed by a
dash.  For example, if the user runs
@samp{configure --build=x86_64-gnu --host=aarch64-linux-gnu}, then this call:
@example
AC_CHECK_TOOL([RANLIB], [ranlib], [:])
@end example
@noindent
sets @code{RANLIB} to @file{aarch64-linux-gnu-ranlib} if that program exists in
@var{path}, or otherwise to @samp{ranlib} if that program exists in
@var{path}, or to @samp{:} 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 @ref{Specifying Target Triplets}.
@end defmac

@defmac AC_CHECK_TARGET_TOOLS (@var{variable}, @var{progs-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{CHECK_TARGET_TOOLS}
Like @code{AC_CHECK_TARGET_TOOL}, each of the tools in the list
@var{progs-to-check-for} are checked with a prefix of the target type as
determined by @code{AC_CANONICAL_TARGET}, followed by a dash
(@pxref{Canonicalizing}).  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 @var{variable} to
the name of that program.  If none of the tools in the list are found,
set @var{variable} to @var{value-if-not-found}; if @var{value-if-not-found}
is not specified, the value of @var{variable} is not changed.  Calls
@code{AC_SUBST} for @var{variable}.
@end defmac

@defmac AC_CHECK_TOOLS (@var{variable}, @var{progs-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{CHECK_TOOLS}
Like @code{AC_CHECK_TOOL}, each of the tools in the list
@var{progs-to-check-for} are checked with a prefix of the host type as
determined by @code{AC_CANONICAL_HOST}, followed by a dash
(@pxref{Canonicalizing}).  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 @var{variable} to the name of that program.  If none of the tools in
the list are found, set @var{variable} to @var{value-if-not-found}; if
@var{value-if-not-found} is not specified, the value of @var{variable}
is not changed.  Calls @code{AC_SUBST} for @var{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 @ref{Specifying Target Triplets}.
@end defmac

@anchor{AC_PATH_PROG}
@defmac AC_PATH_PROG (@var{variable}, @var{prog-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{PATH_PROG}
@caindex path_@var{variable}
Like @code{AC_CHECK_PROG}, but set @var{variable} to the absolute
name of @var{prog-to-check-for} if found.  The result of this test
can be overridden by setting the @var{variable} variable.  A positive
result of this test is cached in the @code{ac_cv_path_@var{variable}}
variable.
@end defmac

@anchor{AC_PATH_PROGS}
@defmac AC_PATH_PROGS (@var{variable}, @var{progs-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{PATH_PROGS}
@caindex path_@var{variable}
Like @code{AC_CHECK_PROGS}, but if any of @var{progs-to-check-for}
are found, set @var{variable} to the absolute name of the program
found.  The result of this test can be overridden by setting the
@var{variable} variable.  A positive result of this test is cached in
the @code{ac_cv_path_@var{variable}} variable.
@end defmac

@defmac AC_PATH_PROGS_FEATURE_CHECK (@var{variable}, @
  @var{progs-to-check-for}, @var{feature-test}, @
  @ovar{action-if-not-found}, @dvar{path, $PATH})
@acindex{PATH_PROGS_FEATURE_CHECK}
@caindex path_@var{variable}
@vrindex ac_path_@var{variable}
@vrindex ac_path_@var{variable}_found
This macro was introduced in Autoconf 2.62.  If @var{variable} is not
empty, then set the cache variable @code{ac_cv_path_@var{variable}} to
its value.  Otherwise, check for each program in the blank-separated
list @var{progs-to-check-for} existing in @var{path}.  For each program
found, execute @var{feature-test} with @code{ac_path_@var{variable}}
set to the absolute name of the candidate program.  If no invocation of
@var{feature-test} sets the shell variable
@code{ac_cv_path_@var{variable}}, then @var{action-if-not-found} is
executed.  @var{feature-test} will be run even when
@code{ac_cv_path_@var{variable}} is set, to provide the ability to
choose a better candidate found later in @var{path}; to accept the
current setting and bypass all further checks, @var{feature-test} can
execute @code{ac_path_@var{variable}_found=:}.

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

Here is an example that searches for an implementation of @command{m4} that
supports the @code{indir} builtin, even if it goes by the name
@command{gm4} or is not the first implementation on @env{PATH}.

@example
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])
@end example
@end defmac

@defmac AC_PATH_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{PATH_TARGET_TOOL}
Like @code{AC_CHECK_TARGET_TOOL}, but set @var{variable} to the absolute
name of the program if it is found.
@end defmac

@defmac AC_PATH_TOOL (@var{variable}, @var{prog-to-check-for}, @
  @ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{PATH_TOOL}
Like @code{AC_CHECK_TOOL}, but set @var{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 @ref{Specifying Target Triplets}.
@end defmac


@node Files
@section Files
@cindex File, checking

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.

@defmac AC_CHECK_FILE (@var{file}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{CHECK_FILE}
@caindex file_@var{file}
Check whether file @var{file} exists on the native system.  If it is
found, execute @var{action-if-found}, otherwise do
@var{action-if-not-found}, if given.  Cache the result of this test
in the @code{ac_cv_file_@var{file}} variable, with characters not
suitable for a variable name mapped to underscores.
@end defmac

@defmac AC_CHECK_FILES (@var{files}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{CHECK_FILES}
@caindex file_@var{file}
For each file listed in @var{files}, execute @code{AC_CHECK_FILE}
and perform either @var{action-if-found} or @var{action-if-not-found}.
Like @code{AC_CHECK_FILE}, this defines @samp{HAVE_@var{file}}
(@pxref{Standard Symbols}) for each file found and caches the results of
each test in the @code{ac_cv_file_@var{file}} variable, with characters
not suitable for a variable name mapped to underscores.
@end defmac


@node Libraries
@section Library Files
@cindex Library, checking

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

@anchor{AC_CHECK_LIB}
@defmac AC_CHECK_LIB (@var{library}, @var{function}, @
  @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
@acindex{CHECK_LIB}
@caindex lib_@var{library}_@var{function}
Test whether the library @var{library} is available by trying to link
a test program that calls function @var{function} with the library.
@var{function} should be a function provided by the library.
Use the base
name of the library; e.g., to check for @option{-lmp}, use @samp{mp} as
the @var{library} argument.

@var{action-if-found} is a list of shell commands to run if the link
with the library succeeds; @var{action-if-not-found} is a list of shell
commands to run if the link fails.  If @var{action-if-found} is not
specified, the default action prepends @option{-l@var{library}} to
@code{LIBS} and defines @samp{HAVE_LIB@var{library}} (in all
capitals).  This macro is intended to support building @code{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 @code{LIBS} is generated is important to reliable
detection of libraries.

If linking with @var{library} results in unresolved symbols that would
be resolved by linking with additional libraries, give those libraries
as the @var{other-libraries} argument, separated by spaces:
e.g., @option{-lXt -lX11}.  Otherwise, this macro may fail to detect
that @var{library} is present, because linking the test program can
fail with unresolved symbols.  The @var{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 @code{LIBS}.

@code{AC_CHECK_LIB} requires some care in usage, and should be avoided
in some common cases.  Many standard functions like @code{gethostbyname}
appear in the standard C library on some hosts, and in special libraries
like @code{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 @code{AC_SEARCH_LIBS([gethostbyname],
[nsl])} instead of @code{AC_CHECK_LIB([nsl], [gethostbyname])}.

The result of this test is cached in the
@code{ac_cv_lib_@var{library}_@var{function}} variable.
@end defmac

@anchor{AC_SEARCH_LIBS}
@defmac AC_SEARCH_LIBS (@var{function}, @var{search-libs}, @
  @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
@acindex{SEARCH_LIBS}
@caindex search_@var{function}
Search for a library defining @var{function} if it's not already
available.  This equates to calling
@samp{AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])])} first with
no libraries, then for each library listed in @var{search-libs}.

Prepend @option{-l@var{library}} to @code{LIBS} for the first library found
to contain @var{function}, and run @var{action-if-found}.  If the
function is not found, run @var{action-if-not-found}.

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

The result of this test is cached in the
@code{ac_cv_search_@var{function}} variable as @samp{none required} if
@var{function} is already available, as @samp{no} if no library
containing @var{function} was found, otherwise as the
@option{-l@var{library}} option that needs to be prepended to @code{LIBS}.
@end defmac



@node Library Functions
@section 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.

@menu
* Function Portability::        Pitfalls with usual functions
* Particular Functions::        Special handling to find certain functions
* Generic Functions::           How to find other functions
@end menu

@node Function Portability
@subsection Portability of C Functions
@cindex Portability of C functions
@cindex C function portability

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.  A much more complete list is maintained by the Gnulib
project (@pxref{Gnulib}), covering @ref{Function Substitutes, ,
Current POSIX Functions, gnulib, Gnulib}, @ref{Legacy Function
Substitutes, , Legacy Functions, gnulib, Gnulib}, and @ref{Glibc
Function Substitutes, , Glibc Functions, gnulib, Gnulib}.  Please
help us keep the Gnulib list as complete as possible.

@table @asis
@item @code{exit}
@c @fuindex exit
@prindex @code{exit}
On ancient hosts, @code{exit} returned @code{int}.
This is because @code{exit} predates @code{void}, and there was a long
tradition of it returning @code{int}.

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

@item @code{malloc}
@c @fuindex malloc
@prindex @code{malloc}
The C standard says a successful call @code{malloc (0)} is implementation
dependent.  It can return either @code{NULL} or a new non-null pointer.
The latter is more common (e.g., the GNU C Library) but is by
no means universal.  @code{AC_FUNC_MALLOC}
can be used to insist on non-@code{NULL} (@pxref{Particular Functions}).

@item @code{putenv}
@c @fuindex putenv
@prindex @code{putenv}
POSIX prefers @code{setenv} to @code{putenv}; among other things,
@code{putenv} is not required of all POSIX implementations, but
@code{setenv} is.

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

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

On MinGW, a call @code{putenv ("FOO=")} removes @samp{FOO} from the
environment, rather than inserting it with an empty value.

@item @code{realloc}
@c @fuindex realloc
@prindex @code{realloc}
It is problematic to call @code{realloc} with a zero size.
The C standard says @code{realloc (NULL, 0)} is equivalent to
@code{malloc (0)}, which means one cannot portably tell whether the call
has succeeded if it returns a null pointer.  If @code{ptr} is non-null,
the C standard says @code{realloc (ptr, 0)} has undefined behavior.

The @code{AC_FUNC_REALLOC} macro avoids some of these portability issues.
@xref{Particular Functions}.

@item @code{signal} handler
@c @fuindex signal
@prindex @code{signal}
@prindex @code{sigaction}
In most cases, it is more robust to use @code{sigaction} when it is
available, rather than @code{signal}.

@item @code{snprintf}
@c @fuindex snprintf
@prindex @code{snprintf}
@c @fuindex vsnprintf
@prindex @code{vsnprintf}
In C99 and later, if the output array isn't big enough
and if no other errors occur, @code{snprintf} and @code{vsnprintf}
truncate the output and return the number of bytes that ought to have
been produced.  Some older systems, notably Microsoft Windows before
Visual Studio 2015 and Windows 10, do not null-terminate the output
and return @minus{}1 instead.

Portable code can check the return value of @code{snprintf (buf, sizeof
buf, ...)}: if the value is negative or is not less than @code{sizeof
buf}, an error occurred and the contents of @code{buf} can be ignored.
Alternatively, one of the Gnulib modules related to @code{snprintf} can
be used.  @xref{Gnulib}.

@item @code{strerror_r}
@c @fuindex strerror_r
@prindex @code{strerror_r}
POSIX specifies that @code{strerror_r} returns an @code{int}, but many
systems (e.g., the GNU C Library) provide a
different version returning a @code{char *}.  @code{AC_FUNC_STRERROR_R}
can detect which is in use (@pxref{Particular Functions}).

@item @code{strnlen}
@c @fuindex strnlen
@prindex @code{strnlen}
Android 5.0's strnlen was broken, because it assumed the addressed array
always had at least the specified number of bytes.  For example,
@code{strnlen ("", SIZE_MAX)} should return 0 but on Android 5.0 it
crashed.

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

@example
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
@end example

@item @code{sysconf}
@c @fuindex sysconf
@prindex @code{sysconf}
@code{_SC_PAGESIZE} is standard, but some older systems (e.g., HP-UX
9) have @code{_SC_PAGE_SIZE} instead.  This can be tested with
@code{#ifdef}.

@item @code{unlink}
@c @fuindex unlink
@prindex @code{unlink}
The POSIX spec says that @code{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.

@item @code{unsetenv}
@c @fuindex unsetenv
@prindex @code{unsetenv}
On MinGW, @code{unsetenv} is not available, but a variable @samp{FOO}
can be removed with a call @code{putenv ("FOO=")}, as described under
@code{putenv} above.

@item @code{va_copy}
@c @fuindex va_copy
@prindex @code{va_copy}
C99 and later provide @code{va_copy} for copying
@code{va_list} variables.  It may be available in older environments
too, though possibly as @code{__va_copy} (e.g., @command{gcc} in strict
pre-C99 mode).  These can be tested with @code{#ifdef}.  A fallback to
@code{memcpy (&dst, &src, sizeof (va_list))} gives maximum
portability.

@item @code{va_list}
@c @fuindex va_list
@prindex @code{va_list}
@code{va_list} is not necessarily just a pointer.  It can be a
@code{struct}, which means @code{NULL} is not portable.
Or it can be an array, which means as a function parameter it can be
effectively call-by-reference and library routines might modify the
value back in the caller.

@item Signed @code{>>}
Normally the C @code{>>} 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 a few platforms
(e.g., Cray C by default) zero bits are shifted in, the same as a shift of an
unsigned type.

@item Integer @code{/}
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.
@end table


@node Particular Functions
@subsection Particular Function Checks
@cindex Function, checking

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

@anchor{AC_FUNC_ALLOCA}
@defmac AC_FUNC_ALLOCA
@acindex{FUNC_ALLOCA}
@cvindex C_ALLOCA
@cvindex HAVE_ALLOCA_H
@ovindex ALLOCA
@c @fuindex alloca
@prindex @code{alloca}
@hdrindex{alloca.h}
@c @caindex working_alloca_h
Check for the @code{alloca} function.  Define @code{HAVE_ALLOCA_H} if
@file{alloca.h} defines a working @code{alloca}.  If not, look for a
builtin alternative.  If either method succeeds, define
@code{HAVE_ALLOCA}.  Otherwise, set the output variable @code{ALLOCA} to
@samp{$@{LIBOBJDIR@}alloca.o} and define
@code{C_ALLOCA} (so programs can periodically call @samp{alloca (0)} to
garbage collect).  This variable is separate from @code{LIBOBJS} so
multiple programs can share the value of @code{ALLOCA} without needing
to create an actual library, in case only some of them use the code in
@code{LIBOBJS}.  The @samp{$@{LIBOBJDIR@}} prefix serves the same
purpose as in @code{LIBOBJS} (@pxref{AC_LIBOBJ vs LIBOBJS}).

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

@example
@group
#include <stdlib.h>
#include <stddef.h>
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
#elif !defined alloca
# ifdef __GNUC__
#  define alloca __builtin_alloca
# elif defined _MSC_VER
#  include <malloc.h>
#  define alloca _alloca
# elif !defined HAVE_ALLOCA
#  ifdef  __cplusplus
extern "C"
#  endif
void *alloca (size_t);
# endif
#endif
@end group
@end example

If you don't want to maintain this piece of code in your package manually,
you can instead use the Gnulib module @code{alloca-opt} or @code{alloca}.
@xref{Gnulib}.
@end defmac

@defmac AC_FUNC_CHOWN
@acindex{FUNC_CHOWN}
@cvindex HAVE_CHOWN
@c @fuindex chown
@prindex @code{chown}
@caindex func_chown_works
If the @code{chown} function is available and works (in particular, it
should accept @option{-1} for @code{uid} and @code{gid}), define
@code{HAVE_CHOWN}.  The result of this macro is cached in the
@code{ac_cv_func_chown_works} variable.

If you want a workaround, that is, a @code{chown} function that is
available and works, you can use the Gnulib module @code{chown}.
@xref{Gnulib}.
@end defmac

@anchor{AC_FUNC_CLOSEDIR_VOID}
@defmac AC_FUNC_CLOSEDIR_VOID
@acindex{FUNC_CLOSEDIR_VOID}
@cvindex CLOSEDIR_VOID
@c @fuindex closedir
@prindex @code{closedir}
@caindex func_closedir_void
If the @code{closedir} function does not return a meaningful value,
define @code{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 @code{closedir} does not
return a meaningful value is made.

The result of this macro is cached in the @code{ac_cv_func_closedir_void}
variable.

This macro is obsolescent, as @code{closedir} returns a meaningful value
on current systems.  New programs need not use this macro.
@end defmac

@defmac AC_FUNC_ERROR_AT_LINE
@acindex{FUNC_ERROR_AT_LINE}
@c @fuindex error_at_line
@prindex @code{error_at_line}
@caindex lib_error_at_line
If the @code{error_at_line} function is not found, require an
@code{AC_LIBOBJ} replacement of @samp{error}.

The result of this macro is cached in the @code{ac_cv_lib_error_at_line}
variable.

The @code{AC_FUNC_ERROR_AT_LINE} macro is obsolescent.  New programs
should use Gnulib's @code{error} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_FNMATCH
@acindex{FUNC_FNMATCH}
@c @fuindex fnmatch
@prindex @code{fnmatch}
@caindex func_fnmatch_works
If the @code{fnmatch} function conforms to POSIX, define
@code{HAVE_FNMATCH}.

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

The result of this macro is cached in the @code{ac_cv_func_fnmatch_works}
variable.

This macro is obsolescent.  New programs should use Gnulib's
@code{fnmatch-posix} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_FNMATCH_GNU
@acindex{FUNC_FNMATCH_GNU}
@c @fuindex fnmatch
@prindex @code{fnmatch}
@caindex func_fnmatch_gnu
Behave like @code{AC_REPLACE_FNMATCH} (@emph{replace}) but also test
whether @code{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 @code{ac_cv_func_fnmatch_gnu}
variable.

This macro is obsolescent.  New programs should use Gnulib's
@code{fnmatch-gnu} module.  @xref{Gnulib}.
@end defmac

@anchor{AC_FUNC_FORK}
@defmac AC_FUNC_FORK
@acindex{FUNC_FORK}
@cvindex HAVE_VFORK_H
@cvindex HAVE_WORKING_FORK
@cvindex HAVE_WORKING_VFORK
@cvindex vfork
@c @fuindex fork
@prindex @code{fork}
@c @fuindex vfork
@prindex @code{vfork}
@hdrindex{vfork.h}
@c @caindex func_fork
@c @caindex func_fork_works
This macro checks for the @code{fork} and @code{vfork} functions.  If a
working @code{fork} is found, define @code{HAVE_WORKING_FORK}.  This macro
checks whether @code{fork} is just a stub by trying to run it.

If @file{vfork.h} is found, define @code{HAVE_VFORK_H}.  If a working
@code{vfork} is found, define @code{HAVE_WORKING_VFORK}.  Otherwise,
define @code{vfork} to be @code{fork} for backward compatibility with
previous versions of @command{autoconf}.  This macro checks for several known
errors in implementations of @code{vfork} and considers the system to not
have a working @code{vfork} if it detects any of them.

Since this macro defines @code{vfork} only for backward compatibility with
previous versions of @command{autoconf} you're encouraged to define it
yourself in new code:
@example
@group
#ifndef HAVE_WORKING_VFORK
# define vfork fork
#endif
@end group
@end example

The results of this macro are cached in the @code{ac_cv_func_fork_works}
and @code{ac_cv_func_vfork_works} variables.  In order to override the
test, you also need to set the @code{ac_cv_func_fork} and
@code{ac_cv_func_vfork} variables.
@end defmac

@anchor{AC_FUNC_FSEEKO}
@defmac AC_FUNC_FSEEKO
@acindex{FUNC_FSEEKO}
@cvindex _LARGEFILE_SOURCE
@cvindex HAVE_FSEEKO
@c @fuindex fseeko
@prindex @code{fseeko}
@c @fuindex ftello
@prindex @code{ftello}
@c @caindex sys_largefile_source
If the @code{fseeko} and @code{ftello} functions are available, define
@code{HAVE_FSEEKO}.  Define @code{_LARGEFILE_SOURCE} if necessary to
make the prototype visible.

Configure scripts that use @code{AC_FUNC_FSEEKO} should normally also
use @code{AC_SYS_LARGEFILE} to ensure that @code{off_t} can represent
all supported file sizes.  @xref{AC_SYS_LARGEFILE}.

The Gnulib module @code{fseeko} invokes @code{AC_FUNC_FSEEKO}
and also contains workarounds for other portability problems of
@code{fseeko}.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_GETGROUPS
@acindex{FUNC_GETGROUPS}
@cvindex HAVE_GETGROUPS
@ovindex GETGROUPS_LIB
@c @fuindex getgroups
@prindex @code{getgroups}
@caindex func_getgroups_works
Perform all the checks performed by @code{AC_TYPE_GETGROUPS}
(@pxref{AC_TYPE_GETGROUPS}).
Then, if the @code{getgroups} function is available
and known to work correctly, define @code{HAVE_GETGROUPS}.
Set the output variable @code{GETGROUPS_LIB} to any libraries
needed to get that function.

This macro relies on a list of systems with known, serious bugs in
@code{getgroups}.  If this list mis-identifies your system's
@code{getgroups} as buggy, or as not buggy, you can override it by
setting the cache variable @code{ac_cv_func_getgroups_works} in a
@file{config.site} file (@pxref{Site Defaults}).  Please also report the
error to @email{bug-autoconf@@gnu.org, the Autoconf Bugs mailing list}.

The Gnulib module @code{getgroups} provides workarounds for additional,
less severe portability problems with this function.
@end defmac

@anchor{AC_FUNC_GETLOADAVG}
@defmac AC_FUNC_GETLOADAVG
@acindex{FUNC_GETLOADAVG}
@cvindex SVR4
@cvindex DGUX
@cvindex UMAX
@cvindex UMAX4_3
@cvindex HAVE_NLIST_H
@cvindex NLIST_NAME_UNION
@cvindex GETLOADAVG_PRIVILEGED
@cvindex NEED_SETGID
@cvindex C_GETLOADAVG
@ovindex LIBOBJS
@ovindex NEED_SETGID
@ovindex KMEM_GROUP
@ovindex GETLOADAVG_LIBS
@c @fuindex getloadavg
@prindex @code{getloadavg}
Check how to get the system load averages.  To perform its tests
properly, this macro needs the file @file{getloadavg.c}; therefore, be
sure to set the @code{AC_LIBOBJ} replacement directory properly (see
@ref{Generic Functions}, @code{AC_CONFIG_LIBOBJ_DIR}).

If the system has the @code{getloadavg} function, define
@code{HAVE_GETLOADAVG}, and set @code{GETLOADAVG_LIBS} to any libraries
necessary to get that function.  Also add @code{GETLOADAVG_LIBS} to
@code{LIBS}.  Otherwise, require an @code{AC_LIBOBJ} replacement for
@samp{getloadavg} and possibly define several other C preprocessor
macros and output variables:

@enumerate
@item
Define @code{C_GETLOADAVG}.

@item
Define @code{SVR4}, @code{DGUX}, @code{UMAX}, or @code{UMAX4_3} if on
those systems.

@item
@hdrindex{nlist.h}
If @file{nlist.h} is found, define @code{HAVE_NLIST_H}.

@item
If @samp{struct nlist} has an @samp{n_un.n_name} member, define
@code{HAVE_STRUCT_NLIST_N_UN_N_NAME}.  The obsolete symbol
@code{NLIST_NAME_UNION} is still defined, but do not depend upon it.

@item
Programs may need to be installed set-group-ID (or set-user-ID) for
@code{getloadavg} to work.  In this case, define
@code{GETLOADAVG_PRIVILEGED}, set the output variable @code{NEED_SETGID}
to @samp{true} (and otherwise to @samp{false}), and set
@code{KMEM_GROUP} to the name of the group that should own the installed
program.
@end enumerate

The @code{AC_FUNC_GETLOADAVG} macro is obsolescent.  New programs should
use Gnulib's @code{getloadavg} module.  @xref{Gnulib}.
@end defmac

@anchor{AC_FUNC_GETMNTENT}
@defmac AC_FUNC_GETMNTENT
@acindex{FUNC_GETMNTENT}
@cvindex HAVE_GETMNTENT
@c @fuindex getmntent
@prindex @code{getmntent}
@caindex search_getmntent
Check for @code{getmntent} in the standard C library, and then in the
@file{sun}, @file{seq}, and @file{gen} libraries.  Then, if
@code{getmntent} is available, define @code{HAVE_GETMNTENT} and set
@code{ac_cv_func_getmntent} to @code{yes}.  Otherwise set
@code{ac_cv_func_getmntent} to @code{no}.

The result of this macro can be overridden by setting the cache variable
@code{ac_cv_search_getmntent}.

The @code{AC_FUNC_GETMNTENT} macro is obsolescent.  New programs should
use Gnulib's @code{mountlist} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_GETPGRP
@acindex{FUNC_GETPGRP}
@cvindex GETPGRP_VOID
@c @fuindex getpgid
@c @fuindex getpgrp
@prindex @code{getpgid}
@prindex @code{getpgrp}
@caindex func_getpgrp_void
Define @code{GETPGRP_VOID} if it is an error to pass 0 to
@code{getpgrp}; this is the POSIX behavior.  On older BSD
systems, you must pass 0 to @code{getpgrp}, as it takes an argument and
behaves like POSIX's @code{getpgid}.

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

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

The result of this macro is cached in the @code{ac_cv_func_getpgrp_void}
variable.

This macro is obsolescent, as current systems have a @code{getpgrp}
whose signature conforms to POSIX@.  New programs need not use this macro.
@end defmac

@defmac AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
@acindex{FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK}
@cvindex LSTAT_FOLLOWS_SLASHED_SYMLINK
@c @fuindex lstat
@prindex @code{lstat}
@caindex func_lstat_dereferences_slashed_symlink
If @file{link} is a symbolic link, then @code{lstat} should treat
@file{link/} the same as @file{link/.}.  However, many older
@code{lstat} implementations incorrectly ignore trailing slashes.

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

If @code{lstat} behaves properly, define
@code{LSTAT_FOLLOWS_SLASHED_SYMLINK}, otherwise require an
@code{AC_LIBOBJ} replacement of @code{lstat}.

The result of this macro is cached in the
@code{ac_cv_func_lstat_dereferences_slashed_symlink} variable.

The @code{AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} macro is obsolescent.
New programs should use Gnulib's @code{lstat} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_MALLOC
@acindex{FUNC_MALLOC}
@cvindex HAVE_MALLOC
@cvindex malloc
@c @fuindex malloc
@prindex @code{malloc}
@caindex func_malloc_0_nonnull
If the @code{malloc} function is compatible with the GNU C
library @code{malloc} (i.e., @samp{malloc (0)} returns a valid
pointer), define @code{HAVE_MALLOC} to 1.  Otherwise define
@code{HAVE_MALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
@samp{malloc}, and define @code{malloc} to @code{rpl_malloc} so that the
native @code{malloc} is not used in the main project.

Typically, the replacement file @file{malloc.c} should look like (note
the @samp{#undef malloc}):

@verbatim
#include <config.h>
#undef malloc

#include <stdlib.h>

/* 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);
}
@end verbatim

The result of this macro is cached in the
@code{ac_cv_func_malloc_0_nonnull} variable.
The result might contain spaces, e.g., @code{guessing yes}.

If you don't want to maintain a @code{malloc.c} file in your package
manually, you can instead use the Gnulib module @code{malloc-gnu}.
@end defmac

@defmac AC_FUNC_MBRTOWC
@acindex{FUNC_MBRTOWC}
@cvindex HAVE_MBRTOWC
@c @fuindex mbrtowc
@prindex @code{mbrtowc}
@caindex func_mbrtowc
Define @code{HAVE_MBRTOWC} to 1 if the function @code{mbrtowc} and the
type @code{mbstate_t} are properly declared.

The result of this macro is cached in the @code{ac_cv_func_mbrtowc}
variable.

The Gnulib module @code{mbrtowc} not only ensures that the
function is declared, but also works around other portability
problems of this function.
@end defmac

@defmac AC_FUNC_MEMCMP
@acindex{FUNC_MEMCMP}
@ovindex LIBOBJS
@c @fuindex memcmp
@prindex @code{memcmp}
@caindex func_memcmp_working
If the @code{memcmp} function is not available or does not work, require an
@code{AC_LIBOBJ} replacement for @samp{memcmp}.

The result of this macro is cached in the
@code{ac_cv_func_memcmp_working} variable.

This macro is obsolescent, as current systems have a working
@code{memcmp}.  New programs need not use this macro.
@end defmac

@defmac AC_FUNC_MKTIME
@acindex{FUNC_MKTIME}
@ovindex LIBOBJS
@c @fuindex mktime
@prindex @code{mktime}
@caindex func_working_mktime
If the @code{mktime} function is not available, or does not work
correctly, require an @code{AC_LIBOBJ} replacement for @samp{mktime}.
For the purposes of this test, @code{mktime} should conform to the
POSIX standard and should be the inverse of
@code{localtime}.

The result of this macro is cached in the
@code{ac_cv_func_working_mktime} variable.

The @code{AC_FUNC_MKTIME} macro is obsolescent.  New programs should
use Gnulib's @code{mktime} module.  @xref{Gnulib}.
@end defmac

@anchor{AC_FUNC_MMAP}
@defmac AC_FUNC_MMAP
@acindex{FUNC_MMAP}
@cvindex HAVE_MMAP
@c @fuindex mmap
@prindex @code{mmap}
@caindex func_mmap_fixed_mapped
If the @code{mmap} function exists and works correctly, define
@code{HAVE_MMAP}.  This checks only private fixed mapping of already-mapped
memory.

The result of this macro is cached in the
@code{ac_cv_func_mmap_fixed_mapped} variable.

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

@defmac AC_FUNC_OBSTACK
@acindex{FUNC_OBSTACK}
@cvindex HAVE_OBSTACK
@cindex obstack
@caindex func_obstack
If the obstacks are found, define @code{HAVE_OBSTACK}, else require an
@code{AC_LIBOBJ} replacement for @samp{obstack}.

The result of this macro is cached in the @code{ac_cv_func_obstack}
variable.

The @code{AC_FUNC_OBSTACK} macro is obsolescent.  New programs should use
Gnulib's @code{obstack} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_REALLOC
@acindex{FUNC_REALLOC}
@cvindex HAVE_REALLOC
@cvindex realloc
@c @fuindex realloc
@prindex @code{realloc}
@caindex func_realloc_0_nonnull
If a successful call to @samp{realloc (NULL, 0)} returns a
non-null pointer, define @code{HAVE_REALLOC} to 1.  Otherwise define
@code{HAVE_REALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
@samp{realloc}, and define @code{realloc} to @code{rpl_realloc} so that
the native @code{realloc} is not used in the main project.  See
@code{AC_FUNC_MALLOC} for details.

The result of this macro is cached in the
@code{ac_cv_func_realloc_0_nonnull} variable.
The result might contain spaces, e.g., @code{guessing yes}.

This macro does not check compatibility with glibc @code{realloc (@var{p}, 0)}
when @var{p} is non-null, as glibc 1--2.1 behaves differently from glibc
2.1.1--2.40 (at least), and the C standard says behavior is undefined.
@end defmac

@defmac AC_FUNC_SELECT_ARGTYPES
@acindex{FUNC_SELECT_ARGTYPES}
@cvindex SELECT_TYPE_ARG1
@cvindex SELECT_TYPE_ARG234
@cvindex SELECT_TYPE_ARG5
@c @fuindex select
@prindex @code{select}
@c @caindex func_select_args
Determines the correct type to be passed for each of the
@code{select} function's arguments, and defines those types
in @code{SELECT_TYPE_ARG1}, @code{SELECT_TYPE_ARG234}, and
@code{SELECT_TYPE_ARG5} respectively.  @code{SELECT_TYPE_ARG1} defaults
to @samp{int}, @code{SELECT_TYPE_ARG234} defaults to @samp{int *},
and @code{SELECT_TYPE_ARG5} defaults to @samp{struct timeval *}.

This macro is obsolescent, as current systems have a @code{select} whose
signature conforms to POSIX@.  New programs need not use this macro.
@end defmac

@defmac AC_FUNC_SETPGRP
@acindex{FUNC_SETPGRP}
@cvindex SETPGRP_VOID
@c @fuindex setpgrp
@prindex @code{setpgrp}
@caindex func_setpgrp_void
If @code{setpgrp} takes no argument (the POSIX version), define
@code{SETPGRP_VOID}.  Otherwise, it is the BSD version, which takes
two process IDs as arguments.  This macro does not check whether
@code{setpgrp} exists at all; if you need to work in that situation,
first call @code{AC_CHECK_FUNC} for @code{setpgrp}.  This macro also
does not check for the Solaris variant of @code{setpgrp}, which returns
a @code{pid_t} instead of an @code{int}; portable code should only use
the return value by comparing it against @code{-1} to check for errors.

The result of this macro is cached in the @code{ac_cv_func_setpgrp_void}
variable.

This macro is obsolescent, as all forms of @code{setpgrp} are also
obsolescent.  New programs should use the POSIX function @code{setpgid},
which takes two process IDs as arguments (like the BSD @code{setpgrp}).
@end defmac

@defmac AC_FUNC_STAT
@defmacx AC_FUNC_LSTAT
@acindex{FUNC_STAT}
@acindex{FUNC_LSTAT}
@cvindex HAVE_STAT_EMPTY_STRING_BUG
@cvindex HAVE_LSTAT_EMPTY_STRING_BUG
@c @fuindex stat
@prindex @code{stat}
@c @fuindex lstat
@prindex @code{lstat}
@caindex func_stat_empty_string_bug
@caindex func_lstat_empty_string_bug
Determine whether @code{stat} or @code{lstat} have the bug that it
succeeds when given the zero-length file name as argument.

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

The results of these macros are cached in the
@code{ac_cv_func_stat_empty_string_bug} and the
@code{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.
@end defmac

@anchor{AC_FUNC_STRCOLL}
@defmac AC_FUNC_STRCOLL
@acindex{FUNC_STRCOLL}
@cvindex HAVE_STRCOLL
@c @fuindex strcoll
@prindex @code{strcoll}
@caindex func_strcoll_works
If the @code{strcoll} function exists and works correctly, define
@code{HAVE_STRCOLL}.  This does a bit more than
@samp{AC_CHECK_FUNCS(strcoll)}, because some systems have incorrect
definitions of @code{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 @code{ac_cv_func_strcoll_works}
variable.
@end defmac

@defmac AC_FUNC_STRERROR_R
@acindex{FUNC_STRERROR_R}
@cvindex HAVE_STRERROR_R
@cvindex HAVE_DECL_STRERROR_R
@cvindex STRERROR_R_CHAR_P
@c @fuindex strerror_r
@caindex func_strerror_r_char_p
@prindex @code{strerror_r}
If @code{strerror_r} is available, define @code{HAVE_STRERROR_R}, and if
it is declared, define @code{HAVE_DECL_STRERROR_R}.  If it returns a
@code{char *} message, define @code{STRERROR_R_CHAR_P}; otherwise it
returns an @code{int} error number.  The Thread-Safe Functions option of
POSIX requires @code{strerror_r} to return @code{int}, but
many systems (including, for example, the GNU C
Library) return a @code{char *} value that is not necessarily equal to
the buffer argument.

The result of this macro is cached in the
@code{ac_cv_func_strerror_r_char_p} variable.

The Gnulib module @code{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.
@end defmac

@anchor{AC_FUNC_STRFTIME}
@defmac AC_FUNC_STRFTIME
@acindex{FUNC_STRFTIME}
@cvindex HAVE_STRFTIME
@c @fuindex strftime
@prindex @code{strftime}
Check for @code{strftime} in the @file{intl} library.
Then, if @code{strftime} is available, define @code{HAVE_STRFTIME}.

This macro is obsolescent, as no current systems require the @file{intl}
library for @code{strftime}.  New programs need not use this macro.
@end defmac

@defmac AC_FUNC_STRTOD
@acindex{FUNC_STRTOD}
@ovindex POW_LIB
@c @fuindex strtod
@prindex @code{strtod}
@caindex func_strtod
@caindex func_pow
If the @code{strtod} function does not exist or doesn't work correctly,
ask for an @code{AC_LIBOBJ} replacement of @samp{strtod}.  In this case,
because @file{strtod.c} is likely to need @samp{pow}, set the output
variable @code{POW_LIB} to the extra library needed.

This macro caches its result in the @code{ac_cv_func_strtod} variable
and depends upon the result in the @code{ac_cv_func_pow} variable.

The @code{AC_FUNC_STRTOD} macro is obsolescent.  New programs should
use Gnulib's @code{strtod} module.  @xref{Gnulib}.
@end defmac

@defmac AC_FUNC_STRTOLD
@acindex{FUNC_STRTOLD}
@cvindex HAVE_STRTOLD
@prindex @code{strtold}
@caindex func_strtold
If the @code{strtold} function exists and conforms to C99 or later, define
@code{HAVE_STRTOLD}.

This macro caches its result in the @code{ac_cv_func_strtold} variable.

The Gnulib module @code{strtold} not only ensures that the
function exists, but also works around other portability
problems of this function.
@end defmac

@defmac AC_FUNC_STRNLEN
@acindex{FUNC_STRNLEN}
@cvindex HAVE_STRNLEN
@c @fuindex strnlen
@prindex @code{strnlen}
@caindex func_strnlen_working
If the @code{strnlen} function is not available, or is buggy (like the one
from Android 5.0 or AIX 4.3), require an @code{AC_LIBOBJ} replacement for it.

This macro caches its result in the @code{ac_cv_func_strnlen_working}
variable.

The @code{AC_FUNC_STRNLEN} macro is obsolescent.  New programs should
use Gnulib's @code{strnlen} module.  @xref{Gnulib}.
@end defmac

@anchor{AC_FUNC_UTIME_NULL}
@defmac AC_FUNC_UTIME_NULL
@acindex{FUNC_UTIME_NULL}
@cvindex HAVE_UTIME_NULL
@c @fuindex utime
@prindex @code{utime}
@caindex func_utime_null
If @samp{utime (@var{file}, NULL)} sets @var{file}'s timestamp to
the present, define @code{HAVE_UTIME_NULL}.

This macro caches its result in the @code{ac_cv_func_utime_null}
variable.

This macro is obsolescent, as all current systems have a @code{utime}
that behaves this way.  New programs need not use this macro.
@end defmac

@anchor{AC_FUNC_VPRINTF}
@defmac AC_FUNC_VPRINTF
@acindex{FUNC_VPRINTF}
@cvindex HAVE_VPRINTF
@cvindex HAVE_DOPRNT
@c @fuindex vprintf
@prindex @code{vprintf}
@c @fuindex vsprintf
@prindex @code{vsprintf}
If @code{vprintf} is found, define @code{HAVE_VPRINTF}.  Otherwise, if
@code{_doprnt} is found, define @code{HAVE_DOPRNT}.  (If @code{vprintf}
is available, you may assume that @code{vfprintf} and @code{vsprintf}
are also available.)

This macro is obsolescent, as all current systems have @code{vprintf}.
New programs need not use this macro.
@end defmac

@defmac AC_REPLACE_FNMATCH
@acindex{REPLACE_FNMATCH}
@c @fuindex fnmatch
@prindex @code{fnmatch}
@hdrindex{fnmatch.h}
@caindex func_fnmatch_works
If the @code{fnmatch} function does not conform to POSIX (see
@code{AC_FUNC_FNMATCH}), ask for its @code{AC_LIBOBJ} replacement.

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

This macro caches its result in the @code{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 @code{fnmatch-posix} module,
which provides this macro along with the source files.  @xref{Gnulib}.
@end defmac



@node Generic Functions
@subsection 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 @code{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 (@pxref{Writing Tests}).

@anchor{AC_CHECK_FUNC}
@defmac AC_CHECK_FUNC (@var{function}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{CHECK_FUNC}
@caindex func_@var{function}
If C function @var{function} is available, run shell commands
@var{action-if-found}, otherwise @var{action-if-not-found}.  If you just
want to define a symbol if the function is available, consider using
@code{AC_CHECK_FUNCS} instead.  This macro checks for functions with C
linkage even when @code{AC_LANG(C++)} has been called, since C is more
standardized than C++.  (@pxref{Language Choice}, for more information
about selecting the language for checks.)

This macro caches its result in the @code{ac_cv_func_@var{function}}
variable.
@end defmac

@anchor{AC_CHECK_FUNCS}
@defmac AC_CHECK_FUNCS (@var{function}@dots{}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{CHECK_FUNCS}
@cvindex HAVE_@var{function}
For each @var{function} enumerated in the blank-or-newline-separated argument
list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
If @var{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
@samp{break} to break out of the loop on the first match.  If
@var{action-if-not-found} is given, it is executed when one of the
functions is not found.

Results are cached for each @var{function} as in @code{AC_CHECK_FUNC}.
@end defmac

@defmac AC_CHECK_FUNCS_ONCE (@var{function}@dots{})
@acindex{CHECK_FUNCS_ONCE}
@cvindex HAVE_@var{function}
For each @var{function} enumerated in the blank-or-newline-separated argument
list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
This is a once-only variant of @code{AC_CHECK_FUNCS}.  It generates the
checking code at most once, so that @command{configure} is smaller and
faster; but the checks cannot be conditionalized and are always done once,
early during the @command{configure} run.
@end defmac

@sp 1

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 (@pxref{Gnulib}).

@defmac AC_LIBOBJ (@var{function})
@acindex{LIBOBJ}
@ovindex LIBOBJS
Specify that @samp{@var{function}.c} must be included in the executables
to replace a missing or broken implementation of @var{function}.

@vrindex ac_objext
Technically, it adds @samp{@var{function}.$ac_objext} to the output
variable @code{LIBOBJS} if it is not already in, and calls
@code{AC_LIBSOURCE} for @samp{@var{function}.c}.  You should not
directly change @code{LIBOBJS}, since this is not traceable.
@end defmac

@defmac AC_LIBSOURCE (@var{file})
@acindex{LIBSOURCE}
Specify that @var{file} might be needed to compile the project.  If you
need to know what files might be needed by a @file{configure.ac}, you
should trace @code{AC_LIBSOURCE}.  @var{file} must be a literal.

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

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

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

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

@defmac AC_LIBSOURCES (@var{files})
@acindex{LIBSOURCES}
Like @code{AC_LIBSOURCE}, but accepts one or more @var{files} in a
comma-separated M4 list.  Thus, the above example might be rewritten:

@example
AC_LIBSOURCES([foo.c, bar.c])
AC_LIBOBJ([$foo_or_bar])
@end example
@end defmac

@defmac AC_CONFIG_LIBOBJ_DIR (@var{directory})
@acindex{CONFIG_LIBOBJ_DIR}
Specify that @code{AC_LIBOBJ} replacement files are to be found in
@var{directory}, a name relative to the top level of the
source tree.  The replacement directory defaults to @file{.}, the top
level directory, and the most typical value is @file{lib}, corresponding
to @samp{AC_CONFIG_LIBOBJ_DIR([lib])}.

@command{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, @var{directory} is used as a relative path
from @code{$(top_srcdir)} to each object named in @code{LIBOBJS} and
@code{LTLIBOBJS}, etc.
@end defmac

@sp 1

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

@defmac AC_REPLACE_FUNCS (@var{function}@dots{})
@acindex{REPLACE_FUNCS}
@cvindex HAVE_@var{function}
@ovindex LIBOBJS
Like @code{AC_CHECK_FUNCS}, but uses @samp{AC_LIBOBJ(@var{function})} as
@var{action-if-not-found}.  You can declare your replacement function by
enclosing the prototype in @samp{#ifndef HAVE_@var{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.
@end defmac

@node Header Files
@section Header Files
@cindex Header, checking

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.

@menu
* Header Portability::          Collected knowledge on common headers
* Particular Headers::          Special handling to find certain headers
* Generic Headers::             How to find other headers
@end menu

@node Header Portability
@subsection Portability of Headers
@cindex Portability of headers
@cindex Header portability

This section documents some collected knowledge about common headers,
and the problems they cause.  By definition, this list always requires
additions.  A much more complete list is maintained by the Gnulib
project (@pxref{Gnulib}), covering @ref{Header File Substitutes, ,
POSIX Headers, gnulib, Gnulib} and @ref{Glibc Header File
Substitutes, , Glibc Headers, gnulib, Gnulib}.  Please help us keep
the Gnulib list as complete as possible.

When we say that a header ``may require'' some set of other headers, we
mean that it may be necessary for you to manually include those other
headers first, or the contents of the header under test will fail to
compile.  When checking for these headers, you must provide the
potentially-required headers in the @var{includes} argument to
@code{AC_CHECK_HEADER} or @code{AC_CHECK_HEADERS}, or the check will
fail spuriously.  @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes})
arranges to include a number of common requirements and should normally
come first in your @var{includes}.  For example, @file{net/if.h} may
require @file{sys/types.h}, @file{sys/socket.h}, or both, and
@code{AC_INCLUDES_DEFAULT} handles @file{sys/types.h} but not
@file{sys/socket.h}, so you should check for it like this:

@example
AC_CHECK_HEADERS([sys/socket.h])
AC_CHECK_HEADERS([net/if.h], [], [],
[AC_INCLUDES_DEFAULT[
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
]])
@end example

Note that the example mixes single quoting (for@code{AC_INCLUDES_DEFAULT},
so that it gets expanded) and double quoting (to ensure that each
preprocessor @code{#} gets treated as a literal string rather than a
comment).

@table @asis

@item @file{limits.h}
In C99 and later, @file{limits.h} defines @code{LLONG_MIN},
@code{LLONG_MAX}, and @code{ULLONG_MAX}, but many almost-C99
environments (e.g., default GCC 4.0.2 + glibc 2.4) do not
define them.

@item @file{memory.h}
@hdrindex{memory.h}
This header file is obsolete; use @file{string.h} instead.

@item @file{strings.h}
@hdrindex{strings.h}
On some systems, this is the only header that declares
@code{strcasecmp}, @code{strncasecmp}, and @code{ffs}.

This header may or may not include @file{string.h} for you.  However, on
all recent systems it is safe to include both @file{string.h} and
@file{strings.h}, in either order, in the same source file.

@item @file{inttypes.h} vs.@: @file{stdint.h}
@hdrindex{inttypes.h}
@hdrindex{stdint.h}
C99 specifies that @file{inttypes.h} includes @file{stdint.h}, so there's
no need to include @file{stdint.h} separately in a standard environment.
However, some implementations have @file{stdint.h} but not @file{inttypes.h}
(e.g. MSVC 2012).  Therefore, it is necessary to check for each and include
each only if available.

@item @file{linux/irda.h}
@hdrindex{linux/irda.h}
This header may require @file{linux/types.h} and/or @file{sys/socket.h}.

@item @file{linux/random.h}
@hdrindex{linux/random.h}
This header may require @file{linux/types.h}.

@item @file{net/if.h}
@hdrindex{net/if.h}
This header may require @file{sys/types.h} and/or @file{sys/socket.h}.

@item @file{netinet/if_ether.h}
@hdrindex{netinet/if_ether.h}
This header may require some combination of @file{sys/types.h},
@file{sys/socket.h}, @file{netinet/in.h}, and @file{net/if.h}.

@item @file{sys/mount.h}
@hdrindex{sys/mount.h}
This header may require @file{sys/params.h}.

@item @file{sys/ptem.h}
@hdrindex{sys/ptem.h}
This header may require @file{sys/stream.h}.

@item @file{sys/socket.h}
@hdrindex{sys/socket.h}
This header may require @file{sys/types.h}.

@item @file{sys/ucred.h}
@hdrindex{sys/ucred.h}
This header may require @file{sys/types.h}.

@item @file{X11/extensions/scrnsaver.h}
@hdrindex{X11/extensions/scrnsaver.h}
Using XFree86, this header requires @file{X11/Xlib.h}, which is probably
so required that you might not even consider looking for it.

@end table


@node Particular Headers
@subsection Particular Header Checks

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

@defmac AC_CHECK_HEADER_STDBOOL
@acindex{CHECK_HEADER_STDBOOL}
@cvindex HAVE__BOOL
@hdrindex{stdbool.h}
@caindex header_stdbool_h
Check whether @file{stdbool.h} exists and conforms to C99 or later,
and cache the result in the @code{ac_cv_header_stdbool_h} variable.
If the type @code{_Bool} is defined, define @code{HAVE__BOOL} to 1.

This macro is obsolescent, as all current C compilers have @file{stdbool.h},
a header that is itself obsolescent as of C23.

This macro is intended for use by Gnulib (@pxref{Gnulib}) and other
packages that supply a substitute @file{stdbool.h} on platforms lacking
a conforming one.  The @code{AC_HEADER_STDBOOL} macro is better for code
that explicitly checks for @file{stdbool.h}.
@end defmac

@defmac AC_HEADER_ASSERT
@acindex{HEADER_ASSERT}
@cvindex NDEBUG
@hdrindex{assert.h}
Check whether to enable assertions in the style of @file{assert.h}.
Assertions are enabled by default, but the user can override this by
invoking @command{configure} with the @option{--disable-assert} option.
@end defmac

@anchor{AC_HEADER_DIRENT}
@defmac AC_HEADER_DIRENT
@acindex{HEADER_DIRENT}
@cvindex HAVE_DIRENT_H
@cvindex HAVE_NDIR_H
@cvindex HAVE_SYS_DIR_H
@cvindex HAVE_SYS_NDIR_H
@hdrindex{dirent.h}
@hdrindex{sys/ndir.h}
@hdrindex{sys/dir.h}
@hdrindex{ndir.h}
Check for the following header files.  For the first one that is
found and defines @samp{DIR}, define the listed C preprocessor macro:

@multitable {@file{sys/ndir.h}} {@code{HAVE_SYS_NDIR_H}}
@item @file{dirent.h}   @tab @code{HAVE_DIRENT_H}
@item @file{sys/ndir.h} @tab @code{HAVE_SYS_NDIR_H}
@item @file{sys/dir.h}  @tab @code{HAVE_SYS_DIR_H}
@item @file{ndir.h}     @tab @code{HAVE_NDIR_H}
@end multitable

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

@example
@group
#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
@end group
@end example

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

This macro also checks for the obsolete @file{dir} and @file{x} libraries.

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

Also see @code{AC_STRUCT_DIRENT_D_INO} and
@code{AC_STRUCT_DIRENT_D_TYPE} (@pxref{Particular Structures}).
@end defmac

@anchor{AC_HEADER_MAJOR}
@defmac AC_HEADER_MAJOR
@acindex{HEADER_MAJOR}
@cvindex MAJOR_IN_MKDEV
@cvindex MAJOR_IN_SYSMACROS
@hdrindex{sys/mkdev.h}
@hdrindex{sys/sysmacros.h}
Detect the headers required to use @code{makedev}, @code{major}, and
@code{minor}.  These functions may be defined by @file{sys/mkdev.h},
@code{sys/sysmacros.h}, or @file{sys/types.h}.

@code{AC_HEADER_MAJOR} defines @code{MAJOR_IN_MKDEV} if they are in
@file{sys/mkdev.h}, or @code{MAJOR_IN_SYSMACROS} if they are in
@file{sys/sysmacros.h}.  If neither macro is defined, they are either in
@file{sys/types.h} or unavailable.

To properly use these functions, your code should contain something
like:

@verbatim
#include <sys/types.h>
#ifdef MAJOR_IN_MKDEV
# include <sys/mkdev.h>
#elif defined MAJOR_IN_SYSMACROS
# include <sys/sysmacros.h>
#endif
@end verbatim

Note: Configure scripts built with Autoconf 2.69 or earlier will not
detect a problem if @file{sys/types.h} contains definitions of
@code{major}, @code{minor}, and/or @code{makedev} that trigger compiler
warnings upon use.  This is known to occur with GNU libc 2.25, where
those definitions are being deprecated to reduce namespace pollution.
If it is not practical to use Autoconf 2.70 to regenerate the configure
script of affected software, you can work around the problem by setting
@samp{ac_cv_header_sys_types_h_makedev=no}, as an argument to
@command{configure} or as part of a @file{config.site} site default file
(@pxref{Site Defaults}).
@end defmac

@defmac AC_HEADER_RESOLV
@acindex{HEADER_RESOLV}
@cvindex HAVE_RESOLV_H
@hdrindex{resolv.h}
Checks for header @file{resolv.h}, checking for prerequisites first.
To properly use @file{resolv.h}, your code should contain something like
the following:

@verbatim
#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>
@end verbatim
@end defmac

@anchor{AC_HEADER_STAT}
@defmac AC_HEADER_STAT
@acindex{HEADER_STAT}
@cvindex STAT_MACROS_BROKEN
@hdrindex{sys/stat.h}
If the macros @code{S_ISDIR}, @code{S_ISREG}, etc.@: defined in
@file{sys/stat.h} do not work properly (returning false positives),
define @code{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.
@end defmac

@defmac AC_HEADER_STDBOOL
@acindex{HEADER_STDBOOL}
@cvindex HAVE_STDBOOL_H
@cvindex HAVE__BOOL
@hdrindex{stdbool.h}
@caindex header_stdbool_h
If @file{stdbool.h} exists and conforms to C99 or later, define
@code{HAVE_STDBOOL_H} to 1; if the type @code{_Bool} is defined, define
@code{HAVE__BOOL} to 1.

This macro is obsolescent, as all current C compilers have
@file{stdbool.h}, a header that is itself obsolescent as of C23.
Nowadays programs that need @code{bool}, @code{true} and @code{false}
can include @file{stdbool.h} unconditionally, without using
@code{AC_HEADER_STDBOOL}, and if such a program needs to be portable
only to C23 or later it need not even include @file{stdbool.h}.

This macro caches its result in the @code{ac_cv_header_stdbool_h}
variable.

This macro differs from @code{AC_CHECK_HEADER_STDBOOL} only in that it
defines @code{HAVE_STDBOOL_H} whereas @code{AC_CHECK_HEADER_STDBOOL}
does not.
@end defmac

@anchor{AC_HEADER_STDC}
@defmac AC_HEADER_STDC
@acindex{HEADER_STDC}
@cvindex STDC_HEADERS
@caindex header_stdc

This macro is obsolescent.  Its sole effect is to make sure that all the
headers that are included by @code{AC_INCLUDES_DEFAULT} (@pxref{Default
Includes}), but not part of C89, have been checked for.

All hosted environments that are still of interest for portable code
provide all of the headers specified in C89 (as amended in 1995).
@end defmac

@defmac AC_HEADER_SYS_WAIT
@acindex{HEADER_SYS_WAIT}
@cvindex HAVE_SYS_WAIT_H
@hdrindex{sys/wait.h}
@caindex header_sys_wait_h
If @file{sys/wait.h} exists and is compatible with POSIX, define
@code{HAVE_SYS_WAIT_H}.  Incompatibility can occur if @file{sys/wait.h}
does not exist, or if it uses the old BSD @code{union wait} instead
of @code{int} to store a status value.  If @file{sys/wait.h} is not
POSIX compatible, then instead of including it, define the
POSIX macros with their usual interpretations.  Here is an
example:

@example
@group
#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
@end group
@end example

@noindent
This macro caches its result in the @code{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.
@end defmac

@cvindex _POSIX_VERSION
@hdrindex{unistd.h}
@code{_POSIX_VERSION} is defined when @file{unistd.h} is included on
POSIX systems.  If there is no @file{unistd.h}, it is definitely
not a POSIX system.  However, some non-POSIX systems do
have @file{unistd.h}.

The way to check whether the system says it supports POSIX is:

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

#ifdef _POSIX_VERSION
/* Code for POSIX systems.  */
#endif
@end group
@end example

@defmac AC_HEADER_TIOCGWINSZ
@acindex{HEADER_TIOCGWINSZ}
@cvindex GWINSZ_IN_SYS_IOCTL
@hdrindex{sys/ioctl.h}
@hdrindex{termios.h}
@c FIXME: I need clarifications from Jim.
If the use of @code{TIOCGWINSZ} requires @file{<sys/ioctl.h>}, then
define @code{GWINSZ_IN_SYS_IOCTL}.  Otherwise @code{TIOCGWINSZ} can be
found in @file{<termios.h>}.

Use:

@example
@group
#ifdef HAVE_TERMIOS_H
# include <termios.h>
#endif

#ifdef GWINSZ_IN_SYS_IOCTL
# include <sys/ioctl.h>
#endif
@end group
@end example
@end defmac

@node Generic Headers
@subsection 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 (@pxref{Writing Tests}).

@anchor{AC_CHECK_HEADER}
@defmac AC_CHECK_HEADER (@var{header-file}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @ovar{includes})
@acindex{CHECK_HEADER}
@caindex header_@var{header-file}
If the system header file @var{header-file} is compilable, execute shell
commands @var{action-if-found}, otherwise execute
@var{action-if-not-found}.  If you just want to define a symbol if the
header file is available, consider using @code{AC_CHECK_HEADERS}
instead.

@var{includes} should be the appropriate @dfn{prerequisite} code, i.e.@:
whatever might be required to appear above
@samp{#include <@var{header-file}>} for it to compile without error.
This can be anything, but will normally be additional @samp{#include}
directives. If @var{includes} is omitted or empty, @file{configure} will
use the contents of the macro @code{AC_INCLUDES_DEFAULT}.
@xref{Default Includes}.

This macro used to check only for the @emph{presence} of a header, not
whether its contents were acceptable to the compiler.  Some older
@command{configure} scripts rely on this behavior, so it is still
available by specifying @samp{-} as @var{includes}.  This mechanism is
deprecated as of Autoconf 2.70; situations where a preprocessor-only
check is required should use @code{AC_PREPROC_IFELSE}.
@xref{Running the Preprocessor}.

This macro caches its result in the @code{ac_cv_header_@var{header-file}}
variable, with characters not suitable for a variable name mapped to
underscores.
@end defmac

@anchor{AC_CHECK_HEADERS}
@defmac AC_CHECK_HEADERS (@var{header-file}@dots{}, @
  @ovar{action-if-found}, @ovar{action-if-not-found}, @
  @ovar{includes})
@acindex{CHECK_HEADERS}
@cvindex HAVE_@var{header}
@caindex header_@var{header-file}
For each given system header file @var{header-file} in the
blank-separated argument list that exists, define
@code{HAVE_@var{header-file}} (in all capitals).  If @var{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 @samp{break} to break out of
the loop on the first match.  If @var{action-if-not-found} is given, it
is executed when one of the header files is not found.

@var{includes} is interpreted as in @code{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 @code{ac_cv_header_@var{header-file}}
variable, with characters not suitable for a variable name mapped to
underscores.
@end defmac

@defmac AC_CHECK_HEADERS_ONCE (@var{header-file}@dots{})
@acindex{CHECK_HEADERS_ONCE}
@cvindex HAVE_@var{header}
For each given system header file @var{header-file} in the
blank-separated argument list that exists, define
@code{HAVE_@var{header-file}} (in all capitals).

If you do not need the full power of @code{AC_CHECK_HEADERS}, this
variant generates smaller, faster @command{configure} files.  All
headers passed to @code{AC_CHECK_HEADERS_ONCE} are checked for in one
pass, early during the @command{configure} run.  The checks cannot be
conditionalized, you cannot specify an @var{action-if-found} or
@var{action-if-not-found}, and @code{AC_INCLUDES_DEFAULT} is always used
for the prerequisites.
@end defmac

In previous versions of Autoconf, these macros 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
(@pxref{Present But Cannot Be Compiled}).  If for some reason it is
inappropriate to check whether a header is compilable, you should use
@code{AC_PREPROC_IFELSE} (@pxref{Running the Preprocessor}) instead of
these macros.

Requiring each header to compile improves the robustness of the test,
but it also requires you to make sure that the @var{includes} are
correct.  Most system headers nowadays make sure to @code{#include}
whatever they require, or else have their dependencies satisfied by
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), but
@pxref{Header Portability}, for known exceptions.  In general, if you
are looking for @file{bar.h}, which requires that @file{foo.h} be
included first if it exists, you should do something like this:

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

@node Declarations
@section Declarations
@cindex Declaration, checking

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 (@pxref{Generic
Declarations}) or, for more complex tests, you may use
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).

@menu
* Particular Declarations::     Macros to check for certain declarations
* Generic Declarations::        How to find other declarations
@end menu

@node Particular Declarations
@subsection Particular Declaration Checks

There are no specific macros for declarations.

@node Generic Declarations
@subsection Generic Declaration Checks

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

@defmac AC_CHECK_DECL (@var{symbol}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_DECL}
@caindex have_decl_@var{symbol}
If @var{symbol} (a function, variable, or constant) is not declared in
@var{includes} and a declaration is needed, run the shell commands
@var{action-if-not-found}, otherwise @var{action-if-found}.
@var{includes} is a series of include directives, defaulting to
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
prior to the declaration under test.

This macro actually tests whether @var{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.  In order to facilitate use of C++ and overloaded function
declarations, it is possible to specify function argument types in
parentheses for types which can be zero-initialized:

@example
AC_CHECK_DECL([basename(char *)])
@end example

This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}}
variable, with characters not suitable for a variable name mapped to
underscores.
@end defmac

@anchor{AC_CHECK_DECLS}
@defmac AC_CHECK_DECLS (@var{symbols}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_DECLS}
@cvindex HAVE_DECL_@var{symbol}
@caindex have_decl_@var{symbol}
For each of the @var{symbols} (@emph{comma}-separated list with optional
function argument types for C++ overloads), define
@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
@var{symbol} is declared, otherwise to @samp{0}.  If
@var{action-if-not-found} is given, it is additional shell code to
execute when one of the function declarations is needed, otherwise
@var{action-if-found} is executed.

@var{includes} is a series of include directives, defaulting to
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
prior to the declarations under test.

This macro uses an M4 list as first argument:
@example
AC_CHECK_DECLS([strdup])
AC_CHECK_DECLS([strlen])
AC_CHECK_DECLS([malloc, realloc, calloc, free])
AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])
@end example

Unlike the other @samp{AC_CHECK_*S} macros, when a @var{symbol} is not
declared, @code{HAVE_DECL_@var{symbol}} is defined to @samp{0} instead
of leaving @code{HAVE_DECL_@var{symbol}} undeclared.  When you are
@emph{sure} that the check was performed, use
@code{HAVE_DECL_@var{symbol}} in @code{#if}:

@example
#if !HAVE_DECL_SYMBOL
extern char *symbol;
#endif
@end example

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

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

@noindent
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 @code{ac_cv_have_decl_@var{symbol}}
variables, with characters not suitable for a variable name mapped to
underscores.
@end defmac

@defmac AC_CHECK_DECLS_ONCE (@var{symbols})
@acindex{CHECK_DECLS_ONCE}
@cvindex HAVE_DECL_@var{symbol}
For each of the @var{symbols} (@emph{comma}-separated list), define
@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
@var{symbol} is declared in the default include files, otherwise to
@samp{0}.  This is a once-only variant of @code{AC_CHECK_DECLS}.  It
generates the checking code at most once, so that @command{configure} is
smaller and faster; but the checks cannot be conditionalized and are
always done once, early during the @command{configure} run.
@end defmac


@node Structures
@section Structures
@cindex Structure, checking

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
(@pxref{Generic Structures}) or, for more complex tests, you may use
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).

@menu
* Particular Structures::       Macros to check for certain structure members
* Generic Structures::          How to find other structure members
@end menu

@node Particular Structures
@subsection Particular Structure Checks

The following macros check for certain structures or structure members.

@defmac AC_STRUCT_DIRENT_D_INO
@acindex{STRUCT_DIRENT_D_INO}
@cvindex HAVE_STRUCT_DIRENT_D_INO
@c @caindex header_dirent_dirent_h
@c @caindex member_struct_dirent_d_ino
Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
Headers}).  Then, if @code{struct dirent} contains a @code{d_ino}
member, define @code{HAVE_STRUCT_DIRENT_D_INO}.

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

@defmac AC_STRUCT_DIRENT_D_TYPE
@acindex{STRUCT_DIRENT_D_TYPE}
@cvindex HAVE_STRUCT_DIRENT_D_TYPE
@c @caindex header_dirent_dirent_h
@c @caindex member_struct_dirent_d_type
Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
Headers}).  Then, if @code{struct dirent} contains a @code{d_type}
member, define @code{HAVE_STRUCT_DIRENT_D_TYPE}.
@end defmac

@anchor{AC_STRUCT_ST_BLOCKS}
@defmac AC_STRUCT_ST_BLOCKS
@acindex{STRUCT_ST_BLOCKS}
@cvindex HAVE_STRUCT_STAT_ST_BLOCKS
@cvindex HAVE_ST_BLOCKS
@ovindex LIBOBJS
@caindex member_struct_stat_st_blocks
If @code{struct stat} contains an @code{st_blocks} member, define
@code{HAVE_STRUCT_STAT_ST_BLOCKS}.  Otherwise, require an
@code{AC_LIBOBJ} replacement of @samp{fileblocks}.  The former name,
@code{HAVE_ST_BLOCKS} is to be avoided, as its support will cease in the
future.

This macro caches its result in the @code{ac_cv_member_struct_stat_st_blocks}
variable.
@end defmac

@defmac AC_STRUCT_TM
@acindex{STRUCT_TM}
@cvindex TM_IN_SYS_TIME
@hdrindex{time.h}
@hdrindex{sys/time.h}
If @file{time.h} does not define @code{struct tm}, define
@code{TM_IN_SYS_TIME}, which means that including @file{sys/time.h}
had better define @code{struct tm}.

This macro is obsolescent, as @file{time.h} defines @code{struct tm} in
current systems.  New programs need not use this macro.
@end defmac

@anchor{AC_STRUCT_TIMEZONE}
@defmac AC_STRUCT_TIMEZONE
@acindex{STRUCT_TIMEZONE}
@cvindex HAVE_DECL_TZNAME
@cvindex HAVE_STRUCT_TM_TM_ZONE
@cvindex HAVE_TM_ZONE
@cvindex HAVE_TZNAME
@c @caindex member_struct_tm_tm_zone
@c @caindex struct_tm
Figure out how to get the current timezone.  If @code{struct tm} has a
@code{tm_zone} member, define @code{HAVE_STRUCT_TM_TM_ZONE} (and the
obsoleted @code{HAVE_TM_ZONE}).  Otherwise, if the external array
@code{tzname} is found, define @code{HAVE_TZNAME}; if it is declared,
define @code{HAVE_DECL_TZNAME}.
@end defmac

@node Generic Structures
@subsection Generic Structure Checks

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

@defmac AC_CHECK_MEMBER (@var{aggregate}.@var{member}, @
  @ovar{action-if-found}, @ovar{action-if-not-found}, @
  @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_MEMBER}
@caindex member_@var{aggregate}_@var{member}
Check whether @var{member} is a member of the aggregate @var{aggregate}.
If no @var{includes} are specified, the default includes are used
(@pxref{Default Includes}).

@example
AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
                [AC_MSG_ERROR([we need 'passwd.pw_gecos'])],
                [[#include <pwd.h>]])
@end example

You can use this macro for submembers:

@example
AC_CHECK_MEMBER(struct top.middle.bot)
@end example

This macro caches its result in the
@code{ac_cv_member_@var{aggregate}_@var{member}} variable, with
characters not suitable for a variable name mapped to underscores.
@end defmac

@anchor{AC_CHECK_MEMBERS}
@defmac AC_CHECK_MEMBERS (@var{members}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_MEMBERS}
@cvindex HAVE_@var{aggregate}_@var{member}
Check for the existence of each @samp{@var{aggregate}.@var{member}} of
@var{members} using the previous macro.  When @var{member} belongs to
@var{aggregate}, define @code{HAVE_@var{aggregate}_@var{member}} (in all
capitals, with spaces and dots replaced by underscores).  If
@var{action-if-found} is given, it is executed for each of the found
members.  If @var{action-if-not-found} is given, it is executed for each
of the members that could not be found.

@var{includes} is a series of include directives, defaulting to
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
prior to the members under test.

This macro uses M4 lists:
@example
AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
@end example
@end defmac


@node Types
@section Types
@cindex Types
@cindex C 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.

@menu
* Particular Types::            Special handling to find certain types
* Generic Types::               How to find other types
@end menu

@node Particular Types
@subsection Particular Type Checks

@hdrindex{sys/types.h}
@hdrindex{stdlib.h}
@hdrindex{stdint.h}
@hdrindex{inttypes.h}
These macros check for particular C types in @file{sys/types.h},
@file{stdlib.h}, @file{stdint.h}, @file{inttypes.h} and others, if they
exist.

The Gnulib @code{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.  @xref{Gnulib}.

@anchor{AC_TYPE_GETGROUPS}
@defmac AC_TYPE_GETGROUPS
@acindex{TYPE_GETGROUPS}
@cvindex GETGROUPS_T
@caindex type_getgroups
Define @code{GETGROUPS_T} to be whichever of @code{gid_t} or @code{int}
is the base type of the array argument to @code{getgroups}.

This macro caches the base type in the @code{ac_cv_type_getgroups}
variable.
@end defmac

@defmac AC_TYPE_INT8_T
@acindex{TYPE_INT8_T}
@cvindex HAVE_INT8_T
@cvindex int8_t
@caindex c_int8_t
If @file{stdint.h} or @file{inttypes.h} does not define the type
@code{int8_t}, define @code{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 as follows:

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

This macro caches the type in the @code{ac_cv_c_int8_t} variable.
@end defmac

@defmac AC_TYPE_INT16_T
@acindex{TYPE_INT16_T}
@cvindex HAVE_INT16_T
@cvindex int16_t
@caindex c_int16_t
This is like @code{AC_TYPE_INT8_T}, except for 16-bit integers.
@end defmac

@defmac AC_TYPE_INT32_T
@acindex{TYPE_INT32_T}
@cvindex HAVE_INT32_T
@cvindex int32_t
@caindex c_int32_t
This is like @code{AC_TYPE_INT8_T}, except for 32-bit integers.
@end defmac

@defmac AC_TYPE_INT64_T
@acindex{TYPE_INT64_T}
@cvindex HAVE_INT64_T
@cvindex int64_t
@caindex c_int64_t
This is like @code{AC_TYPE_INT8_T}, except for 64-bit integers.
@end defmac

@defmac AC_TYPE_INTMAX_T
@acindex{TYPE_INTMAX_T}
@cvindex HAVE_INTMAX_T
@cvindex intmax_t
@c @caindex type_intmax_t
If @file{stdint.h} or @file{inttypes.h} defines the type @code{intmax_t},
define @code{HAVE_INTMAX_T}.  Otherwise, define @code{intmax_t} to the
widest signed integer type.
@end defmac

@defmac AC_TYPE_INTPTR_T
@acindex{TYPE_INTPTR_T}
@cvindex HAVE_INTPTR_T
@cvindex intptr_t
@c @caindex type_intptr_t
If @file{stdint.h} or @file{inttypes.h} defines the type @code{intptr_t},
define @code{HAVE_INTPTR_T}.  Otherwise, define @code{intptr_t} to a
signed integer type wide enough to hold a pointer, if such a type
exists.
@end defmac

@defmac AC_TYPE_LONG_DOUBLE
@acindex{TYPE_LONG_DOUBLE}
@cvindex HAVE_LONG_DOUBLE
@caindex type_long_double
If the C compiler supports a working @code{long double} type, define
@code{HAVE_LONG_DOUBLE}.  The @code{long double} type might have the
same range and precision as @code{double}.

This macro caches its result in the @code{ac_cv_type_long_double}
variable.

This macro is obsolescent, as current C compilers support @code{long
double}.  New programs need not use this macro.
@end defmac

@defmac AC_TYPE_LONG_DOUBLE_WIDER
@acindex{TYPE_LONG_DOUBLE_WIDER}
@cvindex HAVE_LONG_DOUBLE_WIDER
@caindex type_long_double_wider
If the C compiler supports a working @code{long double} type with more
range or precision than the @code{double} type, define
@code{HAVE_LONG_DOUBLE_WIDER}.

This macro caches its result in the @code{ac_cv_type_long_double_wider}
variable.
@end defmac

@defmac AC_TYPE_LONG_LONG_INT
@acindex{TYPE_LONG_LONG_INT}
@cvindex HAVE_LONG_LONG_INT
@caindex type_long_long_int
If the C compiler supports a working @code{long long int} type, define
@code{HAVE_LONG_LONG_INT}.  However, this test does not test
@code{long long int} values in preprocessor @code{#if} expressions,
because too many compilers mishandle such expressions.
@xref{Preprocessor Arithmetic}.

This macro caches its result in the @code{ac_cv_type_long_long_int}
variable.
@end defmac

@defmac AC_TYPE_MBSTATE_T
@acindex{TYPE_MBSTATE_T}
@cvindex mbstate_t
@hdrindex{wchar.h}
@caindex type_mbstate_t
Define @code{HAVE_MBSTATE_T} if @code{<wchar.h>} declares the
@code{mbstate_t} type.  Also, define @code{mbstate_t} to be a type if
@code{<wchar.h>} does not declare it.

This macro caches its result in the @code{ac_cv_type_mbstate_t}
variable.
@end defmac

@anchor{AC_TYPE_MODE_T}
@defmac AC_TYPE_MODE_T
@acindex{TYPE_MODE_T}
@cvindex mode_t
@caindex type_mode_t
Define @code{mode_t} to a suitable type, if standard headers do not
define it.

This macro caches its result in the @code{ac_cv_type_mode_t} variable.
@end defmac

@anchor{AC_TYPE_OFF_T}
@defmac AC_TYPE_OFF_T
@acindex{TYPE_OFF_T}
@cvindex off_t
@caindex type_off_t
Define @code{off_t} to a suitable type, if standard headers do not
define it.

This macro caches its result in the @code{ac_cv_type_off_t} variable.
@end defmac

@anchor{AC_TYPE_PID_T}
@defmac AC_TYPE_PID_T
@acindex{TYPE_PID_T}
@cvindex pid_t
@caindex type_pid_t
Define @code{pid_t} to a suitable type, if standard headers do not
define it.

This macro caches its result in the @code{ac_cv_type_pid_t} variable.
@end defmac

@anchor{AC_TYPE_SIZE_T}
@defmac AC_TYPE_SIZE_T
@acindex{TYPE_SIZE_T}
@cvindex size_t
@caindex type_size_t
Define @code{size_t} to a suitable type, if standard headers do not
define it.

This macro caches its result in the @code{ac_cv_type_size_t} variable.
@end defmac

@defmac AC_TYPE_SSIZE_T
@acindex{TYPE_SSIZE_T}
@cvindex ssize_t
@caindex type_ssize_t
Define @code{ssize_t} to a suitable type, if standard headers do not
define it.

This macro caches its result in the @code{ac_cv_type_ssize_t} variable.
@end defmac

@anchor{AC_TYPE_UID_T}
@defmac AC_TYPE_UID_T
@acindex{TYPE_UID_T}
@cvindex uid_t
@cvindex gid_t
@caindex type_uid_t
Define @code{uid_t} and @code{gid_t} to suitable types, if standard
headers do not define them.

This macro caches its result in the @code{ac_cv_type_uid_t} variable.
@end defmac

@defmac AC_TYPE_UINT8_T
@acindex{TYPE_UINT8_T}
@cvindex HAVE_UINT8_T
@cvindex uint8_t
@caindex c_uint8_t
If @file{stdint.h} or @file{inttypes.h} does not define the type
@code{uint8_t}, define @code{uint8_t} to an
unsigned integer type that is exactly 8 bits wide, if such a type
exists.
This is like @code{AC_TYPE_INT8_T}, except for unsigned integers.
@end defmac

@defmac AC_TYPE_UINT16_T
@acindex{TYPE_UINT16_T}
@cvindex HAVE_UINT16_T
@cvindex uint16_t
@caindex c_uint16_t
This is like @code{AC_TYPE_UINT8_T}, except for 16-bit integers.
@end defmac

@defmac AC_TYPE_UINT32_T
@acindex{TYPE_UINT32_T}
@cvindex HAVE_UINT32_T
@cvindex uint32_t
@caindex c_uint32_t
This is like @code{AC_TYPE_UINT8_T}, except for 32-bit integers.
@end defmac

@defmac AC_TYPE_UINT64_T
@acindex{TYPE_UINT64_T}
@cvindex HAVE_UINT64_T
@cvindex uint64_t
@caindex c_uint64_t
This is like @code{AC_TYPE_UINT8_T}, except for 64-bit integers.
@end defmac

@defmac AC_TYPE_UINTMAX_T
@acindex{TYPE_UINTMAX_T}
@cvindex HAVE_UINTMAX_T
@cvindex uintmax_t
@c @caindex type_uintmax_t
If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintmax_t},
define @code{HAVE_UINTMAX_T}.  Otherwise, define @code{uintmax_t} to the
widest unsigned integer type.
@end defmac

@defmac AC_TYPE_UINTPTR_T
@acindex{TYPE_UINTPTR_T}
@cvindex HAVE_UINTPTR_T
@cvindex uintptr_t
@c @caindex type_uintptr_t
If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintptr_t},
define @code{HAVE_UINTPTR_T}.  Otherwise, define @code{uintptr_t} to an
unsigned integer type wide enough to hold a pointer, if such a type
exists.
@end defmac

@defmac AC_TYPE_UNSIGNED_LONG_LONG_INT
@acindex{TYPE_UNSIGNED_LONG_LONG_INT}
@cvindex HAVE_UNSIGNED_LONG_LONG_INT
@caindex type_unsigned_long_long_int
If the C compiler supports a working @code{unsigned long long int} type,
define @code{HAVE_UNSIGNED_LONG_LONG_INT}.  However, this test does not test
@code{unsigned long long int} values in preprocessor @code{#if} expressions,
because too many compilers mishandle such expressions.
@xref{Preprocessor Arithmetic}.

This macro caches its result in the @code{ac_cv_type_unsigned_long_long_int}
variable.
@end defmac

@node Generic Types
@subsection Generic Type Checks

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

@defmac AC_CHECK_TYPE (@var{type}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_TYPE}
@caindex type_@var{type}
Check whether @var{type} is defined.  It may be a compiler builtin type
or defined by the @var{includes}.  @var{includes} is a series of include
directives, defaulting to @code{AC_INCLUDES_DEFAULT} (@pxref{Default
Includes}), which are used prior to the type under test.

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

This macro caches its result in the @code{ac_cv_type_@var{type}}
variable, with @samp{*} mapped to @samp{p} and other characters not
suitable for a variable name mapped to underscores.
@end defmac


@defmac AC_CHECK_TYPES (@var{types}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_TYPES}
@cvindex HAVE_@var{type}
For each @var{type} of the @var{types} that is defined, define
@code{HAVE_@var{type}} (in all capitals).  Each @var{type} must follow
the rules of @code{AC_CHECK_TYPE}.  If no @var{includes} are
specified, the default includes are used (@pxref{Default Includes}).  If
@var{action-if-found} is given, it is additional shell code to execute
when one of the types is found.  If @var{action-if-not-found} is given,
it is executed when one of the types is not found.

This macro uses M4 lists:
@example
AC_CHECK_TYPES([ptrdiff_t])
AC_CHECK_TYPES([unsigned long long int, uintmax_t])
AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])
@end example

@end defmac

Autoconf, up to 2.13, used to provide to another version of
@code{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
@code{AC_CHECK_TYPE}, see @ref{Obsolete Macros}.


@node Compilers and Preprocessors
@section Compilers and Preprocessors
@cindex Compilers
@cindex Preprocessors

@ovindex EXEEXT
All the tests for compilers (@code{AC_PROG_CC}, @code{AC_PROG_CXX},
@code{AC_PROG_F77}) define the output variable @code{EXEEXT} based on
the output of the compiler, typically to the empty string if
POSIX and @samp{.exe} if a DOS variant.

@ovindex OBJEXT
They also define the output variable @code{OBJEXT} based on the
output of the compiler, after @file{.c} files have been excluded, typically
to @samp{o} if POSIX, @samp{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.  @xref{Manual Configuration}, for more on support for cross
compiling.

@menu
* Specific Compiler Characteristics::  Some portability issues
* Generic Compiler Characteristics::  Language independent tests and features
* C Compiler::                  Checking its characteristics
* C++ Compiler::                Likewise
* Objective C Compiler::        Likewise
* Objective C++ Compiler::      Likewise
* Erlang Compiler and Interpreter::  Likewise
* Fortran Compiler::            Likewise
* Go Compiler::                 Likewise
@end menu

@node Specific Compiler Characteristics
@subsection Specific Compiler Characteristics

Some compilers exhibit different behaviors.

@table @asis
@item 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 @samp{int} objects are 4
bytes wide:

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

@noindent
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 @code{sizeof (int)},
not from the @code{? 1 : -1}, and
Autoconf works around this problem by casting @code{sizeof (int)} to
@code{long int} before comparing it.
@end table

@node Generic Compiler Characteristics
@subsection Generic Compiler Characteristics

@anchor{AC_CHECK_SIZEOF}
@defmac AC_CHECK_SIZEOF (@var{type-or-expr}, @ovar{unused}, @
  @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_SIZEOF}
@cvindex SIZEOF_@var{type-or-expr}
@caindex sizeof_@var{type-or-expr}
Define @code{SIZEOF_@var{type-or-expr}} (@pxref{Standard Symbols}) to be
the size in bytes of @var{type-or-expr}, which may be either a type or
an expression returning a value that has a size.  If the expression
@samp{sizeof (@var{type-or-expr})} is invalid, the result is 0.
@var{includes} is a series of include directives, defaulting to
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
prior to the expression under test.

This macro now works even when cross-compiling.  The @var{unused}
argument was used when cross-compiling.

For example, the call

@example
@c If you change this example, adjust tests/semantics.at:AC_CHECK_SIZEOF struct.
AC_CHECK_SIZEOF([int *])
@end example

@noindent
defines @code{SIZEOF_INT_P} to be 8 on x86-64 systems.

This macro caches its result in the @code{ac_cv_sizeof_@var{type-or-expr}}
variable, with @samp{*} mapped to @samp{p} and other characters not
suitable for a variable name mapped to underscores.
@end defmac

@defmac AC_CHECK_ALIGNOF (@var{type}, @dvar{includes, AC_INCLUDES_DEFAULT})
@acindex{CHECK_ALIGNOF}
@cvindex ALIGNOF_@var{type}
@caindex alignof_@var{type-or-expr}
Define @code{ALIGNOF_@var{type}} (@pxref{Standard Symbols}) to be the
alignment in bytes of @var{type}.  @samp{@var{type} y;} must be valid as
a structure member declaration.  If @samp{type} is unknown, the result
is 0.  If no @var{includes} are specified, the default includes are used
(@pxref{Default Includes}).

This macro caches its result in the @code{ac_cv_alignof_@var{type-or-expr}}
variable, with @samp{*} mapped to @samp{p} and other characters not
suitable for a variable name mapped to underscores.
@end defmac

@defmac AC_COMPUTE_INT (@var{var}, @var{expression}, @
  @dvar{includes, AC_INCLUDES_DEFAULT}, @ovar{action-if-fails})
@acindex{COMPUTE_INT}
Store into the shell variable @var{var} the value of the integer
@var{expression}.  The
value should fit in an initializer in a C variable of type @code{signed
long}.  To support cross compilation, it should be possible to evaluate
the expression at compile-time.  If no @var{includes} are specified, the
default includes are used (@pxref{Default Includes}).

Execute @var{action-if-fails} if the value cannot be determined correctly.
@end defmac

@defmac AC_LANG_WERROR
@acindex{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
@option{-Werror}
option.  If the whole program is built using @option{-Werror} it is
often simpler to put @option{-Werror} in the compiler flags (@code{CFLAGS},
etc.).
@end defmac

@defmac AC_OPENMP
@acindex{OPENMP}
@cvindex _OPENMP
@ovindex OPENMP_CFLAGS
@ovindex OPENMP_CXXFLAGS
@ovindex OPENMP_FFLAGS
@ovindex OPENMP_FCFLAGS
@caindex prog_c_openmp
@caindex prog_cxx_openmp
@caindex prog_f77_openmp
@caindex prog_fc_openmp
@uref{https://@/www.openmp.org/, OpenMP} specifies extensions of C, C++,
and Fortran that simplify optimization of shared memory parallelism,
which is a common problem on multi-core CPUs.

If the current language is C, the macro @code{AC_OPENMP} sets the
variable @code{OPENMP_CFLAGS} to the C compiler flags needed for
supporting OpenMP@.  @code{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
@samp{configure} with the @samp{--disable-openmp} option.

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

Linking a program with @code{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++, @code{AC_OPENMP} sets the variable
@code{OPENMP_CXXFLAGS}, suitably for the C++ compiler.  The same remarks
hold as for C.

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

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

This macro caches its result in the @code{ac_cv_prog_c_openmp},
@code{ac_cv_prog_cxx_openmp}, @code{ac_cv_prog_f77_openmp}, or
@code{ac_cv_prog_fc_openmp} variable, depending on the current language.

@strong{Caution:} Some of the compiler options that @code{AC_OPENMP}
tests, mean ``enable OpenMP'' to one compiler, but ``write output to a
file named @file{mp} or @file{penmp}'' to other compilers.  We cannot
guarantee that the implementation of @code{AC_OPENMP} will not overwrite
an existing file with either of these names.

Therefore, as a defensive measure, a @command{configure} script that
uses @code{AC_OPENMP} will issue an error and stop (before doing any of
the operations that might overwrite these files) upon encountering
either of these files in its working directory.
@command{autoconf} will also issue an error if it finds either of
these files in the same directory as a @file{configure.ac} that
uses @code{AC_OPENMP}.

If you have files with either of these names at the top level of your
source tree, and you need to use @code{AC_OPENMP}, we recommend you
either change their names or move them into a subdirectory.
@end defmac

@node C Compiler
@subsection 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.

@table @asis
@item 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:

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

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

@item 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:

@example
$ @kbd{cc a.c b.c}
a.c:
b.c:
@end example

@noindent
This can cause problems if you observe the output of the compiler to
detect failures.  Invoking @samp{cc -c a.c && cc -c b.c && cc -o c a.o
b.o} solves the issue.

@item Don't rely on correct @code{#line} support
On Solaris, @command{c89} (at least through Oracle Developer Studio 12.6)
diagnoses @code{#line} directives whose line
numbers are greater than 32767.  Nothing in POSIX
makes this invalid.  That is why Autoconf stopped issuing
@code{#line} directives.
@end table

@anchor{AC_PROG_CC}
@defmac AC_PROG_CC (@ovar{compiler-search-list})
@acindex{PROG_CC}
@evindex CC
@evindex CFLAGS
@ovindex CC
@ovindex CFLAGS
Determine a C compiler to use.

If the environment variable @code{CC} is set, its value will be taken as
the name of the C compiler to use.  Otherwise, search for a C compiler
under a series of likely names, trying @code{gcc} and @code{cc} first.
Regardless, the output variable @code{CC} is set to the chosen compiler.

If the optional first argument to the macro is used, it must be a
whitespace-separated list of potential names for a C compiler,
which overrides the built-in list.

If no C compiler can be found, @command{configure} will error out.

If the selected C compiler is found to be GNU C (regardless of
its name), the shell variable @code{GCC} will be set to @samp{yes}.
If the shell variable @code{CFLAGS} was not already set, it is set
to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems
where GCC does not accept @option{-g}), or @option{-g} for other
compilers.  @code{CFLAGS} is then made an output variable.
You can override the default for @code{CFLAGS} by inserting a shell
default assignment between @code{AC_INIT} and @code{AC_PROG_CC}:

@example
: $@{CFLAGS="@var{options}"@}
@end example

where @var{options} are the appropriate set of options to use by
default.  (It is important to use this construct rather than a normal
assignment, so that @code{CFLAGS} can still be overridden by the
person building the package.  @xref{Preset Output Variables}.)

If necessary, options are added to @code{CC} to enable support for
ISO Standard C features with extensions, preferring the newest edition
of the C standard for which detection is supported.  Currently the
newest edition Autoconf knows how to detect support for is C23.  After calling
this macro you can check whether the C compiler has been set to accept
standard C by inspecting the shell variable @code{ac_prog_cc_stdc}.
Its value is @samp{c23}, @samp{c11}, @samp{c99}, or @samp{c89}, respectively,
if the C compiler has been set to use the 2023, 2011, 1999, or 1990 edition of
the C standard, and @samp{no} if the compiler does not support compiling
standard C at all.
(There is no special value for the 2017 edition of the C standard,
as it is a minor revision that does not introduce new language features.)

The tests for standard conformance are not comprehensive.  They test the
value of @code{__STDC_VERSION__}, and a
representative sample of the language features added in each version of
the C standard.  They do not examine @code{__STDC__}
because some compilers by default leave it undefined.
They do not test for variable-length arrays,
a C99 feature that was made optional in C11;
if you need to use this feature when available, use @code{AC_C_VARARRAYS}.
They do not test the C standard library, because the C
compiler might be generating code for a ``freestanding environment''
(in which most of the standard library is optional).  If you need to know
whether a particular C standard header exists, use @code{AC_CHECK_HEADER}.

None of the options that may be added to @code{CC} by this macro
enable @emph{strict} conformance to the C standard.  In particular,
system-specific extensions are not disabled.  (For example, for GNU C,
the @option{-std=gnu@var{nn}} options may be used, but not the
@option{-std=c@var{nn}} options.)

Many Autoconf macros use a compiler, and thus call
@samp{AC_REQUIRE([AC_PROG_CC])} to ensure that the compiler has been
determined before the body of the outermost @code{AC_DEFUN} macro.
Although @code{AC_PROG_CC} is safe to directly expand multiple times, it
performs certain checks (such as the proper value of @env{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
(@pxref{Expanded Before Required}).
@end defmac

@anchor{AC_PROG_CC_C_O}
@defmac AC_PROG_CC_C_O
@acindex{PROG_CC_C_O}
@cvindex NO_MINUS_C_MINUS_O
@caindex prog_cc_@var{compiler}_c_o
If the C compiler does not accept the @option{-c} and @option{-o} options
simultaneously, define @code{NO_MINUS_C_MINUS_O}.  This macro actually
tests both the compiler found by @code{AC_PROG_CC}, and, if different,
the first @code{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 @var{compiler}, this macro caches its result in the
@code{ac_cv_prog_cc_@var{compiler}_c_o} variable.
@end defmac


@defmac AC_PROG_CPP
@acindex{PROG_CPP}
@evindex CPP
@ovindex CPP
Set output variable @code{CPP} to a command that runs the
C preprocessor.  If @samp{$CC -E} doesn't work, tries @code{cpp} and
@file{/lib/cpp}, in that order.

It is only portable to run @code{CPP} on files with a @file{.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 @code{AC_PROG_CPP_WERROR} is also specified.
@end defmac

@defmac AC_PROG_CPP_WERROR
@acindex{PROG_CPP_WERROR}
@ovindex CPP
This acts like @code{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.
@end defmac


The following macros check for C compiler or machine architecture
features.  To check for characteristics not listed here, use
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
@code{AC_RUN_IFELSE} (@pxref{Runtime}).

@defmac AC_C_BACKSLASH_A
@acindex{C_BACKSLASH_A}
@cvindex HAVE_C_BACKSLASH_A
Define @samp{HAVE_C_BACKSLASH_A} to 1 if the C compiler understands
@samp{\a}.

This macro is obsolescent, as current C compilers understand @samp{\a}.
New programs need not use this macro.
@end defmac

@anchor{AC_C_BIGENDIAN}
@defmac AC_C_BIGENDIAN (@ovar{action-if-true}, @ovar{action-if-false}, @
  @ovar{action-if-unknown}, @ovar{action-if-universal})
@acindex{C_BIGENDIAN}
@cvindex WORDS_BIGENDIAN
@cindex Endianness
If words are stored with the most significant byte first (like Motorola
and SPARC CPUs), execute @var{action-if-true}.  If words are stored with
the least significant byte first (like Intel and VAX CPUs), execute
@var{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.  @var{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
architectures with differing endianness.  If
@command{configure} detects this, it executes @var{action-if-universal}
instead of @var{action-if-unknown}.

The default for @var{action-if-true} is to define
@samp{WORDS_BIGENDIAN}.  The default for @var{action-if-false} is to do
nothing.  The default for @var{action-if-unknown} is to
abort configure and tell the installer how to bypass this test.
And finally, the default for @var{action-if-universal} is to ensure that
@samp{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
@command{autoheader} is used (@pxref{autoheader Invocation}).

If you use this macro without specifying @var{action-if-universal}, you
should also use @code{AC_CONFIG_HEADERS}; otherwise
@samp{WORDS_BIGENDIAN} may be set incorrectly for Mac OS X universal
binary files.
@end defmac

@anchor{AC_C_CONST}
@defmac AC_C_CONST
@acindex{C_CONST}
@cvindex const
@caindex c_const
If the C compiler does not fully support the @code{const} keyword,
define @code{const} to be empty.  Some C compilers that do
not define @code{__STDC__} do support @code{const}; some compilers that
define @code{__STDC__} do not completely support @code{const}.  Programs
can simply use @code{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 @code{const},
because C and C++ treat @code{const} differently.  For example:

@example
const int foo;
@end example

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

If @command{autoconf} detects this situation, it leaves @code{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 @code{ac_cv_c_const} variable.

This macro is obsolescent, as current C compilers support @code{const}.
New programs need not use this macro.
@end defmac

@defmac AC_C__GENERIC
@acindex{C__GENERIC}
@cvindex _Generic
If the C compiler supports C11-style generic selection using the
@code{_Generic} keyword, define @code{HAVE_C__GENERIC}.
@end defmac

@defmac AC_C_RESTRICT
@acindex{C_RESTRICT}
@cvindex restrict
@caindex c_restrict
If the C compiler recognizes a variant spelling for the @code{restrict}
keyword (@code{__restrict}, @code{__restrict__}, or @code{_Restrict}),
then define @code{restrict} to that; this is more likely to do the right
thing with compilers that support language variants where plain
@code{restrict} is not a keyword.  Otherwise, if the C compiler
recognizes the @code{restrict} keyword, don't do anything.
Otherwise, define @code{restrict} to be empty.
Thus, programs may simply use @code{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 @code{restrict} keyword is not
required, several C++ compilers do accept the keyword.
This macro works for them, too.

This macro caches @samp{no} in the @code{ac_cv_c_restrict} variable
if @code{restrict} is not supported, and a supported spelling otherwise.
@end defmac

@defmac AC_C_VOLATILE
@acindex{C_VOLATILE}
@cvindex volatile
If the C compiler does not understand the keyword @code{volatile},
define @code{volatile} to be empty.  Programs can simply use
@code{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
@code{volatile}, simply defining it to be empty does, in a sense, break
your code.  However, given that the compiler does not support
@code{volatile}, you are at its mercy anyway.  At least your
program compiles, when it wouldn't before.
@xref{Volatile Objects}, for more about @code{volatile}.

This macro is obsolescent, as current C compilers support @code{volatile}.
New programs need not use this macro.
@end defmac

@anchor{AC_C_INLINE}
@defmac AC_C_INLINE
@acindex{C_INLINE}
@cvindex inline
If the C compiler supports the keyword @code{inline}, do nothing.
Otherwise define @code{inline} to @code{__inline__} or @code{__inline}
if it accepts one of those, otherwise define @code{inline} to be empty.
@end defmac

@anchor{AC_C_CHAR_UNSIGNED}
@defmac AC_C_CHAR_UNSIGNED
@acindex{C_CHAR_UNSIGNED}
@cvindex __CHAR_UNSIGNED__
If the C type @code{char} is unsigned, define @code{__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.

@example
#include <limits.h>
#if CHAR_MIN == 0
# define CHAR_UNSIGNED 1
#endif
@end example
@end defmac

@defmac AC_C_STRINGIZE
@acindex{C_STRINGIZE}
@cvindex HAVE_STRINGIZE
If the C preprocessor supports the stringizing operator, define
@code{HAVE_STRINGIZE}.  The stringizing operator is @samp{#} and is
found in macros such as this:

@example
#define x(y) #y
@end example

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

@defmac AC_C_FLEXIBLE_ARRAY_MEMBER
@acindex{C_FLEXIBLE_ARRAY_MEMBER}
@cvindex FLEXIBLE_ARRAY_MEMBER
If the C compiler supports flexible array members, define
@code{FLEXIBLE_ARRAY_MEMBER} to nothing; otherwise define it to 1.
That way, a declaration like this:

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

@noindent
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:

@example
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);
@end example
@end defmac

@defmac AC_C_VARARRAYS
@acindex{C_VARARRAYS}
@cvindex __STDC_NO_VLA__
@cvindex HAVE_C_VARARRAYS
If the C compiler does not support variable-length arrays, define the
macro @code{__STDC_NO_VLA__} to be 1 if it is not already defined.  A
variable-length array is an array of automatic storage duration whose
length is determined at run time, when the array is declared.  For
backward compatibility this macro also defines @code{HAVE_C_VARARRAYS}
if the C compiler supports variable-length arrays, but this usage is
obsolescent and new programs should use @code{__STDC_NO_VLA__}.
@end defmac

@defmac AC_C_TYPEOF
@acindex{C_TYPEOF}
@cvindex HAVE_TYPEOF
@cvindex typeof
If the C compiler supports GNU C's @code{typeof} syntax either
directly or
through a different spelling of the keyword (e.g., @code{__typeof__}),
define @code{HAVE_TYPEOF}.  If the support is available only through a
different spelling, define @code{typeof} to that spelling.
@end defmac

@defmac AC_C_PROTOTYPES
@acindex{C_PROTOTYPES}
@cvindex PROTOTYPES
@cvindex __PROTOTYPES
@cvindex PARAMS
If function prototypes are understood by the compiler (as determined by
@code{AC_PROG_CC}), define @code{PROTOTYPES} and @code{__PROTOTYPES}.
Defining @code{__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.
@end defmac

@node C++ Compiler
@subsection C++ Compiler Characteristics


@defmac AC_PROG_CXX (@ovar{compiler-search-list})
@acindex{PROG_CXX}
@evindex CXX
@evindex CXXFLAGS
@ovindex CXX
@ovindex CXXFLAGS
Determine a C++ compiler to use.

If either the environment variable @code{CXX} or the environment
variable @code{CCC} is set, its value will be taken as the name of a
C++ compiler.  If both are set, @code{CXX} is preferred.  If neither
are set, search for a C++ compiler under a series of likely names,
trying @code{g++} and @code{c++} first.  Regardless, the output
variable @code{CXX} is set to the chosen compiler.

If the optional first argument to the macro is used, it must be a
whitespace-separated list of potential names for a C++ compiler,
which overrides the built-in list.

If no C++ compiler can be found, as a last resort @code{CXX} is set to
@code{g++} (and subsequent tests will probably fail).

If the selected C++ compiler is found to be GNU C++ (regardless of
its name), the shell variable @code{GXX} will be set to @samp{yes}.
If the shell variable @code{CXXFLAGS} was not already set, it is set
to @option{-g -O2} for the GNU C++ compiler (@option{-O2} on systems
where G++ does not accept @option{-g}), or @option{-g} for other
compilers.  @code{CXXFLAGS} is then made an output variable.
You can override the default for @code{CXXFLAGS} by inserting a shell
default assignment between @code{AC_INIT} and @code{AC_PROG_CXX}:

@example
: $@{CXXFLAGS="@var{options}"@}
@end example

where @var{options} are the appropriate set of options to use by
default.  (It is important to use this construct rather than a normal
assignment, so that @code{CXXFLAGS} can still be overridden by the
person building the package.  @xref{Preset Output Variables}.)
@end defmac

@defmac AC_PROG_CXXCPP
@acindex{PROG_CXXCPP}
@evindex CXXCPP
@ovindex CXXCPP
Set output variable @code{CXXCPP} to a command that runs the C++
preprocessor.  If @samp{$CXX -E} doesn't work, tries @code{cpp} and
@file{/lib/cpp}, in that order.  Because of this fallback, @code{CXXCPP}
may or may not set C++-specific predefined macros (such as @code{__cplusplus}).

It is portable to run @code{CXXCPP} only on files with a @file{.c},
@file{.C}, @file{.cc}, or @file{.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++.
@end defmac

@defmac AC_PROG_CXX_C_O
@acindex{PROG_CXX_C_O}
@cvindex CXX_NO_MINUS_C_MINUS_O
Test whether the C++ compiler accepts the options @option{-c} and
@option{-o} simultaneously, and define @code{CXX_NO_MINUS_C_MINUS_O},
if it does not.
@end defmac


@node Objective C Compiler
@subsection Objective C Compiler Characteristics


@defmac AC_PROG_OBJC (@ovar{compiler-search-list})
@acindex{PROG_OBJC}
@evindex OBJC
@evindex OBJCFLAGS
@ovindex OBJC
@ovindex OBJCFLAGS
Determine an Objective C compiler to use.  If @code{OBJC} is not already
set in the environment, check for Objective C compilers.  Set output
variable @code{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 @code{AC_PROG_OBJC}
like this:

@example
AC_PROG_OBJC([gcc objcc objc])
@end example

If using a compiler that supports GNU Objective C, set shell variable
@code{GOBJC} to @samp{yes}.  If output variable @code{OBJCFLAGS} was not
already set, set it to @option{-g -O2} for a GNU Objective C
compiler (@option{-O2} on systems where the compiler does not accept
@option{-g}), or @option{-g} for other compilers.
@end defmac

@defmac AC_PROG_OBJCPP
@acindex{PROG_OBJCPP}
@evindex OBJCPP
@ovindex OBJCPP
Set output variable @code{OBJCPP} to a command that runs the Objective C
preprocessor.  If @samp{$OBJC -E} doesn't work, tries @code{cpp} and
@file{/lib/cpp}, in that order.  Because of this fallback, @code{CXXCPP}
may or may not set Objective-C-specific predefined macros (such as
@code{__OBJC__}).
@end defmac


@node Objective C++ Compiler
@subsection Objective C++ Compiler Characteristics


@defmac AC_PROG_OBJCXX (@ovar{compiler-search-list})
@acindex{PROG_OBJCXX}
@evindex OBJCXX
@evindex OBJCXXFLAGS
@ovindex OBJCXX
@ovindex OBJCXXFLAGS
Determine an Objective C++ compiler to use.  If @code{OBJCXX} is not already
set in the environment, check for Objective C++ compilers.  Set output
variable @code{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 @code{AC_PROG_OBJCXX}
like this:

@example
AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])
@end example

If using a compiler that supports GNU Objective C++, set shell variable
@code{GOBJCXX} to @samp{yes}.  If output variable @code{OBJCXXFLAGS} was not
already set, set it to @option{-g -O2} for a GNU Objective C++
compiler (@option{-O2} on systems where the compiler does not accept
@option{-g}), or @option{-g} for other compilers.
@end defmac

@defmac AC_PROG_OBJCXXCPP
@acindex{PROG_OBJCXXCPP}
@evindex OBJCXXCPP
@ovindex OBJCXXCPP
Set output variable @code{OBJCXXCPP} to a command that runs the Objective C++
preprocessor.  If @samp{$OBJCXX -E} doesn't work, tries @code{cpp} and
@file{/lib/cpp}, in that order.  Because of this fallback, @code{CXXCPP}
may or may not set Objective-C++-specific predefined macros (such as
@code{__cplusplus} and @code{__OBJC__}).
@end defmac


@node Erlang Compiler and Interpreter
@subsection Erlang Compiler and Interpreter Characteristics
@cindex Erlang

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

@defmac AC_ERLANG_PATH_ERLC (@ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{ERLANG_PATH_ERLC}
@evindex ERLC
@evindex ERLCFLAGS
@ovindex ERLC
@ovindex ERLCFLAGS
Determine an Erlang compiler to use.  If @code{ERLC} is not already set in the
environment, check for @command{erlc}.  Set output variable @code{ERLC} to the
complete path of the compiler command found.  In addition, if @code{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 @code{AC_PATH_PROG} for looking for the @command{erlc} program.  For
example, to look for @command{erlc} only in the @file{/usr/lib/erlang/bin}
directory:

@example
AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
@end example
@end defmac

@defmac AC_ERLANG_NEED_ERLC (@dvar{path, $PATH})
@acindex{ERLANG_NEED_ERLC}
A simplified variant of the @code{AC_ERLANG_PATH_ERLC} macro, that prints an
error message and exits the @command{configure} script if the @command{erlc}
program is not found.
@end defmac

@defmac AC_ERLANG_PATH_ERL (@ovar{value-if-not-found}, @dvar{path, $PATH})
@acindex{ERLANG_PATH_ERL}
@evindex ERL
@ovindex ERL
Determine an Erlang interpreter to use.  If @code{ERL} is not already
set in the
environment, check for @command{erl}.  Set output variable @code{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 @code{AC_PATH_PROG} for looking for the @command{erl} program.  For
example, to look for @command{erl} only in the @file{/usr/lib/erlang/bin}
directory:

@example
AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
@end example
@end defmac

@defmac AC_ERLANG_NEED_ERL (@dvar{path, $PATH})
@acindex{ERLANG_NEED_ERL}
A simplified variant of the @code{AC_ERLANG_PATH_ERL} macro, that prints an
error message and exits the @command{configure} script if the @command{erl}
program is not found.
@end defmac


@node Fortran Compiler
@subsection Fortran Compiler Characteristics
@cindex Fortran
@cindex F77

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

Except for the macros @code{AC_FC_SRCEXT}, @code{AC_FC_FREEFORM},
@code{AC_FC_FIXEDFORM}, and @code{AC_FC_LINE_LENGTH} (see below), the
@code{FC} and @code{F77} macros behave almost identically, and so they
are documented together in this section.


@defmac AC_PROG_F77 (@ovar{compiler-search-list})
@acindex{PROG_F77}
@evindex F77
@evindex FFLAGS
@ovindex F77
@ovindex FFLAGS
@caindex f77_compiler_gnu
@caindex prog_f77_g
Determine a Fortran 77 compiler to use.  If @code{F77} is not already
set in the environment, then check for @code{g77} and @code{f77}, and
then some other names.  Set the output variable @code{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
@code{AC_PROG_F77} like this:

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

If using a compiler that supports GNU Fortran 77,
set the shell variable @code{G77} to @samp{yes}.
If the output variable @code{FFLAGS} was not already set in the
environment, set it to @option{-g -02} for @code{g77} (or @option{-O2}
where the GNU Fortran 77 compiler does not accept @option{-g}), or
@option{-g} for other compilers.

The result of the GNU test is cached in the
@code{ac_cv_f77_compiler_gnu} variable, acceptance of @option{-g} in the
@code{ac_cv_prog_f77_g} variable.
@end defmac

@defmac AC_PROG_FC (@ovar{compiler-search-list}, @ovar{dialect})
@acindex{PROG_FC}
@evindex FC
@evindex FCFLAGS
@ovindex FC
@ovindex FCFLAGS
@caindex fc_compiler_gnu
@caindex prog_fc_g
Determine a Fortran compiler to use.  If @code{FC} is not already set in
the environment, then @code{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 @code{FC} to the name of the compiler
found.

By default, newer dialects are preferred over older dialects, but if
@code{dialect} is specified then older dialects are preferred starting
with the specified dialect.  @code{dialect} can currently be one of
Fortran 77, Fortran 90, or Fortran 95.  However, this is only a hint of
which compiler @emph{name} to prefer (e.g., @code{f90} or @code{f95}),
and no attempt is made to guarantee that a particular language standard
is actually supported.  Thus, it is preferable that you avoid the
@code{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 @code{AC_PROG_F77}.

If using a compiler that supports GNU Fortran,
set the shell variable @code{GFC} to @samp{yes}.
If the output variable @code{FCFLAGS} was not already set in the
environment, then set it to @option{-g -02} for a GNU Fortran compiler (or
@option{-O2} where the compiler does not accept @option{-g}), or
@option{-g} for other compilers.

The result of the GNU test is cached in the @code{ac_cv_fc_compiler_gnu}
variable, acceptance of @option{-g} in the @code{ac_cv_prog_fc_g}
variable.
@end defmac

@defmac AC_PROG_F77_C_O
@defmacx AC_PROG_FC_C_O
@acindex{PROG_F77_C_O}
@acindex{PROG_FC_C_O}
@cvindex F77_NO_MINUS_C_MINUS_O
@cvindex FC_NO_MINUS_C_MINUS_O
@caindex prog_f77_c_o
@caindex prog_fc_c_o
Test whether the Fortran compiler accepts the options @option{-c} and
@option{-o} simultaneously, and define @code{F77_NO_MINUS_C_MINUS_O} or
@code{FC_NO_MINUS_C_MINUS_O}, respectively, if it does not.

The result of the test is cached in the @code{ac_cv_prog_f77_c_o} or
@code{ac_cv_prog_fc_c_o} variable, respectively.
@end defmac

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


@defmac AC_F77_LIBRARY_LDFLAGS
@defmacx AC_FC_LIBRARY_LDFLAGS
@acindex{F77_LIBRARY_LDFLAGS}
@ovindex FLIBS
@acindex{FC_LIBRARY_LDFLAGS}
@ovindex FCLIBS
@caindex prog_f77_v
@caindex prog_fc_v
@caindex f77_libs
@caindex fc_libs
Determine the linker flags (e.g., @option{-L} and @option{-l}) for the
@dfn{Fortran intrinsic and runtime libraries} that are required to
successfully link a Fortran program or shared library.  The output
variable @code{FLIBS} or @code{FCLIBS} is set to these flags (which
should be included after @code{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 (@pxref{Mixing Fortran 77 With C and C++, , ,
automake, 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 @code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
@code{AC_F77_MAIN} and @code{AC_FC_MAIN} are probably also necessary to
link C/C++ with Fortran; see below.  Further, it is highly recommended
that you use @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers})
because the complex defines that the function wrapper macros create
may not work with C/C++ compiler drivers.

These macros internally compute the flag needed to verbose linking
output and cache it in @code{ac_cv_prog_f77_v} or @code{ac_cv_prog_fc_v}
variables, respectively.  The computed linker flags are cached in
@code{ac_cv_f77_libs} or @code{ac_cv_fc_libs}, respectively.
@end defmac

@defmac AC_F77_DUMMY_MAIN (@ovar{action-if-found}, @
  @dvar{action-if-not-found, AC_MSG_FAILURE})
@defmacx AC_FC_DUMMY_MAIN (@ovar{action-if-found}, @
  @dvar{action-if-not-found, AC_MSG_FAILURE})
@acindex{F77_DUMMY_MAIN}
@cvindex F77_DUMMY_MAIN
@acindex{FC_DUMMY_MAIN}
@cvindex FC_DUMMY_MAIN
@caindex f77_dummy_main
@caindex fc_dummy_main
With many compilers, the Fortran libraries detected by
@code{AC_F77_LIBRARY_LDFLAGS} or @code{AC_FC_LIBRARY_LDFLAGS} provide
their own @code{main} entry function that initializes things like
Fortran I/O, and which then calls a user-provided entry function named
(say) @code{MAIN__} to run the user's program.  The
@code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
@code{AC_F77_MAIN} and @code{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 @code{main} and skip the Fortran
library initializations.  In this case, however, one may still need to
provide a dummy @code{MAIN__} routine in order to prevent linking errors
on some systems.  @code{AC_F77_DUMMY_MAIN} or @code{AC_FC_DUMMY_MAIN}
detects whether any such routine is @emph{required} for linking, and
what its name is; the shell variable @code{F77_DUMMY_MAIN} or
@code{FC_DUMMY_MAIN} holds this name, @code{unknown} when no solution
was found, and @code{none} when no such dummy main is needed.

By default, @var{action-if-found} defines @code{F77_DUMMY_MAIN} or
@code{FC_DUMMY_MAIN} to the name of this routine (e.g., @code{MAIN__})
@emph{if} it is required.  @var{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:

@example
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
#ifdef F77_DUMMY_MAIN
#  ifdef __cplusplus
     extern "C"
#  endif
   int F77_DUMMY_MAIN (void) @{ return 1; @}
#endif
@end example

(Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)

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

The result of this macro is cached in the @code{ac_cv_f77_dummy_main} or
@code{ac_cv_fc_dummy_main} variable, respectively.
@end defmac

@defmac AC_F77_MAIN
@defmacx AC_FC_MAIN
@acindex{F77_MAIN}
@cvindex F77_MAIN
@acindex{FC_MAIN}
@cvindex FC_MAIN
@caindex f77_main
@caindex fc_main
As discussed above, many Fortran libraries allow you to provide an entry
point called (say) @code{MAIN__} instead of the usual @code{main}, which
is then called by a @code{main} function in the Fortran libraries that
initializes things like Fortran I/O@.  The
@code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros detect whether it is
@emph{possible} to utilize such an alternate main function, and defines
@code{F77_MAIN} and @code{FC_MAIN} to the name of the function.  (If no
alternate main function name is found, @code{F77_MAIN} and @code{FC_MAIN} are
simply defined to @code{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:

@example
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
#ifdef __cplusplus
  extern "C"
#endif
int F77_MAIN (int argc, char *argv[]);
@end example

(Again, replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)

The result of this macro is cached in the @code{ac_cv_f77_main} or
@code{ac_cv_fc_main} variable, respectively.
@end defmac

@defmac AC_F77_WRAPPERS
@defmacx AC_FC_WRAPPERS
@acindex{F77_WRAPPERS}
@cvindex F77_FUNC
@cvindex F77_FUNC_
@acindex{FC_WRAPPERS}
@cvindex FC_FUNC
@cvindex FC_FUNC_
@caindex f77_mangling
@caindex fc_mangling
Defines C macros @code{F77_FUNC (name, NAME)}, @code{FC_FUNC (name, NAME)},
@code{F77_FUNC_(name, NAME)}, and @code{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
@code{AC_F77_WRAPPERS} or @code{AC_FC_WRAPPERS}.  For example, suppose
you have the following Fortran 77 subroutine:

@example
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
      subroutine foobar (x, y)
      double precision x, y
      y = 3.14159 * x
      return
      end
@end example

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

@example
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
#define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
#ifdef __cplusplus
extern "C"  /* prevent C++ name mangling */
#endif
void FOOBAR_F77 (double *x, double *y);
@end example

Note that we pass both the lowercase and uppercase versions of the
function name to @code{F77_FUNC} so that it can select the right one.
Note also that all parameters to Fortran 77 routines are passed as
pointers (@pxref{Mixing Fortran 77 With C and C++, , , automake, GNU
Automake}).

(Replace @code{F77} with @code{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 @code{F77_FUNC} or @code{FC_FUNC} is defined.

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

@example
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
@{
    double x = 2.7183, y;
    FOOBAR_F77 (&x, &y);
@}
@end example

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

The name mangling scheme is encoded in the @code{ac_cv_f77_mangling} or
@code{ac_cv_fc_mangling} cache variable, respectively, and also used for
the @code{AC_F77_FUNC} and @code{AC_FC_FUNC} macros described below.
@end defmac

@defmac AC_F77_FUNC (@var{name}, @ovar{shellvar})
@defmacx AC_FC_FUNC (@var{name}, @ovar{shellvar})
@acindex{F77_FUNC}
@acindex{FC_FUNC}
Given an identifier @var{name}, set the shell variable @var{shellvar} to
hold the mangled version @var{name} according to the rules of the
Fortran linker (see also @code{AC_F77_WRAPPERS} or
@code{AC_FC_WRAPPERS}).  @var{shellvar} is optional; if it is not
supplied, the shell variable is simply @var{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++.
@end defmac

@defmac AC_FC_SRCEXT (@var{ext}, @ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@defmacx AC_FC_PP_SRCEXT (@var{ext}, @ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_SRCEXT}
@acindex{FC_PP_SRCEXT}
@caindex fc_srcext_@var{ext}
@caindex fc_pp_srcext_@var{ext}
By default, the @code{FC} macros perform their tests using a @file{.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 @file{.f90} files, or preprocessing only with
@file{.F} files or maybe other upper-case extensions.  On the other
hand, some other compilers expect all source files to end in @file{.f}
and require special flags to support other file name extensions.  The
@code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros deal with these
issues.

The @code{AC_FC_SRCEXT} macro tries to get the @code{FC} compiler to
accept files ending with the extension @file{.@var{ext}} (i.e.,
@var{ext} does @emph{not} contain the dot).  If any special compiler
flags are needed for this, it stores them in the output variable
@code{FCFLAGS_@var{ext}}.  This extension and these flags are then used
for all subsequent @code{FC} tests (until @code{AC_FC_SRCEXT} or
@code{AC_FC_PP_SRCEXT} is called another time).

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

Similarly, the @code{AC_FC_PP_SRCEXT} macro tries to get the @code{FC}
compiler to preprocess and compile files with the extension
@file{.@var{ext}}.  When both @command{fpp} and @command{cpp} style
preprocessing are provided, the former is preferred, as the latter may
treat continuation lines, @code{//} tokens, and white space differently
from what some Fortran dialects expect.  Conversely, if you do not want
files to be preprocessed, use only lower-case characters in the file
name extension.  Like with @code{AC_FC_SRCEXT(f90)}, any needed flags
are stored in the @code{FCFLAGS_@var{ext}} variable.

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

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

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

The @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros cache their
results in @code{ac_cv_fc_srcext_@var{ext}} and
@code{ac_cv_fc_pp_srcext_@var{ext}} variables, respectively.
@end defmac

@defmac AC_FC_PP_DEFINE (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_PP_DEFINE}
@caindex fc_pp_define

Find a flag to specify defines for preprocessed Fortran.  Not all
Fortran compilers use @option{-D}.  Substitute @code{FC_DEFINE} with
the result and call @var{action-if-success} (defaults to nothing) if
successful, and @var{action-if-failure} (defaults to failing with an
error message) if not.

This macro calls @code{AC_FC_PP_SRCEXT([F])} in order to learn how to
preprocess a @file{conftest.F} file, but restores a previously used
Fortran source file extension afterwards again.

The result of this test is cached in the @code{ac_cv_fc_pp_define}
variable.
@end defmac

@defmac AC_FC_FREEFORM (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_FREEFORM}
@caindex fc_freeform

Try to ensure that the Fortran compiler (@code{$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 @code{FCFLAGS}.

This macro is most important if you are using the default @file{.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 @code{AC_FC_SRCEXT}, such as
@file{.f90}, then @code{AC_FC_FREEFORM} ordinarily succeeds without
modifying @code{FCFLAGS}.  For extensions which the compiler does not
know about, the flag set by the @code{AC_FC_SRCEXT} macro might let
the compiler assume Fortran 77 by default, however.

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

The result of this test, or @samp{none} or @samp{unknown}, is cached in
the @code{ac_cv_fc_freeform} variable.
@end defmac

@defmac AC_FC_FIXEDFORM (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_FIXEDFORM}
@caindex fc_fixedform

Try to ensure that the Fortran compiler (@code{$FC}) allows the old
fixed-format source code (as opposed to free-format style).  If
necessary, it may add some additional flags to @code{FCFLAGS}.

This macro is needed for some compilers alias names like @command{xlf95}
which assume free-form source code by default, and in case you want to
use fixed-form source with an extension like @file{.f90} which many
compilers interpret as free-form by default.  If you specify a different
extension with @code{AC_FC_SRCEXT}, such as @file{.f}, then
@code{AC_FC_FIXEDFORM} ordinarily succeeds without modifying
@code{FCFLAGS}.

If @code{AC_FC_FIXEDFORM} succeeds in compiling fixed-form source, it
calls @var{action-if-success} (defaults to nothing).  If it fails, it
calls @var{action-if-failure} (defaults to exiting with an error
message).

The result of this test, or @samp{none} or @samp{unknown}, is cached in
the @code{ac_cv_fc_fixedform} variable.
@end defmac

@defmac AC_FC_LINE_LENGTH (@ovar{length}, @ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_LINE_LENGTH}
@caindex fc_line_length

Try to ensure that the Fortran compiler (@code{$FC}) accepts long source
code lines.  The @var{length} argument may be given as 80, 132, or
unlimited, and defaults to 132.  Note that line lengths above 250
columns are not portable, and some compilers do not accept more than 132
columns at least for fixed format source.  If necessary, it may add some
additional flags to @code{FCFLAGS}.

If @code{AC_FC_LINE_LENGTH} succeeds in compiling fixed-form source, it
calls @var{action-if-success} (defaults to nothing).  If it fails, it
calls @var{action-if-failure} (defaults to exiting with an error
message).

The result of this test, or @samp{none} or @samp{unknown}, is cached in
the @code{ac_cv_fc_line_length} variable.
@end defmac

@defmac AC_FC_CHECK_BOUNDS (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_CHECK_BOUNDS}
@caindex fc_check_bounds

The @code{AC_FC_CHECK_BOUNDS} macro tries to enable array bounds checking
in the Fortran compiler.  If successful, the @var{action-if-success}
is called and any needed flags are added to @code{FCFLAGS}.  Otherwise,
@var{action-if-failure} is called, which defaults to failing with an error
message.  The macro currently requires Fortran 90 or a newer dialect.

The result of the macro is cached in the @code{ac_cv_fc_check_bounds}
variable.
@end defmac

@defmac AC_F77_IMPLICIT_NONE (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@defmacx AC_FC_IMPLICIT_NONE (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{F77_IMPLICIT_NONE}
@acindex{FC_IMPLICIT_NONE}
@caindex f77_implicit_none
@caindex fc_implicit_none

Try to disallow implicit declarations in the Fortran compiler.  If
successful, @var{action-if-success} is called and any needed flags
are added to @code{FFLAGS} or @code{FCFLAGS}, respectively.  Otherwise,
@var{action-if-failure} is called, which defaults to failing with an error
message.

The result of these macros are cached in the
@code{ac_cv_f77_implicit_none} and @code{ac_cv_fc_implicit_none}
variables, respectively.
@end defmac

@defmac AC_FC_MODULE_EXTENSION
@acindex{FC_MODULE_EXTENSION}
@caindex fc_module_ext
@ovindex FC_MODEXT

Find the Fortran 90 module file name extension.  Most Fortran 90
compilers store module information in files separate from the object
files.  The module files are usually named after the name of the module
rather than the source file name, with characters possibly turned to
upper case, plus an extension, often @file{.mod}.

Not all compilers use module files at all, or by default.  The Cray
Fortran compiler requires @option{-e m} in order to store and search
module information in @file{.mod} files rather than in object files.
Likewise, the Fujitsu Fortran compilers uses the @option{-Am} option to
indicate how module information is stored.

The @code{AC_FC_MODULE_EXTENSION} macro computes the module extension
without the leading dot, and stores that in the @code{FC_MODEXT}
variable.  If the compiler does not produce module files, or the
extension cannot be determined, @code{FC_MODEXT} is empty.  Typically,
the result of this macro may be used in cleanup @command{make} rules as
follows:

@example
clean-modules:
        -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)
@end example

The extension, or @samp{unknown}, is cached in the
@code{ac_cv_fc_module_ext} variable.
@end defmac

@defmac AC_FC_MODULE_FLAG (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_MODULE_FLAG}
@caindex fc_module_flag
@ovindex FC_MODINC
@ovindex ac_empty

Find the compiler flag to include Fortran 90 module information from
another directory, and store that in the @code{FC_MODINC} variable.
Call @var{action-if-success} (defaults to nothing) if successful, and
set @code{FC_MODINC} to empty and call @var{action-if-failure} (defaults
to exiting with an error message) if not.

Most Fortran 90 compilers provide a way to specify module directories.
Some have separate flags for the directory to write module files to,
and directories to search them in, whereas others only allow writing to
the current directory or to the first directory specified in the include
path.  Further, with some compilers, the module search path and the
preprocessor search path can only be modified with the same flag.  Thus,
for portability, write module files to the current directory only and
list that as first directory in the search path.

There may be no whitespace between @code{FC_MODINC} and the following
directory name, but @code{FC_MODINC} may contain trailing white space.
For example, if you use Automake and would like to search @file{../lib}
for module files, you can use the following:

@example
AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib
@end example

Inside @command{configure} tests, you can use:

@example
if test -n "$FC_MODINC"; then
  FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
fi
@end example

The flag is cached in the @code{ac_cv_fc_module_flag} variable.
The substituted value of @code{FC_MODINC} may refer to the
@code{ac_empty} dummy placeholder empty variable, to avoid losing
the significant trailing whitespace in a @file{Makefile}.
@end defmac

@defmac AC_FC_MODULE_OUTPUT_FLAG (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{FC_MODULE_OUTPUT_FLAG}
@caindex fc_module_output_flag
@ovindex FC_MODOUT

Find the compiler flag to write Fortran 90 module information to
another directory, and store that in the @code{FC_MODOUT} variable.
Call @var{action-if-success} (defaults to nothing) if successful, and
set @code{FC_MODOUT} to empty and call @var{action-if-failure} (defaults
to exiting with an error message) if not.

Not all Fortran 90 compilers write module files, and of those that do,
not all allow writing to a directory other than the current one, nor
do all have separate flags for writing and reading; see the description
of @code{AC_FC_MODULE_FLAG} above.  If you need to be able to write to
another directory, for maximum portability use @code{FC_MODOUT} before
any @code{FC_MODINC} and include both the current directory and the one
you write to in the search path:

@example
AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). @dots{}
@end example

The flag is cached in the @code{ac_cv_fc_module_output_flag} variable.
The substituted value of @code{FC_MODOUT} may refer to the
@code{ac_empty} dummy placeholder empty variable, to avoid losing
the significant trailing whitespace in a @file{Makefile}.
@end defmac

@defmac AC_F77_CRAY_POINTERS (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@defmacx AC_FC_CRAY_POINTERS (@ovar{action-if-success}, @
  @dvar{action-if-failure, AC_MSG_FAILURE})
@acindex{F77_CRAY_POINTERS}
@acindex{FC_CRAY_POINTERS}
@caindex fc_cray_pointer

Try to ensure that the Fortran compiler (@code{$F77} or @code{$FC})
accepts Cray pointers.  If successful, the @var{action-if-success} is
called and any needed flags are added to @code{FFLAGS} or
@code{FCFLAGS}.  Otherwise, @var{action-if-failure} is called, which
defaults to failing with an error message.

Cray pointers are a non-standard extension supported by many Fortran
compilers which allow an integer to be declared as C-like pointer to
a target variable.

The result of this test, or @samp{none} or @samp{unknown}, is cached in
the @code{ac_cv_f77_cray_ptr} or @code{ac_cv_fc_cray_ptr} variable.
@end defmac


@node Go Compiler
@subsection Go Compiler Characteristics
@cindex Go

Autoconf provides basic support for the Go programming language when
using the @code{gccgo} compiler (there is currently no support for the
@code{6g} and @code{8g} compilers).

@defmac AC_PROG_GO (@ovar{compiler-search-list})
Find the Go compiler to use.  Check whether the environment variable
@code{GOC} is set; if so, then set output variable @code{GOC} to its
value.

Otherwise, if the macro is invoked without an argument, then search for
a Go compiler named @code{gccgo}.  If it is not found, then as a last
resort set @code{GOC} to @code{gccgo}.

This macro may be invoked with an optional first argument which, if
specified, must be a blank-separated list of Go compilers to search for.

If output variable @code{GOFLAGS} was not already set, set it to
@option{-g -O2}.  If your package does not like this default,
@code{GOFLAGS} may be set before @code{AC_PROG_GO}.
@end defmac


@node System Services
@section System Services

The following macros check for operating system services or capabilities.

@anchor{AC_PATH_X}
@defmac AC_PATH_X
@acindex{PATH_X}
@evindex XMKMF
@cindex X Window System
Try to locate the X Window System include files and libraries.  If the
user gave the command line options @option{--x-includes=@var{dir}} and
@option{--x-libraries=@var{dir}}, use those directories.

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

If this method fails to find the X Window System, @command{configure}
looks for the files in several directories where they often reside.
If either method is successful, set the shell variables
@code{x_includes} and @code{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
@option{--without-x}, set the shell variable @code{no_x} to @samp{yes};
otherwise set it to the empty string.
@end defmac

@anchor{AC_PATH_XTRA}
@defmac AC_PATH_XTRA
@acindex{PATH_XTRA}
@ovindex X_CFLAGS
@ovindex X_LIBS
@ovindex X_EXTRA_LIBS
@ovindex X_PRE_LIBS
@cvindex X_DISPLAY_MISSING
An enhanced version of @code{AC_PATH_X}.  It adds the C compiler flags
that X needs to output variable @code{X_CFLAGS}, and the X linker flags
to @code{X_LIBS}.  Define @code{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 @code{X_EXTRA_LIBS}.  And it checks for special X11R6
libraries that need to be linked with before @option{-lX11}, and adds
any found to the output variable @code{X_PRE_LIBS}.

@c This is an incomplete kludge.  Make a real way to do it.
@c If you need to check for other X functions or libraries yourself, then
@c after calling this macro, add the contents of @code{X_EXTRA_LIBS} to
@c @code{LIBS} temporarily, like this: (FIXME - add example)
@end defmac

@anchor{AC_SYS_INTERPRETER}
@defmac AC_SYS_INTERPRETER
@acindex{SYS_INTERPRETER}
Check whether the system supports starting scripts with a line of the
form @samp{#!/bin/sh} to select the interpreter to use for the script.
After running this macro, shell code in @file{configure.ac} can check
the shell variable @code{interpval}; it is set to @samp{yes}
if the system supports @samp{#!}, @samp{no} if not.
@end defmac

@anchor{AC_SYS_LARGEFILE}
@defmac AC_SYS_LARGEFILE
@acindex{SYS_LARGEFILE}
@cvindex _FILE_OFFSET_BITS
@cvindex _TIME_BITS
@ovindex CC
@cindex Large file support
@cindex LFS
If the default @code{off_t} type is a 32-bit integer,
and therefore cannot be used with files 2 GiB or larger,
make a wider @code{off_t} available if the system supports it.
Similarly, widen other types related to sizes of files and file systems
if possible.  These types may include @code{blkcnt_t}, @code{dev_t},
@code{ino_t}, @code{fsblkcnt_t}, @code{fsfilcnt_t}, and @code{rlim_t}.

Also, arrange for a @command{configure} option @code{--enable-year2038}
to request widening the type @code{time_t} as needed to represent file
wand other timestamps after mid-January 2038.  This widening is possible
only on 32-bit GNU/Linux x86 and ARM systems with glibc 2.34 or later.
If year-2038 support is requested but @command{configure} fails to find a way
to widen @code{time_t} and inspection of the system suggests that
this feature is available somehow, @command{configure} will error out.
If you want the default to be @code{--enable-year2038}, you can use
@code{AC_SYS_YEAR2038} or @code{AC_SYS_YEAR2038_RECOMMENDED}
instead of @code{AC_SYS_LARGEFILE}.
In other words, older packages that have long used @code{AC_SYS_LARGEFILE}
can have year-2038 support on 32-bit GNU/Linux x86 and ARM systems either by
regenerating @file{configure} with current Autoconf and configuring with
@option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} or
@code{AC_SYS_YEAR2038_RECOMMENDED} and configuring without
@option{--disable-year2038}.
A future version of Autoconf might change the @code{AC_SYS_LARGEFILE}
default to @code{--enable-year2038}; if and when that happens,
@code{AC_SYS_LARGEFILE} and @code{AC_SYS_YEAR2038} will become equivalent.
@xref{AC_SYS_YEAR2038}.

Set the shell variable @code{ac_have_largefile} to @samp{yes} or
@code{no} depending on whether a wide @code{off_t} is available,
regardless of whether arrangements were necessary.
Similarly, set the shell variable @code{ac_have_year2038} to @code{yes}
or @code{no} depending on whether a wide-enough @code{time_t} is available.

Define preprocessor macros if necessary to make types wider;
for example, on GNU/Linux systems the macros @code{_FILE_OFFSET_BITS}
and @code{_TIME_BITS} can be defined.  Some of these macros work only if
defined before the first system header is included;
therefore, when using this macro in concert with
@code{AC_CONFIG_HEADERS}, make sure that @file{config.h} is included
before any system headers.

Large-file support can be disabled by configuring with the
@option{--disable-largefile} option, and year-2038 support can
be enabled and disabled via the @option{--enable-year2038} and
@option{--disable-year2038} options.  These options have no effect on
systems where types are wide enough by default.
Large-file support is required for year-2038 support: if you configure
with @option{--disable-largefile} on a platform with 32-bit
@code{time_t}, then year-2038 support is not available.

Disabling large-file or year-2038 support can have surprising effects,
such as causing functions like @code{readdir} and @code{stat} to fail
even on a small file because its inode number or timestamp is out of range.

Regardless of whether you use this macro, portable programs should not
assume that any of the types listed above fit into a @code{long int}.
For example, it is not portable to print an arbitrary @code{off_t} or
@code{time_t} value @code{X} with @code{printf ("%ld", (long int) X)}.

The standard C library functions @code{fseek} and @code{ftell}
do not use @code{off_t}.  If you need to use either of these functions,
you should use @code{AC_FUNC_FSEEKO} as well as @code{AC_SYS_LARGEFILE},
and then use their POSIX replacements @code{fseeko} and @code{ftello}.
@xref{AC_FUNC_FSEEKO}.

When using @code{AC_SYS_LARGEFILE} in different packages that are linked
together and that have interfaces that depend on the width of @code{off_t},
@code{time_t} or related types, the simplest thing is to configure all
components the same way.  For example, if an application uses
@code{AC_SYS_LARGEFILE} and is configured with
@option{--enable-year2038}, libraries it links to with an @code{off_t}-
or @code{time_t}-dependent interface should be configured equivalently.
Alternatively, you can modify libraries to support both 32- and 64-bit
interfaces though this is more work and few libraries other than the C
library itself are modified in this way.

Applications and libraries should be configured compatibly.
If @code{off_t}, @code{time_t} or related types appear in a library's
public interface, enabling or disabling the library's large-file or
year-2038 support may break binary compatibility with applications or
with other libraries.  Similarly, if an application links to a such a
library, enabling or disabling the application's large-file support may
break binary compatibility with that library.
@end defmac

@anchor{AC_SYS_LONG_FILE_NAMES}
@defmac AC_SYS_LONG_FILE_NAMES
@acindex{SYS_LONG_FILE_NAMES}
@cvindex HAVE_LONG_FILE_NAMES
If the system supports file names longer than 14 characters, define
@code{HAVE_LONG_FILE_NAMES}.
@end defmac

@defmac AC_SYS_POSIX_TERMIOS
@acindex{SYS_POSIX_TERMIOS}
@cindex POSIX termios headers
@cindex termios POSIX headers
@caindex sys_posix_termios
Check to see if the POSIX termios headers and functions are available on the
system.  If so, set the shell variable @code{ac_cv_sys_posix_termios} to
@samp{yes}.  If not, set the variable to @samp{no}.
@end defmac

@anchor{AC_SYS_YEAR2038}
@defmac AC_SYS_YEAR2038
@acindex{SYS_YEAR2038}
@cindex Year 2038
This is like @code{AC_SYS_LARGEFILE} except it defaults to enabling
instead of disabling year-2038 support.  Year-2038 support for
applications and libraries should be configured compatibly.
@xref{AC_SYS_LARGEFILE}.
@end defmac

@defmac AC_SYS_YEAR2038_RECOMMENDED
@acindex{SYS_YEAR2038_RECOMMENDED}
This macro has the same effect as @code{AC_SYS_YEAR2038},
but also declares that the program being configured
should support timestamps after mid-January 2038.
If a large @code{time_t} is unavailable, @command{configure} will error
out unless the @option{--disable-year2038} option is specified.

Year-2038 support for applications and libraries should be configured
compatibly.  @xref{AC_SYS_YEAR2038}.
@end defmac

@node C and POSIX Variants
@section C and POSIX Variants

The following macro makes it possible to use C language and library
extensions defined by the C standards committee, features of POSIX that
are extensions to C, and platform extensions not defined by POSIX.

@anchor{AC_USE_SYSTEM_EXTENSIONS}
@defmac AC_USE_SYSTEM_EXTENSIONS
@acindex{USE_SYSTEM_EXTENSIONS}
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.  Also, when using this macro in concert with
@code{AC_CONFIG_HEADERS}, be sure that @file{config.h} is included
before any system header.

Define the following preprocessor macros unconditionally:

@table @code
@item _ALL_SOURCE
@cvindex _ALL_SOURCE
Enable extensions on AIX and z/OS.
@item _COSMO_SOURCE
@cvindex _COSMO_SOURCE
Enable extensions on Cosmopolitan Libc.
@item _DARWIN_C_SOURCE
@cvindex _DARWIN_C_SOURCE
Enable extensions on macOS.
@item _GNU_SOURCE
@cvindex _GNU_SOURCE
Enable extensions on GNU systems.
@item _NETBSD_SOURCE
@cvindex _NETBSD_SOURCE
Enable general extensions on NetBSD.
Enable NetBSD compatibility extensions on Minix.
@item _OPENBSD_SOURCE
@cvindex _OPENBSD_SOURCE
Enable OpenBSD compatibility extensions on NetBSD.
Oddly enough, this does nothing on OpenBSD.
@item _POSIX_PTHREAD_SEMANTICS
@cvindex _POSIX_PTHREAD_SEMANTICS
Enable POSIX-compatible threading on Solaris.
@item __STDC_WANT_IEC_60559_ATTRIBS_EXT__
@cvindex __STDC_WANT_IEC_60559_ATTRIBS_EXT__
Enable extensions specified by ISO/IEC TS 18661-5:2014.
@item __STDC_WANT_IEC_60559_BFP_EXT__
@cvindex __STDC_WANT_IEC_60559_BFP_EXT__
Enable extensions specified by ISO/IEC TS 18661-1:2014.
@item __STDC_WANT_IEC_60559_DFP_EXT__
@cvindex __STDC_WANT_IEC_60559_DFP_EXT__
Enable extensions specified by ISO/IEC TS 18661-2:2015.
@item __STDC_WANT_IEC_60559_EXT__
@cvindex __STDC_WANT_IEC_60559_EXT__
Enable extensions specified by C23 Annex F.
@item __STDC_WANT_IEC_60559_FUNCS_EXT__
@cvindex __STDC_WANT_IEC_60559_FUNCS_EXT__
Enable extensions specified by ISO/IEC TS 18661-4:2015.
@item __STDC_WANT_IEC_60559_TYPES_EXT__
@cvindex __STDC_WANT_IEC_60559_TYPES_EXT__
Enable extensions specified by C23 Annex H and by ISO/IEC TS 18661-3:2015.
@item __STDC_WANT_LIB_EXT2__
@cvindex __STDC_WANT_LIB_EXT2__
Enable extensions specified by ISO/IEC TR 24731-2:2010.
@item __STDC_WANT_MATH_SPEC_FUNCS__
@cvindex __STDC_WANT_MATH_SPEC_FUNCS__
Enable extensions specified by ISO/IEC 24747:2009.
@item _TANDEM_SOURCE
@cvindex _TANDEM_SOURCE
Enable extensions on HP NonStop systems.
@end table

The following preprocessor macros are defined only when necessary;
they enable access to extensions on some operating systems but
@emph{disable} extensions on other operating systems.

@table @code
@item __EXTENSIONS__
@cvindex __EXTENSIONS__
Enable general extensions on Solaris.  This macro is defined only if
the headers included by @code{AC_INCLUDES_DEFAULT}
(@pxref{Default Includes}) work correctly with it defined.

@item _MINIX
@itemx _POSIX_SOURCE
@itemx _POSIX_1_SOURCE
@cvindex _MINIX
@cvindex _POSIX_SOURCE
@cvindex _POSIX_1_SOURCE
Defined only on MINIX.  @code{_POSIX_SOURCE} and @code{_POSIX_1_SOURCE}
are needed to enable a number of POSIX features on this OS.
@code{_MINIX} does not affect the system headers' behavior;
future versions of Autoconf may stop defining it.
Programs that need to recognize Minix should use @code{AC_CANONICAL_HOST}.

@item _XOPEN_SOURCE
@cvindex _XOPEN_SOURCE
Defined (with value 500) only if needed to make @file{wchar.h} declare
@code{mbstate_t}.  This is known to be necessary on some versions of HP-UX.
@end table

@cvindex __STDC_WANT_DEC_FP__
The C preprocessor macro @code{__STDC_WANT_DEC_FP__} is not defined.
ISO/IEC TR 24732:2009 was superseded by ISO/IEC TS 18661-2:2015.

@cvindex __STDC_WANT_LIB_EXT1__
The C preprocessor macro @code{__STDC_WANT_LIB_EXT1__} is not defined,
as the C standard's Annex K is problematic.  See: O'Donell C, Sebor M.
@uref{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm, Field
Experience With Annex K---Bounds Checking Interfaces}.

The Autoconf macro @code{AC_USE_SYSTEM_EXTENSIONS} was introduced in
Autoconf 2.60.
@end defmac


@node Erlang Libraries
@section Erlang Libraries
@cindex Erlang, Library, checking

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
(@pxref{Erlang Compiler and Interpreter}).

@defmac AC_ERLANG_SUBST_ERTS_VER
@acindex{ERLANG_SUBST_ERTS_VER}
@ovindex ERLANG_ERTS_VER
Set the output variable @code{ERLANG_ERTS_VER} to the version of the
Erlang runtime system (as returned by Erlang's
@code{erlang:system_info(version)} function).  The result of this test
is cached if caching is enabled when running @command{configure}.  The
@code{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 (@code{.rel}
files), as shown below.
@end defmac

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

@defmac AC_ERLANG_SUBST_LIB_DIR
@acindex{ERLANG_SUBST_LIB_DIR}
@ovindex ERLANG_LIB_DIR
Set the output variable @code{ERLANG_LIB_DIR} to the path of the library
directory of Erlang/OTP (as returned by Erlang's
@code{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 @command{configure}.
@end defmac

@defmac AC_ERLANG_CHECK_LIB (@var{library}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{ERLANG_CHECK_LIB}
@ovindex ERLANG_LIB_DIR_@var{library}
@ovindex ERLANG_LIB_VER_@var{library}
Test whether the Erlang/OTP library @var{library} is installed by
calling Erlang's @code{code:lib_dir/1} function.  The result of this
test is cached if caching is enabled when running @command{configure}.
@var{action-if-found} is a list of shell commands to run if the library
is installed; @var{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 @samp{ERLANG_LIB_DIR_@var{library}} is set to the path to the
library installation directory, and the output variable
@samp{ERLANG_LIB_VER_@var{library}} is set to the version number that is
part of the subdirectory name, if it is in the standard form
(@code{@var{library}-@var{version}}).  If the directory name does not
have a version part, @samp{ERLANG_LIB_VER_@var{library}} is set to the
empty string.  If the library is not installed,
@samp{ERLANG_LIB_DIR_@var{library}} and
@samp{ERLANG_LIB_VER_@var{library}} are set to @code{"not found"}.  For
example, to check if library @code{stdlib} is installed:

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

The @samp{ERLANG_LIB_VER_@var{library}} variables (set by
@code{AC_ERLANG_CHECK_LIB}) and the @code{ERLANG_ERTS_VER} variable (set
by @code{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 (@code{.rel} files).  For instance, to
generate a @file{example.rel} file for an application depending on the
@code{stdlib} library, @file{configure.ac} could contain:

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

@noindent
The @file{example.rel.in} file used to generate @file{example.rel}
should contain:

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

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:

@defmac AC_ERLANG_SUBST_INSTALL_LIB_DIR
@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
@ovindex ERLANG_INSTALL_LIB_DIR

Set the @code{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 @command{configure} runs,
its default value is @code{$@{libdir@}/erlang/lib}.
@end defmac

@defmac AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (@var{library}, @var{version})
@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}

Set the @samp{ERLANG_INSTALL_LIB_DIR_@var{library}} output variable to the
directory into which the built Erlang library @var{library} version
@var{version} should be installed.  If this variable is not set in the
environment when @command{configure} runs, its default value is
@samp{$ERLANG_INSTALL_LIB_DIR/@var{library}-@var{version}}, the value of the
@code{ERLANG_INSTALL_LIB_DIR} variable being set by the
@code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} macro.
@end defmac





@c ========================================================= Writing Tests

@node Writing Tests
@chapter Writing Tests

If the existing feature tests don't do something you need, you have to
write new ones.  These macros are the building blocks.  They provide
ways for other macros to check whether various kinds of features are
available and report the results.

This chapter contains some suggestions and some of the reasons why the
existing tests are written the way they are.  You can also learn a lot
about how to write Autoconf tests by looking at the existing ones.  If
something goes wrong in one or more of the Autoconf tests, this
information can help you understand the assumptions behind them, which
might help you figure out how to best solve the problem.

These macros check the output of the compiler system of the current
language (@pxref{Language Choice}).  They do not cache the results of
their tests for future use (@pxref{Caching Results}), because they don't
know enough about the information they are checking for to generate a
cache variable name.  They also do not print any messages, for the same
reason.  The checks for particular kinds of features call these macros
and do cache their results and print messages about what they're
checking for.

When you write a feature test that could be applicable to more than one
software package, the best thing to do is encapsulate it in a new macro.
@xref{Writing Autoconf Macros}, for how to do that.

@menu
* Language Choice::             Selecting which language to use for testing
* Writing Test Programs::       Forging source files for compilers
* Running the Preprocessor::    Detecting preprocessor symbols
* Running the Compiler::        Detecting language or header features
* Running the Linker::          Detecting library features
* Runtime::                     Testing for runtime features
* Multiple Cases::              Tests for several possible values
@end menu

@node Language Choice
@section Language Choice
@cindex Language

Autoconf-generated @command{configure} scripts check for the C compiler and
its features by default.  Packages that use other programming languages
(maybe more than one, e.g., C and C++) need to test features of the
compilers for the respective languages.  The following macros determine
which programming language is used in the subsequent tests in
@file{configure.ac}.

@anchor{AC_LANG}
@defmac AC_LANG (@var{language})
@acindex{LANG}
Do compilation tests using the compiler, preprocessor, and file
extensions for the specified @var{language}.

Supported languages are:

@table @samp
@item C
Do compilation tests using @code{CC} and @code{CPP} and use extension
@file{.c} for test programs.  Use compilation flags: @code{CPPFLAGS} with
@code{CPP}, and both @code{CPPFLAGS} and @code{CFLAGS} with @code{CC}.

@item C++
Do compilation tests using @code{CXX} and @code{CXXCPP} and use
extension @file{.C} for test programs.  Use compilation flags:
@code{CPPFLAGS} with @code{CXXCPP}, and both @code{CPPFLAGS} and
@code{CXXFLAGS} with @code{CXX}.

@item Fortran 77
Do compilation tests using @code{F77} and use extension @file{.f} for
test programs.  Use compilation flags: @code{FFLAGS}.

@item Fortran
Do compilation tests using @code{FC} and use extension @file{.f} (or
whatever has been set by @code{AC_FC_SRCEXT}) for test programs.  Use
compilation flags: @code{FCFLAGS}.

@item Erlang
@ovindex ERLC
@ovindex ERL
@ovindex ERLCFLAGS
Compile and execute tests using @code{ERLC} and @code{ERL} and use extension
@file{.erl} for test Erlang modules.  Use compilation flags: @code{ERLCFLAGS}.

@item Objective C
Do compilation tests using @code{OBJC} and @code{OBJCPP} and use
extension @file{.m} for test programs.  Use compilation flags:
@code{CPPFLAGS} with @code{OBJCPP}, and both @code{CPPFLAGS} and
@code{OBJCFLAGS} with @code{OBJC}.

@item Objective C++
Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use
extension @file{.mm} for test programs.  Use compilation flags:
@code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and
@code{OBJCXXFLAGS} with @code{OBJCXX}.

@item Go
Do compilation tests using @code{GOC} and use extension @file{.go} for
test programs.  Use compilation flags @code{GOFLAGS}.
@end table
@end defmac

@anchor{AC_LANG_PUSH}
@defmac AC_LANG_PUSH (@var{language})
@acindex{LANG_PUSH}
Remember the current language (as set by @code{AC_LANG}) on a stack, and
then select the @var{language}.  Use this macro and @code{AC_LANG_POP}
in macros that need to temporarily switch to a particular language.
@end defmac

@defmac AC_LANG_POP (@ovar{language})
@acindex{LANG_POP}
Select the language that is saved on the top of the stack, as set by
@code{AC_LANG_PUSH}, and remove it from the stack.

If given, @var{language} specifies the language we just @emph{quit}.  It
is a good idea to specify it when it's known (which should be the
case@dots{}), since Autoconf detects inconsistencies.

@example
AC_LANG_PUSH([Fortran 77])
# Perform some tests on Fortran 77.
# @dots{}
AC_LANG_POP([Fortran 77])
@end example
@end defmac

@defmac AC_LANG_ASSERT (@var{language})
@acindex{LANG_ASSERT}
Check statically that the current language is @var{language}.
You should use this in your language specific macros
to avoid that they be called with an inappropriate language.

This macro runs only at @command{autoconf} time, and incurs no cost at
@command{configure} time.  Sadly enough and because Autoconf is a two
layer language @footnote{Because M4 is not aware of Sh code,
especially conditionals, some optimizations that look nice statically
may produce incorrect results at runtime.}, the macros
@code{AC_LANG_PUSH} and @code{AC_LANG_POP} cannot be ``optimizing'',
therefore as much as possible you ought to avoid using them to wrap
your code, rather, require from the user to run the macro with a
correct current language, and check it with @code{AC_LANG_ASSERT}.
And anyway, that may help the user understand she is running a Fortran
macro while expecting a result about her Fortran 77 compiler@enddots{}
@end defmac


@defmac AC_REQUIRE_CPP
@acindex{REQUIRE_CPP}
Ensure that whichever preprocessor would currently be used for tests has
been found.  Calls @code{AC_REQUIRE} (@pxref{Prerequisite Macros}) with an
argument of either @code{AC_PROG_CPP} or @code{AC_PROG_CXXCPP},
depending on which language is current.
@end defmac


@node Writing Test Programs
@section Writing Test Programs

Autoconf tests follow a common scheme: feed some program with some
input, and most of the time, feed a compiler with some source file.
This section is dedicated to these source samples.

@menu
* Guidelines::                  General rules for writing test programs
* Test Functions::              Avoiding pitfalls in test programs
* Generating Sources::          Source program boilerplate
@end menu

@node Guidelines
@subsection Guidelines for Test Programs

The most important rule to follow when writing testing samples is:

@center @emph{Look for realism.}

This motto means that testing samples must be written with the same
strictness as real programs are written.  In particular, you should
avoid ``shortcuts'' and simplifications.

Don't just play with the preprocessor if you want to prepare a
compilation.  For instance, using @command{cpp} to check whether a header is
functional might let your @command{configure} accept a header which
causes some @emph{compiler} error.  Do not hesitate to check a header with
other headers included before, especially required headers.

Make sure the symbols you use are properly defined, i.e., refrain from
simply declaring a function yourself instead of including the proper
header.

Test programs should not write to standard output.  They
should exit with status 0 if the test succeeds, and with status 1
otherwise, so that success
can be distinguished easily from a core dump or other failure;
segmentation violations and other failures produce a nonzero exit
status.  Unless you arrange for @code{exit} to be declared, test
programs should @code{return}, not @code{exit}, from @code{main},
because on many systems @code{exit} is not declared by default.

Test programs can use @code{#if} or @code{#ifdef} to check the values of
preprocessor macros defined by tests that have already run.  For
example, if you call @code{AC_HEADER_STDBOOL}, then later on in
@file{configure.ac} you can have a test program that includes
@file{stdbool.h} conditionally:

@example
@group
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#endif
@end group
@end example

Both @code{#if HAVE_STDBOOL_H} and @code{#ifdef HAVE_STDBOOL_H} will
work with any standard C compiler.  Some developers prefer @code{#if}
because it is easier to read, while others prefer @code{#ifdef} because
it avoids diagnostics with picky compilers like GCC with the
@option{-Wundef} option.

If a test program needs to use or create a data file, give it a name
that starts with @file{conftest}, such as @file{conftest.data}.  The
@command{configure} script cleans up by running @samp{rm -f -r conftest*}
after running test programs and if the script is interrupted.

@node Test Functions
@subsection Test Functions

Functions in test code should use function prototypes, introduced in C89
and required in C23.

Functions that test programs declare should also be conditionalized for
C++, which requires @samp{extern "C"} prototypes.  Make sure to not
include any header files containing clashing prototypes.

@example
#ifdef __cplusplus
extern "C"
#endif
void *valloc (size_t);
@end example

If a test program calls a function with invalid parameters (just to see
whether it exists), organize the program to ensure that it never invokes
that function.  You can do this by calling it in another function that is
never invoked.  You can't do it by putting it after a call to
@code{exit}, because GCC version 2 knows that @code{exit}
never returns
and optimizes out any code that follows it in the same block.

If you include any header files, be sure to call the functions
relevant to them with the correct number of arguments, even if they are
just 0, to avoid compilation errors due to prototypes.  GCC
version 2
has internal prototypes for several functions that it automatically
inlines; for example, @code{memcpy}.  To avoid errors when checking for
them, either pass them the correct number of arguments or redeclare them
with a different return type (such as @code{char}).


@node Generating Sources
@subsection Generating Sources

Autoconf provides a set of macros that can be used to generate test
source files.  They are written to be language generic, i.e., they
actually depend on the current language (@pxref{Language Choice}) to
``format'' the output properly.


@defmac AC_LANG_CONFTEST (@var{source})
@acindex{LANG_CONFTEST}
Save the @var{source} text in the current test source file:
@file{conftest.@var{extension}} where the @var{extension} depends on the
current language.  As of Autoconf 2.63b, the source file also contains
the results of all of the @code{AC_DEFINE} performed so far.

Note that the @var{source} is evaluated exactly once, like regular
Autoconf macro arguments, and therefore (i) you may pass a macro
invocation, (ii) if not, be sure to double quote if needed.

The @var{source} text is expanded as an unquoted here-document, so
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
@xref{Here-Documents}.

This macro issues a warning during @command{autoconf} processing if
@var{source} does not include an expansion of the macro
@code{AC_LANG_DEFINES_PROVIDED} (note that both @code{AC_LANG_SOURCE} and
@code{AC_LANG_PROGRAM} call this macro, and thus avoid the warning).

This macro is seldom called directly, but is used under the hood by more
common macros such as @code{AC_COMPILE_IFELSE} and @code{AC_RUN_IFELSE}.
@end defmac

@defmac AC_LANG_DEFINES_PROVIDED
@acindex{LANG_DEFINES_PROVIDED}
This macro is called as a witness that the file
@file{conftest.@var{extension}} appropriate for the current language is
complete, including all previously determined results from
@code{AC_DEFINE}.  This macro is seldom called directly, but exists if
you have a compelling reason to write a conftest file without using
@code{AC_LANG_SOURCE}, yet still want to avoid a syntax warning from
@code{AC_LANG_CONFTEST}.
@end defmac

@defmac AC_LANG_SOURCE (@var{source})
@acindex{LANG_SOURCE}
Expands into the @var{source}, with the definition of
all the @code{AC_DEFINE} performed so far.  This macro includes an
expansion of @code{AC_LANG_DEFINES_PROVIDED}.

In many cases, you may find it more convenient to use the wrapper
@code{AC_LANG_PROGRAM}.
@end defmac

For instance, executing (observe the double quotation!):

@example
@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
        [https://www.example.org/])
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
  [Greetings string.])
AC_LANG([C])
AC_LANG_CONFTEST(
   [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
gcc -E -dD conftest.c
@end example

@noindent
on a system with @command{gcc} installed, results in:

@example
@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
@dots{}
@asis{#} 1 "conftest.c"

#define PACKAGE_NAME "Hello"
#define PACKAGE_TARNAME "hello"
#define PACKAGE_VERSION "1.0"
#define PACKAGE_STRING "Hello 1.0"
#define PACKAGE_BUGREPORT "bug-hello@@example.org"
#define PACKAGE_URL "https://www.example.org/"
#define HELLO_WORLD "Hello, World\n"

const char hw[] = "Hello, World\n";
@end example

When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE}
definitions are not automatically translated into constants in the
source code by this macro.

@defmac AC_LANG_PROGRAM (@var{prologue}, @var{body})
@acindex{LANG_PROGRAM}
Expands into a source file which consists of the @var{prologue}, and
then @var{body} as body of the main function (e.g., @code{main} in
C).  Since it uses @code{AC_LANG_SOURCE}, the features of the latter are
available.
@end defmac

For instance:

@example
@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
        [https://www.example.org/])
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
  [Greetings string.])
AC_LANG_CONFTEST(
[AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
                 [[fputs (hw, stdout);]])])
gcc -E -dD conftest.c
@end example

@noindent
on a system with @command{gcc} installed, results in:

@example
@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
@dots{}
@asis{#} 1 "conftest.c"

#define PACKAGE_NAME "Hello"
#define PACKAGE_TARNAME "hello"
#define PACKAGE_VERSION "1.0"
#define PACKAGE_STRING "Hello 1.0"
#define PACKAGE_BUGREPORT "bug-hello@@example.org"
#define PACKAGE_URL "https://www.example.org/"
#define HELLO_WORLD "Hello, World\n"

const char hw[] = "Hello, World\n";
int
main (void)
@{
fputs (hw, stdout);
  ;
  return 0;
@}
@end example

In Erlang tests, the created source file is that of an Erlang module called
@code{conftest} (@file{conftest.erl}).  This module defines and exports
at least
one @code{start/0} function, which is called to perform the test.  The
@var{prologue} is optional code that is inserted between the module header and
the @code{start/0} function definition.  @var{body} is the body of the
@code{start/0} function without the final period (@pxref{Runtime}, about
constraints on this function's behavior).

For instance:

@example
AC_INIT([Hello], [1.0], [bug-hello@@example.org])
AC_LANG(Erlang)
AC_LANG_CONFTEST(
[AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]],
                 [[io:format("~s~n", [?HELLO_WORLD])]])])
cat conftest.erl
@end example

@noindent
results in:

@example
-module(conftest).
-export([start/0]).
-define(HELLO_WORLD, "Hello, world!").
start() ->
io:format("~s~n", [?HELLO_WORLD])
.
@end example

@defmac AC_LANG_CALL (@var{prologue}, @var{function})
@acindex{LANG_CALL}
Expands into a source file which consists of the @var{prologue}, and
then a call to the @var{function} as body of the main function (e.g.,
@code{main} in C).  Since it uses @code{AC_LANG_PROGRAM}, the feature
of the latter are available.

This function will probably be replaced in the future by a version
which would enable specifying the arguments.  The use of this macro is
not encouraged, as it violates strongly the typing system.

This macro cannot be used for Erlang tests.
@end defmac

@defmac AC_LANG_FUNC_LINK_TRY (@var{function})
@acindex{LANG_FUNC_LINK_TRY}
Expands into a source file which uses the @var{function} in the body of
the main function (e.g., @code{main} in C).  Since it uses
@code{AC_LANG_PROGRAM}, the features of the latter are available.

As @code{AC_LANG_CALL}, this macro is documented only for completeness.
It is considered to be severely broken, and in the future will be
removed in favor of actual function calls (with properly typed
arguments).

This macro cannot be used for Erlang tests.
@end defmac

@node Running the Preprocessor
@section Running the Preprocessor

Sometimes one might need to run the preprocessor on some source file.
@emph{Usually it is a bad idea}, as you typically need to @emph{compile}
your project, not merely run the preprocessor on it; therefore you
certainly want to run the compiler, not the preprocessor.  Resist the
temptation of following the easiest path.

Nevertheless, if you need to run the preprocessor, then use
@code{AC_PREPROC_IFELSE}.

The macros described in this section cannot be used for tests in Erlang,
Fortran, or Go, since those languages require no preprocessor.

@anchor{AC_PREPROC_IFELSE}
@defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @
  @ovar{action-if-false})
@acindex{PREPROC_IFELSE}
Run the preprocessor of the current language (@pxref{Language Choice})
on the @var{input}, run the shell commands @var{action-if-true} on
success, @var{action-if-false} otherwise.

If @var{input} is nonempty use the equivalent of
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
file; otherwise reuse the already-existing test source file.
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
The @var{input} text is expanded as an unquoted here-document, so
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
@xref{Here-Documents}.

This macro uses @code{CPPFLAGS}, but not @code{CFLAGS}, because
@option{-g}, @option{-O}, etc.@: are not valid options to many C
preprocessors.

It is customary to report unexpected failures with
@code{AC_MSG_FAILURE}.  If needed, @var{action-if-true} can further access
the preprocessed output in the file @file{conftest.i}.
@end defmac

For instance:

@example
AC_INIT([Hello], [1.0], [bug-hello@@example.org])
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
  [Greetings string.])
AC_PREPROC_IFELSE(
   [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
                    [[fputs (hw, stdout);]])],
   [AC_MSG_RESULT([OK])],
   [AC_MSG_FAILURE([unexpected preprocessor failure])])
@end example

@noindent
might result in:

@example
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C23 features... -std=gnu23
checking how to run the C preprocessor... gcc -std=gnu23 -E
OK
@end example

@sp 1

The macro @code{AC_TRY_CPP} (@pxref{Obsolete Macros}) used to play the
role of @code{AC_PREPROC_IFELSE}, but double quotes its argument, making
it impossible to use it to elaborate sources.  You are encouraged to
get rid of your old use of the macro @code{AC_TRY_CPP} in favor of
@code{AC_PREPROC_IFELSE}, but, in the first place, are you sure you need
to run the @emph{preprocessor} and not the compiler?

@anchor{AC_EGREP_HEADER}
@defmac AC_EGREP_HEADER (@var{pattern}, @var{header-file}, @
  @var{action-if-found}, @ovar{action-if-not-found})
@acindex{EGREP_HEADER}
@var{pattern}, after being expanded as if in a double-quoted shell string,
is an extended regular expression.
If the output of running the preprocessor on the system header file
@var{header-file} contains a line matching
@var{pattern}, execute shell commands @var{action-if-found}, otherwise
execute @var{action-if-not-found}.

See below for some problems involving this macro.
@end defmac

@anchor{AC_EGREP_CPP}
@defmac AC_EGREP_CPP (@var{pattern}, @var{program}, @
  @ovar{action-if-found}, @ovar{action-if-not-found})
@acindex{EGREP_CPP}
@var{pattern}, after being expanded as if in a double-quoted shell string,
is an extended regular expression.
@var{program} is the text of a C or C++ program, which is expanded as an
unquoted here-document (@pxref{Here-Documents}).  If the
output of running the preprocessor on @var{program} contains a line
matching @var{pattern}, execute shell commands
@var{action-if-found}, otherwise execute @var{action-if-not-found}.

See below for some problems involving this macro.
@end defmac

@code{AC_EGREP_CPP} and @code{AC_EGREP_HEADER} should be used with care,
as preprocessors can insert line breaks between output tokens.  For
example, the preprocessor might transform this:

@example
#define MAJOR 2
#define MINOR 23
Version MAJOR . MINOR
@end example

@noindent
into this:

@example
Version
       2
                 .
                   23
@end example

@noindent
Because preprocessors are allowed to insert white space, change escapes
in string constants, insert backlash-newline pairs, or do any of a number
of things that do not change the meaning of the preprocessed program, it
is better to rely on @code{AC_PREPROC_IFELSE} than to resort to
@code{AC_EGREP_CPP} or @code{AC_EGREP_HEADER}.

For more information about what can appear in portable extended regular
expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}.

@node Running the Compiler
@section Running the Compiler

To check for a syntax feature of the current language's (@pxref{Language
Choice}) compiler, such as whether it recognizes a certain keyword, or
simply to try some library feature, use @code{AC_COMPILE_IFELSE} to try
to compile a small program that uses that feature.

@defmac AC_COMPILE_IFELSE (@var{input}, @ovar{action-if-true}, @
  @ovar{action-if-false})
@acindex{COMPILE_IFELSE}
Run the compiler and compilation flags of the current language
(@pxref{Language Choice}) on the @var{input}, run the shell commands
@var{action-if-true} on success, @var{action-if-false} otherwise.

If @var{input} is nonempty use the equivalent of
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
file; otherwise reuse the already-existing test source file.
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
The @var{input} text is expanded as an unquoted here-document, so
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
@xref{Here-Documents}.

It is customary to report unexpected failures with
@code{AC_MSG_FAILURE}.  This macro does not try to link; use
@code{AC_LINK_IFELSE} if you need to do that (@pxref{Running the
Linker}).  If needed, @var{action-if-true} can further access the
just-compiled object file @file{conftest.$OBJEXT}.

This macro uses @code{AC_REQUIRE} for the compiler associated with the
current language, which means that if the compiler has not yet been
determined, the compiler determination will be made prior to the body of
the outermost @code{AC_DEFUN} macro that triggered this macro to
expand (@pxref{Expanded Before Required}).
@end defmac

@ovindex ERL
For tests in Erlang, the @var{input} must be the source code of a module named
@code{conftest}.  @code{AC_COMPILE_IFELSE} generates a @file{conftest.beam}
file that can be interpreted by the Erlang virtual machine (@code{ERL}).  It is
recommended to use @code{AC_LANG_PROGRAM} to specify the test program,
to ensure that the Erlang module has the right name.

@node Running the Linker
@section Running the Linker

To check for a library, a function, or a global variable, Autoconf
@command{configure} scripts try to compile and link a small program that
uses it.  This is unlike Metaconfig, which by default uses @code{nm} or
@code{ar} on the C library to try to figure out which functions are
available.  Trying to link with the function is usually a more reliable
approach because it avoids dealing with the variations in the options
and output formats of @code{nm} and @code{ar} and in the location of the
standard libraries.  It also allows configuring for cross-compilation or
checking a function's runtime behavior if needed.  On the other hand,
it can be slower than scanning the libraries once, but accuracy is more
important than speed.

@code{AC_LINK_IFELSE} is used to compile test programs to test for
functions and global variables.  It is also used by @code{AC_CHECK_LIB}
to check for libraries (@pxref{Libraries}), by adding the library being
checked for to @code{LIBS} temporarily and trying to link a small
program.

@anchor{AC_LINK_IFELSE}
@defmac AC_LINK_IFELSE (@var{input}, @ovar{action-if-true}, @
  @ovar{action-if-false})
@acindex{LINK_IFELSE}
Run the compiler (and compilation flags) and the linker of the current
language (@pxref{Language Choice}) on the @var{input}, run the shell
commands @var{action-if-true} on success, @var{action-if-false}
otherwise.  If needed, @var{action-if-true} can further access the
just-linked program file @file{conftest$EXEEXT}.

If @var{input} is nonempty use the equivalent of
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
file; otherwise reuse the already-existing test source file.
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
The @var{input} text is expanded as an unquoted here-document, so
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
@xref{Here-Documents}.

@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
current compilation flags.

It is customary to report unexpected failures with
@code{AC_MSG_FAILURE}.  This macro does not try to execute the program;
use @code{AC_RUN_IFELSE} if you need to do that (@pxref{Runtime}).
@end defmac

The @code{AC_LINK_IFELSE} macro cannot be used for Erlang tests, since Erlang
programs are interpreted and do not require linking.



@node Runtime
@section Checking Runtime Behavior

Sometimes you need to find out how a system performs at runtime, such
as whether a given function has a certain capability or bug.  If you
can, make such checks when your program runs instead of when it is
configured.  You can check for things like the machine's endianness when
your program initializes itself.

If you really need to test for a runtime behavior while configuring,
you can write a test program to determine the result, and compile and
run it using @code{AC_RUN_IFELSE}.  Avoid running test programs if
possible, because this prevents people from configuring your package for
cross-compiling.

@anchor{AC_RUN_IFELSE}
@defmac AC_RUN_IFELSE (@var{input}, @ovar{action-if-true}, @
  @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
@acindex{RUN_IFELSE}
Run the compiler (and compilation flags) and the linker of the current
language (@pxref{Language Choice}) on the @var{input}, then execute the
resulting program.  If the program returns an exit
status of 0 when executed, run shell commands @var{action-if-true}.
Otherwise, run shell commands @var{action-if-false}.

If @var{input} is nonempty use the equivalent of
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
file; otherwise reuse the already-existing test source file.
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
The @var{input} text is expanded as an unquoted here-document, so
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
@xref{Here-Documents}.

@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
compilation flags of the current language (@pxref{Language Choice}).
Additionally, @var{action-if-true} can run @command{./conftest$EXEEXT}
for further testing.

In the @var{action-if-false} section, the failing exit status is
available in the shell variable @samp{$?}.  This exit status might be
that of a failed compilation, or it might be that of a failed program
execution.

If cross-compilation mode is enabled (this is the case if either the
compiler being used does not produce executables that run on the system
where @command{configure} is being run, or if the options @code{--build}
and @code{--host} were both specified and their values are different),
then the test program is
not run.  If the optional shell commands @var{action-if-cross-compiling}
are given, those commands are run instead; typically these commands
provide pessimistic defaults that allow cross-compilation to work even
if the guess was wrong.  If the fourth argument is empty or omitted, but
cross-compilation is detected, then @command{configure} prints an error
message and exits.  If you want your package to be useful in a
cross-compilation scenario, you @emph{should} provide a non-empty
@var{action-if-cross-compiling} clause, as well as wrap the
@code{AC_RUN_IFELSE} compilation inside an @code{AC_CACHE_CHECK}
(@pxref{Caching Results}) which allows the user to override the
pessimistic default if needed.

It is customary to report unexpected failures with
@code{AC_MSG_FAILURE}.
@end defmac

@command{autoconf} prints a warning message when creating
@command{configure} each time it encounters a call to
@code{AC_RUN_IFELSE} with no @var{action-if-cross-compiling} argument
given.  If you are not concerned about users configuring your package
for cross-compilation, you may ignore the warning.  A few of the macros
distributed with Autoconf produce this warning message; but if this is a
problem for you, please report it as a bug, along with an appropriate
pessimistic guess to use instead.

To configure for cross-compiling you can also choose a value for those
parameters based on the canonical system name (@pxref{Manual
Configuration}).  Alternatively, set up a test results cache file with
the correct values for the host system (@pxref{Caching Results}).

@ovindex cross_compiling
To provide a default for calls of @code{AC_RUN_IFELSE} that are embedded
in other macros, including a few of the ones that come with Autoconf,
you can test whether the shell variable @code{cross_compiling} is set to
@samp{yes}, and then use an alternate method to get the results instead
of calling the macros.

It is also permissible to temporarily assign to @code{cross_compiling}
in order to force tests to behave as though they are in a
cross-compilation environment, particularly since this provides a way to
test your @var{action-if-cross-compiling} even when you are not using a
cross-compiler.

@example
# We temporarily set cross-compile mode to force AC_COMPUTE_INT
# to use the slow link-only method
save_cross_compiling=$cross_compiling
cross_compiling=yes
AC_COMPUTE_INT([@dots{}])
cross_compiling=$save_cross_compiling
@end example

A C or C++ runtime test should be portable.
@xref{Portable C and C++}.

Erlang tests must exit themselves the Erlang VM by calling the @code{halt/1}
function: the given status code is used to determine the success of the test
(status is @code{0}) or its failure (status is different than @code{0}), as
explained above.  It must be noted that data output through the standard output
(e.g., using @code{io:format/2}) may be truncated when halting the VM.
Therefore, if a test must output configuration information, it is recommended
to create and to output data into the temporary file named @file{conftest.out},
using the functions of module @code{file}.  The @code{conftest.out} file is
automatically deleted by the @code{AC_RUN_IFELSE} macro.  For instance, a
simplified implementation of Autoconf's @code{AC_ERLANG_SUBST_LIB_DIR}
macro is:

@example
AC_INIT([LibdirTest], [1.0], [bug-libdirtest@@example.org])
AC_ERLANG_NEED_ERL
AC_LANG(Erlang)
AC_RUN_IFELSE(
  [AC_LANG_PROGRAM([], [dnl
    file:write_file("conftest.out", code:lib_dir()),
    halt(0)])],
  [AS_ECHO(["code:lib_dir() returned: `cat conftest.out`"])],
  [AC_MSG_FAILURE([test Erlang program execution failed])])
@end example


@node Multiple Cases
@section Multiple Cases

Some operations are accomplished in several possible ways, depending on
the OS variant.  Checking for them essentially requires a ``case
statement''.  Autoconf does not directly provide one; however, it is
easy to simulate by using a shell variable to keep track of whether a
way to perform the operation has been found yet.

Here is an example that uses the shell variable @code{fstype} to keep
track of whether the remaining cases need to be checked.  Note that
since the value of @code{fstype} is under our control, we don't have to
use the longer @samp{test "x$fstype" = xno}.

@example
@group
AC_MSG_CHECKING([how to get file system type])
fstype=no
# The order of these tests is important.
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h>
                                     #include <sys/fstyp.h>
                                   ]])],
  [AC_DEFINE([FSTYPE_STATVFS], [1],
     [Define if statvfs exists.])
   fstype=SVR4])
AS_IF([test $fstype = no],
  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
                                        #include <sys/fstyp.h>
                                      ]])],
     [AC_DEFINE([FSTYPE_USG_STATFS], [1],
        [Define if USG statfs.])
      fstype=SVR3])])
AS_IF([test $fstype = no],
  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
                                        #include <sys/vmount.h>
                                      ]])],
     [AC_DEFINE([FSTYPE_AIX_STATFS], [1],
        [Define if AIX statfs.])
      fstype=AIX])])
# (more cases omitted here)
AC_MSG_RESULT([$fstype])
@end group
@end example

@c ====================================================== Results of Tests.

@node Results
@chapter Results of Tests

Once @command{configure} has determined whether a feature exists, what can
it do to record that information?  There are four sorts of things it can
do: define a C preprocessor symbol, set a variable in the output files,
save the result in a cache file for future @command{configure} runs, and
print a message letting the user know the result of the test.

@menu
* Defining Symbols::            Defining C preprocessor symbols
* Setting Output Variables::    Replacing variables in output files
* Special Chars in Variables::  Characters to beware of in variables
* Caching Results::             Speeding up subsequent @command{configure} runs
* Printing Messages::           Notifying @command{configure} users
@end menu

@node Defining Symbols
@section Defining C Preprocessor Symbols

A common action to take in response to a feature test is to define a C
preprocessor symbol indicating the results of the test.  That is done by
calling @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}.

By default, @code{AC_OUTPUT} places the symbols defined by these macros
into the output variable @code{DEFS}, which contains an option
@option{-D@var{symbol}=@var{value}} for each symbol defined.  Unlike in
Autoconf version 1, there is no variable @code{DEFS} defined while
@command{configure} is running.  To check whether Autoconf macros have
already defined a certain C preprocessor symbol, test the value of the
appropriate cache variable, as in this example:

@example
AC_CHECK_FUNC([vprintf],
  [AC_DEFINE([HAVE_VPRINTF], [1],
     [Define if vprintf exists.])])
AS_IF([test "x$ac_cv_func_vprintf" != xyes],
  [AC_CHECK_FUNC([_doprnt],
     [AC_DEFINE([HAVE_DOPRNT], [1],
        [Define if _doprnt exists.])])])
@end example

If @code{AC_CONFIG_HEADERS} has been called, then instead of creating
@code{DEFS}, @code{AC_OUTPUT} creates a header file by substituting the
correct values into @code{#define} statements in a template file.
@xref{Configuration Headers}, for more information about this kind of
output.

@defmac AC_DEFINE (@var{variable}, @var{value}, @ovar{description})
@defmacx AC_DEFINE (@var{variable})
@cvindex @var{variable}
@acindex{DEFINE}
Define @var{variable} to @var{value} (verbatim), by defining a C
preprocessor macro for @var{variable}.  @var{variable} should be a C
identifier, optionally suffixed by a parenthesized argument list to
define a C preprocessor macro with arguments.  The macro argument list,
if present, should be a comma-separated list of C identifiers, possibly
terminated by an ellipsis @samp{...} if C99-or-later syntax is employed.
@var{variable} should not contain comments, white space, trigraphs,
backslash-newlines, universal character names, or non-ASCII
characters.

@var{value} may contain backslash-escaped newlines, which will be
preserved if you use @code{AC_CONFIG_HEADERS} but flattened if passed
via @code{@@DEFS@@} (with no effect on the compilation, since the
preprocessor sees only one line in the first place).  @var{value} should
not contain raw newlines.  If you are not using
@code{AC_CONFIG_HEADERS}, @var{value} should not contain any @samp{#}
characters, as @command{make} tends to eat them.  To use a shell
variable, use @code{AC_DEFINE_UNQUOTED} instead.

@var{description} is only useful if you are using
@code{AC_CONFIG_HEADERS}.  In this case, @var{description} is put into
the generated @file{config.h.in} as the comment before the macro define.
The following example defines the C preprocessor variable
@code{EQUATION} to be the string constant @samp{"$a > $b"}:

@example
AC_DEFINE([EQUATION], ["$a > $b"],
  [Equation string.])
@end example

If neither @var{value} nor @var{description} are given, then
@var{value} defaults to 1 instead of to the empty string.  This is for
backwards compatibility with older versions of Autoconf, but this usage
is obsolescent and may be withdrawn in future versions of Autoconf.

If the @var{variable} is a literal string, it is passed to
@code{m4_pattern_allow} (@pxref{Forbidden Patterns}).

If multiple @code{AC_DEFINE} statements are executed for the same
@var{variable} name (not counting any parenthesized argument list),
the last one wins.
@end defmac

@defmac AC_DEFINE_UNQUOTED (@var{variable}, @var{value}, @ovar{description})
@defmacx AC_DEFINE_UNQUOTED (@var{variable})
@acindex{DEFINE_UNQUOTED}
@cvindex @var{variable}
Like @code{AC_DEFINE}, but three shell expansions are
performed---once---on @var{variable} and @var{value}: variable expansion
(@samp{$}), command substitution (@samp{`}), and backslash escaping
(@samp{\}), as if in an unquoted here-document.  Single and double quote
characters in the value have no
special meaning.  Use this macro instead of @code{AC_DEFINE} when
@var{variable} or @var{value} is a shell variable.  Examples:

@example
AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"],
  [Configuration machine file.])
AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
  [getgroups return type.])
AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1],
  [Translated header name.])
@end example
@end defmac

Due to a syntactical oddity of the Bourne shell, do not use
semicolons to separate @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}
calls from other macro calls or shell code; that can cause syntax errors
in the resulting @command{configure} script.  Use either blanks or
newlines.  That is, do this:

@example
AC_CHECK_HEADER([elf.h],
  [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
@end example

@noindent
or this:

@example
AC_CHECK_HEADER([elf.h],
  [AC_DEFINE([SVR4], [1], [System V Release 4])
   LIBS="-lelf $LIBS"])
@end example

@noindent
instead of this:

@example
AC_CHECK_HEADER([elf.h],
  [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
@end example

@node Setting Output Variables
@section Setting Output Variables
@cindex Output variables

Another way to record the results of tests is to set @dfn{output
variables}, which are shell variables whose values are substituted into
files that @command{configure} outputs.  The two macros below create new
output variables.  @xref{Preset Output Variables}, for a list of output
variables that are always available.

@defmac AC_SUBST (@var{variable}, @ovar{value})
@acindex{SUBST}
Create an output variable from a shell variable.  Make @code{AC_OUTPUT}
substitute the variable @var{variable} into output files (typically one
or more makefiles).  This means that @code{AC_OUTPUT}
replaces instances of @samp{@@@var{variable}@@} in input files with the
value that the shell variable @var{variable} has when @code{AC_OUTPUT}
is called.  The value can contain any non-@code{NUL} character, including
newline.  If you are using Automake 1.11 or newer, for newlines in values
you might want to consider using @code{AM_SUBST_NOTMAKE} to prevent
@command{automake} from adding a line @code{@var{variable} =
@@@var{variable}@@} to the @file{Makefile.in} files (@pxref{Optional, ,
Automake, automake, Other things Automake recognizes}).

Variable occurrences should not overlap: e.g., an input file should
not contain @samp{@@@var{var1}@@@var{var2}@@} if @var{var1} and @var{var2}
are variable names.
The substituted value is not rescanned for more output variables;
occurrences of @samp{@@@var{variable}@@} in the value are inserted
literally into the output file.  (The algorithm uses the special marker
@code{|#_!!_#|} internally, so neither the substituted value nor the
output file may contain @code{|#_!!_#|}.)

If @var{value} is given, in addition assign it to @var{variable}.

The string @var{variable} is passed to @code{m4_pattern_allow}
(@pxref{Forbidden Patterns}).  @var{variable} is not further expanded,
even if there is another macro by the same name.
@end defmac

@defmac AC_SUBST_FILE (@var{variable})
@acindex{SUBST_FILE}
Another way to create an output variable from a shell variable.  Make
@code{AC_OUTPUT} insert (without substitutions) the contents of the file
named by shell variable @var{variable} into output files.  This means
that @code{AC_OUTPUT} replaces instances of
@samp{@@@var{variable}@@} in output files (such as @file{Makefile.in})
with the contents of the file that the shell variable @var{variable}
names when @code{AC_OUTPUT} is called.  Set the variable to
@file{/dev/null} for cases that do not have a file to insert.
This substitution occurs only when the @samp{@@@var{variable}@@} is on a
line by itself, optionally surrounded by spaces and tabs.  The
substitution replaces the whole line, including the spaces, tabs, and
the terminating newline.

This macro is useful for inserting makefile fragments containing
special dependencies or other @command{make} directives for particular host
or target types into makefiles.  For example, @file{configure.ac}
could contain:

@example
AC_SUBST_FILE([host_frag])
host_frag=$srcdir/conf/sun4.mh
@end example

@noindent
and then a @file{Makefile.in} could contain:

@example
@@host_frag@@
@end example

The string @var{variable} is passed to @code{m4_pattern_allow}
(@pxref{Forbidden Patterns}).
@end defmac

@cindex Precious Variable
@cindex Variable, Precious
Running @command{configure} in varying environments can be extremely
dangerous.  If for instance the user runs @samp{CC=bizarre-cc
./configure}, then the cache, @file{config.h}, and many other output
files depend upon @command{bizarre-cc} being the C compiler.  If
for some reason the user runs @command{./configure} again, or if it is
run via @samp{./config.status --recheck}, (@xref{Automatic Remaking},
and @pxref{config.status Invocation}), then the configuration can be
inconsistent, composed of results depending upon two different
compilers.

Environment variables that affect this situation, such as @samp{CC}
above, are called @dfn{precious variables}, and can be declared as such
by @code{AC_ARG_VAR}.

@defmac AC_ARG_VAR (@var{variable}, @var{description})
@acindex{ARG_VAR}
Declare @var{variable} is a precious variable, and include its
@var{description} in the variable section of @samp{./configure --help}.

Being precious means that
@itemize @minus
@item
@var{variable} is substituted via @code{AC_SUBST}.

@item
The value of @var{variable} when @command{configure} was launched is
saved in the cache, including if it was not specified on the command
line but via the environment.  Indeed, while @command{configure} can
notice the definition of @code{CC} in @samp{./configure CC=bizarre-cc},
it is impossible to notice it in @samp{CC=bizarre-cc ./configure},
which, unfortunately, is what most users do.

We emphasize that it is the @emph{initial} value of @var{variable} which
is saved, not that found during the execution of @command{configure}.
Indeed, specifying @samp{./configure FOO=foo} and letting
@samp{./configure} guess that @code{FOO} is @code{foo} can be two
different things.

@item
@var{variable} is checked for consistency between two
@command{configure} runs.  For instance:

@example
$ @kbd{./configure --silent --config-cache}
$ @kbd{CC=cc ./configure --silent --config-cache}
configure: error: 'CC' was not set in the previous run
configure: error: changes in the environment can compromise \
the build
configure: error: run 'make distclean' and/or \
'rm config.cache' and start over
@end example

@noindent
and similarly if the variable is unset, or if its content is changed.
If the content has white space changes only, then the error is degraded
to a warning only, but the old value is reused.

@item
@var{variable} is kept during automatic reconfiguration
(@pxref{config.status Invocation}) as if it had been passed as a command
line argument, including when no cache is used:

@example
$ @kbd{CC=/usr/bin/cc ./configure var=raboof --silent}
$ @kbd{./config.status --recheck}
running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
  CC=/usr/bin/cc  --no-create --no-recursion
@end example
@end itemize
@end defmac

@node Special Chars in Variables
@section Special Characters in Output Variables
@cindex Output variables, special characters in

Many output variables are intended to be evaluated both by
@command{make} and by the shell.  Some characters are expanded
differently in these two contexts, so to avoid confusion these
variables' values should not contain any of the following characters:

@example
" # $ & ' ( ) * ; < > ? [ \ ^ ` |
@end example

Also, these variables' values should neither contain newlines, nor start
with @samp{~}, nor contain white space or @samp{:} immediately followed
by @samp{~}.  The values can contain nonempty sequences of white space
characters like tabs and spaces, but each such sequence might
arbitrarily be replaced by a single space during substitution.

These restrictions apply both to the values that @command{configure}
computes, and to the values set directly by the user.  For example, the
following invocations of @command{configure} are problematic, since they
attempt to use special characters within @code{CPPFLAGS} and white space
within @code{$(srcdir)}:

@example
CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'

'../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'
@end example

@node Caching Results
@section Caching Results
@cindex Cache

To avoid checking for the same features repeatedly in various
@command{configure} scripts (or in repeated runs of one script),
@command{configure} can optionally save the results of many checks in a
@dfn{cache file} (@pxref{Cache Files}).  If a @command{configure} script
runs with caching enabled and finds a cache file, it reads the results
of previous runs from the cache and avoids rerunning those checks.  As a
result, @command{configure} can then run much faster than if it had to
perform all of the checks every time.

@defmac AC_CACHE_VAL (@var{cache-id}, @var{commands-to-set-it})
@acindex{CACHE_VAL}
Ensure that the results of the check identified by @var{cache-id} are
available.  If the results of the check were in the cache file that was
read, and @command{configure} was not given the @option{--quiet} or
@option{--silent} option, print a message saying that the result was
cached; otherwise, run the shell commands @var{commands-to-set-it}.  If
the shell commands are run to determine the value, the value is
saved in the cache file just before @command{configure} creates its output
files.  @xref{Cache Variable Names}, for how to choose the name of the
@var{cache-id} variable.

The @var{commands-to-set-it} @emph{must have no side effects} except for
setting the variable @var{cache-id}, see below.
@end defmac

@defmac AC_CACHE_CHECK (@var{message}, @var{cache-id}, @
  @var{commands-to-set-it})
@acindex{CACHE_CHECK}
A wrapper for @code{AC_CACHE_VAL} that takes care of printing the
messages.  This macro provides a convenient shorthand for the most
common way to use these macros.  It calls @code{AC_MSG_CHECKING} for
@var{message}, then @code{AC_CACHE_VAL} with the @var{cache-id} and
@var{commands} arguments, and @code{AC_MSG_RESULT} with @var{cache-id}.

The @var{commands-to-set-it} @emph{must have no side effects} except for
setting the variable @var{cache-id}, see below.
@end defmac

It is common to find buggy macros using @code{AC_CACHE_VAL} or
@code{AC_CACHE_CHECK}, because people are tempted to call
@code{AC_DEFINE} in the @var{commands-to-set-it}.  Instead, the code that
@emph{follows} the call to @code{AC_CACHE_VAL} should call
@code{AC_DEFINE}, by examining the value of the cache variable.  For
instance, the following macro is broken:

@example
@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
@group
AC_DEFUN([AC_SHELL_TRUE],
[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
                [my_cv_shell_true_works=no
                 (true) 2>/dev/null && my_cv_shell_true_works=yes
                 if test "x$my_cv_shell_true_works" = xyes; then
                   AC_DEFINE([TRUE_WORKS], [1],
                             [Define if 'true(1)' works properly.])
                 fi])
])
@end group
@end example

@noindent
This fails if the cache is enabled: the second time this macro is run,
@code{TRUE_WORKS} @emph{will not be defined}.  The proper implementation
is:

@example
@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
@group
AC_DEFUN([AC_SHELL_TRUE],
[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
                [my_cv_shell_true_works=no
                 (true) 2>/dev/null && my_cv_shell_true_works=yes])
 if test "x$my_cv_shell_true_works" = xyes; then
   AC_DEFINE([TRUE_WORKS], [1],
             [Define if 'true(1)' works properly.])
 fi
])
@end group
@end example

Also, @var{commands-to-set-it} should not print any messages, for
example with @code{AC_MSG_CHECKING}; do that before calling
@code{AC_CACHE_VAL}, so the messages are printed regardless of whether
the results of the check are retrieved from the cache or determined by
running the shell commands.

@menu
* Cache Variable Names::        Shell variables used in caches
* Cache Files::                 Files @command{configure} uses for caching
* Cache Checkpointing::         Loading and saving the cache file
@end menu

@node Cache Variable Names
@subsection Cache Variable Names
@cindex Cache variable

The names of cache variables should have the following format:

@example
@var{package-prefix}_cv_@var{value-type}_@var{specific-value}_@ovar{additional-options}
@end example

@noindent
for example, @samp{ac_cv_header_stat_broken} or
@samp{ac_cv_prog_gcc_traditional}.  The parts of the variable name are:

@table @asis
@item @var{package-prefix}
An abbreviation for your package or organization; the same prefix you
begin local Autoconf macros with, except lowercase by convention.
For cache values used by the distributed Autoconf macros, this value is
@samp{ac}.

@item @code{_cv_}
Indicates that this shell variable is a cache value.  This string
@emph{must} be present in the variable name, including the leading
underscore.

@item @var{value-type}
A convention for classifying cache values, to produce a rational naming
system.  The values used in Autoconf are listed in @ref{Macro Names}.

@item @var{specific-value}
Which member of the class of cache values this test applies to.
For example, which function (@samp{alloca}), program (@samp{gcc}), or
output variable (@samp{INSTALL}).

@item @var{additional-options}
Any particular behavior of the specific member that this test applies to.
For example, @samp{broken} or @samp{set}.  This part of the name may
be omitted if it does not apply.
@end table

The values assigned to cache variables may not contain newlines.
Usually, their values are Boolean (@samp{yes} or @samp{no}) or the
names of files or functions; so this is not an important restriction.
@ref{Cache Variable Index} for an index of cache variables with
documented semantics.


@node Cache Files
@subsection Cache Files

A cache file is a shell script that caches the results of configure
tests run on one system so they can be shared between configure scripts
and configure runs.  It is not useful on other systems.  If its contents
are invalid for some reason, the user may delete or edit it, or override
documented cache variables on the @command{configure} command line.

By default, @command{configure} uses no cache file,
to avoid problems caused by accidental
use of stale cache files.

To enable caching, @command{configure} accepts @option{--config-cache} (or
@option{-C}) to cache results in the file @file{config.cache}.
Alternatively, @option{--cache-file=@var{file}} specifies that
@var{file} be the cache file.  The cache file is created if it does not
exist already.  When @command{configure} calls @command{configure} scripts in
subdirectories, it uses the @option{--cache-file} argument so that they
share the same cache.  @xref{Subdirectories}, for information on
configuring subdirectories with the @code{AC_CONFIG_SUBDIRS} macro.

@file{config.status} only pays attention to the cache file if it is
given the @option{--recheck} option, which makes it rerun
@command{configure}.

It is wrong to try to distribute cache files for particular system types.
There is too much room for error in doing that, and too much
administrative overhead in maintaining them.  For any features that
can't be guessed automatically, use the standard method of the canonical
system type and linking files (@pxref{Manual Configuration}).

The site initialization script can specify a site-wide cache file to
use, instead of the usual per-program cache.  In this case, the cache
file gradually accumulates information whenever someone runs a new
@command{configure} script.  (Running @command{configure} merges the new cache
results with the existing cache file.)  This may cause problems,
however, if the system configuration (e.g., the installed libraries or
compilers) changes and the stale cache file is not deleted.

If @command{configure} is interrupted at the right time when it updates
a cache file outside of the build directory where the @command{configure}
script is run, it may leave behind a temporary file named after the
cache file with digits following it.  You may safely delete such a file.


@node Cache Checkpointing
@subsection Cache Checkpointing

If your configure script, or a macro called from @file{configure.ac}, happens
to abort the configure process, it may be useful to checkpoint the cache
a few times at key points using @code{AC_CACHE_SAVE}.  Doing so
reduces the amount of time it takes to rerun the configure script with
(hopefully) the error that caused the previous abort corrected.

@c FIXME: Do we really want to document this guy?
@defmac AC_CACHE_LOAD
@acindex{CACHE_LOAD}
Loads values from existing cache file, or creates a new cache file if a
cache file is not found.  Called automatically from @code{AC_INIT}.
@end defmac

@defmac AC_CACHE_SAVE
@acindex{CACHE_SAVE}
Flushes all cached values to the cache file.  Called automatically from
@code{AC_OUTPUT}, but it can be quite useful to call
@code{AC_CACHE_SAVE} at key points in @file{configure.ac}.
@end defmac

For instance:

@example
@r{ @dots{} AC_INIT, etc. @dots{}}
@group
# Checks for programs.
AC_PROG_CC
AC_PROG_AWK
@r{ @dots{} more program checks @dots{}}
AC_CACHE_SAVE
@end group

@group
# Checks for libraries.
AC_CHECK_LIB([nsl], [gethostbyname])
AC_CHECK_LIB([socket], [connect])
@r{ @dots{} more lib checks @dots{}}
AC_CACHE_SAVE
@end group

@group
# Might abort@dots{}
AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])])
AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])])
@end group
@r{ @dots{} AC_OUTPUT, etc. @dots{}}
@end example

@node Printing Messages
@section Printing Messages
@cindex Messages, from @command{configure}

@command{configure} scripts need to give users running them several kinds
of information.  The following macros print messages in ways appropriate
for each kind.  The arguments to all of them get enclosed in shell
double quotes, so the shell performs variable and back-quote
substitution on them.

These macros are all wrappers around the @command{printf} shell command.
They direct output to the appropriate file descriptor (@pxref{File
Descriptor Macros}).
@command{configure} scripts should rarely need to run @command{printf} directly
to print messages for the user.  Using these macros makes it easy to
change how and when each kind of message is printed; such changes need
only be made to the macro definitions and all the callers change
automatically.

To diagnose static issues, i.e., when @command{autoconf} is run, see
@ref{Diagnostic Macros}.

@defmac AC_MSG_CHECKING (@var{feature-description})
@acindex{MSG_CHECKING}
Notify the user that @command{configure} is checking for a particular
feature.  This macro prints a message that starts with @samp{checking }
and ends with @samp{...} and no newline.  It must be followed by a call
to @code{AC_MSG_RESULT} to print the result of the check and the
newline.  The @var{feature-description} should be something like
@samp{whether the Fortran compiler accepts C++ comments} or @samp{for
_Alignof}.

This macro prints nothing if @command{configure} is run with the
@option{--quiet} or @option{--silent} option.
@end defmac

@anchor{AC_MSG_RESULT}
@defmac AC_MSG_RESULT (@var{result-description})
@acindex{MSG_RESULT}
Notify the user of the results of a check.  @var{result-description} is
almost always the value of the cache variable for the check, typically
@samp{yes}, @samp{no}, or a file name.  This macro should follow a call
to @code{AC_MSG_CHECKING}, and the @var{result-description} should be
the completion of the message printed by the call to
@code{AC_MSG_CHECKING}.

This macro prints nothing if @command{configure} is run with the
@option{--quiet} or @option{--silent} option.
@end defmac

@anchor{AC_MSG_NOTICE}
@defmac AC_MSG_NOTICE (@var{message})
@acindex{MSG_NOTICE}
Deliver the @var{message} to the user.  It is useful mainly to print a
general description of the overall purpose of a group of feature checks,
e.g.,

@example
AC_MSG_NOTICE([checking if stack overflow is detectable])
@end example

This macro prints nothing if @command{configure} is run with the
@option{--quiet} or @option{--silent} option.
@end defmac

@anchor{AC_MSG_ERROR}
@defmac AC_MSG_ERROR (@var{error-description}, @dvar{exit-status, $?/1})
@acindex{MSG_ERROR}
Notify the user of an error that prevents @command{configure} from
completing.  This macro prints an error message to the standard error
output and exits @command{configure} with @var{exit-status} (@samp{$?}
by default, except that @samp{0} is converted to @samp{1}).
@var{error-description} should be something like @samp{invalid value
$HOME for \$HOME}.

The @var{error-description} should start with a lower-case letter, and
``cannot'' is preferred to ``can't''.
@end defmac

@defmac AC_MSG_FAILURE (@var{error-description}, @ovar{exit-status})
@acindex{MSG_FAILURE}
This @code{AC_MSG_ERROR} wrapper notifies the user of an error that
prevents @command{configure} from completing @emph{and} that additional
details are provided in @file{config.log}.  This is typically used when
abnormal results are found during a compilation.
@end defmac

@anchor{AC_MSG_WARN}
@defmac AC_MSG_WARN (@var{problem-description})
@acindex{MSG_WARN}
Notify the @command{configure} user of a possible problem.  This macro
prints the message to the standard error output; @command{configure}
continues running afterward, so macros that call @code{AC_MSG_WARN} should
provide a default (back-up) behavior for the situations they warn about.
@var{problem-description} should be something like @samp{ln -s seems to
make hard links}.
@end defmac



@c ====================================================== Programming in M4.

@node Programming in M4
@chapter Programming in M4
@cindex M4

Autoconf is written on top of two layers: @dfn{M4sugar}, which provides
convenient macros for pure M4 programming, and @dfn{M4sh}, which
provides macros dedicated to shell script generation.

As of this version of Autoconf, these two layers still contain
experimental macros, whose interface might change in the future.  As a
matter of fact, @emph{anything that is not documented must not be used}.

@menu
* M4 Quotation::                Protecting macros from unwanted expansion
* Using autom4te::              The Autoconf executables backbone
* Programming in M4sugar::      Convenient pure M4 macros
* Debugging via autom4te::      Figuring out what M4 was doing
@end menu

@node M4 Quotation
@section M4 Quotation
@cindex M4 quotation
@cindex quotation

The most common problem with existing macros is an improper quotation.
This section, which users of Autoconf can skip, but which macro writers
@emph{must} read, first justifies the quotation scheme that was chosen
for Autoconf and then ends with a rule of thumb.  Understanding the
former helps one to follow the latter.

@menu
* Active Characters::           Characters that change the behavior of M4
* One Macro Call::              Quotation and one macro call
* Quoting and Parameters::      M4 vs. shell parameters
* Quotation and Nested Macros::  Macros calling macros
* Changequote is Evil::         Worse than INTERCAL: M4 + changequote
* Quadrigraphs::                Another way to escape special characters
* Balancing Parentheses::       Dealing with unbalanced parentheses
* Quotation Rule Of Thumb::     One parenthesis, one quote
@end menu

@node Active Characters
@subsection Active Characters

To fully understand where proper quotation is important, you first need
to know what the special characters are in Autoconf: @samp{#} introduces
a comment inside which no macro expansion is performed, @samp{,}
separates arguments, @samp{[} and @samp{]} are the quotes
themselves@footnote{By itself, M4 uses @samp{`} and @samp{'}; it is the
M4sugar layer that sets up the preferred quotes of @samp{[} and @samp{]}.},
@samp{(} and @samp{)} (which M4 tries to match by pairs), and finally
@samp{$} inside a macro definition.

In order to understand the delicate case of macro calls, we first have
to present some obvious failures.  Below they are ``obvious-ified'',
but when you find them in real life, they are usually in disguise.

Comments, introduced by a hash and running up to the newline, are opaque
tokens to the top level: active characters are turned off, and there is
no macro expansion:

@example
# define([def], ine)
@result{}# define([def], ine)
@end example

Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:

@example
int tab[10];
@result{}int tab10;
[int tab[10];]
@result{}int tab[10];
@end example

Without this in mind, the reader might try hopelessly to use her macro
@code{array}:

@example
define([array], [int tab[10];])
array
@result{}int tab10;
[array]
@result{}array
@end example

@noindent
How can you correctly output the intended results@footnote{Using
@code{defn}.}?


@node One Macro Call
@subsection One Macro Call

Let's proceed on the interaction between active characters and macros
with this small macro, which just returns its first argument:

@example
define([car], [$1])
@end example

@noindent
The two pairs of quotes above are not part of the arguments of
@code{define}; rather, they are understood by the top level when it
tries to find the arguments of @code{define}.  Therefore, assuming
@code{car} is not already defined, it is equivalent to write:

@example
define(car, $1)
@end example

@noindent
But, while it is acceptable for a @file{configure.ac} to avoid unnecessary
quotes, it is bad practice for Autoconf macros which must both be more
robust and also advocate perfect style.

At the top level, there are only two possibilities: either you
quote or you don't:

@example
car(foo, bar, baz)
@result{}foo
[car(foo, bar, baz)]
@result{}car(foo, bar, baz)
@end example

Let's pay attention to the special characters:

@example
car(#)
@error{}EOF in argument list
@end example

The closing parenthesis is hidden in the comment; with a hypothetical
quoting, the top level understood it this way:

@example
car([#)]
@end example

@noindent
Proper quotation, of course, fixes the problem:

@example
car([#])
@result{}#
@end example

Here are more examples:

@example
car(foo, bar)
@result{}foo
car([foo, bar])
@result{}foo, bar
car((foo, bar))
@result{}(foo, bar)
car([(foo], [bar)])
@result{}(foo
define([a], [b])
@result{}
car(a)
@result{}b
car([a])
@result{}b
car([[a]])
@result{}a
car([[[a]]])
@result{}[a]
@end example

@node Quoting and Parameters
@subsection Quoting and Parameters

When M4 encounters @samp{$} within a macro definition, followed
immediately by a character it recognizes (@samp{0}@dots{}@samp{9},
@samp{#}, @samp{@@}, or @samp{*}), it will perform M4 parameter
expansion.  This happens regardless of how many layers of quotes the
parameter expansion is nested within, or even if it occurs in text that
will be rescanned as a comment.

@example
define([none], [$1])
@result{}
define([one], [[$1]])
@result{}
define([two], [[[$1]]])
@result{}
define([comment], [# $1])
@result{}
define([active], [ACTIVE])
@result{}
none([active])
@result{}ACTIVE
one([active])
@result{}active
two([active])
@result{}[active]
comment([active])
@result{}# active
@end example

On the other hand, since autoconf generates shell code, you often want
to output shell variable expansion, rather than performing M4 parameter
expansion.  To do this, you must use M4 quoting to separate the @samp{$}
from the next character in the definition of your macro.  If the macro
definition occurs in single-quoted text, then insert another level of
quoting; if the usage is already inside a double-quoted string, then
split it into concatenated strings.

@example
define([foo], [a single-quoted $[]1 definition])
@result{}
define([bar], [[a double-quoted $][1 definition]])
@result{}
foo
@result{}a single-quoted $1 definition
bar
@result{}a double-quoted $1 definition
@end example

POSIX states that M4 implementations are free to provide implementation
extensions when @samp{$@{} is encountered in a macro definition.
Autoconf reserves the longer sequence @samp{$@{@{} for use with planned
extensions that will be available in the future GNU M4 2.0,
but guarantees that all other instances of @samp{$@{} will be output
literally.  Therefore, this idiom can also be used to output shell code
parameter references:

@example
define([first], [$@{1@}])first
@result{}$@{1@}
@end example

POSIX also states that @samp{$11} should expand to the first parameter
concatenated with a literal @samp{1}, although some versions of
GNU M4 expand the eleventh parameter instead.  For
portability, you should only use single-digit M4 parameter expansion.

With this in mind, we can explore the cases where macros invoke
macros@enddots{}

@node Quotation and Nested Macros
@subsection Quotation and Nested Macros

The examples below use the following macros:

@example
define([car], [$1])
define([active], [ACT, IVE])
define([array], [int tab[10]])
@end example

Each additional embedded macro call introduces other possible
interesting quotations:

@example
car(active)
@result{}ACT
car([active])
@result{}ACT, IVE
car([[active]])
@result{}active
@end example

In the first case, the top level looks for the arguments of @code{car},
and finds @samp{active}.  Because M4 evaluates its arguments
before applying the macro, @samp{active} is expanded, which results in:

@example
car(ACT, IVE)
@result{}ACT
@end example

@noindent
In the second case, the top level gives @samp{active} as first and only
argument of @code{car}, which results in:

@example
active
@result{}ACT, IVE
@end example

@noindent
i.e., the argument is evaluated @emph{after} the macro that invokes it.
In the third case, @code{car} receives @samp{[active]}, which results in:

@example
[active]
@result{}active
@end example

@noindent
exactly as we already saw above.

The example above, applied to a more realistic example, gives:

@example
car(int tab[10];)
@result{}int tab10;
car([int tab[10];])
@result{}int tab10;
car([[int tab[10];]])
@result{}int tab[10];
@end example

@noindent
Huh?  The first case is easily understood, but why is the second wrong,
and the third right?  To understand that, you must know that after
M4 expands a macro, the resulting text is immediately subjected
to macro expansion and quote removal.  This means that the quote removal
occurs twice---first before the argument is passed to the @code{car}
macro, and second after the @code{car} macro expands to the first
argument.

As the author of the Autoconf macro @code{car}, you then consider it to
be incorrect that your users have to double-quote the arguments of
@code{car}, so you ``fix'' your macro.  Let's call it @code{qar} for
quoted car:

@example
define([qar], [[$1]])
@end example

@noindent
and check that @code{qar} is properly fixed:

@example
qar([int tab[10];])
@result{}int tab[10];
@end example

@noindent
Ahhh!  That's much better.

But note what you've done: now that the result of @code{qar} is always
a literal string, the only time a user can use nested macros is if she
relies on an @emph{unquoted} macro call:

@example
qar(active)
@result{}ACT
qar([active])
@result{}active
@end example

@noindent
leaving no way for her to reproduce what she used to do with @code{car}:

@example
car([active])
@result{}ACT, IVE
@end example

@noindent
Worse yet: she wants to use a macro that produces a set of @code{cpp}
macros:

@example
define([my_includes], [#include <stdio.h>])
car([my_includes])
@result{}#include <stdio.h>
qar(my_includes)
@error{}EOF in argument list
@end example

This macro, @code{qar}, because it double quotes its arguments, forces
its users to leave their macro calls unquoted, which is dangerous.
Commas and other active symbols are interpreted by M4 before
they are given to the macro, often not in the way the users expect.
Also, because @code{qar} behaves differently from the other macros,
it's an exception that should be avoided in Autoconf.

@node Changequote is Evil
@subsection @code{changequote} is Evil
@cindex @code{changequote}

The temptation is often high to bypass proper quotation, in particular
when it's late at night.  Then, many experienced Autoconf hackers
finally surrender to the dark side of the force and use the ultimate
weapon: @code{changequote}.

The M4 builtin @code{changequote} belongs to a set of primitives that
allow one to adjust the syntax of the language to adjust it to one's
needs.  For instance, by default M4 uses @samp{`} and @samp{'} as
quotes, but in the context of shell programming (and actually of most
programming languages), that's about the worst choice one can make:
because of strings and back-quoted expressions in shell code (such as
@samp{'this'} and @samp{`that`}), and because of literal characters in usual
programming languages (as in @samp{'0'}), there are many unbalanced
@samp{`} and @samp{'}.  Proper M4 quotation then becomes a nightmare, if
not impossible.  In order to make M4 useful in such a context, its
designers have equipped it with @code{changequote}, which makes it
possible to choose another pair of quotes.  M4sugar, M4sh, Autoconf, and
Autotest all have chosen to use @samp{[} and @samp{]}.  Not especially
because they are unlikely characters, but @emph{because they are
characters unlikely to be unbalanced}.

There are other magic primitives, such as @code{changecom} to specify
what syntactic forms are comments (it is common to see
@samp{changecom(<!--, -->)} when M4 is used to produce HTML pages),
@code{changeword} and @code{changesyntax} to change other syntactic
details (such as the character to denote the @var{n}th argument, @samp{$} by
default, the parentheses around arguments, etc.).

These primitives are really meant to make M4 more useful for specific
domains: they should be considered like command line options:
@option{--quotes}, @option{--comments}, @option{--words}, and
@option{--syntax}.  Nevertheless, they are implemented as M4 builtins, as
it makes M4 libraries self contained (no need for additional options).

There lies the problem@enddots{}

@sp 1

The problem is that it is then tempting to use them in the middle of an
M4 script, as opposed to its initialization.  This, if not carefully
thought out, can lead to disastrous effects: @emph{you are changing the
language in the middle of the execution}.  Changing and restoring the
syntax is often not enough: if you happened to invoke macros in between,
these macros are lost, as the current syntax is probably not
the one they were implemented with.

@c FIXME: I've been looking for a short, real case example, but I
@c lost them all :(


@node Quadrigraphs
@subsection Quadrigraphs
@cindex quadrigraphs
@cindex @samp{@@S|@@}
@cindex @samp{@@&t@@}
@c Info cannot handle ':' in index entries.
@ifnotinfo
@cindex @samp{@@<:@@}
@cindex @samp{@@:>@@}
@cindex @samp{@@%:@@}
@cindex @samp{@@@{:@@}
@cindex @samp{@@:@}@@}
@end ifnotinfo

When writing an Autoconf macro you may occasionally need to generate
special characters that are difficult to express with the standard
Autoconf quoting rules.  For example, you may need to output the regular
expression @samp{[^[]}, which matches any character other than @samp{[}.
This expression contains unbalanced brackets so it cannot be put easily
into an M4 macro.

Additionally, there are a few m4sugar macros (such as @code{m4_split}
and @code{m4_expand}) which internally use special markers in addition
to the regular quoting characters.  If the arguments to these macros
contain the literal strings @samp{-=<@{(} or @samp{)@}>=-}, the macros
might behave incorrectly.

You can work around these problems by using one of the following
@dfn{quadrigraphs}:

@table @samp
@item @@<:@@
@samp{[}
@item @@:>@@
@samp{]}
@item @@S|@@
@samp{$}
@item @@%:@@
@samp{#}
@item @@@{:@@
@samp{(}
@item @@:@}@@
@samp{)}
@item @@&t@@
Expands to nothing.
@end table

Quadrigraphs are replaced at a late stage of the translation process,
after @command{m4} is run, so they do not get in the way of M4 quoting.
For example, the string @samp{^@@<:@@}, independently of its quotation,
appears as @samp{^[} in the output.

The empty quadrigraph can be used:

@itemize @minus
@item to mark trailing spaces explicitly

Trailing spaces are smashed by @command{autom4te}.  This is a feature.

@item to produce quadrigraphs and other strings reserved by m4sugar

For instance @samp{@@<@@&t@@:@@} produces @samp{@@<:@@}.  For a more
contrived example:

@example
m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
m4_split([a )@}>=- b -=<@{( c])
@result{}[a], [], [B], [], [c]
m4_split([a )@}@@&t@@>=- b -=<@@&t@@@{( c])
@result{}[a], [)@}>=-], [b], [-=<@{(], [c]
@end example

@item to escape @emph{occurrences} of forbidden patterns

For instance you might want to mention @code{AC_FOO} in a comment, while
still being sure that @command{autom4te} still catches unexpanded
@samp{AC_*}.  Then write @samp{AC@@&t@@_FOO}.
@end itemize

The name @samp{@@&t@@} was suggested by Paul Eggert:

@quotation
I should give some credit to the @samp{@@&t@@} pun.  The @samp{&} is my
own invention, but the @samp{t} came from the source code of the
ALGOL68C compiler, written by Steve Bourne (of Bourne shell fame),
and which used @samp{mt} to denote the empty string.  In C, it would
have looked like something like:

@example
char const mt[] = "";
@end example

@noindent
but of course the source code was written in Algol 68.

I don't know where he got @samp{mt} from: it could have been his own
invention, and I suppose it could have been a common pun around the
Cambridge University computer lab at the time.
@end quotation


@node Balancing Parentheses
@subsection Dealing with unbalanced parentheses
@cindex balancing parentheses
@cindex parentheses, balancing
@cindex unbalanced parentheses, managing

One of the pitfalls of portable shell programming is that
if you intend your script to run with obsolescent shells,
@command{case} statements require unbalanced parentheses.
@xref{case, , Limitations of Shell Builtins}.
With syntax highlighting
editors, the presence of unbalanced @samp{)} can interfere with editors
that perform syntax highlighting of macro contents based on finding the
matching @samp{(}.  Another concern is how much editing must be done
when transferring code snippets between shell scripts and macro
definitions.  But most importantly, the presence of unbalanced
parentheses can introduce expansion bugs.

For an example, here is an underquoted attempt to use the macro
@code{my_case}, which happens to expand to a portable @command{case}
statement:

@example
AC_DEFUN([my_case],
[case $file_name in
  *.c) file_type='C source code';;
esac])
AS_IF(:, my_case)
@end example

@noindent
In the above example, the @code{AS_IF} call under-quotes its arguments.
As a result, the unbalanced @samp{)} generated by the premature
expansion of @code{my_case} results in expanding @code{AS_IF} with a
truncated parameter, and the expansion is syntactically invalid:

@example
if :
then :
  case $file_name in
  *.c
fi file_type='C source code';;
esac)
@end example

If nothing else, this should emphasize the importance of the quoting
arguments to macro calls.  On the other hand, there are several
variations for defining @code{my_case} to be more robust, even when used
without proper quoting, each with some benefits and some drawbacks.

@itemize @w{}
@item Use left parenthesis before pattern
@example
AC_DEFUN([my_case],
[case $file_name in
  (*.c) file_type='C source code';;
esac])
@end example
@noindent
This is simple and provides balanced parentheses.  Although this is not
portable to obsolescent shells (notably Solaris 10 @command{/bin/sh}),
platforms with these shells invariably have a more-modern shell
available somewhere so this approach typically suffices nowadays.

@item Creative literal shell comment
@example
AC_DEFUN([my_case],
[case $file_name in #(
  *.c) file_type='C source code';;
esac])
@end example
@noindent
This version provides balanced parentheses to several editors, and can
be copied and pasted into a terminal as is.  Unfortunately, it is still
unbalanced as an Autoconf argument, since @samp{#(} is an M4 comment
that masks the normal properties of @samp{(}.

@item Quadrigraph shell comment
@example
AC_DEFUN([my_case],
[case $file_name in @@%:@@(
  *.c) file_type='C source code';;
esac])
@end example
@noindent
This version provides balanced parentheses to even more editors, and can
be used as a balanced Autoconf argument.  Unfortunately, it requires
some editing before it can be copied and pasted into a terminal, and the
use of the quadrigraph @samp{@@%:@@} for @samp{#} reduces readability.

@item Quoting just the parenthesis
@example
AC_DEFUN([my_case],
[case $file_name in
  *.c[)] file_type='C source code';;
esac])
@end example
@noindent
This version quotes the @samp{)}, so that it can be used as a balanced
Autoconf argument.  As written, this is not balanced to an editor, but
it can be coupled with @samp{[#(]} to meet that need, too.  However, it
still requires some edits before it can be copied and pasted into a
terminal.

@item Double-quoting the entire statement
@example
AC_DEFUN([my_case],
[[case $file_name in #(
  *.c) file_type='C source code';;
esac]])
@end example
@noindent
Since the entire macro is double-quoted, there is no problem with using
this as an Autoconf argument; and since the double-quoting is over the
entire statement, this code can be easily copied and pasted into a
terminal.  However, the double quoting prevents the expansion of any
macros inside the case statement, which may cause its own set of
problems.

@item Using @code{AS_CASE}
@example
AC_DEFUN([my_case],
[AS_CASE([$file_name],
  [*.c], [file_type='C source code'])])
@end example
@noindent
This version avoids the balancing issue altogether, by relying on
@code{AS_CASE} (@pxref{Common Shell Constructs}); it also allows for the
expansion of @code{AC_REQUIRE} to occur prior to the entire case
statement, rather than within a branch of the case statement that might
not be taken.  However, the abstraction comes with a penalty that it is
no longer a quick copy, paste, and edit to get back to shell code.
@end itemize


@node Quotation Rule Of Thumb
@subsection Quotation Rule Of Thumb

To conclude, the quotation rule of thumb is:

@center @emph{One pair of quotes per pair of parentheses.}

Never over-quote, never under-quote, in particular in the definition of
macros.  In the few places where the macros need to use brackets
(usually in C program text or regular expressions), properly quote
@emph{the arguments}!

It is common to read Autoconf programs with snippets like:

@example
AC_TRY_LINK(
changequote(<<, >>)dnl
<<#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif>>,
changequote([, ])dnl
[atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
@end example

@noindent
which is incredibly useless since @code{AC_TRY_LINK} is @emph{already}
double quoting, so you just need:

@example
AC_TRY_LINK(
[#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif],
            [atoi (*tzname);],
            [ac_cv_var_tzname=yes],
            [ac_cv_var_tzname=no])
@end example

@noindent
The M4-fluent reader might note that these two examples are rigorously
equivalent, since M4 swallows both the @samp{changequote(<<, >>)}
and @samp{<<} @samp{>>} when it @dfn{collects} the arguments: these
quotes are not part of the arguments!

Simplified, the example above is just doing this:

@example
changequote(<<, >>)dnl
<<[]>>
changequote([, ])dnl
@end example

@noindent
instead of simply:

@example
[[]]
@end example

With macros that do not double quote their arguments (which is the
rule), double-quote the (risky) literals:

@example
AC_LINK_IFELSE([AC_LANG_PROGRAM(
[[#include <time.h>
#ifndef tzname /* For SGI.  */
extern char *tzname[]; /* RS6000 and others reject char **tzname.  */
#endif]],
                                [atoi (*tzname);])],
               [ac_cv_var_tzname=yes],
               [ac_cv_var_tzname=no])
@end example

Please note that the macro @code{AC_TRY_LINK} is obsolete, so you really
should be using @code{AC_LINK_IFELSE} instead.

@xref{Quadrigraphs}, for what to do if you run into a hopeless case
where quoting does not suffice.

When you create a @command{configure} script using newly written macros,
examine it carefully to check whether you need to add more quotes in
your macros.  If one or more words have disappeared in the M4
output, you need more quotes.  When in doubt, quote.

However, it's also possible to put on too many layers of quotes.  If
this happens, the resulting @command{configure} script may contain
unexpanded macros.  The @command{autoconf} program checks for this problem
by looking for the string @samp{AC_} in @file{configure}.  However, this
heuristic does not work in general: for example, it does not catch
overquoting in @code{AC_DEFINE} descriptions.


@c ---------------------------------------- Using autom4te

@node Using autom4te
@section Using @command{autom4te}

The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition
to Autoconf per se, heavily rely on M4.  All these different uses
revealed common needs factored into a layer over M4:
@command{autom4te}@footnote{
@c
Yet another great name from Lars J. Aas.
@c
}.

@command{autom4te} is a preprocessor that is like @command{m4}.
It supports M4 extensions designed for use in tools like Autoconf.

@menu
* autom4te Invocation::         A GNU M4 wrapper
* Customizing autom4te::        Customizing the Autoconf package
@end menu

@node autom4te Invocation
@subsection Invoking @command{autom4te}

The command line arguments are modeled after M4's:

@example
autom4te @var{options} @var{files}
@end example

@noindent
@evindex M4
where the @var{files} are directly passed to @command{m4}.  By default,
GNU M4 is found during configuration, but the environment
variable
@env{M4} can be set to tell @command{autom4te} where to look.  In addition
to the regular expansion, it handles the replacement of the quadrigraphs
(@pxref{Quadrigraphs}), and of @samp{__oline__}, the current line in the
output.  It supports an extended syntax for the @var{files}:

@table @file
@item @var{file}.m4f
This file is an M4 frozen file.  Note that @emph{all the previous files
are ignored}.  See the @option{--melt} option for the rationale.

@item @var{file}?
If found in the library path, the @var{file} is included for expansion,
otherwise it is ignored instead of triggering a failure.
@end table

@sp 1

Of course, it supports the Autoconf common subset of options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Report processing steps.

@item --debug
@itemx -d
Don't remove the temporary files and be even more verbose.

@item --include=@var{dir}
@itemx -I @var{dir}
Also look for input files in @var{dir}.  Multiple invocations
accumulate.

@item --output=@var{file}
@itemx -o @var{file}
Save output (script or trace) to @var{file}.  The file @option{-} stands
for the standard output.
@end table

@sp 1

As an extension of @command{m4}, it includes the following options:

@table @option

@item --warnings=@var{category}[,@var{category}...]
@itemx -W@var{category}[,@var{category}...]
@evindex WARNINGS
Enable or disable warnings related to each @var{category}.
@xref{m4_warn}, for a comprehensive list of categories.
Special values include:

@table @samp
@item all
Enable all categories of warnings.

@item none
Disable all categories of warnings.

@item error
Treat all warnings as errors.

@item no-@var{category}
Disable warnings falling into @var{category}.
@end table

The environment variable @env{WARNINGS} may also be set to a
comma-separated list of warning categories to enable or disable.
It is interpreted exactly the same way as the argument of
@option{--warnings}, but unknown categories are silently ignored.
The command line takes precedence; for instance, if @env{WARNINGS}
is set to @code{obsolete}, but @option{-Wnone} is given on the
command line, no warnings will be issued.

Some categories of warnings are on by default.
Again, for details see @ref{m4_warn}.

@item --melt
@itemx -M
Do not use frozen files.  Any argument @code{@var{file}.m4f} is
replaced by @code{@var{file}.m4}.  This helps tracing the macros which
are executed only when the files are frozen, typically
@code{m4_define}.  For instance, running:

@example
autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
@end example

@noindent
is roughly equivalent to running:

@example
m4 1.m4 2.m4 3.m4 4.m4 input.m4
@end example

@noindent
while

@example
autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
@end example

@noindent
is equivalent to:

@example
m4 --reload-state=4.m4f input.m4
@end example

@item --freeze
@itemx -F
Produce a frozen state file.  @command{autom4te} freezing is stricter
than M4's: it must produce no warnings, and no output other than empty
lines (a line with white space is @emph{not} empty) and comments
(starting with @samp{#}).  Unlike @command{m4}'s similarly-named option,
this option takes no argument:

@example
autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
@end example

@noindent
corresponds to

@example
m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
@end example

@item --mode=@var{octal-mode}
@itemx -m @var{octal-mode}
Set the mode of the non-traces output to @var{octal-mode}; by default
@samp{0666}.
@end table

@sp 1

@cindex @file{autom4te.cache}
As another additional feature over @command{m4}, @command{autom4te}
caches its results.  GNU M4 is able to produce a regular
output and traces at the same time.  Traces are heavily used in the
GNU Build System: @command{autoheader} uses them to build
@file{config.h.in}, @command{autoreconf} to determine what
GNU Build System components are used, @command{automake} to
``parse'' @file{configure.ac} etc.  To avoid recomputation,
traces are cached while performing regular expansion,
and conversely.  This cache is (actually, the caches are) stored in
the directory @file{autom4te.cache}.  @emph{It can safely be removed}
at any moment (especially if for some reason @command{autom4te}
considers it trashed).

@table @option
@item --cache=@var{directory}
@itemx -C @var{directory}
Specify the name of the directory where the result should be cached.
Passing an empty value disables caching.  Be sure to pass a relative
file name, as for the time being, global caches are not supported.

@item --no-cache
Don't cache the results.

@item --force
@itemx -f
If a cache is used, consider it obsolete (but update it anyway).
@end table

@sp 1

Because traces are so important to the GNU Build System,
@command{autom4te} provides high level tracing features as compared to
M4, and helps exploiting the cache:

@table @option
@item --trace=@var{macro}[:@var{format}]
@itemx -t @var{macro}[:@var{format}]
Trace the invocations of @var{macro} according to the @var{format}.
Multiple @option{--trace} arguments can be used to list several macros.
Multiple @option{--trace} arguments for a single macro are not
cumulative; instead, you should just make @var{format} as long as
needed.

The @var{format} is a regular string, with newlines if desired, and
several special escape codes.  It defaults to @samp{$f:$l:$n:$%}.  It can
use the following special escapes:

@table @samp
@item $$
@c $$ restore font-lock
The character @samp{$}.

@item $f
The file name from which @var{macro} is called.

@item $l
The line number from which @var{macro} is called.

@item $d
The depth of the @var{macro} call.  This is an M4 technical detail that
you probably don't want to know about.

@item $n
The name of the @var{macro}.

@item $@var{num}
The @var{num}th argument of the call to @var{macro}.

@item $@@
@itemx $@var{sep}@@
@itemx $@{@var{separator}@}@@
All the arguments passed to @var{macro}, separated by the character
@var{sep} or the string @var{separator} (@samp{,} by default).  Each
argument is quoted, i.e., enclosed in a pair of square brackets.

@item $*
@itemx $@var{sep}*
@itemx $@{@var{separator}@}*
As above, but the arguments are not quoted.

@item $%
@itemx $@var{sep}%
@itemx $@{@var{separator}@}%
As above, but the arguments are not quoted, all new line characters in
the arguments are smashed, and the default separator is @samp{:}.

The escape @samp{$%} produces single-line trace outputs (unless you put
newlines in the @samp{separator}), while @samp{$@@} and @samp{$*} do
not.
@end table

@xref{autoconf Invocation}, for examples of trace uses.

@item --preselect=@var{macro}
@itemx -p @var{macro}
Cache the traces of @var{macro}, but do not enable traces.  This is
especially important to save CPU cycles in the future.  For instance,
when invoked, @command{autoconf} pre-selects all the macros that
@command{autoheader}, @command{automake}, @command{autoreconf}, etc.,
trace, so that running @command{m4} is not needed to trace them: the
cache suffices.  This results in a huge speed-up.
@end table

@sp 1

@cindex Autom4te Library
Finally, @command{autom4te} introduces the concept of @dfn{Autom4te
libraries}.  They consists in a powerful yet extremely simple feature:
sets of combined command line arguments:

@table @option
@item --language=@var{language}
@itemx -l @var{language}
Use the @var{language} Autom4te library.  Current languages include:

@table @code
@item M4sugar
create M4sugar output.

@item M4sh
create M4sh executable shell scripts.

@item Autotest
create Autotest executable test suites.

@item Autoconf-without-aclocal-m4
create Autoconf executable configure scripts without
reading @file{aclocal.m4}.

@item Autoconf
create Autoconf executable configure scripts.  This language inherits
all the characteristics of @code{Autoconf-without-aclocal-m4} and
additionally reads @file{aclocal.m4}.
@end table

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend directory @var{dir} to the search path.  This is used to include
the language-specific files before any third-party macros.

@end table

@cindex @file{autom4te.cfg}
As an example, if Autoconf is installed in its default location,
@file{/usr/local}, the command @samp{autom4te -l m4sugar foo.m4} is
strictly equivalent to the command:

@example
autom4te --prepend-include /usr/local/share/autoconf \
  m4sugar/m4sugar.m4f foo.m4
@end example

@noindent
Recursive expansion applies here: the command @samp{autom4te -l m4sh foo.m4}
is the same as @samp{autom4te --language M4sugar m4sugar/m4sh.m4f
foo.m4}, i.e.:

@example
autom4te --prepend-include /usr/local/share/autoconf \
  m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4
@end example

@noindent
The definition of the languages is stored in @file{autom4te.cfg}.

@node Customizing autom4te
@subsection Customizing @command{autom4te}

One can customize @command{autom4te} via @file{~/.autom4te.cfg} (i.e.,
as found in the user home directory), and @file{./.autom4te.cfg} (i.e.,
as found in the directory from which @command{autom4te} is run).  The
order is first reading @file{autom4te.cfg}, then @file{~/.autom4te.cfg},
then @file{./.autom4te.cfg}, and finally the command line arguments.

In these text files, comments are introduced with @code{#}, and empty
lines are ignored.  Customization is performed on a per-language basis,
wrapped in between a @samp{begin-language: "@var{language}"},
@samp{end-language: "@var{language}"} pair.

Customizing a language stands for appending options (@pxref{autom4te
Invocation}) to the current definition of the language.  Options, and
more generally arguments, are introduced by @samp{args:
@var{arguments}}.  You may use the traditional shell syntax to quote the
@var{arguments}.

As an example, to disable Autoconf caches (@file{autom4te.cache})
globally, include the following lines in @file{~/.autom4te.cfg}:

@verbatim
## ------------------ ##
## User Preferences.  ##
## ------------------ ##

begin-language: "Autoconf-without-aclocal-m4"
args: --no-cache
end-language: "Autoconf-without-aclocal-m4"
@end verbatim


@node Programming in M4sugar
@section Programming in M4sugar

@cindex M4sugar
M4 by itself provides only a small, but sufficient, set of all-purpose
macros.  M4sugar introduces additional generic macros.  Its name was
coined by Lars J. Aas: ``Readability And Greater Understanding Stands 4
M4sugar''.

M4sugar reserves the macro namespace @samp{^_m4_} for internal use, and
the macro namespace @samp{^m4_} for M4sugar macros.  You should not
define your own macros into these namespaces.

@menu
* Redefined M4 Macros::         M4 builtins changed in M4sugar
* Diagnostic Macros::           Diagnostic messages from M4sugar
* Diversion support::           Diversions in M4sugar
* Conditional constructs::      Conditions in M4
* Looping constructs::          Iteration in M4
* Evaluation Macros::           More quotation and evaluation control
* Text processing Macros::      String manipulation in M4
* Number processing Macros::    Arithmetic computation in M4
* Set manipulation Macros::     Set manipulation in M4
* Forbidden Patterns::          Catching unexpanded macros
@end menu

@node Redefined M4 Macros
@subsection Redefined M4 Macros

@msindex{builtin}
@msindex{changecom}
@msindex{changequote}
@msindex{debugfile}
@msindex{debugmode}
@msindex{decr}
@msindex{define}
@msindex{divnum}
@msindex{errprint}
@msindex{esyscmd}
@msindex{eval}
@msindex{format}
@msindex{ifdef}
@msindex{incr}
@msindex{index}
@msindex{indir}
@msindex{len}
@msindex{pushdef}
@msindex{shift}
@msindex{substr}
@msindex{syscmd}
@msindex{sysval}
@msindex{traceoff}
@msindex{traceon}
@msindex{translit}
With a few exceptions, all the M4 native macros are moved in the
@samp{m4_} pseudo-namespace, e.g., M4sugar renames @code{define} as
@code{m4_define} etc.

The list of macros unchanged from M4, except for their name, is:
@itemize @minus
@item m4_builtin
@item m4_changecom
@item m4_changequote
@item m4_debugfile
@item m4_debugmode
@item m4_decr
@item m4_define
@item m4_divnum
@item m4_errprint
@item m4_esyscmd
@item m4_eval
@item m4_format
@item m4_ifdef
@item m4_incr
@item m4_index
@item m4_indir
@item m4_len
@item m4_pushdef
@item m4_shift
@item m4_substr
@item m4_syscmd
@item m4_sysval
@item m4_traceoff
@item m4_traceon
@item m4_translit
@end itemize

Some M4 macros are redefined, and are slightly incompatible with their
native equivalent.

@defmac __file__
@defmacx __line__
@MSindex __file__
@MSindex __line__
All M4 macros starting with @samp{__} retain their original name: for
example, no @code{m4__file__} is defined.
@end defmac

@defmac __oline__
@MSindex __oline__
This is not technically a macro, but a feature of Autom4te.  The
sequence @code{__oline__} can be used similarly to the other m4sugar
location macros, but rather than expanding to the location of the input
file, it is translated to the line number where it appears in the output
file after all other M4 expansions.
@end defmac

@defmac dnl
@MSindex dnl
This macro kept its original name: no @code{m4_dnl} is defined.
@end defmac

@defmac m4_bpatsubst (@var{string}, @var{regexp}, @ovar{replacement})
@msindex{bpatsubst}
This macro corresponds to @code{patsubst}.  The name @code{m4_patsubst}
is kept for future versions of M4sugar, once GNU M4 2.0 is
released and supports extended regular expression syntax.
@end defmac

@defmac m4_bregexp (@var{string}, @var{regexp}, @ovar{replacement})
@msindex{bregexp}
This macro corresponds to @code{regexp}.  The name @code{m4_regexp}
is kept for future versions of M4sugar, once GNU M4 2.0 is
released and supports extended regular expression syntax.
@end defmac

@defmac m4_copy (@var{source}, @var{dest})
@defmacx m4_copy_force (@var{source}, @var{dest})
@defmacx m4_rename (@var{source}, @var{dest})
@defmacx m4_rename_force (@var{source}, @var{dest})
@msindex{copy}
@msindex{copy_force}
@msindex{rename}
@msindex{rename_force}
These macros aren't directly builtins, but are closely related to
@code{m4_pushdef} and @code{m4_defn}.  @code{m4_copy} and
@code{m4_rename} ensure that @var{dest} is undefined, while
@code{m4_copy_force} and @code{m4_rename_force} overwrite any existing
definition.  All four macros then proceed to copy the entire pushdef
stack of definitions of @var{source} over to @var{dest}.  @code{m4_copy}
and @code{m4_copy_force} preserve the source (including in the special
case where @var{source} is undefined), while @code{m4_rename} and
@code{m4_rename_force} undefine the original macro name (making it an
error to rename an undefined @var{source}).

Note that attempting to invoke a renamed macro might not work, since the
macro may have a dependence on helper macros accessed via composition of
@samp{$0} but that were not also renamed; likewise, other macros may
have a hard-coded dependence on @var{source} and could break if
@var{source} has been deleted.  On the other hand, it is always safe to
rename a macro to temporarily move it out of the way, then rename it
back later to restore original semantics.
@end defmac

@defmac m4_defn (@var{macro}@dots{})
@msindex{defn}
This macro fails if @var{macro} is not defined, even when using older
versions of M4 that did not warn.  See @code{m4_undefine}.
Unfortunately, in order to support these older versions of M4, there are
some situations involving unbalanced quotes where concatenating multiple
macros together will work in newer M4 but not in m4sugar; use
quadrigraphs to work around this.
@end defmac

@defmac m4_divert (@var{diversion})
@msindex{divert}
M4sugar relies heavily on diversions, so rather than behaving as a
primitive, @code{m4_divert} behaves like:
@example
m4_divert_pop()m4_divert_push([@var{diversion}])
@end example
@noindent
@xref{Diversion support}, for more details about the use of the
diversion stack.  In particular, this implies that @var{diversion}
should be a named diversion rather than a raw number.  But be aware that
it is seldom necessary to explicitly change the diversion stack, and
that when done incorrectly, it can lead to syntactically invalid
scripts.
@end defmac

@defmac m4_dumpdef (@var{name}@dots{})
@defmacx m4_dumpdefs (@var{name}@dots{})
@msindex{dumpdef}
@msindex{dumpdefs}
@code{m4_dumpdef} is like the M4 builtin, except that this version
requires at least one argument, output always goes to standard error
rather than the current debug file, no sorting is done on multiple
arguments, and an error is issued if any
@var{name} is undefined.  @code{m4_dumpdefs} is a convenience macro that
calls @code{m4_dumpdef} for all of the
@code{m4_pushdef} stack of definitions, starting with the current, and
silently does nothing if @var{name} is undefined.

Unfortunately, due to a limitation in M4 1.4.x, any macro defined as a
builtin is output as the empty string.  This behavior is rectified by
using M4 1.6 or newer.  However, this behavior difference means that
@code{m4_dumpdef} should only be used while developing m4sugar macros,
and never in the final published form of a macro.
@end defmac

@defmac m4_esyscmd_s (@var{command})
@msindex{esyscmd_s}
Like @code{m4_esyscmd}, this macro expands to the result of running
@var{command} in a shell.  The difference is that any trailing newlines
are removed, so that the output behaves more like shell command
substitution.
@end defmac

@defmac m4_exit (@var{exit-status})
@msindex{exit}
This macro corresponds to @code{m4exit}.
@end defmac

@defmac m4_if (@var{comment})
@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal}, @ovar{not-equal})
@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal-1}, @
  @var{string-3}, @var{string-4}, @var{equal-2}, @dots{}, @ovar{not-equal})
@msindex{if}
This macro corresponds to @code{ifelse}.  @var{string-1} and
@var{string-2} are compared literally, so usually one of the two
arguments is passed unquoted.  @xref{Conditional constructs}, for more
conditional idioms.
@end defmac

@defmac m4_include (@var{file})
@defmacx m4_sinclude (@var{file})
@msindex{include}
@msindex{sinclude}
Like the M4 builtins, but warn against multiple inclusions of @var{file}.
@end defmac

@defmac m4_mkstemp (@var{template})
@defmacx m4_maketemp (@var{template})
@msindex{maketemp}
@msindex{mkstemp}
Older versions of POSIX specified a macro @code{maketemp},
which replaced the trailing @samp{X}
characters in @var{template} with the process id, without regards to the
existence of a file by that name.
This was a security hole, so current POSIX instead specifies a macro
@code{mkstemp} that always creates a uniquely named file.  In M4sugar,
@code{m4_maketemp} and @code{m4_mkstemp} are synonyms for each other,
and both have the secure semantics regardless of which macro the
underlying M4 provides.
@end defmac

@defmac m4_popdef (@var{macro}@dots{})
@msindex{popdef}
This macro fails if @var{macro} is not defined, even when using older
versions of M4 that did not warn.  See @code{m4_undefine}.
@end defmac

@defmac m4_undefine (@var{macro}@dots{})
@msindex{undefine}
This macro fails if @var{macro} is not defined, even when using older
versions of M4 that did not warn.  Use

@example
m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])])
@end example

@noindent
if you are not sure whether @var{macro} is defined.
@end defmac

@defmac m4_undivert (@var{diversion}@dots{})
@msindex{undivert}
Unlike the M4 builtin, at least one @var{diversion} must be specified.
Also, since the M4sugar diversion stack prefers named
diversions, the use of @code{m4_undivert} to include files is risky.
@xref{Diversion support}, for more details about the use of the
diversion stack.  But be aware that it is seldom necessary to explicitly
change the diversion stack, and that when done incorrectly, it can lead
to syntactically invalid scripts.
@end defmac

@defmac m4_wrap (@var{text})
@defmacx m4_wrap_lifo (@var{text})
@msindex{wrap}
@msindex{wrap_lifo}
These macros correspond to @code{m4wrap}.  POSIX requires arguments of
multiple wrap calls to be reprocessed at EOF in the same order
as the original calls (first-in, first-out).  GNU M4 versions
through 1.4.10, however, reprocess them in reverse order (last-in,
first-out).  Both orders are useful, therefore, you can rely on
@code{m4_wrap} to provide FIFO semantics and @code{m4_wrap_lifo} for
LIFO semantics, regardless of the underlying GNU M4 version.

Unlike the GNU M4 builtin, these macros only recognize one
argument, and avoid token pasting between consecutive invocations.  On
the other hand, nested calls to @code{m4_wrap} from within wrapped text
work just as in the builtin.
@end defmac


@node Diagnostic Macros
@subsection Diagnostic messages from M4sugar
@cindex Messages, from @command{M4sugar}

When macros statically diagnose abnormal situations, benign or fatal,
they should report them using these macros.  For issuing dynamic issues,
i.e., when @command{configure} is run, see @ref{Printing Messages}.

@defmac m4_assert (@var{expression}, @dvar{exit-status, 1})
@msindex{assert}
Assert that the arithmetic @var{expression} evaluates to non-zero.
Otherwise, issue a fatal error, and exit @command{autom4te} with
@var{exit-status}.
@end defmac

@defmac m4_errprintn (@var{message})
@msindex{errprintn}
Similar to the builtin @code{m4_errprint}, except that a newline is
guaranteed after @var{message}.
@end defmac

@anchor{m4_fatal}
@defmac m4_fatal (@var{message})
@msindex{fatal}
Report a severe error @var{message} prefixed with the current location,
and have @command{autom4te} die.
@end defmac

@defmac m4_location
@msindex{location}
Useful as a prefix in a message line.  Short for:
@example
__file__:__line__
@end example
@end defmac

@anchor{m4_warn}
@defmac m4_warn (@var{category}, @var{message})
@msindex{warn}
Report @var{message} as a warning (or as an error if requested by the
user) if warnings of the @var{category} are turned on.  If the message
is emitted, it is prefixed with the current location, and followed by a
call trace of all macros defined via @code{AC_DEFUN} used to get to the
current expansion.

The @var{category} must be one of:

@table @samp
@item cross
Warnings about constructs that may interfere with cross-compilation,
such as using @code{AC_RUN_IFELSE} without a default.

@item gnu
Warnings related to the GNU Coding Standards
(@pxref{Top,,, standards, The GNU Coding Standards}).
On by default.

@item obsolete
Warnings about obsolete features.  On by default.

@item override
Warnings about redefinitions of Autoconf internals.

@item portability
Warnings about non-portable constructs.

@item portability-recursive
Warnings about recursive Make variable expansions (@code{$(foo$(x))}).

@item extra-portability
Extra warnings about non-portable constructs, covering rarely-used
tools.

@item syntax
Warnings about questionable syntactic constructs, incorrectly ordered
macro calls, typos, etc.  On by default.

@item unsupported
Warnings about unsupported features.  On by default.
@end table

@strong{Hacking Note:} The set of categories is defined by code in
@command{autom4te}, not by M4sugar itself.  Additions should be
coordinated with Automake, so that both sets of tools accept the same
options.
@end defmac

@node Diversion support
@subsection Diversion support

M4sugar makes heavy use of diversions under the hood, because it is
often the case that
text that must appear early in the output is not discovered until late
in the input.  Additionally, some of the topological sorting algorithms
used in resolving macro dependencies use diversions.  However, most
macros should not need to change diversions directly, but rather rely on
higher-level M4sugar macros to manage diversions transparently.  If you
change diversions improperly, you risk generating a syntactically
invalid script, because an incorrect diversion will violate assumptions
made by many macros about whether prerequisite text has been previously
output.  In short, if you manually change the diversion, you should not
expect any macros provided by the Autoconf package to work until you
have restored the diversion stack back to its original state.

In the rare case that it is necessary to write a macro that explicitly
outputs text to a different diversion, it is important to be aware of an
M4 limitation regarding diversions: text only goes to a diversion if it
is not part of argument collection.  Therefore, any macro that changes
the current diversion cannot be used as an unquoted argument to another
macro, but must be expanded at the top level.  The macro
@code{m4_expand} will diagnose any attempt to change diversions, since
it is generally useful only as an argument to another macro.  The
following example shows what happens when diversion manipulation is
attempted within macro arguments:

@example
m4_do([normal text]
m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
[m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
@result{}normal text
@result{}unwanted
@end example

@noindent
Notice that the unquoted text @code{unwanted} is output, even though it
was processed while the current diversion was @code{KILL}, because it
was collected as part of the argument to @code{m4_do}.  However, the
text @code{discarded} disappeared as desired, because the diversion
changes were single-quoted, and were not expanded until the top-level
rescan of the output of @code{m4_do}.

To make diversion management easier, M4sugar uses the concept of named
diversions.  Rather than using diversion numbers directly, it is nicer
to associate a name with each diversion.  The diversion number associated
with a particular diversion name is an implementation detail, and a
syntax warning is issued if a diversion number is used instead of a
name.  In general, you should not output text
to a named diversion until after calling the appropriate initialization
routine for your language (@code{m4_init}, @code{AS_INIT},
@code{AT_INIT}, @dots{}), although there are some exceptions documented
below.

M4sugar defines two named diversions.
@table @code
@item KILL
Text written to this diversion is discarded.  This is the default
diversion once M4sugar is initialized.
@item GROW
This diversion is used behind the scenes by topological sorting macros,
such as @code{AC_REQUIRE}.
@end table

M4sh adds several more named diversions.
@table @code
@item BINSH
This diversion is reserved for the @samp{#!} interpreter line.
@item HEADER-REVISION
This diversion holds text from @code{AC_REVISION}.
@item HEADER-COMMENT
This diversion holds comments about the purpose of a file.
@item HEADER-COPYRIGHT
This diversion is managed by @code{AC_COPYRIGHT}.
@item M4SH-SANITIZE
This diversion contains M4sh sanitization code, used to ensure M4sh is
executing in a reasonable shell environment.
@item M4SH-INIT
This diversion contains M4sh initialization code, initializing variables
that are required by other M4sh macros.
@item BODY
This diversion contains the body of the shell code, and is the default
diversion once M4sh is initialized.
@end table

Autotest inherits diversions from M4sh, and changes the default
diversion from @code{BODY} back to @code{KILL}.  It also adds several
more named diversions, with the following subset designed for developer
use.
@table @code
@item PREPARE_TESTS
This diversion contains initialization sequences which are executed
after @file{atconfig} and @file{atlocal}, and after all command line
arguments have been parsed, but prior to running any tests.  It can be
used to set up state that is required across all tests.  This diversion
will work even before @code{AT_INIT}.
@end table

Autoconf inherits diversions from M4sh, and adds the following named
diversions which developers can utilize.
@table @code
@item DEFAULTS
This diversion contains shell variable assignments to set defaults that
must be in place before arguments are parsed.  This diversion is placed
early enough in @file{configure} that it is unsafe to expand any
autoconf macros into this diversion.
@item HELP_ENABLE
If @code{AC_PRESERVE_HELP_ORDER} was used, then text placed in this
diversion will be included as part of a quoted here-doc providing all of
the @option{--help} output of @file{configure} related to options
created by @code{AC_ARG_WITH} and @code{AC_ARG_ENABLE}.
@item INIT_PREPARE
This diversion occurs after all command line options have been parsed,
but prior to the main body of the @file{configure} script.  This
diversion is the last chance to insert shell code such as variable
assignments or shell function declarations that will used by the
expansion of other macros.
@end table

For now, the remaining named diversions of Autoconf, Autoheader, and
Autotest are not documented.  In other words,
intentionally outputting text into an undocumented diversion is subject
to breakage in a future release of Autoconf.

@defmac m4_cleardivert (@var{diversion}@dots{})
@msindex{cleardivert}
Permanently discard any text that has been diverted into
@var{diversion}.
@end defmac

@defmac m4_divert_once (@var{diversion}, @ovar{content})
@msindex{divert_once}
Similar to @code{m4_divert_text}, except that @var{content} is only
output to @var{diversion} if this is the first time that
@code{m4_divert_once} has been called with its particular arguments.
@end defmac

@defmac m4_divert_pop (@ovar{diversion})
@msindex{divert_pop}
If provided, check that the current diversion is indeed @var{diversion}.
Then change to the diversion located earlier on the stack, giving an
error if an attempt is made to pop beyond the initial m4sugar diversion
of @code{KILL}.
@end defmac

@defmac m4_divert_push (@var{diversion})
@msindex{divert_push}
Remember the former diversion on the diversion stack, and output
subsequent text into @var{diversion}.  M4sugar maintains a diversion
stack, and issues an error if there is not a matching pop for every
push.
@end defmac

@anchor{m4_divert_text}
@defmac m4_divert_text (@var{diversion}, @ovar{content})
@msindex{divert_text}
Output @var{content} and a newline into @var{diversion}, without
affecting the current diversion.  Shorthand for:
@example
m4_divert_push([@var{diversion}])@var{content}
m4_divert_pop([@var{diversion}])dnl
@end example

One use of @code{m4_divert_text} is to develop two related macros, where
macro @samp{MY_A} does the work, but adjusts what work is performed
based on whether the optional macro @samp{MY_B} has also been expanded.
Of course, it is possible to use @code{AC_BEFORE} within @code{MY_A} to
require that @samp{MY_B} occurs first, if it occurs at all.  But this
imposes an ordering restriction on the user; it would be nicer if macros
@samp{MY_A} and @samp{MY_B} can be invoked in either order.  The trick
is to let @samp{MY_B} leave a breadcrumb in an early diversion, which
@samp{MY_A} can then use to determine whether @samp{MY_B} has been
expanded.

@example
AC_DEFUN([MY_A],
[# various actions
if test -n "$b_was_used"; then
  # extra action
fi])
AC_DEFUN([MY_B],
[AC_REQUIRE([MY_A])dnl
m4_divert_text([INIT_PREPARE], [b_was_used=true])])
@end example

@end defmac

@defmac m4_init
@msindex{init}
Initialize the M4sugar environment, setting up the default named
diversion to be @code{KILL}.
@end defmac

@node Conditional constructs
@subsection Conditional constructs

The following macros provide additional conditional constructs as
convenience wrappers around @code{m4_if}.

@defmac m4_bmatch (@var{string}, @var{regex-1}, @var{value-1}, @
  @ovar{regex-2}, @ovar{value-2}, @dots{}, @ovar{default})
@msindex{bmatch}
The string @var{string} is repeatedly compared against a series of
@var{regex} arguments; if a match is found, the expansion is the
corresponding @var{value}, otherwise, the macro moves on to the next
@var{regex}.  If no @var{regex} match, then the result is the optional
@var{default}, or nothing.
@end defmac

@defmac m4_bpatsubsts (@var{string}, @var{regex-1}, @var{subst-1}, @
  @ovar{regex-2}, @ovar{subst-2}, @dots{})
@msindex{bpatsubsts}
The string @var{string} is altered by @var{regex-1} and @var{subst-1},
as if by:
@example
m4_bpatsubst([[@var{string}]], [@var{regex}], [@var{subst}])
@end example

@noindent
The result of the substitution is then passed through the next set of
@var{regex} and @var{subst}, and so forth.  An empty @var{subst} implies
deletion of any matched portions in the current string.  Note that this
macro over-quotes @var{string}; this behavior is intentional, so that
the result of each step of the recursion remains as a quoted string.
However, it means that anchors (@samp{^} and @samp{$} in the @var{regex}
will line up with the extra quotations, and not the characters of the
original string.  The overquoting is removed after the final
substitution.
@end defmac

@defmac m4_case (@var{string}, @var{value-1}, @var{if-value-1}, @
  @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
@msindex{case}
Test @var{string} against multiple @var{value} possibilities, resulting
in the first @var{if-value} for a match, or in the optional
@var{default}.  This is shorthand for:
@example
m4_if([@var{string}], [@var{value-1}], [@var{if-value-1}],
      [@var{string}], [@var{value-2}], [@var{if-value-2}], @dots{},
      [@var{default}])
@end example
@end defmac

@defmac m4_cond (@var{test-1}, @var{value-1}, @var{if-value-1}, @
  @ovar{test-2}, @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
@msindex{cond}
This macro was introduced in Autoconf 2.62.  Similar to @code{m4_if},
except that each @var{test} is expanded only when it is encountered.
This is useful for short-circuiting expensive tests; while @code{m4_if}
requires all its strings to be expanded up front before doing
comparisons, @code{m4_cond} only expands a @var{test} when all earlier
tests have failed.

For an example, these two sequences give the same result, but in the
case where @samp{$1} does not contain a backslash, the @code{m4_cond}
version only expands @code{m4_index} once, instead of five times, for
faster computation if this is a common case for @samp{$1}.  Notice that
every third argument is unquoted for @code{m4_if}, and quoted for
@code{m4_cond}:

@example
m4_if(m4_index([$1], [\]), [-1], [$2],
      m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
      m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
      m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
      m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
      [$2])
m4_cond([m4_index([$1], [\])], [-1], [$2],
        [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
        [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
        [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
        [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
        [$2])
@end example
@end defmac

@defmac m4_default (@var{expr-1}, @var{expr-2})
@defmacx m4_default_quoted (@var{expr-1}, @var{expr-2})
@defmacx m4_default_nblank (@var{expr-1}, @ovar{expr-2})
@defmacx m4_default_nblank_quoted (@var{expr-1}, @ovar{expr-2})
@msindex{default}
@msindex{default_quoted}
@msindex{default_nblank}
@msindex{default_nblank_quoted}
If @var{expr-1} contains text, use it.  Otherwise, select @var{expr-2}.
@code{m4_default} expands the result, while @code{m4_default_quoted}
does not.  Useful for providing a fixed default if the expression that
results in @var{expr-1} would otherwise be empty.  The difference
between @code{m4_default} and @code{m4_default_nblank} is whether an
argument consisting of just blanks (space, tab, newline) is
significant.  When using the expanding versions, note that an argument
may contain text but still expand to an empty string.

@example
m4_define([active], [ACTIVE])dnl
m4_define([empty], [])dnl
m4_define([demo1], [m4_default([$1], [$2])])dnl
m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
demo1([active], [default])
@result{}ACTIVE
demo1([], [active])
@result{}ACTIVE
demo1([empty], [text])
@result{}
-demo1([ ], [active])-
@result{}- -
demo2([active], [default])
@result{}active
demo2([], [active])
@result{}active
demo2([empty], [text])
@result{}empty
-demo2([ ], [active])-
@result{}- -
demo3([active], [default])
@result{}ACTIVE
demo3([], [active])
@result{}ACTIVE
demo3([empty], [text])
@result{}
-demo3([ ], [active])-
@result{}-ACTIVE-
demo4([active], [default])
@result{}active
demo4([], [active])
@result{}active
demo4([empty], [text])
@result{}empty
-demo4([ ], [active])-
@result{}-active-
@end example
@end defmac

@defmac m4_define_default (@var{macro}, @ovar{default-definition})
@msindex{define_default}
If @var{macro} does not already have a definition, then define it to
@var{default-definition}.
@end defmac

@defmac m4_ifblank (@var{cond}, @ovar{if-blank}, @ovar{if-text})
@defmacx m4_ifnblank (@var{cond}, @ovar{if-text}, @ovar{if-blank})
@msindex{ifblank}
@msindex{ifnblank}
If @var{cond} is empty or consists only of blanks (space, tab, newline),
then expand @var{if-blank}; otherwise, expand @var{if-text}.  Two
variants exist, in order to make it easier to select the correct logical
sense when using only two parameters.  Note that this is more efficient
than the equivalent behavior of:
@example
m4_ifval(m4_normalize([@var{cond}]), @var{if-text}, @var{if-blank})
@end example
@end defmac

@defmac m4_ifndef (@var{macro}, @var{if-not-defined}, @ovar{if-defined})
@msindex{ifndef}
This is shorthand for:
@example
m4_ifdef([@var{macro}], [@var{if-defined}], [@var{if-not-defined}])
@end example
@end defmac

@defmac m4_ifset (@var{macro}, @ovar{if-true}, @ovar{if-false})
@msindex{ifset}
If @var{macro} is undefined, or is defined as the empty string, expand
to @var{if-false}.  Otherwise, expands to @var{if-true}.  Similar to:
@example
m4_ifval(m4_defn([@var{macro}]), [@var{if-true}], [@var{if-false}])
@end example
@noindent
except that it is not an error if @var{macro} is undefined.
@end defmac

@defmac m4_ifval (@var{cond}, @ovar{if-true}, @ovar{if-false})
@msindex{ifval}
Expands to @var{if-true} if @var{cond} is not empty, otherwise to
@var{if-false}.  This is shorthand for:
@example
m4_if([@var{cond}], [], [@var{if-false}], [@var{if-true}])
@end example
@end defmac

@defmac m4_ifvaln (@var{cond}, @ovar{if-true}, @ovar{if-false})
@msindex{ifvaln}
Similar to @code{m4_ifval}, except guarantee that a newline is present
after any non-empty expansion.  Often followed by @code{dnl}.
@end defmac

@defmac m4_n (@var{text})
@msindex{n}
Expand to @var{text}, and add a newline if @var{text} is not empty.
Often followed by @code{dnl}.
@end defmac


@node Looping constructs
@subsection Looping constructs

The following macros are useful in implementing recursive algorithms in
M4, including loop operations.  An M4 list is formed by quoting a list
of quoted elements; generally the lists are comma-separated, although
@code{m4_foreach_w} is whitespace-separated.  For example, the list
@samp{[[a], [b,c]]} contains two elements: @samp{[a]} and @samp{[b,c]}.
It is common to see lists with unquoted elements when those elements are
not likely to be macro names, as in @samp{[fputc_unlocked,
fgetc_unlocked]}.

Although not generally recommended, it is possible for quoted lists to
have side effects; all side effects are expanded only once, and prior to
visiting any list element.  On the other hand, the fact that unquoted
macros are expanded exactly once means that macros without side effects
can be used to generate lists.  For example,

@example
m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
@error{}hi
@result{}123
m4_define([list], [[1], [2], [3]])
@result{}
m4_foreach([i], [list], [i])
@result{}123
@end example

@defmac m4_argn (@var{n}, @ovar{arg}@dots{})
@msindex{argn}
Extracts argument @var{n} (larger than 0) from the remaining arguments.
If there are too few arguments, the empty string is used.  For any
@var{n} besides 1, this is more efficient than the similar
@samp{m4_car(m4_shiftn([@var{n}], [], [@var{arg}@dots{}]))}.
@end defmac

@defmac m4_car (@var{arg}@dots{})
@msindex{car}
Expands to the quoted first @var{arg}.  Can be used with @code{m4_cdr}
to recursively iterate
through a list.  Generally, when using quoted lists of quoted elements,
@code{m4_car} should be called without any extra quotes.
@end defmac

@defmac m4_cdr (@var{arg}@dots{})
@msindex{cdr}
Expands to a quoted list of all but the first @var{arg}, or the empty
string if there was only one argument.  Generally, when using quoted
lists of quoted elements, @code{m4_cdr} should be called without any
extra quotes.

For example, this is a simple implementation of @code{m4_map}; note how
each iteration checks for the end of recursion, then merely applies the
first argument to the first element of the list, then repeats with the
rest of the list.  (The actual implementation in M4sugar is a bit more
involved, to gain some speed and share code with @code{m4_map_sep}, and
also to avoid expanding side effects in @samp{$2} twice).
@example
m4_define([m4_map], [m4_ifval([$2],
  [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl
m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]])
@result{} 1 2 a
@end example
@end defmac

@defmac m4_for (@var{var}, @var{first}, @var{last}, @ovar{step}, @
  @var{expression})
@msindex{for}
Loop over the numeric values between @var{first} and @var{last}
including bounds by increments of @var{step}.  For each iteration,
expand @var{expression} with the numeric value assigned to @var{var}.
If @var{step} is omitted, it defaults to @samp{1} or @samp{-1} depending
on the order of the limits.  If given, @var{step} has to match this
order.  The number of iterations is determined independently from
definition of @var{var}; iteration cannot be short-circuited or
lengthened by modifying @var{var} from within @var{expression}.
@end defmac

@defmac m4_foreach (@var{var}, @var{list}, @var{expression})
@msindex{foreach}
Loop over the comma-separated M4 list @var{list}, assigning each value
to @var{var}, and expand @var{expression}.  The following example
outputs two lines:

@example
m4_foreach([myvar], [[foo], [bar, baz]],
           [echo myvar
])dnl
@result{}echo foo
@result{}echo bar, baz
@end example

Note that for some forms of @var{expression}, it may be faster to use
@code{m4_map_args}.
@end defmac

@anchor{m4_foreach_w}
@defmac m4_foreach_w (@var{var}, @var{list}, @var{expression})
@msindex{foreach_w}
Loop over the white-space-separated list @var{list}, assigning each value
to @var{var}, and expand @var{expression}.  If @var{var} is only
referenced once in @var{expression}, it is more efficient to use
@code{m4_map_args_w}.

The deprecated macro @code{AC_FOREACH} is an alias of
@code{m4_foreach_w}.
@end defmac

@defmac m4_map (@var{macro}, @var{list})
@defmacx m4_mapall (@var{macro}, @var{list})
@defmacx m4_map_sep (@var{macro}, @var{separator}, @var{list})
@defmacx m4_mapall_sep (@var{macro}, @var{separator}, @var{list})
@msindex{map}
@msindex{mapall}
@msindex{map_sep}
@msindex{mapall_sep}
Loop over the comma separated quoted list of argument descriptions in
@var{list}, and invoke @var{macro} with the arguments.  An argument
description is in turn a comma-separated quoted list of quoted elements,
suitable for @code{m4_apply}.  The macros @code{m4_map} and
@code{m4_map_sep} ignore empty argument descriptions, while
@code{m4_mapall} and @code{m4_mapall_sep} invoke @var{macro} with no
arguments.  The macros @code{m4_map_sep} and @code{m4_mapall_sep}
additionally expand @var{separator} between invocations of @var{macro}.

Note that @var{separator} is expanded, unlike in @code{m4_join}.  When
separating output with commas, this means that the map result can be
used as a series of arguments, by using a single-quoted comma as
@var{separator}, or as a single string, by using a double-quoted comma.

@example
m4_map([m4_count], [])
@result{}
m4_map([ m4_count], [[],
                     [[1]],
                     [[1], [2]]])
@result{} 1 2
m4_mapall([ m4_count], [[],
                        [[1]],
                        [[1], [2]]])
@result{} 0 1 2
m4_map_sep([m4_eval], [,], [[[1+2]],
                            [[10], [16]]])
@result{}3,a
m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
@result{}a,b
m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
@result{}2
m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
@result{}a,b
m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
@result{}1
@end example
@end defmac

@defmac m4_map_args (@var{macro}, @var{arg}@dots{})
@msindex{map_args}
Repeatedly invoke @var{macro} with each successive @var{arg} as its only
argument.  In the following example, three solutions are presented with
the same expansion; the solution using @code{m4_map_args} is the most
efficient.
@example
m4_define([active], [ACTIVE])dnl
m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
@result{} plain active
m4_map([ m4_echo], [[[plain]], [[active]]])
@result{} plain active
m4_map_args([ m4_echo], [plain], [active])
@result{} plain active
@end example

In cases where it is useful to operate on additional parameters besides
the list elements, the macro @code{m4_curry} can be used in @var{macro}
to supply the argument currying necessary to generate the desired
argument list.  In the following example, @code{list_add_n} is more
efficient than @code{list_add_x}.  On the other hand, using
@code{m4_map_args_sep} can be even more efficient.

@example
m4_define([list], [[1], [2], [3]])dnl
m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
dnl list_add_n(N, ARG...)
dnl Output a list consisting of each ARG added to N
m4_define([list_add_n],
[m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@@)))])dnl
list_add_n([1], list)
@result{}2,3,4
list_add_n([2], list)
@result{}3,4,5
m4_define([list_add_x],
[m4_shift(m4_foreach([var], m4_dquote(m4_shift($@@)),
  [,add([$1],m4_defn([var]))]))])dnl
list_add_x([1], list)
@result{}2,3,4
@end example
@end defmac

@defmac m4_map_args_pair (@var{macro}, @dvarv{macro-end, macro}, @
  @var{arg}@dots{})
@msindex{map_args_pair}
For every pair of arguments @var{arg}, invoke @var{macro} with two
arguments.  If there is an odd number of arguments, invoke
@var{macro-end}, which defaults to @var{macro}, with the remaining
argument.

@example
m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
@result{}, 2, 1, 3
m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
@result{}, 2, 1, [3]
m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
@result{}, 2, 1, 4, 3
@end example
@end defmac

@defmac m4_map_args_sep (@ovar{pre}, @ovar{post}, @ovar{sep}, @var{arg}@dots{})
@msindex{map_args_sep}
Expand the sequence @code{@var{pre}[@var{arg}]@var{post}} for each
argument, additionally expanding @var{sep} between arguments.  One
common use of this macro is constructing a macro call, where the opening
and closing parentheses are split between @var{pre} and @var{post}; in
particular, @code{m4_map_args([@var{macro}], [@var{arg}])} is equivalent
to @code{m4_map_args_sep([@var{macro}(], [)], [], [@var{arg}])}.  This
macro provides the most efficient means for iterating over an arbitrary
list of arguments, particularly when repeatedly constructing a macro
call with more arguments than @var{arg}.
@end defmac

@defmac m4_map_args_w (@var{string}, @ovar{pre}, @ovar{post}, @ovar{sep})
@msindex{map_args_w}
Expand the sequence @code{@var{pre}[word]@var{post}} for each word in
the whitespace-separated @var{string}, additionally expanding @var{sep}
between words.  This macro provides the most efficient means for
iterating over a whitespace-separated string.  In particular,
@code{m4_map_args_w([@var{string}], [@var{action}(], [)])} is more
efficient than @code{m4_foreach_w([var], [@var{string}],
[@var{action}(m4_defn([var]))])}.
@end defmac

@defmac m4_shiftn (@var{count}, @dots{})
@defmacx m4_shift2 (@dots{})
@defmacx m4_shift3 (@dots{})
@msindex{shift2}
@msindex{shift3}
@msindex{shiftn}
@code{m4_shiftn} performs @var{count} iterations of @code{m4_shift},
along with validation that enough arguments were passed in to match the
shift count, and that the count is positive.  @code{m4_shift2} and
@code{m4_shift3} are specializations
of @code{m4_shiftn}, introduced in Autoconf 2.62, and are more efficient
for two and three shifts, respectively.
@end defmac

@defmac m4_stack_foreach (@var{macro}, @var{action})
@defmacx m4_stack_foreach_lifo (@var{macro}, @var{action})
@msindex{stack_foreach}
@msindex{stack_foreach_lifo}
For each of the @code{m4_pushdef} definitions of @var{macro}, expand
@var{action} with the single argument of a definition of @var{macro}.
@code{m4_stack_foreach} starts with the oldest definition, while
@code{m4_stack_foreach_lifo} starts with the current definition.
@var{action} should not push or pop definitions of @var{macro}, nor is
there any guarantee that the current definition of @var{macro} matches
the argument that was passed to @var{action}.  The macro @code{m4_curry}
can be used if @var{action} needs more than one argument, although in
that case it is more efficient to use @var{m4_stack_foreach_sep}.

Due to technical limitations, there are a few low-level m4sugar
functions, such as @code{m4_pushdef}, that cannot be used as the
@var{macro} argument.

@example
m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
m4_stack_foreach([a], [ m4_incr])
@result{} 2 3
m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
@result{} cd bcd
@end example
@end defmac

@defmac m4_stack_foreach_sep (@var{macro}, @ovar{pre}, @ovar{post}, @ovar{sep})
@defmacx m4_stack_foreach_sep_lifo (@var{macro}, @ovar{pre}, @ovar{post}, @
  @ovar{sep})
@msindex{stack_foreach_sep}
@msindex{stack_foreach_sep_lifo}
Expand the sequence @code{@var{pre}[definition]@var{post}} for each
@code{m4_pushdef} definition of @var{macro}, additionally expanding
@var{sep} between definitions.  @code{m4_stack_foreach_sep} visits the
oldest definition first, while @code{m4_stack_foreach_sep_lifo} visits
the current definition first.  This macro provides the most efficient
means for iterating over a pushdef stack.  In particular,
@code{m4_stack_foreach([@var{macro}], [@var{action}])} is short for
@code{m4_stack_foreach_sep([@var{macro}], [@var{action}(], [)])}.
@end defmac

@node Evaluation Macros
@subsection Evaluation Macros

The following macros give some control over the order of the evaluation
by adding or removing levels of quotes.

@defmac m4_apply (@var{macro}, @var{list})
@msindex{apply}
Apply the elements of the quoted, comma-separated @var{list} as the
arguments to @var{macro}.  If @var{list} is empty, invoke @var{macro}
without arguments.  Note the difference between @code{m4_indir}, which
expects its first argument to be a macro name but can use names that are
otherwise invalid, and @code{m4_apply}, where @var{macro} can contain
other text, but must end in a valid macro name.
@example
m4_apply([m4_count], [])
@result{}0
m4_apply([m4_count], [[]])
@result{}1
m4_apply([m4_count], [[1], [2]])
@result{}2
m4_apply([m4_join], [[|], [1], [2]])
@result{}1|2
@end example
@end defmac

@defmac m4_count (@var{arg}, @dots{})
@msindex{count}
This macro returns the number of arguments it was passed.
@end defmac

@defmac m4_curry (@var{macro}, @var{arg}@dots{})
@msindex{curry}
This macro performs argument currying.  The expansion of this macro is
another macro name that expects exactly one argument; that argument is
then appended to the @var{arg} list, and then @var{macro} is expanded
with the resulting argument list.

@example
m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
@result{}3, 2, 1
@end example

Unfortunately, due to a limitation in M4 1.4.x, it is not possible to
pass the definition of a builtin macro as the argument to the output of
@code{m4_curry}; the empty string is used instead of the builtin token.
This behavior is rectified by using M4 1.6 or newer.
@end defmac

@defmac m4_do (@var{arg}, @dots{})
@msindex{do}
This macro loops over its arguments and expands each @var{arg} in
sequence.  Its main use is for readability; it allows the use of
indentation and fewer @code{dnl} to result in the same expansion.  This
macro guarantees that no expansion will be concatenated with subsequent
text; to achieve full concatenation, use @code{m4_unquote(m4_join([],
@var{arg@dots{}}))}.

@example
m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
m4_do([a],[b])c
@result{}abc
m4_unquote(m4_join([],[a],[b]))c
@result{}3
m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl
m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl
m4_do([a],[b])c
@result{}ABC
m4_unquote(m4_join([],[a],[b]))c
@result{}3
@end example
@end defmac

@defmac m4_dquote (@var{arg}, @dots{})
@msindex{dquote}
Return the arguments as a quoted list of quoted arguments.
Conveniently, if there is just one @var{arg}, this effectively adds a
level of quoting.
@end defmac

@defmac m4_dquote_elt (@var{arg}, @dots{})
@msindex{dquote_elt}
Return the arguments as a series of double-quoted arguments.  Whereas
@code{m4_dquote} returns a single argument, @code{m4_dquote_elt} returns
as many arguments as it was passed.
@end defmac

@defmac m4_echo (@var{arg}, @dots{})
@msindex{echo}
Return the arguments, with the same level of quoting.  Other than
discarding whitespace after unquoted commas, this macro is a no-op.
@end defmac

@defmac m4_expand (@var{arg})
@msindex{expand}
Return the expansion of @var{arg} as a quoted string.  Whereas
@code{m4_quote} is designed to collect expanded text into a single
argument, @code{m4_expand} is designed to perform one level of expansion
on quoted text.  One distinction is in the treatment of whitespace
following a comma in the original @var{arg}.  Any time multiple
arguments are collected into one with @code{m4_quote}, the M4 argument
collection rules discard the whitespace.  However, with @code{m4_expand},
whitespace is preserved, even after the expansion of macros contained in
@var{arg}.  Additionally, @code{m4_expand} is able to expand text that
would involve an unterminated comment, whereas expanding that same text
as the argument to @code{m4_quote} runs into difficulty in finding the
end of the argument.  Since manipulating diversions during argument
collection is inherently unsafe, @code{m4_expand} issues an error if
@var{arg} attempts to change the current diversion (@pxref{Diversion
support}).

@example
m4_define([active], [ACT, IVE])dnl
m4_define([active2], [[ACT, IVE]])dnl
m4_quote(active, active)
@result{}ACT,IVE,ACT,IVE
m4_expand([active, active])
@result{}ACT, IVE, ACT, IVE
m4_quote(active2, active2)
@result{}ACT, IVE,ACT, IVE
m4_expand([active2, active2])
@result{}ACT, IVE, ACT, IVE
m4_expand([# m4_echo])
@result{}# m4_echo
m4_quote(# m4_echo)
)
@result{}# m4_echo)
@result{}
@end example

Note that @code{m4_expand} cannot handle an @var{arg} that expands to
literal unbalanced quotes, but that quadrigraphs can be used when
unbalanced output is necessary.  Likewise, unbalanced parentheses should
be supplied with double quoting or a quadrigraph.

@example
m4_define([pattern], [[!@@<:@@]])dnl
m4_define([bar], [BAR])dnl
m4_expand([case $foo in
  m4_defn([pattern])@@:@}@@ bar ;;
  *[)] blah ;;
esac])
@result{}case $foo in
@result{}  [![]) BAR ;;
@result{}  *) blah ;;
@result{}esac
@end example
@end defmac

@defmac m4_ignore (@dots{})
@msindex{ignore}
This macro was introduced in Autoconf 2.62.  Expands to nothing,
ignoring all of its arguments.  By itself, this isn't very useful.
However, it can be used to conditionally ignore an arbitrary number of
arguments, by deciding which macro name to apply to a list of arguments.
@example
dnl foo outputs a message only if [debug] is defined.
m4_define([foo],
[m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])
@end example

Note that for earlier versions of Autoconf, the macro @code{__gnu__} can
serve the same purpose, although it is less readable.
@end defmac

@defmac m4_make_list (@var{arg}, @dots{})
@msindex{make_list}
This macro exists to aid debugging of M4sugar algorithms.  Its net
effect is similar to @code{m4_dquote}---it produces a quoted list of
quoted arguments, for each @var{arg}.  The difference is that this
version uses a comma-newline separator instead of just comma, to improve
readability of the list; with the result that it is less efficient than
@code{m4_dquote}.
@example
m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
m4_dquote(zero, [one], [[two]])
@result{}[0],[one],[[two]]
m4_make_list(zero, [one], [[two]])
@result{}[0],
@result{}[one],
@result{}[[two]]
m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
@result{} 0 1 two
m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
@result{} 0 1 two
@end example
@end defmac

@c m4_noquote is too dangerous to document - it invokes macros that
@c probably rely on @samp{[]} nested quoting for proper operation.  The
@c user should generally prefer m4_unquote instead.

@defmac m4_quote (@var{arg}, @dots{})
@msindex{quote}
Return the arguments as a single entity, i.e., wrap them into a pair of
quotes.  This effectively collapses multiple arguments into one,
although it loses whitespace after unquoted commas in the process.
@end defmac

@defmac m4_reverse (@var{arg}, @dots{})
@msindex{reverse}
Outputs each argument with the same level of quoting, but in reverse
order, and with space following each comma for readability.

@example
m4_define([active], [ACT,IVE])
@result{}
m4_reverse(active, [active])
@result{}active, IVE, ACT
@end example
@end defmac

@defmac m4_unquote (@var{arg}, @dots{})
@msindex{unquote}
This macro was introduced in Autoconf 2.62.  Expand each argument,
separated by commas.  For a single @var{arg}, this effectively removes a
layer of quoting, and @code{m4_unquote([@var{arg}])} is more efficient
than the equivalent @code{m4_do([@var{arg}])}.  For multiple arguments,
this results in an unquoted list of expansions.  This is commonly used
with @code{m4_split}, in order to convert a single quoted list into a
series of quoted elements.
@end defmac

The following example aims at emphasizing the difference between several
scenarios: not using these macros, using @code{m4_defn}, using
@code{m4_quote}, using @code{m4_dquote}, and using @code{m4_expand}.

@example
$ @kbd{cat example.m4}
dnl Overquote, so that quotes are visible.
m4_define([show], [$[]1 = [$1], $[]@@ = [$@@]])
m4_define([a], [A])
m4_define([mkargs], [1, 2[,] 3])
m4_define([arg1], [[$1]])
m4_divert([0])dnl
show(a, b)
show([a, b])
show(m4_quote(a, b))
show(m4_dquote(a, b))
show(m4_expand([a, b]))

arg1(mkargs)
arg1([mkargs])
arg1(m4_defn([mkargs]))
arg1(m4_quote(mkargs))
arg1(m4_dquote(mkargs))
arg1(m4_expand([mkargs]))
$ @kbd{autom4te -l m4sugar example.m4}
$1 = A, $@@ = [A],[b]
$1 = a, b, $@@ = [a, b]
$1 = A,b, $@@ = [A,b]
$1 = [A],[b], $@@ = [[A],[b]]
$1 = A, b, $@@ = [A, b]

1
mkargs
1, 2[,] 3
1,2, 3
[1],[2, 3]
1, 2, 3
@end example


@node Text processing Macros
@subsection String manipulation in M4

The following macros may be used to manipulate strings in M4.  Many of
the macros in this section intentionally result in quoted strings as
output, rather than subjecting the arguments to further expansions.  As
a result, if you are manipulating text that contains active M4
characters, the arguments are passed with single quoting rather than
double.

@defmac m4_append (@var{macro-name}, @var{string}, @ovar{separator})
@defmacx m4_append_uniq (@var{macro-name}, @var{string}, @ovar{separator} @
  @ovar{if-uniq}, @ovar{if-duplicate})
@msindex{append}
@msindex{append_uniq}
Redefine @var{macro-name} to its former contents with @var{separator}
and @var{string} added at the end.  If @var{macro-name} was undefined
before (but not if it was defined but empty), then no @var{separator} is
added.  As of Autoconf 2.62, neither @var{string} nor @var{separator}
are expanded during this macro; instead, they are expanded when
@var{macro-name} is invoked.

@code{m4_append} can be used to grow strings, and @code{m4_append_uniq}
to grow strings without duplicating substrings.  Additionally,
@code{m4_append_uniq} takes two optional parameters as of Autoconf 2.62;
@var{if-uniq} is expanded if @var{string} was appended, and
@var{if-duplicate} is expanded if @var{string} was already present.
Also, @code{m4_append_uniq} warns if @var{separator} is not empty, but
occurs within @var{string}, since that can lead to duplicates.

Note that @code{m4_append} can scale linearly in the length of the final
string, depending on the quality of the underlying M4 implementation,
while @code{m4_append_uniq} has an inherent quadratic scaling factor.
If an algorithm can tolerate duplicates in the final string, use the
former for speed.  If duplicates must be avoided, consider using
@code{m4_set_add} instead (@pxref{Set manipulation Macros}).

@example
m4_define([active], [ACTIVE])dnl
m4_append([sentence], [This is an])dnl
m4_append([sentence], [ active ])dnl
m4_append([sentence], [symbol.])dnl
sentence
@result{}This is an ACTIVE symbol.
m4_undefine([active])dnl
@result{}This is an active symbol.
m4_append_uniq([list], [one], [, ], [new], [existing])
@result{}new
m4_append_uniq([list], [one], [, ], [new], [existing])
@result{}existing
m4_append_uniq([list], [two], [, ], [new], [existing])
@result{}new
m4_append_uniq([list], [three], [, ], [new], [existing])
@result{}new
m4_append_uniq([list], [two], [, ], [new], [existing])
@result{}existing
list
@result{}one, two, three
m4_dquote(list)
@result{}[one],[two],[three]
m4_append([list2], [one], [[, ]])dnl
m4_append_uniq([list2], [two], [[, ]])dnl
m4_append([list2], [three], [[, ]])dnl
list2
@result{}one, two, three
m4_dquote(list2)
@result{}[one, two, three]
@end example
@end defmac

@defmac m4_append_uniq_w (@var{macro-name}, @var{strings})
@msindex{append_uniq_w}
This macro was introduced in Autoconf 2.62.  It is similar to
@code{m4_append_uniq}, but treats @var{strings} as a whitespace
separated list of words to append, and only appends unique words.
@var{macro-name} is updated with a single space between new words.
@example
m4_append_uniq_w([numbers], [1 1 2])dnl
m4_append_uniq_w([numbers], [ 2 3 ])dnl
numbers
@result{}1 2 3
@end example
@end defmac

@defmac m4_chomp (@var{string})
@defmacx m4_chomp_all (@var{string})
@msindex{chomp}
@msindex{chomp_all}
Output @var{string} in quotes, but without a trailing newline.  The
macro @code{m4_chomp} is slightly faster, and removes at most one
newline; the macro @code{m4_chomp_all} removes all consecutive trailing
newlines.  Unlike @code{m4_flatten}, embedded newlines are left intact,
and backslash does not influence the result.
@end defmac

@defmac m4_combine (@ovar{separator}, @var{prefix-list}, @ovar{infix}, @
  @var{suffix-1}, @ovar{suffix-2}, @dots{})
@msindex{combine}
This macro produces a quoted string containing the pairwise combination
of every element of the quoted, comma-separated @var{prefix-list}, and
every element from the @var{suffix} arguments.  Each pairwise
combination is joined with @var{infix} in the middle, and successive
pairs are joined by @var{separator}.  No expansion occurs on any of the
arguments.  No output occurs if either the @var{prefix} or @var{suffix}
list is empty, but the lists can contain empty elements.
@example
m4_define([a], [oops])dnl
m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
@result{}a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
m4_combine([, ], [[a], [b]], [-])
@result{}
m4_combine([, ], [[a], [b]], [-], [])
@result{}a-, b-
m4_combine([, ], [], [-], [1], [2])
@result{}
m4_combine([, ], [[]], [-], [1], [2])
@result{}-1, -2
@end example
@end defmac

@defmac m4_escape (@var{string})
@msindex{escape}
Convert all instances of @samp{[}, @samp{]}, @samp{#}, and @samp{$}
within @var{string} into their respective quadrigraphs.  The result is
still a quoted string.
@end defmac

@defmac m4_flatten (@var{string})
@msindex{flatten}
Flatten @var{string} into a single line.  Delete all backslash-newline
pairs, and replace all remaining newlines with a space.  The result is
still a quoted string.
@end defmac

@defmac m4_join (@ovar{separator}, @var{args}@dots{})
@defmacx m4_joinall (@ovar{separator}, @var{args}@dots{})
@msindex{join}
@msindex{joinall}
Concatenate each @var{arg}, separated by @var{separator}.
@code{joinall} uses every argument, while @code{join} omits empty
arguments so that there are no back-to-back separators in the output.
The result is a quoted string.
@example
m4_define([active], [ACTIVE])dnl
m4_join([|], [one], [], [active], [two])
@result{}one|active|two
m4_joinall([|], [one], [], [active], [two])
@result{}one||active|two
@end example

Note that if all you intend to do is join @var{args} with commas between
them, to form a quoted list suitable for @code{m4_foreach}, it is more
efficient to use @code{m4_dquote}.
@end defmac

@defmac m4_newline (@ovar{text})
@msindex{newline}
This macro was introduced in Autoconf 2.62, and expands to a newline,
followed by any @var{text}.
It is primarily useful for maintaining macro formatting, and ensuring
that M4 does not discard leading whitespace during argument collection.
@end defmac

@defmac m4_normalize (@var{string})
@msindex{normalize}
Remove leading and trailing spaces and tabs, sequences of
backslash-then-newline, and replace multiple spaces, tabs, and newlines
with a single space.  This is a combination of @code{m4_flatten} and
@code{m4_strip}.  To determine if @var{string} consists only of bytes
that would be removed by @code{m4_normalize}, you can use
@code{m4_ifblank}.
@end defmac

@defmac m4_re_escape (@var{string})
@msindex{re_escape}
Backslash-escape all characters in @var{string} that are active in
regexps.
@end defmac

@c We cannot use @dvar because the macro expansion mistreats backslashes.
@defmac m4_split (@var{string}, @r{[}@var{regexp} = @samp{[\t ]+}@r{]})
@msindex{split}
Split @var{string} into an M4 list of elements quoted by @samp{[} and
@samp{]}, while keeping white space at the beginning and at the end.
If @var{regexp} is given, use it instead of @samp{[\t ]+} for splitting.
If @var{string} is empty, the result is an empty list.
@end defmac

@defmac m4_strip (@var{string})
@msindex{strip}
Strip whitespace from @var{string}.  Sequences of spaces and tabs are
reduced to a single space, then leading and trailing spaces are removed.
The result is still a quoted string.  Note that this does not interfere
with newlines; if you want newlines stripped as well, consider
@code{m4_flatten}, or do it all at once with @code{m4_normalize}.  To
quickly test if @var{string} has only whitespace, use @code{m4_ifblank}.
@end defmac

@defmac m4_text_box (@var{message}, @dvar{frame, -})
@msindex{text_box}
Add a text box around @var{message}, using @var{frame} as the border
character above and below the message.  The @var{frame} argument must be
a single byte, and does not support quadrigraphs.
The frame correctly accounts for
the subsequent expansion of @var{message}.  For example:
@example
m4_define([macro], [abc])dnl
m4_text_box([macro])
@result{}## --- ##
@result{}## abc ##
@result{}## --- ##
@end example

The @var{message} must contain balanced quotes and parentheses, although
quadrigraphs can be used to work around this.
@end defmac

@defmac m4_text_wrap (@var{string}, @ovar{prefix}, @
  @dvarv{prefix1, prefix}, @dvar{width, 79})
@msindex{text_wrap}
Break @var{string} into a series of whitespace-separated words, then
output those words separated by spaces, and wrapping lines any time the
output would exceed @var{width} columns.  If given, @var{prefix1} begins
the first line, and @var{prefix} begins all wrapped lines.  If
@var{prefix1} is longer than @var{prefix}, then the first line consists
of just @var{prefix1}.  If @var{prefix} is longer than @var{prefix1},
padding is inserted so that the first word of @var{string} begins at the
same indentation as all wrapped lines.  Note that using literal tab
characters in any of the arguments will interfere with the calculation
of width.  No expansions occur on @var{prefix}, @var{prefix1}, or the
words of @var{string}, although quadrigraphs are recognized.

For some examples:
@example
m4_text_wrap([Short string */], [   ], [/* ], [20])
@result{}/* Short string */
m4_text_wrap([Much longer string */], [   ], [/* ], [20])
@result{}/* Much longer
@result{}   string */
m4_text_wrap([Short doc.], [          ], [  --short ], [30])
@result{}  --short Short doc.
m4_text_wrap([Short doc.], [          ], [  --too-wide ], [30])
@result{}  --too-wide
@result{}          Short doc.
m4_text_wrap([Super long documentation.], [     ],
             [  --too-wide ], 30)
@result{}  --too-wide
@result{}     Super long
@result{}     documentation.
@end example
@end defmac

@defmac m4_tolower (@var{string})
@defmacx m4_toupper (@var{string})
@msindex{tolower}
@msindex{toupper}
Return @var{string} with letters converted to upper or lower case,
respectively.
@end defmac

@node Number processing Macros
@subsection Arithmetic computation in M4

The following macros facilitate integer arithmetic operations.

Where a parameter is documented as taking an arithmetic expression, you
can use anything that can be parsed by @code{m4_eval}.
Any other numeric parameter should consist of an optional sign followed
by one or more decimal digits; it is treated as a decimal integer.

Macros that expand to a number do so as either @samp{0}, or an optional
@samp{-} followed by a nonzero decimal digit followed by zero or more
decimal digits.

Due to @command{m4} limitations, arithmetic expressions and numeric
parameters should use only numbers that fit into a 32-bit signed
integer.

@defmac m4_cmp (@var{expr-1}, @var{expr-2})
@msindex{cmp}
Compare the arithmetic expressions @var{expr-1} and @var{expr-2}, and
expand to @samp{-1} if @var{expr-1} is smaller, @samp{0} if they are
equal, and @samp{1} if @var{expr-1} is larger.
@end defmac

@defmac m4_list_cmp (@var{list-1}, @var{list-2})
@msindex{list_cmp}
Compare the two M4 lists consisting of comma-separated arithmetic
expressions, left to right.  Expand to @samp{-1} for the first element
pairing where the value from @var{list-1} is smaller, @samp{1} where the
value from @var{list-2} is smaller, or @samp{0} if both lists have the
same values.  If one list is shorter than the other, the remaining
elements of the longer list are compared against zero.
@example
m4_list_cmp([1, 0],       [1])
@result{}0
m4_list_cmp([1, [1 * 0]], [1, 0])
@result{}0
m4_list_cmp([1, 2],       [1, 0])
@result{}1
m4_list_cmp([1, [1+1], 3],[1, 2])
@result{}1
m4_list_cmp([1, 2, -3],   [1, 2])
@result{}-1
m4_list_cmp([1, 0],       [1, 2])
@result{}-1
m4_list_cmp([1],          [1, 2])
@result{}-1
@end example
@end defmac

@defmac m4_max (@var{arg}, @dots{})
@msindex{max}
This macro was introduced in Autoconf 2.62.  Expand to the value
of the maximum arithmetic expression among all the arguments.
@end defmac

@defmac m4_min (@var{arg}, @dots{})
@msindex{min}
This macro was introduced in Autoconf 2.62.  Expand to the value
of the minimum arithmetic expression among all the arguments.
@end defmac

@defmac m4_sign (@var{expr})
@msindex{sign}
Expand to @samp{-1} if the arithmetic expression @var{expr} is negative,
@samp{1} if it is positive, and @samp{0} if it is zero.
@end defmac

@anchor{m4_version_compare}
@defmac m4_version_compare (@var{version-1}, @var{version-2})
@msindex{version_compare}
This macro was introduced in Autoconf 2.53, but had a number of
usability limitations that were not lifted until Autoconf 2.62.  Compare
the version strings @var{version-1} and @var{version-2}, and expand to
@samp{-1} if @var{version-1} is smaller, @samp{0} if they are the same,
or @samp{1} @var{version-2} is smaller.  Version strings must be a list
of elements separated by @samp{.}, @samp{,} or @samp{-}, where each
element is a number along with optional case-insensitive letters
designating beta releases.  The comparison stops at the leftmost element
that contains a difference, although a 0 element compares equal to a
missing element.

It is permissible to include commit identifiers in @var{version}, such
as an abbreviated SHA1 of the commit, provided there is still a
monotonically increasing prefix to allow for accurate version-based
comparisons.  For example, this paragraph was written when the
development snapshot of autoconf claimed to be at version
@samp{2.61a-248-dc51}, or 248 commits after the 2.61a release, with an
abbreviated commit identification of @samp{dc51}.

@example
m4_version_compare([1.1], [2.0])
@result{}-1
m4_version_compare([2.0b], [2.0a])
@result{}1
m4_version_compare([1.1.1], [1.1.1a])
@result{}-1
m4_version_compare([1.2], [1.1.1a])
@result{}1
m4_version_compare([1.0], [1])
@result{}0
m4_version_compare([1.1pre], [1.1PRE])
@result{}0
m4_version_compare([1.1a], [1,10])
@result{}-1
m4_version_compare([2.61a], [2.61a-248-dc51])
@result{}-1
m4_version_compare([2.61b], [2.61a-248-dc51])
@result{}1
@end example
@end defmac

@defmac m4_version_prereq (@var{version}, @ovar{if-new-enough}, @
  @dvar{if-old, m4_fatal})
@msindex{version_prereq}
Compares @var{version} against the version of Autoconf currently
running.  If the running version is at @var{version} or newer, expand
@var{if-new-enough}, but if @var{version} is larger than the version
currently executing, expand @var{if-old}, which defaults to printing an
error message and exiting m4sugar with status 63.  When given only one
argument, this behaves like @code{AC_PREREQ} (@pxref{Versioning}).
Remember that the autoconf philosophy favors feature checks over version
checks.
@end defmac

@node Set manipulation Macros
@subsection Set manipulation in M4
@cindex Set manipulation
@cindex Data structure, set
@cindex Unordered set manipulation

Sometimes, it is necessary to track a set of data, where the order does
not matter and where there are no duplicates in the set.  The following
macros facilitate set manipulations.  Each set is an opaque object,
which can only be accessed via these basic operations.  The underlying
implementation guarantees linear scaling for set creation, which is more
efficient than using the quadratic @code{m4_append_uniq}.  Both set
names and values can be arbitrary strings, except for unbalanced quotes.
This implementation ties up memory for removed elements until the next
operation that must traverse all the elements of a set; and although
that may slow down some operations until the memory for removed elements
is pruned, it still guarantees linear performance.

@defmac m4_set_add (@var{set}, @var{value}, @ovar{if-uniq}, @ovar{if-dup})
@msindex{set_add}
Adds the string @var{value} as a member of set @var{set}.  Expand
@var{if-uniq} if the element was added, or @var{if-dup} if it was
previously in the set.  Operates in amortized constant time, so that set
creation scales linearly.
@end defmac

@defmac m4_set_add_all (@var{set}, @var{value}@dots{})
@msindex{set_add_all}
Adds each @var{value} to the set @var{set}.  This is slightly more
efficient than repeatedly invoking @code{m4_set_add}.
@end defmac

@defmac m4_set_contains (@var{set}, @var{value}, @ovar{if-present}, @
 @ovar{if-absent})
@msindex{set_contains}
Expands @var{if-present} if the string @var{value} is a member of
@var{set}, otherwise @var{if-absent}.

@example
m4_set_contains([a], [1], [yes], [no])
@result{}no
m4_set_add([a], [1], [added], [dup])
@result{}added
m4_set_add([a], [1], [added], [dup])
@result{}dup
m4_set_contains([a], [1], [yes], [no])
@result{}yes
m4_set_remove([a], [1], [removed], [missing])
@result{}removed
m4_set_contains([a], [1], [yes], [no])
@result{}no
m4_set_remove([a], [1], [removed], [missing])
@result{}missing
@end example
@end defmac

@defmac m4_set_contents (@var{set}, @ovar{sep})
@defmacx m4_set_dump (@var{set}, @ovar{sep})
@msindex{set_contents}
@msindex{set_dump}
Expands to a single string consisting of all the members of the set
@var{set}, each separated by @var{sep}, which is not expanded.
@code{m4_set_contents} leaves the elements in @var{set} but reclaims any
memory occupied by removed elements, while @code{m4_set_dump} is a
faster one-shot action that also deletes the set.  No provision is made
for disambiguating members that contain a non-empty @var{sep} as a
substring; use @code{m4_set_empty} to distinguish between an empty set
and the set containing only the empty string.  The order of the output
is unspecified; in the current implementation, part of the speed of
@code{m4_set_dump} results from using a different output order than
@code{m4_set_contents}.  These macros scale linearly in the size of the
set before memory pruning, and @code{m4_set_contents([@var{set}],
[@var{sep}])} is faster than
@code{m4_joinall([@var{sep}]m4_set_listc([@var{set}]))}.

@example
m4_set_add_all([a], [1], [2], [3])
@result{}
m4_set_contents([a], [-])
@result{}1-2-3
m4_joinall([-]m4_set_listc([a]))
@result{}1-2-3
m4_set_dump([a], [-])
@result{}3-2-1
m4_set_contents([a])
@result{}
m4_set_add([a], [])
@result{}
m4_set_contents([a], [-])
@result{}
@end example
@end defmac

@defmac m4_set_delete (@var{set})
@msindex{set_delete}
Delete all elements and memory associated with @var{set}.  This is
linear in the set size, and faster than removing one element at a time.
@end defmac

@defmac m4_set_difference (@var{seta}, @var{setb})
@defmacx m4_set_intersection (@var{seta}, @var{setb})
@defmacx m4_set_union (@var{seta}, @var{setb})
@msindex{set_difference}
@msindex{set_intersection}
@msindex{set_union}
Compute the relation between @var{seta} and @var{setb}, and output the
result as a list of quoted arguments without duplicates and with a
leading comma.  Set difference selects the elements in @var{seta} but
not @var{setb}, intersection selects only elements in both sets, and
union selects elements in either set.  These actions are linear in the
sum of the set sizes.  The leading comma is necessary to distinguish
between no elements and the empty string as the only element.

@example
m4_set_add_all([a], [1], [2], [3])
@result{}
m4_set_add_all([b], [3], [], [4])
@result{}
m4_set_difference([a], [b])
@result{},1,2
m4_set_difference([b], [a])
@result{},,4
m4_set_intersection([a], [b])
@result{},3
m4_set_union([a], [b])
@result{},1,2,3,,4
@end example
@end defmac

@defmac m4_set_empty (@var{set}, @ovar{if-empty}, @ovar{if-elements})
@msindex{set_empty}
Expand @var{if-empty} if the set @var{set} has no elements, otherwise
expand @var{if-elements}.  This macro operates in constant time.  Using
this macro can help disambiguate output from @code{m4_set_contents} or
@code{m4_set_list}.
@end defmac

@defmac m4_set_foreach (@var{set}, @var{variable}, @var{action})
@msindex{set_foreach}
For each element in the set @var{set}, expand @var{action} with the
macro @var{variable} defined as the set element.  Behavior is
unspecified if @var{action} recursively lists the contents of @var{set}
(although listing other sets is acceptable), or if it modifies the set
in any way other than removing the element currently contained in
@var{variable}.  This macro is faster than the corresponding
@code{m4_foreach([@var{variable}],
m4_indir([m4_dquote]m4_set_listc([@var{set}])), [@var{action}])},
although @code{m4_set_map} might be faster still.

@example
m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
@result{}
m4_set_contents([a])
@result{}12345
m4_set_foreach([a], [i],
  [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
@result{}24
m4_set_contents([a])
@result{}135
@end example
@end defmac

@defmac m4_set_list (@var{set})
@defmacx m4_set_listc (@var{set})
@msindex{set_list}
@msindex{set_listc}
Produce a list of arguments, where each argument is a quoted element
from the set @var{set}.  The variant @code{m4_set_listc} is unambiguous,
by adding a leading comma if there are any set elements, whereas the
variant @code{m4_set_list} cannot distinguish between an empty set and a
set containing only the empty string.  These can be directly used in
macros that take multiple arguments, such as @code{m4_join} or
@code{m4_set_add_all}, or wrapped by @code{m4_dquote} for macros that
take a quoted list, such as @code{m4_map} or @code{m4_foreach}.  Any
memory occupied by removed elements is reclaimed during these macros.

@example
m4_set_add_all([a], [1], [2], [3])
@result{}
m4_set_list([a])
@result{}1,2,3
m4_set_list([b])
@result{}
m4_set_listc([b])
@result{}
m4_count(m4_set_list([b]))
@result{}1
m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
@result{}0
m4_set_add([b], [])
@result{}
m4_set_list([b])
@result{}
m4_set_listc([b])
@result{},
m4_count(m4_set_list([b]))
@result{}1
m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
@result{}1
@end example
@end defmac

@defmac m4_set_map (@var{set}, @var{action})
@msindex{set_map}
For each element in the set @var{set}, expand @var{action} with a single
argument of the set element.  Behavior is unspecified if @var{action}
recursively lists the contents of @var{set} (although listing other sets
is acceptable), or if it modifies the set in any way other than removing
the element passed as an argument.  This macro is faster than either
corresponding counterpart of
@code{m4_map_args([@var{action}]m4_set_listc([@var{set}]))} or
@code{m4_set_foreach([@var{set}], [var],
[@var{action}(m4_defn([var]))])}.  It is possible to use @code{m4_curry}
if more than one argument is needed for @var{action}, although it is
more efficient to use @code{m4_set_map_sep} in that case.
@end defmac

@defmac m4_set_map_sep (@var{set}, @ovar{pre}, @ovar{post}, @ovar{sep})
@msindex{set_map_sep}
For each element in the set @var{set}, expand
@code{@var{pre}[element]@var{post}}, additionally expanding @var{sep}
between elements.  Behavior is unspecified if the expansion recursively
lists the contents of @var{set} (although listing other sets
is acceptable), or if it modifies the set in any way other than removing
the element visited by the expansion.  This macro provides the most
efficient means for non-destructively visiting the elements of a set; in
particular, @code{m4_set_map([@var{set}], [@var{action}])} is equivalent
to @code{m4_set_map_sep([@var{set}], [@var{action}(], [)])}.
@end defmac

@defmac m4_set_remove (@var{set}, @var{value}, @ovar{if-present}, @
 @ovar{if-absent})
@msindex{set_remove}
If @var{value} is an element in the set @var{set}, then remove it and
expand @var{if-present}.  Otherwise expand @var{if-absent}.  This macro
operates in constant time so that multiple removals will scale linearly
rather than quadratically; but when used outside of
@code{m4_set_foreach} or @code{m4_set_map}, it leaves memory occupied
until the set is later
compacted by @code{m4_set_contents} or @code{m4_set_list}.  Several
other set operations are then less efficient between the time of element
removal and subsequent memory compaction, but still maintain their
guaranteed scaling performance.
@end defmac

@defmac m4_set_size (@var{set})
@msindex{set_size}
Expand to the size of the set @var{set}.  This implementation operates
in constant time, and is thus more efficient than
@code{m4_eval(m4_count(m4_set_listc([set])) - 1)}.
@end defmac


@node Forbidden Patterns
@subsection Forbidden Patterns
@cindex Forbidden patterns
@cindex Patterns, forbidden

M4sugar provides a means to define suspicious patterns, patterns
describing tokens which should not be found in the output.  For
instance, if an Autoconf @file{configure} script includes tokens such as
@samp{AC_DEFINE}, or @samp{dnl}, then most probably something went
wrong (typically a macro was not evaluated because of overquotation).

M4sugar forbids all the tokens matching @samp{^_?m4_} and @samp{^dnl$}.
Additional layers, such as M4sh and Autoconf, add additional forbidden
patterns to the list.

@defmac m4_pattern_forbid (@var{pattern})
@msindex{pattern_forbid}
Declare that no token matching @var{pattern} must be found in the
output.  The output file is (temporarily) split into one word per line
as part of the @command{autom4te} post-processing, with each line (and
therefore word) then being checked against the Perl regular expression
@var{pattern}.  If the regular expression matches, and
@code{m4_pattern_allow} does not also match, then an error is raised.

Comments are not checked; this can be a problem if, for instance, you
have some macro left unexpanded after an @samp{#include}.  No consensus
is currently found in the Autoconf community, as some people consider it
should be valid to name macros in comments (which doesn't make sense to
the authors of this documentation: input, such as macros, should be
documented by @samp{dnl} comments; reserving @samp{#}-comments to
document the output).

As an example, if you define your own macros that begin with @samp{M_}
and are composed from capital letters and underscores, the specification
of @code{m4_pattern_forbid([^M_[A-Z_]+])} will ensure all your macros
are expanded when not used in comments.

As an example of a common use of this macro, consider what happens in
packages that want to use the @command{pkg-config} script via the
third-party @code{PKG_CHECK_MODULES} macro.  By default, if a developer
checks out the development tree but has not yet installed the pkg-config
macros locally, they can manage to successfully run @command{autoconf}
on the package, but the resulting @file{configure} file will likely
result in a confusing shell message about a syntax error on the line
mentioning the unexpanded @code{PKG_CHECK_MODULES} macro.  On the other hand,
if @file{configure.ac} includes @code{m4_pattern_forbid([^PKG_])}, the
missing pkg-config macros will be detected immediately without allowing
@command{autoconf} to succeed.
@end defmac

Of course, you might encounter exceptions to these generic rules, for
instance you might have to refer to @samp{$m4_flags}.

@defmac m4_pattern_allow (@var{pattern})
@msindex{pattern_allow}
Any token matching @var{pattern} is allowed, including if it matches an
@code{m4_pattern_forbid} pattern.

For example, Gnulib uses @code{m4_pattern_forbid([^gl_])} to reserve the
@code{gl_} namespace for itself, but also uses
@code{m4_pattern_allow([^gl_ES$])} to avoid a false negative on the
valid locale name.
@end defmac

@node Debugging via autom4te
@section Debugging via autom4te
@cindex debugging tips
@cindex autom4te debugging tips
@cindex m4sugar debugging tips
At times, it is desirable to see what was happening inside m4, to see
why output was not matching expectations.  However, post-processing done
by @command{autom4te} means that directly using the m4 builtin
@code{m4_traceon} is likely to interfere with operation.  Also, frequent
diversion changes and the concept of forbidden tokens make it difficult
to use @code{m4_defn} to generate inline comments in the final output.

There are a couple of tools to help with this.  One is the use of the
@option{--trace} option provided by @command{autom4te} (as well as each
of the programs that wrap @command{autom4te}, such as
@command{autoconf}), in order to inspect when a macro is called and with
which arguments.  For example, when this paragraph was written, the
autoconf version could be found by:

@example
$ @kbd{autoconf --trace=AC_INIT}
configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@@gnu.org
$ @kbd{autoconf --trace='AC_INIT:version is $2'}
version is 2.63b.95-3963
@end example

Another trick is to print out the expansion of various m4 expressions to
standard error or to an independent file, with no further m4 expansion,
and without interfering with diversion changes or the post-processing
done to standard output.  @code{m4_errprintn} shows a given expression
on standard error.  For example, if you want to see the expansion of an
autoconf primitive or of one of your autoconf macros, you can do it like
this:

@example
$ @kbd{cat <<\EOF > configure.ac}
AC_INIT
m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
AC_OUTPUT
EOF
$ @kbd{autoconf}
@error{}The definition of AC_DEFINE_UNQUOTED:
@error{}_AC_DEFINE_Q([], $@@)
@end example

@node Programming in M4sh
@chapter Programming in M4sh

M4sh, pronounced ``mash'', is aiming at producing portable Bourne shell
scripts.  This name was coined by Lars J. Aas, who notes that,
according to the Webster's Revised Unabridged Dictionary (1913):

@quotation
Mash \Mash\, n.  [Akin to G. meisch, maisch, meische, maische, mash,
wash, and prob.@: to AS. miscian to mix.  See ``Mix''.]

@enumerate 1
@item
A mass of mixed ingredients reduced to a soft pulpy state by beating or
pressure@enddots{}

@item
A mixture of meal or bran and water fed to animals.

@item
A mess; trouble.  [Obs.] --Beau.@: & Fl.
@end enumerate
@end quotation

M4sh reserves the M4 macro namespace @samp{^_AS_} for internal use, and
the namespace @samp{^AS_} for M4sh macros.  It also reserves the shell
and environment variable namespace @samp{^as_}, and the here-document
delimiter namespace @samp{^_AS[A-Z]} in the output file.  You should not
define your own macros or output shell code that conflicts with these
namespaces.

@menu
* Common Shell Constructs::     Portability layer for common shell constructs
* Polymorphic Variables::       Support for indirect variable names
* Initialization Macros::       Macros to establish a sane shell environment
* File Descriptor Macros::      File descriptor macros for input and output
@end menu

@node Common Shell Constructs
@section Common Shell Constructs

M4sh provides portable alternatives for some common shell constructs
that unfortunately are not portable in practice.

@c Deprecated, to be replaced by a better API
@ignore
@defmac AS_BASENAME (@var{file-name})
@asindex{BASENAME}
Output the non-directory portion of @var{file-name}.  For example,
if @code{$file} is @samp{/one/two/three}, the command
@code{base=`AS_BASENAME(["$file"])`} sets @code{base} to @samp{three}.
@end defmac
@end ignore

@defmac AS_BOX (@var{text}, @dvar{char, -})
@asindex{BOX}
Expand into shell code that will output @var{text} surrounded by a box
with @var{char} in the top and bottom border.  @var{text} should not
contain a newline, but may contain shell expansions valid for unquoted
here-documents.  @var{char} defaults to @samp{-}, but can be any
character except @samp{/}, @samp{'}, @samp{"}, @samp{\},
@samp{&}, or @samp{`}.  This is useful for outputting a comment box into
log files to separate distinct phases of script operation.
@end defmac

@defmac AS_CASE (@var{word}, @ovar{pattern1}, @ovar{if-matched1}, @
  @dots{}, @ovar{default})
@asindex{CASE}
Expand into a shell @samp{case} statement, where @var{word} is matched
against one or more patterns.  @var{if-matched} is run if the
corresponding pattern matched @var{word}, else @var{default} is run.
@xref{Prerequisite Macros} for why
this macro should be used instead of plain @samp{case} in code
outside of an @code{AC_DEFUN} macro, when the contents of the
@samp{case} use @code{AC_REQUIRE} directly or indirectly.
@xref{case, , Limitations of Shell Builtins},
for how this macro avoids some portability issues.
@xref{Balancing Parentheses}
for how this macro lets you write code with balanced parentheses
even if your code must run on obsolescent shells.
@end defmac

@c Deprecated, to be replaced by a better API
@defmac AS_DIRNAME (@var{file-name})
@asindex{DIRNAME}
Output the directory portion of @var{file-name}.  For example,
if @code{$file} is @samp{/one/two/three}, the command
@code{dir=`AS_DIRNAME(["$file"])`} sets @code{dir} to @samp{/one/two}.

@code{AS_DIRNAME} was designed long ago when
the @command{dirname} command was not universally supported.
Nowadays one can safely use @code{dir=`dirname -- "$file"`} instead.
This interface may be improved in the future to avoid forks and losing
trailing newlines.
@end defmac

@defmac AS_ECHO (@var{word})
@asindex{ECHO}
Emit @var{word} to the standard output, followed by a newline.
The @var{word} must be a single shell word (typically a quoted string).
Output the shell expansion of @var{word} as-is,
even if it starts with @samp{-} or contains @samp{\}.
Redirections can be placed outside the macro invocation.

If the shell variable @var{foo} could contain @samp{\} or leading @samp{-}.
@code{AS_ECHO(["$foo"])} is more portable than @command{echo "$foo"}.
@xref{echo, , Limitations of Shell Builtins}.

Also, @code{AS_ECHO(["$foo"])} is often easier to read than the
@samp{printf '%s\n' "$foo"} that it stands for.
However, because it employs @samp{'} characters,
in contexts where @samp{'} is not allowed
it is better to use @command{printf} directly.
For example, @samp{`eval 'foo=$@{'AS_ESCAPE([[$1]], [`\])'@};printf
"%s\\n" "$foo")'`} would not work if @command{printf} were replaced
with @code{AS_ECHO}.

@end defmac

@defmac AS_ECHO_N (@var{word})
@asindex{ECHO_N}
Act like @code{AS_ECHO(@var{word})}, except do not output a following newline.
@end defmac

@c We cannot use @dvar because the macro expansion mistreats backslashes.
@defmac AS_ESCAPE (@var{string}, @r{[}@var{chars} = @samp{`\"$}@r{]})
@asindex{ESCAPE}
Expands to @var{string}, with any characters in @var{chars} escaped with
a backslash (@samp{\}).  @var{chars} should be at most four bytes long,
and only contain characters from the set @samp{`\"$}; however,
characters may be safely listed more than once in @var{chars} for the
sake of syntax highlighting editors.  The current implementation expands
@var{string} after adding escapes; if @var{string} contains macro calls
that in turn expand to text needing shell quoting, you can use
@code{AS_ESCAPE(m4_dquote(m4_expand([string])))}.

The default for @var{chars} (@samp{\"$`}) is the set of characters
needing escapes when @var{string} will be used literally within double
quotes.  One common variant is the set of characters to protect when
@var{string} will be used literally within back-ticks or an unquoted
here-document (@samp{\$`}).  Another common variant is @samp{""}, which can
be used to form a double-quoted string containing the same expansions
that would have occurred if @var{string} were expanded in an unquoted
here-document; however, when using this variant, care must be taken that
@var{string} does not use double quotes within complex variable
expansions (such as @samp{$@{foo-`echo "hi"`@}}) that would be broken
with improper escapes.

This macro is often used with @code{AS_ECHO}.  For an example, observe
the output generated by the shell code generated from this snippet:

@example
foo=bar
AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
@result{}"$foo" = "bar"
m4_define([macro], [a, [\b]])
AS_ECHO(["AS_ESCAPE([[macro]])"])
@result{}macro
AS_ECHO(["AS_ESCAPE([macro])"])
@result{}a, b
AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
@result{}a, \b
@end example

@comment Should we add AS_ESCAPE_SINGLE? If we do, we can optimize in
@comment the case of @var{string} that does not contain '.
To escape a string that will be placed within single quotes, use:

@example
m4_bpatsubst([[@var{string}]], ['], ['\\''])
@end example
@end defmac

@defmac AS_EXECUTABLE_P (@var{file})
@asindex{EXECUTABLE_P}
Emit code to probe whether @var{file} is a regular file with executable
permissions (and not a directory with search permissions).  The caller
is responsible for quoting @var{file}.
@end defmac

@defmac AS_EXIT (@dvar{status, $?})
@asindex{EXIT}
Emit code to exit the shell with @var{status}, defaulting to @samp{$?}.
This macro
works around shells that see the exit status of the command prior to
@code{exit} inside a @samp{trap 0} handler (@pxref{trap, , Limitations
of Shell Builtins}).
@end defmac

@defmac AS_IF (@var{test1}, @ovar{run-if-true1}, @dots{}, @ovar{run-if-false})
@asindex{IF}
Run shell code @var{test1}.  If @var{test1} exits with a zero status then
run shell code @var{run-if-true1}, else examine further tests.  If no test
exits with a zero status, run shell code @var{run-if-false}, with
simplifications if either @var{run-if-true1} or @var{run-if-false}
is empty.  For example,

@example
AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
      [test "x$foo" != xno], [HANDLE_FOO([maybe])],
      [echo foo not specified])
@end example

@noindent
ensures any required macros of @code{HANDLE_FOO}
are expanded before the first test.

This macro should be used instead of plain @samp{if} in code
outside of an @code{AC_DEFUN} macro, when the contents of the @samp{if}
use @code{AC_REQUIRE} directly or indirectly (@pxref{Prerequisite Macros}).
@end defmac

@defmac AS_MKDIR_P (@var{file-name})
@asindex{MKDIR_P}
Make the directory @var{file-name}, including intervening directories
as necessary.  This is equivalent to @samp{mkdir -p -- @var{file-name}}.
If creation of @var{file-name} fails, exit the script.

Also see the @code{AC_PROG_MKDIR_P} macro (@pxref{Particular Programs}).
@end defmac

@defmac AS_SET_STATUS (@var{status})
@asindex{SET_STATUS}
Emit shell code to set the value of @samp{$?} to @var{status}, as
efficiently as possible.  However, this is not guaranteed to abort a
shell running with @code{set -e} (@pxref{set, , Limitations of Shell
Builtins}).  This should also be used at the end of a complex shell
function instead of @samp{return} (@pxref{Shell Functions}) to avoid
a DJGPP shell bug.
@end defmac

@defmac AS_TR_CPP (@var{expression})
@asindex{TR_CPP}
Transform @var{expression} into a valid right-hand side for a C @code{#define}.
For example:

@example
# This outputs "#define HAVE_CHAR_P 1".
# Notice the m4 quoting around #, to prevent an m4 comment
type="char *"
echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
@end example
@end defmac

@defmac AS_TR_SH (@var{expression})
@asindex{TR_SH}
Transform @var{expression} into shell code that generates a valid shell
variable name.  The result is literal when possible at m4 time, but must
be used with @code{eval} if @var{expression} causes shell indirections.
For example:

@example
# This outputs "Have it!".
header="sys/some file.h"
eval AS_TR_SH([HAVE_$header])=yes
if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi
@end example
@end defmac

@defmac AS_SET_CATFILE (@var{var}, @var{dir}, @var{file})
@asindex{SET_CATFILE}
Set the polymorphic shell variable @var{var} to @var{dir}/@var{file},
but optimizing the common cases (@var{dir} or @var{file} is @samp{.},
@var{file} is absolute, etc.).
@end defmac

@defmac AS_UNSET (@var{var})
@asindex{UNSET}
Unsets the shell variable @var{var}, working around bugs in older
shells (@pxref{unset, , Limitations of Shell
Builtins}).  @var{var} can be a literal or indirect variable name.
@end defmac

@defmac AS_VERSION_COMPARE (@var{version-1}, @var{version-2}, @
  @ovar{action-if-less}, @ovar{action-if-equal}, @ovar{action-if-greater})
@asindex{VERSION_COMPARE}
Compare two strings @var{version-1} and @var{version-2}, possibly
containing shell variables, as version strings, and expand
@var{action-if-less}, @var{action-if-equal}, or @var{action-if-greater}
depending upon the result.
The algorithm to compare is similar to the one used by strverscmp in
glibc (@pxref{String/Array Comparison, , String/Array Comparison, libc,
The GNU C Library}).
@end defmac

@node Polymorphic Variables
@section Support for indirect variable names
@cindex variable name indirection
@cindex polymorphic variable name
@cindex indirection, variable name

Often, it is convenient to write a macro that will emit shell code
operating on a shell variable.  The simplest case is when the variable
name is known.  But a more powerful idiom is writing shell code that can
work through an indirection, where another variable or command
substitution produces the name of the variable to actually manipulate.
M4sh supports the notion of polymorphic shell variables, making it easy
to write a macro that can deal with either literal or indirect variable
names and output shell code appropriate for both use cases.  Behavior is
undefined if expansion of an indirect variable does not result in a
literal variable name.

@defmac AS_LITERAL_IF (@var{expression}, @ovar{if-literal}, @ovar{if-not}, @
  @dvarv{if-simple-ref, if-not})
@defmacx AS_LITERAL_WORD_IF (@var{expression}, @ovar{if-literal}, @
  @ovar{if-not}, @dvarv{if-simple-ref, if-not})
@asindex{LITERAL_IF}
@asindex{LITERAL_WORD_IF}
If the expansion of @var{expression} is definitely a shell literal,
expand @var{if-literal}.  If the expansion of @var{expression} looks
like it might contain shell indirections (such as @code{$var} or
@code{`expr`}), then @var{if-not} is expanded.  Sometimes, it is
possible to output optimized code if @var{expression} consists only of
shell variable expansions (such as @code{$@{var@}}), in which case
@var{if-simple-ref} can be provided; but defaulting to @var{if-not}
should always be safe.  @code{AS_LITERAL_WORD_IF} only expands
@var{if-literal} if @var{expression} looks like a single shell word,
containing no whitespace; while @code{AS_LITERAL_IF} allows whitespace
in @var{expression}.

In order to reduce the time spent recognizing whether an
@var{expression} qualifies as a literal or a simple indirection, the
implementation is somewhat conservative: @var{expression} must be a
single shell word (possibly after stripping whitespace), consisting only
of bytes that would have the same meaning whether unquoted or enclosed
in double quotes (for example, @samp{a.b} results in @var{if-literal},
even though it is not a valid shell variable name; while both @samp{'a'}
and @samp{[$]} result in @var{if-not}, because they behave differently
than @samp{"'a'"} and @samp{"[$]"}).  This macro can be used in contexts
for recognizing portable file names (such as in the implementation of
@code{AC_LIBSOURCE}), or coupled with some transliterations for forming
valid variable names (such as in the implementation of @code{AS_TR_SH},
which uses an additional @code{m4_translit} to convert @samp{.} to
@samp{_}).

This example shows how to read the contents of the shell variable
@code{bar}, exercising all three arguments to @code{AS_LITERAL_IF}.  It
results in a script that will output the line @samp{hello} three times.

@example
AC_DEFUN([MY_ACTION],
[AS_LITERAL_IF([$1],
  [AS_ECHO(["$$1"])],
@c $$
  [AS_VAR_COPY([var], [$1])
   AS_ECHO(["$var"])],
  [AS_ECHO(["$'"$1"\"])])])
foo=bar bar=hello
MY_ACTION([bar])
MY_ACTION([`echo bar`])
MY_ACTION([$foo])
@end example
@end defmac

@defmac AS_VAR_APPEND (@var{var}, @var{text})
@asindex{VAR_APPEND}
Emit shell code to append the shell expansion of @var{text} to the end
of the current contents of the polymorphic shell variable @var{var},
taking advantage of shells that provide the @samp{+=} extension for more
efficient scaling.

For situations where the final contents of @var{var} are relatively
short (less than 256 bytes), it is more efficient to use the simpler
code sequence of @code{@var{var}=$@{@var{var}@}@var{text}} (or its
polymorphic equivalent of @code{AS_VAR_COPY([t], [@var{var}])} and
@code{AS_VAR_SET([@var{var}], ["$t"@var{text}])}).  But in the case
when the script will be repeatedly appending text into @code{var},
issues of scaling start to become apparent.  A naive implementation
requires execution time linear to the length of the current contents of
@var{var} as well as the length of @var{text} for a single append, for
an overall quadratic scaling with multiple appends.  This macro takes
advantage of shells which provide the extension
@code{@var{var}+=@var{text}}, which can provide amortized constant time
for a single append, for an overall linear scaling with multiple
appends.  Note that unlike @code{AS_VAR_SET}, this macro requires that
@var{text} be quoted properly to avoid field splitting and file name
expansion.
@end defmac

@defmac AS_VAR_ARITH (@var{var}, @var{expression})
@asindex{VAR_ARITH}
Emit shell code to compute the arithmetic expansion of @var{expression},
assigning the result as the contents of the polymorphic shell variable
@var{var}.  The code takes advantage of shells that provide @samp{$(())}
for fewer forks, but uses @command{expr} as a fallback.  Therefore, the
syntax for a valid @var{expression} is rather limited: all operators
must occur as separate shell arguments and with proper quoting;
the only operators supported are @samp{*}, @samp{/}, @samp{%}, binary
@samp{+}, binary @samp{-}, @samp{>}, @samp{>=}, @samp{<}, @samp{<=},
@samp{!=}, @samp{&}, and @samp{|};
all variables containing numbers must be expanded prior to the computation;
the first shell argument must not start with @samp{-};
and each number must be an optional @samp{-} followed by one or more
decimal digits, where the first digit is nonzero if there is more than
one digit.  In the following example, this snippet
will print @samp{(2+3)*4 == 20}.

@example
bar=3
AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
echo "(2+$bar)*4 == $foo"
@end example
@end defmac

@defmac AS_VAR_COPY (@var{dest}, @var{source})
@asindex{VAR_COPY}
Emit shell code to assign the contents of the polymorphic shell variable
@var{source} to the polymorphic shell variable @var{dest}.  For example,
executing this M4sh snippet will output @samp{bar hi}:

@example
foo=bar bar=hi
AS_VAR_COPY([a], [foo])
AS_VAR_COPY([b], [$foo])
echo "$a $b"
@end example

When it is necessary to access the contents of an indirect variable
inside a shell double-quoted context, the recommended idiom is to first
copy the contents into a temporary literal shell variable.

@smallexample
for header in stdint_h inttypes_h ; do
  AS_VAR_COPY([var], [ac_cv_header_$header])
  AS_ECHO(["$header detected: $var"])
done
@end smallexample
@end defmac

@comment AS_VAR_GET is intentionally undocumented; it can't handle
@comment trailing newlines uniformly, and forks too much.

@defmac AS_VAR_IF (@var{var}, @ovar{word}, @ovar{if-equal}, @
  @ovar{if-not-equal})
@asindex{VAR_IF}
Output a shell conditional statement.  If the contents of the
polymorphic shell variable @var{var} match the string @var{word},
execute @var{if-equal}; otherwise execute @var{if-not-equal}.  @var{word}
must be a single shell word (typically a quoted string).  Avoids
shell bugs if an interrupt signal arrives while a command substitution
in @var{var} is being expanded.
@end defmac

@defmac AS_VAR_PUSHDEF (@var{m4-name}, @var{value})
@defmacx AS_VAR_POPDEF (@var{m4-name})
@asindex{VAR_PUSHDEF}
@asindex{VAR_POPDEF}
@cindex composing variable names
@cindex variable names, composing
A common M4sh idiom involves composing shell variable names from an m4
argument (for example, writing a macro that uses a cache variable).
@var{value} can be an arbitrary string, which will be transliterated
into a valid shell name by @code{AS_TR_SH}.  In order to access the
composed variable name based on @var{value}, it is easier to declare a
temporary m4 macro @var{m4-name} with @code{AS_VAR_PUSHDEF}, then use
that macro as the argument to subsequent @code{AS_VAR} macros as a
polymorphic variable name, and finally free the temporary macro with
@code{AS_VAR_POPDEF}.  These macros are often followed with @code{dnl},
to avoid excess newlines in the output.

Here is an involved example, that shows the power of writing macros that
can handle composed shell variable names:

@example
m4_define([MY_CHECK_HEADER],
[AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl
AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl
AS_VAR_POPDEF([my_Header])dnl
])
MY_CHECK_HEADER([stdint.h])
for header in inttypes.h stdlib.h ; do
  MY_CHECK_HEADER([$header])
done
@end example

@noindent
In the above example, @code{MY_CHECK_HEADER} can operate on polymorphic
variable names.  In the first invocation, the m4 argument is
@code{stdint.h}, which transliterates into a literal @code{stdint_h}.
As a result, the temporary macro @code{my_Header} expands to the literal
shell name @samp{ac_cv_header_stdint_h}.  In the second invocation, the
m4 argument to @code{MY_CHECK_HEADER} is @code{$header}, and the
temporary macro @code{my_Header} expands to the indirect shell name
@samp{$as_my_Header}.  During the shell execution of the for loop, when
@samp{$header} contains @samp{inttypes.h}, then @samp{$as_my_Header}
contains @samp{ac_cv_header_inttypes_h}.  If this script is then run on a
platform where all three headers have been previously detected, the
output of the script will include:

@smallexample
header stdint.h detected
header inttypes.h detected
header stdlib.h detected
@end smallexample
@end defmac

@defmac AS_VAR_SET (@var{var}, @ovar{value})
@asindex{VAR_SET}
Emit shell code to assign the contents of the polymorphic shell variable
@var{var} to the shell expansion of @var{value}.  @var{value} is not
subject to field splitting or file name expansion, so if command
substitution is used, it may be done with @samp{`""`} rather than using
an intermediate variable (@pxref{Shell Substitutions}).  However,
@var{value} does undergo rescanning for additional macro names; behavior
is unspecified if late expansion results in any shell meta-characters.
@end defmac

@defmac AS_VAR_SET_IF (@var{var}, @ovar{if-set}, @ovar{if-undef})
@asindex{VAR_SET_IF}
Emit a shell conditional statement, which executes @var{if-set} if the
polymorphic shell variable @code{var} is set to any value, and
@var{if-undef} otherwise.
@end defmac

@defmac AS_VAR_TEST_SET (@var{var})
@asindex{VAR_TEST_SET}
Emit a shell statement that results in a successful exit status only if
the polymorphic shell variable @code{var} is set.
@end defmac

@node Initialization Macros
@section Initialization Macros

@defmac AS_BOURNE_COMPATIBLE
@asindex{BOURNE_COMPATIBLE}
Set up the shell to be more compatible with the Bourne shell as
standardized by POSIX, if possible.  This may involve setting
environment variables, or setting options, or similar
implementation-specific actions.  This macro is deprecated, since
@code{AS_INIT} already invokes it.
@end defmac

@defmac AS_INIT
@asindex{INIT}
@evindex LC_ALL
@evindex SHELL
Initialize the M4sh environment.  This macro calls @code{m4_init}, then
outputs the @code{#! /bin/sh} line, a notice about where the output was
generated from, and code to sanitize the environment for the rest of the
script.  Among other initializations, this sets @env{SHELL} to the shell
chosen to run the script (@pxref{CONFIG_SHELL}), and @env{LC_ALL} to
ensure the C locale.  Finally, it changes the current diversion to
@code{BODY}.  @code{AS_INIT} is called automatically by @code{AC_INIT}
and @code{AT_INIT}, so shell code in @file{configure},
@file{config.status}, and @file{testsuite} all benefit from a sanitized
shell environment.
@end defmac

@defmac AS_INIT_GENERATED (@var{file}, @ovar{comment})
@asindex{INIT_GENERATED}
Emit shell code to start the creation of a subsidiary shell script in
@var{file}, including changing @var{file} to be executable.  This macro
populates the child script with information learned from the parent
(thus, the emitted code is equivalent in effect, but more efficient,
than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and
@code{AS_SHELL_SANITIZE}).  If present, @var{comment} is output near the
beginning of the child, prior to the shell initialization code, and is
subject to parameter expansion, command substitution, and backslash
quote removal.  The
parent script should check the exit status after this macro, in case
@var{file} could not be properly created (for example, if the disk was
full).  If successfully created, the parent script can then proceed to
append additional M4sh constructs into the child script.

Note that the child script starts life without a log file open, so if
the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you
must temporarily disable any attempts to use the log file until after
emitting code to open a log within the child.  On the other hand, if the
parent script has @code{AS_MESSAGE_FD} redirected somewhere besides
@samp{1}, then the child script already has code that copies stdout to
that descriptor.  Currently, the suggested
idiom for writing a M4sh shell script from within another script is:

@example
AS_INIT_GENERATED([@var{file}], [[# My child script.
]]) || @{ AS_ECHO(["Failed to create child script"]); AS_EXIT; @}
m4_pushdef([AS_MESSAGE_LOG_FD])dnl
cat >> "@var{file}" <<\__EOF__
# Code to initialize AS_MESSAGE_LOG_FD
m4_popdef([AS_MESSAGE_LOG_FD])dnl
# Additional code
__EOF__
@end example

This, however, may change in the future as the M4sh interface is
stabilized further.

Also, be aware that use of @env{LINENO} within the child script may
report line numbers relative to their location in the parent script,
even when using @code{AS_LINENO_PREPARE}, if the parent script was
unable to locate a shell with working @env{LINENO} support.
@end defmac

@defmac AS_LINENO_PREPARE
@asindex{LINENO_PREPARE}
@evindex LINENO
Find a shell that supports the special variable @env{LINENO}, which
contains the number of the currently executing line.  This macro is
automatically invoked by @code{AC_INIT} in configure scripts.
@end defmac

@defmac AS_ME_PREPARE
@asindex{ME_PREPARE}
Set up variable @env{as_me} to be the basename of the currently executing
script.  This macro is automatically invoked by @code{AC_INIT} in
configure scripts.
@end defmac

@defmac AS_TMPDIR (@var{prefix}, @dvar{dir, $@{TMPDIR:=/tmp@}})
@asindex{TMPDIR}
@evindex TMPDIR
@ovindex tmp
Create, as safely as possible, a temporary sub-directory within
@var{dir} with a name starting with @var{prefix}.  @var{prefix} should
be 2--4 characters, to make it slightly easier to identify the owner of
the directory.  If @var{dir} is omitted, then the value of @env{TMPDIR}
will be used (defaulting to @samp{/tmp}).  On success, the name of the
newly created directory is stored in the shell variable @code{tmp}.  On
error, the script is aborted.

Typically, this macro is coupled with some exit traps to delete the created
directory and its contents on exit or interrupt.  However, there is a
slight window between when the directory is created and when the name is
actually known to the shell, so an interrupt at the right moment might
leave the temporary directory behind.  Hence it is important to use a
@var{prefix} that makes it easier to determine if a leftover temporary
directory from an interrupted script is safe to delete.

If you set @code{TMPDIR=$tmp} after invoking this macro, you should
reset @code{TMPDIR} before deleting the created directory, to avoid
breaking commands that rely on @code{$TMPDIR}.

The use of the output variable @samp{$tmp} rather than something in the
@samp{as_} namespace is historical; it has the unfortunate consequence
that reusing this otherwise common name for any other purpose inside
your script has the potential to break any cleanup traps designed to
remove the temporary directory.
@end defmac

@defmac AS_SHELL_SANITIZE
@asindex{SHELL_SANITIZE}
Initialize the shell suitably for @command{configure} scripts.  This has
the effect of @code{AS_BOURNE_COMPATIBLE}, and sets some other
environment variables for predictable results from configuration tests.
For example, it sets @env{LC_ALL} to change to the default C locale.
@xref{Special Shell Variables}.  This macro is deprecated, since
@code{AS_INIT} already invokes it.
@end defmac


@node File Descriptor Macros
@section File Descriptor Macros
@cindex input
@cindex standard input
@cindex file descriptors
@cindex descriptors
@cindex low-level output
@cindex output, low-level

The following macros define file descriptors used to output messages
(or input values) from @file{configure} scripts.
For example:

@example
AS_ECHO(["$wombats found"]) >&AS_MESSAGE_LOG_FD
AS_ECHO_N(['Enter desired kangaroo count: ']) >&AS_MESSAGE_FD
read kangaroos <&AS_ORIGINAL_STDIN_FD
@end example

@noindent
However doing so is seldom needed, because Autoconf provides higher
level macros as described below.

@defmac AS_MESSAGE_FD
@asindex{MESSAGE_FD}
The file descriptor for @samp{checking for...}  messages and results.
By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh
clients.  However, @code{AC_INIT} shuffles things around to another file
descriptor, in order to allow the @option{-q} option of
@command{configure} to choose whether messages should go to the script's
standard output or be discarded.

If you want to display some messages, consider using one of the printing
macros (@pxref{Printing Messages}) instead.  Copies of messages output
via these macros are also recorded in @file{config.log}.
@end defmac

@anchor{AS_MESSAGE_LOG_FD}
@defmac AS_MESSAGE_LOG_FD
@asindex{MESSAGE_LOG_FD}
This must either be empty, or expand to a file descriptor for log
messages.  By default, @code{AS_INIT} sets this macro to the empty
string for standalone M4sh clients, thus disabling logging.  However,
@code{AC_INIT} shuffles things around so that both @command{configure}
and @command{config.status} use @file{config.log} for log messages.
Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the
Compiler}), redirect all output to this descriptor.  You may want to do
so if you develop such a low-level macro.
@end defmac

@defmac AS_ORIGINAL_STDIN_FD
@asindex{ORIGINAL_STDIN_FD}
This must expand to a file descriptor for the original standard input.
By default, @code{AS_INIT} sets this macro to @samp{0} for standalone
M4sh clients.  However, @code{AC_INIT} shuffles things around for
safety.

When @command{configure} runs, it may accidentally execute an
interactive command that has the same name as the non-interactive meant
to be used or checked.  If the standard input was the terminal, such
interactive programs would cause @command{configure} to stop, pending
some user input.  Therefore @command{configure} redirects its standard
input from @file{/dev/null} during its initialization.  This is not
normally a problem, since @command{configure} normally does not need
user input.

In the extreme case where your @file{configure} script really needs to
obtain some values from the original standard input, you can read them
explicitly from @code{AS_ORIGINAL_STDIN_FD}.
@end defmac


@c =================================================== Writing Autoconf Macros.

@node Writing Autoconf Macros
@chapter Writing Autoconf Macros

When you write a feature test that could be applicable to more than one
software package, the best thing to do is encapsulate it in a new macro.
Here are some instructions and guidelines for writing Autoconf macros.
You should also familiarize yourself with M4sugar (@pxref{Programming in M4})
and M4sh (@pxref{Programming in M4sh}).

@menu
* Macro Definitions::           Basic format of an Autoconf macro
* Macro Names::                 What to call your new macros
* Dependencies Between Macros::  What to do when macros depend on other macros
* Obsoleting Macros::           Warning about old ways of doing things
* Coding Style::                Writing Autoconf macros à la Autoconf
@end menu

@node Macro Definitions
@section Macro Definitions

@defmac AC_DEFUN (@var{name}, @ovar{body})
@acindex{DEFUN}
Autoconf macros are defined using the @code{AC_DEFUN} macro, which is
similar to the M4 builtin @code{m4_define} macro; this creates a macro
named @var{name} and with @var{body} as its expansion.  In addition to
defining a macro, @code{AC_DEFUN} adds to it some code that is used to
constrain the order in which macros are called, while avoiding redundant
output (@pxref{Prerequisite Macros}).
@end defmac

An Autoconf macro definition looks like this:

@example
AC_DEFUN(@var{macro-name}, @var{macro-body})
@end example

You can refer to any arguments passed to the macro as @samp{$1},
@samp{$2}, etc.  @xref{Definitions, , How to define new macros, m4,
GNU M4}, for more complete information on writing M4 macros.

Most macros fall in one of two general categories.  The first category
includes macros which take arguments, in order to generate output
parameterized by those arguments.  Macros in this category are designed
to be directly expanded, often multiple times, and should not be used as
the argument to @code{AC_REQUIRE}.  The other category includes macros
which are shorthand for a fixed block of text, and therefore do not take
arguments.  For this category of macros, directly expanding the macro
multiple times results in redundant output, so it is more common to use
the macro as the argument to @code{AC_REQUIRE}, or to declare the macro
with @code{AC_DEFUN_ONCE} (@pxref{One-Shot Macros}).

Be sure to properly quote both the @var{macro-body} @emph{and} the
@var{macro-name} to avoid any problems if the macro happens to have
been previously defined.

Each macro should have a header comment that gives its prototype, and a
brief description.  When arguments have default values, display them in
the prototype.  For example:

@example
# AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
# --------------------------------------
m4_define([AC_MSG_ERROR],
  [@{ AS_MESSAGE([error: $1], [2])
     exit m4_default([$2], [1]); @}])
@end example

Comments about the macro should be left in the header comment.  Most
other comments make their way into @file{configure}, so just keep
using @samp{#} to introduce comments.

@cindex @code{dnl}
If you have some special comments about pure M4 code, comments
that make no sense in @file{configure} and in the header comment, then
use the builtin @code{dnl}: it causes M4 to discard the text
through the next newline.

Keep in mind that @code{dnl} is rarely needed to introduce comments;
@code{dnl} is more useful to get rid of the newlines following macros
that produce no output, such as @code{AC_REQUIRE}.

Public third-party macros need to use @code{AC_DEFUN}, and not
@code{m4_define}, in order to be found by @command{aclocal}
(@pxref{Extending aclocal,,, automake, GNU Automake}).
Additionally, if it is ever determined that a macro should be made
obsolete, it is easy to convert from @code{AC_DEFUN} to @code{AU_DEFUN}
in order to have @command{autoupdate} assist the user in choosing a
better alternative, but there is no corresponding way to make
@code{m4_define} issue an upgrade notice (@pxref{AU_DEFUN}).

There is another subtle, but important, difference between using
@code{m4_define} and @code{AC_DEFUN}: only the former is unaffected by
@code{AC_REQUIRE}.  When writing a file, it is always safe to replace a
block of text with a @code{m4_define} macro that will expand to the same
text.  But replacing a block of text with an @code{AC_DEFUN} macro with
the same content does not necessarily give the same results, because it
changes the location where any embedded but unsatisfied
@code{AC_REQUIRE} invocations within the block will be expanded.  For an
example of this, see @ref{Expanded Before Required}.

@node Macro Names
@section Macro Names

All of the public Autoconf macros have all-uppercase names in the
namespace @samp{^AC_} to prevent them from accidentally conflicting with
other text; Autoconf also reserves the namespace @samp{^_AC_} for
internal macros.  All shell variables that they use for internal
purposes have mostly-lowercase names starting with @samp{ac_}.  Autoconf
also uses here-document delimiters in the namespace @samp{^_AC[A-Z]}.  During
@command{configure}, files produced by Autoconf make heavy use of the
file system namespace @samp{^conf}.

Since Autoconf is built on top of M4sugar (@pxref{Programming in
M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
of those namespaces (@samp{^_?\(m4\|AS\)_}).  And since
@file{configure.ac} is also designed to be scanned by Autoheader,
Autoscan, Autoupdate, and Automake, you should be aware of the
@samp{^_?A[HNUM]_} namespaces.  In general, you @emph{should not use}
the namespace of a package that does not own the macro or shell code you
are writing.

To ensure that your macros don't conflict with present or future
Autoconf macros, you should prefix your own macro names and any shell
variables they use with some other sequence.  Possibilities include your
initials, or an abbreviation for the name of your organization or
software package.  Historically, people have not always followed the
rule of using a namespace appropriate for their package, and this has
made it difficult for determining the origin of a macro (and where to
report bugs about that macro), as well as difficult for the true
namespace owner to add new macros without interference from pre-existing
uses of third-party macros.  Perhaps the best example of this confusion
is the @code{AM_GNU_GETTEXT} macro, which belongs, not to Automake, but
to Gettext.

Most of the Autoconf macros' names follow a structured naming convention
that indicates the kind of feature check by the name.  The macro names
consist of several words, separated by underscores, going from most
general to most specific.  The names of their cache variables use the
same convention (@pxref{Cache Variable Names}, for more information on
them).

The first word of the name after the namespace initials (such as
@samp{AC_}) usually tells the category
of the feature being tested.  Here are the categories used in Autoconf for
specific test macros, the kind of macro that you are more likely to
write.  They are also used for cache variables, in all-lowercase.  Use
them where applicable; where they're not, invent your own categories.

@table @code
@item C
C language builtin features.
@item DECL
Declarations of C variables in header files.
@item FUNC
Functions in libraries.
@item GROUP
POSIX group owners of files.
@item HEADER
Header files.
@item LIB
C libraries.
@item PROG
The base names of programs.
@item MEMBER
Members of aggregates.
@item SYS
Operating system features.
@item TYPE
C builtin or declared types.
@item VAR
C variables in libraries.
@end table

After the category comes the name of the particular feature being
tested.  Any further words in the macro name indicate particular aspects
of the feature.  For example, @code{AC_PROG_MAKE_SET} checks whether
@command{make} sets a variable to its own name.

An internal macro should have a name that starts with an underscore;
Autoconf internals should therefore start with @samp{_AC_}.
Additionally, a macro that is an internal subroutine of another macro
should have a name that starts with an underscore and the name of that
other macro, followed by one or more words saying what the internal
macro does.  For example, @code{AC_PATH_X} has internal macros
@code{_AC_PATH_X_XMKMF} and @code{_AC_PATH_X_DIRECT}.

@node Dependencies Between Macros
@section Dependencies Between Macros
@cindex Dependencies between macros

Some Autoconf macros depend on other macros having been called first in
order to work correctly.  Autoconf provides a way to ensure that certain
macros are called if needed and a way to warn the user if macros are
called in an order that might cause incorrect operation.

@menu
* Prerequisite Macros::         Ensuring required information
* Suggested Ordering::          Warning about possible ordering problems
* One-Shot Macros::             Ensuring a macro is called only once
@end menu

@node Prerequisite Macros
@subsection Prerequisite Macros
@cindex Prerequisite macros
@cindex Macros, prerequisites

A macro that you write might need to use values that have previously
been computed by other macros.  For example, @code{AC_DECL_YYTEXT}
examines the output of @code{flex} or @code{lex}, so it depends on
@code{AC_PROG_LEX} having been called first to set the shell variable
@code{LEX}.

Rather than forcing the user of the macros to keep track of the
dependencies between them, you can use the @code{AC_REQUIRE} macro to do
it automatically.  @code{AC_REQUIRE} can ensure that a macro is only
called if it is needed, and only called once.

@defmac AC_REQUIRE (@var{macro-name})
@acindex{REQUIRE}
If the M4 macro @var{macro-name} has not already been called, call it
(without any arguments).  Make sure to quote @var{macro-name} with
square brackets.  @var{macro-name} must have been defined using
@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
that it has been called.

@code{AC_REQUIRE} must be used inside a macro defined by @code{AC_DEFUN}; it
must not be called from the top level.  Also, it does not make sense to
require a macro that takes parameters.
@end defmac

@code{AC_REQUIRE} is often misunderstood.  It really implements
dependencies between macros in the sense that if one macro depends upon
another, the latter is expanded @emph{before} the body of the
former.  To be more precise, the required macro is expanded before
the outermost defined macro in the current expansion stack.
In particular, @samp{AC_REQUIRE([FOO])} is not replaced with the body of
@code{FOO}.  For instance, this definition of macros:

@example
@group
AC_DEFUN([TRAVOLTA],
[test "$body_temperature_in_Celsius" -gt 38 &&
  dance_floor=occupied])
AC_DEFUN([NEWTON_JOHN],
[test "x$hair_style" = xcurly &&
  dance_floor=occupied])
@end group

@group
AC_DEFUN([RESERVE_DANCE_FLOOR],
[if test "x`date +%A`" = xSaturday; then
  AC_REQUIRE([TRAVOLTA])
  AC_REQUIRE([NEWTON_JOHN])
fi])
@end group
@end example

@noindent
with this @file{configure.ac}

@example
AC_INIT([Dance Manager], [1.0], [bug-dance@@example.org])
RESERVE_DANCE_FLOOR
if test "x$dance_floor" = xoccupied; then
  AC_MSG_ERROR([cannot pick up here, let's move])
fi
@end example

@noindent
does not leave you with a better chance to meet a kindred soul on
days other than Saturday, since the call to @code{RESERVE_DANCE_FLOOR}
expands to:

@example
@group
test "$body_temperature_in_Celsius" -gt 38 &&
  dance_floor=occupied
test "x$hair_style" = xcurly &&
  dance_floor=occupied
if test "x`date +%A`" = xSaturday; then


fi
@end group
@end example

This behavior was chosen on purpose: (i) it prevents messages in
required macros from interrupting the messages in the requiring macros;
(ii) it avoids bad surprises when shell conditionals are used, as in:

@example
@group
if @dots{}; then
  AC_REQUIRE([SOME_CHECK])
fi
@dots{}
SOME_CHECK
@end group
@end example

However, this implementation can lead to another class of problems.
Consider the case where an outer macro first expands, then indirectly
requires, an inner macro:

@example
AC_DEFUN([TESTA], [[echo in A
if test -n "$SEEN_A" ; then echo duplicate ; fi
SEEN_A=:]])
AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
if test -z "$SEEN_A" ; then echo bug ; fi]])
AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
AC_DEFUN([OUTER], [[echo in OUTER]
TESTA
TESTC])
OUTER
@end example

@noindent
Prior to Autoconf 2.64, the implementation of @code{AC_REQUIRE}
recognized that @code{TESTB} needed to be hoisted prior to the expansion
of @code{OUTER}, but because @code{TESTA} had already been directly
expanded, it failed to hoist @code{TESTA}.  Therefore, the expansion of
@code{TESTB} occurs prior to its prerequisites, leading to the following
output:

@example
in B
bug
in OUTER
in A
in C
@end example

@noindent
Newer Autoconf is smart enough to recognize this situation, and hoists
@code{TESTA} even though it has already been expanded, but issues a
syntax warning in the process.  This is because the hoisted expansion of
@code{TESTA} defeats the purpose of using @code{AC_REQUIRE} to avoid
redundant code, and causes its own set of problems if the hoisted macro
is not idempotent:

@example
in A
in B
in OUTER
in A
duplicate
in C
@end example

The bug is not in Autoconf, but in the macro definitions.  If you ever
pass a particular macro name to @code{AC_REQUIRE}, then you are implying
that the macro only needs to be expanded once.  But to enforce this,
either the macro must be declared with @code{AC_DEFUN_ONCE} (although
this only helps in Autoconf 2.64 or newer), or all
uses of that macro should be through @code{AC_REQUIRE}; directly
expanding the macro defeats the point of using @code{AC_REQUIRE} to
eliminate redundant expansion.  In the example, this rule of thumb was
violated because @code{TESTB} requires @code{TESTA} while @code{OUTER}
directly expands it.  One way of fixing the bug is to factor
@code{TESTA} into two macros, the portion designed for direct and
repeated use (here, named @code{TESTA}), and the portion designed for
one-shot output and used only inside @code{AC_REQUIRE} (here, named
@code{TESTA_PREREQ}).  Then, by fixing all clients to use the correct
calling convention according to their needs:

@example
AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]])
AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ
if test -n "$SEEN_A" ; then echo duplicate ; fi
SEEN_A=:]])
AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B
if test -z "$SEEN_A" ; then echo bug ; fi]])
AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
AC_DEFUN([OUTER], [[echo in OUTER]
TESTA
TESTC])
OUTER
@end example

@noindent
the resulting output will then obey all dependency rules and avoid any
syntax warnings, whether the script is built with old or new Autoconf
versions:

@example
in A_PREREQ
in B
in OUTER
in A
in C
@end example

You can use the helper macros @code{AS_IF} and @code{AS_CASE} in
top-level code to enforce expansion of required macros outside of shell
conditional constructs; these helpers are not needed in the bodies of
macros defined by @code{AC_DEFUN}.
You are furthermore encouraged, although not required, to
put all @code{AC_REQUIRE} calls
at the beginning of a macro.  You can use @code{dnl} to avoid the empty
lines they leave.

Autoconf will normally warn if an @code{AC_REQUIRE} call refers to a
macro that has not been defined.  However, the @command{aclocal} tool
relies on parsing an incomplete set of input files to trace which macros
have been required, in order to then pull in additional files that
provide those macros; for this particular use case, pre-defining the
macro @code{m4_require_silent_probe} will avoid the warnings.

@node Suggested Ordering
@subsection Suggested Ordering
@cindex Macros, ordering
@cindex Ordering macros

Some macros should be run before another macro if both are called, but
neither @emph{requires} that the other be called.  For example, a macro
that changes the behavior of the C compiler should be called before any
macros that run the C compiler.  Many of these dependencies are noted in
the documentation.

Autoconf provides the @code{AC_BEFORE} macro to warn users when macros
with this kind of dependency appear out of order in a
@file{configure.ac} file.  The warning occurs when creating
@command{configure} from @file{configure.ac}, not when running
@command{configure}.

For example, @code{AC_PROG_CPP} checks whether the C compiler
can run the C preprocessor when given the @option{-E} option.  It should
therefore be called after any macros that change which C compiler is
being used, such as @code{AC_PROG_CC}.  So @code{AC_PROG_CC} contains:

@example
AC_BEFORE([$0], [AC_PROG_CPP])dnl
@end example

@noindent
This warns the user if a call to @code{AC_PROG_CPP} has already occurred
when @code{AC_PROG_CC} is called.

@defmac AC_BEFORE (@var{this-macro-name}, @var{called-macro-name})
@acindex{BEFORE}
Make M4 print a warning message to the standard error output if
@var{called-macro-name} has already been called.  @var{this-macro-name}
should be the name of the macro that is calling @code{AC_BEFORE}.  The
macro @var{called-macro-name} must have been defined using
@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
that it has been called.
@end defmac

@node One-Shot Macros
@subsection One-Shot Macros
@cindex One-shot macros
@cindex Macros, called once

Some macros should be called only once, either because calling them
multiple time is unsafe, or because it is bad style.  For instance
Autoconf ensures that @code{AC_CANONICAL_BUILD} and cousins
(@pxref{Canonicalizing}) are evaluated only once, because it makes no
sense to run these expensive checks more than once.  Such one-shot
macros can be defined using @code{AC_DEFUN_ONCE}.

@defmac AC_DEFUN_ONCE (@var{macro-name}, @var{macro-body})
@acindex{DEFUN_ONCE}
Declare macro @var{macro-name} like @code{AC_DEFUN} would (@pxref{Macro
Definitions}), but add additional logic that guarantees that only the
first use of the macro (whether by direct expansion or
@code{AC_REQUIRE}) causes an expansion of @var{macro-body}; the
expansion will occur before the start of any enclosing macro defined by
@code{AC_DEFUN}.  Subsequent expansions are silently ignored.
Generally, it does not make sense for @var{macro-body} to use parameters
such as @code{$1}.
@end defmac

Prior to Autoconf 2.64, a macro defined by @code{AC_DEFUN_ONCE} would
emit a warning if it was directly expanded a second time, so for
portability, it is better to use @code{AC_REQUIRE} than direct
invocation of @var{macro-name} inside a macro defined by @code{AC_DEFUN}
(@pxref{Prerequisite Macros}).

@node Obsoleting Macros
@section Obsoleting Macros
@cindex Obsoleting macros
@cindex Macros, obsoleting

Configuration and portability technology has evolved over the years.
Often better ways of solving a particular problem are developed, or
ad-hoc approaches are systematized.  This process has occurred in many
parts of Autoconf.  One result is that some of the macros are now
considered @dfn{obsolete}; they still work, but are no longer considered
the best thing to do, hence they should be replaced with more modern
macros.  Ideally, @command{autoupdate} should replace the old macro calls
with their modern implementation.

Autoconf provides a simple means to obsolete a macro.

@anchor{AU_DEFUN}
@defmac AU_DEFUN (@var{old-macro}, @var{implementation}, @ovar{message}, @ovar{silent})
@auindex{DEFUN}
Define @var{old-macro} as @var{implementation}, just like
@code{AC_DEFUN}, but also declare @var{old-macro} to be obsolete.
When @command{autoupdate} is run, occurrences of @var{old-macro} will
be replaced by the text of @var{implementation} in the updated
@file{configure.ac} file.

If a simple textual replacement is not enough to finish the job of
updating a @file{configure.ac} to modern style, provide instructions for
whatever additional manual work is required as @var{message}.  These
instructions will be printed by @command{autoupdate}, and embedded in the
updated @file{configure.ac} file, next to the text of @var{implementation}.

Normally, @command{autoconf} will also issue a warning (in the
``obsolete'' category) when it expands @var{old-macro}.  This warning
does not include @var{message}; it only advises the maintainer to run
@command{autoupdate}.  If it is inappropriate to issue this warning, set
the @var{silent} argument to the word @code{silent}.  One might want to
use a silent @code{AU_DEFUN} when @var{old-macro} is used in a
widely-distributed third-party macro.  If that macro's maintainers are
aware of the need to update their code, it's unnecessary to nag all
of the transitive users of @var{old-macro} as well.  This capability
was added to @code{AU_DEFUN} in Autoconf 2.70; older versions of
autoconf will ignore the @var{silent} argument and issue the warning
anyway.

@strong{Caution:} If @var{implementation} contains M4 or M4sugar macros,
they will be evaluated when @command{autoupdate} is run, not emitted
verbatim like the rest of @var{implementation}.  This cannot be avoided
with extra quotation, because then @var{old-macro} will not work when
it is called normally.  See the definition of @code{AC_FOREACH} in
@file{general.m4} for a workaround.
@end defmac

@defmac AU_ALIAS (@var{old-name}, @var{new-name}, @ovar{silent})
@auindex{ALIAS}
A shorthand version of @code{AU_DEFUN}, to be used when a macro has
simply been renamed.  @command{autoupdate} will replace calls to
@var{old-name} with calls to @var{new-name}, keeping any arguments
intact.  No instructions for additional manual work will be printed.

The @var{silent} argument works the same as the @var{silent} argument
to @code{AU_DEFUN}.  It was added to @code{AU_ALIAS} in Autoconf 2.70.

@strong{Caution:} @code{AU_ALIAS} cannot be used when @var{new-name} is
an M4 or M4sugar macro.  See above.
@end defmac

@node Coding Style
@section Coding Style
@cindex Coding style

The Autoconf macros follow a strict coding style.  You are encouraged to
follow this style, especially if you intend to distribute your macro,
either by contributing it to Autoconf itself or the
@uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
Archive}, or by other means.

The first requirement is to pay great attention to the quotation.  For
more details, see @ref{Autoconf Language}, and @ref{M4 Quotation}.

Do not try to invent new interfaces.  It is likely that there is a macro
in Autoconf that resembles the macro you are defining: try to stick to
this existing interface (order of arguments, default values, etc.).  We
@emph{are} conscious that some of these interfaces are not perfect;
nevertheless, when harmless, homogeneity should be preferred over
creativity.

Be careful about clashes both between M4 symbols and between shell
variables.

If you stick to the suggested M4 naming scheme (@pxref{Macro Names}),
you are unlikely to generate conflicts.  Nevertheless, when you need to
set a special value, @emph{avoid using a regular macro name}; rather,
use an ``impossible'' name.  For instance, up to version 2.13, the macro
@code{AC_SUBST} used to remember what @var{symbol} macros were already defined
by setting @code{AC_SUBST_@var{symbol}}, which is a regular macro name.
But since there is a macro named @code{AC_SUBST_FILE}, it was just
impossible to @samp{AC_SUBST(FILE)}!  In this case,
@code{AC_SUBST(@var{symbol})} or @code{_AC_SUBST(@var{symbol})} should
have been used (yes, with the parentheses).
@c or better yet, high-level macros such as @code{m4_expand_once}

No Autoconf macro should ever enter the user-variable name space; i.e.,
except for the variables that are the actual result of running the
macro, all shell variables should start with @code{ac_}.  In
addition, small macros or any macro that is likely to be embedded in
other macros should be careful not to use obvious names.

@cindex @code{dnl}
Do not use @code{dnl} to introduce comments: most of the comments you
are likely to write are either header comments which are not output
anyway, or comments that should make their way into @file{configure}.
There are exceptional cases where you do want to comment special M4
constructs, in which case @code{dnl} is right, but keep in mind that it
is unlikely.

M4 ignores the leading blanks and newlines before each argument.
Use this feature to
indent in such a way that arguments are (more or less) aligned with the
opening parenthesis of the macro being called.  For instance, instead of

@example
AC_CACHE_CHECK(for EMX OS/2 environment,
ac_cv_emxos2,
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
[ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
@end example

@noindent
write

@example
AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
                   [ac_cv_emxos2=yes],
                   [ac_cv_emxos2=no])])
@end example

@noindent
or even

@example
AC_CACHE_CHECK([for EMX OS/2 environment],
               [ac_cv_emxos2],
               [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
                                                   [return __EMX__;])],
                                  [ac_cv_emxos2=yes],
                                  [ac_cv_emxos2=no])])
@end example

When using @code{AC_RUN_IFELSE} or any macro that cannot work when
cross-compiling, provide a pessimistic value (typically @samp{no}).

Feel free to use various tricks to prevent auxiliary tools, such as
syntax-highlighting editors, from behaving improperly.  For instance,
instead of:

@example
m4_bpatsubst([$1], [$"])
@end example

@noindent
use

@example
m4_bpatsubst([$1], [$""])
@end example

@noindent
so that Emacsen do not open an endless ``string'' at the first quote.
For the same reasons, avoid:

@example
test $[#] != 0
@end example

@noindent
and use:

@example
test $[@@%:@@] != 0
@end example

@noindent
Otherwise, the closing bracket would be hidden inside a @samp{#}-comment,
breaking the bracket-matching highlighting from Emacsen.  Note the
preferred style to escape from M4: @samp{$[1]}, @samp{$[@@]}, etc.  Do
not escape when it is unnecessary.  Common examples of useless quotation
are @samp{[$]$1} (write @samp{$$1}), @samp{[$]var} (use @samp{$var}),
etc.

When using @command{sed}, don't use @option{-e} except for indenting
purposes.  With the @code{s} and @code{y} commands, the preferred
separator is @samp{/} unless @samp{/} itself might appear in the pattern
or replacement, in which case you should use @samp{|}, or optionally
@samp{,} if you know the pattern and replacement cannot contain a file
name.  If none of these characters will do, choose a printable character
that cannot appear in the pattern or replacement.  Characters from the
set @samp{"#$&'()*;<=>?`|~} are good choices if the pattern or
replacement might contain a file name, since they have special meaning
to the shell and are less likely to occur in file names.

@xref{Macro Definitions}, for details on how to define a macro.  If a
macro doesn't use @code{AC_REQUIRE}, is expected to never be the object
of an @code{AC_REQUIRE} directive, and macros required by other macros
inside arguments do not need to be expanded before this macro, then
use @code{m4_define}.  In case of doubt, use @code{AC_DEFUN}.
Also take into account that public third-party macros need to use
@code{AC_DEFUN} in order to be found by @command{aclocal}
(@pxref{Extending aclocal,,, automake, GNU Automake}).
All the @code{AC_REQUIRE} statements should be at the beginning of the
macro, and each statement should be followed by @code{dnl}.

You should not rely on the number of arguments: instead of checking
whether an argument is missing, test that it is not empty.  It provides
both a simpler and a more predictable interface to the user, and saves
room for further arguments.

Unless the macro is short, try to leave the closing @samp{])} at the
beginning of a line, followed by a comment that repeats the name of the
macro being defined.  This introduces an additional newline in
@command{configure}; normally, that is not a problem, but if you want to
remove it you can use @samp{[]dnl} on the last line.  You can similarly
use @samp{[]dnl} after a macro call to remove its newline.  @samp{[]dnl}
is recommended instead of @samp{dnl} to ensure that M4 does not
interpret the @samp{dnl} as being attached to the preceding text or
macro output.  For example, instead of:

@example
AC_DEFUN([AC_PATH_X],
[AC_MSG_CHECKING([for X])
AC_REQUIRE_CPP()
@r{# @dots{}omitted@dots{}}
  AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
fi])
@end example

@noindent
you would write:

@example
AC_DEFUN([AC_PATH_X],
[AC_REQUIRE_CPP()[]dnl
AC_MSG_CHECKING([for X])
@r{# @dots{}omitted@dots{}}
  AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
fi[]dnl
])# AC_PATH_X
@end example

If the macro is long, try to split it into logical chunks.  Typically,
macros that check for a bug in a function and prepare its
@code{AC_LIBOBJ} replacement should have an auxiliary macro to perform
this setup.  Do not hesitate to introduce auxiliary macros to factor
your code.

In order to highlight the recommended coding style, here is a macro
written the old way:

@example
dnl Check for EMX on OS/2.
dnl _AC_EMXOS2
AC_DEFUN(_AC_EMXOS2,
[AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
ac_cv_emxos2=yes, ac_cv_emxos2=no)])
test "x$ac_cv_emxos2" = xyes && EMXOS2=yes])
@end example

@noindent
and the new way:

@example
# _AC_EMXOS2
# ----------
# Check for EMX on OS/2.
m4_define([_AC_EMXOS2],
[AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
                   [ac_cv_emxos2=yes],
                   [ac_cv_emxos2=no])])
test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl
])# _AC_EMXOS2
@end example




@c ============================================= Portable Shell Programming

@node Portable Shell
@chapter Portable Shell Programming
@cindex Portable shell programming

When writing your own checks, there are some shell-script programming
techniques you should avoid in order to make your code portable.  The
Bourne shell and upward-compatible shells like the Korn shell and Bash
have evolved over the years, and many features added to the original
System7 shell are now supported on all interesting porting targets.
However, the following discussion between Russ Allbery and Robert Lipe
is worth reading:

@noindent
Russ Allbery:

@quotation
The GNU assumption that @command{/bin/sh} is the one and only shell
leads to a permanent deadlock.  Vendors don't want to break users'
existing shell scripts, and there are some corner cases in the Bourne
shell that are not completely compatible with a POSIX shell.  Thus,
vendors who have taken this route will @emph{never} (OK@dots{}``never say
never'') replace the Bourne shell (as @command{/bin/sh}) with a
POSIX shell.
@end quotation

@noindent
Robert Lipe:

@quotation
This is exactly the problem.  While most (at least most System V's) do
have a Bourne shell that accepts shell functions most vendor
@command{/bin/sh} programs are not the POSIX shell.

So while most modern systems do have a shell @emph{somewhere} that meets the
POSIX standard, the challenge is to find it.
@end quotation

For this reason, part of the job of M4sh (@pxref{Programming in M4sh})
is to find such a shell.  But to prevent trouble, if you're not using
M4sh you should not take advantage of features that were added after Unix
version 7, circa 1977 (@pxref{Systemology}); you should not use aliases,
negated character classes, or even @command{unset}.  @code{#} comments,
while not in Unix version 7, were retrofitted in the original Bourne
shell and can be assumed to be part of the least common denominator.

On the other hand, if you're using M4sh you can assume that the shell
has the features that were added in SVR2 (circa 1984), including shell
functions,
@command{return}, @command{unset}, and I/O redirection for builtins.  For
more information, refer to @uref{https://@/www.in-ulm.de/@/~mascheck/@/bourne/}.
However, some pitfalls have to be avoided for portable use of these
constructs; these will be documented in the rest of this chapter.
See in particular @ref{Shell Functions} and @ref{Limitations of
Builtins, , Limitations of Shell Builtins}.

The set of external programs you should run in a @command{configure} script
is fairly small.  @xref{Utilities in Makefiles, , Utilities in
Makefiles, standards, The GNU Coding Standards}, for the list.  This
restriction allows users to start out with a fairly small set of
programs and build the rest, avoiding too many interdependencies between
packages.

Some of these external utilities have a portable subset of features; see
@ref{Limitations of Usual Tools}.

There are other sources of documentation about shells.  The
specification for the POSIX
@uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/V3_chap02.html,
Shell Command Language}, though more generous than the restrictive shell
subset described above, is fairly portable nowadays.  Also please see
@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/, the Shell FAQs}.

@menu
* Systemology::                 A zoology of operating systems
* Shellology::                  A zoology of shells
* Invoking the Shell::          Invoking the shell as a command
* Here-Documents::              Quirks and tricks
* File Descriptors::            FDs and redirections
* Signal Handling::             Shells, signals, and headaches
* File System Conventions::     File names
* Shell Pattern Matching::      Pattern matching
* Shell Substitutions::         Variable and command expansions
* Assignments::                 Varying side effects of assignments
* Parentheses::                 Parentheses in shell scripts
* Special Shell Variables::     Variables you should not change
* Shell Functions::             What to look out for if you use them
* Limitations of Builtins::     Portable use of not so portable /bin/sh
* Limitations of Usual Tools::  Portable use of portable tools
@end menu


@node Systemology
@section Systemology
@cindex Systemology

This section aims at presenting some systems and pointers to
documentation.  It may help you addressing particular problems reported
by users.

@uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX-conforming
systems} are derived from the
@uref{https://@/en.wikipedia.org/@/wiki/@/Unix, Unix operating system}.

The @uref{https://@/bhami.com/@/rosetta.html, Rosetta Stone for Unix}
contains a table correlating the features of various POSIX-conforming
systems.  @uref{https://@/www.levenez.com/@/unix/, Unix History} is a
simplified diagram of how many Unix systems were derived from each
other.

@uref{https://@/heirloom.sourceforge.net/, The Heirloom Project}
provides some variants of traditional implementations of Unix utilities.

@table @asis
@item Darwin
@cindex Darwin
@cindex macOS
@cindex Mac OS X
Darwin is a partially proprietary operating system maintained by Apple
Computer and used by most of their products.  It is also known as macOS,
iOS, etc.@: depending on the exact variant.  Older versions were called
``Mac OS X.''

By default the file system will be case insensitive, albeit case
preserving.  This can cause nasty problems: for instance, the
installation attempt for a package having an @file{INSTALL} file can
result in @samp{make install} reporting that nothing is to be done!

Darwin does support case-sensitive file systems, but they must be
formatted specially as such, and Apple discourages use of a
case-sensitive volume for the base operating system.  To build software
that expects case-sensitive filenames, it is best to create a separate
disk volume or disk image formatted as case sensitive; this can be done
using the @command{diskutil} command or the Disk Utility application.

@item QNX
@cindex QNX
@c FIXME: Please, if you feel like writing something more precise,
@c it'd be great.  In particular, I can't understand the difference with
@c QNX Neutrino.
QNX is a realtime operating system running on Intel architecture
meant to be scalable from the small embedded systems to the hundred
processor super-computer.  More
information is available on the
@uref{https://@/blackberry.qnx.com/@/en, QNX home page}.

@item Unix version 7
@cindex Unix version 7
@cindex V7
Officially this was called the ``Seventh Edition'' of ``the UNIX
time-sharing system'' but we use the more-common name ``Unix version 7''.
Documentation is available in the
@uref{https://@/s3.amazonaws.com/@/plan9-bell-labs/@/7thEdMan/@/index.html,
Unix Seventh Edition Manual}.
Previous versions of Unix are called ``Unix version 6'', etc., but
they were not as widely used.
@end table


@node Shellology
@section Shellology
@cindex Shellology

There are several families of shells, most prominently the Bourne family
and the C shell family which are deeply incompatible.  If you want to
write portable shell scripts, avoid members of the C shell family.  The
@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/@/shell-differences/, the
Shell difference FAQ} includes a small history of POSIX shells, and a
comparison between several of them.

Below we describe some of the members of the Bourne shell family.

@table @asis
@item Ash
@cindex Ash
Ash is often used on GNU/Linux and BSD
systems as a light-weight Bourne-compatible shell.  Ash 0.2 has some
bugs that are fixed in the 0.3.x series, but portable shell scripts
should work around them, since version 0.2 is still shipped with many
GNU/Linux distributions.

To be compatible with Ash 0.2:

@itemize @minus
@item
don't use @samp{$?} after expanding empty or unset variables,
or at the start of an @command{eval}:

@example
foo=
false
$foo
echo "Do not use it: $?"
false
eval 'echo "Do not use it: $?"'
@end example

@item
don't use command substitution within variable expansion:

@example
cat $@{FOO=`bar`@}
@end example

@item
beware that single builtin substitutions are not performed by a
subshell, hence their effect applies to the current shell!  @xref{Shell
Substitutions}, item ``Command Substitution''.
@end itemize

@item Bash
@cindex Bash
To detect whether you are running Bash, test whether
@code{BASH_VERSION} is set.  To require
POSIX compatibility, run @samp{set -o posix}.  @xref{Bash POSIX
Mode, , Bash POSIX Mode, bash, The GNU Bash Reference
Manual}, for details.

@item Bash 2.05 and later
@cindex Bash 2.05 and later
Versions 2.05 and later of Bash use a different format for the
output of the @command{set} builtin, designed to make evaluating its
output easier.  However, this output is not compatible with earlier
versions of Bash (or with many other shells, probably).  So if
you use Bash 2.05 or higher to execute @command{configure},
you'll need to use Bash 2.05 for all other build tasks as well.

@item Ksh
@cindex Ksh
@cindex Korn shell
@prindex @samp{ksh}
@prindex @samp{ksh88}
@prindex @samp{ksh93}
The Korn shell is compatible with the Bourne family and it mostly
conforms to POSIX@.  It has two major variants commonly
called @samp{ksh88} and @samp{ksh93}, named after the years of initial
release.  It is usually called @command{ksh}, but is called @command{sh}
on some hosts if you set your path appropriately.

On Solaris 11, @command{/bin/sh} and @command{/usr/bin/ksh} are both
@samp{ksh93}.  On Solaris 10 and earlier, @command{/bin/sh} is a
pre-POSIX Bourne shell and the Korn shell is found elsewhere:
@prindex @command{/usr/bin/ksh} on Solaris
@command{/usr/bin/ksh} is @samp{ksh88} on Solaris 10,
@prindex @command{/usr/xpg4/bin/sh} on Solaris
@command{/usr/xpg4/bin/sh} is a POSIX-compliant variant of
@samp{ksh88} on Solaris 10 and later,
@prindex @command{/usr/dt/bin/dtksh} on Solaris
and @command{/usr/dt/bin/dtksh} is @samp{ksh93}.
Variants that are not standard may be parts of optional
packages.  There is no extra charge for these packages, but they are
not part of a minimal OS install and therefore some installations may
not have it.

@item Pdksh
@prindex @samp{pdksh}
A public-domain clone of the Korn shell called @command{pdksh} is widely
available: it has most of the @samp{ksh88} features along with a few of
its own.  It usually sets @code{KSH_VERSION}, except if invoked as
@command{/bin/sh} on OpenBSD, and similarly to Bash you can require
POSIX compatibility by running @samp{set -o posix}.  Unfortunately, with
@command{pdksh} 5.2.14 (the latest stable version as of 2025)
POSIX mode is buggy and causes @command{pdksh} to depart from POSIX in
at least one respect, see @ref{Shell Substitutions}.

@item Zsh
@cindex Zsh
To detect whether you are running @command{zsh}, test whether
@code{ZSH_VERSION} is set.  By default @command{zsh} is @emph{not}
compatible with the Bourne shell: you must execute @samp{emulate sh},
and for @command{zsh} versions before 3.1.6-dev-18 you must also
set @code{NULLCMD} to @samp{:}.  @xref{Compatibility, , Compatibility,
zsh, The Z Shell Manual}, for details.

The default Mac OS X @command{sh} was originally Zsh; it was changed to
Bash in Mac OS X 10.2 (2002) and changed back to Zsh in macOS 10.15 (2019).
@end table

@node Invoking the Shell
@section Invoking the Shell
@cindex invoking the shell
@cindex shell invocation

The Korn shell (up to at least version M-12/28/93d) has a bug when
invoked on a file whose name does not contain a slash.  It first
searches for the file's name in @env{PATH}, and if found it executes
that rather than the original file.  For example, assuming there is a
binary executable @file{/usr/bin/script} in your @env{PATH}, the last
command in the following example fails because the Korn shell finds
@file{/usr/bin/script} and refuses to execute it as a shell script:

@example
$ @kbd{touch xxyzzyz script}
$ @kbd{ksh xxyzzyz}
$ @kbd{ksh ./script}
$ @kbd{ksh script}
ksh: script: cannot execute
@end example

Bash 2.03 has a bug when invoked with the @option{-c} option: if the
option-argument ends in backslash-newline, Bash incorrectly reports a
syntax error.  The problem does not occur if a character follows the
backslash:

@example
$ @kbd{$ bash -c 'echo foo \}
> @kbd{'}
bash: -c: line 2: syntax error: unexpected end of file
$ @kbd{bash -c 'echo foo \}
> @kbd{ '}
foo
@end example

@noindent
@xref{Backslash-Newline-Empty}, for how this can cause problems in makefiles.

@node Here-Documents
@section Here-Documents
@cindex Here-documents
@cindex Shell here-documents

Because unquoted here-documents are subject to parameter expansion and
command substitution, the characters @samp{$} and @samp{`} are special
in unquoted here-documents and should be escaped by @samp{\} if you want
them as-is.  Also, @samp{\} is special if it precedes @samp{$},
@samp{`}, newline or @samp{\} itself, so @samp{\} should be doubled if
it appears before these characters and you want it as-is.

Using command substitutions in a here-document that is fed to a shell
function is not portable.  For example, with Solaris 10 @command{/bin/sh}:

@example
$ @kbd{kitty () @{ cat; @}}
$ @kbd{kitty <<EOF
> `echo ok`
> EOF}
/tmp/sh199886: cannot open
$ @kbd{echo $?}
1
@end example

Some shells mishandle large here-documents: for example,
Solaris 10 @command{dtksh} and the UnixWare 7.1.1 POSIX shell, which are
derived from Korn shell version M-12/28/93d, mishandle braced variable
expansion that crosses a 1024- or 4096-byte buffer boundary
within a here-document.  Only the part of the variable name after the boundary
is used.  For example, @code{$@{variable@}} could be replaced by the expansion
of @code{$@{ble@}}.  If the end of the variable name is aligned with the block
boundary, the shell reports an error, as if you used @code{$@{@}}.
Instead of @code{$@{variable-default@}}, the shell may expand
@code{$@{riable-default@}}, or even @code{$@{fault@}}.  This bug can often
be worked around by omitting the braces: @code{$variable}.  The bug was
fixed in
@samp{ksh93g} (1998-04-30) but as of 2006 many operating systems were
still shipping older versions with the bug.

Empty here-documents are not portable either; with the following code,
@command{zsh} up to at least version 4.3.10 creates a file with a single
newline, whereas other shells create an empty file:

@example
cat >file <<EOF
EOF
@end example

Many shells (including the Bourne shell) implement here-documents
inefficiently.  In particular, some shells can be extremely inefficient when
a single statement contains many here-documents.  For instance if your
@file{configure.ac} includes something like:

@example
@group
AS_IF([<cross_compiling>],
  [assume this and that],
  [check this
   check that
   check something else
   @dots{}
   on and on forever
   @dots{}])
@end group
@end example

A shell parses the whole @code{if}/@code{fi} construct generated by
@code{AS_IF}, creating
temporary files for each here-document in it.  Some shells create links
for such here-documents on every @code{fork}, so that the clean-up code
they had installed correctly removes them.  It is creating the links
that can take the shell forever.

Moving the tests out of the @code{if}/@code{fi}, or creating multiple
@code{if}/@code{fi} constructs, would improve the performance
significantly.  Anyway, this kind of construct is not exactly the
typical use of Autoconf.  In fact, it's even not recommended, because M4
macros can't look into shell conditionals, so we may fail to expand a
macro when it was expanded before in a conditional path, and the
condition turned out to be false at runtime, and we end up not
executing the macro at all.

Be careful with the use of @samp{<<-} to unindent here-documents.  The
behavior is only portable for stripping leading @key{TAB}s, and things
can silently break if an overzealous editor converts to using leading
spaces (not all shells are nice enough to warn about unterminated
here-documents).

@example
$ @kbd{printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done}
1
 2
done
$ @kbd{printf 'cat <<-x\n 1\n  2\n x\n' | bash-3.2 && echo done}
 1
  2
 x
done
@end example

@node File Descriptors
@section File Descriptors
@cindex Descriptors
@cindex File descriptors
@cindex Shell file descriptors

Most shells, if not all (including Bash, Zsh, Ash), output traces on
stderr, even for subshells.  This might result in undesirable content
if you meant to capture the standard-error output of the inner command:

@example
$ @kbd{ash -x -c '(eval "echo foo >&2") 2>stderr'}
$ @kbd{cat stderr}
+ eval echo foo >&2
+ echo foo
foo
$ @kbd{bash -x -c '(eval "echo foo >&2") 2>stderr'}
$ @kbd{cat stderr}
+ eval 'echo foo >&2'
++ echo foo
foo
$ @kbd{zsh -x -c '(eval "echo foo >&2") 2>stderr'}
@i{# Traces on startup files deleted here.}
$ @kbd{cat stderr}
+zsh:1> eval echo foo >&2
+zsh:1> echo foo
foo
@end example

@noindent
One workaround is to grep out uninteresting lines, hoping not to remove
good ones.

If you intend to redirect both standard error and standard output,
redirect standard output first.  This works better with AIX,
since its shell mishandles tracing if standard error is redirected
first:

@example
$ @kbd{sh -x -c ': 2>err >out'}
+ :
+ 2> err $ @kbd{cat err}
1> out
@end example

Don't try to redirect the standard error of a command substitution.  It
must be done @emph{inside} the command substitution.  When running
@samp{: `cd /zorglub` 2>/dev/null} expect the error message to
escape, while @samp{: `cd /zorglub 2>/dev/null`} works properly.

On the other hand, some shells, such as Solaris or FreeBSD
@command{/bin/sh}, warn about missing programs before performing
redirections.  Therefore, to silently check whether a program exists, it
is necessary to perform redirections on a subshell or brace group:
@example
$ @kbd{/bin/sh -c 'nosuch 2>/dev/null'}
nosuch: not found
$ @kbd{/bin/sh -c '(nosuch) 2>/dev/null'}
$ @kbd{/bin/sh -c '@{ nosuch; @} 2>/dev/null'}
$ @kbd{bash -c 'nosuch 2>/dev/null'}
@end example

FreeBSD 6.2 sh may mix the trace output lines from the statements in a
shell pipeline.

It is worth noting that Zsh (but not Ash nor Bash) makes it possible
in assignments though: @samp{foo=`cd /zorglub` 2>/dev/null}.

Some shells, like @command{ash}, don't recognize bi-directional
redirection (@samp{<>}).  And even on shells that recognize it, it is
not portable to use on fifos: POSIX does not require read-write support
for named pipes, and Cygwin does not support it:

@example
$ @kbd{mkfifo fifo}
$ @kbd{exec 5<>fifo}
$ @kbd{echo hi >&5}
bash: echo: write error: Communication error on send
@end example

@noindent
Furthermore, versions of @command{dash} before 0.5.6 mistakenly truncate
regular files when using @samp{<>}:

@example
$ @kbd{echo a > file}
$ @kbd{bash -c ': 1<>file'; cat file}
a
$ @kbd{dash -c ': 1<>file'; cat file}
$ rm a
@end example

Solaris 10 @code{/bin/sh} executes redirected compound commands
in a subshell, while other shells don't:

@example
$ @kbd{/bin/sh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
0
$ @kbd{ksh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
1
$ @kbd{bash -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
1
@end example

Solaris 10 @command{sh} will try to optimize away a @command{:} command
(even if it is redirected) in a loop after the first iteration, or in a
shell function after the first call:

@example
$ @kbd{for i in 1 2 3 ; do : >x$i; done}
$ @kbd{ls x*}
x1
$ @kbd{f () @{ : >$1; @}; f y1; f y2; f y3;}
$ @kbd{ls y*}
y1
@end example

@noindent
As a workaround, @command{echo} or @command{eval} can be used.

When running a subsidiary program be careful if descriptor 0 is not open
for reading or decriptors 1 and 2 are not open for writing,
as the subsidiary program might not behave as expected.
In particular, don't rely on file descriptors 0, 1, and 2 remaining closed in a
subsidiary program.  If any of these descriptors is closed, the
operating system may open an unspecified file for the descriptor in the
newly created process.

If you want a file descriptor above 2 to be inherited into a child
process, then you must use redirections specific to that command or a
containing subshell or command group, rather than relying on
@command{exec} in the shell. In @command{ksh} as well as HP-UX
@command{sh}, file descriptors above 2 which are opened using
@samp{exec @var{n}>file} are closed by a subsequent @samp{exec} (such as
that involved in the fork-and-exec which runs a program or script):

@example
$ @kbd{echo 'echo hello >&5' >k}
$ @kbd{/bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
hello
$ @kbd{bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
hello
$ @kbd{ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
./k[1]: 5: cannot open [Bad file number]
$ @kbd{ksh -c '(ksh ./k) 5>t; cat t'}
hello
$ @kbd{ksh -c '@{ ksh ./k; @} 5>t; cat t'}
hello
$ @kbd{ksh -c '5>t ksh ./k; cat t}
hello
@end example

Don't rely on duplicating a closed file descriptor to cause an
error.  With Solaris 10 @command{/bin/sh}, failed duplication is silently
ignored, which can cause unintended leaks to the original file
descriptor.  In this example, observe the leak to standard output:

@example
$ @kbd{bash -c 'echo hi >&3' 3>&-; echo $?}
bash: 3: Bad file descriptor
1
$ @kbd{/bin/sh -c 'echo hi >&3' 3>&-; echo $?}
hi
0
@end example

Fortunately, an attempt to close an already closed file descriptor will
portably succeed.  Likewise, it is safe to use either style of
@samp{@var{n}<&-} or @samp{@var{n}>&-} for closing a file descriptor,
even if it doesn't match the read/write mode that the file descriptor
was opened with.

DOS variants cannot rename or remove open files, such as in
@samp{mv foo bar >foo} or @samp{rm foo >foo}, even though this is
perfectly portable among POSIX hosts.

A few ancient systems reserved some file descriptors.  By convention,
file descriptor 3 was opened to @file{/dev/tty} when you logged into
Eighth Edition (1985) through Tenth Edition Unix (1989).  File
descriptor 4 had a special use on the Stardent/Kubota Titan (circa
1990), though we don't now remember what it was.  Both these systems are
obsolete, so it's now safe to treat file descriptors 3 and 4 like any
other file descriptors.

On the other hand, you can't portably use multi-digit file descriptors.
@command{dash} and Solaris @command{ksh} don't understand any file
descriptor larger than @samp{9}:

@example
$ @kbd{bash -c 'exec 10>&-'; echo $?}
0
$ @kbd{ksh -c 'exec 9>&-'; echo $?}
0
$ @kbd{ksh -c 'exec 10>&-'; echo $?}
ksh[1]: exec: 10: not found
127
$ @kbd{dash -c 'exec 9>&-'; echo $?}
0
$ @kbd{dash -c 'exec 10>&-'; echo $?}
exec: 1: 10: not found
2
@end example

@c <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
@node Signal Handling
@section Signal Handling
@cindex Signal handling in the shell
@cindex Signals, shells and

Portable handling of signals within the shell is another major source of
headaches.  This is worsened by the fact that various different, mutually
incompatible approaches are possible in this area, each with its
distinctive merits and demerits.  A detailed description of these possible
approaches, as well as of their pros and cons, can be found in
@uref{https://www.cons.org/cracauer/sigint.html, this article}.

Solaris 10 @command{/bin/sh} automatically traps most signals by default;
the shell still exits with error upon termination by one of those signals,
but in such a case the exit status might be somewhat unexpected (even if
allowed by POSIX, strictly speaking):
@c FIXME: We had a reference for this behavior but the website no longer
@c exists and the page is not in the Internet Archive. --zw 2020-07-10.

@example
$ @kbd{bash -c 'kill -1 $$'; echo $?} # Will exit 128 + (signal number).
Hangup
129
$ @kbd{/bin/ksh -c 'kill -15 $$'; echo $?} # Likewise.
Terminated
143
$ @kbd{for sig in 1 2 3 15; do}
> @kbd{  echo $sig:}
> @kbd{  /bin/sh -c "kill -$s \$\$"; echo $?}
> @kbd{done}
signal 1:
Hangup
129
signal 2:
208
signal 3:
208
signal 15:
208
@end example

This gets even worse if one is using the POSIX ``wait'' interface to get
details about the shell process terminations: it will result in the shell
having exited normally, rather than by receiving a signal.

@example
$ @kbd{cat > foo.c <<'END'}
#include <stdio.h>    /* for printf */
#include <stdlib.h>   /* for system */
#include <sys/wait.h> /* for WIF* macros */
int main(void)
@{
  int status = system ("kill -15 $$");
  printf ("Terminated by signal: %s\n",
          WIFSIGNALED (status) ? "yes" : "no");
  printf ("Exited normally: %s\n",
          WIFEXITED (status) ? "yes" : "no");
  return 0;
@}
END
@c $$ font-lock
$ @kbd{cc -o foo foo.c}
$ @kbd{./a.out} # On GNU/Linux
Terminated by signal: no
Exited normally: yes
$ @kbd{./a.out} # On Solaris 10
Terminated by signal: yes
Exited normally: no
@end example

Various shells seem to handle @code{SIGQUIT} specially: they ignore it even
if it is not blocked, and even if the shell is not running interactively
(in fact, even if the shell has no attached tty); among these shells
are at least Bash (from version 2 onward), Zsh 4.3.12, Solaris 10
@code{/bin/ksh} and @code{/usr/xpg4/bin/sh}, and AT&T @code{ksh93} (2011).
Still, @code{SIGQUIT} seems to be trappable quite portably within all
these shells.  OTOH, some other shells doesn't special-case the handling
of @code{SIGQUIT}; among these shells are at least @code{pdksh} 5.2.14,
Solaris 10 and NetBSD 5.1 @code{/bin/sh}, and the Almquist Shell 0.5.5.1.

Some shells (especially Korn shells and derivatives) might try to
propagate to themselves a signal that has killed a child process; this is
not a bug, but a conscious design choice (although its overall value might
be debatable).  The exact details of how this is attained vary from shell
to shell.  For example, upon running @code{perl -e 'kill 2, $$'}, after
the perl process has been interrupted, AT&T @code{ksh93} (2011) will
proceed to send itself a @code{SIGINT}, while Solaris 10 @code{/bin/ksh}
and @code{/usr/xpg4/bin/sh} will proceed to exit with status 130 (i.e.,
128 + 2). In any case, if there is an active trap associated with
@code{SIGINT}, those shells will correctly execute it.

@c See: <https://www.austingroupbugs.net/view.php?id=51>
Some Korn shells, when a child process die due receiving a signal with
signal number @var{n}, can leave in @samp{$?} an exit status of
256+@var{n} instead of the more common 128+@var{n}.  Observe the
difference between AT&T @code{ksh93} (2011) and @code{bash} 4.1.5 on
Debian:

@example
$ @kbd{/bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'}
/bin/ksh: line 1: 7837: Hangup
257
$ @kbd{/bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'}
/bin/bash: line 1:  7861 Hangup        (sh -c "kill -1 \$\$")
129
@end example

@noindent
This @command{ksh} behavior is allowed by POSIX, if implemented with
due care; see this @uref{https://www.austingroupbugs.net/view.php?id=51,
Austin Group discussion} for more background.  However, if it is not
implemented with proper care, such a behavior might cause problems
in some corner cases.  To see why, assume we have a ``wrapper'' script
like this:

@example
#!/bin/sh
# Ignore some signals in the shell only, not in its child processes.
trap : 1 2 13 15
wrapped_command "$@@"
ret=$?
other_command
exit $ret
@end example

@noindent
If @command{wrapped_command} is interrupted by a @code{SIGHUP} (which
has signal number 1), @code{ret} will be set to 257.  Unless the
@command{exit} shell builtin is smart enough to understand that such
a value can only have originated from a signal, and adjust the final
wait status of the shell appropriately, the value 257 will just get
truncated to 1 by the closing @code{exit} call, so that a caller of
the script will have no way to determine that termination by a signal
was involved.  Observe the different behavior of AT&T @code{ksh93}
(2011) and @code{bash} 4.1.5 on Debian:

@example
$ @kbd{cat foo.sh}
#!/bin/sh
sh -c 'kill -1 $$'
ret=$?
echo $ret
exit $ret
$ @kbd{/bin/ksh foo.sh; echo $?}
foo.sh: line 2: 12479: Hangup
257
1
$ @kbd{/bin/bash foo.sh; echo $?}
foo.sh: line 2: 12487 Hangup        (sh -c 'kill -1 $$')
129
129
@end example

@node File System Conventions
@section File System Conventions
@cindex File system conventions

Autoconf uses shell-script processing extensively, so the file names
that it processes should not contain characters that are special to the
shell.  Special characters include space, tab, newline, NUL, and
the following:

@example
" # $ & ' ( ) * ; < = > ? [ \ ` |
@end example

Also, file names should not begin with @samp{~} or @samp{-}, and should
contain neither @samp{-} immediately after @samp{/} nor @samp{~}
immediately after @samp{:}.  On POSIX-like platforms, directory names
should not contain @samp{:}, as this runs afoul of @samp{:} used as the
path separator.

These restrictions apply not only to the files that you distribute, but
also to the absolute file names of your source, build, and destination
directories.

On some POSIX-like platforms, @samp{!} and @samp{^} are special too, so
they should be avoided.

POSIX lets implementations treat leading @file{//} specially, but
requires leading @file{///} and beyond to be equivalent to @file{/}.
Most Unix variants treat @file{//} like @file{/}.  However, some treat
@file{//} as a ``super-root'' that can provide access to files that are
not otherwise reachable from @file{/}.  The super-root tradition began
with Apollo Domain/OS, which died out long ago, but unfortunately Cygwin
has revived it.

While @command{autoconf} and friends are usually run on some POSIX
variety, they can be used on other systems, most notably DOS
variants.  This impacts several assumptions regarding file names.

@noindent
For example, the following code:

@example
case $foo_dir in
  /*) # Absolute
     ;;
  *)
     foo_dir=$dots$foo_dir ;;
esac
@end example

@noindent
fails to properly detect absolute file names on those systems, because
they can use a drivespec, and usually use a backslash as directory
separator.  If you want to be portable to DOS variants (at the
price of rejecting valid but oddball POSIX file names like @file{a:\b}),
you can check for absolute file names like this:

@cindex absolute file names, detect
@example
case $foo_dir in
  [\\/]* | ?:[\\/]* ) # Absolute
     ;;
  *)
     foo_dir=$dots$foo_dir ;;
esac
@end example

@noindent
Make sure you quote the brackets if appropriate and keep the backslash as
first character.  @xref{case, , Limitations of Shell Builtins}.

Also, because the colon is used as part of a drivespec, these systems don't
use it as path separator.  When creating or accessing paths, you can use the
@code{PATH_SEPARATOR} output variable instead.  @command{configure} sets this
to the appropriate value for the build system (@samp{:} or @samp{;}) when it
starts up.

File names need extra care as well.  While DOS variants
that are POSIXy enough to run @command{autoconf} (such as DJGPP)
are usually able to handle long file names properly, there are still
limitations that can seriously break packages.  Several of these issues
can be easily detected by the
@uref{https://@/ftp.gnu.org/@/gnu/@/non-gnu/@/doschk/@/doschk-1.1.tar.gz, doschk}
package.

A short overview follows; problems are marked with SFN/LFN to
indicate where they apply: SFN means the issues are only relevant to
plain DOS, not to DOS under Microsoft Windows
variants, while LFN identifies problems that exist even under
Microsoft Windows variants.

@table @asis
@item No multiple dots (SFN)
DOS cannot handle multiple dots in file names.  This is an especially
important thing to remember when building a portable configure script,
as @command{autoconf} uses a .in suffix for template files.

This is perfectly OK on POSIX variants:

@example
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([source.c foo.bar])
AC_OUTPUT
@end example

@noindent
but it causes problems on DOS, as it requires @samp{config.h.in},
@samp{source.c.in} and @samp{foo.bar.in}.  To make your package more portable
to DOS-based environments, you should use this instead:

@example
AC_CONFIG_HEADERS([config.h:config.hin])
AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
AC_OUTPUT
@end example

@item No leading dot (SFN)
DOS cannot handle file names that start with a dot.  This is usually
not important for @command{autoconf}.

@item Case insensitivity (LFN)
DOS is case insensitive, so you cannot, for example, have both a
file called @samp{INSTALL} and a directory called @samp{install}.  This
also affects @command{make}; if there's a file called @samp{INSTALL} in
the directory, @samp{make install} does nothing (unless the
@samp{install} target is marked as PHONY).

@item The 8+3 limit (SFN)
Because the DOS file system only stores the first 8 characters of
the file name and the first 3 of the extension, those must be unique.
That means that @file{foobar-part1.c}, @file{foobar-part2.c} and
@file{foobar-prettybird.c} all resolve to the same file name
(@file{FOOBAR-P.C}).  The same goes for @file{foo.bar} and
@file{foo.bartender}.

The 8+3 limit is not usually a problem under Microsoft Windows, as it
uses numeric
tails in the short version of file names to make them unique.  However, a
registry setting can turn this behavior off.  While this makes it
possible to share file trees containing long file names between SFN
and LFN environments, it also means the above problem applies there
as well.

@item Invalid characters (LFN)
Some characters are invalid in DOS file names, and should therefore
be avoided.  In a LFN environment, these are @samp{/}, @samp{\},
@samp{?}, @samp{*}, @samp{:}, @samp{<}, @samp{>}, @samp{|} and @samp{"}.
In a SFN environment, other characters are also invalid.  These
include @samp{+}, @samp{,}, @samp{[} and @samp{]}.

@item Invalid names (LFN)
Some DOS file names are reserved, and cause problems if you
try to use files with those names.  These names include @file{CON},
@file{AUX}, @file{COM1}, @file{COM2}, @file{COM3}, @file{COM4},
@file{LPT1}, @file{LPT2}, @file{LPT3}, @file{NUL}, and @file{PRN}.
File names are case insensitive, so even names like
@file{aux/config.guess} are disallowed.

@end table

@node Shell Pattern Matching
@section Shell Pattern Matching
@cindex Shell pattern matching

Nowadays portable patterns can use negated character classes like
@samp{[!-aeiou]}.  The older syntax @samp{[^-aeiou]} is supported by
some shells but not others; hence portable scripts should never use
@samp{^} as the first character of a bracket pattern.

Outside the C locale, patterns like @samp{[a-z]} are problematic since
they may match characters that are not lower-case letters.

@node Shell Substitutions
@section Shell Substitutions
@cindex Shell substitutions

Contrary to a persistent urban legend, the Bourne shell does not
systematically split variables and back-quoted expressions, in particular
on the right-hand side of assignments and in the argument of @code{case}.
For instance, the following code:

@example
case "$given_srcdir" in
.)  top_srcdir="`printf '%s\n' "$dots" | sed 's|/$||'`" ;;
*)  top_srcdir="$dots$given_srcdir" ;;
esac
@end example

@noindent
is more readable when written as:

@example
case $given_srcdir in
.)  top_srcdir=`printf '%s\n' "$dots" | sed 's|/$||'` ;;
*)  top_srcdir=$dots$given_srcdir ;;
esac
@end example

@noindent
and in fact it is even @emph{more} portable: in the first case of the
first attempt, the computation of @code{top_srcdir} is not portable,
since not all shells properly understand @code{"`@dots{}"@dots{}"@dots{}`"},
for example Solaris 10 @command{ksh}:

@example
$ @kbd{foo="`echo " bar" | sed 's, ,,'`"}
ksh: : cannot execute
ksh: bar | sed 's, ,,': cannot execute
@end example

@noindent
POSIX does not specify behavior for this sequence.  On the other hand,
behavior for @code{"`@dots{}\"@dots{}\"@dots{}`"} is specified by POSIX,
but in practice, not all shells understand it the same way: pdksh 5.2.14
prints spurious quotes when in POSIX mode:

@example
$ @kbd{echo "`echo \"hello\"`"}
hello
$ @kbd{set -o posix}
$ @kbd{echo "`echo \"hello\"`"}
"hello"
@end example

@noindent
There is just no portable way to use double-quoted strings inside
double-quoted back-quoted expressions (pfew!).

Bash 4.1 has a bug where quoted empty strings adjacent to unquoted
parameter expansions are elided during word splitting.  Meanwhile, zsh
does not perform word splitting except when in Bourne compatibility
mode.  In the example below, the correct behavior is to have five
arguments to the function, and exactly two spaces on either side of the
middle @samp{-}, since word splitting collapses multiple spaces in
@samp{$f} but leaves empty arguments intact.

@example
$ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f="  -  "; n - ""$f"" -'}
3- - -
$ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f="  -  "; n - ""$f"" -'}
5-  -  -
$ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f="  -  "; n - ""$f"" -'}
3-   -   -
$ @kbd{zsh -c 'emulate sh;}
> @kbd{n() @{ echo "$#$@@"; @}; f="  -  "; n - ""$f"" -'}
5-  -  -
@end example

@noindent
You can work around this by doing manual word splitting, such as using
@samp{"$str" $list} rather than @samp{"$str"$list}.

There are also portability pitfalls with particular expansions:

@table @code
@item $@@
@cindex @code{"$@@"}
Autoconf macros often use the @command{set} command to update
@samp{$@@}, so if you are writing shell code intended for
@command{configure} you should not assume that the value of @samp{$@@}
persists for any length of time.

You may see usages like @samp{$@{1+"$@@"@}} in older shell scripts
designed to work around a portability problem in ancient shells.
Unfortunately this runs afoul of bugs in more-recent shells, and
nowadays it is better to use plain @samp{"$@@"} instead.

The portability problem with ancient shells was significant.
When there are no positional arguments @samp{"$@@"} should be discarded,
but the original Unix version 7 Bourne shell mistakenly treated it as
equivalent to @samp{""} instead, and many ancient shells followed its lead.

For many years shell scripts worked around this portability problem by
using @samp{$@{1+"$@@"@}} instead of @samp{"$@@"}, and you may see this
usage in older scripts.  Unfortunately, @samp{$@{1+"$@@"@}} does not
work with @command{ksh93} M 93t+ (2009) as shipped in AIX 7.2 (2015),
as this shell drops a trailing empty argument:

@example
$ @kbd{set a b c ""}
$ @kbd{set $@{1+"$@@"@}}
$ @kbd{echo $#}
3
@end example

Also, @samp{$@{1+"$@@"@}} does not work with Zsh 4.2.6 (2005) and
earlier, as shipped in Mac OS X releases before 10.5, as this old Zsh
incorrectly word splits the result:

@example
zsh $ @kbd{emulate sh}
zsh $ @kbd{for i in "$@@"; do echo $i; done}
Hello World
!
zsh $ @kbd{for i in $@{1+"$@@"@}; do echo $i; done}
Hello
World
!
@end example

To work around these problems Autoconf does two things.  First, in the
shell code that it generates Autoconf avoids @samp{"$@@"} if it is
possible that there may be no positional arguments.  You can use this
workaround in your own code, too, if you want it to be portable to
ancient shells.  For example, instead of:

@example
cat conftest.c "$@@"
@end example

you can use this:

@example
case $# in
  0) cat conftest.c;;
  *) cat conftest.c "$@@";;
esac
@end example

@noindent
Second, Autoconf-generated @command{configure} scripts work around most
of the old Zsh problem by using Zsh's ``global aliases'' to convert
@samp{$@{1+"$@@"@}} into @samp{"$@@"} by itself:

@example
test $@{ZSH_VERSION+y@} && alias -g '$@{1+"$@@"@}'='"$@@"'
@end example

This workaround is for the benefit of any instances of
@samp{$@{1+"$@@"@}} in user-written code appearing in
@command{configure} scripts.  However, it is not a complete solution, as
Zsh recognizes the alias only when a shell word matches it exactly,
which means older Zsh still mishandles more-complicated cases like
@samp{"foo"$@{1+"$@@"@}}.

@item $@{10@}
@cindex positional parameters
The 10th, 11th, @dots{} positional parameters can be accessed only after
a @code{shift}.  The 7th Edition shell reported an error if given
@code{$@{10@}}, and
Solaris 10 @command{/bin/sh} still acts that way:

@example
$ @kbd{set 1 2 3 4 5 6 7 8 9 10}
$ @kbd{echo $@{10@}}
bad substitution
@end example

Conversely, not all shells obey the POSIX rule that when braces are
omitted, multiple digits beyond a @samp{$} imply the single-digit
positional parameter expansion concatenated with the remaining literal
digits.  To work around the issue, you must use braces.

@example
$ @kbd{bash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
a0 a0
$ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
j a0
@end example

@item $@{@var{var}-@var{value}@}
@itemx $@{@var{var}:-@var{value}@}
@itemx $@{@var{var}=@var{value}@}
@itemx $@{@var{var}:=@var{value}@}
@itemx $@{@var{var}?@var{value}@}
@itemx $@{@var{var}:?@var{value}@}
@itemx $@{@var{var}+@var{value}@}
@itemx $@{@var{var}:+@var{value}@}
@cindex @code{$@{@var{var}-@var{value}@}}
@cindex @code{$@{@var{var}=@var{value}@}}
@cindex @code{$@{@var{var}?@var{value}@}}
@cindex @code{$@{@var{var}+@var{value}@}}
@c Info cannot handle ':' in index entries.
@ifnotinfo
@cindex @code{$@{@var{var}:-@var{value}@}}
@cindex @code{$@{@var{var}:=@var{value}@}}
@cindex @code{$@{@var{var}:?@var{value}@}}
@cindex @code{$@{@var{var}:+@var{value}@}}
@end ifnotinfo
When using @samp{$@{@var{var}-@var{value}@}} or
similar notations that modify a parameter expansion,
POSIX requires that @var{value} must be a single shell word,
which can contain quoted strings but cannot contain unquoted spaces.
If this requirement is not met Solaris 10 @command{/bin/sh}
sometimes complains, and anyway the behavior is not portable.

@example
$ @kbd{/bin/sh -c 'echo $@{a-b c@}'}
/bin/sh: bad substitution
$ @kbd{/bin/sh -c 'echo $@{a-'\''b c'\''@}'}
b c
$ @kbd{/bin/sh -c 'echo "$@{a-b c@}"'}
b c
$ @kbd{/bin/sh -c 'cat <<EOF
$@{a-b c@}
EOF}
b c
@end example

Most shells treat the special parameters @code{*} and @code{@@} as being
unset if there are no positional parameters.  However, some shells treat
them as being set to the empty string.  POSIX does not clearly specify
either behavior.

@example
$ @kbd{bash -c 'echo "* is $@{*-unset@}."'}
* is unset.
$ @kbd{dash -c 'echo "* is $@{*-unset@}."'}
* is .
@end example

According to POSIX, if an expansion occurs inside double quotes, then
the use of unquoted double quotes within @var{value} is unspecified, and
any single quotes become literal characters; in that case, escaping must
be done with backslash.  Likewise, the use of unquoted here-documents is
a case where double quotes have unspecified results:

@example
$ @kbd{/bin/sh -c 'echo "$@{a-"b  c"@}"'}
/bin/sh: bad substitution
$ @kbd{ksh -c 'echo "$@{a-"b  c"@}"'}
b c
$ @kbd{bash -c 'echo "$@{a-"b  c"@}"'}
b  c
$ @kbd{/bin/sh -c 'a=; echo $@{a+'\''b  c'\''@}'}
b  c
$ @kbd{/bin/sh -c 'a=; echo "$@{a+'\''b  c'\''@}"'}
'b  c'
$ @kbd{/bin/sh -c 'a=; echo "$@{a+\"b  c\"@}"'}
"b  c"
$ @kbd{/bin/sh -c 'a=; echo "$@{a+b  c@}"'}
b  c
$ @kbd{/bin/sh -c 'cat <<EOF
$@{a-"b  c"@}
EOF'}
"b  c"
$ @kbd{/bin/sh -c 'cat <<EOF
$@{a-'b  c'@}
EOF'}
'b  c'
$ @kbd{bash -c 'cat <<EOF
$@{a-"b  c"@}
EOF'}
b  c
$ @kbd{bash -c 'cat <<EOF
$@{a-'b  c'@}
EOF'}
'b  c'
@end example

Perhaps the easiest way to work around quoting issues in a manner
portable to all shells is to place the results in a temporary variable,
then use @samp{$t} as the @var{value}, rather than trying to inline
the expression needing quoting.

@example
$ @kbd{/bin/sh -c 't="b  c\"'\''@}\\"; echo "$@{a-$t@}"'}
b  c"'@}\
$ @kbd{ksh -c 't="b  c\"'\''@}\\"; echo "$@{a-$t@}"'}
b  c"'@}\
$ @kbd{bash -c 't="b  c\"'\''@}\\"; echo "$@{a-$t@}"'}
b  c"'@}\
@end example

@item $@{@var{var}=@var{value}@}
@cindex @code{$@{@var{var}=@var{value}@}}
When using @samp{$@{@var{var}=@var{value}@}} to assign a default value
to @var{var}, remember that even though the assignment to @var{var} does
not undergo file name expansion, the result of the variable expansion
does unless the expansion occurred within double quotes.  In particular,
when using @command{:} followed by unquoted variable expansion for the
side effect of setting a default value, if the final value of
@samp{$var} contains any globbing characters (either from @var{value} or
from prior contents), the shell has to spend time performing file name
expansion and field splitting even though those results will not be
used.  Therefore, it is a good idea to consider double quotes when performing
default initialization; while remembering how this impacts any quoting
characters appearing in @var{value}.

@example
$ @kbd{time bash -c ': "$@{a=/usr/bin/*@}"; echo "$a"'}
/usr/bin/*

real	0m0.005s
user	0m0.002s
sys	0m0.003s
$ @kbd{time bash -c ': $@{a=/usr/bin/*@}; echo "$a"'}
/usr/bin/*

real	0m0.039s
user	0m0.026s
sys	0m0.009s
$ @kbd{time bash -c 'a=/usr/bin/*; : $@{a=noglob@}; echo "$a"'}
/usr/bin/*

real	0m0.031s
user	0m0.020s
sys	0m0.010s

$ @kbd{time bash -c 'a=/usr/bin/*; : "$@{a=noglob@}"; echo "$a"'}
/usr/bin/*

real	0m0.006s
user	0m0.002s
sys	0m0.003s
@end example

As with @samp{+} and @samp{-}, @var{value} must be a single shell word,
otherwise some shells, such as Solaris 10 @command{/bin/sh} or on Digital
Unix V 5.0, die because of a ``bad substitution''.  Meanwhile, POSIX
requires that with @samp{=}, quote removal happens prior to the
assignment, and the expansion be the final contents of @var{var} without
quoting (and thus subject to field splitting), in contrast to the
behavior with @samp{-} passing the quoting through to the final
expansion.  However, @command{bash} 4.1 does not obey this rule.

@example
$ @kbd{ksh -c 'echo $@{var-a\ \ b@}'}
a  b
$ @kbd{ksh -c 'echo $@{var=a\ \ b@}'}
a b
$ @kbd{bash -c 'echo $@{var=a\ \ b@}'}
a  b
@end example

Finally, POSIX states that when mixing @samp{$@{a=b@}} with regular
commands, it is unspecified whether the assignments affect the parent
shell environment.  It is best to perform assignments independently from
commands, to avoid the problems demonstrated in this example running on
Solaris 10:

@example
$ @kbd{cmd='x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";printf "%s\\n" -$x-'}
$ @kbd{bash -c "$cmd"}
+b+b+
-b-
$ @kbd{/bin/sh -c "$cmd"}
++b+
--
$ @kbd{ksh -c "$cmd"}
+b+b+
--
@end example

@item $@{@var{var}=@var{value}@}
@cindex @code{$@{@var{var}=@var{literal}@}}
Solaris 10 @command{/bin/sh} has a frightening bug in its handling of
literal assignments.  Imagine you need set a variable to a string containing
@samp{@}}.  This @samp{@}} character confuses Solaris 10 @command{/bin/sh}
when the affected variable was already set.  This bug can be exercised
by running:

@example
$ @kbd{unset foo}
$ @kbd{foo=$@{foo='@}'@}}
$ @kbd{echo $foo}
@}
$ @kbd{foo=$@{foo='@}'   # no error; this hints to what the bug is}
$ @kbd{echo $foo}
@}
$ @kbd{foo=$@{foo='@}'@}}
$ @kbd{echo $foo}
@}@}
 ^ ugh!
@end example

It seems that @samp{@}} is interpreted as matching @samp{$@{}, even
though it is enclosed in single quotes.  The problem doesn't happen
using double quotes, or when using a temporary variable holding the
problematic string.

@item $@{@var{var}=@var{expanded-value}@}
@cindex @code{$@{@var{var}=@var{expanded-value}@}}
On shells so old that they are no longer relevant, the command

@example
# Set the shell variable to a default value
# if it is not already set.
: $@{var="$default"@}
@end example

@noindent
misbehaved badly in some cases.  Older scripts worked around the bugs by
using one of following two lines, the latter of which was more portable:

@example
var=$@{var="$default"@}
test $@{var+y@} || var=$default
@end example

@noindent
However, these workarounds are no longer needed.

@item $@{#@var{var}@}
@itemx $@{@var{var}%@var{word}@}
@itemx $@{@var{var}%%@var{word}@}
@itemx $@{@var{var}#@var{word}@}
@itemx $@{@var{var}##@var{word}@}
@cindex @code{$@{#@var{var}@}}
@cindex @code{$@{@var{var}%@var{word}@}}
@cindex @code{$@{@var{var}%%@var{word}@}}
@cindex @code{$@{@var{var}#@var{word}@}}
@cindex @code{$@{@var{var}##@var{word}@}}
POSIX requires support for these usages, but they do not work with many
traditional shells, e.g., Solaris 10 @command{/bin/sh}.

Also, @command{pdksh} 5.2.14 mishandles some @var{word} forms.  For
example if @samp{$1} is @samp{a/b} and @samp{$2} is @samp{a}, then
@samp{$@{1#$2@}} should yield @samp{/b}, but with @command{pdksh} it
yields the empty string.


@item `@var{commands}`
@cindex @code{`@var{commands}`}
@cindex Command Substitution
POSIX requires shells to trim all trailing newlines from command
output before substituting it, so assignments like
@samp{dir=`printf '%s\n' "$file" | tr a A`} do not work as expected if
@samp{$file} ends in a newline.

While in general it makes no sense, do not substitute a single builtin
with side effects, because Ash 0.2, trying to optimize, does not fork a
subshell to perform the command.
For instance, if you wanted to check that @command{cd} is silent, do not
use @samp{test -z "`cd /`"} because the following can happen:

@example
$ @kbd{pwd}
/tmp
$ @kbd{test -z "`cd /`" && pwd}
/
@end example

@noindent
The result of @samp{foo=`exit 1`} is left as an exercise to the reader.

The MSYS shell leaves a stray byte in the expansion of a double-quoted
command substitution of a native program, if the end of the substitution
is not aligned with the end of the double quote.  This may be worked
around by inserting another pair of quotes:

@example
$ @kbd{echo "`printf 'foo\r\n'` bar" > broken}
$ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken}
- broken differ: char 4, line 1
@end example

Upon interrupt or SIGTERM, some shells may abort a command substitution,
replace it with a null string, and wrongly evaluate the enclosing
command before entering the trap or ending the script.  This can lead to
spurious errors:

@example
$ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'}
$ @kbd{^C}
sh: test: hi: unexpected operator/operand
@end example

@noindent
You can avoid this by assigning the command substitution to a temporary
variable:

@example
$ @kbd{sh -c 'res=`sleep 5; echo hi`
         if test "x$res" = xhi; then echo yes; fi'}
$ @kbd{^C}
@end example

@item $(@var{commands})
@cindex @code{$(@var{commands})}
This construct is meant to replace @samp{`@var{commands}`},
and it has most of the problems listed under @code{`@var{commands}`}.

This construct can be
nested while this is impossible to do portably with back quotes.
Although it is almost universally supported, unfortunately Solaris 10
and earlier releases lack it:

@example
$ @kbd{showrev -c /bin/sh | grep version}
Command version: SunOS 5.10 Generic 142251-02 Sep 2010
$ @kbd{echo $(echo blah)}
syntax error: `(' unexpected
@end example

If you do use @samp{$(@var{commands})}, make sure that the commands
do not start with a parenthesis, as that would cause confusion with
a different notation @samp{$((@var{expression}))} that in modern
shells is an arithmetic expression not a command.  To avoid the
confusion, insert a space between the two opening parentheses.

Avoid @var{commands} that contain unbalanced parentheses in
here-documents, comments, or case statement patterns, as many shells
mishandle them.  For example, Bash 3.1, @samp{ksh88}, @command{pdksh}
5.2.14, and Zsh 4.2.6 all mishandle the following valid command:

@example
echo $(case x in x) echo hello;; esac)
@end example


@item $((@var{expression}))
@cindex @code{$((@var{expression}))}
Arithmetic expansion is not portable as some shells (most
notably Solaris 10 @command{/bin/sh}) don't support it.

Among shells that do support @samp{$(( ))}, not all of them obey the
POSIX rule that octal and hexadecimal constants must be recognized:

@example
$ @kbd{bash -c 'echo $(( 010 + 0x10 ))'}
24
$ @kbd{zsh -c 'echo $(( 010 + 0x10 ))'}
26
$ @kbd{zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'}
24
$ @kbd{pdksh -c 'echo $(( 010 + 0x10 ))'}
pdksh:  010 + 0x10 : bad number `0x10'
$ @kbd{pdksh -c 'echo $(( 010 ))'}
10
@end example

When it is available, using arithmetic expansion provides a noticeable
speedup in script execution; but testing for support requires
@command{eval} to avoid syntax errors.  The following construct is used
by @code{AS_VAR_ARITH} to provide arithmetic computation when all
arguments are decimal integers without leading zeros, and all
operators are properly quoted and appear as distinct arguments:

@example
if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
  eval 'func_arith ()
  @{
    func_arith_result=$(( $* ))
  @}'
else
  func_arith ()
  @{
    func_arith_result=`expr "$@@"`
  @}
fi
func_arith 1 + 1
foo=$func_arith_result
@end example


@item ^
@cindex @code{^} quoting
Always quote @samp{^}, otherwise traditional shells such as
@command{/bin/sh} on Solaris 10 treat this like @samp{|}.

@end table


@node Assignments
@section Assignments
@cindex Shell assignments

When setting several variables in a row, be aware that the order of the
evaluation is undefined.  For instance @samp{foo=1 foo=2; echo $foo}
gives @samp{1} with Solaris 10 @command{/bin/sh}, but @samp{2} with Bash.
You must use
@samp{;} to enforce the order: @samp{foo=1; foo=2; echo $foo}.

Don't rely on the following to find @file{subdir/program}:

@example
PATH=subdir$PATH_SEPARATOR$PATH program
@end example

@noindent
as this does not work with Zsh 3.0.6.  Use something like this
instead:

@example
(PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
@end example

Don't rely on the exit status of an assignment: Ash 0.2 does not change
the status and propagates that of the last statement:

@example
$ @kbd{false || foo=bar; echo $?}
1
$ @kbd{false || foo=`:`; echo $?}
0
@end example

@noindent
and to make things even worse, QNX 4.25 just sets the exit status
to 0 in any case:

@example
$ @kbd{foo=`exit 1`; echo $?}
0
@end example

To assign default values, follow this algorithm:

@enumerate
@item
If the default value is a literal and does not contain any closing
brace, use:

@example
: "$@{var='my literal'@}"
@end example

@item
If the default value contains no closing brace, has to be expanded, and
the variable being initialized is not intended to be IFS-split
(i.e., it's not a list), then use:

@example
: $@{var="$default"@}
@end example

@item
If the default value contains no closing brace, has to be expanded, and
the variable being initialized is intended to be IFS-split (i.e., it's a list),
then use:

@example
var=$@{var="$default"@}
@end example

@item
If the default value contains a closing brace, then use:

@example
test $@{var+y@} || var="has a '@}'"
@end example
@end enumerate

In most cases @samp{var=$@{var="$default"@}} is fine, but in case of
doubt, just use the last form.  @xref{Shell Substitutions}, items
@samp{$@{@var{var}:-@var{value}@}} and @samp{$@{@var{var}=@var{value}@}}
for the rationale.

@node Parentheses
@section Parentheses in Shell Scripts
@cindex Shell parentheses

Beware of two opening parentheses in a row, as many shell
implementations treat them specially, and POSIX says that a portable
script cannot use @samp{((} outside the @samp{$((} form used for shell
arithmetic.  In traditional shells, @samp{((cat))} behaves like
@samp{(cat)}; but many shells, including
Bash and the Korn shell, treat @samp{((cat))} as an arithmetic
expression equivalent to @samp{let "cat"}, and may or may not report an
error when they detect that @samp{cat} is not a number.  As another
example, @samp{pdksh} 5.2.14 does not treat the following code
as a traditional shell would:

@example
if ((true) || false); then
  echo ok
fi
@end example

@noindent
To work around this problem, insert a space between the two opening
parentheses.  There is a similar problem and workaround with
@samp{$((}; see @ref{Shell Substitutions}.

@node Special Shell Variables
@section Special Shell Variables
@cindex Shell variables
@cindex Special shell variables

Some shell variables should not be used, since they can have a deep
influence on the behavior of the shell.  In order to recover a sane
behavior from the shell, some variables should be unset; M4sh takes
care of this and provides fallback values, whenever needed, to cater
for a very old @file{/bin/sh} that does not support @command{unset}.
(@pxref{Portable Shell, , Portable Shell Programming}).

As a general rule, shell variable names containing a lower-case letter
are safe; you can define and use these variables without worrying about
their effect on the underlying system, and without worrying about
whether the shell changes them unexpectedly.  (The exception is the
shell variable @code{status}, as described below.)

Here is a list of names that are known to cause trouble.  This list is
not exhaustive, but you should be safe if you avoid the name
@code{status} and names containing only upper-case letters and
underscores.

@c Alphabetical order, case insensitive, 'A' before 'a'.
@table @code
@item ?
Not all shells correctly reset @samp{$?} after conditionals (@pxref{if,
, Limitations of Shell Builtins}).  Not all shells manage @samp{$?}
correctly in shell functions (@pxref{Shell Functions}) or in traps
(@pxref{trap, , Limitations of Shell Builtins}).  Not all shells reset
@samp{$?} to zero after an empty command.

@example
$ @kbd{bash -c 'false; $empty; echo $?'}
0
$ @kbd{zsh -c 'false; $empty; echo $?'}
1
@end example

@item _
@evindex _
Many shells reserve @samp{$_} for various purposes, e.g., the name of
the last command executed.

@item CDPATH
@evindex CDPATH
When this variable is set it specifies a list of directories to search
when invoking @code{cd} with a relative file name that did not start
with @samp{./} or @samp{../}.  POSIX
says that if a nonempty directory name from @env{CDPATH}
is used successfully, @code{cd} prints the resulting absolute
file name.  Unfortunately this output can break idioms like
@samp{abs=`cd src && pwd`} because @code{abs} receives the name twice.
Also, many shells do not conform to this part of POSIX; for
example, @command{zsh} prints the result only if a directory name
other than @file{.} was chosen from @env{CDPATH}.

In practice the shells that have this problem also support
@command{unset}, so you can work around the problem as follows:

@example
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
@end example

You can also avoid output by ensuring that your directory name is
absolute or anchored at @samp{./}, as in @samp{abs=`cd ./src && pwd`}.

Configure scripts use M4sh, which automatically unsets @env{CDPATH} if
possible, so you need not worry about this problem in those scripts.

@item CLICOLOR_FORCE
@evindex CLICOLOR_FORCE
When this variable is set, some implementations of tools like
@command{ls} attempt to add color to their output via terminal escape
sequences, even when the output is not directed to a terminal, and can
thus cause spurious failures in scripts.  Configure scripts use M4sh,
which automatically unsets this variable.

@item DUALCASE
@evindex DUALCASE
In the MKS shell, case statements and file name generation are
case-insensitive unless @env{DUALCASE} is nonzero.
Autoconf-generated scripts export this variable when they start up.

@item ENV
@itemx MAIL
@itemx MAILPATH
@itemx PS1
@itemx PS2
@itemx PS4
@evindex ENV
@evindex MAIL
@evindex MAILPATH
@evindex PS1
@evindex PS2
@evindex PS4
These variables should not matter for shell scripts, since they are
supposed to affect only interactive shells.  However, at least one
shell (the pre-3.0 UWIN Korn shell) gets confused about
whether it is interactive, which means that (for example) a @env{PS1}
with a side effect can unexpectedly modify @samp{$?}.  To work around
this bug, M4sh scripts (including @file{configure} scripts) do something
like this:

@example
(unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
PS1='$ '
PS2='> '
PS4='+ '
@end example

@noindent
(actually, there is some complication due to bugs in @command{unset};
@pxref{unset, , Limitations of Shell Builtins}).

@item FPATH
@evindex FPATH
The Korn shell uses @env{FPATH} to find shell functions, so avoid
@env{FPATH} in portable scripts.  @env{FPATH} is consulted after
@env{PATH}, but you still need to be wary of tests that use @env{PATH}
to find whether a command exists, since they might report the wrong
result if @env{FPATH} is also set.

@item GREP_OPTIONS
@evindex GREP_OPTIONS
When this variable is set, some implementations of @command{grep} honor
these options, even if the options include direction to enable colored
output via terminal escape sequences, and the result can cause spurious
failures when the output is not directed to a terminal.  Configure
scripts use M4sh, which automatically unsets this variable.

@item IFS
@evindex IFS
Long ago, shell scripts inherited @env{IFS} from the environment,
but this caused many problems so modern shells ignore any environment
settings for @env{IFS}.

Don't set the first character of @env{IFS} to backslash.  Indeed,
Bourne shells use the first character (backslash) when joining the
components in @samp{"$@@"} and some shells then reinterpret (!)@: the
backslash escapes, so you can end up with backspace and other strange
characters.

The proper value for @env{IFS} (in regular code, not when performing
splits) is @samp{@key{SPC}@key{TAB}@key{RET}}.  The first character is
especially important, as it is used to join the arguments in @samp{$*};
however, note that traditional shells, but also bash-2.04, fail to adhere
to this and join with a space anyway.

M4sh guarantees that @env{IFS} will have the default value at the
beginning of a script, and many macros within autoconf rely on this
setting.  It is okay to use blocks of shell code that temporarily change
the value of @env{IFS} in order to split on another character, but
remember to restore it before expanding further macros.

Unsetting @code{IFS} instead of resetting it to the default sequence
is not suggested, since code that tries to save and restore the
variable's value will incorrectly reset it to an empty value, thus
disabling field splitting:

@example
unset IFS
# default separators used for field splitting

save_IFS=$IFS
IFS=:
# ...
IFS=$save_IFS
# no field splitting performed
@end example

@item LANG
@itemx LC_ALL
@itemx LC_COLLATE
@itemx LC_CTYPE
@itemx LC_MESSAGES
@itemx LC_MONETARY
@itemx LC_NUMERIC
@itemx LC_TIME
@evindex LANG
@evindex LC_ALL
@evindex LC_COLLATE
@evindex LC_CTYPE
@evindex LC_MESSAGES
@evindex LC_MONETARY
@evindex LC_NUMERIC
@evindex LC_TIME

You should set all these variables to @samp{C} because so much
configuration code assumes the C locale and POSIX requires that locale
environment variables be set to @samp{C} if the C locale is desired;
@file{configure} scripts and M4sh do that for you.
Export these variables after setting them.

@item LANGUAGE
@evindex LANGUAGE

@env{LANGUAGE} is not specified by POSIX, but it is a GNU
extension that overrides @env{LC_ALL} in some cases, so you (or M4sh)
should set it too.

@item LC_ADDRESS
@itemx LC_IDENTIFICATION
@itemx LC_MEASUREMENT
@itemx LC_NAME
@itemx LC_PAPER
@itemx LC_TELEPHONE
@evindex LC_ADDRESS
@evindex LC_IDENTIFICATION
@evindex LC_MEASUREMENT
@evindex LC_NAME
@evindex LC_PAPER
@evindex LC_TELEPHONE

These locale environment variables are GNU extensions.  They
are treated like their POSIX brethren (@env{LC_COLLATE},
etc.)@: as described above.

@item LINENO
@evindex LINENO
Most modern shells provide the current line number in @code{LINENO}.
Its value is the line number of the beginning of the current command.
M4sh, and hence Autoconf, attempts to execute @command{configure} with
a shell that supports @code{LINENO}.  If no such shell is available, it
attempts to implement @code{LINENO} with a Sed prepass that replaces each
instance of the string @code{$LINENO} (not followed by an alphanumeric
character) with the line's number.  In M4sh scripts you should execute
@code{AS_LINENO_PREPARE} so that these workarounds are included in
your script; configure scripts do this automatically in @code{AC_INIT}.

You should not rely on @code{LINENO} within @command{eval} or shell
functions, as the behavior differs in practice.  The presence of a
quoted newline within simple commands can alter which line number is
used as the starting point for @code{$LINENO} substitutions within that
command.  Also, the possibility of the Sed prepass means that you should
not rely on @code{$LINENO} when quoted, when in here-documents, or when
line continuations are used.  Subshells should be OK, though.  In the
following example, lines 1, 9, and 14 are portable, but the other
instances of @code{$LINENO} do not have deterministic values:

@example
@group
$ @kbd{cat lineno}
echo 1. $LINENO
echo "2. $LINENO
3. $LINENO"
cat <<EOF
5. $LINENO
6. $LINENO
7. \$LINENO
EOF
( echo 9. $LINENO )
eval 'echo 10. $LINENO'
eval 'echo 11. $LINENO
echo 12. $LINENO'
echo 13. '$LINENO'
echo 14. $LINENO '
15.' $LINENO
f () @{ echo $1 $LINENO;
echo $1 $LINENO @}
f 18.
echo 19. \
$LINENO
@end group
@group
$ @kbd{bash-3.2 ./lineno}
1. 1
2. 3
3. 3
5. 4
6. 4
7. $LINENO
9. 9
10. 10
11. 12
12. 13
13. $LINENO
14. 14
15. 14
18. 16
18. 17
19. 19
@end group
@group
$ @kbd{zsh-4.3.4 ./lineno}
1. 1
2. 2
3. 2
5. 4
6. 4
7. $LINENO
9. 9
10. 1
11. 1
12. 2
13. $LINENO
14. 14
15. 14
18. 0
18. 1
19. 19
@end group
@group
$ @kbd{pdksh-5.2.14 ./lineno}
1. 1
2. 2
3. 2
5. 4
6. 4
7. $LINENO
9. 9
10. 0
11. 0
12. 0
13. $LINENO
14. 14
15. 14
18. 16
18. 17
19. 19
@end group
@group
$ @kbd{sed '=' <lineno |}
> @kbd{  sed '}
> @kbd{    N}
> @kbd{    s,$,-,}
> @kbd{    t loop}
> @kbd{    :loop}
> @kbd{    s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,}
> @kbd{    t loop}
> @kbd{    s,-$,,}
> @kbd{    s,^[0-9]*\n,,}
> @kbd{  ' |}
> @kbd{  sh}
1. 1
2. 2
3. 3
5. 5
6. 6
7. \7
9. 9
10. 10
11. 11
12. 12
13. 13
14. 14
15. 15
18. 16
18. 17
19. 20
@end group
@end example

In particular, note that @file{config.status} (and any other subsidiary
script created by @code{AS_INIT_GENERATED}) might report line numbers
relative to the parent script as a result of the potential Sed pass.

@item NULLCMD
@evindex NULLCMD
When executing the command @samp{>foo}, @command{zsh} executes
@samp{$NULLCMD >foo} unless it is operating in Bourne shell
compatibility mode and the @command{zsh} version is newer
than 3.1.6-dev-18.  If you are using an older @command{zsh}
and forget to set @env{NULLCMD},
your script might be suspended waiting for data on its standard input.

@item options
@evindex options
For @command{zsh} 4.3.10, @env{options} is treated as an associative
array even after @code{emulate sh}, so it should not be used.

@item PATH_SEPARATOR
@evindex PATH_SEPARATOR
On DJGPP systems, the @env{PATH_SEPARATOR} environment
variable can be set to either @samp{:} or @samp{;} to control the path
separator Bash uses to set up certain environment variables (such as
@env{PATH}).  You can set this variable to @samp{;} if you want
@command{configure} to use @samp{;} as a separator; this might be useful
if you plan to use non-POSIX shells to execute files.  @xref{File System
Conventions}, for more information about @code{PATH_SEPARATOR}.

@item POSIXLY_CORRECT
@evindex POSIXLY_CORRECT
In the GNU environment, exporting @env{POSIXLY_CORRECT} with any value
(even empty) causes programs to try harder to conform to POSIX@.
Autoconf does not directly manipulate this variable, but @command{bash}
ties the shell variable @env{POSIXLY_CORRECT} to whether the script is
running in POSIX mode.  Therefore, take care when exporting or unsetting
this variable, so as not to change whether @command{bash} is in POSIX
mode.

@example
$ @kbd{bash --posix -c 'set -o | grep posix}
> @kbd{unset POSIXLY_CORRECT}
> @kbd{set -o | grep posix'}
posix           on
posix           off
@end example

@item PWD
@evindex PWD
POSIX requires that @command{cd}
must update the @env{PWD} environment variable to point
to the name of the current directory, but traditional shells
do not support this.  This can cause confusion if one shell instance
maintains @env{PWD} but a subsidiary and different shell does not know
about @env{PWD} and executes @command{cd}; in this case @env{PWD}
points to the wrong directory.  Use @samp{`pwd`} rather than
@samp{$PWD}.

@item RANDOM
@evindex RANDOM
Many shells provide @code{RANDOM}, a variable that returns a different
integer each time it is used.  It is common
practice to use @code{$RANDOM} as part of a file name, but code
shouldn't rely on @code{$RANDOM} expanding to a nonempty string.

@item status
@evindex status
This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6),
hence read-only.  Do not use it.
@end table

@node Shell Functions
@section Shell Functions
@cindex Shell Functions

Nowadays, it is difficult to find a shell that does not support
shell functions at all.  However, some differences should be expected.

When declaring a shell function, you must include whitespace between the
@samp{)} after the function name and the start of the compound
expression, to avoid upsetting @command{ksh}.  While it is possible to
use any compound command, most scripts use @samp{@{@dots{}@}}.

@example
$ @kbd{/bin/sh -c 'a()@{ echo hi;@}; a'}
hi
$ @kbd{ksh -c 'a()@{ echo hi;@}; a'}
ksh: syntax error at line 1: `@}' unexpected
$ @kbd{ksh -c 'a() @{ echo hi;@}; a'}
hi
@end example

Inside a shell function, you should not rely on the error status of a
subshell if the last command of that subshell was @code{exit} or
@code{trap}, as this triggers bugs in zsh 4.x; while Autoconf tries to
find a shell that does not exhibit the bug, zsh might be the only shell
present on the user's machine.

Likewise, the state of @samp{$?} is not reliable when entering a shell
function.  This has the effect that using a function as the first
command in a @command{trap} handler can cause problems.

@example
$ @kbd{bash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
2
2
$ @kbd{ash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
0
2
@end example

DJGPP bash 2.04 has a bug in that @command{return} from a
shell function which also used a command substitution causes a
segmentation fault.  To work around the issue, you can use
@command{return} from a subshell, or @samp{AS_SET_STATUS} as last command
in the execution flow of the function (@pxref{Common Shell Constructs}).

Not all shells treat shell functions as simple commands impacted by
@samp{set -e}, for example with Solaris 10 @command{/bin/sh}:

@example
$ @kbd{bash -c 'f() @{ return 1; @}; set -e; f; echo oops'}
$ @kbd{/bin/sh -c 'f() @{ return 1; @}; set -e; f; echo oops'}
oops
@end example

Shell variables and functions may share the same namespace, for example
with Solaris 10 @command{/bin/sh}:

@example
$ @kbd{f () @{ :; @}; f=; f}
f: not found
@end example

@noindent
For this reason, Autoconf (actually M4sh, @pxref{Programming in M4sh})
uses the prefix @samp{as_fn_} for its functions.

Handling of positional parameters and shell options varies among shells.
For example, Korn shells reset and restore trace output (@samp{set -x})
and other options upon function entry and exit.

It is not portable to pass temporary environment variables to shell
functions.  Solaris 10 @command{/bin/sh} does not see the variable.
Meanwhile, not all shells follow the POSIX rule that the assignment must
affect the current environment in the same manner as special built-ins.

@example
$ @kbd{/bin/sh -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
@result{}
@result{}
$ @kbd{ash -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
@result{}1
@result{}
$ @kbd{bash -c 'set -o posix; func() @{ echo $a;@}; a=1 func; echo $a'}
@result{}1
@result{}1
@end example

Some ancient Bourne shell variants with function support did not reset
@samp{$@var{i}, @var{i} >= 0}, upon function exit, so effectively the
arguments of the script were lost after the first function invocation.
It is probably not worth worrying about these shells any more.

With AIX sh, a @command{trap} on 0 installed in a shell function
triggers at function exit rather than at script exit.  @xref{trap, ,
Limitations of Shell Builtins}.

@node Limitations of Builtins
@section Limitations of Shell Builtins
@cindex Shell builtins
@cindex Limitations of shell builtins

No, no, we are serious: some shells do have limitations!  :)

You should always keep in mind that any builtin or command may support
options, and therefore differ in behavior with arguments
starting with a dash.  For instance, even the innocent @samp{echo "$word"}
can give unexpected results when @code{word} starts with a dash.  To avoid
this problem, use @samp{printf '%s\n' "$word"}.  Many of these limitations
can be worked around using M4sh (@pxref{Programming in M4sh}).

@c This table includes things like '@command{test} (files)', so we can't
@c use @table @command.
@table @asis
@item @command{.}
@c --------------
@prindex @command{.}
Use @command{.} only with regular files (use @samp{test -f}).  Bash
2.03, for instance, chokes on @samp{. /dev/null}.  Remember that
@command{.} uses @env{PATH} if its argument contains no slashes.  Also,
some shells, including bash 3.2, implicitly append the current directory
to this @env{PATH} search, even though POSIX forbids it.  So if you want
to use @command{.} on a file @file{foo} in the current directory, you
must use @samp{. ./foo}.

Not all shells gracefully handle syntax errors within a sourced file.
On one extreme, some non-interactive shells abort the entire script.  On
the other, @command{zsh} 4.3.10 has a bug where it fails to react to the
syntax error.

@example
$ @kbd{echo 'fi' > syntax}
$ @kbd{bash -c '. ./syntax; echo $?'}
./syntax: line 1: syntax error near unexpected token `fi'
./syntax: line 1: `fi'
2
$ @kbd{ash -c '. ./syntax; echo $?'}
./syntax: 1: Syntax error: "fi" unexpected
$ @kbd{zsh -c '. ./syntax; echo $?'}
./syntax:1: parse error near `fi'
0
@end example

@anchor{!}
@item @command{!}
@c --------------
@prindex @command{!}
The Unix version 7 shell did not support
negating the exit status of commands with @command{!}, and this feature
is still absent from some shells (e.g., Solaris 10 @command{/bin/sh}).
Other shells, such as FreeBSD @command{/bin/sh} or @command{ash}, have
bugs when using @command{!}:

@example
$ @kbd{sh -c '! : | :'; echo $?}
1
$ @kbd{ash -c '! : | :'; echo $?}
0
$ @kbd{sh -c '! @{ :; @}'; echo $?}
1
$ @kbd{ash -c '! @{ :; @}'; echo $?}
@{: not found
Syntax error: "@}" unexpected
2
@end example

Shell code like this:

@example
if ! cmp file1 file2 >/dev/null 2>&1; then
  echo files differ or trouble
fi
@end example

is therefore not portable in practice.  Typically it is easy to rewrite
such code, e.g.:

@example
cmp file1 file2 >/dev/null 2>&1 ||
  echo files differ or trouble
@end example

In M4sh, the @code{AS_IF} macro provides an easy way to write these kinds
of conditionals:

@example
AS_IF([cmp -s file file.new], [],
  [echo files differ or trouble])
@end example

This kind of rewriting is needed in code outside macro definitions that
calls other macros.  @xref{Common Shell Constructs}.  It is also useful
inside macro definitions, where the @dfn{then} and @dfn{else} branches
might contain macro arguments.

More generally, one can always rewrite @samp{! @var{command}} as:

@example
AS_IF([@var{command}], [(exit 1)])
@end example

@item @command{&&} and @command{||}
@c --------------------------------
@prindex @command{&&}
@prindex @command{||}
If an AND-OR list is not inside @code{AC_DEFUN}, and it contains
calls to Autoconf macros, it should be rewritten using @code{AS_IF}.
@xref{Common Shell Constructs}.  The operators @code{&&} and @code{||}
have equal precedence and are left associative, so instead of:

@example
# This is dangerous outside AC_DEFUN.
cmp a b >/dev/null 2>&1 &&
  AS_ECHO([files are same]) >$tmpfile ||
    AC_MSG_NOTICE([files differ, or echo failed])
@end example

you can use:

@example
# This is OK outside AC_DEFUN.
AS_IF([AS_IF([cmp a b >/dev/null 2>&1],
         [AS_ECHO([files are same]) >$tmpfile],
         [false])],
  [AC_MSG_NOTICE([files differ, or echo failed])])
@end example

@item @command{@{...@}}
@c --------------------
@prindex @command{@{...@}}
Bash 3.2 (and earlier versions) sometimes does not properly set
@samp{$?} when failing to write redirected output of a compound command.
This problem is most commonly observed with @samp{@{@dots{}@}}; it does
not occur with @samp{(@dots{})}.  For example:

@example
$ @kbd{bash -c '@{ echo foo; @} >/bad; echo $?'}
bash: line 1: /bad: Permission denied
0
$ @kbd{bash -c 'while :; do echo; done >/bad; echo $?'}
bash: line 1: /bad: Permission denied
0
@end example

To work around the bug, prepend @samp{:;}:

@example
$ @kbd{bash -c ':;@{ echo foo; @} >/bad; echo $?'}
bash: line 1: /bad: Permission denied
1
@end example

POSIX requires a syntax error if a brace list has no contents.  However,
not all shells obey this rule; and on shells where empty lists are
permitted, the effect on @samp{$?} is inconsistent.  To avoid problems,
ensure that a brace list is never empty.

@example
$ @kbd{bash -c 'false; @{ @}; echo $?' || echo $?}
bash: line 1: syntax error near unexpected token `@}'
bash: line 1: `false; @{ @}; echo $?'
2
$ @kbd{zsh -c 'false; @{ @}; echo $?' || echo $?}
1
$ @kbd{pdksh -c 'false; @{ @}; echo $?' || echo $?}
0
@end example


@item @command{break}
@c ------------------
@prindex @command{break}
The use of @samp{break 2} etc.@: is safe.


@anchor{case}
@item @command{case}
@c -----------------
@prindex @command{case}
If a @code{case} command is not inside @code{AC_DEFUN}, and it contains
calls to Autoconf macros, it should be rewritten using @code{AS_CASE}.
@xref{Common Shell Constructs}.  Instead of:

@example
# This is dangerous outside AC_DEFUN.
case $filename in
  *.[ch]) AC_MSG_NOTICE([C source file]);;
esac
@end example

@noindent
use:

@example
# This is OK outside AC_DEFUN.
AS_CASE([$filename],
  [[*.[ch]]], [AC_MSG_NOTICE([C source file])])
@end example

You don't need to quote the argument; no splitting is performed.

You don't need the final @samp{;;}, but you should use it.

POSIX requires support for @code{case} patterns with opening
parentheses like this:

@example
case $file_name in
  (*.c) echo "C source code";;
esac
@end example

@noindent
but the @code{(} in this example is not portable to a few obsolescent Bourne
shell implementations, which is a pity for those of us using tools that
rely on balanced parentheses.  For instance, with Solaris 10
@command{/bin/sh}:

@example
$ @kbd{case foo in (foo) echo foo;; esac}
@error{}syntax error: `(' unexpected
@end example

@noindent
The leading @samp{(} can be omitted safely.  Unfortunately, there are
contexts where unbalanced parentheses cause other problems, such as when
using a syntax-highlighting editor that searches for the balancing
counterpart, or more importantly, when using a case statement as an
underquoted argument to an Autoconf macro.  @xref{Balancing
Parentheses}, for trade-offs involved in various styles of dealing with
unbalanced @samp{)}.

Zsh handles pattern fragments derived from parameter expansions or
command substitutions as though quoted:

@example
$ pat=\?; case aa in ?$pat) echo match;; esac
$ pat=\?; case a? in ?$pat) echo match;; esac
match
@end example

@noindent
Because of a bug in its @code{fnmatch}, Bash fails to properly
handle backslashes in character classes:

@example
bash-2.02$ @kbd{case /tmp in [/\\]*) echo OK;; esac}
bash-2.02$
@end example

@noindent
This is extremely unfortunate, since you are likely to use this code to
handle POSIX or MS-DOS absolute file names.  To work around this
bug, always put the backslash first:

@example
bash-2.02$ @kbd{case '\TMP' in [\\/]*) echo OK;; esac}
OK
bash-2.02$ @kbd{case /tmp in [\\/]*) echo OK;; esac}
OK
@end example

Many Bourne shells cannot handle closing brackets in character classes
correctly.

Some shells also have problems with backslash escaping in case you do not want
to match the backslash: both a backslash and the escaped character match this
pattern.  To work around this, specify the character class in a variable, so
that quote removal does not apply afterwards, and the special characters don't
have to be backslash-escaped:

@example
$ @kbd{case '\' in [\<]) echo OK;; esac}
OK
$ @kbd{scanset='[<]'; case '\' in $scanset) echo OK;; esac}
$
@end example

Even with this, Solaris @command{ksh} matches a backslash if the set
contains any
of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}.

Some shells, such as Ash 0.3.8, are confused by an empty
@code{case}/@code{esac}:

@example
ash-0.3.8 $ @kbd{case foo in esac;}
@error{}Syntax error: ";" unexpected (expecting ")")
@end example

POSIX requires @command{case} to give an exit status of 0 if no cases
match.  However, @command{/bin/sh} in Solaris 10 does not obey this
rule.  Meanwhile, it is unclear whether a case that matches, but
contains no statements, must also change the exit status to 0.  The M4sh
macro @code{AS_CASE} works around these inconsistencies.

@example
$ @kbd{bash -c 'case `false` in ?) ;; esac; echo $?'}
0
$ @kbd{/bin/sh -c 'case `false` in ?) ;; esac; echo $?'}
255
@end example


@item @command{cd}
@c ---------------
@prindex @command{cd}
POSIX requires that @command{cd} must support
the @option{-L} (``logical'') and @option{-P} (``physical'') options,
with @option{-L} being the default.  However, traditional shells do
not support these options, and their @command{cd} command has the
@option{-P} behavior.

Portable scripts should assume neither option is supported, and should
assume neither behavior is the default.  This can be a bit tricky,
since the POSIX default behavior means that, for example,
@samp{ls ..} and @samp{cd ..} may refer to different directories if
the current logical directory is a symbolic link.  It is safe to use
@code{cd @var{dir}} if @var{dir} contains no @file{..} components.
Also, Autoconf-generated scripts check for this problem when computing
variables like @code{ac_top_srcdir} (@pxref{Configuration Actions}),
so it is safe to @command{cd} to these variables.

POSIX states that behavior is undefined if @command{cd} is given an
explicit empty argument.  Some shells do nothing, some change to the
first entry in @env{CDPATH}, some change to @env{HOME}, and some exit
the shell rather than returning an error.  Unfortunately, this means
that if @samp{$var} is empty, then @samp{cd "$var"} is less predictable
than @samp{cd $var} (at least the latter is well-behaved in all shells
at changing to @env{HOME}, although this is probably not what you wanted
in a script).  You should check that a directory name was supplied
before trying to change locations.

@xref{Special Shell Variables}, for portability problems involving
@command{cd} and the @env{CDPATH} environment variable.
Also please see the discussion of the @command{pwd} command.


@anchor{echo}
@item @command{echo}
@c -----------------
@prindex @command{echo}
The simple @command{echo} is probably the most surprising source of
portability troubles.  It is not possible to use @samp{echo} portably
unless both options and escape sequences are omitted.

Do not use options, as some shells support them and others do not.
For example, POSIX says that the behavior of @samp{echo -n foo} is
implementation-defined.  On some platforms the output is @samp{foo}
without a trailing newline, on others it is @samp{-n foo} with a
trailing newline, and POSIX allows even other behavior.

Do not use backslashes in the arguments, as there is no consensus on
their handling.  For @samp{echo '\n' | wc -l}, the @command{sh} of
Solaris 10 outputs 2,
but Bash and Zsh (in @command{sh} emulation mode) output 1.
The problem is truly @command{echo}: all the shells
understand @samp{'\n'} as the string composed of a backslash and an
@samp{n}.

Because of these problems, do not pass a string containing arbitrary
characters to @command{echo}.  For example, @samp{echo "$foo"} is safe
only if you know that @var{foo}'s value cannot contain backslashes and
cannot start with @samp{-}.

Normally, @command{printf} is safer and easier to use than @command{echo}
and @command{echo -n}.  Thus, you should use @command{printf '%s\n'}
instead of @command{echo}, and similarly use @command{printf %s} instead
of @command{echo -n}.

Older scripts, written before @command{printf} was portable,
sometimes used a here-document as a safer alternative to @command{echo},
like this:

@example
cat <<EOF
$foo
EOF
@end example

@noindent
However, this usage is problematic, as even some modern shells have
hard-to-reproduce bugs when dealing with here-documents.


@item @command{eval}
@c -----------------
@prindex @command{eval}
The @command{eval} command is useful in limited circumstances, e.g.,
using commands like @samp{eval table_$key=\$value} and @samp{eval
value=table_$key} to simulate a hash table when the key is known to be
alphanumeric.

You should also be wary of common bugs in @command{eval} implementations.
In some shell implementations (e.g., older @command{ash}, OpenBSD 3.8
@command{sh}, @command{pdksh} v5.2.14 99/07/13.2, and @command{zsh}
4.2.5), the arguments of @samp{eval} are evaluated in a context where
@samp{$?} is 0, so they exhibit behavior like this:

@example
$ @kbd{false; eval 'echo $?'}
0
@end example

The correct behavior here is to output a nonzero value,
but portable scripts should not rely on this.

You should not rely on @code{LINENO} within @command{eval}.
@xref{Special Shell Variables}.

Note that, even though these bugs are easily avoided,
@command{eval} is tricky to use on arbitrary arguments.
It is obviously unwise to use @samp{eval $cmd} if the string value of
@samp{cmd} was derived from an untrustworthy source.  But even if the
string value is valid, @samp{eval $cmd} might not work as intended,
since it causes field splitting and file name expansion to occur twice,
once for the @command{eval} and once for the command itself.  It is
therefore safer to use @samp{eval "$cmd"}.  For example, if @var{cmd}
has the value @samp{cat test?.c}, @samp{eval $cmd} might expand to the
equivalent of @samp{cat test;.c} if there happens to be a file named
@file{test;.c} in the current directory; and this in turn
mistakenly attempts to invoke @command{cat} on the file @file{test} and
then execute the command @command{.c}.  To avoid this problem, use
@samp{eval "$cmd"} rather than @samp{eval $cmd}.

However, suppose that you want to output the text of the evaluated
command just before executing it.  Assuming the previous example,
@samp{printf '%s\n' "Executing: $cmd"} outputs @samp{Executing: cat test?.c},
but this output doesn't show the user that @samp{test;.c} is the actual
name of the copied file.
Conversely, @samp{printf 'Executing:'; eval "printf ' %s' $cmd"; printf '\n'}
works on this example, but it fails with @samp{cmd='cat foo >bar'},
since it mistakenly replaces the contents of @file{bar} by the
string @samp{ cat foo}.  No simple, general, and portable solution to
this problem is known.

@item @command{exec}
@c -----------------
@prindex @command{exec}
POSIX describes several categories of shell built-ins.  Special
built-ins (such as @command{exit}) must impact the environment of the
current shell, and need not be available through @command{exec}.  All
other built-ins are regular, and must not propagate variable assignments
to the environment of the current shell.  However, the group of regular
built-ins is further distinguished by commands that do not require a
@env{PATH} search (such as @command{cd}), in contrast to built-ins that
are offered as a more efficient version of something that must still be
found in a @env{PATH} search (such as @command{echo}).  POSIX is not
clear on whether @command{exec} must work with the list of 17 utilities
that are invoked without a @env{PATH} search, and many platforms lack an
executable for some of those built-ins:

@example
$ @kbd{sh -c 'exec cd /tmp'}
sh: line 0: exec: cd: not found
@end example

All other built-ins that provide utilities specified by POSIX must have
a counterpart executable that exists on @env{PATH}, although POSIX
allows @command{exec} to use the built-in instead of the executable.
For example, contrast @command{bash} 3.2 and @command{pdksh} 5.2.14:

@example
$ @kbd{bash -c 'pwd --version' | head -n1}
bash: line 0: pwd: --: invalid option
pwd: usage: pwd [-LP]
$ @kbd{bash -c 'exec pwd --version' | head -n1}
pwd (GNU coreutils) 6.10
$ @kbd{pdksh -c 'exec pwd --version' | head -n1}
pdksh: pwd: --: unknown option
@end example

When it is desired to avoid a regular shell built-in, the workaround is
to use some other forwarding command, such as @command{env} or
@command{nice}, that will ensure a path search:

@example
$ @kbd{pdksh -c 'exec true --version' | head -n1}
$ @kbd{pdksh -c 'nice true --version' | head -n1}
true (GNU coreutils) 6.10
$ @kbd{pdksh -c 'env true --version' | head -n1}
true (GNU coreutils) 6.10
@end example

@item @command{exit}
@c -----------------
@prindex @command{exit}
The default value of @command{exit} is supposed to be @code{$?};
unfortunately, some shells, such as the DJGPP port of Bash 2.04, just
perform @samp{exit 0}.

@example
bash-2.04$ @kbd{foo=`exit 1` || echo fail}
fail
bash-2.04$ @kbd{foo=`(exit 1)` || echo fail}
fail
bash-2.04$ @kbd{foo=`(exit 1); exit` || echo fail}
bash-2.04$
@end example

Using @samp{exit $?} restores the expected behavior.

Some shell scripts, such as those generated by @command{autoconf}, use a
trap to clean up before exiting.  If the last shell command exited with
nonzero status, the trap also exits with nonzero status so that the
invoker can tell that an error occurred.

Unfortunately, in some shells, such as Solaris 10 @command{/bin/sh}, an exit
trap ignores the @code{exit} command's argument.  In these shells, a trap
cannot determine whether it was invoked by plain @code{exit} or by
@code{exit 1}.  Instead of calling @code{exit} directly, use the
@code{AC_MSG_ERROR} macro that has a workaround for this problem.


@anchor{export}
@item @command{export}
@c -------------------
@prindex @command{export}
The builtin @command{export} dubs a shell variable @dfn{environment
variable}.  Each update of exported variables corresponds to an update
of the environment variables.  Conversely, each environment variable
received by the shell when it is launched should be imported as a shell
variable marked as exported.

Alas, some older shells, such as Solaris 10 @command{/bin/sh}, forget to
@command{export} the environment variables they receive.  As a result,
two variables coexist: the environment variable and the shell
variable.  The following code demonstrates this failure:

@example
#!/bin/sh
echo $FOO
FOO=bar
echo $FOO
exec /bin/sh $0
@end example

@noindent
when run with @samp{FOO=foo} in the environment, these shells print
alternately @samp{foo} and @samp{bar}, although they should print only
@samp{foo} and then a sequence of @samp{bar}s.

Therefore you should @command{export} again each environment variable
that you update; the export can occur before or after the assignment.

POSIX is not clear on whether the @command{export} of an undefined
variable causes the variable to be defined with the value of an empty
string, or merely marks any future definition of a variable by that name
for export.  Various shells behave differently in this regard:

@example
$ @kbd{sh -c 'export foo; env | grep foo'}
$ @kbd{ash -c 'export foo; env | grep foo'}
foo=
@end example

POSIX requires @command{export} to honor assignments made as arguments,
but older shells do not support this, including @command{/bin/sh} in
Solaris 10.  Portable scripts should separate assignments and exports
into different statements.

@example
$ @kbd{bash -c 'export foo=bar; echo $foo'}
bar
$ @kbd{/bin/sh -c 'export foo=bar; echo $foo'}
/bin/sh: foo=bar: is not an identifier
$ @kbd{/bin/sh -c 'export foo; foo=bar; echo $foo'}
bar
@end example

POSIX requires @command{export} to work with any arbitrary value for the
contents of the variable being exported, as long as the total size of
the environment combined with arguments doesn't exceed @code{ARG_MAX}
when executing a child process.  However, some shells have extensions
that involve interpreting some environment values specially, regardless
of the variable name.  We currently know of one case: all versions of
Bash released prior to 27 September 2014 interpret an environment
variable with an initial content substring of @code{() @{} as an
exported function definition (this is the ``Shellshock'' remote
execution bug, CVE-2014-6271 and friends, where it was possible to
exploit the function parser to cause remote code execution on child bash
startup; newer versions of Bash use special environment variable
@emph{names} instead of values to implement the same feature).

There may be entries inherited into the environment that are not valid
as shell variable names; POSIX states that processes should be tolerant
of these names.  Some shells such as @command{dash} do this by removing
those names from the environment at startup, while others such as
@command{bash} hide the entry from shell access but still pass it on to
child processes.  While you can set such names using @command{env} for a
direct child process, you cannot rely on them being preserved through an
intermediate pass through the shell.

@item @command{false}
@c ------------------
@prindex @command{false}
Don't expect @command{false} to exit with status 1: in native
Solaris @file{/bin/false} exits with status 255.


@item @command{for}
@c ----------------
@prindex @command{for}
To loop over positional arguments, use:

@example
for arg
do
  printf '%s\n' "$arg"
done
@end example

@noindent
You may @emph{not} leave the @code{do} on the same line as @code{for},
since some shells improperly grok:

@example
for arg; do
  printf '%s\n' "$arg"
done
@end example

If you want to explicitly refer to the positional arguments, use:

@example
for arg in "$@@"; do
  printf '%s\n' "$arg"
done
@end example

POSIX requires support for a @command{for} loop with no list after
@code{in}.  However, Solaris 10 @command{/bin/sh} treats that as a syntax
error.  It is possible to work around this by providing any shell word
that expands to nothing, or by ignoring an obvious sentinel.

@example
$ @kbd{/bin/sh -c 'for a in $empty; do echo hi; done'}
$ @kbd{/bin/sh -c 'for a in ; do echo hi; done'}
/bin/sh: syntax error at line 1: `;' unexpected
@end example

This syntax problem is most frequently encountered in code that goes
through several layers of expansion, such as an m4 macro or makefile
variable used as a list body, where the first layer of expansion (m4 or
make) can end up expanding to nothing in the version handed to the
shell.  In the makefile context, one common workaround is to use a shell
variable rather than a make variable as the source of the list.

@example
$ @kbd{cat Makefile}
list =
bad:
	@@for arg in $(list); do \
	  printf '%s\n' $$arg; \
	done
good:
	@@list='$(list)'; \
	for arg in $$list; do \
	  printf '%s\n' $$arg; \
	done
$ @kbd{make bad 2&>1 | head -n1}
sh: syntax error at line 1: `;' unexpected
$ @kbd{make bad list='a b'}
a
b
$ @kbd{make good}
$ @kbd{make good list='a b'}
a
b
@end example

In Solaris 10 @command{/bin/sh}, when the list of arguments of a
@command{for} loop starts with @emph{unquoted} tokens looking like
variable assignments, the loop is not executed on those tokens:

@example
$ @kbd{/bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'}
x
e=f
@end example

@noindent
Thankfully, quoting the assignment-like tokens, or starting the list
with other tokens (including unquoted variable expansion that results in
an assignment-like result), avoids the problem, so it is easy to work
around:

@example
$ @kbd{/bin/sh -c 'for v in "a=b"; do echo $v; done'}
a=b
$ @kbd{/bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'}
a=b
c=d
@end example

@anchor{if}
@item @command{if}
@c ---------------
@prindex @command{if}
If an @code{if} command is not inside @code{AC_DEFUN}, and it contains
calls to Autoconf macros, it should be rewritten using @code{AS_IF}.
@xref{Common Shell Constructs}.

Using @code{if ! @dots{}} is not portable.  @xref{!,,@command{!} notes}.

Some very old shells did not reset the exit status from an @command{if}
with no @command{else}:

@example
$ @kbd{if (exit 42); then true; fi; echo $?}
42
@end example

@noindent
whereas a proper shell should have printed @samp{0}.  Although this is no
longer a portability problem, as any shell that supports functions gets it
correct, it explains why some makefiles have lengthy
constructs:

@example
if test -f "$file"; then
  install "$file" "$dest"
else
  :
fi
@end example


@item @command{printf}
@c ------------------
@prindex @command{printf}
A format string starting with a @samp{-} can cause problems.
Bash interprets it as an option and
gives an error.  And @samp{--} to mark the end of options is not good
in the NetBSD Almquist shell (e.g., 0.4.6) which takes that
literally as the format string.  Putting the @samp{-} in a @samp{%c}
or @samp{%s} is probably easiest:

@example
printf %s -foo
@end example

AIX 7.2 @command{sh} mishandles octal escapes in multi-byte locales by
treating them as characters instead of bytes.  For example, in a locale
using the UTF-8 encoding, @samp{printf '\351'} outputs the two bytes C3,
A9 (the UTF-8 encoding for U+00E9) instead of the desired single byte E9.
To work around the bug, use the C locale.

Bash 2.03 mishandles an escape sequence that happens to evaluate to @samp{%}:

@example
$ @kbd{printf '\045'}
bash: printf: `%': missing format character
@end example

Large outputs may cause trouble.  On Solaris 10, for
example, @file{/usr/bin/printf} is buggy, so when using
@command{/bin/sh} the command @samp{printf %010000x 123} normally dumps
core.

Since @command{printf} is not always a shell builtin, there is a
potential speed penalty for using @code{printf '%s\n'} as a replacement
for an @command{echo} that does not interpret @samp{\} or leading
@samp{-}. With Solaris @command{ksh}, it is possible to use @code{print
-r --} for this role instead.

@xref{echo, , Limitations of Shell Builtins}, for a discussion of
portable alternatives to both @command{printf} and @command{echo}.


@item @command{pwd}
@c ----------------
@prindex @command{pwd}
With modern shells, plain @command{pwd} outputs a ``logical''
directory name, some of whose components may be symbolic links.  These
directory names are in contrast to ``physical'' directory names, whose
components are all directories.

POSIX requires that @command{pwd} must support
the @option{-L} (``logical'') and @option{-P} (``physical'') options,
with @option{-L} being the default.  However, traditional shells do
not support these options, and their @command{pwd} command has the
@option{-P} behavior.

Portable scripts should assume neither option is supported, and should
assume neither behavior is the default.  Also, on many hosts
@samp{/bin/pwd} is equivalent to @samp{pwd -P}, but POSIX
does not require this behavior and portable scripts should not rely on
it.

Typically it's best to use plain @command{pwd}.  On modern hosts this
outputs logical directory names, which have the following advantages:

@itemize @bullet
@item
Logical names are what the user specified.
@item
Physical names may not be portable from one installation
host to another due to network file system gymnastics.
@item
On modern hosts @samp{pwd -P} may fail due to lack of permissions to
some parent directory, but plain @command{pwd} cannot fail for this
reason.
@end itemize

Also please see the discussion of the @command{cd} command.


@item @command{read}
@c -----------------
@prindex @command{read}
No options are portable, not even support @option{-r} (Solaris 10
@command{/bin/sh} for example).


@anchor{set}
@item @command{set}
@c ----------------
@prindex @command{set}
With the FreeBSD 6.0 shell, the @command{set} command (without
any options) does not sort its output.

The @command{set} builtin faces the usual problem with arguments
starting with a
dash.  Modern shells such as Bash or Zsh understand @option{--} to specify
the end of the options (any argument after @option{--} is a parameter,
even @samp{-x} for instance), but many traditional shells (e.g., Solaris
10 @command{/bin/sh}) simply stop option
processing as soon as a non-option argument is found.  Therefore, use
@samp{dummy} or simply @samp{x} to end the option processing, and use
@command{shift} to pop it out:

@example
set x $my_list; shift
@end example

Avoid @samp{set -}, e.g., @samp{set - $my_list}.  POSIX no
longer requires support for this command, and in traditional shells
@samp{set - $my_list} resets the @option{-v} and @option{-x} options, which
makes scripts harder to debug.

Some nonstandard shells do not recognize more than one option
(e.g., @samp{set -e -x} assigns @samp{-x} to the command line).  It is
better to combine them:

@example
set -ex
@end example

@cindex @command{set -e}
The @option{-e} option has historically been under-specified, with enough
ambiguities to cause numerous differences across various shell
implementations; see for example
@uref{https://www.in-ulm.de/@/~mascheck/@/various/@/set-e/, this overview},
or @uref{https://www.austingroupbugs.net/@/view.php?id=52, this link},
documenting a change to POSIX 2008 to match @command{ksh88} behavior.
Note that mixing @code{set -e} and shell functions is asking for surprises:

@example
set -e
doit()
@{
  rm file
  echo one
@}
doit || echo two
@end example

@noindent
According to the recommendation, @samp{one} should always be output
regardless of whether the @command{rm} failed, because it occurs within
the body of the shell function @samp{doit} invoked on the left side of
@samp{||}, where the effects of @samp{set -e} are not enforced.
Likewise, @samp{two} should never be printed, since the failure of
@command{rm} does not abort the function, such that the status of
@samp{doit} is 0.

The BSD shell has had several problems with the @option{-e}
option.  Older versions of the BSD
shell (circa 1990) mishandled @samp{&&}, @samp{||}, @samp{if}, and
@samp{case} when @option{-e} was in effect, causing the shell to exit
unexpectedly in some cases.  This was particularly a problem with
makefiles, and led to circumlocutions like @samp{sh -c 'test -f file ||
touch file'}, where the seemingly-unnecessary @samp{sh -c '@dots{}'}
wrapper works around the bug (@pxref{Failure in Make Rules}).

Even relatively-recent versions of the BSD shell (e.g., OpenBSD 3.4)
wrongly exit with @option{-e} if the last command within a compound
statement fails and is guarded by an @samp{&&} only.  For example:

@example
#! /bin/sh
set -e
foo=''
test -n "$foo" && exit 1
echo one
if :; then
  test -n "$foo" && exit 1
  echo two
  test -n "$foo" && exit 1
fi
echo three
@end example

@noindent
does not print @samp{three}.  One workaround is to change the last
instance of @samp{test -n "$foo" && exit 1} to be @samp{if test -n
"$foo"; then exit 1; fi} instead.  Another possibility is to warn BSD
users not to use @samp{sh -e}.

When @samp{set -e} is in effect, a failed command substitution in
Solaris 10 @command{/bin/sh} cannot be ignored, even with @samp{||}.

@example
$ @kbd{/bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'}
$ @kbd{bash -c 'set -e; foo=`false` || echo foo; echo bar'}
foo
bar
@end example

@noindent
Moreover, a command substitution, successful or not, causes this shell to
exit from a failing outer command even in presence of an @samp{&&} list:

@example
$ @kbd{bash -c 'set -e; false `true` && echo notreached; echo ok'}
ok
$ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'}
$
@end example

@cindex @command{set -b}
@cindex @command{set -m}
Job control is not provided by all shells, so the use of @samp{set -m}
or @samp{set -b} must be done with care.  When using @command{zsh} in
native mode, asynchronous notification (@samp{set -b}) is enabled by
default, and using @samp{emulate sh} to switch to POSIX mode does not
clear this setting (although asynchronous notification has no impact
unless job monitoring is also enabled).  Also, @command{zsh} 4.3.10 and
earlier have a bug where job control can be manipulated in interactive
shells, but not in subshells or scripts.  Furthermore, some shells, like
@command{pdksh}, fail to treat subshells as interactive, even though the
parent shell was.

@example
$ @kbd{echo $ZSH_VERSION}
4.3.10
$ @kbd{set -m; echo $?}
0
$ @kbd{zsh -c 'set -m; echo $?'}
set: can't change option: -m
$ @kbd{(set -m); echo $?}
set: can't change option: -m
1
$ @kbd{pdksh -ci 'echo $-; (echo $-)'}
cim
c
@end example

@cindex @command{set -n}
Use of @command{set -n} (typically via @command{sh -n script}) to
validate a script is not foolproof.  Modern @command{ksh93} tries to be
helpful by informing you about better syntax, but switching the script
to use the suggested syntax in order to silence the warnings would
render the script no longer portable to older shells:

@example
$ @kbd{ksh -nc '``'}
ksh: warning: line 1: `...` obsolete, use $(...)
0
@end example

Autoconf
itself uses @command{sh -n} within its testsuite to check that correct
scripts were generated, but only after first probing for other shell
features (such as @code{test $@{BASH_VERSION+y@}}) that indicate
a reasonably fast and working implementation.

@item @command{shift}
@c ------------------
@prindex @command{shift}
Not only is @command{shift}ing a bad idea when there is nothing left to
shift, but in addition it is not portable: the shell of MIPS
RISC/OS 4.52 refuses to do it.

Don't use @samp{shift 2} etc.; while it in the SVR1 shell (1983),
it is also absent in many pre-POSIX shells.


@item @command{source}
@c -------------------
@prindex @command{source}
This command is not portable, as POSIX does not require it; use
@command{.} instead.


@item @command{test}
@c -----------------
@prindex @command{test}
The @code{test} program is the way to perform many file and string
tests.  It is often invoked by the alternate name @samp{[}, but using
that name in Autoconf code is asking for trouble since it is an M4 quote
character.

The @option{-a}, @option{-o}, @samp{(}, and @samp{)} operands are not
present in all implementations, and have been marked obsolete by POSIX
2008.  This is because there are inherent ambiguities in using them.
For example, @samp{test "$1" -a "$2"} looks like a binary operator to
check whether two strings are both non-empty, but if @samp{$1} is the
literal @samp{!}, then some implementations of @command{test} treat it
as a negation of the unary operator @option{-a}.

Thus, portable uses of @command{test} should never have more than four
arguments, and scripts should use shell constructs like @samp{&&} and
@samp{||} instead.  If you combine @samp{&&} and @samp{||} in the same
statement, keep in mind that they have equal precedence, so it is often
better to parenthesize even when this is redundant.  For example:

@smallexample
# Not portable:
test "X$a" = "X$b" -a \
  '(' "X$c" != "X$d" -o "X$e" = "X$f" ')'

# Portable:
test "X$a" = "X$b" &&
  @{ test "X$c" != "X$d" || test "X$e" = "X$f"; @}
@end smallexample

@command{test} does not process options like most other commands do; for
example, it does not recognize the @option{--} argument as marking the
end of options.

It is safe to use @samp{!} as a @command{test} operator.  For example,
@samp{if test ! -d foo; @dots{}} is portable even though @samp{if ! test
-d foo; @dots{}} is not.


@item @command{test} (files)
@c -------------------------
To enable @command{configure} scripts to support cross-compilation, they
shouldn't do anything that tests features of the build system instead of
the host system.  But occasionally you may find it necessary to check
whether some arbitrary file exists.  To do so, use @samp{test -f},
@samp{test -r}, or @samp{test -x}.  Do not use @samp{test -e}, because
Solaris 10 @command{/bin/sh}
lacks it.

To test for symbolic links on systems that have them, use
@samp{test -h} rather than @samp{test -L}; either form conforms to
POSIX, but @option{-h} has been around longer.

The commands @samp{test A -ot B} and @samp{test A -nt B} are not reliable
on macOS @command{sh} through at least macOS Sequoia 15.1.1 (2024),
where @samp{test} ignores the subsecond part of file timestamps.
To work around this bug, arrange for the timestamps to be at least one
second apart.

For historical reasons, POSIX reluctantly allows implementations of
@samp{test -x} that will succeed for the root user, even if no execute
permissions are present.  Furthermore, shells do not all agree on
whether Access Control Lists should affect @samp{test -r}, @samp{test
-w}, and @samp{test -x}; some shells base test results strictly on the
current user id compared to file owner and mode, as if by
@code{stat(2)}; while other shells base test results on whether the
current user has the given right, even if that right is only granted by
an ACL, as if by @code{faccessat(2)}.  Furthermore, there is a classic
time of check to time of use race between any use of @command{test}
followed by operating on the just-checked file.  Therefore, it is a good
idea to write scripts that actually attempt an operation, and are
prepared for the resulting failure if permission is denied, rather than
trying to avoid an operation based solely on whether @command{test}
guessed that it might not be permitted.

@item @command{test} (strings)
@c ---------------------------
POSIX says that @samp{test "@var{string}"} succeeds if @var{string} is
not null, but this usage is not portable to traditional platforms like
Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and
@samp{-n}.  However, it @emph{is} portable to test if a variable is set
to a non-empty value, by using @samp{test $@{var+y@}}, since all known
implementations properly distinguish between no arguments and a
known-safe string of @samp{y}.

POSIX also says that @samp{test ! "@var{string}"},
@samp{test -n "@var{string}"} and
@samp{test -z "@var{string}"} work with any string, but many
shells (such as Solaris 10, AIX 3.2, UNICOS 10.0.0.6,
Digital Unix 4, etc.)@: get confused if
@var{string} looks like an operator:

@example
$ @kbd{test -n =}
test: argument expected
$ @kbd{test ! -n}
test: argument expected
$ @kbd{test -z ")"; echo $?}
0
@end example

Similarly, POSIX says that both @samp{test "@var{string1}" = "@var{string2"}}
and @samp{test "@var{string1}" != "@var{string2"}} work for any pairs of
strings, but in practice this is not true for troublesome strings that
look like operators or parentheses, or that begin with @samp{-}.

It is best to protect such strings with a leading @samp{X}, e.g.,
@samp{test "X@var{string}" != X} rather than @samp{test -n
"@var{string}"} or @samp{test ! "@var{string}"}.

It is common to find variations of the following idiom:

@example
test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
  @var{action}
@end example

@noindent
to take an action when a token matches a given pattern.  Such constructs
should be avoided by using:

@example
AS_CASE([$ac_feature],
  [[*[!-a-zA-Z0-9_]*]], [@var{action}])
@end example

If the pattern is a complicated regular expression that cannot be
expressed as a shell pattern, use something like this instead:

@example
expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
  @var{action}
@end example

@samp{expr "X@var{foo}" : "X@var{bar}"} is more robust than @samp{echo
"X@var{foo}" | grep "^X@var{bar}"}, because it avoids problems when
@samp{@var{foo}} contains backslashes.


@anchor{trap}
@item @command{trap}
@c -----------------
@prindex @command{trap}
It is safe to trap at least the signals 1, 2, 13, and 15.  You can also
trap 0, i.e., have the @command{trap} run when the script ends (either via an
explicit @command{exit}, or the end of the script).  The trap for 0 should be
installed outside of a shell function, or AIX 5.3 @command{/bin/sh}
will invoke the trap at the end of this function.

POSIX says that @samp{trap - 1 2 13 15} resets the traps for the
specified signals to their default values, but many common shells (e.g.,
Solaris 10 @command{/bin/sh}) misinterpret this and attempt to execute a
``command'' named @command{-} when the specified conditions arise.
POSIX 2008 also added a requirement to support @samp{trap 1 2 13 15} to
reset traps, as this is supported by a larger set of shells, but there
are still shells like @command{dash} that mistakenly try to execute
@command{1} instead of resetting the traps.  Therefore, there is no
portable workaround, except for @samp{trap - 0}, for which
@samp{trap '' 0} is a portable substitute.

Although POSIX is not absolutely clear on this point, it is widely
admitted that when entering the trap @samp{$?} should be set to the exit
status of the last command run before the trap.  The ambiguity can be
summarized as: ``when the trap is launched by an @command{exit}, what is
the @emph{last} command run: that before @command{exit}, or
@command{exit} itself?''

Bash considers @command{exit} to be the last command, while Zsh and
Solaris 10 @command{/bin/sh} consider that when the trap is run it is
@emph{still} in the @command{exit}, hence it is the previous exit status
that the trap receives:

@example
$ @kbd{cat trap.sh}
trap 'echo $?' 0
(exit 42); exit 0
$ @kbd{zsh trap.sh}
42
$ @kbd{bash trap.sh}
0
@end example

The portable solution is then simple: when you want to @samp{exit 42},
run @samp{(exit 42); exit 42}, the first @command{exit} being used to
set the exit status to 42 for Zsh, and the second to trigger the trap
and pass 42 as exit status for Bash.  In M4sh, this is covered by using
@code{AS_EXIT}.

The shell in FreeBSD 4.0 has the following bug: @samp{$?} is
reset to 0 by empty lines if the code is inside @command{trap}.

@example
$ @kbd{trap 'false}

echo $?' 0
$ @kbd{exit}
0
@end example

@noindent
Fortunately, this bug only affects @command{trap}.

Several shells fail to execute an exit trap that is defined inside a
subshell, when the last command of that subshell is not a builtin.  A
workaround is to use @samp{exit $?} as the shell builtin.

@example
$ @kbd{bash -c '(trap "echo hi" 0; /bin/true)'}
hi
$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true)'}
$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'}
hi
@end example

@noindent
Likewise, older implementations of @command{bash} failed to preserve
@samp{$?} across an exit trap consisting of a single cleanup command.

@example
$ @kbd{bash -c 'trap "/bin/true" 0; exit 2'; echo $?}
2
$ @kbd{bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?}
0
$ @kbd{bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?}
2
@end example

Be aware that a trap can be called from any number of places in your
script, and therefore the trap handler should not make assumptions about
shell state.  For some examples, if your script temporarily modifies
@env{IFS}, then the trap should include an initialization back to its
typical value of space-tab-newline (autoconf does this for generated
@file{configure} files).  Likewise, if your script changes the current
working directory at some point after the trap is installed, then your
trap cannot assume which directory it is in, and should begin by
changing directories to an absolute path if that is important to the
cleanup efforts (autotest does this for generated @file{testsuite}
files).

@item @command{true}
@c -----------------
@prindex @command{true}
@c Info cannot handle ':' in index entries.
@c @prindex @command{:}
Don't worry: as far as we know @command{true} is portable.
Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the
portable shell community tends to prefer using @command{:}.  This has a
funny side effect: when asked whether @command{false} is more portable
than @command{true} Alexandre Oliva answered:

@quotation
In a sense, yes, because if it doesn't exist, the shell will produce an
exit status of failure, which is correct for @command{false}, but not
for @command{true}.
@end quotation

Remember that even though @samp{:} ignores its arguments, it still takes
time to compute those arguments.  It is a good idea to use double quotes
around any arguments to @samp{:} to avoid time spent in field splitting
and file name expansion.


@anchor{unset}
@item @command{unset}
@c ------------------
@prindex @command{unset}
In some nonconforming shells (e.g., Solaris 10 @command{/bin/ksh} and
@command{/usr/xpg4/bin/sh}, NetBSD 5.99.43 sh, or Bash 2.05a),
@code{unset FOO} fails when @code{FOO} is not set.  This can interfere
with @code{set -e} operation.  You can use

@smallexample
FOO=; unset FOO
@end smallexample

@noindent
if you are not sure that @code{FOO} is set.

A few ancient shells lack @command{unset} entirely.  For some variables
such as @code{PS1}, you can use a neutralizing value instead:

@smallexample
PS1='$ '
@end smallexample

Usually, shells that do not support @command{unset} need less effort to
make the environment sane, so for example is not a problem if you cannot
unset @command{CDPATH} on those shells.  However, Bash 2.01 mishandles
@code{unset MAIL} and @code{unset MAILPATH} in some cases and dumps core.
So, you should do something like

@smallexample
( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :
@end smallexample

@noindent
@xref{Special Shell Variables}, for some neutralizing values.  Also, see
@ref{export, , Limitations of Builtins}, for
the case of environment variables.

@item @command{wait}
@c -----------------
@prindex @command{wait}
The exit status of @command{wait} is not always reliable.
@end table

@node Limitations of Usual Tools
@section Limitations of Usual Tools
@cindex Limitations of usual tools

The small set of tools you can expect to find on any machine can still
include some limitations you should be aware of.

@comment Between this list and the list of builtins above, we should
@comment mention all the tools in GNU Coding Standards ``Utilities in
@comment Makefiles''.

@c This table includes things like '@command{expr} (|)', so we can't
@c use @table @command.
@table @asis
@anchor{awk}
@item @command{awk}
@c ----------------
@prindex @command{awk}
Don't leave white space before the opening parenthesis in a user function call.
POSIX does not allow this and GNU Awk rejects it:

@example
$ @kbd{gawk 'function die () @{ print "Aaaaarg!"  @}
        BEGIN @{ die () @}'}
gawk: cmd. line:2:         BEGIN @{ die () @}
gawk: cmd. line:2:                      ^ parse error
$ @kbd{gawk 'function die () @{ print "Aaaaarg!"  @}
        BEGIN @{ die() @}'}
Aaaaarg!
@end example

POSIX says that if a program contains only @samp{BEGIN} actions, and
contains no instances of @code{getline}, then the program merely
executes the actions without reading input.  However, traditional Awk
implementations (such as Solaris 10 @command{awk}) read and discard
input in this case.  Portable scripts can redirect input from
@file{/dev/null} to work around the problem.  For example:

@example
awk 'BEGIN @{print "hello world"@}' </dev/null
@end example

POSIX says that in an @samp{END} action, @samp{$NF} (and presumably,
@samp{$1}) retain their value from the last record read, if no
intervening @samp{getline} occurred.  However, some implementations
(such as Solaris 10 @samp{/usr/bin/awk}, @samp{nawk}, or Darwin
@samp{awk}) reset these variables.  A workaround is to use an
intermediate variable prior to the @samp{END} block.  For example:

@example
$ @kbd{cat end.awk}
@{ tmp = $1 @}
END @{ print "a", $1, $NF, "b", tmp @}
$ @kbd{echo 1 | awk -f end.awk}
a   b 1
$ @kbd{echo 1 | gawk -f end.awk}
a 1 1 b 1
@end example

If you want your program to be deterministic, don't depend on @code{for}
on arrays:

@example
$ @kbd{cat for.awk}
END @{
  arr["foo"] = 1
  arr["bar"] = 1
  for (i in arr)
    print i
@}
$ @kbd{gawk -f for.awk </dev/null}
foo
bar
$ @kbd{nawk -f for.awk </dev/null}
bar
foo
@end example

Some Awk implementations, such as HP-UX 11.0's native one,
mishandle anchors:

@example
$ @kbd{echo xfoo | $AWK '/foo|^bar/ @{ print @}'}
$ @kbd{echo bar | $AWK '/foo|^bar/ @{ print @}'}
bar
$ @kbd{echo xfoo | $AWK '/^bar|foo/ @{ print @}'}
xfoo
$ @kbd{echo bar | $AWK '/^bar|foo/ @{ print @}'}
bar
@end example

@noindent
Either do not depend on such patterns (i.e., use @samp{/^(.*foo|bar)/},
or use a simple test to reject such implementations.

On @samp{ia64-hp-hpux11.23}, Awk mishandles @code{printf} conversions
after @code{%u}:

@example
$ @kbd{awk 'BEGIN @{ printf "%u %d\n", 0, -1 @}'}
0 0
@end example

AIX version 5.2 has an arbitrary limit of 399 on the
length of regular expressions and literal strings in an Awk program.

Traditional Awk implementations derived from Unix version 7, such as
Solaris @command{/bin/awk}, have many limitations and do not
conform to POSIX@.  Nowadays @code{AC_PROG_AWK} (@pxref{Particular
Programs}) finds you an Awk that doesn't have these problems, but if
for some reason you prefer not to use @code{AC_PROG_AWK} you may need to
address them.  For more detailed descriptions, see @ref{Language
History, , @command{awk} language history, gawk, GNU Awk User's Guide}.

Traditional Awk does not support multidimensional arrays or user-defined
functions.

Traditional Awk does not support the @option{-v} option.  You can use
assignments after the program instead, e.g., @code{$AWK '@{print v
$1@}' v=x}; however, don't forget that such assignments are not
evaluated until they are encountered (e.g., after any @code{BEGIN}
action).

Traditional Awk does not support the keywords @code{delete} or @code{do}.

Traditional Awk does not support the expressions
@code{@var{a}?@var{b}:@var{c}}, @code{!@var{a}}, @code{@var{a}^@var{b}},
or @code{@var{a}^=@var{b}}.

Traditional Awk does not support the predefined @code{CONVFMT} or
@code{ENVIRON} variables.

Traditional Awk supports only the predefined functions @code{exp}, @code{index},
@code{int}, @code{length}, @code{log}, @code{split}, @code{sprintf},
@code{sqrt}, and @code{substr}.

Traditional Awk @code{getline} is not at all compatible with POSIX;
avoid it.

Traditional Awk has @code{for (i in a) @dots{}} but no other uses of the
@code{in} keyword.  For example, it lacks @code{if (i in a) @dots{}}.

In code portable to both traditional and modern Awk, @code{FS} must be a
string containing just one ordinary character, and similarly for the
field-separator argument to @code{split}.

Traditional Awk has a limit of 99 fields in a record
and splits the input even if you don't refer to any field in the script.
To circumvent this problem, set @samp{FS}
to an unusual character and use @code{split}.

Traditional Awk has a limit of at most 99 bytes in a number formatted by
@code{OFMT}; for example, @code{OFMT="%.300e"; print 0.1;} typically
dumps core.

The original version of Awk had a limit of at most 99 bytes per
@code{split} field, 99 bytes per @code{substr} substring, and 99 bytes
per run of non-special characters in a @code{printf} format, but these
bugs have been fixed on all practical hosts that we know of.

HP-UX 11.00 Awk requires that input files have a line length
of at most 3070 bytes.

@item @command{basename}
@c ---------------------
@prindex @command{basename}
Long ago some hosts lacked a working @command{basename},
and portable scripts needed to use @command{expr} instead.
Nowadays it is safe to use @command{basename}.  For example:

@example
base=`basename -- "$file"`
@end example

@c AS_BASENAME is to be replaced by a better API.
@ignore
Not all hosts have a working @command{basename}, and you should instead
use @code{AS_BASENAME} (@pxref{Programming in M4sh}), followed by
@command{expr} if you need to strip a suffix.  For example:

@example
a=`basename "$aname"`       # This is not portable.
a=`AS_BASENAME(["$aname"])` # This is more portable.

# This is not portable.
c=`basename "$cname" .c`

# This is more portable.
c=`AS_BASENAME(["$cname"])`
case $c in
?*.c) c=`expr "X$c" : 'X\(.*\)\.c'`;;
esac
@end example
@end ignore


@item @command{cat}
@c ----------------
@prindex @command{cat}
Don't rely on any option.


@item @command{cc}
@c ---------------
@prindex @command{cc}
The command @samp{cc -c foo.c} traditionally produces an object file
named @file{foo.o}.  Most compilers allow @option{-c} to be combined
with @option{-o} to specify a different object file name, but
POSIX does not require this combination and a few compilers
lack support for it.  @xref{C Compiler}, for how GNU Make
tests for this feature with @code{AC_PROG_CC_C_O}.

When a compilation such as @samp{cc -o foo foo.c} fails, some compilers
(such as CDS on Reliant Unix) leave a @file{foo.o}.

HP-UX @command{cc} doesn't accept @file{.S} files to preprocess and
assemble.  @samp{cc -c foo.S} appears to succeed, but in fact does
nothing.

The default executable, produced by @samp{cc foo.c}, can be

@itemize
@item @file{a.out} -- usual POSIX convention.
@item @file{b.out} -- i960 compilers (including @command{gcc}).
@item @file{a.exe} -- DJGPP port of @command{gcc}.
@item @file{a_out.exe} -- GNV @command{cc} wrapper for DEC C on OpenVMS.
@item @file{foo.exe} -- various MS-DOS compilers.
@end itemize

The C compiler's traditional name is @command{cc}, but other names like
@command{gcc} are common.  POSIX 1003.1-2024 specifies the
name @command{c17}, but older POSIX editions specified
@command{c99} or @command{c89}, future POSIX standards will likely specify
other commands, and anyway these standard names are rarely used in
practice.  Typically the C compiler is invoked from makefiles that use
@samp{$(CC)}, so the value of the @samp{CC} make variable selects the
compiler name.

@item @command{chgrp}
@itemx @command{chown}
@c -------------------
@prindex @command{chgrp}
@prindex @command{chown}
It is not portable to change a file's group to a group that the owner
does not belong to.

@item @command{chmod}
@c ------------------
@prindex @command{chmod}
Avoid usages like @samp{chmod -w file}; use @samp{chmod a-w file}
instead, for two reasons.  First, plain @option{-w} does not necessarily
make the file unwritable, since it does not affect mode bits that
correspond to bits in the file mode creation mask.  Second,
POSIX says that the @option{-w} might be interpreted as an
implementation-specific option, not as a mode; POSIX suggests
using @samp{chmod -- -w file} to avoid this confusion, but unfortunately
@samp{--} does not work on some older hosts.


@item @command{cmp}
@c ----------------
@prindex @command{cmp}
@command{cmp} performs a raw data comparison of two files, while
@command{diff} compares two text files.  Therefore, if you might compare
DOS files, even if only checking whether two files are different, use
@command{diff} to avoid spurious differences due to differences of
newline encoding.


@item @command{cp}
@c ---------------
@prindex @command{cp}
The @option{-i}, @option{-f}, @option{-p} and @option{-R} options are
widely used.  POSIX also specifies @option{-H}, @option{-L}, and
@option{-P}.  Avoid other options in portable scripts.

@cindex timestamp resolution
Traditionally, file timestamps had 1-second resolution, and @samp{cp
-p} copied the timestamps exactly.  However, many modern file systems
have timestamps with 1-nanosecond resolution.  Unfortunately, some older
@samp{cp -p} implementations truncate timestamps when copying files,
which can cause the destination file to appear to be older than the
source.  The exact amount of truncation depends on the resolution of
the system calls that @command{cp} uses.  Traditionally this was
@code{utime}, which has 1-second resolution.  Since
GNU Core Utilities 6.12 (2008), GNU @command{cp} can set timestamps to
the full nanosecond resolution, using the system calls
@code{futimens} and @code{utimensat} when they are available.  As of
2024, though, some platforms (such as AIX 7.3) still have @samp{cp -p}
that supports only 1-second resolution, and some operating systems
and file systems have similar limitations even when running
GNU @command{cp}.

Although @samp{cp -p} always @emph{tries} to copy
ownerships, whether it actually does so is a
system dependent policy decision implemented by the kernel.  If the
kernel allows it then it happens.  If the kernel does not allow it then
it does not happen.  It is not something @command{cp} itself has control
over.

In Unix System V any user can chown files to any other user, and System
V also has a non-sticky @file{/tmp}.  That probably derives from the
heritage of System V in a business environment without hostile users.
BSD changed this
to be a more secure model where only root can @command{chown} files and
a sticky @file{/tmp} is used.  That undoubtedly derives from the heritage
of BSD in a campus environment.

GNU/Linux and Solaris by default follow BSD, but
can be configured to allow a System V style @command{chown}.  On the
other hand, HP-UX follows System V, but can
be configured to use the modern security model and disallow
@command{chown}.  Since it is an administrator-configurable parameter
you can't use the name of the kernel as an indicator of the behavior.



@item @command{date}
@c -----------------
@prindex @command{date}
When most versions of @command{date} do not recognize a @samp{%}
conversion specification, they quietly pass it through,
and exit with success:

@example
$ @kbd{date --version | head -n 1}
date (GNU coreutils) 9.5
$ @kbd{date +'%H:%M %Q'}
17:25 %Q
@end example

@noindent
However, this behavior is not required by POSIX.


@item @command{dirname}
@c --------------------
@prindex @command{dirname}
Long ago some hosts lacked a working @command{dirname} and portable
scripts needed to use use @code{AS_DIRNAME} (@pxref{Programming in M4sh}).
Nowadays @command{dirname} suffices and the following are equivalent:

@example
dir=`dirname -- "$file"`
dir=`AS_DIRNAME(["$file"])`
@end example


@item @command{egrep}
@c ------------------
@prindex @command{egrep}
Although POSIX stopped requiring @command{egrep} in 2001,
a few traditional hosts (notably Solaris 10) do not support the POSIX
replacement @code{grep -E}.  Also, some traditional implementations do
not work on long input lines.  To work around these problems, invoke
@code{AC_PROG_EGREP} and then use @code{$EGREP}.

Portable extended regular expressions should use @samp{\} only to escape
characters in the string @samp{$()*+.?[\^@{|}.  For example, @samp{\@}}
is not portable, even though it typically matches @samp{@}}.

The empty alternative is not portable.  Use @samp{?} instead.  For
instance with Digital Unix v5.0:

@example
> printf 'foo\n|foo\n' | $EGREP '^(|foo|bar)$'
|foo
> printf 'bar\nbar|\n' | $EGREP '^(foo|bar|)$'
bar|
> printf 'foo\nfoo|\n|bar\nbar\n' | $EGREP '^(foo||bar)$'
foo
|bar
@end example

For more information about what can appear in portable extended regular
expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}.

@command{$EGREP} also suffers the limitations of @command{grep}
(@pxref{grep, , Limitations of Usual Tools}).

@item @command{expr}
@c -----------------
@prindex @command{expr}
Not all implementations obey the POSIX rule that @samp{--} separates
options from arguments; likewise, not all implementations provide the
extension to POSIX that the first argument can be treated as part of a
valid expression rather than an invalid option if it begins with
@samp{-}.  When performing arithmetic, use @samp{expr 0 + $var} if
@samp{$var} might be a negative number, to keep @command{expr} from
interpreting it as an option.

No @command{expr} keyword starts with @samp{X}, so use @samp{expr
X"@var{word}" : 'X@var{regex}'} to keep @command{expr} from
misinterpreting @var{word}.

Don't use @code{length}, @code{substr}, @code{match} and @code{index}.

@item @command{expr} (@samp{|})
@prindex @command{expr} (@samp{|})
You can use @samp{|}.  Although POSIX does require that @samp{expr
''} return the empty string, it does not specify the result when you
@samp{|} together the empty string (or zero) with the empty string.  For
example:

@example
expr '' \| ''
@end example

POSIX 1003.2-1992 returns the empty string
for this case, but traditional Unix returns @samp{0} (Solaris is
one such example).  In POSIX 1003.1-2001, the specification was
changed to match traditional Unix's behavior (which is
bizarre, but it's too late to fix this).  Please note that the same
problem does arise when the empty string results from a computation,
as in:

@example
expr bar : foo \| foo : bar
@end example

@noindent
Avoid this portability problem by avoiding the empty string.


@item @command{expr} (@samp{:})
@c ----------------------------
@prindex @command{expr}
Portable @command{expr} regular expressions should use @samp{\} to
escape only characters in the string @samp{$()*.123456789[\^@{@}}.
For example, alternation, @samp{\|}, is common but POSIX does not
require its support, so it should be avoided in portable scripts.
Similarly, @samp{\+} and @samp{\?} should be avoided.

Portable @command{expr} regular expressions should not begin with
@samp{^}.  Patterns are automatically anchored so leading @samp{^} is
not needed anyway.

On the other hand, the behavior of the @samp{$} anchor is not portable
on multi-line strings.  POSIX is ambiguous whether the anchor applies to
each line, as was done in older versions of the GNU Core Utilities, or
whether it applies only to the end of the overall string, as in
Coreutils 6.0 and most other implementations.

@example
$ @kbd{baz='foo}
> @kbd{bar'}
$ @kbd{expr "X$baz" : 'X\(foo\)$'}

$ @kbd{expr-5.97 "X$baz" : 'X\(foo\)$'}
foo
@end example

The POSIX standard is ambiguous as to whether
@samp{expr 'a' : '\(b\)'} outputs @samp{0} or the empty string.
In practice, it outputs the empty string on most platforms, but portable
scripts should not assume this.  For instance, the QNX 4.25 native
@command{expr} returns @samp{0}.

One might think that a way to get a uniform behavior would be to use
the empty string as a default value:

@example
expr a : '\(b\)' \| ''
@end example

@noindent
Unfortunately this behaves exactly as the original expression; see the
@command{expr} (@samp{|}) entry for more information.

Some ancient @command{expr} implementations (e.g.,
Solaris 10 @command{/usr/ucb/expr}) have a silly length limit that causes
@command{expr} to fail if the matched substring is longer than 120
bytes.  In this case, you might want to fall back on @samp{printf|sed} if
@command{expr} fails.  Nowadays this is of practical importance only for
the rare installer who mistakenly puts @file{/usr/ucb} before
@file{/usr/bin} in @env{PATH} on Solaris 10.

On Mac OS X 10.4, @command{expr} mishandles the pattern @samp{[^-]} in
some cases.  For example, the command
@example
expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'
@end example

@noindent
outputs @samp{apple-darwin8.1.0} rather than the correct @samp{darwin8.1.0}.
This particular case can be worked around by substituting @samp{[^--]}
for @samp{[^-]}.

Don't leave, there is some more!

The QNX 4.25 @command{expr}, in addition of preferring @samp{0} to
the empty string, has a funny behavior in its exit status: it's always 1
when parentheses are used!

@example
$ @kbd{val=`expr 'a' : 'a'`; echo "$?: $val"}
0: 1
$ @kbd{val=`expr 'a' : 'b'`; echo "$?: $val"}
1: 0

$ @kbd{val=`expr 'a' : '\(a\)'`; echo "?: $val"}
1: a
$ @kbd{val=`expr 'a' : '\(b\)'`; echo "?: $val"}
1: 0
@end example

@noindent
In practice this can be a big problem if you are ready to catch failures
of @command{expr} programs with some other method (such as using
@command{sed}), since you may get twice the result.  For instance

@example
$ @kbd{expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'}
@end example

@noindent
outputs @samp{a} on most hosts, but @samp{aa} on QNX 4.25.  A
simple workaround consists of testing @command{expr} and using a variable
set to @command{expr} or to @command{false} according to the result.

On HP-UX 11, @command{expr} supports only a single
sub-expression.

@example
$ @kbd{expr 'Xfoo' : 'X\(f\(oo\)*\)$'}
expr: More than one '\(' was used.
@end example


@item @command{fgrep}
@c ------------------
@prindex @command{fgrep}
Although POSIX stopped requiring @command{fgrep} in 2001,
a few traditional hosts (notably Solaris 10) do not support the POSIX
replacement @code{grep -F}.  Also, some traditional implementations do
not work on long input lines.  To work around these problems, invoke
@code{AC_PROG_FGREP} and then use @code{$FGREP}.


@item @command{find}
@c -----------------
@prindex @command{find}
Many operands of GNU @command{find} are not standardized by POSIX and
are missing on many platforms. These nonportable operands include
@option{-follow}, @option{-maxdepth}, @option{-mindepth},
@option{-printf}, and @option{,}.  See the
@uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/find.html,
POSIX spec for @command{find}} for @command{find} operands that
should be portable nowadays.

The replacement of @samp{@{@}} is guaranteed only if the argument is
exactly @samp{@{@}}, not if @samp{@{@}} only a part of a larger argument.
For instance, on AIX 7.3:

@example
$ @kbd{touch foo}
$ @kbd{find . -name foo -exec echo '@{@}-@{@}' \;}
@{@}-@{@}
@end example

@noindent
while GNU @command{find} reports @samp{./foo-./foo}.
POSIX allows either behavior.

AIX 7.3 @samp{find ... -exec @var{command} +} incorrectly fails if
@var{command} is not executed.  For example, @samp{find . -name '*.tmp'
-exec rm @{@} +} incorrectly outputs a diagnostic and fails if no file
names end in @samp{.tmp}.  To work around this problem you can use a
circumlocution like @samp{find . -name '*.tmp' -exec rm -f @{@} + -o
-exec true ';'}.

@anchor{grep}
@item @command{grep}
@c -----------------
@prindex @command{grep}
Portable scripts can rely on the @command{grep} options @option{-c},
@option{-l}, @option{-n}, and @option{-v}, but should avoid other
options.  For example, don't use @option{-w}, as POSIX does not require it.
Also, portable scripts should not combine @option{-c} with @option{-l},
as POSIX does not allow this.

Some of the options required by POSIX are not portable in practice.
Don't use @samp{grep -q} to suppress output, because traditional @command{grep}
implementations (e.g., Solaris 10) do not support @option{-q}.
Don't use @samp{grep -s} to suppress output either, because POSIX
says @option{-s} does not suppress output, only some error messages;
also, the @option{-s} option of traditional @command{grep} behaved
like @option{-q} does in most modern implementations.  Instead,
redirect the standard output and standard error (in case the file
doesn't exist) of @code{grep} to @file{/dev/null}.  Check the exit
status of @code{grep} to determine whether it found a match.

The QNX4 implementation fails to count lines with @code{grep -c '$'},
but works with @code{grep -c '^'}.  Other alternatives for counting
lines are to use @code{sed -n '$='} or @code{wc -l}.

Some traditional @command{grep} implementations do not work on long
input lines.  On AIX the default @code{grep} silently truncates long
lines on the input before matching.

Also, Solaris 10 @command{grep} does not support @option{-e}.
To work around this, invoke @code{AC_PROG_GREP} and then use @code{$GREP}.

Another possible workaround for the multiple @option{-e} problem is to
separate the patterns by newlines, for example:

@example
grep 'foo
bar' in.txt
@end example

@noindent
except that this fails with traditional @command{grep}
implementations and with OpenBSD 3.8 @command{grep}.

Traditional @command{grep} implementations (e.g., Solaris 10) do not
support the @option{-E} or @option{-F} options.  To work around these
problems, invoke @code{AC_PROG_EGREP} and then use @code{$EGREP}, and
similarly for @code{AC_PROG_FGREP} and @code{$FGREP}.  Even if you are
willing to require support for POSIX @command{grep}, your script should
not use both @option{-E} and @option{-F}, since POSIX does not allow
this combination.

Portable @command{grep} regular expressions should use @samp{\} only to
escape characters in the string @samp{$()*.123456789[\^@{@}}.  For example,
alternation, @samp{\|}, is common but POSIX does not require its
support in basic regular expressions, so it should be avoided in
portable scripts.  Solaris and HP-UX @command{grep} do not support it.
Similarly, the following escape sequences should also be avoided:
@samp{\<}, @samp{\>}, @samp{\+}, @samp{\?}, @samp{\`}, @samp{\'},
@samp{\B}, @samp{\b}, @samp{\S}, @samp{\s}, @samp{\W}, and @samp{\w}.
For more information about what can appear in portable regular expressions,
@pxref{Problematic Expressions,,, grep, GNU Grep}.

POSIX does not specify the behavior of @command{grep} on binary files.
An example where this matters is using BSD @command{grep} to
search text that includes embedded ANSI escape sequences for
colored output to terminals (@samp{\033[m} is the sequence to restore
normal output); the behavior depends on whether input is seekable:

@example
$ @kbd{printf 'esc\033[mape\n' > sample}
$ @kbd{grep . sample}
Binary file sample matches
$ @kbd{cat sample | grep .}
escape
@end example


@item @command{join}
@c -----------------
@prindex @command{join}
On NetBSD, @command{join -a 1 file1 file2} mistakenly behaves like
@command{join -a 1 -a 2 1 file1 file2}, resulting in a usage warning;
the workaround is to use @command{join -a1 file1 file2} instead.

On some circa-2020 BSD-based systems @command{join} mishandles inputs
with missing fields.  For example, an empty line is not treated as
containing an empty join field.  As a workaround, input lines should
always have a join field.

On platforms with the BusyBox tools, the @command{join} command is
entirely missing.  As a workaround, you can simulate special cases of the
@command{join} command using an @command{awk} script.  For an example,
see @url{https://lists.gnu.org/r/bug-gnulib/2021-04/msg00054.html}.


@item @command{ln}
@c ---------------
@prindex @command{ln}
The @option{-f} option is portable nowadays.

@cindex Symbolic links
Symbolic links are not available on some systems; use @samp{$(LN_S)} as
a portable substitute.

For versions of the DJGPP before 2.04,
@command{ln} emulates symbolic links
to executables by generating a stub that in turn calls the real
program.  This feature also works with nonexistent files like in the
POSIX spec.  So @samp{ln -s file link} generates @file{link.exe},
which attempts to call @file{file.exe} if run.  But this feature only
works for executables, so @samp{cp -p} is used instead for these
systems.  DJGPP versions 2.04 and later have full support
for symbolic links.


@item @command{ls}
@c ---------------
@prindex @command{ls}
@cindex Listing directories
The portable options are @option{-acdilrtu}.  Current practice is for
@option{-l} to output both owner and group, even though ancient versions
of @command{ls} omitted the group.

On ancient hosts, @samp{ls foo} sent the diagnostic @samp{foo not found}
to standard output if @file{foo} did not exist.  Hence a shell command
like @samp{sources=`ls *.c 2>/dev/null`} did not always work, since it
was equivalent to @samp{sources='*.c not found'} in the absence of
@samp{.c} files.  This is no longer a practical problem, since current
@command{ls} implementations send diagnostics to standard error.

The behavior of @command{ls} on a directory that is being concurrently
modified is not always predictable, because of a data race where cached
information returned by @code{readdir} does not match the current
directory state.  In fact, Mac OS X 10.5 had an intermittent bug where
@code{readdir}, and thus @command{ls}, sometimes lists a file more than
once if other files were added or removed from the directory immediately
prior to the @command{ls} call.  Since @command{ls} already sorts its
output, the duplicate entries can be avoided by piping the results
through @code{uniq}.

@anchor{mkdir}
@item @command{mkdir}
@c ------------------
@prindex @command{mkdir}
@cindex Making directories
Combining the @option{-m} and @option{-p} options, as in @samp{mkdir -m
go-w -p @var{dir}}, often leads to trouble.  FreeBSD
@command{mkdir} incorrectly attempts to change the permissions of
@var{dir} even if it already exists.  HP-UX 11.23
@command{mkdir} often assigns the wrong permissions to
any newly-created parents of @var{dir}.

POSIX does not clearly specify whether @samp{mkdir -p foo}
should succeed when @file{foo} is a symbolic link to an already-existing
directory.  The GNU @command{mkdir}
succeeds, but Solaris 10 @command{mkdir} fails.

Traditional @code{mkdir -p} implementations suffer from race conditions.
For example, if you invoke @code{mkdir -p a/b} and @code{mkdir -p a/c}
at the same time, both processes might detect that @file{a} is missing,
one might create @file{a}, then the other might try to create @file{a}
and fail with a @code{File exists} diagnostic.  Solaris 10 @command{mkdir}
is vulnerable, and other traditional Unix systems are
probably vulnerable too.  This possible race is harmful in parallel
builds when several Make rules call @code{mkdir -p} to
construct directories.  You may use
@code{install-sh -d} as a safe replacement, for example by setting
@samp{MKDIR_P='/path/to/install-sh -d'} in the environment of
@command{configure}, assuming the package distributes @file{install-sh}.

@item @command{mkfifo}
@itemx @command{mknod}
@c -------------------
@prindex @command{mkfifo}
@prindex @command{mknod}
The GNU Coding Standards state that @command{mknod} is safe to use on
platforms where it has been tested to exist; but it is generally portable
only for creating named FIFOs, since device numbers are
platform-specific.  Autotest uses @command{mkfifo} to implement parallel
testsuites.  POSIX states that behavior is unspecified when opening a
named FIFO for both reading and writing; on at least Cygwin, this
results in failure on any attempt to read or write to that file
descriptor.

@item @command{mktemp}
@c -------------------
@prindex @command{mktemp}
@cindex Creating temporary files
Shell scripts can use temporary files safely with @command{mktemp}, but
it does not exist on all systems.  A portable way to create a safe
temporary file name is to create a temporary directory with mode 700 and
use a file inside this directory.  Both methods prevent attackers from
gaining control, though @command{mktemp} is far less likely to fail
gratuitously under attack.

Here is sample code to create a new temporary directory @samp{$dir} safely:

@example
# Create a temporary directory $dir in $TMPDIR (default /tmp).
# Use mktemp if possible; otherwise fall back on mkdir,
# with $RANDOM to make collisions less likely.
: "$@{TMPDIR:=/tmp@}"
@{
  dir=`
    (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
  ` &&
  test -d "$dir"
@} || @{
  dir=$TMPDIR/foo$$-$RANDOM
@c $$ restore font-lock
  (umask 077 && mkdir "$dir")
@} || exit $?
@end example


@item @command{mv}
@c ---------------
@prindex @command{mv}
@cindex Moving open files
The only portable options are @option{-f} and @option{-i}.

Moving individual files between file systems is portable (it was in Unix
version 6),
but it is not always atomic: when doing @samp{mv new existing}, there's
a critical section where neither the old nor the new version of
@file{existing} actually exists.

On some systems moving files from @file{/tmp} can sometimes cause
undesirable (but perfectly valid) warnings, even if you created these
files.  This is because @file{/tmp} belongs to a group that ordinary
users are not members of, and files created in @file{/tmp} inherit
the group of @file{/tmp}.  When the file is copied, @command{mv} issues
a diagnostic without failing:

@smallexample
$ @kbd{touch /tmp/foo}
$ @kbd{mv /tmp/foo .}
@error{}mv: ./foo: set owner/group (was: 100/0): Operation not permitted
$ @kbd{echo $?}
0
$ @kbd{ls foo}
foo
@end smallexample

@noindent
This annoying behavior conforms to POSIX, unfortunately.

Moving directories across mount points is not portable, use @command{cp}
and @command{rm}.

DOS variants cannot rename or remove open files, and do not
support commands like @samp{mv foo bar >foo}, even though this is
perfectly portable among POSIX hosts.


@item @command{od}
@c ---------------
@prindex @command{od}

In Mac OS X versions prior to 10.4.3, @command{od} does not support the
standard POSIX options @option{-A}, @option{-j}, @option{-N}, or
@option{-t}, or the XSI option, @option{-s}.  The only
supported POSIX option is @option{-v}, and the only supported
XSI options are those in @option{-bcdox}.  The BSD
@command{hexdump} program can be used instead.

In some versions of some operating systems derived from Solaris 11,
@command{od} prints decimal byte values padded with zeros rather than
with spaces:

@smallexample
$ @kbd{printf '#!' | od -A n -t d1 -N 2}
         035 033
@end smallexample

@noindent
instead of

@smallexample
$ @kbd{printf '#!' | od -A n -t d1 -N 2}
          35  33
@end smallexample

We have observed this on both OpenIndiana and OmniOS;
Illumos may also be affected.
As a workaround, you can use octal output (option @code{-t o1}).


@item @command{rm}
@c ---------------
@prindex @command{rm}
The @option{-f} and @option{-r} options are portable.

It is not portable to invoke @command{rm} without options or operands.
On the other hand, POSIX now requires @command{rm -f} to silently
succeed when there are no operands (useful for constructs like
@command{rm -rf $filelist} without first checking if @samp{$filelist}
was empty).  But this was not always portable; at least NetBSD
@command{rm} built before 2008 would fail with a diagnostic.

A file might not be removed even if its parent directory is writable
and searchable.  Many POSIX hosts cannot remove a mount point, a named
stream, a working directory, or a last link to a file that is being
executed.

DOS variants cannot rename or remove open files, and do not
support commands like @samp{rm foo >foo}, even though this is
perfectly portable among POSIX hosts.

@item @command{rmdir}
@c ------------------
@prindex @command{rmdir}
Just as with @command{rm}, some platforms refuse to remove a working
directory.

@anchor{sed}
@item @command{sed}
@c ----------------
@prindex @command{sed}
Patterns should not include the separator (unless escaped), even as part
of a character class.  In conformance with POSIX, the Cray
@command{sed} rejects @samp{s/[^/]*$//}: use @samp{s%[^/]*$%%}.
Even when escaped, patterns should not include separators that are also
used as @command{sed} metacharacters.  For example, GNU sed 4.0.9 rejects
@samp{s,x\@{1\,\@},,}, while sed 4.1 strips the backslash before the comma
before evaluating the basic regular expression.

Avoid empty patterns within parentheses (i.e., @samp{\(\)}).  POSIX does
not require support for empty patterns, and Unicos 9 @command{sed} rejects
them.

Unicos 9 @command{sed} loops endlessly on patterns like @samp{.*\n.*}.

Sed scripts should not use branch labels longer than 7 characters and
should not contain comments; AIX 5.3 @command{sed} rejects indented comments.
HP-UX sed has a limit of 99 commands (not counting @samp{:} commands) and
48 labels, which cannot be circumvented by using more than one script
file.  It can execute up to 19 reads with the @samp{r} command per cycle.
Solaris @command{/usr/ucb/sed} rejects usages that exceed a limit of
about 6000 bytes for the internal representation of commands.

Avoid redundant @samp{;}, as some @command{sed} implementations, such as
NetBSD 1.4.2's, incorrectly try to interpret the second
@samp{;} as a command:

@example
$ @kbd{echo a | sed 's/x/x/;;s/x/x/'}
sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
@end example

Some @command{sed} implementations have a buffer limited to 4000 bytes,
and this limits the size of input lines, output lines, and internal
buffers that can be processed portably.  Likewise,
not all @command{sed} implementations can handle embedded @code{NUL} or
a missing trailing newline.

Remember that ranges within a bracket expression of a regular expression
are only well-defined in the @samp{C} (or @samp{POSIX}) locale.
Meanwhile, support for character classes like @samp{[[:upper:]]} is not
yet universal, so if you cannot guarantee the setting of @env{LC_ALL},
it is better to spell out a range @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]}
than to rely on @samp{[A-Z]}.

Additionally, POSIX states that regular expressions are only
well-defined on characters.  Unfortunately, there exist platforms such
as Mac OS X 10.5 where not all 8-bit byte values are valid characters,
even though that platform has a single-byte @samp{C} locale.  And POSIX
allows the existence of a multi-byte @samp{C} locale, although that does
not yet appear to be a common implementation.  At any rate, it means
that not all bytes will be matched by the regular expression @samp{.}:

@example
$ @kbd{printf '\200\n' | LC_ALL=C sed -n /./p | wc -l}
0
$ @kbd{printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l}
1
@end example

Portable @command{sed} regular expressions should use @samp{\} only to escape
characters in the string @samp{$()*.123456789[\^n@{@}}.  For example,
alternation, @samp{\|}, is common but POSIX does not require its
support, so it should be avoided in portable scripts.  Solaris
@command{sed} does not support alternation; e.g., @samp{sed '/a\|b/d'}
deletes only lines that contain the literal string @samp{a|b}.
Similarly, @samp{\+} and @samp{\?} should be avoided.

Anchors (@samp{^} and @samp{$}) inside groups are not portable.

Nested parentheses in patterns (e.g., @samp{\(\(a*\)b*)\)}) are
quite portable to current hosts, but was not supported by some ancient
@command{sed} implementations like SVR3.

Some @command{sed} implementations, e.g., Solaris, restrict the special
role of the asterisk @samp{*} to one-character regular expressions and
back-references, and the special role of interval expressions
@samp{\@{@var{m}\@}}, @samp{\@{@var{m},\@}}, or @samp{\@{@var{m},@var{n}\@}}
to one-character regular expressions.  This may lead to unexpected behavior:

@example
$ @kbd{echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'}
x2x4
$ @kbd{echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'}
x
@end example

The @option{-e} option is mostly portable.
However, its argument cannot be empty, as this fails on AIX 7.3.
Some people prefer to use @samp{-e}:

@example
sed -e '@var{command-1}' \
    -e '@var{command-2}'
@end example

@noindent
as opposed to the equivalent:

@example
sed '
  @var{command-1}
  @var{command-2}
'
@end example

@noindent
The following usage is sometimes equivalent:

@example
sed '@var{command-1};@var{command-2}'
@end example

but POSIX says that this use of a semicolon has undefined effect if
@var{command-1}'s verb is @samp{@{}, @samp{a}, @samp{b}, @samp{c},
@samp{i}, @samp{r}, @samp{t}, @samp{w}, @samp{:}, or @samp{#}, so you
should use semicolon only with simple scripts that do not use these
verbs.

POSIX up to the 2008 revision requires the argument of the @option{-e}
option to be a syntactically complete script.  GNU @command{sed} allows
to pass multiple script fragments, each as argument of a separate
@option{-e} option, that are then combined, with newlines between the
fragments, and a future POSIX revision may allow this as well.  This
approach is not portable with script fragments ending in backslash; for
example, the @command{sed} programs on Solaris 10, HP-UX 11, and AIX
don't allow splitting in this case:

@example
$ @kbd{echo a | sed -n -e 'i\}
@kbd{0'}
0
$ @kbd{echo a | sed -n -e 'i\' -e 0}
Unrecognized command: 0
@end example

@noindent
In practice, however, this technique of joining fragments
through @option{-e} works for multiple @command{sed} functions within
@samp{@{} and @samp{@}}, even if that is not specified by POSIX:

@example
@c The quote around the closing brace silences interactive zsh.
$ @kbd{echo a | sed -n -e '/a/@{' -e s/a/b/ -e p -e '@}'}
b
@end example

Commands inside @{ @} brackets are further restricted.  POSIX 2008 says that
they cannot be preceded by addresses, @samp{!}, or @samp{;}, and that
each command must be followed immediately by a newline, without any
intervening blanks or semicolons.  The closing bracket must be alone on
a line, other than white space preceding or following it.  However, a
future version of POSIX may standardize the use of addresses within brackets.

Contrary to yet another urban legend, you may portably use @samp{&} in
the replacement part of the @code{s} command to mean ``what was
matched''.  All descendants of Unix version 7 @command{sed}
(at least; we
don't have first hand experience with older @command{sed} implementations) have
supported it.

POSIX requires that you must not have any white space between
@samp{!} and the following command.  It is OK to have blanks between
the address and the @samp{!}.  For instance, on Solaris:

@example
$ @kbd{echo "foo" | sed -n '/bar/ ! p'}
@error{}Unrecognized command: /bar/ ! p
$ @kbd{echo "foo" | sed -n '/bar/! p'}
@error{}Unrecognized command: /bar/! p
$ @kbd{echo "foo" | sed -n '/bar/ !p'}
foo
@end example

POSIX also says that you should not combine @samp{!} and @samp{;}.  If
you use @samp{!}, it is best to put it on a command that is delimited by
newlines rather than @samp{;}.

Also note that POSIX requires that the @samp{b}, @samp{t}, @samp{r}, and
@samp{w} commands be followed by exactly one space before their argument.
On the other hand, no white space is allowed between @samp{:} and the
subsequent label name.

If a sed script is specified on the command line and ends in an
@samp{a}, @samp{c}, or @samp{i} command, the last line of inserted text
should be followed by a newline.  Otherwise some @command{sed}
implementations (e.g., OpenBSD 3.9) do not append a newline to the
inserted text.

Many @command{sed} implementations (e.g., Mac OS X 10.4,
OpenBSD 3.9, Solaris 10
@command{/usr/ucb/sed}) strip leading white space from the text of
@samp{a}, @samp{c}, and @samp{i} commands.  Prepend a backslash to
work around this incompatibility with POSIX:

@example
$ @kbd{echo flushleft | sed 'a\}
> @kbd{   indented}
> @kbd{'}
flushleft
indented
$ @kbd{echo foo | sed 'a\}
> @kbd{\   indented}
> @kbd{'}
flushleft
   indented
@end example

POSIX requires that with an empty regular expression, the last non-empty
regular expression from either an address specification or substitution
command is applied.  However, busybox 1.6.1 complains when using a
substitution command with a replacement containing a back-reference to
an empty regular expression; the workaround is repeating the regular
expression.

@example
$ @kbd{echo abc | busybox sed '/a\(b\)c/ s//\1/'}
sed: No previous regexp.
$ @kbd{echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'}
b
@end example

Portable scripts should be aware of the inconsistencies and options for
handling word boundaries, as these are not specified by POSIX.

@example
                \<      \b      [[:<:]]
Solaris 10      yes     no      no
Solaris XPG4    yes     no      error
NetBSD 5.1      no      no      yes
FreeBSD 9.1     no      no      yes
GNU             yes     yes     error
busybox         yes     yes     error
@end example

@item @command{sed} (@samp{t})
@c ---------------------------
@prindex @command{sed} (@samp{t})
There are two things one should remember about @samp{t} in @command{sed}.
First, @samp{t} jumps if @emph{some} substitution
succeeded, not only the immediately preceding substitution.  Therefore,
always use a fake @samp{t clear} followed by a @samp{:clear} on the next
line, to reset the @samp{t} flag where needed.

Second, do not rely on @command{sed} to clear the flag at each new cycle.

For example, the following script replaces all instances of ``keep me''
with ``kept'', and replaces the contents of all lines that did not
contain ``keep me'' with ``deleted''.

@example
t clear
:clear
s/keep me/kept/g
t end
s/.*/deleted/g
:end
@end example

@item @command{sed} (@samp{w})
@c ---------------------------
@prindex @command{sed} (@samp{w})

When a script contains multiple commands to write lines to the same
output file, BusyBox @command{sed} mistakenly opens a separate output
stream for each command.  This can cause one of the commands to ``win''
and the others to ``lose'', in the sense that their output is discarded.
For example:

@example
sed -n -e '
  /a/w xxx
  /b/w xxx
' <<EOF
a
b
EOF
@end example

This might output only @samp{a} to @file{xxx}; the @samp{b} is lost.
To avoid the problem, a portable script should contain at most one
@samp{w} or @samp{s/.../.../w} command per output file.

@item @command{sleep}
@c ------------------
@prindex @command{sleep}
Using @command{sleep} is generally portable.  However, remember that
adding a @command{sleep} to work around timestamp issues, with a minimum
granularity of one second, doesn't scale well for parallel builds on
modern machines with sub-second process completion.

@item @command{sort}
@c -----------------
@prindex @command{sort}
Remember that sort order is influenced by the current locale.  Inside
@file{configure}, the C locale is in effect, but in Makefile snippets,
you may need to specify @code{LC_ALL=C sort}.

@item @command{tar}
@c ----------------
@prindex @command{tar}
There are multiple file formats for @command{tar}; if you use Automake,
the macro @code{AM_INIT_AUTOMAKE} has some options controlling which
level of portability to use.

@anchor{touch}
@item @command{touch}
@c ------------------
@prindex @command{touch}
@cindex timestamp resolution
If you specify the desired timestamp (e.g., with the @option{-r}
option), older @command{touch} implementations use the @code{utime} or
@code{utimes} system call, which can result in the same kind of
timestamp truncation problems that @samp{cp -p} has.

@item @command{tr}
@c ---------------
@prindex @command{tr}

Many @command{tr} implementations do not support multi-byte locales
well.  For example, Solaris 10 @command{tr} rejects character classes in
multi-byte locales.  Also, ranges have well-defined behavior only in the
@samp{C} (or @samp{POSIX}) locale, so if you cannot guarantee the
setting of @env{LC_ALL} it is better to spell out a range
@samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]} than to rely on @samp{[A-Z]}.

@cindex carriage return, deleting
@cindex newline, deleting
@cindex deleting carriage return
Not all versions of @command{tr} handle all backslash character escapes.
For example, Solaris 10 @command{/usr/ucb/tr} falls over, even though
Solaris contains more modern @command{tr} in other locations.
Using octal escapes is more portable for carriage returns, since
@samp{\015} is the same for both ASCII and EBCDIC, and since use of
literal carriage returns in scripts causes a number of other problems.
But for other characters, like newline, using octal escapes ties the
operation to ASCII, so it is better to use literal characters.

@example
$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\n' ; echo}
moo
light
$ @kbd{@{ echo moon; echo light; @} | /usr/bin/tr -d '\n' ; echo}
moonlight
$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\012' ; echo}
moonlight
$ @kbd{nl='}
@kbd{'; @{ echo moon; echo light; @} | /usr/ucb/tr -d "$nl" ; echo}
moonlight
@end example

Not all versions of @command{tr} recognize direct ranges of characters: at
least Solaris @command{/usr/bin/tr} still fails to do so.  But you can
use @command{/usr/xpg4/bin/tr} instead, or add brackets (which in POSIX
transliterate to themselves).

@example
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z}
HAZy FAntAZy
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'}
HAZY FANTAZY
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z}
HAZY FANTAZY
@end example

When providing two arguments, be sure the second string is at least as
long as the first.

@example
$ @kbd{echo abc | /usr/xpg4/bin/tr bc d}
adc
$ @kbd{echo abc | coreutils/tr bc d}
add
@end example

On platforms with the BusyBox tools, @command{tr} does not support the
@code{[@var{x}*@var{n}]} option syntax.

@example
$ @kbd{echo abc | tr 'abcd' '[A*4]'}
[A*
$ @kbd{echo abc | coreutils/tr 'abcd' '[A*4]'}
AAA
$ @kbd{echo xyz | tr 'a-z' '[A*]'}
]]]
$ @kbd{echo xyz | coreutils/tr 'a-z' '[A*]'}
AAA
@end example

POSIX requires @command{tr} to operate on binary files.  But at least
Solaris @command{/usr/ucb/tr} and @command{/usr/bin/tr} silently discard
@code{NUL} in the input prior to doing any translation.  When using
@command{tr} to process a binary file that may contain @code{NUL} bytes,
it is necessary to use @command{/usr/xpg4/bin/tr} instead, or
@command{/usr/xpg6/bin/tr} if that is available.

@example
$ @kbd{printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1}
 61 62
$ @kbd{printf 'a\0b' | /usr/bin/tr x x | od -An -tx1}
 61 62
$ @kbd{printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1}
 61 00 62
@end example

Solaris @command{/usr/ucb/tr} additionally fails to handle @samp{\0} as the
octal escape for @code{NUL}.

@example
$ @kbd{printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1}
 61 62 63
$ @kbd{printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1}
 61 00 64
$ @kbd{printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1}
 61 00 64
@end example

@end table


@node Portable Make
@chapter Portable Make Programming
@prindex @command{make}
@cindex Limitations of @command{make}

Writing portable makefiles is an art.  Since a makefile's commands are
executed by the shell, you must consider the shell portability issues
already mentioned.  However, other issues are specific to @command{make}
itself.

@menu
* $< in Ordinary Make Rules::   $< in ordinary rules
* Failure in Make Rules::       Failing portably in rules
* Command Line Prefixes::       What's at the start of makefile command lines
* Special Chars in Names::      Special characters in macro names
* Backslash-Newline-Empty::     Empty lines after backslash-newline
* Backslash-Newline Comments::  Spanning comments across line boundaries
* Macros and Submakes::         @code{make macro=value} and submakes
* The Make Macro MAKEFLAGS::    @code{$(MAKEFLAGS)} portability issues
* The Make Macro SHELL::        @code{$(SHELL)} portability issues
* Parallel Make::               Parallel @command{make} quirks
* Comments in Make Rules::      Other problems with Make comments
* Newlines in Make Rules::      Using literal newlines in rules
* Comments in Make Macros::     Other problems with Make comments in macros
* Trailing whitespace in Make Macros::  Macro substitution problems
* Command-line Macros and whitespace::  Whitespace trimming of values
* obj/ and Make::               Don't name a subdirectory @file{obj}
* make -k Status::              Exit status of @samp{make -k}
* VPATH and Make::              @code{VPATH} woes
* Single Suffix Rules::         Single suffix rules and separated dependencies
* Timestamps and Make::         Sub-second timestamp resolution
@end menu

@node $< in Ordinary Make Rules
@section @code{$<} in Ordinary Make Rules

POSIX says that the @samp{$<} construct in makefiles can be
used only in inference rules and in the @samp{.DEFAULT} rule; its
meaning in ordinary rules is unspecified.  Solaris @command{make}
for instance replaces it with the empty string.  OpenBSD (3.0 and
later) @command{make} diagnoses these uses and errors out.

@node Failure in Make Rules
@section Failure in Make Rules

Unless errors are being ignored
(e.g., because a makefile command line is preceded by a @samp{-} prefix),
POSIX 2008 requires that @command{make} must invoke each command with
the equivalent of a @samp{sh -e -c} subshell, which causes the
subshell to exit immediately if a subsidiary simple-command fails,
with some complicated exceptions.
Historically not all @command{make} implementations
followed this rule.  For
example, the command @samp{touch T; rm -f U} may attempt to
remove @file{U} even if the @command{touch} fails, although this is not
permitted with POSIX make.  One way to work around failures in simple
commands is to reword them so that they always succeed, e.g., @samp{touch
T || :; rm -f U}.
However, even this approach can run into common bugs in BSD
implementations of the @option{-e} option of @command{sh} and
@command{set} (@pxref{set, , Limitations of Shell Builtins}), so if you
are worried
about porting to buggy BSD shells it may be simpler to migrate
complicated @command{make} actions into separate scripts.

@node Command Line Prefixes
@section Makefile Command Line Prefixes

Makefile command lines can be preceded by zero or more of
the command line prefixes @samp{-}, @samp{@@}, and @samp{+},
which modify how @command{make} processes the command.
Although POSIX says these are the only command line prefixes,
some @command{make} implementations, such as Solaris @command{make},
support the additional prefixes @samp{!} and @samp{?}.
Portable makefiles should therefore avoid using these two characters at
the start of a makefile command line.
For example:

@example
mishandled-by-Solaris-make:; ! grep FIXME foo.c
portable-to-Solaris-make:; :;! grep FIXME foo.c
@end example

@node Special Chars in Names
@section Special Characters in Make Macro Names

POSIX limits macro names to nonempty strings containing only
ASCII letters and digits, @samp{.}, and @samp{_}.  Many
@command{make} implementations allow a wider variety of characters, but
portable makefiles should avoid them.  It is portable to start a name
with a special character, e.g., @samp{$(.FOO)}.

Some ancient @command{make} implementations don't support leading
underscores in macro names.  An example is NEWS-OS 4.2R.

@example
$ @kbd{cat Makefile}
_am_include = #
_am_quote =
all:; @@echo this is test
$ @kbd{make}
Make: Must be a separator on rules line 2.  Stop.
$ @kbd{cat Makefile2}
am_include = #
am_quote =
all:; @@echo this is test
$ @kbd{make -f Makefile2}
this is test
@end example

@noindent
However, this problem is no longer of practical concern.

@node Backslash-Newline-Empty
@section Backslash-Newline Before Empty Lines

@c  This has been seen on ia64 hpux 11.20, and on one hppa hpux 10.20,
@c  but another hppa hpux 10.20 didn't have it.  Bob Proulx
@c  <bob@proulx.com> thinks it was in hpux 8.0 too.
On some versions of HP-UX, @command{make} reads multiple newlines
following a backslash, continuing to the next non-empty line.  For
example,

@example
FOO = one \

BAR = two

test:
        : FOO is "$(FOO)"
        : BAR is "$(BAR)"
@end example

@noindent
shows @code{FOO} equal to @code{one BAR = two}.  Other implementations
sensibly let a backslash continue only to the immediately following
line.

@node Backslash-Newline Comments
@section Backslash-Newline in Make Comments

According to POSIX, Make comments start with @code{#}
and continue until an unescaped newline is reached.

@example
$ @kbd{cat Makefile}
# A = foo \
      bar \
      baz

all:
        @@echo ok
$ @kbd{make}   # GNU make
ok
@end example

@noindent
However this is not always the case.  Some implementations
discard everything from @code{#} through the end of the line, ignoring any
trailing backslash.

@example
$ @kbd{pmake}  # BSD make
"Makefile", line 3: Need an operator
Fatal errors encountered -- cannot continue
@end example

@noindent
Therefore, if you want to comment out a multi-line definition, prefix each
line with @code{#}, not only the first.

@example
# A = foo \
#     bar \
#     baz
@end example

@node Macros and Submakes
@section @code{make macro=value} and Submakes

A command-line variable definition such as @code{foo=bar} overrides any
definition of @code{foo} in a makefile.  Some @command{make}
implementations (such as GNU @command{make}) propagate this
override to subsidiary invocations of @command{make}.  Some other
implementations do not pass the substitution along to submakes.

@example
$ @kbd{cat Makefile}
foo = foo
one:
        @@printf '%s\n' $(foo)
        $(MAKE) two
two:
        @@printf '%s\n' $(foo)
$ @kbd{make foo=bar}            # GNU make 3.79.1
bar
make two
make[1]: Entering directory `/home/adl'
bar
make[1]: Leaving directory `/home/adl'
$ @kbd{pmake foo=bar}           # BSD make
bar
pmake two
foo
@end example

You have a few possibilities if you do want the @code{foo=bar} override
to propagate to submakes.  One is to use the @option{-e}
option, which causes all environment variables to have precedence over
the makefile macro definitions, and declare foo as an environment
variable:

@example
$ @kbd{env foo=bar make -e}
@end example

The @option{-e} option is propagated to submakes automatically,
and since the environment is inherited between @command{make}
invocations, the @code{foo} macro is overridden in
submakes as expected.

This syntax (@code{foo=bar make -e}) is portable only when used
outside of a makefile, for instance from a script or from the
command line.  When run inside a @command{make} rule, GNU
@command{make} 3.80 and prior versions forget to propagate the
@option{-e} option to submakes.

Moreover, using @option{-e} could have unexpected side effects if your
environment contains some other macros usually defined by the
makefile.  (See also the note about @code{make -e} and @code{SHELL}
below.)

If you can foresee all macros that a user might want to override, then
you can propagate them to submakes manually, from your makefile:

@example
foo = foo
one:
        @@printf '%s\n' $(foo)
        $(MAKE) foo=$(foo) two
two:
        @@printf '%s\n' $(foo)
@end example

Another way to propagate a variable to submakes in a portable way is to
expand an extra variable in every invocation of @samp{$(MAKE)} within
your makefile:

@example
foo = foo
one:
        @@printf '%s\n' $(foo)
        $(MAKE) $(SUBMAKEFLAGS) two
two:
        @@printf '%s\n' $(foo)
@end example

Users must be aware that this technique is in use to take advantage of
it, e.g.@: with @code{make foo=bar SUBMAKEFLAGS='foo=bar'}, but it
allows any macro to be overridden.  Makefiles generated by
@command{automake} use this technique, expanding @code{$(AM_MAKEFLAGS)}
on the command lines of submakes (@pxref{Subdirectories, , Automake,
automake, GNU Automake}).

@node The Make Macro MAKEFLAGS
@section The Make Macro MAKEFLAGS
@cindex @code{MAKEFLAGS} and @command{make}
@cindex @command{make} and @code{MAKEFLAGS}

POSIX requires @command{make} to use @code{MAKEFLAGS} to affect the
current and recursive invocations of make, but allows implementations
several formats for the variable.  It is tricky to parse
@code{$MAKEFLAGS} to determine whether @option{-s} for silent execution
or @option{-k} for continued execution are in effect.  For example, you
cannot assume that the first space-separated word in @code{$MAKEFLAGS}
contains single-letter options, since in the Cygwin version of
GNU @command{make} it is either @option{--unix} or
@option{--win32} with the second word containing single-letter options.

@example
$ @kbd{cat Makefile}
all:
        @@printf 'MAKEFLAGS = %s\n' '$(MAKEFLAGS)'
$ @kbd{make}
MAKEFLAGS = --unix
$ @kbd{make -k}
MAKEFLAGS = --unix -k
@end example

@node The Make Macro SHELL
@section The Make Macro @code{SHELL}
@cindex @code{SHELL} and @command{make}
@cindex @command{make} and @code{SHELL}

Many @command{make} implementations use the the @code{$(SHELL)}
macro to spawn shell processes and execute Make rules.  This
is a builtin macro with a default value upplied by @command{make};
the default can be overridden by a makefile or by a command-line argument,
though not by the environment.

Other @command{make} implementations use other ways to spawn shell
processes, and the POSIX standard for @command{make} says that portable
makefiles should neither define nor use the @code{$(SHELL)} macro.

Despite this prohibition, in practice it does not hurt to define and
then possibly use @code{SHELL} in your makefiles and in some cases it
can help your builds use a better shell to spawn shell processes.
So it's a good idea to define @code{SHELL} in
your makefiles.  If you use Autoconf, you can use
its standard output variable @code{SHELL} as follows:

@example
SHELL = @@SHELL@@
@end example

@noindent
If you use Automake, this is done for you.

Do not force @code{SHELL = /bin/sh} because that is not correct
everywhere.  Remember, @file{/bin/sh} is not POSIX compliant on some
systems, such as Solaris 10.
Additionally, DJGPP lacks @code{/bin/sh}, and when its
GNU @command{make} port sees such a setting it enters a
special emulation mode where features like pipes and redirections are
emulated on top of DOS's @command{command.com}.  Unfortunately this
emulation is incomplete; for instance it does not handle command
substitutions.  Using @code{@@SHELL@@} means that your makefile will
benefit from the same improved shell, such as @command{bash} or
@command{ksh}, that was discovered during @command{configure}, so that
you aren't fighting two different sets of shell bugs between the two
contexts.

Do not rely on whether @command{make}'s @code{SHELL} settings are
exported to subprocesses, as implementations differ:

@example
$ @kbd{cat Makefile}
all:
        @@printf '%s\n' '$(SHELL)'
        @@printenv SHELL
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh}  # BSD make, AIX make
/bin/ksh
/bin/ksh
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh}  # GNU make
/bin/ksh
sh
@end example

@node Parallel Make
@section Parallel Make
@cindex Parallel @command{make}

Support for parallel execution in @command{make} implementation varies.
Generally, using GNU make is your best bet.

When NetBSD or FreeBSD @command{make} are run in parallel mode, they will
reuse the same shell for multiple commands within one recipe.  This can
have various unexpected consequences.  For example, changes of directories
or variables persist between recipes, so that:

@example
all:
        @@var=value; cd /; pwd; echo $$var; echo $$$$
        @@pwd; echo $$var; echo $$$$
@end example

@noindent
may output the following with @code{make -j1}, at least on NetBSD up to
5.1 and FreeBSD up to 8.2:

@example
/
value
32235
/
value
32235
@end example

@noindent
while without @option{-j1}, or with @option{-B}, the output looks less
surprising:

@example
/
value
32238
/tmp

32239
@end example

@noindent
Another consequence is that, if one command in a recipe uses @code{exit 0}
to indicate a successful exit, the shell will be gone and the remaining
commands of this recipe will not be executed.

The BSD @command{make} implementations, when run in parallel mode,
will also pass the @command{Makefile} recipes to the shell through
its standard input, thus making it unusable from the recipes:

@example
$ @kbd{cat Makefile}
read:
        @@read line; echo LINE: $$line
@c $$ @c restore font-lock
$ @kbd{echo foo | make read}
LINE: foo
$ @kbd{echo foo | make -j1 read} # NetBSD 5.1 and FreeBSD 8.2
LINE:
@end example

@noindent
Moreover, when FreeBSD @command{make} (up at least to 8.2) is run in
parallel mode, it implements the @code{@@} and @code{-} ``recipe
modifiers'' by dynamically modifying the active shell flags.  This
behavior has the effects of potentially clobbering the exit status
of recipes silenced with the @code{@@} modifier if they also unset
the @option{errexit} shell flag, and of mangling the output in
unexpected ways:

@example
$ @kbd{cat Makefile}
a:
        @@echo $$-; set +e; false
b:
        -echo $$-; false; echo set -
$ @kbd{make a; echo status: $?}
ehBc
*** Error code 1
status: 1
$ @kbd{make -j1 a; echo status: $?}
ehB
status: 0
$ @kbd{make b}
echo $-; echo set -
hBc
set -
$ @kbd{make -j1 b}
echo $-; echo hvB
@end example

@noindent
You can avoid all these issues by using the @option{-B} option to enable
compatibility semantics.  However, that will effectively also disable
all parallelism as that will cause prerequisites to be updated in the
order they are listed in a rule.

Some make implementations (among them, FreeBSD @command{make}, NetBSD
@command{make}, and Solaris @command{dmake}), when invoked with a
@option{-j@var{N}} option, connect the standard output and standard
error of all their child processes to pipes or temporary regular
files.  This can lead to subtly different semantics in the behavior
of the spawned processes.  For example, even if the @command{make}
standard output is connected to a tty, the recipe command will not be:

@example
$ @kbd{cat Makefile}
all:
        @@test -t 1 && echo "Is a tty" || echo "Is not a tty"
$ @kbd{make -j 2} # FreeBSD 8.2 make
Is not a tty
$ @kbd{make -j 2} # NetBSD 5.1 make
--- all ---
Is not a tty
$ @kbd{dmake -j 2} # Solaris 10 dmake
@var{hostname} --> 1 job
@var{hostname} --> Job output
Is not a tty
@end example

@noindent
On the other hand:

@example
$ @kbd{make -j 2} # GNU make, Heirloom make
Is a tty
@end example

@noindent
The above examples also show additional status output produced in parallel
mode for targets being updated by Solaris @command{dmake} and NetBSD
@command{make} (but @emph{not} by FreeBSD @command{make}).

Furthermore, parallel runs of those @command{make} implementations will
route standard error from commands that they spawn into their own
standard output, and may remove leading whitespace from output lines.


@node Comments in Make Rules
@section Comments in Make Rules
@cindex Comments in @file{Makefile} rules
@cindex @file{Makefile} rules and comments

Do not try to put comments (lines beginning with @samp{#}) in a rule, as
they end the rule.  It is OK for a rule line to start with a tab
followed by @samp{#}, as a comment passed to a shell that does nothing.

To use the @samp{#} character in a command, put it in a rule not a
macro, as the character cannot portably appear in macros
(@pxref{Comments in Make Macros}).  So for example, assuming the output
variable @code{COMMENT_CHAR} stands for @samp{#}, the following replaces
@samp{@@COMMENT_CHAR@@} by @samp{#} in a generated header:

@example
foo.h: foo.h.in
        sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \
          '$(srcdir)/foo.h.in' > $@@
@end example

The funny shell quoting avoids a substitution at @command{config.status}
run time of the left-hand side of the @command{sed} @samp{s} command.

@node Newlines in Make Rules
@section Newlines in Make Rules
@cindex Newlines in @file{Makefile} rules
@cindex @file{Makefile} rules and newlines

In shell scripts, newlines can be used inside string literals.  But in
the shell statements of @file{Makefile} rules, this is not possible:
a newline not preceded by a backslash separates commands, whereas a
newline preceded by a backslash becomes part of the shell statement.
So, how can a newline be used in a string literal?

The trick is to set up a shell variable @code{nl} that contains a newline.
For example, the following uses a multi-line @samp{sed} expression that
appends an empty line after every line of a file:

@example
output: input
        eval "$$(printf 'nl="\n"\n')"; \
        sed "a\\$$nl" input >$@@
@end example

@node Comments in Make Macros
@section Comments in Make Macros
@cindex Comments in @file{Makefile} macros
@cindex @file{Makefile} macros and comments

In macro definitions, text from @samp{#} until line end is ignored,
which has the unfortunate effect of disallowing @samp{#} even in quotes.
Thus, the following does not work:

@example
CPPFLAGS = "-DCOMMENT_CHAR='#'"
@end example

@noindent
as @samp{CPPFLAGS} is expanded to @samp{"-DCOMMENT_CHAR='}.

GNU @command{make}, when not in POSIX mode, lets you put
@samp{#} into a macro value by escaping it with a backslash, i.e.,
@samp{\#}.  However, this usage is not portable.
@xref{Comments in Make Rules}, for a portable alternative.

Even without quoting involved, comments can have surprising effects,
because the whitespace before them is part of the variable value:

@example
foo = bar # trailing comment
print: ; @@echo "$(foo)."
@end example

@noindent
prints @samp{bar .}, which is usually not intended, and can expose
@command{make} bugs as described below.

@node Trailing whitespace in Make Macros
@section Trailing whitespace in Make Macros
@cindex whitespace in @file{Makefile} macros
@cindex @file{Makefile} macros and whitespace

GNU @command{make} 3.80 mistreats trailing whitespace in macro
substitutions and appends another spurious suffix:

@example
empty =
foo = bar $(empty)
print: ; @@echo $(foo:=.test)
@end example

@noindent
prints @samp{bar.test .test}.

BSD and Solaris @command{make} implementations do not honor trailing
whitespace in macro definitions as POSIX requires:

@example
foo = bar # Note the space after "bar".
print: ; @@echo $(foo)t
@end example

@noindent
prints @samp{bart} instead of @samp{bar t}.  To work around this, you
can use a helper macro as in the previous example.


@node Command-line Macros and whitespace
@section Command-line Macros and whitespace
@cindex whitespace in command-line macros
@cindex command-line, macros set on
@cindex environment, macros set from

Some @command{make} implementations may strip trailing whitespace off
of macros set on the command line in addition to leading whitespace.
Further, some may strip leading whitespace off of macros set from
environment variables:

@example
$ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' |
  foo=' f f ' make -f - bar=' b b '}
x f f xb b x  # AIX, BSD, GNU make
xf f xb b x   # HP-UX
x f f xb bx   # Solaris make
@end example


@node obj/ and Make
@section The @file{obj/} Subdirectory and Make
@cindex @file{obj/}, subdirectory
@cindex BSD @command{make} and @file{obj/}

Never name one of your subdirectories @file{obj/} if you don't like
surprises.

If an @file{obj/} directory exists, BSD @command{make} enters it
before reading the makefile.  Hence the makefile in the
current directory is not read.

@example
$ @kbd{cat Makefile}
all:
        echo Hello
$ @kbd{cat obj/Makefile}
all:
        echo World
$ @kbd{make}      # GNU make
echo Hello
Hello
$ @kbd{pmake}     # BSD make
echo World
World
@end example

@node make -k Status
@section Exit Status of @code{make -k}
@cindex @code{make -k}

Do not rely on the exit status of @code{make -k}.  Some implementations
reflect whether they encountered an error in their exit status; other
implementations always succeed.

@example
$ @kbd{cat Makefile}
all:
        false
$ @kbd{make -k; echo exit status: $?}    # GNU make
false
make: *** [all] Error 1
exit status: 2
$ @kbd{pmake -k; echo exit status: $?}   # BSD make
false
*** Error code 1 (continuing)
exit status: 0
@end example

@node VPATH and Make
@section @code{VPATH} and Make
@cindex @code{VPATH}

POSIX does not specify the semantics of @code{VPATH}.  Typically,
@command{make} supports @code{VPATH}, but its implementation is not
consistent.

Autoconf and Automake support makefiles whose usages of @code{VPATH} are
portable to recent-enough popular implementations of @command{make}, but
to keep the resulting makefiles portable, a package's makefile
prototypes must take the following issues into account.  These issues
are complicated and are often poorly understood, and installers who use
@code{VPATH} should expect to find many bugs in this area.  If you use
@code{VPATH}, the simplest way to avoid these portability bugs is to
stick with GNU @command{make}, since it is the most
commonly-used @command{make} among Autoconf users.

Here are some known issues with some @code{VPATH}
implementations.

@menu
* Variables listed in VPATH::   @code{VPATH} must be literal on ancient hosts
* VPATH and Double-colon::      Problems with @samp{::} on ancient hosts
* $< in Explicit Rules::        @code{$<} does not work in ordinary rules
* Automatic Rule Rewriting::    @code{VPATH} goes wild on Solaris
* Make Target Lookup::          More details about @code{VPATH} lookup
@end menu

@node Variables listed in VPATH
@subsection Variables listed in @code{VPATH}
@cindex @code{VPATH} and variables
@cindex variables and @code{VPATH}

Do not set @code{VPATH} to the value of another variable, for example
@samp{VPATH = $(srcdir)}, because some ancient versions of
@command{make} do not do variable substitutions on the value of
@code{VPATH}.  For example, use this

@example
srcdir = @@srcdir@@
VPATH = @@srcdir@@
@end example

@noindent
rather than @samp{VPATH = $(srcdir)}.  Note that with GNU
Automake, there is no need to set this yourself.

@node VPATH and Double-colon
@subsection @code{VPATH} and Double-colon Rules
@cindex @code{VPATH} and double-colon rules
@cindex double-colon rules and @code{VPATH}

With ancient versions of Sun @command{make},
any assignment to @code{VPATH} causes @command{make} to execute only
the first set of double-colon rules.
However, this problem is no longer of practical concern.

@node $< in Explicit Rules
@subsection @code{$<} Not Supported in Explicit Rules
@cindex explicit rules, @code{$<}, and @code{VPATH}
@cindex @code{$<}, explicit rules, and @code{VPATH}
@cindex @code{VPATH}, explicit rules, and @code{$<}

Using @code{$<} in explicit rules is not portable.
The prerequisite file must be named explicitly in the rule.  If you want
to find the prerequisite via a @code{VPATH} search, you have to code the
whole thing manually.  @xref{Build Directories}.

@node Automatic Rule Rewriting
@subsection Automatic Rule Rewriting
@cindex @code{VPATH} and automatic rule rewriting
@cindex automatic rule rewriting and @code{VPATH}

Some @command{make} implementations, such as Solaris,
search for prerequisites in @code{VPATH} and
then rewrite each occurrence as a plain word in the rule.
For instance:

@example
# This isn't portable to GNU make.
VPATH = ../pkg/src
f.c: if.c
        cp if.c f.c
@end example

@noindent
executes @code{cp ../pkg/src/if.c f.c} if @file{if.c} is
found in @file{../pkg/src}.

However, this rule leads to real problems in practice.  For example, if
the source directory contains an ordinary file named @file{test} that is
used in a dependency, Solaris @command{make} rewrites commands like
@samp{if test -r foo; @dots{}} to @samp{if ../pkg/src/test -r foo;
@dots{}}, which is typically undesirable.  In fact, @command{make} is
completely unaware of shell syntax used in the rules, so the VPATH
rewrite can potentially apply to @emph{any} whitespace-separated word
in a rule, including shell variables, functions, and keywords.

@example
$ @kbd{mkdir build}
$ @kbd{cd build}
$ @kbd{cat > Makefile <<'END'}
VPATH = ..
all: arg func for echo
        func () @{ for arg in "$$@@"; do echo $$arg; done; @}; \
        func "hello world"
END
$ @kbd{touch ../arg ../func ../for ../echo}
$ @kbd{make}
../func () @{ ../for ../arg in "$@@"; do ../echo $arg; done; @}; \
../func "hello world"
sh: syntax error at line 1: `do' unexpected
*** Error code 2
@end example

@noindent
To avoid this problem, portable makefiles should never mention a source
file or dependency whose name is that of a shell keyword like @file{for}
or @file{until}, a shell command like @command{cat} or @command{gcc} or
@command{test}, or a shell function or variable used in the corresponding
@command{Makefile} recipe.

Because of these problems GNU @command{make} and many other @command{make}
implementations do not rewrite commands, so portable makefiles should
search @code{VPATH} manually.  It is tempting to write this:

@smallexample
# This isn't portable to Solaris make.
VPATH = ../pkg/src
f.c: if.c
        cp `test -f if.c || echo $(VPATH)/`if.c f.c
@end smallexample

@noindent
However, the ``prerequisite rewriting'' still applies here.  So if
@file{if.c} is in @file{../pkg/src}, Solaris @command{make}
executes

@smallexample
cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
@end smallexample

@noindent
which reduces to

@example
cp if.c f.c
@end example

@noindent
and thus fails.  Oops.

A simple workaround, and good practice anyway, is to use @samp{$?} and
@samp{$@@} when possible:

@smallexample
VPATH = ../pkg/src
f.c: if.c
        cp $? $@@
@end smallexample

@noindent
but this does not generalize well to commands with multiple
prerequisites.  A more general workaround is to rewrite the rule so that
the prerequisite @file{if.c} never appears as a plain word.  For
example, these three rules would be safe, assuming @file{if.c} is in
@file{../pkg/src} and the other files are in the working directory:

@smallexample
VPATH = ../pkg/src
f.c: if.c f1.c
        cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@@
g.c: if.c g1.c
        cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@@
h.c: if.c h1.c
        cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@@
@end smallexample

Things get worse when your prerequisites are in a macro.

@example
VPATH = ../pkg/src
HEADERS = f.h g.h h.h
install-HEADERS: $(HEADERS)
        for i in $(HEADERS); do \
          $(INSTALL) -m 644 \
            `test -f $$i || echo $(VPATH)/`$$i \
            $(DESTDIR)$(includedir)/$$i; \
@c $$ restore font-lock
        done
@end example

The above @code{install-HEADERS} rule is not Solaris-proof because @code{for
i in $(HEADERS);} is expanded to @code{for i in f.h g.h h.h;}
where @code{f.h} and @code{g.h} are plain words and are hence
subject to @code{VPATH} adjustments.

If the three files are in @file{../pkg/src}, the rule is run as:

@example
for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \
  install -m 644 \
     `test -f $i || echo ../pkg/src/`$i \
     /usr/local/include/$i; \
done
@end example

where the two first @command{install} calls fail.  For instance,
consider the @code{f.h} installation:

@example
install -m 644 \
  `test -f ../pkg/src/f.h || \
    echo ../pkg/src/ \
  `../pkg/src/f.h \
  /usr/local/include/../pkg/src/f.h;
@end example

@noindent
It reduces to:

@example
install -m 644 \
  ../pkg/src/f.h \
  /usr/local/include/../pkg/src/f.h;
@end example

Note that the manual @code{VPATH} search did not cause any problems here;
however this command installs @file{f.h} in an incorrect directory.

Trying to quote @code{$(HEADERS)} in some way, as we did for
@code{foo.c} a few makefiles ago, does not help:

@example
install-HEADERS: $(HEADERS)
        headers='$(HEADERS)'; \
        for i in $$headers; do \
          $(INSTALL) -m 644 \
            `test -f $$i || echo $(VPATH)/`$$i \
            $(DESTDIR)$(includedir)/$$i; \
        done
@end example

Now, @code{headers='$(HEADERS)'} macro-expands to:

@example
headers='f.h g.h h.h'
@end example

@noindent
but @code{g.h} is still a plain word.  (As an aside, the idiom
@code{headers='$(HEADERS)'; for i in $$headers;} is a good
idea if @code{$(HEADERS)} can be empty, because some shells diagnose a
syntax error on @code{for i in;}.)

One workaround is to strip this unwanted @file{../pkg/src/} prefix manually:

@example
VPATH = ../pkg/src
HEADERS = f.h g.h h.h
install-HEADERS: $(HEADERS)
        headers='$(HEADERS)'; \
        for i in $$headers; do \
          i=`expr "$$i" : '$(VPATH)/\(.*\)'`;
          $(INSTALL) -m 644 \
            `test -f $$i || echo $(VPATH)/`$$i \
            $(DESTDIR)$(includedir)/$$i; \
@c $$ restore font-lock
        done
@end example

@noindent
Automake does something similar.

@node Make Target Lookup
@subsection Make Target Lookup
@cindex @code{VPATH}, resolving target pathnames

GNU @command{make} uses a complex algorithm to decide when it
should use files found via a @code{VPATH} search.  @xref{Search
Algorithm, , How Directory Searches are Performed, make, The GNU Make
Manual}.

If a target needs to be rebuilt, GNU @command{make} discards the
file name found during the @code{VPATH} search for this target, and
builds the file locally using the file name given in the makefile.
If a target does not need to be rebuilt, GNU @command{make} uses the
file name found during the @code{VPATH} search.

Other @command{make} implementations, like NetBSD @command{make}, are
easier to describe: the file name found during the @code{VPATH} search
is used whether the target needs to be rebuilt or not.  Therefore
new files are created locally, but existing files are updated at their
@code{VPATH} location.

OpenBSD and FreeBSD @command{make}, however,
never perform a
@code{VPATH} search for a dependency that has an explicit rule.
This is extremely annoying.

When attempting a @code{VPATH} build for an autoconfiscated package
(e.g., @code{mkdir build && cd build && ../configure}), this means
GNU
@command{make} builds everything locally in the @file{build}
directory, while BSD @command{make} builds new files locally and
updates existing files in the source directory.

@example
$ @kbd{cat Makefile}
VPATH = ..
all: foo.x bar.x
foo.x bar.x: newer.x
        @@echo Building $@@
$ @kbd{touch ../bar.x}
$ @kbd{touch ../newer.x}
$ @kbd{make}        # GNU make
Building foo.x
Building bar.x
$ @kbd{pmake}       # NetBSD make
Building foo.x
Building ../bar.x
$ @kbd{fmake}       # FreeBSD make, OpenBSD make
Building foo.x
Building bar.x
$ @kbd{make}        # GNU make
Building foo.x
$ @kbd{pmake}       # NetBSD make
Building foo.x
$ @kbd{fmake}       # FreeBSD make, OpenBSD make
Building foo.x
Building bar.x
@end example

Note how NetBSD @command{make} updates @file{../bar.x} in its
VPATH location, and how FreeBSD and OpenBSD
@command{make} always
update @file{bar.x}, even when @file{../bar.x} is up to date.

Another point worth mentioning is that once GNU @command{make} has
decided to ignore a @code{VPATH} file name (e.g., it ignored
@file{../bar.x} in the above example) it continues to ignore it when
the target occurs as a prerequisite of another rule.

The following example shows that GNU @command{make} does not look up
@file{bar.x} in @code{VPATH} before performing the @code{.x.y} rule,
because it ignored the @code{VPATH} result of @file{bar.x} while running
the @code{bar.x: newer.x} rule.

@example
$ @kbd{cat Makefile}
VPATH = ..
all: bar.y
bar.x: newer.x
        @@echo Building $@@
.SUFFIXES: .x .y
.x.y:
        cp $< $@@
$ @kbd{touch ../bar.x}
$ @kbd{touch ../newer.x}
$ @kbd{make}        # GNU make
Building bar.x
cp bar.x bar.y
cp: cannot stat 'bar.x': No such file or directory
make: *** [bar.y] Error 1
$ @kbd{pmake}       # NetBSD make
Building ../bar.x
cp ../bar.x bar.y
$ @kbd{rm bar.y}
$ @kbd{fmake}       # FreeBSD make, OpenBSD make
echo Building bar.x
cp bar.x bar.y
cp: cannot stat 'bar.x': No such file or directory
*** Error code 1
@end example

Note that if you drop away the command from the @code{bar.x: newer.x}
rule, GNU @command{make} magically starts to work: it
knows that @code{bar.x} hasn't been updated, therefore it doesn't
discard the result from @code{VPATH} (@file{../bar.x}) in succeeding
uses.  FreeBSD and OpenBSD still don't work, though.

@example
$ @kbd{cat Makefile}
VPATH = ..
all: bar.y
bar.x: newer.x
.SUFFIXES: .x .y
.x.y:
        cp $< $@@
$ @kbd{touch ../bar.x}
$ @kbd{touch ../newer.x}
$ @kbd{make}        # GNU make
cp ../bar.x bar.y
$ @kbd{rm bar.y}
$ @kbd{pmake}       # NetBSD make
cp ../bar.x bar.y
$ @kbd{rm bar.y}
$ @kbd{fmake}       # FreeBSD make, OpenBSD make
cp bar.x bar.y
cp: cannot stat 'bar.x': No such file or directory
*** Error code 1
@end example

It seems the sole solution that would please every @command{make}
implementation is to never rely on @code{VPATH} searches for targets.
In other words, @code{VPATH} should be reserved to sources that are not built.


@node Single Suffix Rules
@section Single Suffix Rules and Separated Dependencies
@cindex Single Suffix Inference Rule
@cindex Rule, Single Suffix Inference
A @dfn{Single Suffix Rule} is basically a usual suffix (inference) rule
(@samp{.from.to:}), but which @emph{destination} suffix is empty
(@samp{.from:}).

@cindex Separated Dependencies
@dfn{Separated dependencies} simply refers to listing the prerequisite
of a target, without defining a rule.  Usually one can list on the one
hand side, the rules, and on the other hand side, the dependencies.

Solaris @command{make} does not support separated dependencies for
targets defined by single suffix rules:

@example
$ @kbd{cat Makefile}
.SUFFIXES: .in
foo: foo.in
.in:
        cp $< $@@
$ @kbd{touch foo.in}
$ @kbd{make}
$ @kbd{ls}
Makefile  foo.in
@end example

@noindent
while GNU Make does:

@example
$ @kbd{gmake}
cp foo.in foo
$ @kbd{ls}
Makefile  foo       foo.in
@end example

Note it works without the @samp{foo: foo.in} dependency.

@example
$ @kbd{cat Makefile}
.SUFFIXES: .in
.in:
        cp $< $@@
$ @kbd{make foo}
cp foo.in foo
@end example

@noindent
and it works with double suffix inference rules:

@example
$ @kbd{cat Makefile}
foo.out: foo.in
.SUFFIXES: .in .out
.in.out:
        cp $< $@@
$ @kbd{make}
cp foo.in foo.out
@end example

As a result, in such a case, you have to write target rules.

@node Timestamps and Make
@section Timestamp Resolution and Make
@cindex timestamp resolution
Traditionally, file timestamps had 1-second resolution, and
@command{make} used those timestamps to determine whether one file was
newer than the other.  However, many modern file systems have
timestamps with 1-nanosecond resolution.  Some @command{make}
implementations look at the entire timestamp; others ignore the
fractional part, which can lead to incorrect results.  Normally this
is not a problem, but in some extreme cases you may need to use tricks
like @samp{sleep 1} to work around timestamp truncation bugs.

Traditionally, commands like @samp{cp -p} and @samp{touch -r} did not copy
file timestamps to their full resolutions (@pxref{touch, , Limitations of Usual
Tools}).  Hence you should be wary of rules like this:

@example
dest: src
        cp -p src dest
@end example

as @file{dest} often appears to be older than @file{src} after the
timestamp is truncated, and this can cause @command{make} to do
needless rework the next time it is invoked.  To work around this
problem, you can use a timestamp file, e.g.:

@example
dest-stamp: src
        cp -p src dest
        echo >dest-stamp
@end example

Apart from timestamp resolution, there are also differences in handling
equal timestamps.  Although POSIX suggests that @command{make} update a
target with the same timestamp as its newest prerequisite, only
HP-UX @command{make} is known to do so; GNU and other @command{make}
implementations do not update, a behavior that POSIX also allows.

The HP-UX behavior can cause spurious rebuilds
and this in turn can cause @command{make} to fail if it tries to rebuild
generated files in a possibly read-only source tree with tools not
present on the build machine.  Conversely, if a source file is updated
immediately after running @command{make} in a file system with
low-resolution timestamps, the GNU behavior can cause a later
@command{make} to neglect rebuilds and quietly generate incorrect results.
To avoid both these problems, use GNU @command{make} on a platform
with high-resolution timestamps.


@c ======================================== Portable C and C++ Programming

@node Portable C and C++
@chapter Portable C and C++ Programming
@cindex Portable C and C++ programming

C and C++ programs often use low-level features of the underlying
system, and therefore are often more difficult to make portable to other
platforms.

Several standards have been developed to help make your programs more
portable.  If you write programs with these standards in mind, you can
have greater confidence that your programs work on a wide variety
of systems.
@ifhtml
@uref{https://@/gcc.gnu.org/@/onlinedocs/@/gcc/@/Standards.html, Language
Standards Supported by GCC}
@end ifhtml
@ifnothtml
@xref{Standards, , Language Standards Supported by
GCC, gcc, Using the GNU Compiler Collection
(GCC)},
@end ifnothtml
for a list of C-related standards.  Many programs also assume the
@uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX standard}.

@cindex K&R C
@cindex C89, C99, C11, C17, and C23
The first widely used C variant was K&R C, which predates any C
standard.  K&R C compilers are no longer of practical interest, though,
and Autoconf assumes at least C89, the first C standard,
which is sometimes called ``C90'' due to a delay in standardization.
C has since gone through the standards C99, C11, C17, and C23, and
Autoconf is compatible with all these standards.

Program portability is a huge topic, and this section can only briefly
introduce common pitfalls.  @xref{System Portability, , Portability
between System Types, standards, The GNU Coding Standards}, for
more information.

@menu
* Varieties of Unportability::  How to make your programs unportable
* Integer Overflow::            When integers get too large
* Preprocessor Arithmetic::     @code{#if} expression problems
* Null Pointers::               Properties of null pointers
* Buffer Overruns::             Subscript errors and the like
* Volatile Objects::            @code{volatile} and signals
* Floating Point Portability::  Portable floating-point arithmetic
* Exiting Portably::            Exiting and the exit status
@end menu

@node Varieties of Unportability
@section Varieties of Unportability
@cindex portability

Autoconf tests and ordinary programs often need to test what is allowed
on a system, and therefore they may need to deliberately exceed the
boundaries of what the standards allow, if only to see whether an
optional feature is present.  When you write such a program, you should
keep in mind the difference between constraints, unspecified behavior,
and undefined behavior.

In C, a @dfn{constraint} is a rule that the compiler must enforce.  An
example constraint is that C programs must not declare a bit-field with
negative width.  Tests can therefore reliably assume that programs with
negative-width bit-fields are rejected by a compiler that conforms
to the standard.

@dfn{Unspecified behavior} is valid behavior, where the standard allows
multiple possibilities.  For example, the order of evaluation of
function arguments is unspecified.  Some unspecified behavior is
@dfn{implementation-defined}, i.e., documented by the implementation,
but since Autoconf tests cannot read the documentation they cannot
distinguish between implementation-defined and other unspecified
behavior.  It is common for Autoconf tests to probe implementations to
determine otherwise-unspecified behavior.

@dfn{Undefined behavior} is invalid behavior, where the standard allows
the implementation to do anything it pleases.  For example,
dereferencing a null pointer leads to undefined behavior.  If possible,
test programs should avoid undefined behavior, since a program with
undefined behavior might succeed on a test that should fail.

The above rules apply to programs that are intended to conform to the
standard.  However, strictly-conforming programs are quite rare, since
the standards are so limiting.  A major goal of Autoconf is to support
programs that use implementation features not described by the standard,
and it is fairly common for test programs to violate the above rules, if
the programs work well enough in practice.

@node Integer Overflow
@section Integer Overflow
@cindex integer overflow
@cindex overflow, signed integer
@cindex signed integer overflow
@cindex wraparound arithmetic

Although some traditional C programs assume that signed integer overflow
wraps around reliably using two's complement arithmetic, the C standard
says that program behavior is undefined on overflow, and these C
programs may not work on many modern implementations.

@menu
* Integer Overflow Basics::     Why integer overflow is a problem
* Signed Overflow Examples::    Examples of code assuming wraparound
* Optimization and Wraparound::  Optimizations that break uses of wraparound
* Signed Overflow Advice::      Practical advice for signed overflow issues
* Signed Integer Division::     @code{INT_MIN / -1} and @code{INT_MIN % -1}
@end menu

@node Integer Overflow Basics
@subsection Basics of Integer Overflow
@cindex integer overflow
@cindex overflow, signed integer
@cindex signed integer overflow
@cindex wraparound arithmetic

In languages like C, integer overflow wraps around for unsigned
integer types that are at least as wide as @code{unsigned int};
e.g., @code{UINT_MAX + 1} yields zero.
This is guaranteed by the C standard and is
portable in practice, unless you specify aggressive,
nonstandard optimization options
suitable only for special applications.

In contrast, the C standard says that signed integer overflow leads to
undefined behavior where a program can do anything, including dumping
core or overrunning a buffer.  The misbehavior can even precede the
overflow.  Such an overflow can occur during addition, subtraction,
multiplication, division, and left shift.  It can even occur for
unsigned types like @code{unsigned short int} that are narrower
than @code{int}, as values of these types are widened to @code{int}
before computation.

Despite this requirement of the standard, some C programs assume that
signed integer overflow silently wraps around modulo a power of two,
using two's complement arithmetic, so long as you convert the resulting
value to a signed integer type.  These programs can have problems,
especially when optimization is enabled.  If you assume a GCC-like
compiler, you can work around the problems by compiling with GCC's
@code{-fwrapv} option; however, this is not portable.

For historical reasons C17 and earlier also allowed implementations with
ones' complement or signed magnitude arithmetic, but C23 requires
two's complement and it is safe to assume two's complement nowadays.

Also, overflow can occur when converting an out-of-range value to a
signed integer type.  Here a standard implementation must define what
happens, and this can include raising an exception.  Although practical
implementations typically wrap around silently in this case, a few
debugging implementations trap instead.

@node Signed Overflow Examples
@subsection Examples of Code Assuming Wraparound Overflow
@cindex integer overflow
@cindex overflow, signed integer
@cindex signed integer overflow
@cindex wraparound arithmetic

There was long a tension between what the C standard requires for signed
integer overflow, and what traditional C programs commonly assumed.  The
standard allows aggressive optimizations based on assumptions that
overflow never occurs, but traditionally many C programs relied on overflow
wrapping around.  Although these programs did not conform to the standard,
they formerly worked in practice because traditionally compilers did not
optimize in such a way that would break the programs.  Nowadays, though,
compilers do perform these optimizations, so portable programs can no
longer assume reliable wraparound on signed integer overflow.

The C Standard says that if a program has signed integer overflow its
behavior is undefined, and the undefined behavior can even precede the
overflow.  To take an extreme example:

@c Inspired by Robert Dewar's example in
@c <https://gcc.gnu.org/ml/gcc/2007-01/msg00038.html> (2007-01-01).
@example
if (password == expected_password)
  allow_superuser_privileges ();
else if (counter++ == INT_MAX)
  abort ();
else
  printf ("%d password mismatches\n", counter);
@end example

@noindent
If the @code{int} variable @code{counter} equals @code{INT_MAX},
@code{counter++} must overflow and the behavior is undefined, so the C
standard allows the compiler to optimize away the test against
@code{INT_MAX} and the @code{abort} call.
Worse, if an earlier bug in the program lets the compiler deduce that
@code{counter == INT_MAX} or that @code{counter} previously overflowed,
the C standard allows the compiler to optimize away the password test
and generate code that allows superuser privileges unconditionally.

Here is an example derived from the 7th Edition Unix implementation of
@code{atoi} (1979-01-10):

@example
char *p;
int f, n;
@dots{}
while (*p >= '0' && *p <= '9')
  n = n * 10 + *p++ - '0';
return (f ? -n : n);
@end example

@noindent
Even if the input string is in range, on most modern machines this has
signed overflow when computing the most negative integer (the @code{-n}
overflows) or a value near an extreme integer (the @code{+}
overflows).

Here is another example, derived from the 7th Edition implementation of
@code{rand} (1979-01-10).  Here the programmer expects both
multiplication and addition to wrap on overflow:

@example
static long int randx = 1;
@dots{}
randx = randx * 1103515245 + 12345;
return (randx >> 16) & 077777;
@end example

In the following example, derived from the GNU C Library 2.15
implementation of @code{mktime} (2012-03-21), the code assumes
wraparound arithmetic in @code{+} to detect signed overflow:

@example
time_t t, t1, t2;
int sec_requested, sec_adjustment;
@dots{}
t1 = t + sec_requested;
t2 = t1 + sec_adjustment;
if (((t1 < t) != (sec_requested < 0))
    | ((t2 < t1) != (sec_adjustment < 0)))
  return -1;
@end example

Although some of these examples will likely behave as if signed integer
overflow wraps around reliably, other examples are likely to misbehave
when optimization is enabled.  All these examples should be avoided in
portable code because signed integer overflow is not reliable on modern
systems, and it's not worth worrying about which of these examples
happen to work on most platforms and which do not.

@node Optimization and Wraparound
@subsection Optimizations That Break Wraparound Arithmetic
@cindex loop induction

Compilers sometimes generate code that is incompatible with wraparound
integer arithmetic.  A simple example is an algebraic simplification: a
compiler might translate @code{(i * 2000) / 1000} to @code{i * 2}
because it assumes that @code{i * 2000} does not overflow.  The
translation is not equivalent to the original when overflow occurs:
e.g., in the typical case of 32-bit signed two's complement wraparound
@code{int}, if @code{i} has type @code{int} and value @code{1073742},
the original expression returns @minus{}2147483 but the optimized
version returns the mathematically correct value 2147484.

More subtly, loop induction optimizations often exploit the undefined
behavior of signed overflow.  Consider the following contrived function
@code{sumc}:

@example
int
sumc (int lo, int hi)
@{
  int sum = 0;
  for (int i = lo; i <= hi; i++)
    sum ^= i * 53;
  return sum;
@}
@end example

@noindent
To avoid multiplying by 53 each time through the loop, an optimizing
compiler might internally transform @code{sumc} to the equivalent of the
following:

@example
int
transformed_sumc (int lo, int hi)
@{
  int sum = 0;
  int hic = hi * 53;
  for (int ic = lo * 53; ic <= hic; ic += 53)
    sum ^= ic;
  return sum;
@}
@end example

@noindent
This transformation is allowed by the C standard, but it is invalid for
wraparound arithmetic when @code{INT_MAX / 53 < hi}, because then the
overflow in computing expressions like @code{hi * 53} can cause the
expression @code{i <= hi} to yield a different value from the
transformed expression @code{ic <= hic}.

For this reason, compilers that use loop induction and similar
techniques often do not support reliable wraparound arithmetic when a
loop induction variable like @code{ic} is involved.  Since loop
induction variables are generated by the compiler, and are not visible
in the source code, it is not always trivial to say whether the problem
affects your code.

Hardly any code actually depends on wraparound arithmetic in cases like
these, so in practice these loop induction optimizations are almost
always useful.  However, edge cases in this area can cause problems.
For example:

@example
for (int j = 1; 0 < j; j *= 2)
  test (j);
@end example

@noindent
Here, the loop attempts to iterate through all powers of 2 that
@code{int} can represent, but the C standard allows a compiler to
optimize away the comparison and generate an infinite loop,
under the argument that behavior is undefined on overflow.  As of this
writing this optimization is done on some platforms by
GCC with @option{-O2}, so this code is not portable in practice.

@node Signed Overflow Advice
@subsection Practical Advice for Signed Overflow Issues
@cindex integer overflow
@cindex overflow, signed integer
@cindex signed integer overflow
@cindex wraparound arithmetic

Ideally the safest approach is to avoid signed integer overflow
entirely.  For example, instead of multiplying two signed integers, you
can convert them to double-width integers, multiply the wider values,
then test whether the result is in the narrower range.  Or you can use
more-complicated code employing unsigned integers of the same width.

Rewriting code in this way will be inconvenient, though, especially if
the signed values might be negative and no wider type is available.
Using unsigned arithmetic to check for overflow is
particularly painful to do portably and efficiently when dealing with an
integer type like @code{uid_t} whose width and signedness vary from
platform to platform.  Also, this approach may hurt performance.

Hence it is often useful to maintain code that needs
wraparound on overflow, instead of rewriting the code.  The rest of this
section attempts to give practical advice for this situation.

To detect integer overflow portably when attempting operations like
@code{sum = a + b}, you can use the C23 @code{<stdckdint.h>} macros
@code{ckd_add}, @code{ckd_sub}, and @code{ckd_mul}.
The following code adds two integers with overflow wrapping around
reliably in the sum:

@example
#include <stdckdint.h>
...
/* Set sum = a + b, with wraparound.  */
if (ckd_add (&sum, a, b))
  /* 'sum' has just the low order bits.  */;
else
  /* 'sum' is the correct answer.  */;
@end example

To be portable to pre-C23 platforms you can use Gnulib's
@code{stdckdint} module, which emulates this part of C23 (@pxref{Gnulib}).
Invoking the @code{stdckdint} macros typically costs just one machine
instruction for the arithmetic and another instruction for the rare
branch on overflow.

If your code uses a signed loop index, make sure that the index cannot
overflow, along with all signed expressions derived from the index.
Here is a contrived example of problematic code with two instances of
overflow.

@example
for (int i = INT_MAX - 10; i <= INT_MAX; i++)
  if (i + 1 < 0)
    @{
      report_overflow ();
      break;
    @}
@end example

@noindent
Because of the two overflows, a compiler might optimize away or
transform the two comparisons in a way that is incompatible with the
wraparound assumption.

If your code is intended to be compiled only by GCC and
assumes wraparound behavior, and you want to insulate it
against any GCC optimizations that would fail to support that
behavior, you should use GCC's @option{-fwrapv} option, which
causes signed overflow to wrap around reliably (except for division and
remainder, as discussed in the next section).

If you need to write portable code and therefore cannot assume that
signed integer overflow wraps around reliably, you should consider
debugging with a GCC option that causes signed overflow to raise an
exception.  These options include @option{-fsanitize=undefined} and
@option{-ftrapv}.

@node Signed Integer Division
@subsection Signed Integer Division and Integer Overflow
@cindex division, integer

Overflow in signed
integer division is not always harmless: for example, on CPUs of the
i386 family, dividing @code{INT_MIN} by @code{-1} yields a SIGFPE signal
which by default terminates the program.  Worse, taking the remainder
of these two values typically yields the same signal on these CPUs,
behavior that the C standard allows.

@node Preprocessor Arithmetic
@section Preprocessor Arithmetic
@cindex preprocessor arithmetic

In C99 and later, preprocessor arithmetic, used for @code{#if}
expressions, must
be evaluated as if all signed values are of type @code{intmax_t} and all
unsigned values of type @code{uintmax_t}.  Many compilers are buggy in
this area, though.  For example, as of 2007, Sun C mishandles @code{#if
LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit
@code{long long int}.  Also, some older preprocessors mishandle
constants ending in @code{LL}.  To work around these problems, you can
compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at
@code{configure}-time rather than at @code{#if}-time.

@node Null Pointers
@section Properties of Null Pointers
@cindex null pointers

Most modern hosts reliably fail when you attempt to dereference a null
pointer.

On almost all modern hosts, null pointers use an all-bits-zero internal
representation, so you can reliably use @code{memset} with 0 to set all
the pointers in an array to null values.

If @code{p} is a null pointer to an object type, the C expression
@code{p + 0} always evaluates to @code{p} on modern hosts, even though
the standard says that it has undefined behavior.

@node Buffer Overruns
@section Buffer Overruns and Subscript Errors
@cindex buffer overruns

Buffer overruns and subscript errors are the most common dangerous
errors in C programs.  They result in undefined behavior because storing
outside an array typically modifies storage that is used by some other
object, and most modern systems lack runtime checks to catch these
errors.  Programs should not rely on buffer overruns being caught.

There is one exception to the usual rule that a portable program cannot
address outside an array.  In C, it is valid to compute the address just
past an object, e.g., @code{&a[N]} where @code{a} has @code{N} elements,
so long as you do not dereference the resulting pointer.  But it is not
valid to compute the address just before an object, e.g., @code{&a[-1]};
nor is it valid to compute two past the end, e.g., @code{&a[N+1]}.  On
most platforms @code{&a[-1] < &a[0] && &a[N] < &a[N+1]}, but this is not
reliable in general, and it is usually easy enough to avoid the
potential portability problem, e.g., by allocating an extra unused array
element at the start or end.

@uref{https://@/www.valgrind.org/, Valgrind} can catch many overruns.
GCC users might also consider using the @option{-fsanitize=} options
to catch overruns.
@xref{Instrumentation Options, , Program Instrumentation Options,
      gcc, Using the GNU Compiler Collection (GCC)}.

Buffer overruns are usually caused by off-by-one errors, but there are
more subtle ways to get them.

Using @code{int} values to index into an array or compute array sizes
causes problems on typical 64-bit hosts where an array index might
be @math{2^{31}} or larger.  Index values of type @code{size_t} avoid this
problem, but cannot be negative.  Index values of type @code{ptrdiff_t}
are signed, and are wide enough in practice.

If you add or multiply two numbers to calculate an array size, e.g.,
@code{malloc (x * sizeof y + z)}, havoc ensues if the addition or
multiplication overflows.

Many implementations of the @code{alloca} function silently misbehave
and can generate buffer overflows if given sizes that are too large.
The size limits are implementation dependent, but are at least 4000
bytes on all platforms that we know about.

The standard functions @code{asctime}, @code{asctime_r}, @code{ctime},
@code{ctime_r}, and @code{gets} are prone to buffer overflows, and
portable code should not use them unless the inputs are known to be
within certain limits.  The time-related functions can overflow their
buffers if given timestamps out of range (e.g., a year less than -999
or greater than 9999).  Time-related buffer overflows cannot happen with
recent-enough versions of the GNU C library, but are possible
with other
implementations.  The @code{gets} function is the worst, since it almost
invariably overflows its buffer when presented with an input line larger
than the buffer.

@node Volatile Objects
@section Volatile Objects
@cindex volatile objects

The keyword @code{volatile} is often misunderstood in portable code.
Its use inhibits some memory-access optimizations, but programmers often
wish that it had a different meaning than it actually does.

@code{volatile} was designed for code that accesses special objects like
memory-mapped device registers whose contents spontaneously change.
Such code is inherently low-level, and it is difficult to specify
portably what @code{volatile} means in these cases.  The C standard
says, ``What constitutes an access to an object that has
volatile-qualified type is implementation-defined,'' so in theory each
implementation is supposed to fill in the gap by documenting what
@code{volatile} means for that implementation.  In practice, though,
this documentation is usually absent or incomplete.

One area of confusion is the distinction between objects defined with
volatile types, and volatile lvalues.  From the C standard's point of
view, an object defined with a volatile type has externally visible
behavior.  You can think of such objects as having little oscilloscope
probes attached to them, so that the user can observe some properties of
accesses to them, just as the user can observe data written to output
files.  However, accesses via volatile lvalues to ordinary objects
are merely side effects (i.e., changes to the state of the execution
environment), and the implementation is not required to document
their visibility any further.  For example:

@example
/* Declare and access a volatile object.
   Accesses to X are "visible" to users.  */
static int volatile x;
x = 1;

/* Access two ordinary objects via a volatile lvalue.
   Although each read and write is a side effect,
   the accesses are not directly "visible" to users.  */
int y = 0;
int *z = malloc (sizeof *z);
*z = 7;
int volatile *p;
p = &y;
*p = *p + 1;
p = z;
*p = *p + 1;
@end example

Programmers often wish that @code{volatile} meant ``Perform the memory
access here and now, without merging several memory accesses, without
changing the memory word size, and without reordering.''  But the C
standard does not require this.  For objects defined with a volatile
type, accesses must be done before the next sequence point; but
otherwise merging, reordering, and word-size change is allowed.

Even when accessing objects defined with a volatile type,
the C standard allows only
extremely limited signal handlers: in C23 the behavior is undefined if a
signal handler refers to any non-local object that is not a lock-free
atomic object and that is not @code{constexpr} (other than by writing to
a @code{sig_atomic_t volatile} object), or calls any standard library
function other than from a small set that includes @code{abort},
@code{_Exit}, @code{quick_exit}, some @code{<stdatomic.h>} functions,
and @code{signal}.  Hence C compilers need not worry about a signal
handler disturbing ordinary computation.  POSIX allows some additional
behavior in a portable signal handler, but is still quite restrictive.
@xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the
GNU Compiler Collection (GCC)}, for some
restrictions imposed by GCC.  @xref{Defining Handlers, ,
Defining Signal Handlers, libc, The GNU C Library}, for some
restrictions imposed by the GNU C library.  Restrictions
differ on other platforms.

If possible, it is best to use a signal handler that fits within the
limits imposed by the C and POSIX standards.

If this is not practical, you can try the following rules of thumb.  A
signal handler should access only volatile lvalues, preferably lvalues
that refer to objects defined with a volatile type, and should not
assume that the accessed objects have an internally consistent state
if they are larger than a machine word.  Furthermore, installers
should employ compilers and compiler options that are commonly used
for building operating system kernels, because kernels often need more
from @code{volatile} than the C Standard requires, and installers who
compile an application in a similar environment can sometimes benefit
from the extra constraints imposed by kernels on compilers.
Admittedly we are hand-waving somewhat here, as there are few
guarantees in this area; the rules of thumb may help to fix some bugs
but there is a good chance that they will not fix them all.

For @code{volatile}, C++ has the same problems that C does.
Multithreaded applications have even more problems with @code{volatile},
but they are beyond the scope of this section.

The bottom line is that using @code{volatile} typically hurts
performance but should not hurt correctness.  In some cases its use
does help correctness, but these cases are often so poorly understood
that all too often adding @code{volatile} to a data structure merely
alleviates some symptoms of a bug while not fixing the bug in general.

@node Floating Point Portability
@section Floating Point Portability
@cindex floating point

Almost all modern systems use IEEE-754 floating point, and it is safe to
assume IEEE-754 in most portable code these days.  For more information,
please see David Goldberg's classic paper
@uref{https://@/www.validlab.com/@/goldberg/@/paper.pdf, What Every Computer
Scientist Should Know About Floating-Point Arithmetic}.

@node Exiting Portably
@section Exiting Portably
@cindex exiting portably

A C or C++ program can exit with status @var{N} by returning
@var{N} from the @code{main} function.  Portable programs are supposed
to exit either with status 0 or @code{EXIT_SUCCESS} to succeed, or with
status @code{EXIT_FAILURE} to fail, but in practice it is portable to
fail by exiting with status 1, and test programs that assume POSIX can
fail by exiting with status values from 1 through 255.

A program can also exit with status @var{N} by passing @var{N} to the
@code{exit} function, and a program can fail by calling the @code{abort}
function.  If a program is specialized to just some platforms, it can fail
by calling functions specific to those platforms, e.g., @code{_exit}
(POSIX).  However, like other functions, an exit
function should be declared, typically by including a header.  For
example, if a C program calls @code{exit}, it should include @file{stdlib.h}
either directly or via the default includes (@pxref{Default Includes}).

A program can fail due to undefined behavior such as dereferencing a null
pointer, but this is not recommended as undefined behavior allows an
implementation to do whatever it pleases and this includes exiting
successfully.


@c ================================================== Manual Configuration

@node Manual Configuration
@chapter Manual Configuration

A few kinds of features can't be guessed automatically by running test
programs.  For example, the details of the object-file format, or
special options that need to be passed to the compiler or linker.
Autoconf provides a uniform method for handling unguessable features,
by giving each operating system a @dfn{canonical system type}, also
known as a @dfn{canonical name} or @dfn{target triplet}.

@prindex @command{config.guess}
@prindex @command{config.sub}

If you use any of the macros described in this chapter, you must
distribute the helper scripts @command{config.guess} and
@command{config.sub} along with your source code.  Some Autoconf macros
use these macros internally, so you may need to distribute these scripts
even if you do not use any of these macros yourself.  @xref{Input}, for
information about the @code{AC_CONFIG_AUX_DIR} macro which you can use
to control in which directory @command{configure} looks for helper
scripts, and where to get the scripts from.

@menu
* Specifying Target Triplets::  Specifying target triplets
* Canonicalizing::              Getting the canonical system type
* Using System Type::           What to do with the system type
@end menu

@node Specifying Target Triplets
@section Specifying target triplets
@cindex System type
@cindex Target triplet
@c This node used to be named Specifying Names.  The @anchor allows old
@c links to still work.
@anchor{Specifying Names}

Autoconf-generated
@command{configure} scripts can make decisions based on a canonical name
for the system type, or @dfn{target triplet}, which has the form:
@samp{@var{cpu}-@var{vendor}-@var{os}}, where @var{os} can be
@samp{@var{system}} or @samp{@var{kernel}-@var{system}}

@command{configure} can usually guess the canonical name for the type of
system it's running on.  To do so it runs a script called
@command{config.guess}, which infers the name using the @code{uname}
command or symbols predefined by the C preprocessor.

Alternately, the user can specify the system type with command line
arguments to @command{configure} (@pxref{System Types}.  Doing so is
necessary when
cross-compiling.  In the most complex case of cross-compiling, three
system types are involved.  The options to specify them are:

@table @option
@item --build=@var{build-type}
the type of system on which the package is being configured and
compiled.  It defaults to the result of running @command{config.guess}.
Specifying a @var{build-type} that differs from @var{host-type} enables
cross-compilation mode.

@item --host=@var{host-type}
the type of system on which the package runs.  By default it is the
same as the build machine.  The tools that get used to build and
manipulate binaries will, by default, all be prefixed with
@code{@var{host-type}-}, such as @code{@var{host-type}-gcc},
@code{@var{host-type}-g++}, @code{@var{host-type}-ar}, and
@code{@var{host-type}-nm}.  If the binaries produced by these tools can
be executed by the build system, the configure script will make use of
it in @code{AC_RUN_IFELSE} invocations; otherwise, cross-compilation
mode is enabled.  Specifying a @var{host-type} that differs
from @var{build-type}, when @var{build-type} was also explicitly
specified, equally enables cross-compilation mode.

@item --target=@var{target-type}
the type of system for which any compiler tools in the package
produce code (rarely needed).  By default, it is the same as host.
@end table

If you mean to override the result of @command{config.guess} but
still produce binaries for the build machine, use @option{--build},
not @option{--host}.

So, for example, to produce binaries for 64-bit MinGW, use a command
like this:

@example
./configure --host=x86_64-w64-mingw64
@end example

If your system has the ability to execute MinGW binaries but you don't
want to make use of this feature and instead prefer cross-compilation
guesses, use a command like this:

@example
./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64
@end example

@noindent
Note that if you do not specify @option{--host}, @command{configure}
fails if it can't run the code generated by the specified compiler.  For
example, configuring as follows fails:

@example
./configure CC=x86_64-w64-mingw64-gcc
@end example

When cross-compiling, @command{configure} will warn about any tools
(compilers, linkers, assemblers) whose name is not prefixed with the
host type.  This is an aid to users performing cross-compilation.
Continuing the example above, if a cross-compiler named @command{cc} is
used with a native @command{pkg-config}, then libraries found by
@command{pkg-config} will likely cause subtle build failures; but using
the names @command{x86_64-w64-mingw64-gcc} and
@command{x86_64-w64-mingw64-pkg-config}
avoids any confusion.  Avoiding the warning is as simple as creating the
correct symlinks naming the cross tools.

@cindex @command{config.sub}
@command{configure} recognizes short aliases for some system types; for
example, @samp{mingw64} can be used instead of
@samp{x86_64-pc-mingw64}.  @command{configure} runs a script called
@command{config.sub} to canonicalize system type aliases.

This section deliberately omits the description of the obsolete
interface; see @ref{Hosts and Cross-Compilation}.


@node Canonicalizing
@section Getting the Canonical System Type
@cindex System type
@cindex Canonical system type

The following macros make the system type available to @command{configure}
scripts.

@ovindex build_alias
@ovindex host_alias
@ovindex target_alias

The variables @samp{build_alias}, @samp{host_alias}, and
@samp{target_alias} are always exactly the arguments of @option{--build},
@option{--host}, and @option{--target}; in particular, they are left empty
if the user did not use them, even if the corresponding
@code{AC_CANONICAL} macro was run.  Any configure script may use these
variables anywhere.  These are the variables that should be used when in
interaction with the user.

If you need to recognize some special environments based on their system
type, run the following macros to get canonical system names.  These
variables are not set before the macro call.

@defmac AC_CANONICAL_BUILD
@acindex{CANONICAL_BUILD}
@ovindex build
@ovindex build_cpu
@ovindex build_vendor
@ovindex build_os
Compute the canonical build-system type variable, @code{build}, and its
three individual parts @code{build_cpu}, @code{build_vendor}, and
@code{build_os}.

If @option{--build} was specified, then @code{build} is the
canonicalization of @code{build_alias} by @command{config.sub},
otherwise it is determined by the shell script @command{config.guess}.
@end defmac

@defmac AC_CANONICAL_HOST
@acindex{CANONICAL_HOST}
@ovindex host
@ovindex host_cpu
@ovindex host_vendor
@ovindex host_os
Compute the canonical host-system type variable, @code{host}, and its
three individual parts @code{host_cpu}, @code{host_vendor}, and
@code{host_os}.

If @option{--host} was specified, then @code{host} is the
canonicalization of @code{host_alias} by @command{config.sub},
otherwise it defaults to @code{build}.
@end defmac

@defmac AC_CANONICAL_TARGET
@acindex{CANONICAL_TARGET}
@ovindex target
@ovindex target_cpu
@ovindex target_vendor
@ovindex target_os
Compute the canonical target-system type variable, @code{target}, and its
three individual parts @code{target_cpu}, @code{target_vendor}, and
@code{target_os}.

If @option{--target} was specified, then @code{target} is the
canonicalization of @code{target_alias} by @command{config.sub},
otherwise it defaults to @code{host}.
@end defmac

Note that there can be artifacts due to the backward compatibility
code.  @xref{Hosts and Cross-Compilation}, for more.

@node Using System Type
@section Using the System Type

In @file{configure.ac} the system type is generally used by one or more
@code{case} statements to select system-specifics.  Shell wildcards can
be used to match a group of system types.

For example, an extra assembler code object file could be chosen, giving
access to a CPU cycle counter register.  @code{$(CYCLE_OBJ)} in the
following would be used in a makefile to add the object to a
program or library.

@example
AS_CASE([$host],
  [aarch64*-*-*], [CYCLE_OBJ=pmccntr.o],
  [i?86-*-*],     [CYCLE_OBJ=rdtsc.o],
  [CYCLE_OBJ=""])
AC_SUBST([CYCLE_OBJ])
@end example

@code{AC_CONFIG_LINKS} (@pxref{Configuration Links}) is another good way
to select variant source files, for example optimized code for some
CPUs.  The configured CPU type doesn't always indicate exact CPU types,
so some runtime capability checks may be necessary too.

@example
AS_CASE([$host],
  [aarch64*-*-*], [AC_CONFIG_LINKS([dither.c:aarch64/dither.c])],
  [powerpc*-*-*], [AC_CONFIG_LINKS([dither.c:powerpc/dither.c])],
  [AC_CONFIG_LINKS([dither.c:generic/dither.c])])
@end example

The host system type can also be used to find cross-compilation tools
with @code{AC_CHECK_TOOL} (@pxref{Generic Programs}).

The above examples all show @samp{$host}, since this is where the code
is going to run.  Only rarely is it necessary to test @samp{$build}
(which is where the build is being done).

Whenever you're tempted to use @samp{$host} it's worth considering
whether some sort of probe would be better.  New system types come along
periodically or previously missing features are added.  Well-written
probes can adapt themselves to such things, but hard-coded lists of
names can't.  Here are some guidelines,

@itemize @bullet
@item
Availability of libraries and library functions should always be checked
by probing.
@item
Variant behavior of system calls is best identified with runtime tests
if possible, but bug workarounds or obscure difficulties might have to
be driven from @samp{$host}.
@item
Assembler code is inevitably highly CPU-specific and is best selected
according to @samp{$host_cpu}.
@item
Assembler variations like underscore prefix on globals or ELF versus
COFF type directives are however best determined by probing, perhaps
even examining the compiler output.
@end itemize

@samp{$target} is for use by a package creating a compiler or similar.
For ordinary packages it's meaningless and should not be used.  It
indicates what the created compiler should generate code for, if it can
cross-compile.  @samp{$target} generally selects various hard-coded CPU
and system conventions, since usually the compiler or tools under
construction themselves determine how the target works.


@c ===================================================== Site Configuration.

@node Site Configuration
@chapter Site Configuration

@command{configure} scripts support several kinds of local configuration
decisions.  There are ways for users to specify where external software
packages are, include or exclude optional features, install programs
under modified names, and set default values for @command{configure}
options.

@menu
* Help Formatting::             Customizing @samp{configure --help}
* External Software::           Working with other optional software
* Package Options::             Selecting optional features
* Pretty Help Strings::         Formatting help string
* Option Checking::             Controlling checking of @command{configure} options
* Site Details::                Configuring site details
* Transforming Names::          Changing program names when installing
* Site Defaults::               Giving @command{configure} local defaults
@end menu

@node Help Formatting
@section Controlling Help Output

Users consult @samp{configure --help} to learn of configuration
decisions specific to your package.  By default, @command{configure}
breaks this output into sections for each type of option; within each
section, help strings appear in the order @file{configure.ac} defines
them:

@example
Optional Features:
  @dots{}
  --enable-bar            include bar

Optional Packages:
  @dots{}
  --with-foo              use foo
@end example

@defmac AC_PRESERVE_HELP_ORDER
@acindex{PRESERVE_HELP_ORDER}

Request an alternate @option{--help} format, in which options of all
types appear together, in the order defined.  Call this macro before any
@code{AC_ARG_ENABLE} or @code{AC_ARG_WITH}.

@example
Optional Features and Packages:
  @dots{}
  --enable-bar            include bar
  --with-foo              use foo
@end example

@end defmac

@node External Software
@section Working With External Software
@cindex External software

Some packages require, or can optionally use, other software packages
that are already installed.  The user can give @command{configure}
command line options to specify which such external software to use.
The options have one of these forms:

@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
@c awful.
@example
--with-@var{package}@r{[}=@var{arg}@r{]}
--without-@var{package}
@end example

For example, @option{--with-gnu-ld} means work with the GNU linker
instead of some other linker.  @option{--with-x} means work with The X
Window System.

The user can give an argument by following the package name with
@samp{=} and the argument.  Giving an argument of @samp{no} is for
packages that are used by default; it says to @emph{not} use the
package.  An argument that is neither @samp{yes} nor @samp{no} could
include a name or number of a version of the other package, to specify
more precisely which other package this program is supposed to work
with.  If no argument is given, it defaults to @samp{yes}.
@option{--without-@var{package}} is equivalent to
@option{--with-@var{package}=no}.

Normally @command{configure} scripts complain about
@option{--with-@var{package}} options that they do not support.
@xref{Option Checking}, for details, and for how to override the
defaults.

For each external software package that may be used, @file{configure.ac}
should call @code{AC_ARG_WITH} to detect whether the @command{configure}
user asked to use it.  Whether each package is used or not by default,
and which arguments are valid, is up to you.

@anchor{AC_ARG_WITH}
@defmac AC_ARG_WITH (@var{package}, @var{help-string}, @
  @ovar{action-if-given}, @ovar{action-if-not-given})
@acindex{ARG_WITH}
If the user gave @command{configure} the option @option{--with-@var{package}}
or @option{--without-@var{package}}, run shell commands
@var{action-if-given}.  If neither option was given, run shell commands
@var{action-if-not-given}.  The name @var{package} indicates another
software package that this program should work with.  It should consist
only of alphanumeric characters, dashes, plus signs, and dots.

The option's argument is available to the shell commands
@var{action-if-given} in the shell variable @code{withval}, which is
actually just the value of the shell variable named
@code{with_@var{package}}, with any non-alphanumeric characters in
@var{package} changed into @samp{_}.  You may use that variable instead,
if you wish.

Note that @var{action-if-not-given} is not expanded until the point that
@code{AC_ARG_WITH} was expanded.  If you need the value of
@code{with_@var{package}} set to a default value by the time argument
parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS}
diversion (@pxref{m4_divert_text}) (if done as an argument to
@code{AC_ARG_WITH}, also provide non-diverted text to avoid a shell
syntax error).

The argument @var{help-string} is a description of the option that
looks like this:
@example
  --with-readline         support fancy command line editing
@end example

@noindent
@var{help-string} may be more than one line long, if more detail is
needed.  Just make sure the columns line up in @samp{configure
--help}.  Avoid tabs in the help string.  The easiest way to provide the
proper leading whitespace is to format your @var{help-string} with the macro
@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).

The following example shows how to use the @code{AC_ARG_WITH} macro in
a common situation.  You want to let the user decide whether to enable
support for an external library (e.g., the readline library); if the user
specified neither @option{--with-readline} nor @option{--without-readline},
you want to enable support for readline only if the library is available
on the system.

@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
@example
AC_ARG_WITH([readline],
  [AS_HELP_STRING([--with-readline],
    [support fancy command line editing @@<:@@default=check@@:>@@])],
  [],
  [: m4_divert_text([DEFAULTS], [with_readline=check])])

LIBREADLINE=
AS_IF([test "x$with_readline" != xno],
  [AC_CHECK_LIB([readline], [main],
    [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
     AC_DEFINE([HAVE_LIBREADLINE], [1],
               [Define if you have libreadline])
    ],
    [if test "x$with_readline" != xcheck; then
       AC_MSG_FAILURE(
         [--with-readline was given, but test for readline failed])
     fi
    ], -lncurses)])
@end example

The next example shows how to use @code{AC_ARG_WITH} to give the user the
possibility to enable support for the readline library, in case it is still
experimental and not well tested, and is therefore disabled by default.

@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
@example
AC_ARG_WITH([readline],
  [AS_HELP_STRING([--with-readline],
    [enable experimental support for readline])],
  [],
  [with_readline=no])

LIBREADLINE=
AS_IF([test "x$with_readline" != xno],
  [AC_CHECK_LIB([readline], [main],
    [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
     AC_DEFINE([HAVE_LIBREADLINE], [1],
               [Define if you have libreadline])
    ],
    [AC_MSG_FAILURE(
       [--with-readline was given, but test for readline failed])],
    [-lncurses])])
@end example

The last example shows how to use @code{AC_ARG_WITH} to give the user the
possibility to disable support for the readline library, given that it is
an important feature and that it should be enabled by default.

@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
@example
AC_ARG_WITH([readline],
  [AS_HELP_STRING([--without-readline],
    [disable support for readline])],
  [],
  [with_readline=yes])

LIBREADLINE=
AS_IF([test "x$with_readline" != xno],
  [AC_CHECK_LIB([readline], [main],
    [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
     AC_DEFINE([HAVE_LIBREADLINE], [1],
               [Define if you have libreadline])
    ],
    [AC_MSG_FAILURE(
       [readline test failed (--without-readline to disable)])],
    [-lncurses])])
@end example

These three examples can be easily adapted to the case where
@code{AC_ARG_ENABLE} should be preferred to @code{AC_ARG_WITH} (see
@ref{Package Options}).
@end defmac

@node Package Options
@section Choosing Package Options
@cindex Package options
@cindex Options, package

If a software package has optional compile-time features, the user can
give @command{configure} command line options to specify whether to
compile them.  The options have one of these forms:

@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
@c awful.
@example
--enable-@var{feature}@r{[}=@var{arg}@r{]}
--disable-@var{feature}
@end example

These options allow users to choose which optional features to build and
install.  @option{--enable-@var{feature}} options should never make a
feature behave differently or cause one feature to replace another.
They should only cause parts of the program to be built rather than left
out.

The user can give an argument by following the feature name with
@samp{=} and the argument.  Giving an argument of @samp{no} requests
that the feature @emph{not} be made available.  A feature with an
argument looks like @option{--enable-debug=stabs}.  If no argument is
given, it defaults to @samp{yes}.  @option{--disable-@var{feature}} is
equivalent to @option{--enable-@var{feature}=no}.

Normally @command{configure} scripts complain about
@option{--enable-@var{package}} options that they do not support.
@xref{Option Checking}, for details, and for how to override the
defaults.

For each optional feature, @file{configure.ac} should call
@code{AC_ARG_ENABLE} to detect whether the @command{configure} user asked
to include it.  Whether each feature is included or not by default, and
which arguments are valid, is up to you.

@anchor{AC_ARG_ENABLE}
@defmac AC_ARG_ENABLE (@var{feature}, @var{help-string}, @
  @ovar{action-if-given}, @ovar{action-if-not-given})
@acindex{ARG_ENABLE}
If the user gave @command{configure} the option
@option{--enable-@var{feature}} or @option{--disable-@var{feature}}, run
shell commands @var{action-if-given}.  If neither option was given, run
shell commands @var{action-if-not-given}.  The name @var{feature}
indicates an optional user-level facility.  It should consist only of
alphanumeric characters, dashes, plus signs, and dots.

The option's argument is available to the shell commands
@var{action-if-given} in the shell variable @code{enableval}, which is
actually just the value of the shell variable named
@code{enable_@var{feature}}, with any non-alphanumeric characters in
@var{feature} changed into @samp{_}.  You may use that variable instead,
if you wish.  The @var{help-string} argument is like that of
@code{AC_ARG_WITH} (@pxref{External Software}).

Note that @var{action-if-not-given} is not expanded until the point that
@code{AC_ARG_ENABLE} was expanded.  If you need the value of
@code{enable_@var{feature}} set to a default value by the time argument
parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS}
diversion (@pxref{m4_divert_text}) (if done as an argument to
@code{AC_ARG_ENABLE}, also provide non-diverted text to avoid a shell
syntax error).

You should format your @var{help-string} with the macro
@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).

See the examples suggested with the definition of @code{AC_ARG_WITH}
(@pxref{External Software}) to get an idea of possible applications of
@code{AC_ARG_ENABLE}.
@end defmac

@node Pretty Help Strings
@section Making Your Help Strings Look Pretty
@cindex Help strings

Properly formatting the @samp{help strings} which are used in
@code{AC_ARG_WITH} (@pxref{External Software}) and @code{AC_ARG_ENABLE}
(@pxref{Package Options}) can be challenging.  Specifically, you want
your own @samp{help strings} to line up in the appropriate columns of
@samp{configure --help} just like the standard Autoconf @samp{help
strings} do.  This is the purpose of the @code{AS_HELP_STRING} macro.

@anchor{AS_HELP_STRING}
@defmac AS_HELP_STRING (@var{left-hand-side}, @var{right-hand-side} @
  @dvar{indent-column, 26}, @dvar{wrap-column, 79})
@asindex{HELP_STRING}

Expands into a help string that looks pretty when the user executes
@samp{configure --help}.  It is typically used in @code{AC_ARG_WITH}
(@pxref{External Software}) or @code{AC_ARG_ENABLE} (@pxref{Package
Options}).  The following example makes this clearer.

@example
AC_ARG_WITH([foo],
  [AS_HELP_STRING([--with-foo],
     [use foo (default is no)])],
  [use_foo=$withval],
  [use_foo=no])
@end example

Then the last few lines of @samp{configure --help} appear like
this:

@example
--enable and --with options recognized:
  --with-foo              use foo (default is no)
@end example

Macro expansion is performed on the first argument.  However, the second
argument of @code{AS_HELP_STRING} is treated as a whitespace separated
list of text to be reformatted, and is not subject to macro expansion.
Since it is not expanded, it should not be double quoted.
@xref{Autoconf Language}, for a more detailed explanation.

The @code{AS_HELP_STRING} macro is particularly helpful when the
@var{left-hand-side} and/or @var{right-hand-side} are composed of macro
arguments, as shown in the following example.  Be aware that
@var{left-hand-side} may not expand to unbalanced quotes,
although quadrigraphs can be used.

@example
AC_DEFUN([MY_ARG_WITH],
  [AC_ARG_WITH(m4_translit([[$1]], [_], [-]),
     [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])],
                     [use $1 (default is $2)])],
     [use_[]$1=$withval],
     [use_[]$1=$2])])
MY_ARG_WITH([a_b], [no])
@end example
@noindent
Here, the last few lines of @samp{configure --help} will include:

@example
--enable and --with options recognized:
  --with-a-b              use a_b (default is no)
@end example

The parameters @var{indent-column} and @var{wrap-column} were introduced
in Autoconf 2.62.  Generally, they should not be specified; they exist
for fine-tuning of the wrapping.
@example
AS_HELP_STRING([--option], [description of option])
@result{}  --option                description of option
AS_HELP_STRING([--option], [description of option], [15], [30])
@result{}  --option     description of
@result{}               option
@end example
@end defmac


@node Option Checking
@section Controlling Checking of @command{configure} Options
@cindex Options, Package

The @command{configure} script checks its command-line options against a
list of known options, like @option{--help} or @option{--config-cache}.
An unknown option ordinarily indicates a mistake by the user and
@command{configure} halts with an error.  However, by default unknown
@option{--with-@var{package}} and @option{--enable-@var{feature}}
options elicit only a warning, to support configuring entire source
trees.

Source trees often contain multiple packages with a top-level
@command{configure} script that uses the @code{AC_CONFIG_SUBDIRS} macro
(@pxref{Subdirectories}).  Because the packages generally support
different @option{--with-@var{package}} and
@option{--enable-@var{feature}} options, the GNU Coding
Standards say they must accept unrecognized options without halting.
Even a warning message is undesirable here, so @code{AC_CONFIG_SUBDIRS}
automatically disables the warnings.

This default behavior may be modified in two ways.  First, the installer
can invoke @code{configure --disable-option-checking} to disable
these warnings, or invoke @code{configure --enable-option-checking=fatal}
options to turn them into fatal errors, respectively.  Second, the
maintainer can use @code{AC_DISABLE_OPTION_CHECKING}.

@defmac AC_DISABLE_OPTION_CHECKING
@acindex{DISABLE_OPTION_CHECKING}

By default, disable warnings related to any unrecognized
@option{--with-@var{package}} or @option{--enable-@var{feature}}
options.  This is implied by @code{AC_CONFIG_SUBDIRS}.

The installer can override this behavior by passing
@option{--enable-option-checking} (enable warnings) or
@option{--enable-option-checking=fatal} (enable errors) to
@command{configure}.
@end defmac


@node Site Details
@section Configuring Site Details
@cindex Site details

Some software packages require complex site-specific information.  Some
examples are host names to use for certain services, company names, and
email addresses to contact.  Since some configuration scripts generated
by Metaconfig ask for such information interactively, people sometimes
wonder how to get that information in Autoconf-generated configuration
scripts, which aren't interactive.

Such site configuration information should be put in a file that is
edited @emph{only by users}, not by programs.  The location of the file
can either be based on the @code{prefix} variable, or be a standard
location such as the user's home directory.  It could even be specified
by an environment variable.  The programs should examine that file at
runtime, rather than at compile time.  Runtime configuration is more
convenient for users and makes the configuration process simpler than
getting the information while configuring.  @xref{Directory Variables, ,
Variables for Installation Directories, standards, The GNU Coding
Standards}, for more information on where to put data files.

@node Transforming Names
@section Transforming Program Names When Installing
@cindex Transforming program names
@cindex Program names, transforming

Autoconf supports changing the names of programs when installing them.
In order to use these transformations, @file{configure.ac} must call the
macro @code{AC_ARG_PROGRAM}.

@defmac AC_ARG_PROGRAM
@acindex{ARG_PROGRAM}
@ovindex program_transform_name
Place in output variable @code{program_transform_name} a sequence of
@code{sed} commands for changing the names of installed programs.

If any of the options described below are given to @command{configure},
program names are transformed accordingly.  Otherwise, if
@code{AC_CANONICAL_TARGET} has been called and a @option{--target} value
is given, the target type followed by a dash is used as a prefix.
Otherwise, no program name transformation is done.
@end defmac

@menu
* Transformation Options::      @command{configure} options to transform names
* Transformation Examples::     Sample uses of transforming names
* Transformation Rules::        Makefile uses of transforming names
@end menu

@node Transformation Options
@subsection Transformation Options

You can specify name transformations by giving @command{configure} these
command line options:

@table @option
@item --program-prefix=@var{prefix}
prepend @var{prefix} to the names;

@item --program-suffix=@var{suffix}
append @var{suffix} to the names;

@item --program-transform-name=@var{expression}
perform @code{sed} substitution @var{expression} on the names.
@end table

@node Transformation Examples
@subsection Transformation Examples

These transformations are useful with programs that can be part of a
cross-compilation development environment.  For example, a
cross-assembler running on x86-64 configured with
@option{--target=aarch64-linux-gnu} is normally installed as
@file{aarch64-linux-gnu-as}, rather than @file{as}, which could be confused
with a native x86-64 assembler.

You can force a program name to begin with @file{g}, if you don't want
GNU programs installed on your system to shadow other programs with
the same name.  For example, if you configure GNU @code{diff} with
@option{--program-prefix=g}, then when you run @samp{make install} it is
installed as @file{/usr/local/bin/gdiff}.

As a more sophisticated example, you could use

@example
--program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
@end example
@noindent

to prepend @samp{g} to most of the program names in a source tree,
excepting those like @code{gdb} that already have one and those like
@code{less} and @code{lesskey} that aren't GNU programs.  (That is
assuming that you have a source tree containing those programs that is
set up to use this feature.)

One way to install multiple versions of some programs simultaneously is
to append a version number to the name of one or both.  For example, if
you want to keep Autoconf version 1 around for awhile, you can configure
Autoconf version 2 using @option{--program-suffix=2} to install the
programs as @file{/usr/local/bin/autoconf2},
@file{/usr/local/bin/autoheader2}, etc.  Nevertheless, pay attention
that only the binaries are renamed, therefore you'd have problems with
the library files which might overlap.

@node Transformation Rules
@subsection Transformation Rules

Here is how to use the variable @code{program_transform_name} in a
@file{Makefile.in}:

@example
PROGRAMS = cp ls rm
transform = @@program_transform_name@@
install:
        for p in $(PROGRAMS); do \
          $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
                                              sed '$(transform)'`; \
        done

uninstall:
        for p in $(PROGRAMS); do \
          rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
@c $$ restore font-lock
        done
@end example

It is guaranteed that @code{program_transform_name} is never empty, and
that there are no useless separators.  Therefore you may safely embed
@code{program_transform_name} within a sed program using @samp{;}:

@example
transform = @@program_transform_name@@
transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
@end example

Whether to do the transformations on documentation files (Texinfo or
@code{man}) is a tricky question; there seems to be no perfect answer,
due to the several reasons for name transforming.  Documentation is not
usually particular to a specific architecture, and Texinfo files do not
conflict with system documentation.  But they might conflict with
earlier versions of the same files, and @code{man} pages sometimes do
conflict with system documentation.  As a compromise, it is probably
best to do name transformations on @code{man} pages but not on Texinfo
manuals.

@node Site Defaults
@section Setting Site Defaults
@cindex Site defaults
@cindex config.site

Autoconf-generated @command{configure} scripts allow your site to provide
default values for some configuration values.  You do this by creating
site- and system-wide initialization files.

@evindex CONFIG_SITE
If the environment variable @code{CONFIG_SITE} is set, @command{configure}
uses its value as a space-separated list of shell scripts to read;
it is recommended that these be absolute file names.  Otherwise, it
reads the shell script @file{@var{prefix}/share/config.site} if it exists,
then @file{@var{prefix}/etc/config.site} if it exists.  Thus,
settings in machine-specific files override those in machine-independent
ones in case of conflict.

Site files can be arbitrary shell scripts, but only certain kinds of
code are really appropriate to be in them.  Because @command{configure}
reads any cache file after it has read any site files, a site file can
define a default cache file to be shared between all Autoconf-generated
@command{configure} scripts run on that system (@pxref{Cache Files}).  If
you set a default cache file in a site file, it is a good idea to also
set the output variable @code{CC} in that site file, because the cache
file is only valid for a particular compiler, but many systems have
several available.

You can examine or override the value set by a command line option to
@command{configure} in a site file; options set shell variables that have
the same names as the options, with any dashes turned into underscores.
The exceptions are that @option{--without-} and @option{--disable-} options
are like giving the corresponding @option{--with-} or @option{--enable-}
option and the value @samp{no}.  Thus, @option{--cache-file=localcache}
sets the variable @code{cache_file} to the value @samp{localcache};
@option{--enable-warnings=no} or @option{--disable-warnings} sets the variable
@code{enable_warnings} to the value @samp{no}; @option{--prefix=/usr} sets the
variable @code{prefix} to the value @samp{/usr}; etc.

Site files are also good places to set default values for other output
variables, such as @code{CFLAGS}, if you need to give them non-default
values: anything you would normally do, repetitively, on the command
line.  If you use non-default values for @var{prefix} or
@var{exec_prefix} (wherever you locate the site file), you can set them
in the site file if you specify it with the @code{CONFIG_SITE}
environment variable.

You can set some cache values in the site file itself.  Doing this is
useful if you are cross-compiling, where it is impossible to check features
that require running a test program.  You could ``prime the cache'' by
setting those values correctly for that system in
@file{@var{prefix}/etc/config.site}.  To find out the names of the cache
variables you need to set, see the documentation of the respective
Autoconf macro.  If the variables or their semantics are undocumented,
you may need to look for shell variables with @samp{_cv_} in their names
in the affected @command{configure} scripts, or in the Autoconf M4
source code for those macros; but in that case, their name or semantics
may change in a future Autoconf version.

The cache file is careful to not override any variables set in the site
files.  Similarly, you should not override command-line options in the
site files.  Your code should check that variables such as @code{prefix}
and @code{cache_file} have their default values (as set near the top of
@command{configure}) before changing them.

Here is a sample file @file{/usr/share/local/@/gnu/share/@/config.site}.  The
command @samp{configure --prefix=/usr/share/local/gnu} would read this
file (if @code{CONFIG_SITE} is not set to a different file).

@example
# /usr/share/local/gnu/share/config.site for configure
#
# Change some defaults.
test "$prefix" = NONE && prefix=/usr/share/local/gnu
test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
test "$runstatedir" = '$@{localstatedir@}/run' && runstatedir=/run

# Give Autoconf 2.x generated configure scripts a shared default
# cache file for feature test results, architecture-specific.
if test "$cache_file" = /dev/null; then
  cache_file="$prefix/var/config.cache"
  # A cache file is only valid for one C compiler.
  CC=gcc
fi
@end example

@c Leave this use of "File system" rendered as one word, but
@c slightly obfuscated so as not to trigger the syntax-check prohibition.
@cindex File@/system Hierarchy Standard
@cindex FHS

Another use of @file{config.site} is for priming the directory variables
@c "File system", but slightly obfuscated, as above.
in a manner consistent with the File@/system Hierarchy Standard
(FHS).  Once the following file is installed at
@file{/usr/share/config.site}, a user can execute simply
@code{./configure --prefix=/usr} to get all the directories chosen in
the locations recommended by FHS.

@example
# /usr/share/config.site for FHS defaults when installing below /usr,
# and the respective settings were not changed on the command line.
if test "$prefix" = /usr; then
  test "$sysconfdir" = '$@{prefix@}/etc' && sysconfdir=/etc
  test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
  test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
fi
@end example

@cindex @file{lib64}
@cindex 64-bit libraries
Likewise, on platforms where 64-bit libraries are built by default, then
installed in @file{/usr/local/@/lib64} instead of @file{/usr/local/@/lib},
it is appropriate to install @file{/usr/local/@/share/config.site}:

@example
# /usr/local/share/config.site for platforms that prefer
# the directory /usr/local/lib64 over /usr/local/lib.
test "$libdir" = '$@{exec_prefix@}/lib' && libdir='$@{exec_prefix@}/lib64'
@end example


@c ============================================== Running configure Scripts.

@node Running configure Scripts
@chapter Running @command{configure} Scripts
@cindex @command{configure}

Below are instructions on how to configure a package that uses a
@command{configure} script, suitable for inclusion as an @file{INSTALL}
file in the package.  A plain-text version of @file{INSTALL} which you
may use comes with Autoconf.

@menu
* Basic Installation::          Instructions for typical cases
* Installation Prerequisites::  What you need to install
* Compilers and Options::       Selecting compilers and optimization
* Multiple Architectures::      Compiling for multiple architectures at once
* Installation Names::          Installing in different directories
* Optional Features::           Selecting optional features
* System Types::                Specifying a system type
* Sharing Defaults::            Setting site-wide defaults for @command{configure}
* Defining Variables::          Specifying the compiler etc.
* configure Invocation::        Changing how @command{configure} runs
@end menu

@set autoconf
@include install.texi


@c ============================================== config.status Invocation

@node config.status Invocation
@chapter config.status Invocation
@cindex @command{config.status}

The @command{configure} script creates a file named @file{config.status},
which actually configures, @dfn{instantiates}, the template files.  It
also records the configuration options that were specified when the
package was last configured in case reconfiguring is needed.

Synopsis:
@example
./config.status @ovar{option}@dots{} @ovar{tag}@dots{}
@end example

It configures each @var{tag}; if none are specified, all the templates
are instantiated.  A @var{tag} refers to a file or other tag associated
with a configuration action, as specified by an @code{AC_CONFIG_@var{ITEMS}}
macro (@pxref{Configuration Actions}).  The files must be specified
without their dependencies, as in

@example
./config.status foobar
@end example

@noindent
not

@example
./config.status foobar:foo.in:bar.in
@end example

The supported options are:

@table @option
@item --help
@itemx -h
Print a summary of the command line options, the list of the template
files, and exit.

@item --version
@itemx -V
Print the version number of Autoconf and the configuration settings,
and exit.

@item --config
Print the configuration settings in reusable way, quoted for the shell,
and exit.  For example, for a debugging build that otherwise reuses the
configuration from a different build directory @var{build-dir} of a
package in @var{src-dir}, you could use the following:

@example
args=`@var{build-dir}/config.status --config`
eval @var{src-dir}/configure "$args" CFLAGS=-g --srcdir=@var{src-dir}
@end example

@noindent
Note that it may be necessary to override a @option{--srcdir} setting
that was saved in the configuration, if the arguments are used in a
different build directory.

@item --silent
@itemx --quiet
@itemx -q
Do not print progress messages.

@item --debug
@itemx -d
Don't remove the temporary files.

@item --file=@var{file}[:@var{template}]
Require that @var{file} be instantiated as if
@samp{AC_CONFIG_FILES(@var{file}:@var{template})} was used.  Both
@var{file} and @var{template} may be @samp{-} in which case the standard
output and/or standard input, respectively, is used.  If a
@var{template} file name is relative, it is first looked for in the build
tree, and then in the source tree.  @xref{Configuration Actions}, for
more details.

This option and the following ones provide one way for separately
distributed packages to share the values computed by @command{configure}.
Doing so can be useful if some of the packages need a superset of the
features that one of them, perhaps a common library, does.  These
options allow a @file{config.status} file to create files other than the
ones that its @file{configure.ac} specifies, so it can be used for a
different package, or for extracting a subset of values.  For example,

@example
echo '@@CC@@' | ./config.status --file=-
@end example

@noindent
provides the value of @code{@@CC@@} on standard output.

@item --header=@var{file}[:@var{template}]
Same as @option{--file} above, but with @samp{AC_CONFIG_HEADERS}.

@item --recheck
Ask @file{config.status} to update itself and exit (no instantiation).
This option is useful if you change @command{configure}, so that the
results of some tests might be different from the previous run.  The
@option{--recheck} option reruns @command{configure} with the same arguments
you used before, plus the @option{--no-create} option, which prevents
@command{configure} from running @file{config.status} and creating
@file{Makefile} and other files, and the @option{--no-recursion} option,
which prevents @command{configure} from running other @command{configure}
scripts in subdirectories.  (This is so other Make rules can
run @file{config.status} when it changes; @pxref{Automatic Remaking},
for an example).
@end table

@file{config.status} checks several optional environment variables that
can alter its behavior:

@anchor{CONFIG_SHELL}
@defvar CONFIG_SHELL
@evindex CONFIG_SHELL
The shell with which to run @command{configure}.  It must be
Bourne-compatible, and the absolute name of the shell should be passed.
The default is a shell that supports @code{LINENO} if available, and
@file{/bin/sh} otherwise.
@end defvar

@defvar CONFIG_STATUS
@evindex CONFIG_STATUS
The file name to use for the shell script that records the
configuration.  The default is @file{./config.status}.  This variable is
useful when one package uses parts of another and the @command{configure}
scripts shouldn't be merged because they are maintained separately.
@end defvar

You can use @file{./config.status} in your makefiles.  For example, in
the dependencies given above (@pxref{Automatic Remaking}),
@file{config.status} is run twice when @file{configure.ac} has changed.
If that bothers you, you can make each run only regenerate the files for
that rule:
@example
@group
config.h: stamp-h
stamp-h: config.h.in config.status
        ./config.status config.h
        echo > stamp-h

Makefile: Makefile.in config.status
        ./config.status Makefile
@end group
@end example

The calling convention of @file{config.status} has changed; see
@ref{Obsolete config.status Use}, for details.


@c =================================================== Obsolete Constructs

@node Obsolete Constructs
@chapter Obsolete Constructs
@cindex Obsolete constructs

Autoconf changes, and throughout the years some constructs have been
obsoleted.  Most of the changes involve the macros, but in some cases
the tools themselves, or even some concepts, are now considered
obsolete.

You may completely skip this chapter if you are new to Autoconf.  Its
intention is mainly to help maintainers updating their packages by
understanding how to move to more modern constructs.

@menu
* Obsolete config.status Use::  Obsolete convention for @command{config.status}
* acconfig Header::             Additional entries in @file{config.h.in}
* autoupdate Invocation::       Automatic update of @file{configure.ac}
* Obsolete Macros::             Backward compatibility macros
* Autoconf 1::                  Tips for upgrading your files
* Autoconf 2.13::               Some fresher tips
@end menu

@node Obsolete config.status Use
@section Obsolete @file{config.status} Invocation

@file{config.status} now supports arguments to specify the files to
instantiate; see @ref{config.status Invocation}, for more details.
Before, environment variables had to be used.

@defvar CONFIG_COMMANDS
@evindex CONFIG_COMMANDS
The tags of the commands to execute.  The default is the arguments given
to @code{AC_OUTPUT} and @code{AC_CONFIG_COMMANDS} in
@file{configure.ac}.
@end defvar

@defvar CONFIG_FILES
@evindex CONFIG_FILES
The files in which to perform @samp{@@@var{variable}@@} substitutions.
The default is the arguments given to @code{AC_OUTPUT} and
@code{AC_CONFIG_FILES} in @file{configure.ac}.
@end defvar

@defvar CONFIG_HEADERS
@evindex CONFIG_HEADERS
The files in which to substitute C @code{#define} statements.  The
default is the arguments given to @code{AC_CONFIG_HEADERS}; if that
macro was not called, @file{config.status} ignores this variable.
@end defvar

@defvar CONFIG_LINKS
@evindex CONFIG_LINKS
The symbolic links to establish.  The default is the arguments given to
@code{AC_CONFIG_LINKS}; if that macro was not called,
@file{config.status} ignores this variable.
@end defvar

In @ref{config.status Invocation}, using this old interface, the example
would be:

@example
@group
config.h: stamp-h
stamp-h: config.h.in config.status
        CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
          CONFIG_HEADERS=config.h ./config.status
        echo > stamp-h

Makefile: Makefile.in config.status
        CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
          CONFIG_FILES=Makefile ./config.status
@end group
@end example

@noindent
(If @file{configure.ac} does not call @code{AC_CONFIG_HEADERS}, there is
no need to set @code{CONFIG_HEADERS} in the @command{make} rules.  Equally
for @code{CONFIG_COMMANDS}, etc.)


@node acconfig Header
@section @file{acconfig.h}

@cindex @file{acconfig.h}
@cindex @file{config.h.top}
@cindex @file{config.h.bot}

In order to produce @file{config.h.in}, @command{autoheader} needs to
build or to find templates for each symbol.  Modern releases of Autoconf
use @code{AH_VERBATIM} and @code{AH_TEMPLATE} (@pxref{Autoheader
Macros}), but in older releases a file, @file{acconfig.h}, contained the
list of needed templates.  @command{autoheader} copied comments and
@code{#define} and @code{#undef} statements from @file{acconfig.h} in
the current directory, if present.  This file used to be mandatory if
you @code{AC_DEFINE} any additional symbols.

Modern releases of Autoconf also provide @code{AH_TOP} and
@code{AH_BOTTOM} if you need to prepend/append some information to
@file{config.h.in}.  Ancient versions of Autoconf had a similar feature:
if @file{./acconfig.h} contains the string @samp{@@TOP@@},
@command{autoheader} copies the lines before the line containing
@samp{@@TOP@@} into the top of the file that it generates.  Similarly,
if @file{./acconfig.h} contains the string @samp{@@BOTTOM@@},
@command{autoheader} copies the lines after that line to the end of the
file it generates.  Either or both of those strings may be omitted.  An
even older alternate way to produce the same effect in ancient versions
of Autoconf is to create the files @file{@var{file}.top} (typically
@file{config.h.top}) and/or @file{@var{file}.bot} in the current
directory.  If they exist, @command{autoheader} copies them to the
beginning and end, respectively, of its output.

In former versions of Autoconf, the files used in preparing a software
package for distribution were:
@example
@group
configure.ac --.   .------> autoconf* -----> configure
               +---+
[aclocal.m4] --+   `---.
[acsite.m4] ---'       |
                       +--> [autoheader*] -> [config.h.in]
[acconfig.h] ----.     |
                 +-----'
[config.h.top] --+
[config.h.bot] --'
@end group
@end example

Using only the @code{AH_} macros, @file{configure.ac} should be
self-contained, and should not depend upon @file{acconfig.h} etc.


@node autoupdate Invocation
@section Using @command{autoupdate} to Modernize @file{configure.ac}
@cindex @command{autoupdate}

The @command{autoupdate} program updates a @file{configure.ac} file that
calls Autoconf macros by their old names to use the current macro names.
In version 2 of Autoconf, most of the macros were renamed to use a more
uniform and descriptive naming scheme.  @xref{Macro Names}, for a
description of the new scheme.  Although the old names still work
(@pxref{Obsolete Macros}, for a list of the old macros and the corresponding
new names), you can make your @file{configure.ac} files more readable
and make it easier to use the current Autoconf documentation if you
update them to use the new macro names.

@evindex SIMPLE_BACKUP_SUFFIX
If given no arguments, @command{autoupdate} updates @file{configure.ac},
backing up the original version with the suffix @file{~} (or the value
of the environment variable @code{SIMPLE_BACKUP_SUFFIX}, if that is
set).  If you give @command{autoupdate} an argument, it reads that file
instead of @file{configure.ac} and writes the updated file to the
standard output.

@noindent
@command{autoupdate} accepts the following options:

@table @option
@item --help
@itemx -h
Print a summary of the command line options and exit.

@item --version
@itemx -V
Print the version number of Autoconf and exit.

@item --verbose
@itemx -v
Report processing steps.

@item --debug
@itemx -d
Don't remove the temporary files.

@item --force
@itemx -f
Force the update even if the file has not changed.  Disregard the cache.

@item --include=@var{dir}
@itemx -I @var{dir}
Also look for input files in @var{dir}.  Multiple invocations accumulate.
Directories are browsed from last to first.

@item --prepend-include=@var{dir}
@itemx -B @var{dir}
Prepend directory @var{dir} to the search path.  This is used to include
the language-specific files before any third-party macros.
@end table

@node Obsolete Macros
@section Obsolete Macros

Several macros are obsoleted in Autoconf, for various reasons (typically
they failed to quote properly, couldn't be extended for more recent
issues, etc.).  They are still supported, but deprecated: their use
should be avoided.

During the jump from Autoconf version 1 to version 2, most of the
macros were renamed to use a more uniform and descriptive naming scheme,
but their signature did not change.  @xref{Macro Names}, for a
description of the new naming scheme.  Below, if there is just the mapping
from old names to new names for these macros, the reader is invited to
refer to the definition of the new macro for the signature and the
description.

@defmac AC_AIX
@acindex{AIX}
@cvindex _ALL_SOURCE
This macro is a platform-specific subset of
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
@end defmac

@defmac AC_ALLOCA
@acindex{ALLOCA}
Replaced by @code{AC_FUNC_ALLOCA} (@pxref{AC_FUNC_ALLOCA}).
@end defmac

@defmac AC_ARG_ARRAY
@acindex{ARG_ARRAY}
Removed because of limited usefulness.
@end defmac

@defmac AC_C_CROSS
@acindex{C_CROSS}
This macro is obsolete; it does nothing.
@end defmac

@defmac AC_C_LONG_DOUBLE
@acindex{C_LONG_DOUBLE}
@cvindex HAVE_LONG_DOUBLE
If the C compiler supports a working @code{long double} type with more
range or precision than the @code{double} type, define
@code{HAVE_LONG_DOUBLE}.

You should use @code{AC_TYPE_LONG_DOUBLE} or
@code{AC_TYPE_LONG_DOUBLE_WIDER} instead.  @xref{Particular Types}.
@end defmac

@defmac AC_CANONICAL_SYSTEM
@acindex{CANONICAL_SYSTEM}
Determine the system type and set output variables to the names of the
canonical system types.  @xref{Canonicalizing}, for details about the
variables this macro sets.

The user is encouraged to use either @code{AC_CANONICAL_BUILD}, or
@code{AC_CANONICAL_HOST}, or @code{AC_CANONICAL_TARGET}, depending on
the needs.  Using @code{AC_CANONICAL_TARGET} is enough to run the two
other macros (@pxref{Canonicalizing}).
@end defmac

@defmac AC_CHAR_UNSIGNED
@acindex{CHAR_UNSIGNED}
Replaced by @code{AC_C_CHAR_UNSIGNED} (@pxref{AC_C_CHAR_UNSIGNED}).
@end defmac

@defmac AC_CHECK_TYPE (@var{type}, @var{default})
@acindex{CHECK_TYPE}
Autoconf, up to 2.13, used to provide this version of
@code{AC_CHECK_TYPE}, deprecated because of its flaws.  First, although
it is a member of the @code{CHECK} clan, it does
more than just checking.  Secondly, missing types are defined
using @code{#define}, not @code{typedef}, and this can lead to
problems in the case of pointer types.

This use of @code{AC_CHECK_TYPE} is obsolete and discouraged; see
@ref{Generic Types}, for the description of the current macro.

If the type @var{type} is not defined, define it to be the C (or C++)
builtin type @var{default}, e.g., @samp{short int} or @samp{unsigned int}.

This macro is equivalent to:

@example
AC_CHECK_TYPE([@var{type}], [],
  [AC_DEFINE_UNQUOTED([@var{type}], [@var{default}],
     [Define to '@var{default}'
      if <sys/types.h> does not define.])])
@end example

In order to keep backward compatibility, the two versions of
@code{AC_CHECK_TYPE} are implemented, selected using these heuristics:

@enumerate
@item
If there are three or four arguments, the modern version is used.

@item
If the second argument appears to be a C or C++ type, then the
obsolete version is used.  This happens if the argument is a C or C++
@emph{builtin} type or a C identifier ending in @samp{_t}, optionally
followed by one of @samp{[(* } and then by a string of zero or more
characters taken from the set @samp{[]()* _a-zA-Z0-9}.

@item
If the second argument is spelled with the alphabet of valid C and C++
types, the user is warned and the modern version is used.

@item
Otherwise, the modern version is used.
@end enumerate

@noindent
You are encouraged either to use a valid builtin type, or to use the
equivalent modern code (see above), or better yet, to use
@code{AC_CHECK_TYPES} together with

@example
#ifndef HAVE_LOFF_T
typedef loff_t off_t;
#endif
@end example
@end defmac
@c end of AC_CHECK_TYPE

@defmac AC_CHECKING (@var{feature-description})
@acindex{CHECKING}
Same as

@example
AC_MSG_NOTICE([checking @var{feature-description}@dots{}]
@end example

@noindent
@xref{AC_MSG_NOTICE}.
@end defmac

@defmac AC_COMPILE_CHECK (@var{echo-text}, @var{includes}, @
  @var{function-body}, @var{action-if-true}, @ovar{action-if-false})
@acindex{COMPILE_CHECK}
This is an obsolete version of @code{AC_TRY_COMPILE} itself replaced by
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}), with the
addition that it prints @samp{checking for @var{echo-text}} to the
standard output first, if @var{echo-text} is non-empty.  Use
@code{AC_MSG_CHECKING} and @code{AC_MSG_RESULT} instead to print
messages (@pxref{Printing Messages}).
@end defmac

@defmac AC_CONST
@acindex{CONST}
Replaced by @code{AC_C_CONST} (@pxref{AC_C_CONST}).
@end defmac

@defmac AC_CROSS_CHECK
@acindex{CROSS_CHECK}
Same as @code{AC_C_CROSS}, which is obsolete too, and does nothing
@code{:-)}.
@end defmac

@defmac AC_CYGWIN
@acindex{CYGWIN}
@evindex CYGWIN
Check for the Cygwin environment in which case the shell variable
@code{CYGWIN} is set to @samp{yes}.  Don't use this macro, the dignified
means to check the nature of the host is using @code{AC_CANONICAL_HOST}
(@pxref{Canonicalizing}).  As a matter of fact this macro is defined as:

@example
AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
case $host_os in
  *cygwin* ) CYGWIN=yes;;
         * ) CYGWIN=no;;
esac
@end example

Beware that the variable @env{CYGWIN} has a special meaning when
running Cygwin, and should not be changed.  That's yet another reason
not to use this macro.
@end defmac

@defmac AC_DECL_SYS_SIGLIST
@acindex{DECL_SYS_SIGLIST}
@cvindex SYS_SIGLIST_DECLARED
Same as:

@example
AC_CHECK_DECLS([sys_siglist], [], [],
[#include <signal.h>
/* NetBSD declares sys_siglist in unistd.h.  */
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
])
@end example

@noindent
@xref{AC_CHECK_DECLS}.
@end defmac

@defmac AC_DECL_YYTEXT
@acindex{DECL_YYTEXT}
Does nothing, now integrated in @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
@end defmac

@defmac AC_DIAGNOSE (@var{category}, @var{message})
@acindex{DIAGNOSE}
Replaced by @code{m4_warn} (@pxref{m4_warn}).
@end defmac

@defmac AC_DIR_HEADER
@acindex{DIR_HEADER}
@cvindex DIRENT
@cvindex SYSNDIR
@cvindex SYSDIR
@cvindex NDIR
Like calling @code{AC_FUNC_CLOSEDIR_VOID}
(@pxref{AC_FUNC_CLOSEDIR_VOID}) and @code{AC_HEADER_DIRENT}
(@pxref{AC_HEADER_DIRENT}),
but defines a different set of C preprocessor macros to indicate which
header file is found:

@multitable {@file{sys/ndir.h}} {Old Symbol} {@code{HAVE_SYS_NDIR_H}}
@item Header            @tab Old Symbol     @tab New Symbol
@item @file{dirent.h}   @tab @code{DIRENT}  @tab @code{HAVE_DIRENT_H}
@item @file{sys/ndir.h} @tab @code{SYSNDIR} @tab @code{HAVE_SYS_NDIR_H}
@item @file{sys/dir.h}  @tab @code{SYSDIR}  @tab @code{HAVE_SYS_DIR_H}
@item @file{ndir.h}     @tab @code{NDIR}    @tab @code{HAVE_NDIR_H}
@end multitable
@end defmac

@defmac AC_DYNIX_SEQ
@acindex{DYNIX_SEQ}
If on DYNIX/ptx, add @option{-lseq} to output variable
@code{LIBS}.  This macro used to be defined as

@example
AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])
@end example

@noindent
now it is just @code{AC_FUNC_GETMNTENT} (@pxref{AC_FUNC_GETMNTENT}).
@end defmac

@defmac AC_EXEEXT
@acindex{EXEEXT}
@ovindex EXEEXT
Defined the output variable @code{EXEEXT} based on the output of the
compiler, which is now done automatically.  Typically set to empty
string if POSIX and @samp{.exe} if a DOS variant.
@end defmac

@defmac AC_EMXOS2
@acindex{EMXOS2}
Similar to @code{AC_CYGWIN} but checks for the EMX environment on OS/2
and sets @code{EMXOS2}.  Don't use this macro, the dignified means to
check the nature of the host is using @code{AC_CANONICAL_HOST}
(@pxref{Canonicalizing}).
@end defmac

@defmac AC_ENABLE (@var{feature}, @var{action-if-given}, @
  @ovar{action-if-not-given})
@acindex{ENABLE}
This is an obsolete version of @code{AC_ARG_ENABLE} that does not
support providing a help string (@pxref{AC_ARG_ENABLE}).
@end defmac

@defmac AC_ERROR
@acindex{ERROR}
Replaced by @code{AC_MSG_ERROR} (@pxref{AC_MSG_ERROR}).
@end defmac

@defmac AC_FATAL (@var{message})
@acindex{FATAL}
Replaced by @code{m4_fatal} (@pxref{m4_fatal}).
@end defmac

@defmac AC_FIND_X
@acindex{FIND_X}
Replaced by @code{AC_PATH_X} (@pxref{AC_PATH_X}).
@end defmac

@defmac AC_FIND_XTRA
@acindex{FIND_XTRA}
Replaced by @code{AC_PATH_XTRA} (@pxref{AC_PATH_XTRA}).
@end defmac

@defmac AC_FOREACH
@acindex{FOREACH}
Replaced by @code{m4_foreach_w} (@pxref{m4_foreach_w}).
@end defmac

@defmac AC_FUNC_CHECK
@acindex{FUNC_CHECK}
Replaced by @code{AC_CHECK_FUNC} (@pxref{AC_CHECK_FUNC}).
@end defmac

@anchor{AC_FUNC_SETVBUF_REVERSED}
@defmac AC_FUNC_SETVBUF_REVERSED
@acindex{FUNC_SETVBUF_REVERSED}
@cvindex SETVBUF_REVERSED
@c @fuindex setvbuf
@prindex @code{setvbuf}
Do nothing.  Formerly, this macro checked whether @code{setvbuf} takes
the buffering type as its second argument and the buffer pointer as the
third, instead of the other way around, and defined
@code{SETVBUF_REVERSED}.  However, the last systems to have the problem
were those based on SVR2, which became obsolete in 1987, and the macro
is no longer needed.
@end defmac

@defmac AC_FUNC_WAIT3
@acindex{FUNC_WAIT3}
@cvindex HAVE_WAIT3
@c @fuindex wait3
@prindex @code{wait3}
If @code{wait3} is found and fills in the contents of its third argument
(a @samp{struct rusage *}), which HP-UX does not do, define
@code{HAVE_WAIT3}.

These days portable programs should use @code{waitpid}, not
@code{wait3}, as @code{wait3} has been removed from POSIX.
@end defmac

@defmac AC_GCC_TRADITIONAL
@acindex{GCC_TRADITIONAL}
Replaced by @code{AC_PROG_GCC_TRADITIONAL} (@pxref{AC_PROG_GCC_TRADITIONAL}),
which is itself obsolete.
@end defmac

@defmac AC_GETGROUPS_T
@acindex{GETGROUPS_T}
Replaced by @code{AC_TYPE_GETGROUPS} (@pxref{AC_TYPE_GETGROUPS}).
@end defmac

@defmac AC_GETLOADAVG
@acindex{GETLOADAVG}
Replaced by @code{AC_FUNC_GETLOADAVG} (@pxref{AC_FUNC_GETLOADAVG}).
@end defmac

@defmac AC_GNU_SOURCE
@acindex{GNU_SOURCE}
@cvindex _GNU_SOURCE
This macro is a platform-specific subset of
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
@end defmac

@defmac AC_HAVE_FUNCS
@acindex{HAVE_FUNCS}
Replaced by @code{AC_CHECK_FUNCS} (@pxref{AC_CHECK_FUNCS}).
@end defmac

@defmac AC_HAVE_HEADERS
@acindex{HAVE_HEADERS}
Replaced by @code{AC_CHECK_HEADERS} (@pxref{AC_CHECK_HEADERS}).
@end defmac

@defmac AC_HAVE_LIBRARY (@var{library}, @ovar{action-if-found}, @
  @ovar{action-if-not-found}, @ovar{other-libraries})
@acindex{HAVE_LIBRARY}
This macro is equivalent to calling @code{AC_CHECK_LIB} with a
@var{function} argument of @code{main}.  In addition, @var{library} can
be written as any of @samp{foo}, @option{-lfoo}, or @samp{libfoo.a}.  In
all of those cases, the compiler is passed @option{-lfoo}.  However,
@var{library} cannot be a shell variable; it must be a literal name.
@xref{AC_CHECK_LIB}.
@end defmac

@defmac AC_HAVE_POUNDBANG
@acindex{HAVE_POUNDBANG}
Replaced by @code{AC_SYS_INTERPRETER} (@pxref{AC_SYS_INTERPRETER}).
@end defmac

@defmac AC_HEADER_CHECK
@acindex{HEADER_CHECK}
Replaced by @code{AC_CHECK_HEADER} (@pxref{AC_CHECK_HEADER}).
@end defmac

@defmac AC_HEADER_EGREP
@acindex{HEADER_EGREP}
Replaced by @code{AC_EGREP_HEADER} (@pxref{AC_EGREP_HEADER}).
@end defmac

@anchor{AC_HEADER_TIME}
@defmac AC_HEADER_TIME
@acindex{HEADER_TIME}
@cvindex TIME_WITH_SYS_TIME
@hdrindex{time.h}
@hdrindex{sys/time.h}
@caindex header_time
This macro used to check whether it was possible to include
@file{time.h} and @file{sys/time.h} in the same source file,
defining @code{TIME_WITH_SYS_TIME} if so.

Nowadays, it is equivalent to @samp{AC_CHECK_HEADERS([sys/time.h])},
although it does still define @code{TIME_WITH_SYS_TIME} for
compatibility's sake.  @file{time.h} is universally present, and the
systems on which @file{sys/time.h} conflicted with @file{time.h} are
obsolete.
@end defmac

@defmac AC_HELP_STRING
@acindex{HELP_STRING}
Replaced by @code{AS_HELP_STRING} (@pxref{AS_HELP_STRING}).
@end defmac

@defmac AC_INIT (@var{unique-file-in-source-dir})
@acindex{INIT}
Formerly @code{AC_INIT} used to have a single argument, and was
equivalent to:

@example
AC_INIT
AC_CONFIG_SRCDIR(@var{unique-file-in-source-dir})
@end example
See @ref{AC_INIT} and @ref{AC_CONFIG_SRCDIR}.
@end defmac

@defmac AC_INLINE
@acindex{INLINE}
Replaced by @code{AC_C_INLINE} (@pxref{AC_C_INLINE}).
@end defmac

@defmac AC_INT_16_BITS
@acindex{INT_16_BITS}
@cvindex INT_16_BITS
If the C type @code{int} is 16 bits wide, define @code{INT_16_BITS}.
Use @samp{AC_CHECK_SIZEOF(int)} instead (@pxref{AC_CHECK_SIZEOF}).
@end defmac

@defmac AC_IRIX_SUN
@acindex{IRIX_SUN}
If on IRIX (Silicon Graphics Unix), add @option{-lsun} to output
@code{LIBS}.  If you were using it to get @code{getmntent}, use
@code{AC_FUNC_GETMNTENT} instead.  If you used it for the NIS versions
of the password and group functions, use @samp{AC_CHECK_LIB(sun,
getpwnam)}.  Up to Autoconf 2.13, it used to be

@example
AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])
@end example

@noindent
now it is defined as

@example
AC_FUNC_GETMNTENT
AC_CHECK_LIB([sun], [getpwnam])
@end example

@noindent
See @ref{AC_FUNC_GETMNTENT} and @ref{AC_CHECK_LIB}.
@end defmac

@defmac AC_ISC_POSIX
@acindex{ISC_POSIX}
@ovindex LIBS
This macro adds @option{-lcposix} to output variable @code{LIBS} if
necessary for POSIX facilities.  Sun dropped support for the obsolete
INTERACTIVE Systems Corporation Unix on 2006-07-23.  New programs
need not use this macro.  It is implemented as
@code{AC_SEARCH_LIBS([strerror], [cposix])} (@pxref{AC_SEARCH_LIBS}).
@end defmac

@defmac AC_LANG_C
@acindex{LANG_C}
Same as @samp{AC_LANG([C])} (@pxref{AC_LANG}).
@end defmac

@defmac AC_LANG_CPLUSPLUS
@acindex{LANG_CPLUSPLUS}
Same as @samp{AC_LANG([C++])} (@pxref{AC_LANG}).
@end defmac

@defmac AC_LANG_FORTRAN77
@acindex{LANG_FORTRAN77}
Same as @samp{AC_LANG([Fortran 77])} (@pxref{AC_LANG}).
@end defmac

@defmac AC_LANG_RESTORE
@acindex{LANG_RESTORE}
Select the @var{language} that is saved on the top of the stack, as set
by @code{AC_LANG_SAVE}, remove it from the stack, and call
@code{AC_LANG(@var{language})}.  @xref{Language Choice}, for the
preferred way to change languages.
@end defmac

@defmac AC_LANG_SAVE
@acindex{LANG_SAVE}
Remember the current language (as set by @code{AC_LANG}) on a stack.
The current language does not change.  @code{AC_LANG_PUSH} is preferred
(@pxref{AC_LANG_PUSH}).
@end defmac

@defmac AC_LINK_FILES (@var{source}@dots{}, @var{dest}@dots{})
@acindex{LINK_FILES}
This is an obsolete version of @code{AC_CONFIG_LINKS}
(@pxref{AC_CONFIG_LINKS}.  An updated version of:

@example
AC_LINK_FILES(config/$machine.h config/$obj_format.h,
              host.h            object.h)
@end example

@noindent
is:

@example
AC_CONFIG_LINKS([host.h:config/$machine.h
                object.h:config/$obj_format.h])
@end example
@end defmac

@defmac AC_LN_S
@acindex{LN_S}
Replaced by @code{AC_PROG_LN_S} (@pxref{AC_PROG_LN_S}).
@end defmac

@defmac AC_LONG_64_BITS
@acindex{LONG_64_BITS}
@cvindex LONG_64_BITS
Define @code{LONG_64_BITS} if the C type @code{long int} is 64 bits wide.
Use the generic macro @samp{AC_CHECK_SIZEOF([long int])} instead
(@pxref{AC_CHECK_SIZEOF}).
@end defmac

@defmac AC_LONG_DOUBLE
@acindex{LONG_DOUBLE}
If the C compiler supports a working @code{long double} type with more
range or precision than the @code{double} type, define
@code{HAVE_LONG_DOUBLE}.

You should use @code{AC_TYPE_LONG_DOUBLE} or
@code{AC_TYPE_LONG_DOUBLE_WIDER} instead.  @xref{Particular Types}.
@end defmac

@defmac AC_LONG_FILE_NAMES
@acindex{LONG_FILE_NAMES}
Replaced by
@example
AC_SYS_LONG_FILE_NAMES
@end example
@noindent
@xref{AC_SYS_LONG_FILE_NAMES}.
@end defmac

@defmac AC_MAJOR_HEADER
@acindex{MAJOR_HEADER}
Replaced by @code{AC_HEADER_MAJOR} (@pxref{AC_HEADER_MAJOR}).
@end defmac

@defmac AC_MEMORY_H
@acindex{MEMORY_H}
@cvindex NEED_MEMORY_H
Used to define @code{NEED_MEMORY_H} if the @code{mem} functions were
defined in @file{memory.h}.  Today it is equivalent to
@samp{AC_CHECK_HEADERS([memory.h])} (@pxref{AC_CHECK_HEADERS}).  Adjust
your code to get the @code{mem} functions from @file{string.h} instead.
@end defmac

@defmac AC_MINGW32
@acindex{MINGW32}
Similar to @code{AC_CYGWIN} but checks for the MinGW compiler
environment and sets @code{MINGW32}.  Don't use this macro, the
dignified means to check the nature of the host is using
@code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
@end defmac

@defmac AC_MINIX
@acindex{MINIX}
@cvindex _MINIX
@cvindex _POSIX_SOURCE
@cvindex _POSIX_1_SOURCE
This macro is a platform-specific subset of
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
@end defmac

@defmac AC_MINUS_C_MINUS_O
@acindex{MINUS_C_MINUS_O}
Replaced by @code{AC_PROG_CC_C_O} (@pxref{AC_PROG_CC_C_O}).
@end defmac

@defmac AC_MMAP
@acindex{MMAP}
Replaced by @code{AC_FUNC_MMAP} (@pxref{AC_FUNC_MMAP}).
@end defmac

@defmac AC_MODE_T
@acindex{MODE_T}
Replaced by @code{AC_TYPE_MODE_T} (@pxref{AC_TYPE_MODE_T}).
@end defmac

@defmac AC_OBJEXT
@acindex{OBJEXT}
@ovindex OBJEXT
Defined the output variable @code{OBJEXT} based on the output of the
compiler, after .c files have been excluded.  Typically set to @samp{o}
if POSIX, @samp{obj} if a DOS variant.
Now the compiler checking macros handle
this automatically.
@end defmac

@defmac AC_OBSOLETE (@var{this-macro-name}, @ovar{suggestion})
@acindex{OBSOLETE}
Make M4 print a message to the standard error output warning that
@var{this-macro-name} is obsolete, and giving the file and line number
where it was called.  @var{this-macro-name} should be the name of the
macro that is calling @code{AC_OBSOLETE}.  If @var{suggestion} is given,
it is printed at the end of the warning message; for example, it can be
a suggestion for what to use instead of @var{this-macro-name}.

For instance

@example
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
@end example

@noindent
You are encouraged to use @code{AU_DEFUN} instead, since it gives better
services to the user (@pxref{AU_DEFUN}).
@end defmac

@defmac AC_OFF_T
@acindex{OFF_T}
Replaced by @code{AC_TYPE_OFF_T} (@pxref{AC_TYPE_OFF_T}).
@end defmac

@defmac AC_OUTPUT (@ovar{file}@dots{}, @ovar{extra-cmds}, @ovar{init-cmds})
@acindex{OUTPUT}
The use of @code{AC_OUTPUT} with arguments is deprecated.  This obsoleted
interface is equivalent to:

@example
@group
AC_CONFIG_FILES(@var{file}@dots{})
AC_CONFIG_COMMANDS([default],
                   @var{extra-cmds}, @var{init-cmds})
AC_OUTPUT
@end group
@end example

@noindent
See @ref{AC_CONFIG_FILES}, @ref{AC_CONFIG_COMMANDS}, and @ref{AC_OUTPUT}.
@end defmac

@defmac AC_OUTPUT_COMMANDS (@var{extra-cmds}, @ovar{init-cmds})
@acindex{OUTPUT_COMMANDS}
Specify additional shell commands to run at the end of
@file{config.status}, and shell commands to initialize any variables
from @command{configure}.  This macro may be called multiple times.  It is
obsolete, replaced by @code{AC_CONFIG_COMMANDS} (@pxref{AC_CONFIG_COMMANDS}).

Here is an unrealistic example:

@example
fubar=27
AC_OUTPUT_COMMANDS(
  [AS_ECHO(["this is extra $fubar, and so on."])],
  [fubar=$fubar])
AC_OUTPUT_COMMANDS(
  [AS_ECHO(["this is another, extra, bit"])],
  [AS_ECHO(["init bit"])])
@end example

Aside from the fact that @code{AC_CONFIG_COMMANDS} requires an
additional key, an important difference is that
@code{AC_OUTPUT_COMMANDS} is quoting its arguments twice, unlike
@code{AC_CONFIG_COMMANDS}.  This means that @code{AC_CONFIG_COMMANDS}
can safely be given macro calls as arguments:

@example
AC_CONFIG_COMMANDS(foo, [my_FOO()])
@end example

@noindent
Conversely, where one level of quoting was enough for literal strings
with @code{AC_OUTPUT_COMMANDS}, you need two with
@code{AC_CONFIG_COMMANDS}.  The following lines are equivalent:

@example
@group
AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
@end group
@end example
@end defmac

@defmac AC_PID_T
@acindex{PID_T}
Replaced by @code{AC_TYPE_PID_T} (@pxref{AC_TYPE_PID_T}).
@end defmac

@defmac AC_PREFIX
@acindex{PREFIX}
Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}).
@end defmac

@defmac AC_PROG_CC_C89
@acindex{PROG_CC_C89}
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
@end defmac

@defmac AC_PROG_CC_C99
@acindex{PROG_CC_C99}
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
@end defmac

@defmac AC_PROG_CC_STDC
@acindex{PROG_CC_STDC}
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
@end defmac

@anchor{AC_PROG_GCC_TRADITIONAL}
@defmac AC_PROG_GCC_TRADITIONAL
@acindex{PROG_GCC_TRADITIONAL}
Used to put GCC into ``traditional'' (pre-ISO C) compilation mode,
on systems with headers that did not work correctly with a
standard-compliant compiler.  GCC has not supported traditional
compilation in many years, and all of the systems that required this are
long obsolete themselves.  This macro is now a compatibility synonym for
@code{AC_PROG_CC} (@pxref{AC_PROG_CC}).

@end defmac

@defmac AC_PROGRAMS_CHECK
@acindex{PROGRAMS_CHECK}
Replaced by @code{AC_CHECK_PROGS} (@pxref{AC_CHECK_PROGS}).
@end defmac

@defmac AC_PROGRAMS_PATH
@acindex{PROGRAMS_PATH}
Replaced by @code{AC_PATH_PROGS} (@pxref{AC_PATH_PROGS}).
@end defmac

@defmac AC_PROGRAM_CHECK
@acindex{PROGRAM_CHECK}
Replaced by @code{AC_CHECK_PROG} (@pxref{AC_CHECK_PROG}).
@end defmac

@defmac AC_PROGRAM_EGREP
@acindex{PROGRAM_EGREP}
Replaced by @code{AC_EGREP_CPP} (@pxref{AC_EGREP_CPP}).
@end defmac

@defmac AC_PROGRAM_PATH
@acindex{PROGRAM_PATH}
Replaced by @code{AC_PATH_PROG} (@pxref{AC_PATH_PROG}).
@end defmac

@defmac AC_REMOTE_TAPE
@acindex{REMOTE_TAPE}
Removed because of limited usefulness.
@end defmac

@defmac AC_RESTARTABLE_SYSCALLS
@acindex{RESTARTABLE_SYSCALLS}
This macro was renamed @code{AC_SYS_RESTARTABLE_SYSCALLS}.  However,
these days portable programs should use @code{sigaction} with
@code{SA_RESTART} if they want restartable system calls.  They should
not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
system call is restartable is a dynamic issue, not a configuration-time
issue.
@end defmac

@defmac AC_RETSIGTYPE
@acindex{RETSIGTYPE}
Replaced by @code{AC_TYPE_SIGNAL} (@pxref{AC_TYPE_SIGNAL}), which itself
is obsolete.
@end defmac

@defmac AC_RSH
@acindex{RSH}
Removed because of limited usefulness.
@end defmac

@defmac AC_SCO_INTL
@acindex{SCO_INTL}
@ovindex LIBS
Equivalent to the obsolescent macro @code{AC_FUNC_STRFTIME}.
@xref{AC_FUNC_STRFTIME}.
@end defmac

@defmac AC_SETVBUF_REVERSED
@acindex{SETVBUF_REVERSED}
Replaced by
@example
AC_FUNC_SETVBUF_REVERSED
@end example
@noindent
@xref{AC_FUNC_SETVBUF_REVERSED}.
@end defmac

@defmac AC_SET_MAKE
@acindex{SET_MAKE}
Replaced by @code{AC_PROG_MAKE_SET} (@pxref{AC_PROG_MAKE_SET}).
@end defmac

@defmac AC_SIZEOF_TYPE
@acindex{SIZEOF_TYPE}
Replaced by @code{AC_CHECK_SIZEOF} (@pxref{AC_CHECK_SIZEOF}).
@end defmac

@defmac AC_SIZE_T
@acindex{SIZE_T}
Replaced by @code{AC_TYPE_SIZE_T} (@pxref{AC_TYPE_SIZE_T}).
@end defmac

@defmac AC_STAT_MACROS_BROKEN
@acindex{STAT_MACROS_BROKEN}
Replaced by @code{AC_HEADER_STAT} (@pxref{AC_HEADER_STAT}).
@end defmac

@defmac AC_STDC_HEADERS
@acindex{STDC_HEADERS}
Replaced by @code{AC_HEADER_STDC} (@pxref{AC_HEADER_STDC}), which
is itself obsolete.  Nowadays it is safe to assume the facilities of C89
exist.
@end defmac

@defmac AC_STRCOLL
@acindex{STRCOLL}
Replaced by @code{AC_FUNC_STRCOLL} (@pxref{AC_FUNC_STRCOLL}).
@end defmac

@defmac AC_STRUCT_ST_BLKSIZE
@acindex{STRUCT_ST_BLKSIZE}
@cvindex HAVE_STRUCT_STAT_ST_BLKSIZE
@cvindex HAVE_ST_BLKSIZE
If @code{struct stat} contains an @code{st_blksize} member, define
@code{HAVE_STRUCT_STAT_ST_BLKSIZE}.  The former name,
@code{HAVE_ST_BLKSIZE} is to be avoided, as its support will cease in
the future.  This macro is obsoleted, and should be replaced by

@example
AC_CHECK_MEMBERS([struct stat.st_blksize])
@end example
@noindent
@xref{AC_CHECK_MEMBERS}.
@end defmac

@defmac AC_STRUCT_ST_RDEV
@acindex{STRUCT_ST_RDEV}
@cvindex HAVE_ST_RDEV
@cvindex HAVE_STRUCT_STAT_ST_RDEV
If @code{struct stat} contains an @code{st_rdev} member, define
@code{HAVE_STRUCT_STAT_ST_RDEV}.  The former name for this macro,
@code{HAVE_ST_RDEV}, is to be avoided as it will cease to be supported
in the future.  Actually, even the new macro is obsolete and should be
replaced by:
@example
AC_CHECK_MEMBERS([struct stat.st_rdev])
@end example
@noindent
@xref{AC_CHECK_MEMBERS}.
@end defmac

@defmac AC_ST_BLKSIZE
@acindex{ST_BLKSIZE}
Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
@end defmac

@defmac AC_ST_BLOCKS
@acindex{ST_BLOCKS}
Replaced by @code{AC_STRUCT_ST_BLOCKS} (@pxref{AC_STRUCT_ST_BLOCKS}).
@end defmac

@defmac AC_ST_RDEV
@acindex{ST_RDEV}
Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
@end defmac

@defmac AC_SYS_RESTARTABLE_SYSCALLS
@acindex{SYS_RESTARTABLE_SYSCALLS}
@cvindex HAVE_RESTARTABLE_SYSCALLS
If the system automatically restarts a system call that is interrupted
by a signal, define @code{HAVE_RESTARTABLE_SYSCALLS}.  This macro does
not check whether system calls are restarted in general---it checks whether a
signal handler installed with @code{signal} (but not @code{sigaction})
causes system calls to be restarted.  It does not check whether system calls
can be restarted when interrupted by signals that have no handler.

These days portable programs should use @code{sigaction} with
@code{SA_RESTART} if they want restartable system calls.  They should
not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
system call is restartable is a dynamic issue, not a configuration-time
issue.
@end defmac

@defmac AC_SYS_SIGLIST_DECLARED
@acindex{SYS_SIGLIST_DECLARED}
This macro was renamed @code{AC_DECL_SYS_SIGLIST}.  However, even that
name is obsolete, as the same functionality is now achieved via
@code{AC_CHECK_DECLS} (@pxref{AC_CHECK_DECLS}).
@end defmac

@defmac AC_TEST_CPP
@acindex{TEST_CPP}
This macro was renamed @code{AC_TRY_CPP}, which in turn was replaced by
@code{AC_PREPROC_IFELSE} (@pxref{AC_PREPROC_IFELSE}).
@end defmac

@defmac AC_TEST_PROGRAM
@acindex{TEST_PROGRAM}
This macro was renamed @code{AC_TRY_RUN}, which in turn was replaced by
@code{AC_RUN_IFELSE} (@pxref{AC_RUN_IFELSE}).
@end defmac

@defmac AC_TIMEZONE
@acindex{TIMEZONE}
Replaced by @code{AC_STRUCT_TIMEZONE} (@pxref{AC_STRUCT_TIMEZONE}).
@end defmac

@defmac AC_TIME_WITH_SYS_TIME
@acindex{TIME_WITH_SYS_TIME}
Replaced by @code{AC_HEADER_TIME} (@pxref{AC_HEADER_TIME}), which is
itself obsolete; nowadays one need only do
@samp{AC_CHECK_HEADERS([sys/time.h])}.
@end defmac

@defmac AC_TRY_COMPILE (@var{includes}, @var{function-body}, @
  @ovar{action-if-true}, @ovar{action-if-false})
@acindex{TRY_COMPILE}
Same as:

@example
AC_COMPILE_IFELSE(
  [AC_LANG_PROGRAM([[@var{includes}]],
     [[@var{function-body}]])],
  [@var{action-if-true}],
  [@var{action-if-false}])
@end example

@noindent
@xref{Running the Compiler}.

This macro double quotes both @var{includes} and @var{function-body}.

For C and C++, @var{includes} is any @code{#include} statements needed
by the code in @var{function-body} (@var{includes} is ignored if
the currently selected language is Fortran or Fortran 77).  The compiler
and compilation flags are determined by the current language
(@pxref{Language Choice}).
@end defmac

@defmac AC_TRY_CPP (@var{input}, @ovar{action-if-true}, @ovar{action-if-false})
@acindex{TRY_CPP}
Same as:

@example
AC_PREPROC_IFELSE(
  [AC_LANG_SOURCE([[@var{input}]])],
  [@var{action-if-true}],
  [@var{action-if-false}])
@end example

@noindent
@xref{Running the Preprocessor}.

This macro double quotes the @var{input}.
@end defmac

@defmac AC_TRY_LINK (@var{includes}, @var{function-body}, @
  @ovar{action-if-true}, @ovar{action-if-false})
@acindex{TRY_LINK}
Same as:

@example
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM([[@var{includes}]],
     [[@var{function-body}]])],
  [@var{action-if-true}],
  [@var{action-if-false}])
@end example

@noindent
@xref{Running the Linker}.

This macro double quotes both @var{includes} and @var{function-body}.

Depending on the current language (@pxref{Language Choice}), create a
test program to see whether a function whose body consists of
@var{function-body} can be compiled and linked.  If the file compiles
and links successfully, run shell commands @var{action-if-found},
otherwise run @var{action-if-not-found}.

This macro double quotes both @var{includes} and @var{function-body}.

For C and C++, @var{includes} is any @code{#include} statements needed
by the code in @var{function-body} (@var{includes} is ignored if
the currently selected language is Fortran or Fortran 77).  The compiler
and compilation flags are determined by the current language
(@pxref{Language Choice}), and in addition @code{LDFLAGS} and
@code{LIBS} are used for linking.
@end defmac

@defmac AC_TRY_LINK_FUNC (@var{function}, @ovar{action-if-found}, @
  @ovar{action-if-not-found})
@acindex{TRY_LINK_FUNC}
This macro is equivalent to
@example
AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])],
  [@var{action-if-found}], [@var{action-if-not-found}])
@end example
@noindent
@xref{Running the Linker}.
@end defmac

@defmac AC_TRY_RUN (@var{program}, @ovar{action-if-true}, @
  @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
@acindex{TRY_RUN}
Same as:

@example
AC_RUN_IFELSE(
  [AC_LANG_SOURCE([[@var{program}]])],
  [@var{action-if-true}],
  [@var{action-if-false}],
  [@var{action-if-cross-compiling}])
@end example

@noindent
@xref{Runtime}.
@end defmac

@anchor{AC_TYPE_SIGNAL}
@defmac AC_TYPE_SIGNAL
@acindex{TYPE_SIGNAL}
@cvindex RETSIGTYPE
@hdrindex{signal.h}
If @file{signal.h} declares @code{signal} as returning a pointer to a
function returning @code{void}, define @code{RETSIGTYPE} to be
@code{void}; otherwise, define it to be @code{int}.  These days, it is
portable to assume C89, and that signal handlers return @code{void},
without needing to use this macro or @code{RETSIGTYPE}.
@end defmac

@defmac AC_UID_T
@acindex{UID_T}
Replaced by @code{AC_TYPE_UID_T} (@pxref{AC_TYPE_UID_T}).
@end defmac

@defmac AC_UNISTD_H
@acindex{UNISTD_H}
Same as @samp{AC_CHECK_HEADERS([unistd.h])} (@pxref{AC_CHECK_HEADERS}),
which is one of the tests done as a side effect by
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), so usually
unnecessary to write explicitly.
@end defmac

@defmac AC_USG
@acindex{USG}
@cvindex USG
Define @code{USG} if the BSD string functions (@code{bcopy},
@code{bzero}, @code{index}, @code{rindex}, etc) are @emph{not} defined
in @file{strings.h}.  Modern code should assume @file{string.h} exists
and should use the standard C string functions (@code{memmove}, @code{memset},
@code{strchr}, @code{strrchr}, etc) unconditionally.

@file{strings.h} may be the only header that declares @code{strcasecmp},
@code{strncasecmp}, and @code{ffs}.  @code{AC_INCLUDES_DEFAULT} checks
for it (@pxref{Default Includes}); test @code{HAVE_STRINGS_H}.
@end defmac

@defmac AC_UTIME_NULL
@acindex{UTIME_NULL}
Replaced by @code{AC_FUNC_UTIME_NULL} (@pxref{AC_FUNC_UTIME_NULL}).
@end defmac

@defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@ovar{cmd})
@acindex{VALIDATE_CACHED_SYSTEM_TUPLE}
If the cache file is inconsistent with the current host, target and
build system types, it used to execute @var{cmd} or print a default
error message.  This is now handled by default.
@end defmac

@defmac AC_VERBOSE (@var{result-description})
@acindex{VERBOSE}
Replaced by @code{AC_MSG_RESULT} (@pxref{AC_MSG_RESULT}).
@end defmac

@defmac AC_VFORK
@acindex{VFORK}
Replaced by @code{AC_FUNC_FORK} (@pxref{AC_FUNC_FORK}).
@end defmac

@defmac AC_VPRINTF
@acindex{VPRINTF}
Replaced by @code{AC_FUNC_VPRINTF} (@pxref{AC_FUNC_VPRINTF}).
@end defmac

@defmac AC_WAIT3
@acindex{WAIT3}
This macro was renamed @code{AC_FUNC_WAIT3}.  However, these days
portable programs should use @code{waitpid}, not @code{wait3}, as
@code{wait3} has been removed from POSIX.
@end defmac

@defmac AC_WARN
@acindex{WARN}
Replaced by @code{AC_MSG_WARN} (@pxref{AC_MSG_WARN}).
@end defmac

@defmac AC_WARNING (@var{message})
@acindex{WARNING}
Replaced by @code{m4_warn} (@pxref{m4_warn}).
@end defmac

@defmac AC_WITH (@var{package}, @var{action-if-given}, @
  @ovar{action-if-not-given})
@acindex{WITH}
This is an obsolete version of @code{AC_ARG_WITH} that does not
support providing a help string (@pxref{AC_ARG_WITH}).
@end defmac

@defmac AC_WORDS_BIGENDIAN
@acindex{WORDS_BIGENDIAN}
Replaced by @code{AC_C_BIGENDIAN} (@pxref{AC_C_BIGENDIAN}).
@end defmac

@defmac AC_XENIX_DIR
@acindex{XENIX_DIR}
@ovindex LIBS
This macro is equivalent to the obsolescent @code{AC_HEADER_DIRENT}
macro, plus it also sets the shell variable @code{XENIX}.
Don't use this macro, the dignified means to check the nature of the
host is using @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
@end defmac

@defmac AC_YYTEXT_POINTER
@acindex{YYTEXT_POINTER}
This macro was renamed @code{AC_DECL_YYTEXT}, which in turn was
integrated into @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
@end defmac

@node Autoconf 1
@section Upgrading From Version 1
@cindex Upgrading autoconf
@cindex Autoconf upgrading

Autoconf version 2 is mostly backward compatible with version 1.
However, it introduces better ways to do some things, and doesn't
support some of the ugly things in version 1.  So, depending on how
sophisticated your @file{configure.ac} files are, you might have to do
some manual work in order to upgrade to version 2.  This chapter points
out some problems to watch for when upgrading.  Also, perhaps your
@command{configure} scripts could benefit from some of the new features in
version 2; the changes are summarized in the file @file{NEWS} in the
Autoconf distribution.

@menu
* Changed File Names::          Files you might rename
* Changed Makefiles::           New things to put in @file{Makefile.in}
* Changed Macros::              Macro calls you might replace
* Changed Results::             Changes in how to check test results
* Changed Macro Writing::       Better ways to write your own macros
@end menu

@node Changed File Names
@subsection Changed File Names

If you have an @file{aclocal.m4} installed with Autoconf (as opposed to
in a particular package's source directory), you must rename it to
@file{acsite.m4}.  @xref{autoconf Invocation}.

If you distribute @file{install.sh} with your package, rename it to
@file{install-sh} so @command{make} builtin rules don't inadvertently
create a file called @file{install} from it.  @code{AC_PROG_INSTALL}
looks for the script under both names, but it is best to use the new name.

If you were using @file{config.h.top}, @file{config.h.bot}, or
@file{acconfig.h}, you still can, but you have less clutter if you
use the @code{AH_} macros.  @xref{Autoheader Macros}.

@node Changed Makefiles
@subsection Changed Makefiles

Add @samp{@@CFLAGS@@}, @samp{@@CPPFLAGS@@}, and @samp{@@LDFLAGS@@} in
your @file{Makefile.in} files, so they can take advantage of the values
of those variables in the environment when @command{configure} is run.
Doing this isn't necessary, but it's a convenience for users.

Also add @samp{@@configure_input@@} in a comment to each input file for
@code{AC_OUTPUT}, so that the output files contain a comment saying
they were produced by @command{configure}.  Automatically selecting the
right comment syntax for all the kinds of files that people call
@code{AC_OUTPUT} on became too much work.

Add @file{config.log} and @file{config.cache} to the list of files you
remove in @code{distclean} targets.

If you have the following in @file{Makefile.in}:

@example
prefix = /usr/local
exec_prefix = $(prefix)
@end example

@noindent
you must change it to:

@example
prefix = @@prefix@@
exec_prefix = @@exec_prefix@@
@end example

@noindent
The old behavior of replacing those variables without @samp{@@}
characters around them has been removed.

@node Changed Macros
@subsection Changed Macros

Many of the macros were renamed in Autoconf version 2.  You can still
use the old names, but the new ones are clearer, and it's easier to find
the documentation for them.  @xref{Obsolete Macros}, for a table showing the
new names for the old macros.  Use the @command{autoupdate} program to
convert your @file{configure.ac} to using the new macro names.
@xref{autoupdate Invocation}.

Some macros have been superseded by similar ones that do the job better,
but are not call-compatible.  If you get warnings about calling obsolete
macros while running @command{autoconf}, you may safely ignore them, but
your @command{configure} script generally works better if you follow
the advice that is printed about what to replace the obsolete macros with.  In
particular, the mechanism for reporting the results of tests has
changed.  If you were using @command{echo} or @code{AC_VERBOSE} (perhaps
via @code{AC_COMPILE_CHECK}), your @command{configure} script's output
looks better if you switch to @code{AC_MSG_CHECKING} and
@code{AC_MSG_RESULT}.  @xref{Printing Messages}.  Those macros work best
in conjunction with cache variables.  @xref{Caching Results}.



@node Changed Results
@subsection Changed Results

If you were checking the results of previous tests by examining the
shell variable @code{DEFS}, you need to switch to checking the values of
the cache variables for those tests.  @code{DEFS} no longer exists while
@command{configure} is running; it is only created when generating output
files.  This difference from version 1 is because properly quoting the
contents of that variable turned out to be too cumbersome and
inefficient to do every time @code{AC_DEFINE} is called.  @xref{Cache
Variable Names}.

For example, here is a @file{configure.ac} fragment written for Autoconf
version 1:

@example
AC_HAVE_FUNCS(syslog)
case "$DEFS" in
*-DHAVE_SYSLOG*) ;;
*) # syslog is not in the default libraries.  See if it's in some other.
  saved_LIBS="$LIBS"
  for lib in bsd socket inet; do
    AC_CHECKING(for syslog in -l$lib)
    LIBS="-l$lib $saved_LIBS"
    AC_HAVE_FUNCS(syslog)
    case "$DEFS" in
    *-DHAVE_SYSLOG*) break ;;
    *) ;;
    esac
    LIBS="$saved_LIBS"
  done ;;
esac
@end example

Here is a way to write it for version 2:

@example
AC_CHECK_FUNCS([syslog])
AS_IF([test "x$ac_cv_func_syslog" = xno],
  [# syslog is not in the default libraries.  See if it's in some other.
   for lib in bsd socket inet; do
     AC_CHECK_LIB([$lib], [syslog],
       [AC_DEFINE([HAVE_SYSLOG])
        LIBS="-l$lib $LIBS"; break])
   done])
@end example

If you were working around bugs in @code{AC_DEFINE_UNQUOTED} by adding
backslashes before quotes, you need to remove them.  It now works
predictably, and does not treat quotes (except back quotes) specially.
@xref{Setting Output Variables}.

All of the Boolean shell variables set by Autoconf macros now use
@samp{yes} for the true value.  Most of them use @samp{no} for false,
though for backward compatibility some use the empty string instead.  If
you were relying on a shell variable being set to something like 1 or
@samp{t} for true, you need to change your tests.

@node Changed Macro Writing
@subsection Changed Macro Writing

When defining your own macros, you should now use @code{AC_DEFUN}
instead of @code{define}.  @code{AC_DEFUN} automatically calls
@code{AC_PROVIDE} and ensures that macros called via @code{AC_REQUIRE}
do not interrupt other macros, to prevent nested @samp{checking@dots{}}
messages on the screen.  There's no actual harm in continuing to use the
older way, but it's less convenient and attractive.  @xref{Macro
Definitions}.

You probably looked at the macros that came with Autoconf as a guide for
how to do things.  It would be a good idea to take a look at the new
versions of them, as the style is somewhat improved and they take
advantage of some new features.

If you were doing tricky things with undocumented Autoconf internals
(macros, variables, diversions), check whether you need to change
anything to account for changes that have been made.  Perhaps you can
even use an officially supported technique in version 2 instead of
kludging.  Or perhaps not.

To speed up your locally written feature tests, add caching to them.
See whether any of your tests are of general enough usefulness to
encapsulate them into macros that you can share.


@node Autoconf 2.13
@section Upgrading From Version 2.13
@cindex Upgrading autoconf
@cindex Autoconf upgrading

The introduction of the previous section (@pxref{Autoconf 1}) perfectly
suits this section@enddots{}

@quotation
Autoconf version 2.50 is mostly backward compatible with version 2.13.
However, it introduces better ways to do some things, and doesn't
support some of the ugly things in version 2.13.  So, depending on how
sophisticated your @file{configure.ac} files are, you might have to do
some manual work in order to upgrade to version 2.50.  This chapter
points out some problems to watch for when upgrading.  Also, perhaps
your @command{configure} scripts could benefit from some of the new
features in version 2.50; the changes are summarized in the file
@file{NEWS} in the Autoconf distribution.
@end quotation

@menu
* Changed Quotation::           Broken code which used to work
* New Macros::                  Interaction with foreign macros
* Hosts and Cross-Compilation::  Bugward compatibility kludges
* AC_LIBOBJ vs LIBOBJS::        LIBOBJS is a forbidden token
* AC_ACT_IFELSE vs AC_TRY_ACT::  A more generic scheme for testing sources
@end menu

@node Changed Quotation
@subsection Changed Quotation

The most important changes are invisible to you: the implementation of
most macros have completely changed.  This allowed more factorization of
the code, better error messages, a higher uniformity of the user's
interface etc.  Unfortunately, as a side effect, some construct which
used to (miraculously) work might break starting with Autoconf 2.50.
The most common culprit is bad quotation.

For instance, in the following example, the message is not properly
quoted:

@example
AC_INIT
AC_CHECK_HEADERS(foo.h, ,
  AC_MSG_ERROR(cannot find foo.h, bailing out))
AC_OUTPUT
@end example

@noindent
Autoconf 2.13 simply ignores it:

@example
$ @kbd{autoconf-2.13; ./configure --silent}
creating cache ./config.cache
configure: error: cannot find foo.h
$
@end example

@noindent
while Autoconf 2.50 produces a broken @file{configure}:

@example
$ @kbd{autoconf-2.50; ./configure --silent}
configure: error: cannot find foo.h
./configure: exit: bad non-numeric arg `bailing'
./configure: exit: bad non-numeric arg `bailing'
$
@end example

The message needs to be quoted, and the @code{AC_MSG_ERROR} invocation
too!

@example
AC_INIT([Example], [1.0], [bug-example@@example.org])
AC_CHECK_HEADERS([foo.h], [],
  [AC_MSG_ERROR([cannot find foo.h, bailing out])])
AC_OUTPUT
@end example

Many many (and many more) Autoconf macros were lacking proper quotation,
including no less than@dots{} @code{AC_DEFUN} itself!

@example
$ @kbd{cat configure.in}
AC_DEFUN([AC_PROG_INSTALL],
[# My own much better version
])
AC_INIT
AC_PROG_INSTALL
AC_OUTPUT
$ @kbd{autoconf-2.13}
autoconf: Undefined macros:
***BUG in Autoconf--please report*** AC_FD_MSG
***BUG in Autoconf--please report*** AC_EPI
configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
configure.in:5:AC_PROG_INSTALL
$ @kbd{autoconf-2.50}
$
@end example


@node New Macros
@subsection New Macros

@cindex undefined macro
@cindex @code{_m4_divert_diversion}

While Autoconf was relatively dormant in the late 1990s, Automake
provided Autoconf-like macros for a while.  Starting with Autoconf 2.50
in 2001, Autoconf provided
versions of these macros, integrated in the @code{AC_} namespace,
instead of @code{AM_}.  But in order to ease the upgrading via
@command{autoupdate}, bindings to such @code{AM_} macros are provided.

Unfortunately older versions of Automake (e.g., Automake 1.4)
did not quote the names of these macros.
Therefore, when @command{m4} finds something like
@samp{AC_DEFUN(AM_TYPE_PTRDIFF_T, @dots{})} in @file{aclocal.m4},
@code{AM_TYPE_PTRDIFF_T} is
expanded, replaced with its Autoconf definition.

Fortunately Autoconf catches pre-@code{AC_INIT} expansions, and
complains, in its own words:

@example
$ @kbd{cat configure.ac}
AC_INIT([Example], [1.0], [bug-example@@example.org])
AM_TYPE_PTRDIFF_T
$ @kbd{aclocal-1.4}
$ @kbd{autoconf}
aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
aclocal.m4:17: the top level
autom4te: m4 failed with exit status: 1
$
@end example

Modern versions of Automake no longer define most of these
macros, and properly quote the names of the remaining macros.
If you must use an old Automake, do not depend upon macros from Automake
as it is simply not its job
to provide macros (but the one it requires itself):

@example
$ @kbd{cat configure.ac}
AC_INIT([Example], [1.0], [bug-example@@example.org])
AM_TYPE_PTRDIFF_T
$ @kbd{rm aclocal.m4}
$ @kbd{autoupdate}
autoupdate: 'configure.ac' is updated
$ @kbd{cat configure.ac}
AC_INIT([Example], [1.0], [bug-example@@example.org])
AC_CHECK_TYPES([ptrdiff_t])
$ @kbd{aclocal-1.4}
$ @kbd{autoconf}
$
@end example


@node Hosts and Cross-Compilation
@subsection Hosts and Cross-Compilation
@cindex Cross compilation

Based on the experience of compiler writers, and after long public
debates, many aspects of the cross-compilation chain have changed:

@itemize @minus
@item
the relationship between the build, host, and target architecture types,

@item
the command line interface for specifying them to @command{configure},

@item
the variables defined in @command{configure},

@item
the enabling of cross-compilation mode.
@end itemize

@sp 1

The relationship between build, host, and target have been cleaned up:
the chain of default is now simply: target defaults to host, host to
build, and build to the result of @command{config.guess}.  Nevertheless,
in order to ease the transition from 2.13 to 2.50, the following
transition scheme is implemented.  @emph{Do not rely on it}, as it will
be completely disabled in a couple of releases (we cannot keep it, as it
proves to cause more problems than it cures).

They all default to the result of running @command{config.guess}, unless
you specify either @option{--build} or @option{--host}.  In this case,
the default becomes the system type you specified.  If you specify both,
and they're different, @command{configure} enters cross compilation
mode, so it doesn't run any tests that require execution.

Hint: if you mean to override the result of @command{config.guess},
prefer @option{--build} over @option{--host}.

@sp 1

For backward compatibility, @command{configure} accepts a system
type as an option by itself.  Such an option overrides the
defaults for build, host, and target system types.  The following
configure statement configures a cross toolchain that runs on
NetBSD/aarch64 but generates code for GNU Hurd/riscv64,
which is also the build platform.

@example
./configure --host=aarch64-netbsd riscv64-gnu
@end example

@sp 1

In Autoconf 2.13 and before, the variables @code{build}, @code{host},
and @code{target} had a different semantics before and after the
invocation of @code{AC_CANONICAL_BUILD} etc.  Now, the argument of
@option{--build} is strictly copied into @code{build_alias}, and is left
empty otherwise.  After the @code{AC_CANONICAL_BUILD}, @code{build} is
set to the canonicalized build type.  To ease the transition, before,
its contents is the same as that of @code{build_alias}.  Do @emph{not}
rely on this broken feature.

For consistency with the backward compatibility scheme exposed above,
when @option{--host} is specified but @option{--build} isn't, the build
system is assumed to be the same as @option{--host}, and
@samp{build_alias} is set to that value.  Eventually, this
historically incorrect behavior will go away.

@sp 1

The former scheme to enable cross-compilation proved to cause more harm
than good, in particular, it used to be triggered too easily, leaving
regular end users puzzled in front of cryptic error messages.
@command{configure} could even enter cross-compilation mode only
because the compiler was not functional.  This is mainly because
@command{configure} used to try to detect cross-compilation, instead of
waiting for an explicit flag from the user.

Now, @command{configure} enters cross-compilation mode if and only if
@option{--host} is passed.

That's the short documentation.  To ease the transition between 2.13 and
its successors, a more complicated scheme is implemented.  @emph{Do not
rely on the following}, as it will be removed in the near future.

If you specify @option{--host}, but not @option{--build}, when
@command{configure} performs the first compiler test it tries to run
an executable produced by the compiler.  If the execution fails, it
enters cross-compilation mode.  This is fragile.  Moreover, by the time
the compiler test is performed, it may be too late to modify the
build-system type: other tests may have already been performed.
Therefore, whenever you specify @option{--host}, be sure to specify
@option{--build} too.

@example
./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64
@end example

@noindent
enters cross-compilation mode.  The former interface, which
consisted in setting the compiler to a cross-compiler without informing
@command{configure} is obsolete.  For instance, @command{configure}
fails if it can't run the code generated by the specified compiler if you
configure as follows:

@example
./configure CC=x86_64-w64-mingw64-gcc
@end example


@node AC_LIBOBJ vs LIBOBJS
@subsection @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}

Up to Autoconf 2.13, the replacement of functions was triggered via the
variable @code{LIBOBJS}.  Since Autoconf 2.50, the macro
@code{AC_LIBOBJ} should be used instead (@pxref{Generic Functions}).
Starting at Autoconf 2.53, the use of @code{LIBOBJS} is an error.

This change is mandated by the unification of the GNU Build System
components.  In particular, the various fragile techniques used to parse
a @file{configure.ac} are all replaced with the use of traces.  As a
consequence, any action must be traceable, which obsoletes critical
variable assignments.  Fortunately, @code{LIBOBJS} was the only problem,
and it can even be handled gracefully (read, ``without your having to
change something'').

There were two typical uses of @code{LIBOBJS}: asking for a replacement
function, and adjusting @code{LIBOBJS} for Automake and/or Libtool.

@sp 1

As for function replacement, the fix is immediate: use
@code{AC_LIBOBJ}.  For instance:

@example
LIBOBJS="$LIBOBJS fnmatch.o"
LIBOBJS="$LIBOBJS malloc.$ac_objext"
@end example

@noindent
should be replaced with:

@example
AC_LIBOBJ([fnmatch])
AC_LIBOBJ([malloc])
@end example

@sp 1

@ovindex LIBOBJDIR
When used with Automake 1.10 or newer, a suitable value for
@code{LIBOBJDIR} is set so that the @code{LIBOBJS} and @code{LTLIBOBJS}
can be referenced from any @file{Makefile.am}.  Even without Automake,
arranging for @code{LIBOBJDIR} to be set correctly enables
referencing @code{LIBOBJS} and @code{LTLIBOBJS} in another directory.
The @code{LIBOBJDIR} feature is experimental.


@node AC_ACT_IFELSE vs AC_TRY_ACT
@subsection @code{AC_@var{ACT}_IFELSE} vs.@: @code{AC_TRY_@var{ACT}}
@c the anchor keeps the old node name, to try to avoid breaking links
@anchor{AC_FOO_IFELSE vs AC_TRY_FOO}

@acindex{@var{ACT}_IFELSE}
@acindex{TRY_@var{ACT}}
Since Autoconf 2.50, internal codes uses @code{AC_PREPROC_IFELSE},
@code{AC_COMPILE_IFELSE}, @code{AC_LINK_IFELSE}, and
@code{AC_RUN_IFELSE} on one hand and @code{AC_LANG_SOURCE},
and @code{AC_LANG_PROGRAM} on the other hand instead of the deprecated
@code{AC_TRY_CPP}, @code{AC_TRY_COMPILE}, @code{AC_TRY_LINK}, and
@code{AC_TRY_RUN}.  The motivations where:
@itemize @minus
@item
a more consistent interface: @code{AC_TRY_COMPILE} etc.@: were double
quoting their arguments;

@item
the combinatorial explosion is solved by decomposing on the one hand the
generation of sources, and on the other hand executing the program;

@item
this scheme helps supporting more languages than plain C and C++.
@end itemize

In addition to the change of syntax, the philosophy has changed too:
while emphasis was put on speed at the expense of accuracy, today's
Autoconf promotes accuracy of the testing framework at, ahem@dots{}, the
expense of speed.


As a perfect example of what is @emph{not} to be done, here is how to
find out whether a header file contains a particular declaration, such
as a typedef, a structure, a structure member, or a function.  Use
@code{AC_EGREP_HEADER} instead of running @code{grep} directly on the
header file; on some systems the symbol might be defined in another
header file that the file you are checking includes.

As a (bad) example, here is how you should not check for C preprocessor
symbols, either defined by header files or predefined by the C
preprocessor: using @code{AC_EGREP_CPP}:

@example
@group
AC_EGREP_CPP(yes,
[#ifdef _AIX
  yes
#endif
], is_aix=yes, is_aix=no)
@end group
@end example

The above example, properly written would (i) use
@code{AC_LANG_PROGRAM}, and (ii) run the compiler:

@example
@group
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#ifndef _AIX
 error: This isn't AIX!
#endif
]])],
                   [is_aix=yes],
                   [is_aix=no])
@end group
@end example


@c ============================= Generating Test Suites with Autotest

@node Using Autotest
@chapter Generating Test Suites with Autotest

@cindex Autotest

@display
@strong{N.B.: This section describes a feature which is still
stabilizing.  Although we believe that Autotest is useful as-is, this
documentation describes an interface which might change in the future:
do not depend upon Autotest without subscribing to the Autoconf mailing
lists.}
@end display

It is paradoxical that portable projects depend on nonportable tools
to run their test suite.  Autoconf by itself is the paragon of this
problem: although it aims at perfectly portability, up to 2.13 its
test suite was using DejaGNU, a rich and complex testing
framework, but which is far from being standard on POSIX systems.
Worse yet, it was likely to be missing on the most fragile platforms,
the very platforms that are most likely to torture Autoconf and
exhibit deficiencies.

To circumvent this problem, many package maintainers have developed their
own testing framework, based on simple shell scripts whose sole outputs
are exit status values describing whether the test succeeded.  Most of
these tests share common patterns, and this can result in lots of
duplicated code and tedious maintenance.

Following exactly the same reasoning that yielded to the inception of
Autoconf, Autotest provides a test suite generation framework, based on
M4 macros building a portable shell script.  The suite itself is
equipped with automatic logging and tracing facilities which greatly
diminish the interaction with bug reporters, and simple timing reports.

Autoconf itself has been using Autotest for years, and we do attest that
it has considerably improved the strength of the test suite and the
quality of bug reports.  Other projects are known to use some generation
of Autotest, such as Bison, GNU Wdiff, GNU Tar, each of
them with different needs, and this usage has validated Autotest as a general
testing framework.

Nonetheless, compared to DejaGNU, Autotest is inadequate for
interactive tool testing, which is probably its main limitation.

@menu
* Using an Autotest Test Suite::  Autotest and the user
* Writing Testsuites::          Autotest macros
* testsuite Invocation::        Running @command{testsuite} scripts
* Making testsuite Scripts::    Using autom4te to create @command{testsuite}
@end menu

@node Using an Autotest Test Suite
@section Using an Autotest Test Suite

@menu
* testsuite Scripts::           The concepts of Autotest
* Autotest Logs::               Their contents
@end menu

@node testsuite Scripts
@subsection @command{testsuite} Scripts

@cindex @command{testsuite}

Generating testing or validation suites using Autotest is rather easy.
The whole validation suite is held in a file to be processed through
@command{autom4te}, itself using GNU M4 under the hood, to
produce a stand-alone Bourne shell script which then gets distributed.
Neither @command{autom4te} nor GNU M4 are needed at
the installer's end.

@cindex test group
Each test of the validation suite should be part of some test group.  A
@dfn{test group} is a sequence of interwoven tests that ought to be
executed together, usually because one test in the group creates data
files that a later test in the same group needs to read.  Complex test
groups make later debugging more tedious.  It is much better to
keep only a few tests per test group.  Ideally there is only one test
per test group.

For all but the simplest packages, some file such as @file{testsuite.at}
does not fully hold all test sources, as these are often easier to
maintain in separate files.  Each of these separate files holds a single
test group, or a sequence of test groups all addressing some common
functionality in the package.  In such cases, @file{testsuite.at}
merely initializes the validation suite, and sometimes does elementary
health checking, before listing include statements for all other test
files.  The special file @file{package.m4}, containing the
identification of the package, is automatically included if found.

A convenient alternative consists in moving all the global issues
(local Autotest macros, elementary health checking, and @code{AT_INIT}
invocation) into the file @code{local.at}, and making
@file{testsuite.at} be a simple list of @code{m4_include}s of sub test
suites.  In such case, generating the whole test suite or pieces of it
is only a matter of choosing the @command{autom4te} command line
arguments.

The validation scripts that Autotest produces are by convention called
@command{testsuite}.  When run, @command{testsuite} executes each test
group in turn, producing only one summary line per test to say if that
particular test succeeded or failed.  At end of all tests, summarizing
counters get printed.  One debugging directory is left for each test
group which failed, if any: such directories are named
@file{testsuite.dir/@var{nn}}, where @var{nn} is the sequence number of
the test group, and they include:

@itemize @bullet
@item a debugging script named @file{run} which reruns the test in
@dfn{debug mode} (@pxref{testsuite Invocation}).  The automatic generation
of debugging scripts has the purpose of easing the chase for bugs.

@item all the files created with @code{AT_DATA}

@item all the Erlang source code files created with @code{AT_CHECK_EUNIT}

@item a log of the run, named @file{testsuite.log}
@end itemize

In the ideal situation, none of the tests fail, and consequently no
debugging directory is left behind for validation.

It often happens in practice that individual tests in the validation
suite need to get information coming out of the configuration process.
Some of this information, common for all validation suites, is provided
through the file @file{atconfig}, automatically created by
@code{AC_CONFIG_TESTDIR}.  For configuration information which your
testing environment specifically needs, you might prepare an optional
file named @file{atlocal.in}, instantiated by @code{AC_CONFIG_FILES}.
The configuration process produces @file{atconfig} and @file{atlocal}
out of these two input files, and these two produced files are
automatically read by the @file{testsuite} script.

Here is a diagram showing the relationship between files.

@noindent
Files used in preparing a software package for distribution:

@example
                [package.m4] -->.
                                 \
subfile-1.at ->.  [local.at] ---->+
    ...         \                  \
subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
    ...         /
subfile-n.at ->'
@end example

@noindent
Files used in configuring a software package:

@example
                                     .--> atconfig
                                    /
[atlocal.in] -->  config.status* --<
                                    \
                                     `--> [atlocal]
@end example

@noindent
Files created during test suite execution:

@example
atconfig -->.                    .--> testsuite.log
             \                  /
              >-- testsuite* --<
             /                  \
[atlocal] ->'                    `--> [testsuite.dir]
@end example


@node Autotest Logs
@subsection Autotest Logs

When run, the test suite creates a log file named after itself, e.g., a
test suite named @command{testsuite} creates @file{testsuite.log}.  It
contains a lot of information, usually more than maintainers actually
need, but therefore most of the time it contains all that is needed:

@table @asis
@item command line arguments
A bad but unfortunately widespread habit consists of
setting environment variables before the command, such as in
@samp{CC=my-home-grown-cc ./testsuite}.  The test suite does not
know this change, hence (i) it cannot report it to you, and (ii)
it cannot preserve the value of @code{CC} for subsequent runs.
Autoconf faced exactly the same problem, and solved it by asking
users to pass the variable definitions as command line arguments.
Autotest requires this rule, too, but has no means to enforce it; the log
then contains a trace of the variables that were changed by the user.

@item @file{ChangeLog} excerpts
The topmost lines of all the @file{ChangeLog} files found in the source
hierarchy.  This is especially useful when bugs are reported against
development versions of the package, since the version string does not
provide sufficient information to know the exact state of the sources
the user compiled.  Of course, this relies on the use of a
@file{ChangeLog}.

@item build machine
Running a test suite in a cross-compile environment is not an easy task,
since it would mean having the test suite run on a machine @var{build},
while running programs on a machine @var{host}.  It is much simpler to
run both the test suite and the programs on @var{host}, but then, from
the point of view of the test suite, there remains a single environment,
@var{host} = @var{build}.  The log contains relevant information on the
state of the @var{build} machine, including some important environment
variables.
@c FIXME: How about having an M4sh macro to say "hey, log the value
@c of '@dots{}'"?  This would help both Autoconf and Autotest.

@item tested programs
The absolute file name and answers to @option{--version} of the tested
programs (see @ref{Writing Testsuites}, @code{AT_TESTED}).

@item configuration log
The contents of @file{config.log}, as created by @command{configure},
are appended.  It contains the configuration flags and a detailed report
on the configuration itself.
@end table


@node Writing Testsuites
@section Writing @file{testsuite.at}

The @file{testsuite.at} is a Bourne shell script making use of special
Autotest M4 macros.  It often contains a call to @code{AT_INIT} near
its beginning followed by one call to @code{m4_include} per source file
for tests.  Each such included file, or the remainder of
@file{testsuite.at} if include files are not used, contain a sequence of
test groups.  Each test group begins with a call to @code{AT_SETUP},
then an arbitrary number of shell commands or calls to @code{AT_CHECK},
and then completes with a call to @code{AT_CLEANUP}.  Multiple test
groups can be categorized by a call to @code{AT_BANNER}.

All of the public Autotest macros have all-uppercase names in the
namespace @samp{^AT_} to prevent them from accidentally conflicting with
other text; Autoconf also reserves the namespace @samp{^_AT_} for
internal macros.  All shell variables used in the testsuite for internal
purposes have mostly-lowercase names starting with @samp{at_}.  Autotest
also uses here-document delimiters in the namespace @samp{^_AT[A-Z]}, and
makes use of the file system namespace @samp{^at-}.

Since Autoconf is built on top of M4sugar (@pxref{Programming in
M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
of those namespaces (@samp{^_?\(m4\|AS\)_}).  In general, you
@emph{should not use} the namespace of a package that does not own the
macro or shell code you are writing.

@defmac AT_INIT (@ovar{name})
@atindex{INIT}
@c FIXME: Not clear, plus duplication of the information.
Initialize Autotest.  Giving a @var{name} to the test suite is
encouraged if your package includes several test suites.  Before this
macro is called, @code{AT_PACKAGE_STRING} and
@code{AT_PACKAGE_BUGREPORT} must be defined, which are used to display
information about the testsuite to the user.  Typically, these macros
are provided by a file @file{package.m4} built by @command{make}
(@pxref{Making testsuite Scripts}), in order to inherit the package
name, version, and bug reporting address from @file{configure.ac}.
@end defmac

@defmac AT_COPYRIGHT (@var{copyright-notice})
@atindex{COPYRIGHT}
@cindex Copyright Notice
State that, in addition to the Free Software Foundation's copyright on
the Autotest macros, parts of your test suite are covered by
@var{copyright-notice}.

The @var{copyright-notice} shows up in both the head of
@command{testsuite} and in @samp{testsuite --version}.
@end defmac

@defmac AT_ARG_OPTION (@var{options}, @var{help-text}, @
  @ovar{action-if-given}, @ovar{action-if-not-given})
@atindex{ARG_OPTION}
@vrindex at_arg_@var{option}
Accept options from the space-separated list @var{options}, a list that
has leading dashes removed from the options.  Long options will be
prefixed with @samp{--}, single-character options with @samp{-}.  The
first word in this list is the primary @var{option}, any others are
assumed to be short-hand aliases.  The variable associated with it
is @code{at_arg_@var{option}}, with any dashes in @var{option} replaced
with underscores.

If the user passes @option{--@var{option}} to the @command{testsuite},
the variable will be set to @samp{:}.  If the user does not pass the
option, or passes @option{--no-@var{option}}, then the variable will be
set to @samp{false}.

@vrindex at_optarg
@vrindex at_optarg_@var{option}
@var{action-if-given} is run each time the option is encountered; here,
the variable @code{at_optarg} will be set to @samp{:} or @samp{false} as
appropriate.  @code{at_optarg} is actually just a copy of
@code{at_arg_@var{option}}.

@var{action-if-not-given} will be run once after option parsing is
complete and if no option from @var{options} was used.

@var{help-text} is added to the end of the list of options shown in
@command{testsuite --help} (@pxref{AS_HELP_STRING}).

It is recommended that you use a package-specific prefix to @var{options}
names in order to avoid clashes with future Autotest built-in options.
@end defmac

@defmac AT_ARG_OPTION_ARG (@var{options}, @var{help-text}, @
  @ovar{action-if-given}, @ovar{action-if-not-given})
@atindex{ARG_OPTION_ARG}
@vrindex at_arg_@var{option}
Accept options with arguments from the space-separated list
@var{options}, a list that has leading dashes removed from the options.
Long options will be prefixed with @samp{--}, single-character options
with @samp{-}.  The first word in this list is the primary @var{option},
any others are assumed to be short-hand aliases.  The variable associated
with it is @code{at_arg_@var{option}}, with any dashes in @var{option}
replaced with underscores.

If the user passes @option{--@var{option}=@var{arg}} or
@option{--@var{option} @var{arg}} to the @command{testsuite}, the
variable will be set to @samp{@var{arg}}.

@vrindex at_optarg
@var{action-if-given} is run each time the option is encountered; here,
the variable @code{at_optarg} will be set to @samp{@var{arg}}.
@code{at_optarg} is actually just a copy of @code{at_arg_@var{option}}.

@var{action-if-not-given} will be run once after option parsing is
complete and if no option from @var{options} was used.

@var{help-text} is added to the end of the list of options shown in
@command{testsuite --help} (@pxref{AS_HELP_STRING}).

It is recommended that you use a package-specific prefix to @var{options}
names in order to avoid clashes with future Autotest built-in options.
@end defmac

@defmac AT_COLOR_TESTS
@atindex{COLOR_TESTS}
Enable colored test results by default when the output is connected to
a terminal.
@end defmac

@defmac AT_TESTED (@var{executables})
@atindex{TESTED}
Log the file name and answer to @option{--version} of each program in
space-separated list @var{executables}.  Several invocations register
new executables, in other words, don't fear registering one program
several times.

Autotest test suites rely on @env{PATH} to find the tested program.
This avoids the need to generate absolute names of the various tools, and
makes it possible to test installed programs.  Therefore, knowing which
programs are being exercised is crucial to understanding problems in
the test suite itself, or its occasional misuses.  It is a good idea to
also subscribe foreign programs you depend upon, to avoid incompatible
diagnostics.

@var{executables} is implicitly wrapped in shell double quotes, but it
will still use shell variable expansion (@samp{$}), command substitution
(@samp{`}), and backslash escaping (@samp{\}).  In particular, the
@env{EXEEXT} variable is available if it is passed to the testsuite
via @file{atlocal} or @file{atconfig}.
@end defmac

@defmac AT_PREPARE_TESTS (@var{shell-code})
@atindex{PREPARE_TESTS}
Execute @var{shell-code} in the main testsuite process,
after initializing the test suite and processing command-line options,
but before running any tests.  If this macro is used several times,
all of the @var{shell-code}s will be executed,
in the order they appeared in @file{testsuite.at}.

One reason to use @code{AT_PREPARE_TESTS} is when the programs under
test are sensitive to environment variables: you can unset all these
variables or reset them to safe values in @var{shell-code}.

@var{shell-code} is only executed if at least one test is going to be
run.  In particular, it will not be executed if any of the @option{--help},
@option{--version}, @option{--list}, or @option{--clean} options are
given to @command{testsuite} (@pxref{testsuite Invocation}).
@end defmac

@defmac AT_PREPARE_EACH_TEST (@var{shell-code})
@atindex{AT_PREPARE_EACH_TEST}
Execute @var{shell-code} in each test group's subshell, at the point of
the @code{AT_SETUP} that starts the test group.
@end defmac

@defmac AT_TEST_HELPER_FN (@var{name}, @var{args}, @var{description}, @var{code})
Define a shell function that will be available to the code for each test
group.  Its name will be @code{ath_fn_@var{name}}, and its body will be
@var{code}.  (The prefix prevents name conflicts with shell functions
defined by M4sh and Autotest.)

@var{args} should describe the function's arguments and @var{description}
what it does; these are used only for documentation comments in the
generated testsuite script.
@end defmac

@sp 1

@defmac AT_BANNER (@var{test-category-name})
@atindex{BANNER}
This macro identifies the start of a category of related test groups.
When the resulting @file{testsuite} is invoked with more than one test
group to run, its output will include a banner containing
@var{test-category-name} prior to any tests run from that category.  The
banner should be no more than about 40 or 50 characters.  A blank banner
indicates uncategorized tests; an empty line will be inserted after
tests from an earlier category, effectively ending that category.
@end defmac

@defmac AT_SETUP (@var{test-group-name})
@atindex{SETUP}
This macro starts a group of related tests, all to be executed in the
same subshell.  It accepts a single argument, which holds a few words
(no more than about 30 or 40 characters) quickly describing the purpose
of the test group being started.  @var{test-group-name} must not expand
to unbalanced quotes, although quadrigraphs can be used.
@end defmac

@defmac AT_KEYWORDS (@var{keywords})
@atindex{KEYWORDS}
Associate the space-separated list of @var{keywords} to the enclosing
test group.  This makes it possible to run ``slices'' of the test suite.
For instance, if some of your test groups exercise some @samp{foo}
feature, then using @samp{AT_KEYWORDS(foo)} lets you run
@samp{./testsuite -k foo} to run exclusively these test groups.  The
@var{test-group-name} of the test group is automatically recorded to
@code{AT_KEYWORDS}.

Several invocations within a test group accumulate new keywords.  In
other words, don't fear registering the same keyword several times in a
test group.
@end defmac

@defmac AT_CAPTURE_FILE (@var{file})
@atindex{CAPTURE_FILE}
If the current test group fails, log the contents of @var{file}.
Several identical calls within one test group have no additional effect.
@end defmac

@defmac AT_FAIL_IF (@var{shell-condition})
@atindex{FAIL_IF}
Make the test group fail and skip the rest of its execution, if
@var{shell-condition} is true.  @var{shell-condition} is a shell expression
such as a @code{test} command.  Tests before @command{AT_FAIL_IF}
will be executed and may still cause the test group to be skipped.
You can instantiate this macro many times from within the same test group.

You should use this macro only for very simple failure conditions.  If the
@var{shell-condition} could emit any kind of output you should instead
use @command{AT_CHECK} like
@example
AT_CHECK([if @var{shell-condition}; then exit 99; fi])
@end example
@noindent
so that such output is properly recorded in the @file{testsuite.log}
file.
@end defmac

@defmac AT_SKIP_IF (@var{shell-condition})
@atindex{SKIP_IF}
Determine whether the test should be skipped because it requires
features that are unsupported on the machine under test.
@var{shell-condition} is a shell expression such as a @code{test}
command.  Tests before @command{AT_SKIP_IF} will be executed
and may still cause the test group to fail.  You can instantiate this
macro many times from within the same test group.

You should use this macro only for very simple skip conditions.  If the
@var{shell-condition} could emit any kind of output you should instead
use @command{AT_CHECK} like
@example
AT_CHECK([if @var{shell-condition}; then exit 77; fi])
@end example
@noindent
so that such output is properly recorded in the @file{testsuite.log}
file.
@end defmac

@defmac AT_XFAIL_IF (@var{shell-condition})
@atindex{XFAIL_IF}
Determine whether the test is expected to fail because it is a known
bug (for unsupported features, you should skip the test).
@var{shell-condition} is a shell expression such as a @code{test}
command; you can instantiate this macro many times from within the
same test group, and one of the conditions is enough to turn
the test into an expected failure.
@end defmac

@defmac AT_CLEANUP
@atindex{CLEANUP}
End the current test group.
@end defmac

@sp 1

@defmac AT_DATA (@var{file}, @var{contents})
@defmacx AT_DATA_UNQUOTED (@var{file}, @var{contents})
@atindex{DATA}
Initialize an input data @var{file} with given @var{contents}.  Of
course, the @var{contents} have to be properly quoted between square
brackets to protect against included commas or spurious M4
expansion.  @var{contents} must be empty or end with a newline.
@var{file} must
be a single shell word that expands into a single file name.

The difference between @code{AT_DATA} and @code{AT_DATA_UNQUOTED} is
that only the latter performs shell variable expansion (@samp{$}),
command substitution (@samp{`}), and backslash escaping (@samp{\})
on @var{contents}.
@end defmac

@defmac AT_CHECK (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
  @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
@defmacx AT_CHECK_UNQUOTED (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
  @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
@atindex{CHECK}
@atindex{CHECK_UNQUOTED}
@vrindex at_status
Perform a test, by running the shell @var{commands} in a subshell.
@var{commands} is output as-is, so shell expansions are honored.
These commands are expected to have a final exit status of @var{status},
and to produce output as described by @var{stdout} and @var{stderr}
(see below).

This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.

If @var{commands} exit with unexpected status 77, then the rest of the
test group is skipped.  If @var{commands} exit with unexpected status
99, then the test group is immediately failed; this is called a
@emph{hard failure}.  Otherwise, the test is considered to have
succeeded if all of the status, stdout, and stderr expectations were
met.

If @var{run-if-fail} is nonempty, it provides extra shell commands to
run when the test fails; if @var{run-if-pass} is nonempty, it provides
extra shell commands to run when the test succeeds.  These commands are
@emph{not} run in a subshell, and they are not run when the test group
is skipped (exit code 77) or hard-failed (exit code 99).  They may
change whether the test group is considered to have succeeded, by
modifying the shell variable @code{at_failed}; set it to @code{:} to
indicate that the test group has failed, or @code{false} to indicate
that it has succeeded.

The exit status of @var{commands} is available to @var{run-if-fail} and
@var{run-if-pass} commands in the @code{at_status} shell variable.  The
output from @var{commands} is also available, in the files named by the
@code{at_stdout} and @code{at_stderr} variables.

If @var{status} is the literal @samp{ignore}, then the exit status of
@var{commands} is not checked, except for the special cases of 77 (skip)
and 99 (hard failure).  The existence of hard failures allows one to
mark a test as an expected failure with @code{AT_XFAIL_IF} because a
feature has not yet been implemented, but to still distinguish between
gracefully handling the missing feature and dumping core.

If the value of the @var{stdout} or @var{stderr} parameter is one of the
literals in the following table, then the test treats the output
according to the rules of that literal.

@table @samp
@item ignore
The content of the output is ignored, but still captured in the test
group log (if the testsuite is run with the @option{-v} option, the test
group log is displayed as the test is run; if the test group later
fails, the test group log is also copied into the overall testsuite
log).  This action is valid for both @var{stdout} and @var{stderr}.

@item ignore-nolog
The content of the output is ignored, and nothing is captured in the log
files.  If @var{commands} are likely to produce binary output (including
long lines) or large amounts of output, then logging the output can make
it harder to locate details related to subsequent tests within the
group, and could potentially corrupt terminal display of a user running
@command{testsuite -v}.  This action is valid for both @var{stdout} and
@var{stderr}.

@item stdout
Only valid as the @var{stdout} parameter.  Capture the content of
standard output in both a file named @file{stdout} and the test group log.
Subsequent commands in the test group can then post-process the file.
This action is often used when it is desired to use @command{grep} to
look for a substring in the output, or when the output must be
post-processed to normalize error messages into a common form.

@item stderr
Only valid as the @var{stderr} parameter.  Capture the content of
standard error in both a file named @file{stderr} and the test group log.

@item stdout-nolog
@itemx stderr-nolog
Like @samp{stdout} or @samp{stderr}, except that the captured output is
not duplicated into the test group log.  This action is particularly
useful for an intermediate check that produces large amounts of data,
which will be followed by another check that filters down to the
relevant data, as it makes it easier to locate details in the log.

@item expout
Only valid as the @var{stdout} parameter.  Compare standard output with
the previously created file @file{expout}, and list any differences in
the testsuite log.

@item experr
Only valid as the @var{stderr} parameter.  Compare standard error with
the previously created file @file{experr}, and list any differences in
the testsuite log.
@end table

Otherwise, the values of the @var{stdout} and @var{stderr} parameters
are treated as text that must exactly match the output given by
@var{commands} on standard output and standard error (including an empty
parameter for no output); any differences are captured in the testsuite
log and the test is failed (unless an unexpected exit status of 77
skipped the test instead).

@code{AT_CHECK_UNQUOTED} performs shell variable expansion (@samp{$}),
command substitution (@samp{`}), and backslash escaping (@samp{\}) on
comparison text given in the @var{stdout} and @var{stderr} parameters;
@code{AT_CHECK} does not.  There is no difference in the interpretation
of @var{commands}.
@end defmac

@defmac AT_CHECK_EUNIT (@var{module}, @var{test-spec}, @ovar{erlflags}, @
  @ovar{run-if-fail}, @ovar{run-if-pass})
@atindex{CHECK_EUNIT}
Initialize and execute an Erlang module named @var{module} that performs
tests following the @var{test-spec} EUnit test specification.
@var{test-spec} must be a valid EUnit test specification, as defined in
the @uref{https://@/erlang.org/@/doc/@/apps/@/eunit/@/index.html, EUnit
Reference Manual}.  @var{erlflags} are optional command-line options
passed to the Erlang interpreter to execute the test Erlang module.
Typically, @var{erlflags} defines at least the paths to directories
containing the compiled Erlang modules under test, as @samp{-pa path1
path2 ...}.

For example, the unit tests associated with Erlang module @samp{testme},
which compiled code is in subdirectory @file{src}, can be performed
with:

@example
AT_CHECK_EUNIT([testme_testsuite], [@{module, testme@}],
               [-pa "$@{abs_top_builddir@}/src"])
@end example

This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.

Variables @code{ERL}, @code{ERLC}, and (optionally) @code{ERLCFLAGS}
must be defined as the path of the Erlang interpreter, the path of the
Erlang compiler, and the command-line flags to pass to the compiler,
respectively.  Those variables should be configured in
@file{configure.ac} using the @command{AC_ERLANG_PATH_ERL} and
@command{AC_ERLANG_PATH_ERLC} macros, and the configured values of those
variables are automatically defined in the testsuite.  If @code{ERL} or
@code{ERLC} is not defined, the test group is skipped.

If the EUnit library cannot be found, i.e. if module @code{eunit} cannot
be loaded, the test group is skipped.  Otherwise, if @var{test-spec} is
an invalid EUnit test specification, the test group fails.  Otherwise,
if the EUnit test passes, shell commands @var{run-if-pass} are executed
or, if the EUnit test fails, shell commands @var{run-if-fail} are
executed and the test group fails.

Only the generated test Erlang module is automatically compiled and
executed.  If @var{test-spec} involves testing other Erlang modules,
e.g. module @samp{testme} in the example above, those modules must be
already compiled.

If the testsuite is run in verbose mode and with the @option{--verbose} option,
EUnit is also run in verbose mode to output more details about
individual unit tests.
@end defmac


@node testsuite Invocation
@section Running @command{testsuite} Scripts
@cindex @command{testsuite}

Autotest test suites support the following options:

@table @option
@item --help
@itemx -h
Display the list of options and exit successfully.

@item --version
@itemx -V
Display the version of the test suite and exit successfully.

@item --directory=@var{dir}
@itemx -C @var{dir}
Change the current directory to @var{dir} before creating any files.
Useful for running the testsuite in a subdirectory from a top-level
Makefile.

@item --jobs@r{[}=@var{n}@r{]}
@itemx -j@ovar{n}
Run @var{n} tests in parallel, if possible.  If @var{n} is not given,
run all given tests in parallel.  Note that there should be no space
before the argument to @option{-j}, as @option{-j @var{number}} denotes
the separate arguments @option{-j} and @option{@var{number}}, see below.

In parallel mode, the standard input device of the testsuite script is
not available to commands inside a test group.  Furthermore, banner
lines are not printed, and the summary line for each test group is
output after the test group completes.  Summary lines may appear
unordered.  If verbose and trace output are enabled (see below), they
may appear intermixed from concurrently running tests.

Parallel mode requires the @command{mkfifo} command to work, and will be
silently disabled otherwise.

@item --clean
@itemx -c
Remove all the files the test suite might have created and exit.  Meant
for @code{clean} Make targets.

@item --list
@itemx -l
List all the tests (or only the selection), including their possible
keywords.
@end table

@sp 1

By default all tests are performed (or described with @option{--list})
silently in the default environment, but the environment, set of tests,
and verbosity level can be tuned:

@table @samp
@item @var{variable}=@var{value}
Set the environment @var{variable} to @var{value}.  Use this rather
than @samp{FOO=foo ./testsuite} as debugging scripts would then run in a
different environment.

@cindex @code{AUTOTEST_PATH}
The variable @code{AUTOTEST_PATH} specifies the testing path to prepend
to @env{PATH}.  Relative directory names (not starting with
@samp{/}) are considered to be relative to the top level of the
package being built.  All directories are made absolute, first
starting from the top level @emph{build} tree, then from the
@emph{source} tree.  For instance @samp{./testsuite
AUTOTEST_PATH=tests:bin} for a @file{/src/foo-1.0} source package built
in @file{/tmp/foo} results in @samp{/tmp/foo/tests:/tmp/foo/bin} and
then @samp{/src/foo-1.0/tests:/src/foo-1.0/bin} being prepended to
@env{PATH}.

@item @var{number}
@itemx @var{number}-@var{number}
@itemx @var{number}-
@itemx -@var{number}
Add the corresponding test groups, with obvious semantics, to the
selection.

@item --keywords=@var{keywords}
@itemx -k @var{keywords}
Add to the selection the test groups with title or keywords (arguments
to @code{AT_SETUP} or @code{AT_KEYWORDS}) that match @emph{all} keywords
of the comma separated list @var{keywords}, case-insensitively.  Use
@samp{!} immediately before the keyword to invert the selection for this
keyword.  By default, the keywords match whole words; enclose them in
@samp{.*} to also match parts of words.

For example, running

@example
@kbd{./testsuite -k 'autoupdate,.*FUNC.*'}
@end example

@noindent
selects all tests tagged @samp{autoupdate} @emph{and} with tags
containing @samp{FUNC} (as in @samp{AC_CHECK_FUNC}, @samp{AC_FUNC_ALLOCA},
etc.), while

@example
@kbd{./testsuite -k '!autoupdate' -k '.*FUNC.*'}
@end example

@noindent
selects all tests not tagged @samp{autoupdate} @emph{or} with tags
containing @samp{FUNC}.

@item --errexit
@itemx -e
If any test fails, immediately abort testing.  This implies
@option{--debug}: post test group clean up, and top-level logging
are inhibited.  This option is meant for the full test
suite, it is not really useful for generated debugging scripts.
If the testsuite is run in parallel mode using @option{--jobs},
then concurrently running tests will finish before exiting.

@item --verbose
@itemx -v
Force more verbosity in the detailed output of what is being done.  This
is the default for debugging scripts.

@item --color
@itemx --color@r{[}=never@r{|}auto@r{|}always@r{]}
Enable colored test results.  Without an argument, or with @samp{always},
test results will be colored.  With @samp{never}, color mode is turned
off.  Otherwise, if either the macro @code{AT_COLOR_TESTS} is used by
the testsuite author, or the argument @samp{auto} is given, then test
results are colored if standard output is connected to a terminal.

@item --debug
@itemx -d
Do not remove the files after a test group was performed---but they are
still removed @emph{before}, therefore using this option is sane when
running several test groups.  Create debugging scripts.  Do not
overwrite the top-level
log (in order to preserve a supposedly existing full log file).  This is
the default for debugging scripts, but it can also be useful to debug
the testsuite itself.

@item --recheck
Add to the selection all test groups that failed or passed unexpectedly
during the last non-debugging test run.

@item --trace
@itemx -x
Trigger shell tracing of the test groups.
@end table

Besides these options accepted by every Autotest testsuite, the
testsuite author might have added package-specific options
via the @code{AT_ARG_OPTION} and @code{AT_ARG_OPTION_ARG} macros
(@pxref{Writing Testsuites}); refer to @command{testsuite --help} and
the package documentation for details.


@node Making testsuite Scripts
@section Making @command{testsuite} Scripts

For putting Autotest into movement, you need some configuration and
makefile machinery.  We recommend, at least if your package uses deep or
shallow hierarchies, that you use @file{tests/} as the name of the
directory holding all your tests and their makefile.  Here is a
check list of things to do, followed by an example, taking into
consideration whether you are also using Automake.

@itemize @minus

@item
@cindex @file{package.m4}
@atindex{PACKAGE_STRING}
@atindex{PACKAGE_BUGREPORT}
@atindex{PACKAGE_NAME}
@atindex{PACKAGE_TARNAME}
@atindex{PACKAGE_VERSION}
@atindex{PACKAGE_URL}
Make sure to create the file @file{package.m4}, which defines the
identity of the package.  It must define @code{AT_PACKAGE_STRING}, the
full signature of the package, and @code{AT_PACKAGE_BUGREPORT}, the
address to which bug reports should be sent.  For sake of completeness,
we suggest that you also define @code{AT_PACKAGE_NAME},
@code{AT_PACKAGE_TARNAME}, @code{AT_PACKAGE_VERSION}, and
@code{AT_PACKAGE_URL}.
@xref{Initializing configure}, for a description of these variables.
Be sure to distribute @file{package.m4} and to put it into the source
hierarchy: the test suite ought to be shipped!  See below for an example.

@item
Invoke @code{AC_CONFIG_TESTDIR} in your @file{configure.ac}.

@defmac AC_CONFIG_TESTDIR (@var{directory}, @dvarv{test-path, directory})
@acindex{CONFIG_TESTDIR}
An Autotest test suite is to be configured in @var{directory}.  This
macro causes @file{@var{directory}/atconfig} to be created by
@command{config.status} and sets the default @code{AUTOTEST_PATH} to
@var{test-path} (@pxref{testsuite Invocation}).
@end defmac

@item
Still within @file{configure.ac}, as appropriate, ensure that some
@code{AC_CONFIG_FILES} command includes substitution for
@file{tests/atlocal}.

@item
Also within your @file{configure.ac}, arrange for the @code{AUTOM4TE}
variable to be set.

@item
The appropriate @file{Makefile} should be modified so the validation in
your package is triggered by @samp{make check}.
@end itemize

The following example demonstrates the above checklist, first by
assuming that you are using Automake (see below for tweaks to make to
get the same results without Automake).  Begin by adding the following
lines to your @file{configure.ac}:

@example
# Initialize the test suite.
AC_CONFIG_TESTDIR([tests])
AC_CONFIG_FILES([tests/Makefile tests/atlocal])
AM_MISSING_PROG([AUTOM4TE], [autom4te])
@end example

Next, add the following lines to your @file{tests/Makefile.am}, in order
to link @samp{make check} with a validation suite.

@example
$(srcdir)/package.m4: $(top_srcdir)/configure.ac
        printf >'$@@' '%s\n' \
          '# Signature of the current package.' \
          'm4_define([AT_PACKAGE_NAME], [$(PACKAGE_NAME)])' \
          'm4_define([AT_PACKAGE_TARNAME], [$(PACKAGE_TARNAME)])' \
          'm4_define([AT_PACKAGE_VERSION], [$(PACKAGE_VERSION)])' \
          'm4_define([AT_PACKAGE_STRING], [$(PACKAGE_STRING)])' \
          'm4_define([AT_PACKAGE_URL], [$(PACKAGE_URL)])' \
          'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'

EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in
TESTSUITE = $(srcdir)/testsuite

check-local: atconfig atlocal $(TESTSUITE)
        $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)

installcheck-local: atconfig atlocal $(TESTSUITE)
        $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
          $(TESTSUITEFLAGS)

clean-local:
        test ! -f '$(TESTSUITE)' || \
         $(SHELL) '$(TESTSUITE)' --clean

AUTOTEST = $(AUTOM4TE) --language=autotest
$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
        $(AUTOTEST) -I '$(srcdir)' -o $@@.tmp $@@.at
        mv $@@.tmp $@@
@end example

Note that the built testsuite is distributed; this is necessary because
users might not have Autoconf installed, and thus would not be able to
rebuild it.  Likewise, the use of Automake's @code{AM_MISSING_PROG} will
arrange for the definition of @code{$AUTOM4TE} within the Makefile to
provide the user with
a nicer error message if they modify a source file to the testsuite, and
accidentally trigger the rebuild rules.

You might want to list explicitly the dependencies, i.e., the list of
the files @file{testsuite.at} includes.

If you don't use Automake, you should make the following tweaks.  In
your @file{configure.ac}, replace the @code{AM_MISSING_PROG} line above
with @code{AC_PATH_PROG([AUTOM4TE], [autom4te], [false])}.  You are
welcome to also try using the @command{missing} script from the Automake
project instead of @command{false}, to try to get a nicer error message
when the user modifies prerequisites but did not have Autoconf
installed, but at that point you may be better off using Automake.
Then, take the code suggested above for @file{tests/@/Makefile.am} and
place it in your @file{tests/@/Makefile.in} instead.  Add code to your
@file{tests/@/Makefile.in} to ensure that @code{$(EXTRA_DIST)} files are
distributed, as well as adding the following additional lines to prepare
the set of needed Makefile variables:

@example
subdir = tests
PACKAGE_NAME = @@PACKAGE_NAME@@
PACKAGE_TARNAME = @@PACKAGE_TARNAME@@
PACKAGE_VERSION = @@PACKAGE_VERSION@@
PACKAGE_STRING = @@PACKAGE_STRING@@
PACKAGE_BUGREPORT = @@PACKAGE_BUGREPORT@@
PACKAGE_URL = @@PACKAGE_URL@@
AUTOM4TE = @@AUTOM4TE@@

atconfig: $(top_builddir)/config.status
        cd $(top_builddir) && \
           $(SHELL) ./config.status $(subdir)/$@@

atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
        cd $(top_builddir) && \
           $(SHELL) ./config.status $(subdir)/$@@
@end example

Using the above example (with or without Automake), and assuming you
were careful to not initialize @samp{TESTSUITEFLAGS} within your
makefile, you can now fine-tune test suite execution at runtime by
altering this variable, for example:

@example
make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'
@end example



@c =============================== Frequent Autoconf Questions, with answers

@node FAQ
@chapter Frequent Autoconf Questions, with answers

Several questions about Autoconf come up occasionally.  Here some of them
are addressed.

@menu
* Distributing::                Distributing @command{configure} scripts
* Why GNU M4::                  Why not use the standard M4?
* Bootstrapping::               Autoconf and GNU M4 require each other?
* Why Not Imake::               Why GNU uses @command{configure} instead of Imake
* Defining Directories::        Passing @code{datadir} to program
* Autom4te Cache::              What is it?  Can I remove it?
* Present But Cannot Be Compiled::  Compiler and Preprocessor Disagree
* Expanded Before Required::    Expanded Before Required
* Debugging::                   Debugging @command{configure} scripts
@end menu

@node Distributing
@section Distributing @command{configure} Scripts
@cindex License

@display
What are the restrictions on distributing @command{configure}
scripts that Autoconf generates?  How does that affect my
programs that use them?
@end display

There are no restrictions on how the configuration scripts that Autoconf
produces may be distributed or used.  In Autoconf version 1, they were
covered by the GNU General Public License.  We still encourage
software authors to distribute their work under terms like those of the
GPL, but doing so is not required to use Autoconf.

Of the other files that might be used with @command{configure},
@file{config.h.in} is under whatever copyright you use for your
@file{configure.ac}.  @file{config.sub} and @file{config.guess} have an
exception to the GPL when they are used with an Autoconf-generated
@command{configure} script, which permits you to distribute them under the
same terms as the rest of your package.  @file{install-sh} is from the X
Consortium and is not copyrighted.

@node Why GNU M4
@section Why Require GNU M4?

@display
Why does Autoconf require GNU M4?
@end display

Many M4 implementations have hard-coded limitations on the size and
number of macros that Autoconf exceeds.  They also lack several
builtin macros that it would be difficult to get along without in a
sophisticated application like Autoconf, including:

@example
m4_builtin
m4_indir
m4_bpatsubst
__file__
__line__
@end example

Autoconf requires version 1.4.8 or later of GNU M4.
It works better with version 1.4.16 or later.

Since only software maintainers need to use Autoconf, and since GNU
M4 is simple to configure and install, it seems reasonable to require
GNU M4 to be installed also.  Many maintainers of GNU and
other free software already have most of the GNU utilities
installed, since they prefer them.

@node Bootstrapping
@section How Can I Bootstrap?
@cindex Bootstrap

@display
If Autoconf requires GNU M4 and GNU M4 has an Autoconf
@command{configure} script, how do I bootstrap?  It seems like a chicken
and egg problem!
@end display

This is a misunderstanding.  Although GNU M4 does come with a
@command{configure} script produced by Autoconf, Autoconf is not required
in order to run the script and install GNU M4.  Autoconf is only
required if you want to change the M4 @command{configure} script, which few
people have to do (mainly its maintainer).

@node Why Not Imake
@section Why Not Imake?
@cindex Imake

@display
Why not use Imake instead of @command{configure} scripts?
@end display

Several people have written addressing this question, so
adaptations of their explanations are included here.

The following answer is based on one written by Richard Pixley:

@quotation
Autoconf generated scripts frequently work on machines that it has
never been set up to handle before.  That is, it does a good job of
inferring a configuration for a new system.  Imake cannot do this.

Imake uses a common database of host specific data.  For X11, this makes
sense because the distribution is made as a collection of tools, by one
central authority who has control over the database.

GNU tools are not released this way.  Each GNU tool has a
maintainer; these maintainers are scattered across the world.  Using a
common database would be a maintenance nightmare.  Autoconf may appear
to be this kind of database, but in fact it is not.  Instead of listing
host dependencies, it lists program requirements.

If you view the GNU suite as a collection of native tools, then the
problems are similar.  But the GNU development tools can be
configured as cross tools in almost any host+target permutation.  All of
these configurations can be installed concurrently.  They can even be
configured to share host independent files across hosts.  Imake doesn't
address these issues.

Imake templates are a form of standardization.  The GNU coding
standards address the same issues without necessarily imposing the same
restrictions.
@end quotation


Here is some further explanation, written by Per Bothner:

@quotation
One of the advantages of Imake is that it is easy to generate large
makefiles using the @samp{#include} and macro mechanisms of @command{cpp}.
However, @code{cpp} is not programmable: it has limited conditional
facilities, and no looping.  And @code{cpp} cannot inspect its
environment.

All of these problems are solved by using @code{sh} instead of
@code{cpp}.  The shell is fully programmable, has macro substitution,
can execute (or source) other shell scripts, and can inspect its
environment.
@end quotation


Paul Eggert elaborates more:

@quotation
With Autoconf, installers need not assume that Imake itself is already
installed and working well.  This may not seem like much of an advantage
to people who are accustomed to Imake.  But on many hosts Imake is not
installed or the default installation is not working well, and requiring
Imake to install a package hinders the acceptance of that package on
those hosts.  For example, the Imake template and configuration files
might not be installed properly on a host, or the Imake build procedure
might wrongly assume that all source files are in one big directory
tree, or the Imake configuration might assume one compiler whereas the
package or the installer needs to use another, or there might be a
version mismatch between the Imake expected by the package and the Imake
supported by the host.  These problems are much rarer with Autoconf,
where each package comes with its own independent configuration
processor.

Also, Imake often suffers from unexpected interactions between
@command{make} and the installer's C preprocessor.  The fundamental problem
here is that the C preprocessor was designed to preprocess C programs,
not makefiles.  This is much less of a problem with Autoconf,
which uses the general-purpose preprocessor M4, and where the
package's author (rather than the installer) does the preprocessing in a
standard way.
@end quotation


Finally, Mark Eichin notes:

@quotation
Imake isn't all that extensible, either.  In order to add new features to
Imake, you need to provide your own project template, and duplicate most
of the features of the existing one.  This means that for a sophisticated
project, using the vendor-provided Imake templates fails to provide any
leverage---since they don't cover anything that your own project needs
(unless it is an X11 program).

On the other side, though:

The one advantage that Imake has over @command{configure}:
@file{Imakefile} files tend to be much shorter (likewise, less redundant)
than @file{Makefile.in} files.  There is a fix to this, however---at least
for the Kerberos V5 tree, we've modified things to call in common
@file{post.in} and @file{pre.in} makefile fragments for the
entire tree.  This means that a lot of common things don't have to be
duplicated, even though they normally are in @command{configure} setups.
@end quotation


@node Defining Directories
@section How Do I @code{#define} Installation Directories?

@display
My program needs library files, installed in @code{datadir} and
similar.  If I use

@example
AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
  [Define to the read-only architecture-independent
   data directory.])
@end example

@noindent
I get

@example
#define DATADIR "$@{prefix@}/share"
@end example
@end display

As already explained, this behavior is on purpose, mandated by the
GNU Coding Standards, see @ref{Installation Directory
Variables}.  There are several means to achieve a similar goal:

@itemize @minus
@item
Do not use @code{AC_DEFINE} but use your makefile to pass the
actual value of @code{datadir} via compilation flags.
@xref{Installation Directory Variables}, for the details.

@item
This solution can be simplified when compiling a program: you may either
extend the @code{CPPFLAGS}:

@example
CPPFLAGS = -DDATADIR='"$(datadir)"' @@CPPFLAGS@@
@end example

@noindent
If you are using Automake, you should use @code{AM_CPPFLAGS} instead:

@example
AM_CPPFLAGS = -DDATADIR='"$(datadir)"'
@end example

@noindent
Alternatively, create a dedicated header file:

@example
DISTCLEANFILES = myprog-paths.h
myprog-paths.h: Makefile
        printf '%s\n' '#define DATADIR "$(datadir)"' >$@@
@end example

@noindent
The Gnulib module @samp{configmake} provides such a header with all the
standard directory variables defined, @pxref{configmake,,, gnulib, GNU
Gnulib}.

@item
Use @code{AC_DEFINE} but have @command{configure} compute the literal
value of @code{datadir} and others.  Many people have wrapped macros to
automate this task; for an example, see the macro @code{AC_DEFINE_DIR} from
the @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
Archive}.

This solution does not conform to the GNU Coding Standards.

@item
Note that all the previous solutions hard wire the absolute name of
these directories in the executables, which is not a good property.  You
may try to compute the names relative to @code{prefix}, and try to
find @code{prefix} at runtime, this way your package is relocatable.
@end itemize


@node Autom4te Cache
@section What is @file{autom4te.cache}?

@display
What is this directory @file{autom4te.cache}?  Can I safely remove it?
@end display

In the GNU Build System, @file{configure.ac} plays a central
role and is read by many tools: @command{autoconf} to create
@file{configure}, @command{autoheader} to create @file{config.h.in},
@command{automake} to create @file{Makefile.in}, @command{autoscan} to
check the completeness of @file{configure.ac}, @command{autoreconf} to
check the GNU Build System components that are used.  To
``read @file{configure.ac}'' actually means to compile it with M4,
which can be a long process for complex @file{configure.ac}.

This is why all these tools, instead of running directly M4, invoke
@command{autom4te} (@pxref{autom4te Invocation}) which, while answering to
a specific demand, stores additional information in
@file{autom4te.cache} for future runs.  For instance, if you run
@command{autoconf}, behind the scenes, @command{autom4te} also
stores information for the other tools, so that when you invoke
@command{autoheader} or @command{automake} etc., reprocessing
@file{configure.ac} is not needed.  The speed up is frequently 30%,
and is increasing with the size of @file{configure.ac}.

But it is and remains being simply a cache: you can safely remove it.

@sp 1

@display
Can I permanently get rid of it?
@end display

The creation of this cache can be disabled from
@file{~/.autom4te.cfg}, see @ref{Customizing autom4te}, for more
details.  You should be aware that disabling the cache slows down the
Autoconf test suite by 40%.  The more GNU Build System
components are used, the more the cache is useful; for instance
running @samp{autoreconf -f} on the Core Utilities is twice slower without
the cache @emph{although @option{--force} implies that the cache is
not fully exploited}, and eight times slower than without
@option{--force}.


@node Present But Cannot Be Compiled
@section Header Present But Cannot Be Compiled

The most important guideline to bear in mind when checking for
features is to mimic as much as possible the intended use.
Unfortunately, old versions of @code{AC_CHECK_HEADER} and
@code{AC_CHECK_HEADERS} failed to follow this idea, and called
the preprocessor, instead of the compiler, to check for headers.  As a
result, incompatibilities between headers went unnoticed during
configuration, and maintainers finally had to deal with this issue
elsewhere.

The transition began with Autoconf 2.56.  As of Autoconf 2.64 both
checks are performed, and @command{configure} complains loudly if the
compiler and the preprocessor do not agree.  However, only the compiler
result is considered.  As of Autoconf 2.70, only the compiler check is
performed.

Consider the following example:

@smallexample
$ @kbd{cat number.h}
typedef int number;
$ @kbd{cat pi.h}
const number pi = 3;
$ @kbd{cat configure.ac}
AC_INIT([Example], [1.0], [bug-example@@example.org])
AC_CHECK_HEADERS([pi.h])
$ @kbd{autoconf -Wall}
$ @kbd{./configure CPPFLAGS='-I.'}
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C23 features... -std=gnu23
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for pi.h... no
@end smallexample

@noindent
The proper way to handle this case is using the fourth argument
(@pxref{Generic Headers}):

@example
$ @kbd{cat configure.ac}
AC_INIT([Example], [1.0], [bug-example@@example.org])
AC_CHECK_HEADERS([number.h pi.h], [], [],
[[#ifdef HAVE_NUMBER_H
# include <number.h>
#endif
]])
$ @kbd{autoconf -Wall}
$ @kbd{./configure CPPFLAGS='-I.'}
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C23 features... -std=gnu23
checking for number.h... yes
checking for pi.h... yes
@end example

See @ref{Particular Headers}, for a list of headers with their
prerequisites.

@node Expanded Before Required
@section Expanded Before Required

@cindex expanded before required
Older versions of Autoconf silently built files with incorrect ordering
between dependent macros if an outer macro first expanded, then later
indirectly required, an inner macro.  Starting with Autoconf 2.64, this
situation no longer generates out-of-order code, but results in
duplicate output and a syntax warning:

@example
$ @kbd{cat configure.ac}
@result{}AC_DEFUN([TESTA], [[echo in A
@result{}if test -n "$SEEN_A" ; then echo duplicate ; fi
@result{}SEEN_A=:]])
@result{}AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
@result{}if test -z "$SEEN_A" ; then echo bug ; fi]])
@result{}AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
@result{}AC_DEFUN([OUTER], [[echo in OUTER]
@result{}TESTA
@result{}TESTC])
@result{}AC_INIT
@result{}OUTER
@result{}AC_OUTPUT
$ @kbd{autoconf}
@result{}configure.ac:11: warning: AC_REQUIRE:
@result{} 'TESTA' was expanded before it was required
@result{}configure.ac:4: TESTB is expanded from...
@result{}configure.ac:6: TESTC is expanded from...
@result{}configure.ac:7: OUTER is expanded from...
@result{}configure.ac:11: the top level
@end example

@noindent
To avoid this warning, decide what purpose the macro in question serves.
If it only needs to be expanded once (for example, if it provides
initialization text used by later macros), then the simplest fix is to
change the macro to be declared with @code{AC_DEFUN_ONCE}
(@pxref{One-Shot Macros}), although this only works in Autoconf 2.64 and
newer.  A more portable fix is to change all
instances of direct calls to instead go through @code{AC_REQUIRE}
(@pxref{Prerequisite Macros}).  If, instead, the macro is parameterized
by arguments or by the current definition of other macros in the m4
environment, then the macro should always be directly expanded instead
of required.

For another case study, consider this example trimmed down from an
actual package.  Originally, the package contained shell code and
multiple macro invocations at the top level of @file{configure.ac}:

@example
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
foobar=
AC_PROG_CC
FOO
@end example

@noindent
but that was getting complex, so the author wanted to offload some of
the text into a new macro in another file included via
@file{aclocal.m4}.  The naïve approach merely wraps the text in a new
macro:

@example
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
AC_DEFUN([BAR], [
foobar=
AC_PROG_CC
FOO
])
BAR
@end example

@noindent
With older versions of Autoconf, the setting of @samp{foobar=} occurs
before the single compiler check, as the author intended.  But with
Autoconf 2.64, this issues the ``expanded before it was required''
warning for @code{AC_PROG_CC}, and outputs two copies of the compiler
check, one before @samp{foobar=}, and one after.  To understand why this
is happening, remember that the use of @code{AC_COMPILE_IFELSE} includes
a call to @code{AC_REQUIRE([AC_PROG_CC])} under the hood.  According to
the documented semantics of @code{AC_REQUIRE}, this means that
@code{AC_PROG_CC} @emph{must} occur before the body of the outermost
@code{AC_DEFUN}, which in this case is @code{BAR}, thus preceding the
use of @samp{foobar=}.  The older versions of Autoconf were broken with
regards to the rules of @code{AC_REQUIRE}, which explains why the code
changed from one over to two copies of @code{AC_PROG_CC} when upgrading
autoconf.  In other words, the author was unknowingly relying on a bug
exploit to get the desired results, and that exploit broke once the bug
was fixed.

So, what recourse does the author have, to restore their intended
semantics of setting @samp{foobar=} prior to a single compiler check,
regardless of whether Autoconf 2.63 or 2.64 is used?  One idea is to
remember that only @code{AC_DEFUN} is impacted by @code{AC_REQUIRE};
there is always the possibility of using the lower-level
@code{m4_define}:

@example
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
m4_define([BAR], [
foobar=
AC_PROG_CC
FOO
])
BAR
@end example

@noindent
This works great if everything is in the same file.  However, it does
not help in the case where the author wants to have @command{aclocal}
find the definition of @code{BAR} from its own file, since
@command{aclocal} requires the use of @code{AC_DEFUN}.  In this case, a
better fix is to recognize that if @code{BAR} also uses
@code{AC_REQUIRE}, then there will no longer be direct expansion prior
to a subsequent require.  Then, by creating yet another helper macro,
the author can once again guarantee a single invocation of
@code{AC_PROG_CC}, which will still occur after @code{foobar=}.  The
author can also use @code{AC_BEFORE} to make sure no other macro
appearing before @code{BAR} has triggered an unwanted expansion of
@code{AC_PROG_CC}.

@example
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
AC_DEFUN([BEFORE_CC], [
foobar=
])
AC_DEFUN([BAR], [
AC_BEFORE([$0], [AC_PROG_CC])dnl
AC_REQUIRE([BEFORE_CC])dnl
AC_REQUIRE([AC_PROG_CC])dnl
FOO
])
BAR
@end example


@node Debugging
@section Debugging @command{configure} scripts

While in general, @command{configure} scripts generated by Autoconf
strive to be fairly portable to various systems, compilers, shells, and
other tools, it may still be necessary to debug a failing test, broken
script or makefile, or fix or override an incomplete, faulty, or erroneous
test, especially during macro development.  Failures can occur at all levels,
in M4 syntax or semantics, shell script issues, or due to bugs in the
test or the tools invoked by @command{configure}.  Together with the
rather arcane error message that @command{m4} and @command{make} may
produce when their input contains syntax errors, this can make debugging
rather painful.

Nevertheless, here is a list of hints and strategies that may help:

@itemize
@item
When @command{autoconf} fails, common causes for error include:

@itemize
@item
mismatched or unbalanced parentheses or braces (@pxref{Balancing
Parentheses}),

@item under- or over-quoted macro arguments (@pxref{Autoconf
Language}, @pxref{Quoting and Parameters}, @pxref{Quotation and Nested
Macros}),

@item spaces between macro name and opening parenthesis (@pxref{Autoconf
Language}).
@end itemize

Typically, it helps to go back to the last working version of the input
and compare the differences for each of these errors.  Another
possibility is to sprinkle pairs of @code{m4_traceon} and
@code{m4_traceoff} judiciously in the code, either without a parameter
or listing some macro names and watch @command{m4} expand its input
verbosely (@pxref{Debugging via autom4te}).

@item
Sometimes @command{autoconf} succeeds but the generated
@command{configure} script has invalid shell syntax.  You can detect this
case by running @samp{bash -n configure} or @samp{sh -n configure}.
If this command fails, the same tips apply, as if @command{autoconf} had
failed.

@item
Debugging @command{configure} script execution may be done by sprinkling
pairs of @code{set -x} and @code{set +x} into the shell script before
and after the region that contains a bug.  Running the whole script with
@samp{@var{shell} -vx ./configure 2>&1 | tee @var{log-file}} with a decent
@var{shell} may work, but produces lots of output.  Here, it can help to
search for markers like @samp{checking for} a particular test in the
@var{log-file}.

@item
Alternatively, you might use a shell with debugging capabilities like
@uref{https://bashdb.sourceforge.net/, bashdb}.

@item
When @command{configure} tests produce invalid results for your system,
it may be necessary to override them:

@itemize
@item
For programs, tools or libraries variables, preprocessor, compiler, or
linker flags, it is often sufficient to override them at @command{make}
run time with some care (@pxref{Macros and Submakes}).  Since this
normally won't cause @command{configure} to be run again with these
changed settings, it may fail if the changed variable would have caused
different test results from @command{configure}, so this may work only
for simple differences.

@item
Most tests which produce their result in a substituted variable allow to
override the test by setting the variable on the @command{configure}
command line (@pxref{Compilers and Options}, @pxref{Defining Variables}).

@item
Many tests store their result in a cache variable (@pxref{Caching
Results}).  This lets you override them either on the
@command{configure} command line as above, or through a primed cache or
site file (@pxref{Cache Files}, @pxref{Site Defaults}).  The name of a
cache variable is documented with a test macro or may be inferred from
@ref{Cache Variable Names}; the precise semantics of undocumented
variables are often internal details, subject to change.
@end itemize

@item
Alternatively, @command{configure} may produce invalid results because
of uncaught programming errors, in your package or in an upstream
library package.  For example, when @code{AC_CHECK_LIB} fails to find a
library with a specified function, always check @file{config.log}.  This
will reveal the exact error that produced the failing result: the
library linked by @code{AC_CHECK_LIB} probably has a fatal bug.
@end itemize

Conversely, as macro author, you can make it easier for users of your
macro:

@itemize
@item
by minimizing dependencies between tests and between test results as far
as possible,

@item
by using @command{make} variables to factorize and allow
override of settings at @command{make} run time,

@item
by honoring the GNU Coding Standards and not overriding flags
reserved for the user except temporarily during @command{configure}
tests,

@item
by not requiring users of your macro to use the cache variables.
Instead, expose the result of the test via @var{run-if-true} and
@var{run-if-false} parameters.  If the result is not a boolean,
then provide it through documented shell variables.
@end itemize


@c ===================================================== History of Autoconf.

@node History
@chapter History of Autoconf
@cindex History of autoconf

@emph{This chapter was written by the original author, David MacKenzie.}

You may be wondering, Why was Autoconf originally written?  How did it
get into its present form?  (Why does it look like gorilla spit?)  If
you're not wondering, then this chapter contains no information useful
to you, and you might as well skip it.  If you @emph{are} wondering,
then let there be light@enddots{}

@menu
* Genesis::                     Prehistory and naming of @command{configure}
* Exodus::                      The plagues of M4 and Perl
* Leviticus::                   The priestly code of portability arrives
* Numbers::                     Growth and contributors
* Deuteronomy::                 Approaching the promises of easy configuration
@end menu

@node Genesis
@section Genesis

In June 1991 I was maintaining many of the GNU utilities for the
Free Software Foundation.  As they were ported to more platforms and
more programs were added, the number of @option{-D} options that users
had to select in the makefile (around 20) became burdensome.
Especially for me---I had to test each new release on a bunch of
different systems.  So I wrote a little shell script to guess some of
the correct settings for the fileutils package, and released it as part
of fileutils 2.0.  That @command{configure} script worked well enough that
the next month I adapted it (by hand) to create similar @command{configure}
scripts for several other GNU utilities packages.  Brian Berliner
also adapted one of my scripts for his CVS revision control system.

Later that summer, I learned that Richard Stallman and Richard Pixley
were developing similar scripts to use in the GNU compiler tools;
so I adapted my @command{configure} scripts to support their evolving
interface: using the file name @file{Makefile.in} as the templates;
adding @samp{+srcdir}, the first option (of many); and creating
@file{config.status} files.

@node Exodus
@section Exodus

As I got feedback from users, I incorporated many improvements, using
Emacs to search and replace, cut and paste, similar changes in each of
the scripts.  As I adapted more GNU utilities packages to use
@command{configure} scripts, updating them all by hand became impractical.
Rich Murphey, the maintainer of the GNU graphics utilities, sent me
mail saying that the @command{configure} scripts were great, and asking if
I had a tool for generating them that I could send him.  No, I thought,
but I should!  So I started to work out how to generate them.  And the
journey from the slavery of hand-written @command{configure} scripts to the
abundance and ease of Autoconf began.

Cygnus @command{configure}, which was being developed at around that time,
is table driven; it is meant to deal mainly with a discrete number of
system types with a small number of mainly unguessable features (such as
details of the object file format).  The automatic configuration system
that Brian Fox had developed for Bash takes a similar approach.  For
general use, it seems to me a hopeless cause to try to maintain an
up-to-date database of which features each variant of each operating
system has.  It's easier and more reliable to check for most features on
the fly---especially on hybrid systems that people have hacked on
locally or that have patches from vendors installed.

I considered using an architecture similar to that of Cygnus
@command{configure}, where there is a single @command{configure} script that
reads pieces of @file{configure.in} when run.  But I didn't want to have
to distribute all of the feature tests with every package, so I settled
on having a different @command{configure} made from each
@file{configure.in} by a preprocessor.  That approach also offered more
control and flexibility.

I looked briefly into using the Metaconfig package, by Larry Wall,
Harlan Stenn, and Raphael Manfredi, but I decided not to for several
reasons.  The @command{Configure} scripts it produces are interactive,
which I find quite inconvenient; I didn't like the ways it checked for
some features (such as library functions); I didn't know that it was
still being maintained, and the @command{Configure} scripts I had
seen didn't work on many modern systems (such as System V R4 and NeXT);
it wasn't flexible in what it could do in response to a feature's
presence or absence; I found it confusing to learn; and it was too big
and complex for my needs (I didn't realize then how much Autoconf would
eventually have to grow).

I considered using Perl to generate my style of @command{configure}
scripts, but decided that M4 was better suited to the job of simple
textual substitutions: it gets in the way less, because output is
implicit.  Plus, everyone already has it.  (Initially I didn't rely on
the GNU extensions to M4.)  Also, some of my friends at the
University of Maryland had recently been putting M4 front ends on
several programs, including @code{tvtwm}, and I was interested in trying
out a new language.

@node Leviticus
@section Leviticus

Since my @command{configure} scripts determine the system's capabilities
automatically, with no interactive user intervention, I decided to call
the program that generates them Autoconfig.  But with a version number
tacked on, that name would be too long for old Unix file systems,
so I shortened it to Autoconf.

In the fall of 1991 I called together a group of fellow questers after
the Holy Grail of portability (er, that is, alpha testers) to give me
feedback as I encapsulated pieces of my handwritten scripts in M4 macros
and continued to add features and improve the techniques used in the
checks.  Prominent among the testers were François Pinard, who came up
with the idea of making an Autoconf shell script to run M4
and check for unresolved macro calls; Richard Pixley, who suggested
running the compiler instead of searching the file system to find
include files and symbols, for more accurate results; Karl Berry, who
got Autoconf to configure @TeX{} and added the macro index to the
documentation; and Ian Lance Taylor, who added support for creating a C
header file as an alternative to putting @option{-D} options in a
makefile, so he could use Autoconf for his UUCP package.
The alpha testers cheerfully adjusted their files again and again as the
names and calling conventions of the Autoconf macros changed from
release to release.  They all contributed many specific checks, great
ideas, and bug fixes.

@node Numbers
@section Numbers

In July 1992, after months of alpha testing, I released Autoconf 1.0,
and converted many GNU packages to use it.  I was surprised by how
positive the reaction to it was.  More people started using it than I
could keep track of, including people working on software that wasn't
part of the GNU Project (such as TCL, FSP, and Kerberos V5).
Autoconf continued to improve rapidly, as many people using the
@command{configure} scripts reported problems they encountered.

Autoconf turned out to be a good torture test for M4 implementations.
Unix M4 started to dump core because of the length of the
macros that Autoconf defined, and several bugs showed up in GNU
M4 as well.  Eventually, we realized that we needed to use some
features that only GNU M4 has.  4.3BSD M4, in
particular, has an impoverished set of builtin macros; the System V
version is better, but still doesn't provide everything we need.

More development occurred as people put Autoconf under more stresses
(and to uses I hadn't anticipated).  Karl Berry added checks for X11.
david zuhn contributed C++ support.  François Pinard made it diagnose
invalid arguments.  Jim Blandy bravely coerced it into configuring
GNU Emacs, laying the groundwork for several later improvements.
Roland McGrath got it to configure the GNU C Library, wrote the
@command{autoheader} script to automate the creation of C header file
templates, and added a @option{--verbose} option to @command{configure}.
Noah Friedman added the @option{--autoconf-dir} option and
@code{AC_MACRODIR} environment variable.  (He also coined the term
@dfn{autoconfiscate} to mean ``adapt a software package to use
Autoconf''.)  Roland and Noah improved the quoting protection in
@code{AC_DEFINE} and fixed many bugs, especially when I got sick of
dealing with portability problems from February through June, 1993.

@node Deuteronomy
@section Deuteronomy

A long wish list for major features had accumulated, and the effect of
several years of patching by various people had left some residual
cruft.  In April 1994, while working for Cygnus Support, I began a major
revision of Autoconf.  I added most of the features of the Cygnus
@command{configure} that Autoconf had lacked, largely by adapting the
relevant parts of Cygnus @command{configure} with the help of david zuhn
and Ken Raeburn.  These features include support for using
@file{config.sub}, @file{config.guess}, @option{--host}, and
@option{--target}; making links to files; and running @command{configure}
scripts in subdirectories.  Adding these features enabled Ken to convert
GNU @code{as}, and Rob Savoye to convert DejaGNU, to using
Autoconf.

I added more features in response to other peoples' requests.  Many
people had asked for @command{configure} scripts to share the results of
the checks between runs, because (particularly when configuring a large
source tree, like Cygnus does) they were frustratingly slow.  Mike
Haertel suggested adding site-specific initialization scripts.  People
distributing software that had to unpack on MS-DOS asked for a way to
override the @file{.in} extension on the file names, which produced file
names like @file{config.h.in} containing two dots.  Jim Avera did an
extensive examination of the problems with quoting in @code{AC_DEFINE}
and @code{AC_SUBST}; his insights led to significant improvements.
Richard Stallman asked that compiler output be sent to @file{config.log}
instead of @file{/dev/null}, to help people debug the Emacs
@command{configure} script.

I made some other changes because of my dissatisfaction with the quality
of the program.  I made the messages showing results of the checks less
ambiguous, always printing a result.  I regularized the names of the
macros and cleaned up coding style inconsistencies.  I added some
auxiliary utilities that I had developed to help convert source code
packages to use Autoconf.  With the help of François Pinard, I made
the macros not interrupt each others' messages.  (That feature revealed
some performance bottlenecks in GNU M4, which he hastily
corrected!)  I reorganized the documentation around problems people want
to solve.  And I began a test suite, because experience had shown that
Autoconf has a pronounced tendency to regress when we change it.

Again, several alpha testers gave invaluable feedback, especially
François Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn,
and Mark Eichin.

Finally, version 2.0 was ready.  And there was much rejoicing.  (And I
have free time again.  I think.  Yeah, right.)


@c ========================================================== Appendices


@node GNU Free Documentation License
@appendix GNU Free Documentation License

@include fdl.texi

@node Indices
@appendix Indices

@menu
* Environment Variable Index::  Index of environment variables used
* Output Variable Index::       Index of variables set in output files
* Preprocessor Symbol Index::   Index of C preprocessor symbols defined
* Cache Variable Index::        Index of documented cache variables
* Autoconf Macro Index::        Index of Autoconf macros
* M4 Macro Index::              Index of M4, M4sugar, and M4sh macros
* Autotest Macro Index::        Index of Autotest macros
* Program & Function Index::    Index of those with portability problems
* Concept Index::               General index
@end menu

@node Environment Variable Index
@appendixsec Environment Variable Index

This is an alphabetical list of the environment variables that might
influence Autoconf checks.

@printindex ev

@node Output Variable Index
@appendixsec Output Variable Index

This is an alphabetical list of the variables that Autoconf can
substitute into files that it creates, typically one or more
makefiles.  @xref{Setting Output Variables}, for more information
on how this is done.

@printindex ov

@node Preprocessor Symbol Index
@appendixsec Preprocessor Symbol Index

This is an alphabetical list of the C preprocessor symbols that the
Autoconf macros define.  To work with Autoconf, C source code needs to
use these names in @code{#if} or @code{#ifdef} directives.

@printindex cv

@node Cache Variable Index
@appendixsec Cache Variable Index

This is an alphabetical list of documented cache variables used
by macros defined in Autoconf.  Autoconf macros may use additional cache
variables internally.
@ifset shortindexflag
To make the list easier to use, the variables are listed without their
preceding @samp{ac_cv_}.
@end ifset

@printindex CA

@node Autoconf Macro Index
@appendixsec Autoconf Macro Index

This is an alphabetical list of the Autoconf macros.
@ifset shortindexflag
To make the list easier to use, the macros are listed without their
preceding @samp{AC_}.
@end ifset

@printindex AC

@node M4 Macro Index
@appendixsec M4 Macro Index

This is an alphabetical list of the M4, M4sugar, and M4sh macros.
@ifset shortindexflag
To make the list easier to use, the macros are listed without their
preceding @samp{m4_} or @samp{AS_}.  The prefix is @samp{m4_} for
all-lowercase macro names and @samp{AS_} for all-uppercase macro
names.
@end ifset

@printindex MS

@node Autotest Macro Index
@appendixsec Autotest Macro Index

This is an alphabetical list of the Autotest macros.
@ifset shortindexflag
To make the list easier to use, the macros are listed without their
preceding @samp{AT_}.
@end ifset

@printindex AT

@node Program & Function Index
@appendixsec Program and Function Index

This is an alphabetical list of the programs and functions whose
portability is discussed in this document.

@printindex pr

@node Concept Index
@appendixsec Concept Index

This is an alphabetical list of the files, tools, and concepts
introduced in this document.

@printindex cp

@bye

@c  LocalWords:  texinfo setfilename autoconf texi settitle setchapternewpage
@c  LocalWords:  setcontentsaftertitlepage finalout ARG ovar varname dvar acx
@c  LocalWords:  makeinfo dvi defcodeindex ev ov CPP cv Autotest mv defindex fn
@c  LocalWords:  shortindexflag iftex ifset acindex ACindex ifclear ahindex fu
@c  LocalWords:  asindex MSindex atindex ATindex auindex hdrindex prindex FIXME
@c  LocalWords:  msindex alloca fnindex Aaarg indices FSF's dircategory ifnames
@c  LocalWords:  direntry autoscan autoreconf autoheader autoupdate config FDs
@c  LocalWords:  testsuite titlepage Elliston Demaille vskip filll ifnottex hmm
@c  LocalWords:  insertcopying Autoconf's detailmenu Automake Libtool POSIX ois
@c  LocalWords:  Systemology Checkpointing Changequote INTERCAL changequote dfn
@c  LocalWords:  Quadrigraphs builtins Shellology acconfig Bugward LIBOBJ Imake
@c  LocalWords:  LIBOBJS IFELSE cindex flushright Pinard Metaconfig uref Simons
@c  LocalWords:  distclean uninstall noindent versioning Tromey dir vr
@c  LocalWords:  SAMS samp aclocal acsite underquoted emph itemx prepend SUBST
@c  LocalWords:  evindex automake Gettext autopoint gettext symlink libtoolize
@c  LocalWords:  defmac INIT tarname ovindex cvindex BUGREPORT PREREQ asis PROG
@c  LocalWords:  SRCDIR srcdir globbing afterwards cmds foos fooo foooo init cd
@c  LocalWords:  builddir timestamp src Imakefile chmod defvar CFLAGS CPPFLAGS
@c  LocalWords:  CXXFLAGS DEFS DHAVE defvarx FCFLAGS FFLAGS LDFLAGS bindir GCC
@c  LocalWords:  datadir datarootdir docdir dvidir htmldir libdir ifnothtml kbd
@c  LocalWords:  includedir infodir libexecdir localedir localstatedir mandir
@c  LocalWords:  oldincludedir pdfdir PDF psdir PostScript sbindir sysconfdir
@c  LocalWords:  sharedstatedir DDATADIR sed tmp pkgdatadir VPATH conf unistd
@c  LocalWords:  undef endif builtin FUNCS ifndef STACKSEG getb GETB YMP fubar
@c  LocalWords:  PRE dest SUBDIRS subdirs fi struct STDC stdlib stddef INTTYPES
@c  LocalWords:  inttypes STDINT stdint AWK AIX Solaris NeXT env EGREP FGREP yy
@c  LocalWords:  LEXLIB YYTEXT lfl nonportable Automake's LN RANLIB byacc INETD
@c  LocalWords:  inetd prog PROGS progs ranlib lmp lXt lX nsl gethostbyname UX
@c  LocalWords:  isinf isnan glibc IRIX sunmath lm lsunmath pre sizeof
@c  LocalWords:  ld inline malloc putenv setenv FreeBSD realloc SunOS MinGW
@c  LocalWords:  snprintf vsnprintf sprintf vsprintf sscanf gcc strerror ifdef
@c  LocalWords:  strnlen sysconf PAGESIZE unsetenv va fallback memcpy dst FUNC
@c  LocalWords:  PowerPC GNUC libPW pragma Olibcalls CHOWN chown CLOSEDIR VFORK
@c  LocalWords:  closedir FNMATCH fnmatch vfork FSEEKO LARGEFILE fseeko SVR sc
@c  LocalWords:  largefile GETGROUPS getgroups GETLOADAVG DGUX UMAX NLIST KMEM
@c  LocalWords:  SETGID getloadavg nlist GETMNTENT irix acxindex autom
@c  LocalWords:  getmntent UnixWare GETPGRP getpgid getpgrp POSIX's pid LSTAT
@c  LocalWords:  lstat rpl MEMCMP memcmp OpenStep MBRTOWC mbrtowc MKTIME mktime
@c  LocalWords:  localtime MMAP mmap OBSTACK obstack obstacks ARGTYPES timeval
@c  LocalWords:  SETPGRP setpgrp defmacx Hurd SETVBUF setvbuf STRCOLL strcoll
@c  LocalWords:  STRTOD strtod DECL STRFTIME strftime UTIME utime VPRINTF
@c  LocalWords:  DOPRNT vprintf doprnt sp unfixable LIBSOURCE LIBSOURCES Eggert
@c  LocalWords:  linux netinet ia Tru XFree DIRENT NDIR dirent ndir multitable
@c  LocalWords:  NAMLEN strlen namlen MKDEV SYSMACROS makedev RESOLV resolv DNS
@c  LocalWords:  inet structs NAMESER arpa NETDB netdb UTekV UTS GCC's kB
@c  LocalWords:  STDBOOL BOOL stdbool cplusplus bool Bool stdarg tm te
@c  LocalWords:  ctype strchr strrchr rindex bcopy memmove memchr WEXITSTATUS
@c  LocalWords:  WIFEXITED TIOCGWINSZ GWINSZ termios preprocess preprocessable
@c  LocalWords:  DECLS strdup calloc BLKSIZE blksize RDEV rdev TZNAME tzname pw
@c  LocalWords:  passwd gecos pwd MBSTATE mbstate wchar RETSIGTYPE hup UID uid
@c  LocalWords:  gid ptrdiff uintmax EXEEXT OBJEXT Ae conftest AXP str
@c  LocalWords:  ALIGNOF WERROR Werror cpp HP's WorkShop egcs un fied stdc CXX
@c  LocalWords:  varargs BIGENDIAN Endianness SPARC endianness grep'ed CONST FC
@c  LocalWords:  const STRINGIZE stringizing PARAMS unprotoize protos KCC cxx
@c  LocalWords:  xlC aCC CXXCPP FREEFORM xlf FLIBS FCLIBS ish SRCEXT XTRA LFS
@c  LocalWords:  ISC lcposix MINIX Minix conditionalized inlines hw dD confdefs
@c  LocalWords:  fputs stdout PREPROC ar UFS HFS QNX realtime fstype STATVFS se
@c  LocalWords:  statvfs STATFS statfs func machfile hdr lelf raboof DEFUN GTK
@c  LocalWords:  GTKMM Grmph ified ine defn baz EOF qar Ahhh changecom algol io
@c  LocalWords:  changeword quadrigraphs quadrigraph dnl SGI atoi overquoting
@c  LocalWords:  Aas Wcross sep args namespace undefine bpatsubst popdef dquote
@c  LocalWords:  bregexp Overquote overquotation meisch maisch meische maische
@c  LocalWords:  miscian DIRNAME dirname MKDIR CATFILE XMKMF TRAVOLTA celsius
@c  LocalWords:  EMX emxos Emacsen Korn DYNIX subshell posix Ksh ksh Pdksh Zsh
@c  LocalWords:  pdksh zsh Allbery Lipe Kubota UWS zorglub stderr eval esac lfn
@c  LocalWords:  drivespec POSIXy DJGPP doschk prettybird LPT pfew Zsh's yu yaa
@c  LocalWords:  yM uM aM firebird IP subdir misparses ok Unpatched abc bc zA
@c  LocalWords:  CDPATH DUALCASE LINENO prepass Subshells lineno NULLCMD cmp wc
@c  LocalWords:  MAILPATH scanset arg NetBSD Almquist printf expr cp pR
@c  LocalWords:  Oliva awk Aaaaarg cmd regex xfoo GNV OpenVMS VM url fc
@c  LocalWords:  sparc Proulx nbar nfoo maxdepth acdilrtu TWG mc ing FP
@c  LocalWords:  mkdir exe uname OpenBSD Fileutils mktemp umask TMPDIR guid os
@c  LocalWords:  fooXXXXXX Unicos utimes hpux hppa unescaped SUBST'ed
@c  LocalWords:  pmake DOS's gmake ifoo DESTDIR autoconfiscated pc coff mips gg
@c  LocalWords:  cpu wildcards rpcc rdtsc powerpc readline
@c  LocalWords:  withval vxworks gless localcache usr LOFF loff CYGWIN Cygwin
@c  LocalWords:  cygwin SIGLIST siglist SYSNDIR SYSDIR ptx lseq rusage elif MSC
@c  LocalWords:  lfoo POUNDBANG lsun NIS getpwnam SYSCALLS RSH INTL lintl aix
@c  LocalWords:  intl lx ldir syslog bsd EPI toolchain netbsd objext de KNR nn
@c  LocalWords:  fication LTLIBOBJS Wdiff TESTDIR atconfig atlocal akim XFAIL
@c  LocalWords:  ChangeLog prepended errexit smallexample TESTSUITEFLAGS GPL er
@c  LocalWords:  installcheck autotest indir Pixley Bothner Eichin Kerberos adl
@c  LocalWords:  DISTCLEANFILES preprocessor's fileutils Stallman Murphey Stenn
@c  LocalWords:  Manfredi Autoconfig TCL FSP david zuhn Blandy MACRODIR Raeburn
@c  LocalWords:  autoconfiscate Savoye Haertel Avera Meyering fdl appendixsec
@c  LocalWords:  printindex american LIBOBJDIR LibdirTest ERLCFLAGS OBJCFLAGS
@c  LocalWords:  VER Gnulib online xyes strcpy TYPEOF typeof OBJC objcc objc ln
@c  LocalWords:  GOBJC OTP ERLC erl valloc decr dumpdef errprint incr
@c  LocalWords:  esyscmd len maketemp pushdef substr syscmd sysval translit txt
@c  LocalWords:  sinclude foreach myvar tolower toupper uniq BASENAME STDIN
@c  LocalWords:  Dynix basename aname cname macroexpands xno xcheck iso
@c  LocalWords:  LIBREADLINE lreadline lncurses libreadline vrindex SYS
@c  LocalWords:  syncodeindex define'd caindex CAindex MacKenzie DIRS
@c  LocalWords:  Runtime runtime Submakes submakes MAKEFLAGS whitespace
@c  LocalWords:  Timestamps Unportability Canonicalizing stdckdint dirN
@c  LocalWords:  acinclude AMFLAGS LIBS OBJCXXFLAGS GOFLAGS runstatedir
@c  LocalWords:  metacharacter EXPENSIVEP errno setjmp wctype sys mawk
@c  LocalWords:  nawk ggrep egrep gegrep fgrep gfgrep LEX lex yytext nm
@c  LocalWords:  yywrap xflex lexyy YFLAGS yacc divnum libs fuindex ffs
@c  LocalWords:  environ sigaction extern ftello nonnull STRTOLD LLONG
@c  LocalWords:  strtold vfprintf ULLONG strcasecmp strncasecmp MSVC th
@c  LocalWords:  NDEBUG INO libc ISDIR ISREG Tektronix Amdahl ino
@c  LocalWords:  typedef pxref fileblocks submembers INTMAX intmax UINT
@c  LocalWords:  INTPTR intptr SSIZE ssize uint UINTPTR uintptr OPENMP
@c  LocalWords:  openmp OpenMP omp Alignas Alignof Noreturn UTF vals gl
@c  LocalWords:  offsetof VARARRAYS VLA CCC stdcxx nullptr
@c  LocalWords:  constexpr decltype unicode fstreams iostreams iomanip
@c  LocalWords:  stringstreams GXX OBJCPP OBJCXX objcxx GOBJCXX erlc tx
@c  LocalWords:  OBJCXXCPP FIXEDFORM GFC argc argv shellvar fpp MODEXT
@c  LocalWords:  freeform fixedform MODINC MODOUT gccgo GOC xmkmf fseek
@c  LocalWords:  interpval ftell Interix macOS PTHREAD NonStop XOPEN xc
@c  LocalWords:  IEC ATTRIBS BFP DFP O'Donell Sebor ERTS Erlang's erts
@c  LocalWords:  erlang Wundef scalable USG NOTMAKE DOUCH
@c  LocalWords:  IVE changesyntax ifnotinfo oline num cfg debugfile cdr
@c  LocalWords:  debugmode traceoff traceon patsubst dumpdefs ifelse aa
@c  LocalWords:  mkstemp undivert lifo errprintn BINSH sanitization bcd
@c  LocalWords:  cleardivert bmatch bpatsubsts subst cond nblank ifval
@c  LocalWords:  ifblank ifnblank ifvaln fputc fgetc argn mapall dvarv
@c  LocalWords:  shiftn abcd elt noquote mkargs joinall SHA prereq dup
@c  LocalWords:  listc setb seta ARITH HNUM xcurly xoccupied
@c  LocalWords:  TESTA TESTB TESTC hoc xpg xxyzzyz dtksh nosuch fifos
@c  LocalWords:  fifo Stardent sig WIF WIFSIGNALED SIGQUIT tty perl ret
@c  LocalWords:  SIGINT NUL SFN PRN aeiou MSYS SIGTERM xhi arith UWIN
@c  LocalWords:  CLICOLOR FPATH POSIXLY Shellshock CVE doit ec ci
@c  LocalWords:  notreached cim nc ACL faccessat Alexandre getline sqrt
@c  LocalWords:  CONVFMT FS OFMT CDS chgrp futimens utimensat oo esc od
@c  LocalWords:  ownerships mape readdir mkfifo mknod testsuites XSI rf
@c  LocalWords:  bcdox hexdump filelist rmdir flushleft busybox nl HAZy
@c  LocalWords:  ABCDEFGHIJKLMNOPQRSTUVWXYZ Fantazy FAntAZy adc unix xb
@c  LocalWords:  SUBMAKEFLAGS ehBc ehB hBc hvB dmake hostname nlinit xf
@c  LocalWords:  DCOMMENT bart pathnames ifhtml randx
@c  LocalWords:  sumc hic ic fwrapv ftrapv SIGFPE memset fmudflap ctime
@c  LocalWords:  asctime lvalues lvalue Multithreaded decstation gdb na
@c  LocalWords:  enableval lesskey FHS superset waitpid libfoo cposix
@c  LocalWords:  mem RESTARTABLE bzero DejaGNU EUNIT subfile optarg ive
@c  LocalWords:  nolog expout experr erlflags EUnit testme eunit myprog
@c  LocalWords:  configmake vx bashdb tvtwm questers UUCP McGrath
@c  LocalWords:  ispell
@c Local Variables:
@c coding: utf-8
@c fill-column: 72
@c ispell-local-dictionary: "american"
@c indent-tabs-mode: nil
@c whitespace-check-buffer-indent: nil
@c End:
