This is autoconf.info, produced by makeinfo version 4.13 from
autoconf.texi.

This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
package for creating scripts to configure source code packages using
templates and an M4 macro package.

   Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.

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

INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* Autoconf: (autoconf).         Create source code configuration scripts.
END-INFO-DIR-ENTRY

INFO-DIR-SECTION Individual utilities
START-INFO-DIR-ENTRY
* autoscan: (autoconf)autoscan Invocation.
                                Semi-automatic `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 `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 `configure.ac'
* config.status: (autoconf)config.status Invocation. Recreating configurations.
* testsuite: (autoconf)testsuite Invocation.    Running an Autotest test suite.
END-INFO-DIR-ENTRY


File: autoconf.info,  Node: Top,  Next: Introduction,  Up: (dir)

Autoconf
********

This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
package for creating scripts to configure source code packages using
templates and an M4 macro package.

   Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.

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

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

 --- 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 `configure' Scripts

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

Writing `configure.ac'

* Shell Script Compiler::       Autoconf as solution of a problem
* Autoconf Language::           Programming in Autoconf
* Autoconf Input Layout::       Standard organization of `configure.ac'

Initialization and Output Files

* Initializing configure::      Option processing etc.
* Versioning::                  Dealing with Autoconf versions
* Notices::                     Copyright, version numbers in `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 `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
* Posix Variants::              Special kludges for specific 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
* Systemology::                 A zoology of operating systems
* 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 `configure' runs
* Printing Messages::           Notifying `configure' users

Caching Results

* Cache Variable Names::        Shell variables used in caches
* Cache Files::                 Files `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 `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
* Reporting Messages::          Notifying `autoconf' users
* 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 a` 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

* 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
* Slashes::                     Slashes 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
* 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
* Long Lines in Makefiles::     Line length limitations
* Macros and Submakes::         `make macro=value' and submakes
* The Make Macro MAKEFLAGS::    `$(MAKEFLAGS)' portability issues
* The Make Macro SHELL::        `$(SHELL)' portability issues
* Parallel Make::               Parallel `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 `obj'
* make -k Status::              Exit status of `make -k'
* VPATH and Make::              `VPATH' woes
* Single Suffix Rules::         Single suffix rules and separated dependencies
* Timestamps and Make::         Subsecond timestamp resolution

`VPATH' and Make

* Variables listed in VPATH::   `VPATH' must be literal on ancient hosts
* VPATH and Double-colon::      Problems with `::' on ancient hosts
* $< in Explicit Rules::        `$<' does not work in ordinary rules
* Automatic Rule Rewriting::    `VPATH' goes wild on Solaris
* Tru64 Directory Magic::       `mkdir' goes wild on Tru64
* Make Target Lookup::          More details about `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::     `#if' expression problems
* Null Pointers::               Properties of null pointers
* Buffer Overruns::             Subscript errors and the like
* Volatile Objects::            `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::     `INT_MIN / -1' and `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 `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 `configure' options
* Site Details::                Configuring site details
* Transforming Names::          Changing program names when installing
* Site Defaults::               Giving `configure' local defaults

Transforming Program Names When Installing

* Transformation Options::      `configure' options to transform names
* Transformation Examples::     Sample uses of transforming names
* Transformation Rules::        Makefile uses of transforming names

Running `configure' Scripts

* Basic Installation::          Instructions for typical cases
* 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
* Particular Systems::          Particular systems
* System Type::                 Specifying the system type
* Sharing Defaults::            Setting site-wide defaults for `configure'
* Defining Variables::          Specifying the compiler etc.
* configure Invocation::        Changing how `configure' runs

Obsolete Constructs

* Obsolete config.status Use::  Obsolete convention for `config.status'
* acconfig Header::             Additional entries in `config.h.in'
* autoupdate Invocation::       Automatic update of `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 `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 `testsuite' scripts
* Making testsuite Scripts::    Using autom4te to create `testsuite'

Using an Autotest Test Suite

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

Frequent Autoconf Questions, with answers

* Distributing::                Distributing `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 `configure' instead of Imake
* Defining Directories::        Passing `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 `configure' scripts

History of Autoconf

* Genesis::                     Prehistory and naming of `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


File: autoconf.info,  Node: Introduction,  Next: The GNU Build System,  Prev: Top,  Up: Top

1 Introduction
**************

 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..." "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..." The computer scientist
  shouted: "And the Chaos, where do you think it was coming from, hmm?"

                                                            --Anonymous

   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.

   Those who do not understand Autoconf are condemned to reinvent it,
poorly.  The primary goal of Autoconf is making the _user's_ life
easier; making the _maintainer's_ life easier is only a secondary goal.
Put another way, the primary goal is not to make the generation of
`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 `configure' painless, portable,
and predictable for the end user of each "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 `configure'.
Even packages that don't use Autoconf will generally provide a
`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 (*note Configuration:
(standards)Configuration.) that users have come to expect from
Autoconf-generated `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.  *Note The GNU Build System::, for more information.

   Autoconf imposes some restrictions on the names of macros used with
`#if' in C programs (*note Preprocessor Symbol Index::).

   Autoconf requires GNU M4 version 1.4.6 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.14
or later, though this is not required.

   *Note Autoconf 1::, for information about upgrading from version 1.
*Note History::, for the story of Autoconf's development.  *Note FAQ::,
for answers to some common questions about Autoconf.

   See the Autoconf web page (http://www.gnu.org/software/autoconf/)
for up-to-date information, details on the mailing lists, pointers to a
list of known bugs, etc.

   Mail suggestions to the Autoconf mailing list <autoconf@gnu.org>.
Past suggestions are archived
(http://lists.gnu.org/archive/html/autoconf/).

   Mail bug reports to the Autoconf Bugs mailing list
<bug-autoconf@gnu.org>.  Past bug reports are archived
(http://lists.gnu.org/archive/html/bug-autoconf/).

   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
`configure.ac' that demonstrates the problem.

   Autoconf's development tree is accessible via `git'; see the
Autoconf Summary (http://savannah.gnu.org/projects/autoconf/) for
details, or view the actual repository
(http://git.sv.gnu.org/gitweb/?p=autoconf.git).  Anonymous CVS access
is also available, see `README' for more details.  Patches relative to
the current `git' version can be sent for review to the Autoconf
Patches mailing list <autoconf-patches@gnu.org>, with discussion on
prior patches archived
(http://lists.gnu.org/archive/html/autoconf-patches/); and all commits
are posted in the read-only Autoconf Commit mailing list
<autoconf-commit@gnu.org>, which is also archived
(http://lists.gnu.org/archive/html/autoconf-commit/).

   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 Autoconf Macro Archive
(http://www.gnu.org/software/autoconf-archive/), which is kindly run by
Peter Simons <simons@cryp.to>.


File: autoconf.info,  Node: The GNU Build System,  Next: Making configure Scripts,  Prev: Introduction,  Up: Top

2 The 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


File: autoconf.info,  Node: Automake,  Next: Gnulib,  Up: The GNU Build System

2.1 Automake
============

The ubiquity of `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
`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 (`make install', `make distclean', `make uninstall', etc.).
Since you are, of course, using Autoconf, you also have to insert
repetitive code in your `Makefile.in' to recognize `@CC@', `@CFLAGS@',
and other substitutions provided by `configure'.  Into this mess steps
"Automake".  

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

     bin_PROGRAMS = hello
     hello_SOURCES = hello.c

The resulting `Makefile.in' (~400 lines) automatically supports all the
standard targets, the substitutions provided by Autoconf, automatic
dependency tracking, `VPATH' building, and so on.  `make' builds the
`hello' program, and `make install' installs it in `/usr/local/bin' (or
whatever prefix was given to `configure', if not `/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...


File: autoconf.info,  Node: Gnulib,  Next: Libtool,  Prev: Automake,  Up: The GNU Build System

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

   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
`stdbool' module implements a `stdbool.h' header that nearly conforms
to C99, even on old-fashioned hosts that lack `stdbool.h'.  This module
contains a source file for the replacement header, along with an
Autoconf macro that arranges to use the replacement header on
old-fashioned systems.


File: autoconf.info,  Node: Libtool,  Next: Pointers,  Prev: Gnulib,  Up: The GNU Build System

2.3 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 _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:
"Libtool".  

   Libtool handles all the requirements of building shared libraries for
you, and at this time seems to be the _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.


File: autoconf.info,  Node: Pointers,  Prev: Libtool,  Up: The GNU Build System

2.4 Pointers
============

Developers who are used to the simplicity of `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.

   - Web

     The project home pages for Autoconf
     (http://www.gnu.org/software/autoconf/), Automake
     (http://www.gnu.org/software/automake/), Gnulib
     (http://www.gnu.org/software/gnulib/), and Libtool
     (http://www.gnu.org/software/libtool/).

   - Automake Manual

     *Note Automake: (automake)Top, for more information on Automake.

   - Books

     The book `GNU Autoconf, Automake and Libtool'(1) describes the
     complete GNU build environment.  You can also find the entire book
     on-line (http://sources.redhat.com/autobook/).


   ---------- Footnotes ----------

   (1) `GNU Autoconf, Automake and Libtool', by G. V. Vaughan, B.
Elliston, T. Tromey, and I. L. Taylor.  SAMS (originally New Riders),
2000, ISBN 1578701902.


File: autoconf.info,  Node: Making configure Scripts,  Next: Setup,  Prev: The GNU Build System,  Up: Top

3 Making `configure' Scripts
****************************

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

   - one or more `Makefile' files, usually one in each subdirectory of
     the package (*note Makefile Substitutions::);

   - optionally, a C header file, the name of which is configurable,
     containing `#define' directives (*note Configuration Headers::);

   - a shell script called `config.status' that, when run, recreates
     the files listed above (*note config.status Invocation::);

   - an optional shell script normally called `config.cache' (created
     when using `configure --config-cache') that saves the results of
     running many of the tests (*note Cache Files::);

   - a file called `config.log' containing any messages produced by
     compilers, to help debugging if `configure' makes a mistake.

   To create a `configure' script with Autoconf, you need to write an
Autoconf input file `configure.ac' (or `configure.in') and run
`autoconf' on it.  If you write your own feature tests to supplement
those that come with Autoconf, you might also write files called
`aclocal.m4' and `acsite.m4'.  If you use a C header file to contain
`#define' directives, you might also run `autoheader', and you can
distribute the generated 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
`*'.  Optional files are enclosed in square brackets (`[]').
`autoconf' and `autoheader' also read the installed Autoconf macro
files (by reading `autoconf.m4').

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

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

     Makefile.in

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

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

     configure.ac --.
                    +--> automake* --> Makefile.in
     Makefile.am ---'

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

* Menu:

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


File: autoconf.info,  Node: Writing Autoconf Input,  Next: autoscan Invocation,  Up: Making configure Scripts

3.1 Writing `configure.ac'
==========================

To produce a `configure' script for a software package, create a file
called `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 *note Existing
Tests::, for their descriptions.  For most other features, you can use
Autoconf template macros to produce custom checks; see *note Writing
Tests::, for information about them.  For especially tricky or
specialized features, `configure.ac' might need to contain some
hand-crafted shell commands; see *note Portable Shell Programming:
Portable Shell.  The `autoscan' program can give you a good start in
writing `configure.ac' (*note autoscan Invocation::, for more
information).

   Previous versions of Autoconf promoted the name `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
`config.h.in' and so on (for which `.in' means "to be processed by
`configure'").  Using `configure.ac' is now preferred.

* Menu:

* Shell Script Compiler::       Autoconf as solution of a problem
* Autoconf Language::           Programming in Autoconf
* Autoconf Input Layout::       Standard organization of `configure.ac'


File: autoconf.info,  Node: Shell Script Compiler,  Next: Autoconf Language,  Up: Writing Autoconf Input

3.1.1 A Shell Script Compiler
-----------------------------

Just as for any other computer language, in order to properly program
`configure.ac' in Autoconf you must understand _what_ problem the
language tries to address and _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:
`configure' must run on all those systems, and thus `configure' must
limit itself to their lowest common denominator of features.

   Naturally, you might then think of shell scripts; who needs
`autoconf'?  A set of properly written shell functions is enough to
make it easy to write `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, `autoconf', that
takes an Autoconf program, `configure.ac', and transforms it into a
portable shell script, `configure'.

   How does `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 `sh' (Bourne shell) language.

   Autoconf does the latter: it is a layer on top of `sh'.  It was
therefore most convenient to implement `autoconf' as a macro expander:
a program that repeatedly performs "macro expansions" on text input,
replacing macro calls with macro bodies and producing a pure `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.


File: autoconf.info,  Node: Autoconf Language,  Next: Autoconf Input Layout,  Prev: Shell Script Compiler,  Up: Writing Autoconf Input

3.1.2 The Autoconf Language
---------------------------

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.

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

   Arguments should be enclosed within the quote characters `[' and
`]', 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 *note Programming in M4::.

   For instance:

     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])])

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

     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])])

because `1' cannot contain a macro call.  Here, the argument of
`AC_MSG_ERROR' must be quoted; otherwise, its comma would be
interpreted as an argument separator.  Also, the second and third
arguments of `AC_CHECK_HEADER' must be quoted, since they contain macro
calls.  The three arguments `HAVE_STDIO_H', `stdio.h', and `Define to 1
if you have <stdio.h>.' do not need quoting, but if you unwisely
defined a macro with a name like `Define' or `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:

     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])])

This is safe, so long as you adopt good naming conventions and do not
define macros with names like `HAVE_STDIO_H', `stdio', or `h'.  Though
it is also safe here to omit the quotes around `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:

     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]))

   In other cases, you may have to use text that also resembles a macro
call.  You must quote that text even when it is not passed as a macro
argument.  For example, these two approaches in `configure.ac' (quoting
just the potential problems, or quoting the entire line) will protect
your script in case autoconf ever adds a macro `AC_DC':

     echo "Hard rock was here!  --[AC_DC]"
     [echo "Hard rock was here!  --AC_DC"]

which results in this text in `configure':

     echo "Hard rock was here!  --AC_DC"
     echo "Hard rock was here!  --AC_DC"

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 _use double
quoting for all literal string arguments_, either around just the
problematic portions, or over the entire argument:

     AC_MSG_WARN([[AC_DC] stinks  --Iron Maiden])
     AC_MSG_WARN([[AC_DC stinks  --Iron Maiden]])

   However, the above example triggers a warning about a possibly
unexpanded macro when running `autoconf', because it collides with the
namespace of macros reserved for the Autoconf language.  To be really
safe, you can use additional escaping (either a quadrigraph, or
creative shell constructs) to silence that particular warning:

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

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

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

is incorrect: here, the first argument of `AC_LANG_SOURCE' is `char
b[10];' and is expanded once, which results in `char b10;'; and the
`AC_LANG_SOURCE' is also expanded prior to being passed to
`AC_COMPILE_IFELSE'.  (There was an idiom common in Autoconf's past to
address this issue via the M4 `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 `AC_LANG_SOURCE' macro should be quoted once
so that it is only expanded after the rest of the body of
`AC_COMPILE_IFELSE' is in place:

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

Voila`, you actually produce `char b[10];' this time!

   On the other hand, descriptions (e.g., the last parameter of
`AC_DEFINE' or `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 [ARG] (not to be confused with the quote characters).
You may just leave them empty, or use `[]' to make the emptiness of the
argument explicit, or you may simply omit the trailing commas.  The
three lines below are equivalent:

     AC_CHECK_HEADERS([stdio.h], [], [], [])
     AC_CHECK_HEADERS([stdio.h],,,)
     AC_CHECK_HEADERS([stdio.h])

   It is best to put each macro call on its own line in `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 `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 `configure.ac' files by starting them
with the `#'.  For example, it is helpful to begin `configure.ac' files
with a line like this:

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


File: autoconf.info,  Node: Autoconf Input Layout,  Prev: Autoconf Language,  Up: Writing Autoconf Input

3.1.3 Standard `configure.ac' Layout
------------------------------------

The order in which `configure.ac' calls the Autoconf macros is not
important, with a few exceptions.  Every `configure.ac' must contain a
call to `AC_INIT' before the checks, and a call to `AC_OUTPUT' at the
end (*note 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 (*note Existing Tests::), and they also warn
you when `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.

     Autoconf requirements
     `AC_INIT(PACKAGE, VERSION, 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
     `AC_CONFIG_FILES([FILE...])'
     `AC_OUTPUT'


File: autoconf.info,  Node: autoscan Invocation,  Next: ifnames Invocation,  Prev: Writing Autoconf Input,  Up: Making configure Scripts

3.2 Using `autoscan' to Create `configure.ac'
=============================================

The `autoscan' program can help you create and/or maintain a
`configure.ac' file for a software package.  `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
`configure.scan' which is a preliminary `configure.ac' for that
package, and checks a possibly existing `configure.ac' for completeness.

   When using `autoscan' to create a `configure.ac', you should
manually examine `configure.scan' before renaming it to `configure.ac';
it probably needs some adjustments.  Occasionally, `autoscan' outputs a
macro in the wrong order relative to another macro, so that `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 `AC_CONFIG_HEADERS' (*note Configuration Headers::).  You might
also have to change or add some `#if' directives to your program in
order to make it work with Autoconf (*note ifnames Invocation::, for
information about a program that can help with that job).

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

   `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 `#'
are comments.

   `autoscan' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

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

`--debug'
`-d'
     Don't remove temporary files.

`--include=DIR'
`-I DIR'
     Append DIR to the include path.  Multiple invocations accumulate.

`--prepend-include=DIR'
`-B DIR'
     Prepend DIR to the include path.  Multiple invocations accumulate.


File: autoconf.info,  Node: ifnames Invocation,  Next: autoconf Invocation,  Prev: autoscan Invocation,  Up: Making configure Scripts

3.3 Using `ifnames' to List Conditionals
========================================

`ifnames' can help you write `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, `ifnames' can thus help you figure out what its
`configure' needs to check for.  It may help fill in some gaps in a
`configure.ac' generated by `autoscan' (*note autoscan Invocation::).

   `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 `#if', `#elif', `#ifdef', or `#ifndef' directives.  It prints each
identifier on a line, followed by a space-separated list of the files
in which that identifier occurs.

`ifnames' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.


File: autoconf.info,  Node: autoconf Invocation,  Next: autoreconf Invocation,  Prev: ifnames Invocation,  Up: Making configure Scripts

3.4 Using `autoconf' to Create `configure'
==========================================

To create `configure' from `configure.ac', run the `autoconf' program
with no arguments.  `autoconf' processes `configure.ac' with the M4
macro processor, using the Autoconf macros.  If you give `autoconf' an
argument, it reads that file instead of `configure.ac' and writes the
configuration script to the standard output instead of to `configure'.
If you give `autoconf' the argument `-', it reads from the standard
input instead of `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; `autoconf' reads them first.  Then it
looks for the optional file `acsite.m4' in the directory that contains
the distributed Autoconf macro files, and for the optional file
`aclocal.m4' in the current directory.  Those files can contain your
site's or the package's own Autoconf macro definitions (*note Writing
Autoconf Macros::, for more information).  If a macro is defined in
more than one of the files that `autoconf' reads, the last definition
it reads overrides the earlier ones.

   `autoconf' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

`--verbose'
`-v'
     Report processing steps.

`--debug'
`-d'
     Don't remove the temporary files.

`--force'
`-f'
     Remake `configure' even if newer than its input files.

`--include=DIR'
`-I DIR'
     Append DIR to the include path.  Multiple invocations accumulate.

`--prepend-include=DIR'
`-B DIR'
     Prepend DIR to the include path.  Multiple invocations accumulate.

`--output=FILE'
`-o FILE'
     Save output (script or trace) to FILE.  The file `-' stands for
     the standard output.

`--warnings=CATEGORY'
`-W CATEGORY'
     Report the warnings related to CATEGORY (which can actually be a
     comma separated list).  *Note Reporting Messages::, macro
     `AC_DIAGNOSE', for a comprehensive list of categories.  Special
     values include:

    `all'
          report all the warnings

    `none'
          report none

    `error'
          treats warnings as errors

    `no-CATEGORY'
          disable warnings falling into CATEGORY

     Warnings about `syntax' are enabled by default, and the environment
     variable `WARNINGS', a comma separated list of categories, is
     honored as well.  Passing `-W CATEGORY' actually behaves as if you
     had passed `--warnings syntax,$WARNINGS,CATEGORY'.  To disable the
     defaults and `WARNINGS', and then enable warnings about obsolete
     constructs, use `-W none,obsolete'.

     Because `autoconf' uses `autom4te' behind the scenes, it displays
     a back trace for errors, but not for warnings; if you want them,
     just pass `-W error'.  *Note autom4te Invocation::, for some
     examples.

`--trace=MACRO[:FORMAT]'
`-t MACRO[:FORMAT]'
     Do not create the `configure' script, but list the calls to MACRO
     according to the FORMAT.  Multiple `--trace' arguments can be used
     to list several macros.  Multiple `--trace' arguments for a single
     macro are not cumulative; instead, you should just make FORMAT as
     long as needed.

     The FORMAT is a regular string, with newlines if desired, and
     several special escape codes.  It defaults to `$f:$l:$n:$%'; see
     *note autom4te Invocation::, for details on the FORMAT.

`--initialization'
`-i'
     By default, `--trace' does not trace the initialization of the
     Autoconf macros (typically the `AC_DEFUN' definitions).  This
     results in a noticeable speedup, but can be disabled by this
     option.

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

     $ autoconf -t AC_SUBST
     configure.ac:2:AC_SUBST:ECHO_C
     configure.ac:2:AC_SUBST:ECHO_N
     configure.ac:2:AC_SUBST:ECHO_T
     More traces deleted

The example below highlights the difference between `$@', `$*', and
`$%'.

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

The FORMAT gives you a lot of freedom:

     $ autoconf -t 'AC_SUBST:$$ac_subst{"$1"} = "$f:$l";'
     $ac_subst{"ECHO_C"} = "configure.ac:2";
     $ac_subst{"ECHO_N"} = "configure.ac:2";
     $ac_subst{"ECHO_T"} = "configure.ac:2";
     More traces deleted

A long 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):

     $ autoconf -t 'AM_MISSING_PROG:${|:::::|}*'
     ACLOCAL|:::::|aclocal|:::::|$missing_dir
     AUTOCONF|:::::|autoconf|:::::|$missing_dir
     AUTOMAKE|:::::|automake|:::::|$missing_dir
     More traces deleted


File: autoconf.info,  Node: autoreconf Invocation,  Prev: autoconf Invocation,  Up: Making configure Scripts

3.5 Using `autoreconf' to Update `configure' Scripts
====================================================

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

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

   If you install a new version of some tool, you can make `autoreconf'
remake _all_ of the files by giving it the `--force' option.

   *Note Automatic Remaking::, for Make rules to automatically rebuild
`configure' scripts when their source files change.  That method
handles the timestamps of configuration header templates properly, but
does not pass `--autoconf-dir=DIR' or `--localdir=DIR'.

   Gettext supplies the `autopoint' command to add translation
infrastructure to a source package.  If you use `autopoint', your
`configure.ac' should invoke both `AM_GNU_GETTEXT' and
`AM_GNU_GETTEXT_VERSION(GETTEXT-VERSION)'.  *Note Invoking the
`autopoint' Program: (gettext)autopoint Invocation, for further details.

`autoreconf' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

`--verbose'
`-v'
     Print the name of each directory `autoreconf' examines and the
     commands it runs.  If given two or more times, pass `--verbose' to
     subordinate tools that support it.

`--debug'
`-d'
     Don't remove the temporary files.

`--force'
`-f'
     Remake even `configure' scripts and configuration headers that are
     newer than their input files (`configure.ac' and, if present,
     `aclocal.m4').

`--install'
`-i'
     Install the missing auxiliary files in the package.  By default,
     files are copied; this can be changed with `--symlink'.

     If deemed appropriate, this option triggers calls to `automake
     --add-missing', `libtoolize', `autopoint', etc.

`--no-recursive'
     Do not rebuild files in subdirectories to configure (see *note
     Subdirectories::, macro `AC_CONFIG_SUBDIRS').

`--symlink'
`-s'
     When used with `--install', install symbolic links to the missing
     auxiliary files instead of copying them.

`--make'
`-m'
     When the directories were configured, update the configuration by
     running `./config.status --recheck && ./config.status', and then
     run `make'.

`--include=DIR'
`-I DIR'
     Append DIR to the include path.  Multiple invocations accumulate.
     Passed on to `aclocal', `autoconf' and `autoheader' internally.

`--prepend-include=DIR'
`-B DIR'
     Prepend DIR to the include path.  Multiple invocations accumulate.
     Passed on to `autoconf' and `autoheader' internally.

`--warnings=CATEGORY'
`-W CATEGORY'
     Report the warnings related to CATEGORY (which can actually be a
     comma separated list).

    `cross'
          related to cross compilation issues.

    `obsolete'
          report the uses of obsolete constructs.

    `portability'
          portability issues

    `syntax'
          dubious syntactic constructs.

    `all'
          report all the warnings

    `none'
          report none

    `error'
          treats warnings as errors

    `no-CATEGORY'
          disable warnings falling into CATEGORY

     Warnings about `syntax' are enabled by default, and the environment
     variable `WARNINGS', a comma separated list of categories, is
     honored as well.  Passing `-W CATEGORY' actually behaves as if you
     had passed `--warnings syntax,$WARNINGS,CATEGORY'.  To disable the
     defaults and `WARNINGS', and then enable warnings about obsolete
     constructs, use `-W none,obsolete'.

   If you want `autoreconf' to pass flags that are not listed here on
to `aclocal', set `ACLOCAL_AMFLAGS' in your `Makefile.am'.  Due to a
limitation in the Autoconf implementation these flags currently must be
set on a single line in `Makefile.am', without any backslash-newlines.


File: autoconf.info,  Node: Setup,  Next: Existing Tests,  Prev: Making configure Scripts,  Up: Top

4 Initialization and Output Files
*********************************

Autoconf-generated `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 `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


File: autoconf.info,  Node: Initializing configure,  Next: Versioning,  Up: Setup

4.1 Initializing `configure'
============================

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

 -- Macro: AC_INIT (PACKAGE, VERSION, [BUG-REPORT], [TARNAME], [URL])
     Process any command-line arguments and perform initialization and
     verification.

     Set the name of the PACKAGE and its VERSION.  These are typically
     used in `--version' support, including that of `configure'.  The
     optional argument BUG-REPORT should be the email to which users
     should send bug reports.  The package TARNAME differs from
     PACKAGE: the latter designates the full package name (e.g., `GNU
     Autoconf'), while the former is meant for distribution tar ball
     names (e.g., `autoconf').  It defaults to PACKAGE with `GNU '
     stripped, lower-cased, and all characters other than alphanumerics
     and underscores are changed to `-'.  If provided, URL should be
     the home page for the package.

     The arguments of `AC_INIT' must be static, i.e., there should not
     be any shell computation, quotes, or newlines, but they can be
     computed by M4.  This is because the package information strings
     are expanded at M4 time into several contexts, and must give the
     same text at shell time whether used in single-quoted strings,
     double-quoted strings, quoted here-documents, or unquoted
     here-documents.  It is permissible to use `m4_esyscmd' or
     `m4_esyscmd_s' for computing a version string that changes with
     every commit to a version control system (in fact, Autoconf does
     just that, for all builds of the development tree made between
     releases).

     The following M4 macros (e.g., `AC_PACKAGE_NAME'), output variables
     (e.g., `PACKAGE_NAME'), and preprocessor symbols (e.g.,
     `PACKAGE_NAME'), are defined by `AC_INIT':

    `AC_PACKAGE_NAME', `PACKAGE_NAME'
          Exactly PACKAGE.

    `AC_PACKAGE_TARNAME', `PACKAGE_TARNAME'
          Exactly TARNAME, possibly generated from PACKAGE.

    `AC_PACKAGE_VERSION', `PACKAGE_VERSION'
          Exactly VERSION.

    `AC_PACKAGE_STRING', `PACKAGE_STRING'
          Exactly `PACKAGE VERSION'.

    `AC_PACKAGE_BUGREPORT', `PACKAGE_BUGREPORT'
          Exactly BUG-REPORT, if one was provided.  Typically an email
          address, or URL to a bug management web page.

    `AC_PACKAGE_URL', `PACKAGE_URL'
          Exactly URL, if one was provided.  If URL was empty, but
          PACKAGE begins with `GNU ', then this defaults to
          `http://www.gnu.org/software/TARNAME/', otherwise, no URL is
          assumed.

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


File: autoconf.info,  Node: Versioning,  Next: Notices,  Prev: Initializing configure,  Up: Setup

4.2 Dealing with Autoconf versions
==================================

The following optional macros can be used to help choose the minimum
version of Autoconf that can successfully compile a given
`configure.ac'.

 -- Macro: AC_PREREQ (VERSION)
     Ensure that a recent enough version of Autoconf is being used.  If
     the version of Autoconf being used to create `configure' is
     earlier than VERSION, print an error message to the standard error
     output and exit with failure (exit status is 63).  For example:

          AC_PREREQ([2.69])

     This macro may be used before `AC_INIT'.

 -- Macro: AC_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 `m4_version_compare' (*note
     m4_version_compare::); in other words, for this release of
     Autoconf, its value is `2.69'.  One potential use of this macro is
     for writing conditional fallbacks based on when a feature was
     added to Autoconf, rather than using `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
     `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 `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.


File: autoconf.info,  Node: Notices,  Next: Input,  Prev: Versioning,  Up: Setup

4.3 Notices in `configure'
==========================

The following macros manage version numbers for `configure' scripts.
Using them is optional.

 -- Macro: AC_COPYRIGHT (COPYRIGHT-NOTICE)
     State that, in addition to the Free Software Foundation's
     copyright on the Autoconf macros, parts of your `configure' are
     covered by the COPYRIGHT-NOTICE.

     The COPYRIGHT-NOTICE shows up in both the head of `configure' and
     in `configure --version'.

 -- Macro: AC_REVISION (REVISION-INFO)
     Copy revision stamp REVISION-INFO into the `configure' script,
     with any dollar signs or double-quotes removed.  This macro lets
     you put a revision stamp from `configure.ac' into `configure'
     without RCS or CVS changing it when you check in `configure'.
     That way, you can determine easily which revision of
     `configure.ac' a particular `configure' corresponds to.

     For example, this line in `configure.ac':

          AC_REVISION([$Revision: 1.30 $])

     produces this in `configure':

          #!/bin/sh
          # From configure.ac Revision: 1.30


File: autoconf.info,  Node: Input,  Next: Output,  Prev: Notices,  Up: Setup

4.4 Finding `configure' Input
=============================

 -- Macro: AC_CONFIG_SRCDIR (UNIQUE-FILE-IN-SOURCE-DIR)
     UNIQUE-FILE-IN-SOURCE-DIR is some file that is in the package's
     source directory; `configure' checks for this file's existence to
     make sure that the directory that it is told contains the source
     code in fact does.  Occasionally people accidentally specify the
     wrong directory with `--srcdir'; this is a safety check.  *Note
     configure Invocation::, for more information.

   Packages that do manual configuration or use the `install' program
might need to tell `configure' where to find some other shell scripts
by calling `AC_CONFIG_AUX_DIR', though the default places it looks are
correct for most cases.

 -- Macro: AC_CONFIG_AUX_DIR (DIR)
     Use the auxiliary build tools (e.g., `install-sh', `config.sub',
     `config.guess', Cygnus `configure', Automake and Libtool scripts,
     etc.) that are in directory DIR.  These are auxiliary files used
     in configuration.  DIR can be either absolute or relative to
     `SRCDIR'.  The default is `SRCDIR' or `SRCDIR/..' or
     `SRCDIR/../..', whichever is the first that contains `install-sh'.
     The other files are not checked for, so that using
     `AC_PROG_INSTALL' does not automatically require distributing the
     other auxiliary files.  It checks for `install.sh' also, but that
     name is obsolete because some `make' have a rule that creates
     `install' from it if there is no makefile.

     The auxiliary directory is commonly named `build-aux'.  If you
     need portability to DOS variants, do not name the auxiliary
     directory `aux'.  *Note File System Conventions::.

 -- Macro: AC_REQUIRE_AUX_FILE (FILE)
     Declares that FILE is expected in the directory defined above.  In
     Autoconf proper, this macro does nothing: its sole purpose is to be
     traced by third-party tools to produce a list of expected auxiliary
     files.  For instance it is called by macros like `AC_PROG_INSTALL'
     (*note Particular Programs::) or `AC_CANONICAL_BUILD' (*note
     Canonicalizing::) to register the auxiliary files they need.

   Similarly, packages that use `aclocal' should declare where local
macros can be found using `AC_CONFIG_MACRO_DIR'.

 -- Macro: AC_CONFIG_MACRO_DIR (DIR)
     Specify DIR as the location of additional local Autoconf macros.
     This macro is intended for use by future versions of commands like
     `autoreconf' that trace macro calls.  It should be called directly
     from `configure.ac' so that tools that install macros for
     `aclocal' can find the macros' declarations.

     Note that if you use `aclocal' from Automake to generate
     `aclocal.m4', you must also set `ACLOCAL_AMFLAGS = -I DIR' in your
     top-level `Makefile.am'.  Due to a limitation in the Autoconf
     implementation of `autoreconf', these include directives currently
     must be set on a single line in `Makefile.am', without any
     backslash-newlines.


File: autoconf.info,  Node: Output,  Next: Configuration Actions,  Prev: Input,  Up: Setup

4.5 Outputting Files
====================

Every Autoconf script, e.g., `configure.ac', should finish by calling
`AC_OUTPUT'.  That is the macro that generates and runs
`config.status', which in turn creates the makefiles and any other
files resulting from configuration.  This is the only required macro
besides `AC_INIT' (*note Input::).

 -- Macro: AC_OUTPUT
     Generate `config.status' and launch it.  Call this macro once, at
     the end of `configure.ac'.

     `config.status' performs all the configuration actions: all the
     output files (see *note Configuration Files::, macro
     `AC_CONFIG_FILES'), header files (see *note Configuration
     Headers::, macro `AC_CONFIG_HEADERS'), commands (see *note
     Configuration Commands::, macro `AC_CONFIG_COMMANDS'), links (see
     *note Configuration Links::, macro `AC_CONFIG_LINKS'),
     subdirectories to configure (see *note Subdirectories::, macro
     `AC_CONFIG_SUBDIRS') are honored.

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

   Historically, the usage of `AC_OUTPUT' was somewhat different.
*Note Obsolete Macros::, for a description of the arguments that
`AC_OUTPUT' used to support.

   If you run `make' in subdirectories, you should run it using the
`make' variable `MAKE'.  Most versions of `make' set `MAKE' to the name
of the `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 `make' do
not set this variable.  The following macro allows you to use it even
with those versions.

 -- Macro: AC_PROG_MAKE_SET
     If the Make command, `$MAKE' if set or else `make', predefines
     `$(MAKE)', define output variable `SET_MAKE' to be empty.
     Otherwise, define `SET_MAKE' to a macro definition that sets
     `$(MAKE)', such as `MAKE=make'.  Calls `AC_SUBST' for `SET_MAKE'.

   If you use this macro, place a line like this in each `Makefile.in'
that runs `MAKE' on other directories:

     @SET_MAKE@


File: autoconf.info,  Node: Configuration Actions,  Next: Configuration Files,  Prev: Output,  Up: Setup

4.6 Performing Configuration Actions
====================================

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

   This section describes the common behavior of the four standard
instantiating macros: `AC_CONFIG_FILES', `AC_CONFIG_HEADERS',
`AC_CONFIG_COMMANDS' and `AC_CONFIG_LINKS'.  They all have this
prototype:

     AC_CONFIG_ITEMS(TAG..., [COMMANDS], [INIT-CMDS])

where the arguments are:

TAG...
     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 TAGS.  In particular, you
     should avoid

          ... && my_foos="$my_foos fooo"
          ... && my_foos="$my_foos foooo"
          AC_CONFIG_ITEMS([$my_foos])

     and use this instead:

          ... && AC_CONFIG_ITEMS([fooo])
          ... && AC_CONFIG_ITEMS([foooo])

     The macros `AC_CONFIG_FILES' and `AC_CONFIG_HEADERS' use special
     TAG values: they may have the form `OUTPUT' or `OUTPUT:INPUTS'.
     The file OUTPUT is instantiated from its templates, INPUTS
     (defaulting to `OUTPUT.in').

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

     The special value `-' might be used to denote the standard output
     when used in OUTPUT, or the standard input when used in the
     INPUTS.  You most probably don't need to use this in
     `configure.ac', but it is convenient when using the command line
     interface of `./config.status', see *note config.status
     Invocation::, for more details.

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

COMMANDS
     Shell commands output literally into `config.status', and
     associated with a tag that the user can use to tell `config.status'
     which commands to run.  The commands are run each time a TAG
     request is given to `config.status', typically each time the file
     `TAG' is created.

     The variables set during the execution of `configure' are _not_
     available here: you first need to set them via the INIT-CMDS.
     Nonetheless the following variables are precomputed:

    `srcdir'
          The name of the top source directory, assuming that the
          working directory is the top build directory.  This is what
          the `configure' option `--srcdir' sets.

    `ac_top_srcdir'
          The name of the top source directory, assuming that the
          working directory is the current build directory.

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

    `ac_srcdir'
          The name of the corresponding source directory, assuming that
          the working directory is the current build directory.

    `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 `config.status' is
          done or interrupted.  Please use package-specific file name
          prefixes to avoid clashing with files that `config.status'
          may use internally.

     The "current" directory refers to the directory (or
     pseudo-directory) containing the input part of TAGS.  For
     instance, running

          AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [...], [...])

     with `--srcdir=../package' produces the following values:

          # 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'

     independently of `in/in.in'.

INIT-CMDS
     Shell commands output _unquoted_ near the beginning of
     `config.status', and executed each time `config.status' runs
     (regardless of the tag).  Because they are unquoted, for example,
     `$var' is output as the value of `var'.  INIT-CMDS is typically
     used by `configure' to give `config.status' some variables it
     needs to run the COMMANDS.

     You should be extremely cautious in your variable names: all the
     INIT-CMDS share the same name space and may overwrite each other
     in unpredictable ways.  Sorry...

   All these macros can be called multiple times, with different TAG
values, of course!


File: autoconf.info,  Node: Configuration Files,  Next: Makefile Substitutions,  Prev: Configuration Actions,  Up: Setup

4.7 Creating Configuration Files
================================

Be sure to read the previous section, *note Configuration Actions::.

 -- Macro: AC_CONFIG_FILES (FILE..., [CMDS], [INIT-CMDS])
     Make `AC_OUTPUT' create each `FILE' by copying an input file (by
     default `FILE.in'), substituting the output variable values.  This
     macro is one of the instantiating macros; see *note Configuration
     Actions::.  *Note Makefile Substitutions::, for more information
     on using output variables.  *Note 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
     `.gdbinit', can be specified as well.

     Typical calls to `AC_CONFIG_FILES' look like this:

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

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

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

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


File: autoconf.info,  Node: Makefile Substitutions,  Next: Configuration Headers,  Prev: Configuration Files,  Up: Setup

4.8 Substitutions in Makefiles
==============================

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

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

   *Note Makefile Conventions: (standards)Makefile Conventions, 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 `datarootdir'
* Build Directories::           Supporting multiple concurrent compiles
* Automatic Remaking::          Makefile rules for configuring


File: autoconf.info,  Node: Preset Output Variables,  Next: Installation Directory Variables,  Up: Makefile Substitutions

4.8.1 Preset 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.  *Note Output Variable Index::, for a
complete list of output variables.  *Note 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 (*note Setting Output Variables::, `AC_ARG_VAR').

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

 -- Variable: CFLAGS
     Debugging and optimization options for the C compiler.  If it is
     not set in the environment when `configure' runs, the default
     value is set when you call `AC_PROG_CC' (or empty if you don't).
     `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., `-DNAME'), it should be put into `CPPFLAGS' instead.  If it
     affects only the linker (e.g., `-LDIRECTORY'), it should be put
     into `LDFLAGS' instead.  If it affects only the compiler proper,
     `CFLAGS' is the natural home for it.  If an option affects
     multiple phases of the compiler, though, matters get tricky.  One
     approach to put such options directly into `CC', e.g., `CC='gcc
     -m64''.  Another is to put them into both `CPPFLAGS' and
     `LDFLAGS', but not into `CFLAGS'.

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

     Sometimes package developers are tempted to set user variables
     such as `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
     `AM_CFLAGS' (*note Flag Variables Ordering: (automake)Flag
     Variables Ordering.), but the concept is the same even if Automake
     is not used.

 -- Variable: configure_input
     A comment saying that the file was generated automatically by
     `configure' and giving the name of the input file.  `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:

          #!/bin/sh
          # @configure_input@

     The presence of that line also reminds people editing the file
     that it needs to be processed by `configure' in order to be used.

 -- Variable: CPPFLAGS
     Preprocessor options for the C, C++, Objective C, and Objective C++
     preprocessors and compilers.  If it is not set in the environment
     when `configure' runs, the default value is empty.  `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 `-I', `-D',
     and `-U' that affect only the behavior of the preprocessor.
     Please see the explanation of `CFLAGS' for what you can do if an
     option affects other phases of the compiler as well.

     Currently, `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 `CPPFLAGS' when linking
     programs.

     *Note Special Chars in Variables::, for limitations that `CPPFLAGS'
     might run into.

 -- Variable: CXXFLAGS
     Debugging and optimization options for the C++ compiler.  It acts
     like `CFLAGS', but for C++ instead of C.

 -- Variable: DEFS
     `-D' options to pass to the C compiler.  If `AC_CONFIG_HEADERS' is
     called, `configure' replaces `@DEFS@' with `-DHAVE_CONFIG_H'
     instead (*note Configuration Headers::).  This variable is not
     defined while `configure' is performing its tests, only when
     creating the output files.  *Note Setting Output Variables::, for
     how to check the results of previous tests.

 -- Variable: ECHO_C
 -- Variable: ECHO_N
 -- Variable: ECHO_T
     How does one suppress the trailing newline from `echo' for
     question-answer message pairs?  These variables provide a way:

          echo $ECHO_N "And the winner is... $ECHO_C"
          sleep 100000000000
          echo "${ECHO_T}dead."

     Some old and uncommon `echo' implementations offer no means to
     achieve this, in which case `ECHO_T' is set to tab.  You might not
     want to use it.

 -- Variable: ERLCFLAGS
     Debugging and optimization options for the Erlang compiler.  If it
     is not set in the environment when `configure' runs, the default
     value is empty.  `configure' uses this variable when compiling
     programs to test for Erlang features.

 -- Variable: FCFLAGS
     Debugging and optimization options for the Fortran compiler.  If it
     is not set in the environment when `configure' runs, the default
     value is set when you call `AC_PROG_FC' (or empty if you don't).
     `configure' uses this variable when compiling or linking programs
     to test for Fortran features.

 -- Variable: FFLAGS
     Debugging and optimization options for the Fortran 77 compiler.
     If it is not set in the environment when `configure' runs, the
     default value is set when you call `AC_PROG_F77' (or empty if you
     don't).  `configure' uses this variable when compiling or linking
     programs to test for Fortran 77 features.

 -- Variable: LDFLAGS
     Options for the linker.  If it is not set in the environment when
     `configure' runs, the default value is empty.  `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 `-s' and `-L'
     that affect only the behavior of the linker.  Please see the
     explanation of `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 (`-l') to the
     linker; use `LIBS' instead.

 -- Variable: LIBS
     `-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 *note Libraries::.  `configure' uses this variable
     when linking programs to test for C, C++, Objective C, Objective
     C++, Fortran, and Go features.

 -- Variable: OBJCFLAGS
     Debugging and optimization options for the Objective C compiler.
     It acts like `CFLAGS', but for Objective C instead of C.

 -- Variable: OBJCXXFLAGS
     Debugging and optimization options for the Objective C++ compiler.
     It acts like `CXXFLAGS', but for Objective C++ instead of C++.

 -- Variable: GOFLAGS
     Debugging and optimization options for the Go compiler.  It acts
     like `CFLAGS', but for Go instead of C.

 -- Variable: builddir
     Rigorously equal to `.'.  Added for symmetry only.

 -- Variable: abs_builddir
     Absolute name of `builddir'.

 -- Variable: top_builddir
     The relative name of the top level of the current build tree.  In
     the top-level directory, this is the same as `builddir'.

 -- Variable: 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 `top_builddir',
     except that it contains zero or more runs of `../', so it should
     not be appended with a slash for concatenation.  This helps for
     `make' implementations that otherwise do not treat `./file' and
     `file' as equal in the toplevel build directory.

 -- Variable: abs_top_builddir
     Absolute name of `top_builddir'.

 -- Variable: srcdir
     The name of the directory that contains the source code for that
     makefile.

 -- Variable: abs_srcdir
     Absolute name of `srcdir'.

 -- Variable: top_srcdir
     The name of the top-level source code directory for the package.
     In the top-level directory, this is the same as `srcdir'.

 -- Variable: abs_top_srcdir
     Absolute name of `top_srcdir'.


File: autoconf.info,  Node: Installation Directory Variables,  Next: Changed Directory Variables,  Prev: Preset Output Variables,  Up: Makefile Substitutions

4.8.2 Installation Directory Variables
--------------------------------------

The following variables specify the directories for package
installation, see *note Variables for Installation Directories:
(standards)Directory Variables, for more information.  Each variable
corresponds to an argument of `configure'; trailing slashes are
stripped so that expressions such as `${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.

 -- Variable: bindir
     The directory for installing executables that users run.

 -- Variable: datadir
     The directory for installing idiosyncratic read-only
     architecture-independent data.

 -- Variable: datarootdir
     The root of the directory tree for read-only
     architecture-independent data files.

 -- Variable: docdir
     The directory for installing documentation files (other than Info
     and man).

 -- Variable: dvidir
     The directory for installing documentation files in DVI format.

 -- Variable: exec_prefix
     The installation prefix for architecture-dependent files.  By
     default it's the same as `prefix'.  You should avoid installing
     anything directly to `exec_prefix'.  However, the default value for
     directories containing architecture-dependent files should be
     relative to `exec_prefix'.

 -- Variable: htmldir
     The directory for installing HTML documentation.

 -- Variable: includedir
     The directory for installing C header files.

 -- Variable: infodir
     The directory for installing documentation in Info format.

 -- Variable: libdir
     The directory for installing object code libraries.

 -- Variable: libexecdir
     The directory for installing executables that other programs run.

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

 -- Variable: localstatedir
     The directory for installing modifiable single-machine data.

 -- Variable: mandir
     The top-level directory for installing documentation in man format.

 -- Variable: oldincludedir
     The directory for installing C header files for non-GCC compilers.

 -- Variable: pdfdir
     The directory for installing PDF documentation.

 -- Variable: prefix
     The common installation prefix for all files.  If `exec_prefix' is
     defined to a different value, `prefix' is used only for
     architecture-independent files.

 -- Variable: psdir
     The directory for installing PostScript documentation.

 -- Variable: sbindir
     The directory for installing executables that system
     administrators run.

 -- Variable: sharedstatedir
     The directory for installing modifiable architecture-independent
     data.

 -- Variable: sysconfdir
     The directory for installing read-only single-machine data.

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

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

`make'
     she can still specify a different prefix from the one specified to
     `configure', in which case, if needed, the package should hard
     code dependencies corresponding to the make-specified prefix.

`make install'
     she can specify a different installation location, in which case
     the package _must_ still depend on the location which was compiled
     in (i.e., never recompile when `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.

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

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

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

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

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

     autoheader: $(srcdir)/autoheader.in
     autom4te: $(srcdir)/autom4te.in

   Some details are noteworthy:

`@bindir[@]'
     The brackets prevent `configure' from replacing `@bindir@' in the
     Sed expression itself.  Brackets are preferable to a backslash
     here, since Posix says `\@' is not portable.

`$(bindir)'
     Don't use `@bindir@'!  Use the matching makefile variable instead.

`$(pkgdatadir)'
     The example takes advantage of the variable `$(pkgdatadir)'
     provided by Automake; it is equivalent to `$(datadir)/$(PACKAGE)'.

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

special characters
     File names, file name components, and the value of `VPATH' should
     not contain shell metacharacters or white space.  *Note Special
     Chars in Variables::.

dependency on `Makefile'
     Since `edit' uses values that depend on the configuration specific
     values (`prefix', etc.) and not only on `VERSION' and so forth,
     the output depends on `Makefile', not `configure.ac'.

`$@'
     The main rule is generic, and uses `$@' extensively to avoid the
     need for multiple copies of the rule.

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

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

     *Note Single Suffix Rules::, for details.

`$(srcdir)'
     Be sure to specify the name of the source directory, otherwise the
     package won't support separated builds.

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

 -- Variable: ERLANG_INSTALL_LIB_DIR
     The common parent directory of Erlang library installation
     directories.  This variable is set by calling the
     `AC_ERLANG_SUBST_INSTALL_LIB_DIR' macro in `configure.ac'.

 -- Variable: ERLANG_INSTALL_LIB_DIR_LIBRARY
     The installation directory for Erlang library LIBRARY.  This
     variable is set by using the `AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR'
     macro in `configure.ac'.

   *Note Erlang Libraries::, for details.


File: autoconf.info,  Node: Changed Directory Variables,  Next: Build Directories,  Prev: Installation Directory Variables,  Up: Makefile Substitutions

4.8.3 Changed Directory Variables
---------------------------------

In Autoconf 2.60, the set of directory variables has changed, and the
defaults of some variables have been adjusted (*note Installation
Directory Variables::) to changes in the GNU Coding Standards.
Notably, `datadir', `infodir', and `mandir' are now expressed in terms
of `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 (*note Defining Directories::), and
that a definition of `datarootdir' is in place.  For example, in a
`Makefile.in', adding

     datarootdir = @datarootdir@

is usually sufficient.  If you use Automake to create `Makefile.in', it
will add this for you.

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

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

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

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

   In some cases, however, the checks may not be able to detect that a
suitable initialization of `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 `configure'
warnings about `datarootdir', you may add the line

     AC_DEFUN([AC_DATAROOTDIR_CHECKED])

to your `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 `AC_' (*note Macro Names::).


File: autoconf.info,  Node: Build Directories,  Next: Automatic Remaking,  Prev: Changed Directory Variables,  Up: Makefile Substitutions

4.8.4 Build Directories
-----------------------

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, `make' uses the `VPATH' variable to find the
files that are in the source directory.  GNU Make can do this.  Most
other recent `make' programs can do this as well, though they may have
difficulties and it is often simpler to recommend GNU `make' (*note
VPATH and Make::).  Older `make' programs do not support `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
`Makefile.am'.  But if you are using Autoconf in isolation, then
supporting `VPATH' requires the following in your `Makefile.in':

     srcdir = @srcdir@
     VPATH = @srcdir@

   Do not set `VPATH' to the value of another variable (*note Variables
listed in VPATH::.

   `configure' substitutes the correct value for `srcdir' when it
produces `Makefile'.

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

   Instead, Make command lines should always refer to source files by
prefixing them with `$(srcdir)/'.  For example:

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


File: autoconf.info,  Node: Automatic Remaking,  Prev: Build Directories,  Up: Makefile Substitutions

4.8.5 Automatic Remaking
------------------------

You can put rules like the following in the top-level `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 `aclocal.m4' and those related to configuration
header files.  Omit from the `Makefile.in' rules for any of these files
that your package does not use.

   The `$(srcdir)/' prefix is included because of limitations in the
`VPATH' mechanism.

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

     $(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

(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

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

so `config.status' ensures that `config.h' is considered up to date.
*Note Output::, for more information about `AC_OUTPUT'.

   *Note config.status Invocation::, for more examples of handling
configuration-related dependencies.


File: autoconf.info,  Node: Configuration Headers,  Next: Configuration Commands,  Prev: Makefile Substitutions,  Up: Setup

4.9 Configuration Header Files
==============================

When a package contains more than a few tests that define C preprocessor
symbols, the command lines to pass `-D' options to the compiler can get
quite long.  This causes two problems.  One is that the `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 `-D' options to the compiler, `configure'
scripts can create a C header file containing `#define' directives.
The `AC_CONFIG_HEADERS' macro selects this kind of output.  Though it
can be called anywhere between `AC_INIT' and `AC_OUTPUT', it is
customary to call it right after `AC_INIT'.

   The package should `#include' the configuration header file before
any other header files, to prevent inconsistencies in declarations (for
example, if it redefines `const').

   To provide for VPATH builds, remember to pass the C compiler a `-I.'
option (or `-I..'; whichever directory contains `config.h').  Even if
you use `#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 `-I' option, you can use `#include <config.h>'.
Actually, it's a good habit to use it, because in the rare case when
the source directory contains another `config.h', the build directory
should be searched first.

 -- Macro: AC_CONFIG_HEADERS (HEADER ..., [CMDS], [INIT-CMDS])
     This macro is one of the instantiating macros; see *note
     Configuration Actions::.  Make `AC_OUTPUT' create the file(s) in
     the blank-or-newline-separated list HEADER containing C
     preprocessor `#define' statements, and replace `@DEFS@' in
     generated files with `-DHAVE_CONFIG_H' instead of the value of
     `DEFS'.  The usual name for HEADER is `config.h'.

     If HEADER already exists and its contents are identical to what
     `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 `HEADER.in'; however, you can
     override the input file name by appending to HEADER a
     colon-separated list of input files.  For example, you might need
     to make the input file name acceptable to DOS variants:

          AC_CONFIG_HEADERS([config.h:config.hin])


 -- Macro: AH_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:

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


   *Note Configuration Actions::, for more details on HEADER.

* Menu:

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


File: autoconf.info,  Node: Header Templates,  Next: autoheader Invocation,  Up: Configuration Headers

4.9.1 Configuration Header Templates
------------------------------------

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

     AC_CONFIG_HEADERS([conf.h])
     AC_CHECK_HEADERS([unistd.h])

Then you could have code like the following in `conf.h.in'.  The
`conf.h' created by `configure' defines `HAVE_UNISTD_H' to 1, if and
only if the system has `unistd.h'.

     /* Define as 1 if you have unistd.h.  */
     #undef HAVE_UNISTD_H

   The format of the template file is stricter than what the C
preprocessor is required to accept.  A directive line should contain
only whitespace, `#undef', and `HAVE_UNISTD_H'.  The use of `#define'
instead of `#undef', or of comments on the same line as `#undef', is
strongly discouraged.  Each hook should only be listed once.  Other
preprocessor lines, such as `#ifdef' or `#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 `autoheader' to generate it, see *note autoheader Invocation::.

   During the instantiation of the header, each `#undef' line in the
template file for each symbol defined by `AC_DEFINE' is changed to an
appropriate `#define'. If the corresponding `AC_DEFINE' has not been
executed during the `configure' run, the `#undef' line is commented
out.  (This is important, e.g., for `_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, _all_ remaining `#undef' lines in the header template are
commented out, whether or not there was a corresponding `AC_DEFINE' for
the macro name; but this behavior is not guaranteed for future releases
of Autoconf.

   Generally speaking, since you should not use `#define', and you
cannot guarantee whether a `#undef' directive in the header template
will be converted to a `#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

     #ifdef THIS
     # define THAT
     #endif

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 `#include' that file from the config header
template.  If you are using `autoheader', you would probably use
`AH_BOTTOM' to append the `#include' directive.


File: autoconf.info,  Node: autoheader Invocation,  Next: Autoheader Macros,  Prev: Header Templates,  Up: Configuration Headers

4.9.2 Using `autoheader' to Create `config.h.in'
------------------------------------------------

The `autoheader' program can create a template file of C `#define'
statements for `configure' to use.  It searches for the first
invocation of `AC_CONFIG_HEADERS' in `configure' sources to determine
the name of the template.  (If the first call of `AC_CONFIG_HEADERS'
specifies more than one input file name, `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 `AH_BOTTOM([#include
<conf_post.h>])'.  File `conf_post.h' is not processed during the
configuration then, which make things clearer.  Analogically, `AH_TOP'
can be used to prepend a boilerplate code.

   In order to do its job, `autoheader' needs you to document all of
the symbols that you might use.  Typically this is done via an
`AC_DEFINE' or `AC_DEFINE_UNQUOTED' call whose first argument is a
literal symbol and whose third argument describes the symbol (*note
Defining Symbols::).  Alternatively, you can use `AH_TEMPLATE' (*note
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 `autoheader' is needed: after all, why would
`configure' need to "patch" a `config.h.in' to produce a `config.h'
instead of just creating `config.h' from scratch?  Well, when
everything rocks, the answer is just that we are wasting our time
maintaining `autoheader': generating `config.h' directly is all that is
needed.  When things go wrong, however, you'll be thankful for the
existence of `autoheader'.

   The fact that the symbols are documented is important in order to
_check_ that `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
`configure' cannot be run: they just have to _fill in the blanks_.

   But let's come back to the point: the invocation of `autoheader'...

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

   `autoheader' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

`--verbose'
`-v'
     Report processing steps.

`--debug'
`-d'
     Don't remove the temporary files.

`--force'
`-f'
     Remake the template file even if newer than its input files.

`--include=DIR'
`-I DIR'
     Append DIR to the include path.  Multiple invocations accumulate.

`--prepend-include=DIR'
`-B DIR'
     Prepend DIR to the include path.  Multiple invocations accumulate.

`--warnings=CATEGORY'
`-W CATEGORY'
     Report the warnings related to CATEGORY (which can actually be a
     comma separated list).  Current categories include:

    `obsolete'
          report the uses of obsolete constructs

    `all'
          report all the warnings

    `none'
          report none

    `error'
          treats warnings as errors

    `no-CATEGORY'
          disable warnings falling into CATEGORY



File: autoconf.info,  Node: Autoheader Macros,  Prev: autoheader Invocation,  Up: Configuration Headers

4.9.3 Autoheader Macros
-----------------------

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

   The template for a SYMBOL is created by `autoheader' from the
DESCRIPTION argument to an `AC_DEFINE'; see *note Defining Symbols::.

   For special needs, you can use the following macros.

 -- Macro: AH_TEMPLATE (KEY, DESCRIPTION)
     Tell `autoheader' to generate a template for KEY.  This macro
     generates standard templates just like `AC_DEFINE' when a
     DESCRIPTION is given.

     For example:

          AH_TEMPLATE([CRAY_STACKSEG_END],
                      [Define to one of _getb67, GETB67, getb67
                       for Cray-2 and Cray-YMP systems.  This
                       function is required for alloca.c support
                       on those systems.])

     generates the following template, with the description properly
     justified.

          /* Define to one of _getb67, GETB67, getb67 for Cray-2 and
             Cray-YMP systems.  This function is required for alloca.c
             support on those systems.  */
          #undef CRAY_STACKSEG_END

 -- Macro: AH_VERBATIM (KEY, TEMPLATE)
     Tell `autoheader' to include the TEMPLATE as-is in the header
     template file.  This TEMPLATE is associated with the KEY, which is
     used to sort all the different templates and guarantee their
     uniqueness.  It should be a symbol that can be defined via
     `AC_DEFINE'.

 -- Macro: AH_TOP (TEXT)
     Include TEXT at the top of the header template file.

 -- Macro: AH_BOTTOM (TEXT)
     Include TEXT at the bottom of the header template file.

   Please note that 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

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


File: autoconf.info,  Node: Configuration Commands,  Next: Configuration Links,  Prev: Configuration Headers,  Up: Setup

4.10 Running Arbitrary Configuration Commands
=============================================

You can execute arbitrary commands before, during, and after
`config.status' is run.  The three following macros accumulate the
commands to run when they are called multiple times.
`AC_CONFIG_COMMANDS' replaces the obsolete macro `AC_OUTPUT_COMMANDS';
see *note Obsolete Macros::, for details.

 -- Macro: AC_CONFIG_COMMANDS (TAG..., [CMDS], [INIT-CMDS])
     Specify additional shell commands to run at the end of
     `config.status', and shell commands to initialize any variables
     from `configure'.  Associate the commands with TAG.  Since
     typically the CMDS create a file, TAG should naturally be the name
     of that file.  If needed, the directory hosting TAG is created.
     This macro is one of the instantiating macros; see *note
     Configuration Actions::.

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

     Here is a better one:
          AC_CONFIG_COMMANDS([timestamp], [date >timestamp])

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

 -- Macro: AC_CONFIG_COMMANDS_PRE (CMDS)
     Execute the CMDS right before creating `config.status'.

     This macro presents the last opportunity to call `AC_SUBST',
     `AC_DEFINE', or `AC_CONFIG_ITEMS' macros.

 -- Macro: AC_CONFIG_COMMANDS_POST (CMDS)
     Execute the CMDS right after creating `config.status'.


File: autoconf.info,  Node: Configuration Links,  Next: Subdirectories,  Prev: Configuration Commands,  Up: Setup

4.11 Creating Configuration Links
=================================

You may find it convenient to create links whose destinations depend
upon results of tests.  One can use `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.

 -- Macro: AC_CONFIG_LINKS (DEST:SOURCE..., [CMDS], [INIT-CMDS])
     Make `AC_OUTPUT' link each of the existing files SOURCE to the
     corresponding link name DEST.  Makes a symbolic link if possible,
     otherwise a hard link if possible, otherwise a copy.  The DEST and
     SOURCE names should be relative to the top level source or build
     directory.  This macro is one of the instantiating macros; see
     *note Configuration Actions::.

     For example, this call:

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

     creates in the current directory `host.h' as a link to
     `SRCDIR/config/$machine.h', and `object.h' as a link to
     `SRCDIR/config/$obj_format.h'.

     The tempting value `.' for DEST is invalid: it makes it impossible
     for `config.status' to guess the links to establish.

     One can then run:
          ./config.status host.h object.h
     to create the links.


File: autoconf.info,  Node: Subdirectories,  Next: Default Prefix,  Prev: Configuration Links,  Up: Setup

4.12 Configuring Other Packages in Subdirectories
=================================================

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

 -- Macro: AC_CONFIG_SUBDIRS (DIR ...)
     Make `AC_OUTPUT' run `configure' in each subdirectory DIR in the
     given blank-or-newline-separated list.  Each DIR should be a
     literal, i.e., please do not use:

          if test "x$package_foo_enabled" = xyes; then
            my_subdirs="$my_subdirs foo"
          fi
          AC_CONFIG_SUBDIRS([$my_subdirs])

     because this prevents `./configure --help=recursive' from
     displaying the options of the package `foo'.  Instead, you should
     write:

          if test "x$package_foo_enabled" = xyes; then
            AC_CONFIG_SUBDIRS([foo])
          fi

     If a given DIR is not found at `configure' run time, a warning is
     reported; if the subdirectory is optional, write:

          if test -d "$srcdir/foo"; then
            AC_CONFIG_SUBDIRS([foo])
          fi

     If a given DIR contains `configure.gnu', it is run instead of
     `configure'.  This is for packages that might use a non-Autoconf
     script `Configure', which can't be called through a wrapper
     `configure' since it would be the same file on case-insensitive
     file systems.  Likewise, if a DIR contains `configure.in' but no
     `configure', the Cygnus `configure' script found by
     `AC_CONFIG_AUX_DIR' is used.

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

        - adjusting a relative name for the cache file;

        - adjusting a relative name for the source directory;

        - propagating the current value of `$prefix', including if it
          was defaulted, and if the default values of the top level and
          of the subdirectory `configure' differ.

     This macro also sets the output variable `subdirs' to the list of
     directories `DIR ...'.  Make rules can use this variable to
     determine which subdirectories to recurse into.

     This macro may be called multiple times.


File: autoconf.info,  Node: Default Prefix,  Prev: Subdirectories,  Up: Setup

4.13 Default Prefix
===================

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

   Some software packages might want to install in a directory other
than `/usr/local' by default.  To accomplish that, use the
`AC_PREFIX_DEFAULT' macro.

 -- Macro: AC_PREFIX_DEFAULT (PREFIX)
     Set the default installation prefix to PREFIX instead of
     `/usr/local'.

   It may be convenient for users to have `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
`AC_PREFIX_PROGRAM'.

 -- Macro: AC_PREFIX_PROGRAM (PROGRAM)
     If the user did not specify an installation prefix (using the
     `--prefix' option), guess a value for it by looking for PROGRAM in
     `PATH', the way the shell does.  If PROGRAM is found, set the
     prefix to the parent of the directory containing PROGRAM, else
     default the prefix as described above (`/usr/local' or
     `AC_PREFIX_DEFAULT').  For example, if PROGRAM is `gcc' and the
     `PATH' contains `/usr/local/gnu/bin/gcc', set the prefix to
     `/usr/local/gnu'.


File: autoconf.info,  Node: Existing Tests,  Next: Writing Tests,  Prev: Setup,  Up: Top

5 Existing Tests
****************

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

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

   Some of these macros set output variables.  *Note Makefile
Substitutions::, for how to get their values.  The phrase "define NAME"
is used below as a shorthand to mean "define the C preprocessor symbol
NAME to the value 1".  *Note 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
* Posix Variants::              Special kludges for specific Posix variants
* Erlang Libraries::            Checking for the existence of Erlang libraries


File: autoconf.info,  Node: Common Behavior,  Next: Alternative Programs,  Up: Existing Tests

5.1 Common Behavior
===================

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

* Menu:

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


File: autoconf.info,  Node: Standard Symbols,  Next: Default Includes,  Up: Common Behavior

5.1.1 Standard Symbols
----------------------

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

   For instance,

     AC_CHECK_TYPES([struct $Expensive*])

defines the symbol `HAVE_STRUCT__EXPENSIVEP' if the check succeeds.


File: autoconf.info,  Node: Default Includes,  Prev: Standard Symbols,  Up: Common Behavior

5.1.2 Default Includes
----------------------

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

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

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

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

 -- Macro: AC_INCLUDES_DEFAULT ([INCLUDE-DIRECTIVES])
     Expand to INCLUDE-DIRECTIVES if defined, otherwise to:

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

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

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


File: autoconf.info,  Node: Alternative Programs,  Next: Files,  Prev: Common Behavior,  Up: Existing Tests

5.2 Alternative Programs
========================

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

* Menu:

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


File: autoconf.info,  Node: Particular Programs,  Next: Generic Programs,  Up: Alternative Programs

5.2.1 Particular Program Checks
-------------------------------

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

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

     Using this macro is sufficient to avoid the pitfalls of traditional
     `awk' (*note Limitations of Usual Tools: awk.).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     Instead, do:

          (cd /x && $(LN_S) foo bar)

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

 -- Macro: AC_PROG_SED
     Set output variable `SED' to a Sed implementation that conforms to
     Posix and does not have arbitrary length limits.  Report an error
     if no acceptable Sed is found.  *Note Limitations of Usual Tools:
     sed, for more information about portability problems with Sed.

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

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


File: autoconf.info,  Node: Generic Programs,  Prev: Particular Programs,  Up: Alternative Programs

5.2.2 Generic Program and File Checks
-------------------------------------

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

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

   You are strongly encouraged to declare the VARIABLE passed to
`AC_CHECK_PROG' etc. as precious.  *Note Setting Output Variables::,
`AC_ARG_VAR', for more details.

 -- Macro: AC_CHECK_PROG (VARIABLE, PROG-TO-CHECK-FOR, VALUE-IF-FOUND,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'], [REJECT])
     Check whether program PROG-TO-CHECK-FOR exists in PATH.  If it is
     found, set VARIABLE to VALUE-IF-FOUND, otherwise to
     VALUE-IF-NOT-FOUND, if given.  Always pass over REJECT (an
     absolute file name) even if it is the first found in the search
     path; in that case, set VARIABLE using the absolute file name of
     the PROG-TO-CHECK-FOR found that is not REJECT.  If VARIABLE was
     already set, do nothing.  Calls `AC_SUBST' for VARIABLE.  The
     result of this test can be overridden by setting the VARIABLE
     variable or the cache variable `ac_cv_prog_VARIABLE'.

 -- Macro: AC_CHECK_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Check for each program in the blank-separated list
     PROGS-TO-CHECK-FOR existing in the PATH.  If one is found, set
     VARIABLE to the name of that program.  Otherwise, continue
     checking the next program in the list.  If none of the programs in
     the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
     VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
     changed.  Calls `AC_SUBST' for VARIABLE.  The result of this test
     can be overridden by setting the VARIABLE variable or the cache
     variable `ac_cv_prog_VARIABLE'.

 -- Macro: AC_CHECK_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
     prefix of the target type as determined by `AC_CANONICAL_TARGET',
     followed by a dash (*note 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 *note Specifying Target Triplets::, the target is
     rarely specified, because most of the time it is the same as the
     host: it is the type of system for which any compiler tool in the
     package produces code.  What this macro looks for is, for example,
     _a tool (assembler, linker, etc.) that the compiler driver (`gcc'
     for the GNU C Compiler) uses to produce objects, archives or
     executables_.

 -- Macro: AC_CHECK_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
     prefix of the host type as specified by `--host', followed by a
     dash.  For example, if the user runs `configure --build=x86_64-gnu
     --host=i386-gnu', then this call:
          AC_CHECK_TOOL([RANLIB], [ranlib], [:])
     sets `RANLIB' to `i386-gnu-ranlib' if that program exists in PATH,
     or otherwise to `ranlib' if that program exists in PATH, or to `:'
     if neither program exists.

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

 -- Macro: AC_CHECK_TARGET_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_TARGET_TOOL', each of the tools in the list
     PROGS-TO-CHECK-FOR are checked with a prefix of the target type as
     determined by `AC_CANONICAL_TARGET', followed by a dash (*note
     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
     VARIABLE to the name of that program.  If none of the tools in the
     list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
     VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
     changed.  Calls `AC_SUBST' for VARIABLE.

 -- Macro: AC_CHECK_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_TOOL', each of the tools in the list
     PROGS-TO-CHECK-FOR are checked with a prefix of the host type as
     determined by `AC_CANONICAL_HOST', followed by a dash (*note
     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 VARIABLE to the name of that program.  If none of the
     tools in the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
     VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
     changed.  Calls `AC_SUBST' for VARIABLE.

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

 -- Macro: AC_PATH_PROG (VARIABLE, PROG-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_PROG', but set VARIABLE to the absolute name of
     PROG-TO-CHECK-FOR if found.  The result of this test can be
     overridden by setting the VARIABLE variable.  A positive result of
     this test is cached in the `ac_cv_path_VARIABLE' variable.

 -- Macro: AC_PATH_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_PROGS', but if any of PROGS-TO-CHECK-FOR are found,
     set VARIABLE to the absolute name of the program found.  The
     result of this test can be overridden by setting the VARIABLE
     variable.  A positive result of this test is cached in the
     `ac_cv_path_VARIABLE' variable.

 -- Macro: AC_PATH_PROGS_FEATURE_CHECK (VARIABLE, PROGS-TO-CHECK-FOR,
          FEATURE-TEST, [ACTION-IF-NOT-FOUND], [PATH = `$PATH'])
     This macro was introduced in Autoconf 2.62.  If VARIABLE is not
     empty, then set the cache variable `ac_cv_path_VARIABLE' to its
     value.  Otherwise, check for each program in the blank-separated
     list PROGS-TO-CHECK-FOR existing in PATH.  For each program found,
     execute FEATURE-TEST with `ac_path_VARIABLE' set to the absolute
     name of the candidate program.  If no invocation of FEATURE-TEST
     sets the shell variable `ac_cv_path_VARIABLE', then
     ACTION-IF-NOT-FOUND is executed.  FEATURE-TEST will be run even
     when `ac_cv_path_VARIABLE' is set, to provide the ability to
     choose a better candidate found later in PATH; to accept the
     current setting and bypass all further checks, FEATURE-TEST can
     execute `ac_path_VARIABLE_found=:'.

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

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

          AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
            [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
              [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
                test "x$m4out" = x0 \
                && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
              [AC_MSG_ERROR([could not find m4 that supports indir])])])
          AC_SUBST([M4], [$ac_cv_path_M4])

 -- Macro: AC_PATH_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_TARGET_TOOL', but set VARIABLE to the absolute name
     of the program if it is found.

 -- Macro: AC_PATH_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
          [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Like `AC_CHECK_TOOL', but set VARIABLE to the absolute name of the
     program if it is found.

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


File: autoconf.info,  Node: Files,  Next: Libraries,  Prev: Alternative Programs,  Up: Existing Tests

5.3 Files
=========

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

 -- Macro: AC_CHECK_FILE (FILE, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     Check whether file FILE exists on the native system.  If it is
     found, execute ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND,
     if given.  The result of this test is cached in the
     `ac_cv_file_FILE' variable, with characters not suitable for a
     variable name mapped to underscores.

 -- Macro: AC_CHECK_FILES (FILES, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     Executes `AC_CHECK_FILE' once for each file listed in FILES.
     Additionally, defines `HAVE_FILE' (*note Standard Symbols::) for
     each file found.  The results of each test are cached in the
     `ac_cv_file_FILE' variable, with characters not suitable for a
     variable name mapped to underscores.


File: autoconf.info,  Node: Libraries,  Next: Library Functions,  Prev: Files,  Up: Existing Tests

5.4 Library Files
=================

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

 -- Macro: AC_CHECK_LIB (LIBRARY, FUNCTION, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
     Test whether the library LIBRARY is available by trying to link a
     test program that calls function FUNCTION with the library.
     FUNCTION should be a function provided by the library.  Use the
     base name of the library; e.g., to check for `-lmp', use `mp' as
     the LIBRARY argument.

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

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

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

     The result of this test is cached in the
     `ac_cv_lib_LIBRARY_FUNCTION' variable.

 -- Macro: AC_SEARCH_LIBS (FUNCTION, SEARCH-LIBS, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
     Search for a library defining FUNCTION if it's not already
     available.  This equates to calling
     `AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])])' first with no
     libraries, then for each library listed in SEARCH-LIBS.

     Prepend `-lLIBRARY' to `LIBS' for the first library found to
     contain FUNCTION, and run ACTION-IF-FOUND.  If the function is not
     found, run ACTION-IF-NOT-FOUND.

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

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


File: autoconf.info,  Node: Library Functions,  Next: Header Files,  Prev: Libraries,  Up: Existing Tests

5.5 Library Functions
=====================

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

* Menu:

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

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

5.5.1 Portability of C Functions
--------------------------------

Most usual functions can either be missing, or be buggy, or be limited
on some architectures.  This section tries to make an inventory of these
portability issues.  By definition, this list always requires
additions.  A much more complete list is maintained by the Gnulib
project (*note Gnulib::), covering *note Current Posix Functions:
(gnulib)Function Substitutes, *note Legacy Functions: (gnulib)Legacy
Function Substitutes, and *note Glibc Functions: (gnulib)Glibc Function
Substitutes.  Please help us keep the gnulib list as complete as
possible.

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

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

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

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

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

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

          #include <math.h>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

`strerror_r'
     Posix specifies that `strerror_r' returns an `int', but many
     systems (e.g., GNU C Library version 2.2.4) provide a different
     version returning a `char *'.  `AC_FUNC_STRERROR_R' can detect
     which is in use (*note Particular Functions::).

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

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

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

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

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

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

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

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

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

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

5.5.2 Particular Function Checks
--------------------------------

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

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

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

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

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

          #ifdef STDC_HEADERS
          # include <stdlib.h>
          # include <stddef.h>
          #else
          # ifdef HAVE_STDLIB_H
          #  include <stdlib.h>
          # endif
          #endif
          #ifdef HAVE_ALLOCA_H
          # include <alloca.h>
          #elif !defined alloca
          # ifdef __GNUC__
          #  define alloca __builtin_alloca
          # elif defined _AIX
          #  define alloca __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

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

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

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

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

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

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

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

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

 -- Macro: AC_FUNC_FNMATCH
     If the `fnmatch' function conforms to Posix, define
     `HAVE_FNMATCH'.  Detect common implementation bugs, for example,
     the bugs in Solaris 2.4.

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

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

     This macro is obsolescent.  New programs should use Gnulib's
     `fnmatch-posix' module.  *Note Gnulib::.

 -- Macro: AC_FUNC_FNMATCH_GNU
     Behave like `AC_REPLACE_FNMATCH' (_replace_) but also test whether
     `fnmatch' supports GNU extensions.  Detect common implementation
     bugs, for example, the bugs in the GNU C Library 2.1.

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

     This macro is obsolescent.  New programs should use Gnulib's
     `fnmatch-gnu' module.  *Note Gnulib::.

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

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

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

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

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

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

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

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

       1. Define `C_GETLOADAVG'.

       2. Define `SVR4', `DGUX', `UMAX', or `UMAX4_3' if on those
          systems.

       3. If `nlist.h' is found, define `HAVE_NLIST_H'.

       4. If `struct nlist' has an `n_un.n_name' member, define
          `HAVE_STRUCT_NLIST_N_UN_N_NAME'.  The obsolete symbol
          `NLIST_NAME_UNION' is still defined, but do not depend upon
          it.

       5. Programs may need to be installed set-group-ID (or
          set-user-ID) for `getloadavg' to work.  In this case, define
          `GETLOADAVG_PRIVILEGED', set the output variable `NEED_SETGID'
          to `true' (and otherwise to `false'), and set `KMEM_GROUP' to
          the name of the group that should own the installed program.

     The `AC_FUNC_GETLOADAVG' macro is obsolescent.  New programs should
     use Gnulib's `getloadavg' module.  *Note Gnulib::.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     #include <config.h>
     #undef malloc

     #include <sys/types.h>

     void *malloc ();

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

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

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

 -- Macro: AC_FUNC_MBRTOWC
     Define `HAVE_MBRTOWC' to 1 if the function `mbrtowc' and the type
     `mbstate_t' are properly declared.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 -- Macro: AC_FUNC_STRTOLD
     If the `strtold' function exists and conforms to C99, define
     `HAVE_STRTOLD'.

     This macro caches its result in the `ac_cv_func_strtold' variable.

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

     This macro caches its result in the `ac_cv_func_strnlen_working'
     variable.

 -- Macro: AC_FUNC_UTIME_NULL
     If `utime (FILE, NULL)' sets FILE's timestamp to the present,
     define `HAVE_UTIME_NULL'.

     This macro caches its result in the `ac_cv_func_utime_null'
     variable.

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

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

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

 -- Macro: AC_REPLACE_FNMATCH
     If the `fnmatch' function does not conform to Posix (see
     `AC_FUNC_FNMATCH'), ask for its `AC_LIBOBJ' replacement.

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

     This macro caches its result in the `ac_cv_func_fnmatch_works'
     variable.

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

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

5.5.3 Generic Function Checks
-----------------------------

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

 -- Macro: AC_CHECK_FUNC (FUNCTION, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     If C function FUNCTION is available, run shell commands
     ACTION-IF-FOUND, otherwise ACTION-IF-NOT-FOUND.  If you just want
     to define a symbol if the function is available, consider using
     `AC_CHECK_FUNCS' instead.  This macro checks for functions with C
     linkage even when `AC_LANG(C++)' has been called, since C is more
     standardized than C++.  (*note Language Choice::, for more
     information about selecting the language for checks.)

     This macro caches its result in the `ac_cv_func_FUNCTION' variable.

 -- Macro: AC_CHECK_FUNCS (FUNCTION..., [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     For each FUNCTION enumerated in the blank-or-newline-separated
     argument list, define `HAVE_FUNCTION' (in all capitals) if it is
     available.  If ACTION-IF-FOUND is given, it is additional shell
     code to execute when one of the functions is found.  You can give
     it a value of `break' to break out of the loop on the first match.
     If ACTION-IF-NOT-FOUND is given, it is executed when one of the
     functions is not found.

     Results are cached for each FUNCTION as in `AC_CHECK_FUNC'.

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


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

   Suitable replacements for many such problem functions are available
from Gnulib (*note Gnulib::).

 -- Macro: AC_LIBOBJ (FUNCTION)
     Specify that `FUNCTION.c' must be included in the executables to
     replace a missing or broken implementation of FUNCTION.

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

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

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

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

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

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

 -- Macro: AC_LIBSOURCES (FILES)
     Like `AC_LIBSOURCE', but accepts one or more FILES in a
     comma-separated M4 list.  Thus, the above example might be
     rewritten:

          AC_LIBSOURCES([foo.c, bar.c])
          AC_LIBOBJ([$foo_or_bar])

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

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


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

 -- Macro: AC_REPLACE_FUNCS (FUNCTION...)
     Like `AC_CHECK_FUNCS', but uses `AC_LIBOBJ(FUNCTION)' as
     ACTION-IF-NOT-FOUND.  You can declare your replacement function by
     enclosing the prototype in `#ifndef HAVE_FUNCTION'.  If the system
     has the function, it probably declares it in a header file you
     should be including, so you shouldn't redeclare it lest your
     declaration conflict.


File: autoconf.info,  Node: Header Files,  Next: Declarations,  Prev: Library Functions,  Up: Existing Tests

5.6 Header Files
================

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

* Menu:

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


File: autoconf.info,  Node: Header Portability,  Next: Particular Headers,  Up: Header Files

5.6.1 Portability of Headers
----------------------------

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 (*note Gnulib::), covering *note Posix Headers: (gnulib)Header
File Substitutes. and *note Glibc Headers: (gnulib)Glibc Header File
Substitutes.  Please help us keep the gnulib list as complete as
possible.

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

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

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

`linux/random.h'
     It requires `linux/types.h'.

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

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

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

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

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

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

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

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

`sys/socket.h'
     On Darwin, `stdlib.h' is a prerequisite.

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

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

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


File: autoconf.info,  Node: Particular Headers,  Next: Generic Headers,  Prev: Header Portability,  Up: Header Files

5.6.2 Particular Header Checks
------------------------------

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

 -- Macro: AC_CHECK_HEADER_STDBOOL
     Check whether `stdbool.h' exists and conforms to C99, and cache the
     result in the `ac_cv_header_stdbool_h' variable.  If the type
     `_Bool' is defined, define `HAVE__BOOL' to 1.

     This macro is intended for use by Gnulib (*note Gnulib::) and other
     packages that supply a substitute `stdbool.h' on platforms lacking
     a conforming one.  The `AC_HEADER_STDBOOL' macro is better for code
     that explicitly checks for `stdbool.h'.

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

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

     `dirent.h'     `HAVE_DIRENT_H'
     `sys/ndir.h'   `HAVE_SYS_NDIR_H'
     `sys/dir.h'    `HAVE_SYS_DIR_H'
     `ndir.h'       `HAVE_NDIR_H'

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

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

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

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

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

     Also see `AC_STRUCT_DIRENT_D_INO' and `AC_STRUCT_DIRENT_D_TYPE'
     (*note Particular Structures::).

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

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

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

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

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

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

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

     Alternatively you can use the `stdbool' package of Gnulib (*note
     Gnulib::).  It simplifies your code so that it can say just
     `#include <stdbool.h>', and it adds support for less-common
     platforms.

     This macro caches its result in the `ac_cv_header_stdbool_h'
     variable.

     This macro differs from `AC_CHECK_HEADER_STDBOOL' only in that it
     defines `HAVE_STDBOOL_H' whereas `AC_CHECK_HEADER_STDBOOL' does
     not.

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

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

     This macro caches its result in the `ac_cv_header_stdc' variable.

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

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

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

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

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

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

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

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

     This macro caches its result in the `ac_cv_header_sys_wait_h'
     variable.

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

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

   The way to check whether the system supports Posix is:

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

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

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

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

     This macro caches its result in the `ac_cv_header_time' variable.

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

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

     Use:

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

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


File: autoconf.info,  Node: Generic Headers,  Prev: Particular Headers,  Up: Header Files

5.6.3 Generic Header Checks
---------------------------

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

 -- Macro: AC_CHECK_HEADER (HEADER-FILE, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES])
     If the system header file HEADER-FILE is compilable, execute shell
     commands ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
     If you just want to define a symbol if the header file is
     available, consider using `AC_CHECK_HEADERS' instead.

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

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

     This macro caches its result in the `ac_cv_header_HEADER-FILE'
     variable, with characters not suitable for a variable name mapped
     to underscores.

 -- Macro: AC_CHECK_HEADERS (HEADER-FILE..., [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES])
     For each given system header file HEADER-FILE in the
     blank-separated argument list that exists, define
     `HAVE_HEADER-FILE' (in all capitals).  If ACTION-IF-FOUND is
     given, it is additional shell code to execute when one of the
     header files is found.  You can give it a value of `break' to
     break out of the loop on the first match.  If ACTION-IF-NOT-FOUND
     is given, it is executed when one of the header files is not found.

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

     This macro caches its result in the `ac_cv_header_HEADER-FILE'
     variable, with characters not suitable for a variable name mapped
     to underscores.

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

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

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

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

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


File: autoconf.info,  Node: Declarations,  Next: Structures,  Prev: Header Files,  Up: Existing Tests

5.7 Declarations
================

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

* Menu:

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


File: autoconf.info,  Node: Particular Declarations,  Next: Generic Declarations,  Up: Declarations

5.7.1 Particular Declaration Checks
-----------------------------------

There are no specific macros for declarations.


File: autoconf.info,  Node: Generic Declarations,  Prev: Particular Declarations,  Up: Declarations

5.7.2 Generic Declaration Checks
--------------------------------

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

 -- Macro: AC_CHECK_DECL (SYMBOL, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     If SYMBOL (a function, variable, or constant) is not declared in
     INCLUDES and a declaration is needed, run the shell commands
     ACTION-IF-NOT-FOUND, otherwise ACTION-IF-FOUND.  INCLUDES is a
     series of include directives, defaulting to `AC_INCLUDES_DEFAULT'
     (*note Default Includes::), which are used prior to the
     declaration under test.

     This macro actually tests whether SYMBOL is defined as a macro or
     can be used as an r-value, not whether it is really declared,
     because it is much safer to avoid introducing extra declarations
     when they are not needed.  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:

          AC_CHECK_DECL([basename(char *)])

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

 -- Macro: AC_CHECK_DECLS (SYMBOLS, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     For each of the SYMBOLS (_comma_-separated list with optional
     function argument types for C++ overloads), define
     `HAVE_DECL_SYMBOL' (in all capitals) to `1' if SYMBOL is declared,
     otherwise to `0'.  If ACTION-IF-NOT-FOUND is given, it is
     additional shell code to execute when one of the function
     declarations is needed, otherwise ACTION-IF-FOUND is executed.

     INCLUDES is a series of include directives, defaulting to
     `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
     prior to the declarations under test.

     This macro uses an M4 list as first argument:
          AC_CHECK_DECLS([strdup])
          AC_CHECK_DECLS([strlen])
          AC_CHECK_DECLS([malloc, realloc, calloc, free])
          AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
          AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])

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

          #if !HAVE_DECL_SYMBOL
          extern char *symbol;
          #endif

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

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

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

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

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


File: autoconf.info,  Node: Structures,  Next: Types,  Prev: Declarations,  Up: Existing Tests

5.8 Structures
==============

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

* Menu:

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


File: autoconf.info,  Node: Particular Structures,  Next: Generic Structures,  Up: Structures

5.8.1 Particular Structure Checks
---------------------------------

The following macros check for certain structures or structure members.

 -- Macro: AC_STRUCT_DIRENT_D_INO
     Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
     Headers::).  Then, if `struct dirent' contains a `d_ino' member,
     define `HAVE_STRUCT_DIRENT_D_INO'.

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

 -- Macro: AC_STRUCT_DIRENT_D_TYPE
     Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
     Headers::).  Then, if `struct dirent' contains a `d_type' member,
     define `HAVE_STRUCT_DIRENT_D_TYPE'.

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

     This macro caches its result in the
     `ac_cv_member_struct_stat_st_blocks' variable.

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

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

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


File: autoconf.info,  Node: Generic Structures,  Prev: Particular Structures,  Up: Structures

5.8.2 Generic Structure Checks
------------------------------

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

 -- Macro: AC_CHECK_MEMBER (AGGREGATE.MEMBER, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     Check whether MEMBER is a member of the aggregate AGGREGATE.  If
     no INCLUDES are specified, the default includes are used (*note
     Default Includes::).

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

     You can use this macro for submembers:

          AC_CHECK_MEMBER(struct top.middle.bot)

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

 -- Macro: AC_CHECK_MEMBERS (MEMBERS, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     Check for the existence of each `AGGREGATE.MEMBER' of MEMBERS
     using the previous macro.  When MEMBER belongs to AGGREGATE,
     define `HAVE_AGGREGATE_MEMBER' (in all capitals, with spaces and
     dots replaced by underscores).  If ACTION-IF-FOUND is given, it is
     executed for each of the found members.  If ACTION-IF-NOT-FOUND is
     given, it is executed for each of the members that could not be
     found.

     INCLUDES is a series of include directives, defaulting to
     `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
     prior to the members under test.

     This macro uses M4 lists:
          AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])


File: autoconf.info,  Node: Types,  Next: Compilers and Preprocessors,  Prev: Structures,  Up: Existing Tests

5.9 Types
=========

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

* Menu:

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


File: autoconf.info,  Node: Particular Types,  Next: Generic Types,  Up: Types

5.9.1 Particular Type Checks
----------------------------

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

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

 -- Macro: AC_TYPE_GETGROUPS
     Define `GETGROUPS_T' to be whichever of `gid_t' or `int' is the
     base type of the array argument to `getgroups'.

     This macro caches the base type in the `ac_cv_type_getgroups'
     variable.

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

          #if HAVE_STDINT_H
          # include <stdint.h>
          #endif
          #if defined INT8_MAX || defined int8_t
           _code using int8_t_
          #else
           _complicated alternative using >8-bit 'signed char'_
          #endif

     This macro caches the type in the `ac_cv_c_int8_t' variable.

 -- Macro: AC_TYPE_INT16_T
     This is like `AC_TYPE_INT8_T', except for 16-bit integers.

 -- Macro: AC_TYPE_INT32_T
     This is like `AC_TYPE_INT8_T', except for 32-bit integers.

 -- Macro: AC_TYPE_INT64_T
     This is like `AC_TYPE_INT8_T', except for 64-bit integers.

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

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

 -- Macro: AC_TYPE_LONG_DOUBLE
     If the C compiler supports a working `long double' type, define
     `HAVE_LONG_DOUBLE'.  The `long double' type might have the same
     range and precision as `double'.

     This macro caches its result in the `ac_cv_type_long_double'
     variable.

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

 -- Macro: AC_TYPE_LONG_DOUBLE_WIDER
     If the C compiler supports a working `long double' type with more
     range or precision than the `double' type, define
     `HAVE_LONG_DOUBLE_WIDER'.

     This macro caches its result in the `ac_cv_type_long_double_wider'
     variable.

 -- Macro: AC_TYPE_LONG_LONG_INT
     If the C compiler supports a working `long long int' type, define
     `HAVE_LONG_LONG_INT'.  However, this test does not test `long long
     int' values in preprocessor `#if' expressions, because too many
     compilers mishandle such expressions.  *Note Preprocessor
     Arithmetic::.

     This macro caches its result in the `ac_cv_type_long_long_int'
     variable.

 -- Macro: AC_TYPE_MBSTATE_T
     Define `HAVE_MBSTATE_T' if `<wchar.h>' declares the `mbstate_t'
     type.  Also, define `mbstate_t' to be a type if `<wchar.h>' does
     not declare it.

     This macro caches its result in the `ac_cv_type_mbstate_t'
     variable.

 -- Macro: AC_TYPE_MODE_T
     Define `mode_t' to a suitable type, if standard headers do not
     define it.

     This macro caches its result in the `ac_cv_type_mode_t' variable.

 -- Macro: AC_TYPE_OFF_T
     Define `off_t' to a suitable type, if standard headers do not
     define it.

     This macro caches its result in the `ac_cv_type_off_t' variable.

 -- Macro: AC_TYPE_PID_T
     Define `pid_t' to a suitable type, if standard headers do not
     define it.

     This macro caches its result in the `ac_cv_type_pid_t' variable.

 -- Macro: AC_TYPE_SIZE_T
     Define `size_t' to a suitable type, if standard headers do not
     define it.

     This macro caches its result in the `ac_cv_type_size_t' variable.

 -- Macro: AC_TYPE_SSIZE_T
     Define `ssize_t' to a suitable type, if standard headers do not
     define it.

     This macro caches its result in the `ac_cv_type_ssize_t' variable.

 -- Macro: AC_TYPE_UID_T
     Define `uid_t' and `gid_t' to suitable types, if standard headers
     do not define them.

     This macro caches its result in the `ac_cv_type_uid_t' variable.

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

 -- Macro: AC_TYPE_UINT16_T
     This is like `AC_TYPE_UINT8_T', except for 16-bit integers.

 -- Macro: AC_TYPE_UINT32_T
     This is like `AC_TYPE_UINT8_T', except for 32-bit integers.

 -- Macro: AC_TYPE_UINT64_T
     This is like `AC_TYPE_UINT8_T', except for 64-bit integers.

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

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

 -- Macro: AC_TYPE_UNSIGNED_LONG_LONG_INT
     If the C compiler supports a working `unsigned long long int' type,
     define `HAVE_UNSIGNED_LONG_LONG_INT'.  However, this test does not
     test `unsigned long long int' values in preprocessor `#if'
     expressions, because too many compilers mishandle such expressions.
     *Note Preprocessor Arithmetic::.

     This macro caches its result in the
     `ac_cv_type_unsigned_long_long_int' variable.


File: autoconf.info,  Node: Generic Types,  Prev: Particular Types,  Up: Types

5.9.2 Generic Type Checks
-------------------------

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

 -- Macro: AC_CHECK_TYPE (TYPE, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     Check whether TYPE is defined.  It may be a compiler builtin type
     or defined by the INCLUDES.  INCLUDES is a series of include
     directives, defaulting to `AC_INCLUDES_DEFAULT' (*note Default
     Includes::), which are used prior to the type under test.

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

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

 -- Macro: AC_CHECK_TYPES (TYPES, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
     For each TYPE of the TYPES that is defined, define `HAVE_TYPE' (in
     all capitals).  Each TYPE must follow the rules of
     `AC_CHECK_TYPE'.  If no INCLUDES are specified, the default
     includes are used (*note Default Includes::).  If ACTION-IF-FOUND
     is given, it is additional shell code to execute when one of the
     types is found.  If ACTION-IF-NOT-FOUND is given, it is executed
     when one of the types is not found.

     This macro uses M4 lists:
          AC_CHECK_TYPES([ptrdiff_t])
          AC_CHECK_TYPES([unsigned long long int, uintmax_t])
          AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])


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


File: autoconf.info,  Node: Compilers and Preprocessors,  Next: System Services,  Prev: Types,  Up: Existing Tests

5.10 Compilers and Preprocessors
================================

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

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

   If the compiler being used does not produce executables, the tests
fail.  If the executables can't be run, and cross-compilation is not
enabled, they fail too.  *Note 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


File: autoconf.info,  Node: Specific Compiler Characteristics,  Next: Generic Compiler Characteristics,  Up: Compilers and Preprocessors

5.10.1 Specific Compiler Characteristics
----------------------------------------

Some compilers exhibit different behaviors.

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

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

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


File: autoconf.info,  Node: Generic Compiler Characteristics,  Next: C Compiler,  Prev: Specific Compiler Characteristics,  Up: Compilers and Preprocessors

5.10.2 Generic Compiler Characteristics
---------------------------------------

 -- Macro: AC_CHECK_SIZEOF (TYPE-OR-EXPR, [UNUSED], [INCLUDES =
          `AC_INCLUDES_DEFAULT'])
     Define `SIZEOF_TYPE-OR-EXPR' (*note Standard Symbols::) to be the
     size in bytes of TYPE-OR-EXPR, which may be either a type or an
     expression returning a value that has a size.  If the expression
     `sizeof (TYPE-OR-EXPR)' is invalid, the result is 0.  INCLUDES is
     a series of include directives, defaulting to
     `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
     prior to the expression under test.

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

     For example, the call

          AC_CHECK_SIZEOF([int *])

     defines `SIZEOF_INT_P' to be 8 on DEC Alpha AXP systems.

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

 -- Macro: AC_CHECK_ALIGNOF (TYPE, [INCLUDES = `AC_INCLUDES_DEFAULT'])
     Define `ALIGNOF_TYPE' (*note Standard Symbols::) to be the
     alignment in bytes of TYPE.  `TYPE y;' must be valid as a
     structure member declaration.  If `type' is unknown, the result is
     0.  If no INCLUDES are specified, the default includes are used
     (*note Default Includes::).

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

 -- Macro: AC_COMPUTE_INT (VAR, EXPRESSION, [INCLUDES =
          `AC_INCLUDES_DEFAULT'], [ACTION-IF-FAILS])
     Store into the shell variable VAR the value of the integer
     EXPRESSION.  The value should fit in an initializer in a C
     variable of type `signed long'.  To support cross compilation (in
     which case, the macro only works on hosts that use twos-complement
     arithmetic), it should be possible to evaluate the expression at
     compile-time.  If no INCLUDES are specified, the default includes
     are used (*note Default Includes::).

     Execute ACTION-IF-FAILS if the value cannot be determined
     correctly.

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

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

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

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

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

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

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

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

     This macro caches its result in the `ac_cv_prog_c_openmp',
     `ac_cv_prog_cxx_openmp', `ac_cv_prog_f77_openmp', or
     `ac_cv_prog_fc_openmp' variable, depending on the current language.


File: autoconf.info,  Node: C Compiler,  Next: C++ Compiler,  Prev: Generic Compiler Characteristics,  Up: Compilers and Preprocessors

5.10.3 C Compiler Characteristics
---------------------------------

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

Don't use lines containing solitary backslashes
     They tickle a bug in the HP-UX C compiler (checked on HP-UX 10.20,
     11.00, and 11i).  When given the following source:

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

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

Don't compile several files at once if output matters to you
     Some compilers, such as HP's, report names of files being compiled
     when given more than one file operand.  For instance:

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

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

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

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

 -- Macro: AC_PROG_CC ([COMPILER-SEARCH-LIST])
     Determine a C compiler to use.  If `CC' is not already set in the
     environment, check for `gcc' and `cc', then for other C compilers.
     Set output variable `CC' to the name of the compiler found.

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

          AC_PROG_CC([gcc cl cc])

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

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

     If using the GNU C compiler, set shell variable `GCC' to `yes'.
     If output variable `CFLAGS' was not already set, set it to `-g
     -O2' for the GNU C compiler (`-O2' on systems where GCC does not
     accept `-g'), or `-g' for other compilers.  If your package does
     not like this default, then it is acceptable to insert the line `:
     ${CFLAGS=""}' after `AC_INIT' and before `AC_PROG_CC' to select an
     empty default instead.

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

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

     For the compiler COMPILER, this macro caches its result in the
     `ac_cv_prog_cc_COMPILER_c_o' variable.

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

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

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

   The following macros check for C compiler or machine architecture
features.  To check for characteristics not listed here, use
`AC_COMPILE_IFELSE' (*note Running the Compiler::) or `AC_RUN_IFELSE'
(*note Runtime::).

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

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

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

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

     This macro is called automatically by `AC_PROG_CC'.

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

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

 -- Macro: AC_C_BACKSLASH_A
     Define `HAVE_C_BACKSLASH_A' to 1 if the C compiler understands
     `\a'.

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

 -- Macro: AC_C_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE],
          [ACTION-IF-UNKNOWN], [ACTION-IF-UNIVERSAL])
     If words are stored with the most significant byte first (like
     Motorola and SPARC CPUs), execute ACTION-IF-TRUE.  If words are
     stored with the least significant byte first (like Intel and VAX
     CPUs), execute ACTION-IF-FALSE.

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

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

     The default for ACTION-IF-TRUE is to define `WORDS_BIGENDIAN'.
     The default for ACTION-IF-FALSE is to do nothing.  The default for
     ACTION-IF-UNKNOWN is to abort configure and tell the installer how
     to bypass this test.  And finally, the default for
     ACTION-IF-UNIVERSAL is to ensure that `WORDS_BIGENDIAN' is defined
     if and only if a universal build is detected and the current code
     is big-endian; this default works only if `autoheader' is used
     (*note autoheader Invocation::).

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

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

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

          const int foo;

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

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

     This macro caches its result in the `ac_cv_c_const' variable.

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

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

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

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

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

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

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

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

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

 -- Macro: AC_C_CHAR_UNSIGNED
     If the C type `char' is unsigned, define `__CHAR_UNSIGNED__',
     unless the C compiler predefines it.

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

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

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

          #define x(y) #y

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

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

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

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

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

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

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

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

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

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

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


File: autoconf.info,  Node: C++ Compiler,  Next: Objective C Compiler,  Prev: C Compiler,  Up: Compilers and Preprocessors

5.10.4 C++ Compiler Characteristics
-----------------------------------

 -- Macro: AC_PROG_CXX ([COMPILER-SEARCH-LIST])
     Determine a C++ compiler to use.  Check whether the environment
     variable `CXX' or `CCC' (in that order) is set; if so, then set
     output variable `CXX' to its value.

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

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

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

     If using the GNU C++ compiler, set shell variable `GXX' to `yes'.
     If output variable `CXXFLAGS' was not already set, set it to `-g
     -O2' for the GNU C++ compiler (`-O2' on systems where G++ does not
     accept `-g'), or `-g' for other compilers.  If your package does
     not like this default, then it is acceptable to insert the line `:
     ${CXXFLAGS=""}' after `AC_INIT' and before `AC_PROG_CXX' to select
     an empty default instead.


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

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

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


File: autoconf.info,  Node: Objective C Compiler,  Next: Objective C++ Compiler,  Prev: C++ Compiler,  Up: Compilers and Preprocessors

5.10.5 Objective C Compiler Characteristics
-------------------------------------------

 -- Macro: AC_PROG_OBJC ([COMPILER-SEARCH-LIST])
     Determine an Objective C compiler to use.  If `OBJC' is not already
     set in the environment, check for Objective C compilers.  Set
     output variable `OBJC' to the name of the compiler found.

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

          AC_PROG_OBJC([gcc objcc objc])

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

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


File: autoconf.info,  Node: Objective C++ Compiler,  Next: Erlang Compiler and Interpreter,  Prev: Objective C Compiler,  Up: Compilers and Preprocessors

5.10.6 Objective C++ Compiler Characteristics
---------------------------------------------

 -- Macro: AC_PROG_OBJCXX ([COMPILER-SEARCH-LIST])
     Determine an Objective C++ compiler to use.  If `OBJCXX' is not
     already set in the environment, check for Objective C++ compilers.
     Set output variable `OBJCXX' to the name of the compiler found.

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

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

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

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


File: autoconf.info,  Node: Erlang Compiler and Interpreter,  Next: Fortran Compiler,  Prev: Objective C++ Compiler,  Up: Compilers and Preprocessors

5.10.7 Erlang Compiler and Interpreter Characteristics
------------------------------------------------------

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

 -- Macro: AC_ERLANG_PATH_ERLC ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Determine an Erlang compiler to use.  If `ERLC' is not already set
     in the environment, check for `erlc'.  Set output variable `ERLC'
     to the complete path of the compiler command found.  In addition,
     if `ERLCFLAGS' is not set in the environment, set it to an empty
     value.

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

          AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])

 -- Macro: AC_ERLANG_NEED_ERLC ([PATH = `$PATH'])
     A simplified variant of the `AC_ERLANG_PATH_ERLC' macro, that
     prints an error message and exits the `configure' script if the
     `erlc' program is not found.

 -- Macro: AC_ERLANG_PATH_ERL ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
     Determine an Erlang interpreter to use.  If `ERL' is not already
     set in the environment, check for `erl'.  Set output variable
     `ERL' to the complete path of the interpreter command found.

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

          AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])

 -- Macro: AC_ERLANG_NEED_ERL ([PATH = `$PATH'])
     A simplified variant of the `AC_ERLANG_PATH_ERL' macro, that
     prints an error message and exits the `configure' script if the
     `erl' program is not found.


File: autoconf.info,  Node: Fortran Compiler,  Next: Go Compiler,  Prev: Erlang Compiler and Interpreter,  Up: Compilers and Preprocessors

5.10.8 Fortran Compiler Characteristics
---------------------------------------

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

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

 -- Macro: AC_PROG_F77 ([COMPILER-SEARCH-LIST])
     Determine a Fortran 77 compiler to use.  If `F77' is not already
     set in the environment, then check for `g77' and `f77', and then
     some other names.  Set the output variable `F77' to the name of
     the compiler found.

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

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

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

     The result of the GNU test is cached in the
     `ac_cv_f77_compiler_gnu' variable, acceptance of `-g' in the
     `ac_cv_prog_f77_g' variable.

 -- Macro: AC_PROG_FC ([COMPILER-SEARCH-LIST], [DIALECT])
     Determine a Fortran compiler to use.  If `FC' is not already set in
     the environment, then `dialect' is a hint to indicate what Fortran
     dialect to search for; the default is to search for the newest
     available dialect.  Set the output variable `FC' to the name of
     the compiler found.

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

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

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

     The result of the GNU test is cached in the `ac_cv_fc_compiler_gnu'
     variable, acceptance of `-g' in the `ac_cv_prog_fc_g' variable.

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

     The result of the test is cached in the `ac_cv_prog_f77_c_o' or
     `ac_cv_prog_fc_c_o' variable, respectively.

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

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

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

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

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

     The macros `AC_F77_DUMMY_MAIN' and `AC_FC_DUMMY_MAIN' or
     `AC_F77_MAIN' and `AC_FC_MAIN' are probably also necessary to link
     C/C++ with Fortran; see below.  Further, it is highly recommended
     that you use `AC_CONFIG_HEADERS' (*note 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 `ac_cv_prog_f77_v' or `ac_cv_prog_fc_v'
     variables, respectively.  The computed linker flags are cached in
     `ac_cv_f77_libs' or `ac_cv_fc_libs', respectively.

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

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

     By default, ACTION-IF-FOUND defines `F77_DUMMY_MAIN' or
     `FC_DUMMY_MAIN' to the name of this routine (e.g., `MAIN__') _if_
     it is required.  ACTION-IF-NOT-FOUND defaults to exiting with an
     error.

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

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

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

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

     The result of this macro is cached in the `ac_cv_f77_dummy_main' or
     `ac_cv_fc_dummy_main' variable, respectively.

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

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

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

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

     The result of this macro is cached in the `ac_cv_f77_main' or
     `ac_cv_fc_main' variable, respectively.

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

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

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

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

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

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

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

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

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

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

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

     The name mangling scheme is encoded in the `ac_cv_f77_mangling' or
     `ac_cv_fc_mangling' cache variable, respectively, and also used for
     the `AC_F77_FUNC' and `AC_FC_FUNC' macros described below.

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

 -- Macro: AC_FC_SRCEXT (EXT, [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
          `AC_MSG_FAILURE'])
 -- Macro: AC_FC_PP_SRCEXT (EXT, [ACTION-IF-SUCCESS],
          [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
     By default, the `FC' macros perform their tests using a `.f'
     extension for source-code files.  Some compilers, however, only
     enable newer language features for appropriately named files,
     e.g., Fortran 90 features only for `.f90' files, or preprocessing
     only with `.F' files or maybe other upper-case extensions.  On the
     other hand, some other compilers expect all source files to end in
     `.f' and require special flags to support other file name
     extensions.  The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros deal
     with these issues.

     The `AC_FC_SRCEXT' macro tries to get the `FC' compiler to accept
     files ending with the extension `.EXT' (i.e., EXT does _not_
     contain the dot).  If any special compiler flags are needed for
     this, it stores them in the output variable `FCFLAGS_EXT'.  This
     extension and these flags are then used for all subsequent `FC'
     tests (until `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' is called another
     time).

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

     Similarly, the `AC_FC_PP_SRCEXT' macro tries to get the `FC'
     compiler to preprocess and compile files with the extension
     `.EXT'.  When both `fpp' and `cpp' style preprocessing are
     provided, the former is preferred, as the latter may treat
     continuation lines, `//' 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 `AC_FC_SRCEXT(f90)', any needed
     flags are stored in the `FCFLAGS_EXT' variable.

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

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

     If `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' succeeds in compiling files
     with the EXT extension, it calls ACTION-IF-SUCCESS (defaults to
     nothing).  If it fails, and cannot find a way to make the `FC'
     compiler accept such files, it calls ACTION-IF-FAILURE (defaults
     to exiting with an error message).

     The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros cache their
     results in `ac_cv_fc_srcext_EXT' and `ac_cv_fc_pp_srcext_EXT'
     variables, respectively.

 -- Macro: AC_FC_PP_DEFINE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
          `AC_MSG_FAILURE'])
     Find a flag to specify defines for preprocessed Fortran.  Not all
     Fortran compilers use `-D'.  Substitute `FC_DEFINE' with the
     result and call ACTION-IF-SUCCESS (defaults to nothing) if
     successful, and ACTION-IF-FAILURE (defaults to failing with an
     error message) if not.

     This macro calls `AC_FC_PP_SRCEXT([F])' in order to learn how to
     preprocess a `conftest.F' file, but restores a previously used
     Fortran source file extension afterwards again.

     The result of this test is cached in the `ac_cv_fc_pp_define'
     variable.

 -- Macro: AC_FC_FREEFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
          `AC_MSG_FAILURE'])
     Try to ensure that the Fortran compiler (`$FC') allows free-format
     source code (as opposed to the older fixed-format style from
     Fortran 77).  If necessary, it may add some additional flags to
     `FCFLAGS'.

     This macro is most important if you are using the default `.f'
     extension, since many compilers interpret this extension as
     indicating fixed-format source unless an additional flag is
     supplied.  If you specify a different extension with
     `AC_FC_SRCEXT', such as `.f90', then `AC_FC_FREEFORM' ordinarily
     succeeds without modifying `FCFLAGS'.  For extensions which the
     compiler does not know about, the flag set by the `AC_FC_SRCEXT'
     macro might let the compiler assume Fortran 77 by default, however.

     If `AC_FC_FREEFORM' succeeds in compiling free-form source, it
     calls ACTION-IF-SUCCESS (defaults to nothing).  If it fails, it
     calls ACTION-IF-FAILURE (defaults to exiting with an error
     message).

     The result of this test, or `none' or `unknown', is cached in the
     `ac_cv_fc_freeform' variable.

 -- Macro: AC_FC_FIXEDFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
          `AC_MSG_FAILURE'])
     Try to ensure that the Fortran compiler (`$FC') allows the old
     fixed-format source code (as opposed to free-format style).  If
     necessary, it may add some additional flags to `FCFLAGS'.

     This macro is needed for some compilers alias names like `xlf95'
     which assume free-form source code by default, and in case you
     want to use fixed-form source with an extension like `.f90' which
     many compilers interpret as free-form by default.  If you specify
     a different extension with `AC_FC_SRCEXT', such as `.f', then
     `AC_FC_FIXEDFORM' ordinarily succeeds without modifying `FCFLAGS'.

     If `AC_FC_FIXEDFORM' succeeds in compiling fixed-form source, it
     calls ACTION-IF-SUCCESS (defaults to nothing).  If it fails, it
     calls ACTION-IF-FAILURE (defaults to exiting with an error
     message).

     The result of this test, or `none' or `unknown', is cached in the
     `ac_cv_fc_fixedform' variable.

 -- Macro: AC_FC_LINE_LENGTH ([LENGTH], [ACTION-IF-SUCCESS],
          [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
     Try to ensure that the Fortran compiler (`$FC') accepts long source
     code lines.  The LENGTH argument may be given as 80, 132, or
     unlimited, and defaults to 132.  Note that line lengths above 254
     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 `FCFLAGS'.

     If `AC_FC_LINE_LENGTH' succeeds in compiling fixed-form source, it
     calls ACTION-IF-SUCCESS (defaults to nothing).  If it fails, it
     calls ACTION-IF-FAILURE (defaults to exiting with an error
     message).

     The result of this test, or `none' or `unknown', is cached in the
     `ac_cv_fc_line_length' variable.

 -- Macro: AC_FC_CHECK_BOUNDS ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
          = `AC_MSG_FAILURE'])
     The `AC_FC_CHECK_BOUNDS' macro tries to enable array bounds
     checking in the Fortran compiler.  If successful, the
     ACTION-IF-SUCCESS is called and any needed flags are added to
     `FCFLAGS'.  Otherwise, 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 `ac_cv_fc_check_bounds'
     variable.

 -- Macro: AC_F77_IMPLICIT_NONE ([ACTION-IF-SUCCESS],
          [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
 -- Macro: AC_FC_IMPLICIT_NONE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
          = `AC_MSG_FAILURE'])
     Try to disallow implicit declarations in the Fortran compiler.  If
     successful, ACTION-IF-SUCCESS is called and any needed flags are
     added to `FFLAGS' or `FCFLAGS', respectively.  Otherwise,
     ACTION-IF-FAILURE is called, which defaults to failing with an
     error message.

     The result of these macros are cached in the
     `ac_cv_f77_implicit_none' and `ac_cv_fc_implicit_none' variables,
     respectively.

 -- Macro: AC_FC_MODULE_EXTENSION
     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 `.mod'.

     Not all compilers use module files at all, or by default.  The Cray
     Fortran compiler requires `-e m' in order to store and search
     module information in `.mod' files rather than in object files.
     Likewise, the Fujitsu Fortran compilers uses the `-Am' option to
     indicate how module information is stored.

     The `AC_FC_MODULE_EXTENSION' macro computes the module extension
     without the leading dot, and stores that in the `FC_MODEXT'
     variable.  If the compiler does not produce module files, or the
     extension cannot be determined, `FC_MODEXT' is empty.  Typically,
     the result of this macro may be used in cleanup `make' rules as
     follows:

          clean-modules:
                  -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)

     The extension, or `unknown', is cached in the
     `ac_cv_fc_module_ext' variable.

 -- Macro: AC_FC_MODULE_FLAG ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
          `AC_MSG_FAILURE'])
     Find the compiler flag to include Fortran 90 module information
     from another directory, and store that in the `FC_MODINC' variable.
     Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
     set `FC_MODINC' to empty and call 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 `FC_MODINC' and the following
     directory name, but `FC_MODINC' may contain trailing white space.
     For example, if you use Automake and would like to search `../lib'
     for module files, you can use the following:

          AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib

     Inside `configure' tests, you can use:

          if test -n "$FC_MODINC"; then
            FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
          fi

     The flag is cached in the `ac_cv_fc_module_flag' variable.  The
     substituted value of `FC_MODINC' may refer to the `ac_empty' dummy
     placeholder empty variable, to avoid losing the significant
     trailing whitespace in a `Makefile'.

 -- Macro: AC_FC_MODULE_OUTPUT_FLAG ([ACTION-IF-SUCCESS],
          [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
     Find the compiler flag to write Fortran 90 module information to
     another directory, and store that in the `FC_MODOUT' variable.
     Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
     set `FC_MODOUT' to empty and call 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 `AC_FC_MODULE_FLAG' above.  If you need to be
     able to write to another directory, for maximum portability use
     `FC_MODOUT' before any `FC_MODINC' and include both the current
     directory and the one you write to in the search path:

          AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). ...

     The flag is cached in the `ac_cv_fc_module_output_flag' variable.
     The substituted value of `FC_MODOUT' may refer to the `ac_empty'
     dummy placeholder empty variable, to avoid losing the significant
     trailing whitespace in a `Makefile'.


File: autoconf.info,  Node: Go Compiler,  Prev: Fortran Compiler,  Up: Compilers and Preprocessors

5.10.9 Go Compiler Characteristics
----------------------------------

Autoconf provides basic support for the Go programming language when
using the `gccgo' compiler (there is currently no support for the `6g'
and `8g' compilers).

 -- Macro: AC_PROG_GO ([COMPILER-SEARCH-LIST])
     Find the Go compiler to use.  Check whether the environment
     variable `GOC' is set; if so, then set output variable `GOC' to its
     value.

     Otherwise, if the macro is invoked without an argument, then
     search for a Go compiler named `gccgo'.  If it is not found, then
     as a last resort set `GOC' to `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 `GOFLAGS' was not already set, set it to `-g
     -O2'.  If your package does not like this default, `GOFLAGS' may
     be set before `AC_PROG_GO'.


File: autoconf.info,  Node: System Services,  Next: Posix Variants,  Prev: Compilers and Preprocessors,  Up: Existing Tests

5.11 System Services
====================

The following macros check for operating system services or
capabilities.

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

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

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

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

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

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


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

 -- Macro: AC_SYS_LARGEFILE
     Arrange for 64-bit file offsets, known as large-file support
     (http://www.unix-systems.org/version2/whatsnew/lfs20mar.html).  On
     some hosts, one must use special compiler options to build
     programs that can access large files.  Append any such options to
     the output variable `CC'.  Define `_FILE_OFFSET_BITS' and
     `_LARGE_FILES' if necessary.

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

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

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

 -- Macro: AC_SYS_LONG_FILE_NAMES
     If the system supports file names longer than 14 characters, define
     `HAVE_LONG_FILE_NAMES'.

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


File: autoconf.info,  Node: Posix Variants,  Next: Erlang Libraries,  Prev: System Services,  Up: Existing Tests

5.12 Posix Variants
===================

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

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

    `_GNU_SOURCE'
          Enable extensions on GNU/Linux.

    `__EXTENSIONS__'
          Enable general extensions on Solaris.

    `_POSIX_PTHREAD_SEMANTICS'
          Enable threading extensions on Solaris.

    `_TANDEM_SOURCE'
          Enable extensions for the HP NonStop platform.

    `_ALL_SOURCE'
          Enable extensions for AIX 3, and for Interix.

    `_POSIX_SOURCE'
          Enable Posix functions for Minix.

    `_POSIX_1_SOURCE'
          Enable additional Posix functions for Minix.

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


File: autoconf.info,  Node: Erlang Libraries,  Prev: Posix Variants,  Up: Existing Tests

5.13 Erlang Libraries
=====================

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

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

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

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

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

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

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

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

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

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

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

 -- Macro: AC_ERLANG_SUBST_INSTALL_LIB_DIR
     Set the `ERLANG_INSTALL_LIB_DIR' output variable to the directory
     into which every built Erlang library should be installed in a
     separate subdirectory.  If this variable is not set in the
     environment when `configure' runs, its default value is
     `${libdir}/erlang/lib'.

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


File: autoconf.info,  Node: Writing Tests,  Next: Results,  Prev: Existing Tests,  Up: Top

6 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 (*note Language Choice::).  They do not cache the results of
their tests for future use (*note 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.  *Note 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
* Systemology::                 A zoology of operating systems
* Multiple Cases::              Tests for several possible values


File: autoconf.info,  Node: Language Choice,  Next: Writing Test Programs,  Up: Writing Tests

6.1 Language Choice
===================

Autoconf-generated `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
`configure.ac'.

 -- Macro: AC_LANG (LANGUAGE)
     Do compilation tests using the compiler, preprocessor, and file
     extensions for the specified LANGUAGE.

     Supported languages are:

    `C'
          Do compilation tests using `CC' and `CPP' and use extension
          `.c' for test programs.  Use compilation flags: `CPPFLAGS'
          with `CPP', and both `CPPFLAGS' and `CFLAGS' with `CC'.

    `C++'
          Do compilation tests using `CXX' and `CXXCPP' and use
          extension `.C' for test programs.  Use compilation flags:
          `CPPFLAGS' with `CXXCPP', and both `CPPFLAGS' and `CXXFLAGS'
          with `CXX'.

    `Fortran 77'
          Do compilation tests using `F77' and use extension `.f' for
          test programs.  Use compilation flags: `FFLAGS'.

    `Fortran'
          Do compilation tests using `FC' and use extension `.f' (or
          whatever has been set by `AC_FC_SRCEXT') for test programs.
          Use compilation flags: `FCFLAGS'.

    `Erlang'
          Compile and execute tests using `ERLC' and `ERL' and use
          extension `.erl' for test Erlang modules.  Use compilation
          flags: `ERLCFLAGS'.

    `Objective C'
          Do compilation tests using `OBJC' and `OBJCPP' and use
          extension `.m' for test programs.  Use compilation flags:
          `CPPFLAGS' with `OBJCPP', and both `CPPFLAGS' and `OBJCFLAGS'
          with `OBJC'.

    `Objective C++'
          Do compilation tests using `OBJCXX' and `OBJCXXCPP' and use
          extension `.mm' for test programs.  Use compilation flags:
          `CPPFLAGS' with `OBJCXXCPP', and both `CPPFLAGS' and
          `OBJCXXFLAGS' with `OBJCXX'.

    `Go'
          Do compilation tests using `GOC' and use extension `.go' for
          test programs.  Use compilation flags `GOFLAGS'.

 -- Macro: AC_LANG_PUSH (LANGUAGE)
     Remember the current language (as set by `AC_LANG') on a stack, and
     then select the LANGUAGE.  Use this macro and `AC_LANG_POP' in
     macros that need to temporarily switch to a particular language.

 -- Macro: AC_LANG_POP ([LANGUAGE])
     Select the language that is saved on the top of the stack, as set
     by `AC_LANG_PUSH', and remove it from the stack.

     If given, LANGUAGE specifies the language we just _quit_.  It is a
     good idea to specify it when it's known (which should be the
     case...), since Autoconf detects inconsistencies.

          AC_LANG_PUSH([Fortran 77])
          # Perform some tests on Fortran 77.
          # ...
          AC_LANG_POP([Fortran 77])

 -- Macro: AC_LANG_ASSERT (LANGUAGE)
     Check statically that the current language is 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 `autoconf' time, and incurs no cost at
     `configure' time.  Sadly enough and because Autoconf is a two
     layer language (1), the macros `AC_LANG_PUSH' and `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 `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...

 -- Macro: AC_REQUIRE_CPP
     Ensure that whichever preprocessor would currently be used for
     tests has been found.  Calls `AC_REQUIRE' (*note Prerequisite
     Macros::) with an argument of either `AC_PROG_CPP' or
     `AC_PROG_CXXCPP', depending on which language is current.

   ---------- Footnotes ----------

   (1) Because M4 is not aware of Sh code, especially conditionals,
some optimizations that look nice statically may produce incorrect
results at runtime.


File: autoconf.info,  Node: Writing Test Programs,  Next: Running the Preprocessor,  Prev: Language Choice,  Up: Writing Tests

6.2 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


File: autoconf.info,  Node: Guidelines,  Next: Test Functions,  Up: Writing Test Programs

6.2.1 Guidelines for Test Programs
----------------------------------

The most important rule to follow when writing testing samples is:

                          _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 `cpp' to check whether a header is
functional might let your `configure' accept a header which causes some
_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 `exit' to be declared, test
programs should `return', not `exit', from `main', because on many
systems `exit' is not declared by default.

   Test programs can use `#if' or `#ifdef' to check the values of
preprocessor macros defined by tests that have already run.  For
example, if you call `AC_HEADER_STDBOOL', then later on in
`configure.ac' you can have a test program that includes `stdbool.h'
conditionally:

     #ifdef HAVE_STDBOOL_H
     # include <stdbool.h>
     #endif

   Both `#if HAVE_STDBOOL_H' and `#ifdef HAVE_STDBOOL_H' will work with
any standard C compiler.  Some developers prefer `#if' because it is
easier to read, while others prefer `#ifdef' because it avoids
diagnostics with picky compilers like GCC with the `-Wundef' option.

   If a test program needs to use or create a data file, give it a name
that starts with `conftest', such as `conftest.data'.  The `configure'
script cleans up by running `rm -f -r conftest*' after running test
programs and if the script is interrupted.


File: autoconf.info,  Node: Test Functions,  Next: Generating Sources,  Prev: Guidelines,  Up: Writing Test Programs

6.2.2 Test Functions
--------------------

These days it's safe to assume support for function prototypes
(introduced in C89).

   Functions that test programs declare should also be conditionalized
for C++, which requires `extern "C"' prototypes.  Make sure to not
include any header files containing clashing prototypes.

     #ifdef __cplusplus
     extern "C"
     #endif
     void *valloc (size_t);

   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 `exit', because GCC version 2 knows that `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, `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 `char').


File: autoconf.info,  Node: Generating Sources,  Prev: Test Functions,  Up: Writing Test Programs

6.2.3 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 (*note Language Choice::) to
"format" the output properly.

 -- Macro: AC_LANG_CONFTEST (SOURCE)
     Save the SOURCE text in the current test source file:
     `conftest.EXTENSION' where the EXTENSION depends on the current
     language.  As of Autoconf 2.63b, the source file also contains the
     results of all of the `AC_DEFINE' performed so far.

     Note that the 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.

     This macro issues a warning during `autoconf' processing if SOURCE
     does not include an expansion of the macro
     `AC_LANG_DEFINES_PROVIDED' (note that both `AC_LANG_SOURCE' and
     `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 `AC_COMPILE_IFELSE' and
     `AC_RUN_IFELSE'.

 -- Macro: AC_LANG_DEFINES_PROVIDED
     This macro is called as a witness that the file
     `conftest.EXTENSION' appropriate for the current language is
     complete, including all previously determined results from
     `AC_DEFINE'.  This macro is seldom called directly, but exists if
     you have a compelling reason to write a conftest file without using
     `AC_LANG_SOURCE', yet still want to avoid a syntax warning from
     `AC_LANG_CONFTEST'.

 -- Macro: AC_LANG_SOURCE (SOURCE)
     Expands into the SOURCE, with the definition of all the
     `AC_DEFINE' performed so far.  This macro includes an expansion of
     `AC_LANG_DEFINES_PROVIDED'.

     In many cases, you may find it more convenient to use the wrapper
     `AC_LANG_PROGRAM'.

   For instance, executing (observe the double quotation!):

     AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
             [http://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

on a system with `gcc' installed, results in:

     ...
     # 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 "http://www.example.org/"
     #define HELLO_WORLD "Hello, World\n"

     const char hw[] = "Hello, World\n";

   When the test language is Fortran, Erlang, or Go, the `AC_DEFINE'
definitions are not automatically translated into constants in the
source code by this macro.

 -- Macro: AC_LANG_PROGRAM (PROLOGUE, BODY)
     Expands into a source file which consists of the PROLOGUE, and
     then BODY as body of the main function (e.g., `main' in C).  Since
     it uses `AC_LANG_SOURCE', the features of the latter are available.

   For instance:

     AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
             [http://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

on a system with `gcc' installed, results in:

     ...
     # 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 "http://www.example.org/"
     #define HELLO_WORLD "Hello, World\n"

     const char hw[] = "Hello, World\n";
     int
     main ()
     {
     fputs (hw, stdout);
       ;
       return 0;
     }

   In Erlang tests, the created source file is that of an Erlang module
called `conftest' (`conftest.erl').  This module defines and exports at
least one `start/0' function, which is called to perform the test.  The
PROLOGUE is optional code that is inserted between the module header and
the `start/0' function definition.  BODY is the body of the `start/0'
function without the final period (*note Runtime::, about constraints
on this function's behavior).

   For instance:

     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

results in:

     -module(conftest).
     -export([start/0]).
     -define(HELLO_WORLD, "Hello, world!").
     start() ->
     io:format("~s~n", [?HELLO_WORLD])
     .

 -- Macro: AC_LANG_CALL (PROLOGUE, FUNCTION)
     Expands into a source file which consists of the PROLOGUE, and
     then a call to the FUNCTION as body of the main function (e.g.,
     `main' in C).  Since it uses `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.

 -- Macro: AC_LANG_FUNC_LINK_TRY (FUNCTION)
     Expands into a source file which uses the FUNCTION in the body of
     the main function (e.g., `main' in C).  Since it uses
     `AC_LANG_PROGRAM', the features of the latter are available.

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


File: autoconf.info,  Node: Running the Preprocessor,  Next: Running the Compiler,  Prev: Writing Test Programs,  Up: Writing Tests

6.3 Running the Preprocessor
============================

Sometimes one might need to run the preprocessor on some source file.
_Usually it is a bad idea_, as you typically need to _compile_ your
project, not merely run the preprocessor on it; therefore you certainly
want to run the compiler, not the preprocessor.  Resist the temptation
of following the easiest path.

   Nevertheless, if you need to run the preprocessor, then use
`AC_PREPROC_IFELSE'.

   The macros described in this section cannot be used for tests in
Erlang, Fortran, or Go, since those languages require no preprocessor.

 -- Macro: AC_PREPROC_IFELSE (INPUT, [ACTION-IF-TRUE],
          [ACTION-IF-FALSE])
     Run the preprocessor of the current language (*note Language
     Choice::) on the INPUT, run the shell commands ACTION-IF-TRUE on
     success, ACTION-IF-FALSE otherwise.  The INPUT can be made by
     `AC_LANG_PROGRAM' and friends.

     This macro uses `CPPFLAGS', but not `CFLAGS', because `-g', `-O',
     etc. are not valid options to many C preprocessors.

     It is customary to report unexpected failures with
     `AC_MSG_FAILURE'.  If needed, ACTION-IF-TRUE can further access
     the preprocessed output in the file `conftest.i'.

   For instance:

     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])])

results in:

     checking for gcc... gcc
     checking for C compiler default output file name... a.out
     checking whether the C compiler works... yes
     checking whether we are cross compiling... no
     checking for suffix of executables...
     checking for suffix of object files... o
     checking whether we are using the GNU C compiler... yes
     checking whether gcc accepts -g... yes
     checking for gcc option to accept ISO C89... none needed
     checking how to run the C preprocessor... gcc -E
     OK


   The macro `AC_TRY_CPP' (*note Obsolete Macros::) used to play the
role of `AC_PREPROC_IFELSE', but double quotes its argument, making it
impossible to use it to elaborate sources.  You are encouraged to get
rid of your old use of the macro `AC_TRY_CPP' in favor of
`AC_PREPROC_IFELSE', but, in the first place, are you sure you need to
run the _preprocessor_ and not the compiler?

 -- Macro: AC_EGREP_HEADER (PATTERN, HEADER-FILE, ACTION-IF-FOUND,
          [ACTION-IF-NOT-FOUND])
     If the output of running the preprocessor on the system header file
     HEADER-FILE matches the extended regular expression PATTERN,
     execute shell commands ACTION-IF-FOUND, otherwise execute
     ACTION-IF-NOT-FOUND.

 -- Macro: AC_EGREP_CPP (PATTERN, PROGRAM, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     PROGRAM is the text of a C or C++ program, on which shell
     variable, back quote, and backslash substitutions are performed.
     If the output of running the preprocessor on PROGRAM matches the
     extended regular expression PATTERN, execute shell commands
     ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.


File: autoconf.info,  Node: Running the Compiler,  Next: Running the Linker,  Prev: Running the Preprocessor,  Up: Writing Tests

6.4 Running the Compiler
========================

To check for a syntax feature of the current language's (*note Language
Choice::) compiler, such as whether it recognizes a certain keyword, or
simply to try some library feature, use `AC_COMPILE_IFELSE' to try to
compile a small program that uses that feature.

 -- Macro: AC_COMPILE_IFELSE (INPUT, [ACTION-IF-TRUE],
          [ACTION-IF-FALSE])
     Run the compiler and compilation flags of the current language
     (*note Language Choice::) on the INPUT, run the shell commands
     ACTION-IF-TRUE on success, ACTION-IF-FALSE otherwise.  The INPUT
     can be made by `AC_LANG_PROGRAM' and friends.

     It is customary to report unexpected failures with
     `AC_MSG_FAILURE'.  This macro does not try to link; use
     `AC_LINK_IFELSE' if you need to do that (*note Running the
     Linker::).  If needed, ACTION-IF-TRUE can further access the
     just-compiled object file `conftest.$OBJEXT'.

     This macro uses `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 `AC_DEFUN' macro that triggered this macro to
     expand (*note Expanded Before Required::).

   For tests in Erlang, the INPUT must be the source code of a module
named `conftest'.  `AC_COMPILE_IFELSE' generates a `conftest.beam' file
that can be interpreted by the Erlang virtual machine (`ERL').  It is
recommended to use `AC_LANG_PROGRAM' to specify the test program, to
ensure that the Erlang module has the right name.


File: autoconf.info,  Node: Running the Linker,  Next: Runtime,  Prev: Running the Compiler,  Up: Writing Tests

6.5 Running the Linker
======================

To check for a library, a function, or a global variable, Autoconf
`configure' scripts try to compile and link a small program that uses
it.  This is unlike Metaconfig, which by default uses `nm' or `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 `nm' and `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.

   `AC_LINK_IFELSE' is used to compile test programs to test for
functions and global variables.  It is also used by `AC_CHECK_LIB' to
check for libraries (*note Libraries::), by adding the library being
checked for to `LIBS' temporarily and trying to link a small program.

 -- Macro: AC_LINK_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
     Run the compiler (and compilation flags) and the linker of the
     current language (*note Language Choice::) on the INPUT, run the
     shell commands ACTION-IF-TRUE on success, ACTION-IF-FALSE
     otherwise.  The INPUT can be made by `AC_LANG_PROGRAM' and
     friends.  If needed, ACTION-IF-TRUE can further access the
     just-linked program file `conftest$EXEEXT'.

     `LDFLAGS' and `LIBS' are used for linking, in addition to the
     current compilation flags.

     It is customary to report unexpected failures with
     `AC_MSG_FAILURE'.  This macro does not try to execute the program;
     use `AC_RUN_IFELSE' if you need to do that (*note Runtime::).

   The `AC_LINK_IFELSE' macro cannot be used for Erlang tests, since
Erlang programs are interpreted and do not require linking.


File: autoconf.info,  Node: Runtime,  Next: Systemology,  Prev: Running the Linker,  Up: Writing Tests

6.6 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 `AC_RUN_IFELSE'.  Avoid running test programs if possible,
because this prevents people from configuring your package for
cross-compiling.

 -- Macro: AC_RUN_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
          [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
     Run the compiler (and compilation flags) and the linker of the
     current language (*note Language Choice::) on the INPUT, then
     execute the resulting program.  If the program returns an exit
     status of 0 when executed, run shell commands ACTION-IF-TRUE.
     Otherwise, run shell commands ACTION-IF-FALSE.

     The INPUT can be made by `AC_LANG_PROGRAM' and friends.  `LDFLAGS'
     and `LIBS' are used for linking, in addition to the compilation
     flags of the current language (*note Language Choice::).
     Additionally, ACTION-IF-TRUE can run `./conftest$EXEEXT' for
     further testing.

     In the ACTION-IF-FALSE section, the failing exit status is
     available in the shell variable `$?'.  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 `configure' is being run, or if the options
     `--build' and `--host' were both specified and their values are
     different), then the test program is not run.  If the optional
     shell commands 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 `configure' prints an error
     message and exits.  If you want your package to be useful in a
     cross-compilation scenario, you _should_ provide a non-empty
     ACTION-IF-CROSS-COMPILING clause, as well as wrap the
     `AC_RUN_IFELSE' compilation inside an `AC_CACHE_CHECK' (*note
     Caching Results::) which allows the user to override the
     pessimistic default if needed.

     It is customary to report unexpected failures with
     `AC_MSG_FAILURE'.

   `autoconf' prints a warning message when creating `configure' each
time it encounters a call to `AC_RUN_IFELSE' with no
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 (*note Manual
Configuration::).  Alternatively, set up a test results cache file with
the correct values for the host system (*note Caching Results::).

   To provide a default for calls of `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 `cross_compiling' is set to
`yes', and then use an alternate method to get the results instead of
calling the macros.

   It is also permissible to temporarily assign to `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 ACTION-IF-CROSS-COMPILING even when you are not using a
cross-compiler.

     # 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([...])
     cross_compiling=$save_cross_compiling

   A C or C++ runtime test should be portable.  *Note Portable C and
C++::.

   Erlang tests must exit themselves the Erlang VM by calling the
`halt/1' function: the given status code is used to determine the
success of the test (status is `0') or its failure (status is different
than `0'), as explained above.  It must be noted that data output
through the standard output (e.g., using `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 `conftest.out', using the functions
of module `file'.  The `conftest.out' file is automatically deleted by
the `AC_RUN_IFELSE' macro.  For instance, a simplified implementation
of Autoconf's `AC_ERLANG_SUBST_LIB_DIR' macro is:

     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)])],
       [echo "code:lib_dir() returned: `cat conftest.out`"],
       [AC_MSG_FAILURE([test Erlang program execution failed])])


File: autoconf.info,  Node: Systemology,  Next: Multiple Cases,  Prev: Runtime,  Up: Writing Tests

6.7 Systemology
===============

This section aims at presenting some systems and pointers to
documentation.  It may help you addressing particular problems reported
by users.

   Posix-conforming systems (http://www.opengroup.org/susv3) are
derived from the Unix operating system
(http://www.bell-labs.com/history/unix/).

   The Rosetta Stone for Unix (http://bhami.com/rosetta.html) contains
a table correlating the features of various Posix-conforming systems.
Unix History (http://www.levenez.com/unix/) is a simplified diagram of
how many Unix systems were derived from each other.

   The Heirloom Project (http://heirloom.sourceforge.net/) provides
some variants of traditional implementations of Unix utilities.

Darwin
     Darwin is also known as Mac OS X.  Beware that the file system
     _can_ be case-preserving, but case insensitive.  This can cause
     nasty problems, since for instance the installation attempt for a
     package having an `INSTALL' file can result in `make install'
     report that nothing was to be done!

     That's all dependent on whether the file system is a UFS (case
     sensitive) or HFS+ (case preserving).  By default Apple wants you
     to install the OS on HFS+.  Unfortunately, there are some pieces of
     software which really need to be built on UFS.  We may want to
     rebuild Darwin to have both UFS and HFS+ available (and put the
     /local/build tree on the UFS).

QNX 4.25
     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.  It claims to be Posix certified.  More
     information is available on the QNX home page
     (http://www.qnx.com/).

Tru64
     Documentation of several versions of Tru64
     (http://h30097.www3.hp.com/docs/) is available in different
     formats.

Unix version 7
     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 Unix Seventh Edition Manual
     (http://plan9.bell-labs.com/7thEdMan/).  Previous versions of Unix
     are called "Unix version 6", etc., but they were not as widely
     used.


File: autoconf.info,  Node: Multiple Cases,  Prev: Systemology,  Up: Writing Tests

6.8 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 `fstype' to keep
track of whether the remaining cases need to be checked.  Note that
since the value of `fstype' is under our control, we don't have to use
the longer `test "x$fstype" = xno'.

     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])
     if test $fstype = no; then
       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])
     fi
     if test $fstype = no; then
       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])
     fi
     # (more cases omitted here)
     AC_MSG_RESULT([$fstype])


File: autoconf.info,  Node: Results,  Next: Programming in M4,  Prev: Writing Tests,  Up: Top

7 Results of Tests
******************

Once `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 `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 `configure' runs
* Printing Messages::           Notifying `configure' users


File: autoconf.info,  Node: Defining Symbols,  Next: Setting Output Variables,  Up: Results

7.1 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 `AC_DEFINE' or `AC_DEFINE_UNQUOTED'.

   By default, `AC_OUTPUT' places the symbols defined by these macros
into the output variable `DEFS', which contains an option
`-DSYMBOL=VALUE' for each symbol defined.  Unlike in Autoconf version
1, there is no variable `DEFS' defined while `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:

     AC_CHECK_FUNC([vprintf], [AC_DEFINE([HAVE_VPRINTF], [1],
                               [Define if vprintf exists.])])
     if test "x$ac_cv_func_vprintf" != xyes; then
       AC_CHECK_FUNC([_doprnt], [AC_DEFINE([HAVE_DOPRNT], [1],
                                 [Define if _doprnt exists.])])
     fi

   If `AC_CONFIG_HEADERS' has been called, then instead of creating
`DEFS', `AC_OUTPUT' creates a header file by substituting the correct
values into `#define' statements in a template file.  *Note
Configuration Headers::, for more information about this kind of output.

 -- Macro: AC_DEFINE (VARIABLE, VALUE, [DESCRIPTION])
 -- Macro: AC_DEFINE (VARIABLE)
     Define VARIABLE to VALUE (verbatim), by defining a C preprocessor
     macro for VARIABLE.  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 `...' if C99 syntax is employed.
     VARIABLE should not contain comments, white space, trigraphs,
     backslash-newlines, universal character names, or non-ASCII
     characters.

     VALUE may contain backslash-escaped newlines, which will be
     preserved if you use `AC_CONFIG_HEADERS' but flattened if passed
     via `@DEFS@' (with no effect on the compilation, since the
     preprocessor sees only one line in the first place).  VALUE should
     not contain raw newlines.  If you are not using
     `AC_CONFIG_HEADERS', VALUE should not contain any `#' characters,
     as `make' tends to eat them.  To use a shell variable, use
     `AC_DEFINE_UNQUOTED' instead.

     DESCRIPTION is only useful if you are using `AC_CONFIG_HEADERS'.
     In this case, DESCRIPTION is put into the generated `config.h.in'
     as the comment before the macro define.  The following example
     defines the C preprocessor variable `EQUATION' to be the string
     constant `"$a > $b"':

          AC_DEFINE([EQUATION], ["$a > $b"],
            [Equation string.])

     If neither VALUE nor DESCRIPTION are given, then 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 VARIABLE is a literal string, it is passed to
     `m4_pattern_allow' (*note Forbidden Patterns::).

     If multiple `AC_DEFINE' statements are executed for the same
     VARIABLE name (not counting any parenthesized argument list), the
     last one wins.

 -- Macro: AC_DEFINE_UNQUOTED (VARIABLE, VALUE, [DESCRIPTION])
 -- Macro: AC_DEFINE_UNQUOTED (VARIABLE)
     Like `AC_DEFINE', but three shell expansions are
     performed--once--on VARIABLE and VALUE: variable expansion (`$'),
     command substitution (``'), and backslash escaping (`\'), as if in
     an unquoted here-document.  Single and double quote characters in
     the value have no special meaning.  Use this macro instead of
     `AC_DEFINE' when VARIABLE or VALUE is a shell variable.  Examples:

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

   Due to a syntactical bizarreness of the Bourne shell, do not use
semicolons to separate `AC_DEFINE' or `AC_DEFINE_UNQUOTED' calls from
other macro calls or shell code; that can cause syntax errors in the
resulting `configure' script.  Use either blanks or newlines.  That is,
do this:

     AC_CHECK_HEADER([elf.h],
       [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])

or this:

     AC_CHECK_HEADER([elf.h],
       [AC_DEFINE([SVR4], [1], [System V Release 4])
        LIBS="-lelf $LIBS"])

instead of this:

     AC_CHECK_HEADER([elf.h],
       [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])


File: autoconf.info,  Node: Setting Output Variables,  Next: Special Chars in Variables,  Prev: Defining Symbols,  Up: Results

7.2 Setting Output Variables
============================

Another way to record the results of tests is to set "output
variables", which are shell variables whose values are substituted into
files that `configure' outputs.  The two macros below create new output
variables.  *Note Preset Output Variables::, for a list of output
variables that are always available.

 -- Macro: AC_SUBST (VARIABLE, [VALUE])
     Create an output variable from a shell variable.  Make `AC_OUTPUT'
     substitute the variable VARIABLE into output files (typically one
     or more makefiles).  This means that `AC_OUTPUT' replaces
     instances of `@VARIABLE@' in input files with the value that the
     shell variable VARIABLE has when `AC_OUTPUT' is called.  The value
     can contain any non-`NUL' character, including newline.  If you
     are using Automake 1.11 or newer, for newlines in values you might
     want to consider using `AM_SUBST_NOTMAKE' to prevent `automake'
     from adding a line `VARIABLE = @VARIABLE@' to the `Makefile.in'
     files (*note Automake: (automake)Optional.).

     Variable occurrences should not overlap: e.g., an input file should
     not contain `@VAR1@VAR2@' if VAR1 and VAR2 are variable names.
     The substituted value is not rescanned for more output variables;
     occurrences of `@VARIABLE@' in the value are inserted literally
     into the output file.  (The algorithm uses the special marker
     `|#_!!_#|' internally, so neither the substituted value nor the
     output file may contain `|#_!!_#|'.)

     If VALUE is given, in addition assign it to VARIABLE.

     The string VARIABLE is passed to `m4_pattern_allow' (*note
     Forbidden Patterns::).

 -- Macro: AC_SUBST_FILE (VARIABLE)
     Another way to create an output variable from a shell variable.
     Make `AC_OUTPUT' insert (without substitutions) the contents of
     the file named by shell variable VARIABLE into output files.  This
     means that `AC_OUTPUT' replaces instances of `@VARIABLE@' in
     output files (such as `Makefile.in') with the contents of the file
     that the shell variable VARIABLE names when `AC_OUTPUT' is called.
     Set the variable to `/dev/null' for cases that do not have a file
     to insert.  This substitution occurs only when the `@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 `make' directives for particular host
     or target types into makefiles.  For example, `configure.ac' could
     contain:

          AC_SUBST_FILE([host_frag])
          host_frag=$srcdir/conf/sun4.mh

     and then a `Makefile.in' could contain:

          @host_frag@

     The string VARIABLE is passed to `m4_pattern_allow' (*note
     Forbidden Patterns::).

   Running `configure' in varying environments can be extremely
dangerous.  If for instance the user runs `CC=bizarre-cc ./configure',
then the cache, `config.h', and many other output files depend upon
`bizarre-cc' being the C compiler.  If for some reason the user runs
`./configure' again, or if it is run via `./config.status --recheck',
(*Note Automatic Remaking::, and *note 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 `CC'
above, are called "precious variables", and can be declared as such by
`AC_ARG_VAR'.

 -- Macro: AC_ARG_VAR (VARIABLE, DESCRIPTION)
     Declare VARIABLE is a precious variable, and include its
     DESCRIPTION in the variable section of `./configure --help'.

     Being precious means that
        - VARIABLE is substituted via `AC_SUBST'.

        - The value of VARIABLE when `configure' was launched is saved
          in the cache, including if it was not specified on the command
          line but via the environment.  Indeed, while `configure' can
          notice the definition of `CC' in `./configure CC=bizarre-cc',
          it is impossible to notice it in `CC=bizarre-cc ./configure',
          which, unfortunately, is what most users do.

          We emphasize that it is the _initial_ value of VARIABLE which
          is saved, not that found during the execution of `configure'.
          Indeed, specifying `./configure FOO=foo' and letting
          `./configure' guess that `FOO' is `foo' can be two different
          things.

        - VARIABLE is checked for consistency between two `configure'
          runs.  For instance:

               $ ./configure --silent --config-cache
               $ 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

          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.

        - VARIABLE is kept during automatic reconfiguration (*note
          config.status Invocation::) as if it had been passed as a
          command line argument, including when no cache is used:

               $ CC=/usr/bin/cc ./configure var=raboof --silent
               $ ./config.status --recheck
               running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
                 CC=/usr/bin/cc  --no-create --no-recursion


File: autoconf.info,  Node: Special Chars in Variables,  Next: Caching Results,  Prev: Setting Output Variables,  Up: Results

7.3 Special Characters in Output Variables
==========================================

Many output variables are intended to be evaluated both by `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:

     " # $ & ' ( ) * ; < > ? [ \ ^ ` |

   Also, these variables' values should neither contain newlines, nor
start with `~', nor contain white space or `:' immediately followed by
`~'.  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 `configure'
computes, and to the values set directly by the user.  For example, the
following invocations of `configure' are problematic, since they
attempt to use special characters within `CPPFLAGS' and white space
within `$(srcdir)':

     CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'

     '../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'


File: autoconf.info,  Node: Caching Results,  Next: Printing Messages,  Prev: Special Chars in Variables,  Up: Results

7.4 Caching Results
===================

To avoid checking for the same features repeatedly in various
`configure' scripts (or in repeated runs of one script), `configure'
can optionally save the results of many checks in a "cache file" (*note
Cache Files::).  If a `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, `configure' can
then run much faster than if it had to perform all of the checks every
time.

 -- Macro: AC_CACHE_VAL (CACHE-ID, COMMANDS-TO-SET-IT)
     Ensure that the results of the check identified by CACHE-ID are
     available.  If the results of the check were in the cache file
     that was read, and `configure' was not given the `--quiet' or
     `--silent' option, print a message saying that the result was
     cached; otherwise, run the shell commands COMMANDS-TO-SET-IT.  If
     the shell commands are run to determine the value, the value is
     saved in the cache file just before `configure' creates its output
     files.  *Note Cache Variable Names::, for how to choose the name
     of the CACHE-ID variable.

     The COMMANDS-TO-SET-IT _must have no side effects_ except for
     setting the variable CACHE-ID, see below.

 -- Macro: AC_CACHE_CHECK (MESSAGE, CACHE-ID, COMMANDS-TO-SET-IT)
     A wrapper for `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 `AC_MSG_CHECKING' for
     MESSAGE, then `AC_CACHE_VAL' with the CACHE-ID and COMMANDS
     arguments, and `AC_MSG_RESULT' with CACHE-ID.

     The COMMANDS-TO-SET-IT _must have no side effects_ except for
     setting the variable CACHE-ID, see below.

   It is common to find buggy macros using `AC_CACHE_VAL' or
`AC_CACHE_CHECK', because people are tempted to call `AC_DEFINE' in the
COMMANDS-TO-SET-IT.  Instead, the code that _follows_ the call to
`AC_CACHE_VAL' should call `AC_DEFINE', by examining the value of the
cache variable.  For instance, the following macro is broken:

     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])
     ])

This fails if the cache is enabled: the second time this macro is run,
`TRUE_WORKS' _will not be defined_.  The proper implementation is:

     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
     ])

   Also, COMMANDS-TO-SET-IT should not print any messages, for example
with `AC_MSG_CHECKING'; do that before calling `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 `configure' uses for caching
* Cache Checkpointing::         Loading and saving the cache file


File: autoconf.info,  Node: Cache Variable Names,  Next: Cache Files,  Up: Caching Results

7.4.1 Cache Variable Names
--------------------------

The names of cache variables should have the following format:

     PACKAGE-PREFIX_cv_VALUE-TYPE_SPECIFIC-VALUE_[ADDITIONAL-OPTIONS]

for example, `ac_cv_header_stat_broken' or
`ac_cv_prog_gcc_traditional'.  The parts of the variable name are:

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 `ac'.

`_cv_'
     Indicates that this shell variable is a cache value.  This string
     _must_ be present in the variable name, including the leading
     underscore.

VALUE-TYPE
     A convention for classifying cache values, to produce a rational
     naming system.  The values used in Autoconf are listed in *note
     Macro Names::.

SPECIFIC-VALUE
     Which member of the class of cache values this test applies to.
     For example, which function (`alloca'), program (`gcc'), or output
     variable (`INSTALL').

ADDITIONAL-OPTIONS
     Any particular behavior of the specific member that this test
     applies to.  For example, `broken' or `set'.  This part of the
     name may be omitted if it does not apply.

   The values assigned to cache variables may not contain newlines.
Usually, their values are Boolean (`yes' or `no') or the names of files
or functions; so this is not an important restriction.  *note Cache
Variable Index:: for an index of cache variables with documented
semantics.


File: autoconf.info,  Node: Cache Files,  Next: Cache Checkpointing,  Prev: Cache Variable Names,  Up: Caching Results

7.4.2 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 `configure' command line.

   By default, `configure' uses no cache file, to avoid problems caused
by accidental use of stale cache files.

   To enable caching, `configure' accepts `--config-cache' (or `-C') to
cache results in the file `config.cache'.  Alternatively,
`--cache-file=FILE' specifies that FILE be the cache file.  The cache
file is created if it does not exist already.  When `configure' calls
`configure' scripts in subdirectories, it uses the `--cache-file'
argument so that they share the same cache.  *Note Subdirectories::,
for information on configuring subdirectories with the
`AC_CONFIG_SUBDIRS' macro.

   `config.status' only pays attention to the cache file if it is given
the `--recheck' option, which makes it rerun `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 (*note 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
`configure' script.  (Running `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 `configure' is interrupted at the right time when it updates a
cache file outside of the build directory where the `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.


File: autoconf.info,  Node: Cache Checkpointing,  Prev: Cache Files,  Up: Caching Results

7.4.3 Cache Checkpointing
-------------------------

If your configure script, or a macro called from `configure.ac', happens
to abort the configure process, it may be useful to checkpoint the cache
a few times at key points using `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.

 -- Macro: AC_CACHE_LOAD
     Loads values from existing cache file, or creates a new cache file
     if a cache file is not found.  Called automatically from `AC_INIT'.

 -- Macro: AC_CACHE_SAVE
     Flushes all cached values to the cache file.  Called automatically
     from `AC_OUTPUT', but it can be quite useful to call
     `AC_CACHE_SAVE' at key points in `configure.ac'.

   For instance:

      ... AC_INIT, etc. ...
     # Checks for programs.
     AC_PROG_CC
     AC_PROG_AWK
      ... more program checks ...
     AC_CACHE_SAVE

     # Checks for libraries.
     AC_CHECK_LIB([nsl], [gethostbyname])
     AC_CHECK_LIB([socket], [connect])
      ... more lib checks ...
     AC_CACHE_SAVE

     # Might abort...
     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])])
      ... AC_OUTPUT, etc. ...


File: autoconf.info,  Node: Printing Messages,  Prev: Caching Results,  Up: Results

7.5 Printing Messages
=====================

`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 `echo' shell command.  They
direct output to the appropriate file descriptor (*note File Descriptor
Macros::).  `configure' scripts should rarely need to run `echo'
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 `autoconf' is run, see *note
Diagnostic Macros::.

 -- Macro: AC_MSG_CHECKING (FEATURE-DESCRIPTION)
     Notify the user that `configure' is checking for a particular
     feature.  This macro prints a message that starts with `checking '
     and ends with `...' and no newline.  It must be followed by a call
     to `AC_MSG_RESULT' to print the result of the check and the
     newline.  The FEATURE-DESCRIPTION should be something like
     `whether the Fortran compiler accepts C++ comments' or `for c89'.

     This macro prints nothing if `configure' is run with the `--quiet'
     or `--silent' option.

 -- Macro: AC_MSG_RESULT (RESULT-DESCRIPTION)
     Notify the user of the results of a check.  RESULT-DESCRIPTION is
     almost always the value of the cache variable for the check,
     typically `yes', `no', or a file name.  This macro should follow a
     call to `AC_MSG_CHECKING', and the RESULT-DESCRIPTION should be
     the completion of the message printed by the call to
     `AC_MSG_CHECKING'.

     This macro prints nothing if `configure' is run with the `--quiet'
     or `--silent' option.

 -- Macro: AC_MSG_NOTICE (MESSAGE)
     Deliver the 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.,

          AC_MSG_NOTICE([checking if stack overflow is detectable])

     This macro prints nothing if `configure' is run with the `--quiet'
     or `--silent' option.

 -- Macro: AC_MSG_ERROR (ERROR-DESCRIPTION, [EXIT-STATUS = `$?/1'])
     Notify the user of an error that prevents `configure' from
     completing.  This macro prints an error message to the standard
     error output and exits `configure' with EXIT-STATUS (`$?' by
     default, except that `0' is converted to `1').  ERROR-DESCRIPTION
     should be something like `invalid value $HOME for \$HOME'.

     The ERROR-DESCRIPTION should start with a lower-case letter, and
     "cannot" is preferred to "can't".

 -- Macro: AC_MSG_FAILURE (ERROR-DESCRIPTION, [EXIT-STATUS])
     This `AC_MSG_ERROR' wrapper notifies the user of an error that
     prevents `configure' from completing _and_ that additional details
     are provided in `config.log'.  This is typically used when
     abnormal results are found during a compilation.

 -- Macro: AC_MSG_WARN (PROBLEM-DESCRIPTION)
     Notify the `configure' user of a possible problem.  This macro
     prints the message to the standard error output; `configure'
     continues running afterward, so macros that call `AC_MSG_WARN'
     should provide a default (back-up) behavior for the situations
     they warn about.  PROBLEM-DESCRIPTION should be something like `ln
     -s seems to make hard links'.


File: autoconf.info,  Node: Programming in M4,  Next: Programming in M4sh,  Prev: Results,  Up: Top

8 Programming in M4
*******************

Autoconf is written on top of two layers: "M4sugar", which provides
convenient macros for pure M4 programming, and "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, _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


File: autoconf.info,  Node: M4 Quotation,  Next: Using autom4te,  Up: Programming in M4

8.1 M4 Quotation
================

The most common problem with existing macros is an improper quotation.
This section, which users of Autoconf can skip, but which macro writers
_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


File: autoconf.info,  Node: Active Characters,  Next: One Macro Call,  Up: M4 Quotation

8.1.1 Active Characters
-----------------------

To fully understand where proper quotation is important, you first need
to know what the special characters are in Autoconf: `#' introduces a
comment inside which no macro expansion is performed, `,' separates
arguments, `[' and `]' are the quotes themselves(1), `(' and `)' (which
M4 tries to match by pairs), and finally `$' 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:

     # define([def], ine)
     =># define([def], ine)

   Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:

     int tab[10];
     =>int tab10;
     [int tab[10];]
     =>int tab[10];

   Without this in mind, the reader might try hopelessly to use her
macro `array':

     define([array], [int tab[10];])
     array
     =>int tab10;
     [array]
     =>array

How can you correctly output the intended results(2)?

   ---------- Footnotes ----------

   (1) By itself, M4 uses ``' and `''; it is the M4sugar layer that
sets up the preferred quotes of `[' and `]'.

   (2) Using `defn'.


File: autoconf.info,  Node: One Macro Call,  Next: Quoting and Parameters,  Prev: Active Characters,  Up: M4 Quotation

8.1.2 One Macro Call
--------------------

Let's proceed on the interaction between active characters and macros
with this small macro, which just returns its first argument:

     define([car], [$1])

The two pairs of quotes above are not part of the arguments of
`define'; rather, they are understood by the top level when it tries to
find the arguments of `define'.  Therefore, assuming `car' is not
already defined, it is equivalent to write:

     define(car, $1)

But, while it is acceptable for a `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:

     car(foo, bar, baz)
     =>foo
     [car(foo, bar, baz)]
     =>car(foo, bar, baz)

   Let's pay attention to the special characters:

     car(#)
     error-->EOF in argument list

   The closing parenthesis is hidden in the comment; with a hypothetical
quoting, the top level understood it this way:

     car([#)]

Proper quotation, of course, fixes the problem:

     car([#])
     =>#

   Here are more examples:

     car(foo, bar)
     =>foo
     car([foo, bar])
     =>foo, bar
     car((foo, bar))
     =>(foo, bar)
     car([(foo], [bar)])
     =>(foo
     define([a], [b])
     =>
     car(a)
     =>b
     car([a])
     =>b
     car([[a]])
     =>a
     car([[[a]]])
     =>[a]


File: autoconf.info,  Node: Quoting and Parameters,  Next: Quotation and Nested Macros,  Prev: One Macro Call,  Up: M4 Quotation

8.1.3 Quoting and Parameters
----------------------------

When M4 encounters `$' within a macro definition, followed immediately
by a character it recognizes (`0'...`9', `#', `@', or `*'), 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.

     define([none], [$1])
     =>
     define([one], [[$1]])
     =>
     define([two], [[[$1]]])
     =>
     define([comment], [# $1])
     =>
     define([active], [ACTIVE])
     =>
     none([active])
     =>ACTIVE
     one([active])
     =>active
     two([active])
     =>[active]
     comment([active])
     =># active

   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 `$' 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.

     define([single], [a single-quoted $[]1 definition])
     =>
     define([double], [[a double-quoted $][1 definition]])
     =>
     single
     =>a single-quoted $1 definition
     double
     =>a double-quoted $1 definition

   Posix states that M4 implementations are free to provide
implementation extensions when `${' is encountered in a macro
definition.  Autoconf reserves the longer sequence `${{' for use with
planned extensions that will be available in the future GNU M4 2.0, but
guarantees that all other instances of `${' will be output literally.
Therefore, this idiom can also be used to output shell code parameter
references:

     define([first], [${1}])first
     =>${1}

   Posix also states that `$11' should expand to the first parameter
concatenated with a literal `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...


File: autoconf.info,  Node: Quotation and Nested Macros,  Next: Changequote is Evil,  Prev: Quoting and Parameters,  Up: M4 Quotation

8.1.4 Quotation and Nested Macros
---------------------------------

The examples below use the following macros:

     define([car], [$1])
     define([active], [ACT, IVE])
     define([array], [int tab[10]])

   Each additional embedded macro call introduces other possible
interesting quotations:

     car(active)
     =>ACT
     car([active])
     =>ACT, IVE
     car([[active]])
     =>active

   In the first case, the top level looks for the arguments of `car',
and finds `active'.  Because M4 evaluates its arguments before applying
the macro, `active' is expanded, which results in:

     car(ACT, IVE)
     =>ACT

In the second case, the top level gives `active' as first and only
argument of `car', which results in:

     active
     =>ACT, IVE

i.e., the argument is evaluated _after_ the macro that invokes it.  In
the third case, `car' receives `[active]', which results in:

     [active]
     =>active

exactly as we already saw above.

   The example above, applied to a more realistic example, gives:

     car(int tab[10];)
     =>int tab10;
     car([int tab[10];])
     =>int tab10;
     car([[int tab[10];]])
     =>int tab[10];

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 `car' macro, and
second after the `car' macro expands to the first argument.

   As the author of the Autoconf macro `car', you then consider it to
be incorrect that your users have to double-quote the arguments of
`car', so you "fix" your macro.  Let's call it `qar' for quoted car:

     define([qar], [[$1]])

and check that `qar' is properly fixed:

     qar([int tab[10];])
     =>int tab[10];

Ahhh!  That's much better.

   But note what you've done: now that the result of `qar' is always a
literal string, the only time a user can use nested macros is if she
relies on an _unquoted_ macro call:

     qar(active)
     =>ACT
     qar([active])
     =>active

leaving no way for her to reproduce what she used to do with `car':

     car([active])
     =>ACT, IVE

Worse yet: she wants to use a macro that produces a set of `cpp' macros:

     define([my_includes], [#include <stdio.h>])
     car([my_includes])
     =>#include <stdio.h>
     qar(my_includes)
     error-->EOF in argument list

   This macro, `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 `qar' behaves differently from the other macros, it's an
exception that should be avoided in Autoconf.


File: autoconf.info,  Node: Changequote is Evil,  Next: Quadrigraphs,  Prev: Quotation and Nested Macros,  Up: M4 Quotation

8.1.5 `changequote' is Evil
---------------------------

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: `changequote'.

   The M4 builtin `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 ``' and `'' 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 `'this'' and
``that`'), and because of literal characters in usual programming
languages (as in `'0''), there are many unbalanced ``' and `''.  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
`changequote', which makes it possible to choose another pair of
quotes.  M4sugar, M4sh, Autoconf, and Autotest all have chosen to use
`[' and `]'.  Not especially because they are unlikely characters, but
_because they are characters unlikely to be unbalanced_.

   There are other magic primitives, such as `changecom' to specify
what syntactic forms are comments (it is common to see `changecom(<!--,
-->)' when M4 is used to produce HTML pages), `changeword' and
`changesyntax' to change other syntactic details (such as the character
to denote the Nth argument, `$' 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:
`--quotes', `--comments', `--words', and `--syntax'.  Nevertheless,
they are implemented as M4 builtins, as it makes M4 libraries self
contained (no need for additional options).

   There lies the problem...


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


File: autoconf.info,  Node: Quadrigraphs,  Next: Balancing Parentheses,  Prev: Changequote is Evil,  Up: M4 Quotation

8.1.6 Quadrigraphs
------------------

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 `[^[]', which matches any character other than `['.  This
expression contains unbalanced brackets so it cannot be put easily into
an M4 macro.

   Additionally, there are a few m4sugar macros (such as `m4_split' and
`m4_expand') which internally use special markers in addition to the
regular quoting characters.  If the arguments to these macros contain
the literal strings `-=<{(' or `)}>=-', the macros might behave
incorrectly.

   You can work around these problems by using one of the following
"quadrigraphs":

`@<:@'
     `['

`@:>@'
     `]'

`@S|@'
     `$'

`@%:@'
     `#'

`@{:@'
     `('

`@:}@'
     `)'

`@&t@'
     Expands to nothing.

   Quadrigraphs are replaced at a late stage of the translation process,
after `m4' is run, so they do not get in the way of M4 quoting.  For
example, the string `^@<:@', independently of its quotation, appears as
`^[' in the output.

   The empty quadrigraph can be used:

   - to mark trailing spaces explicitly

     Trailing spaces are smashed by `autom4te'.  This is a feature.

   - to produce quadrigraphs and other strings reserved by m4sugar

     For instance `@<@&t@:@' produces `@<:@'.  For a more contrived
     example:

          m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
          m4_split([a )}>=- b -=<{( c])
          =>[a], [], [B], [], [c]
          m4_split([a )}@&t@>=- b -=<@&t@{( c])
          =>[a], [)}>=-], [b], [-=<{(], [c]

   - to escape _occurrences_ of forbidden patterns

     For instance you might want to mention `AC_FOO' in a comment, while
     still being sure that `autom4te' still catches unexpanded `AC_*'.
     Then write `AC@&t@_FOO'.

   The name `@&t@' was suggested by Paul Eggert:

     I should give some credit to the `@&t@' pun.  The `&' is my own
     invention, but the `t' came from the source code of the ALGOL68C
     compiler, written by Steve Bourne (of Bourne shell fame), and
     which used `mt' to denote the empty string.  In C, it would have
     looked like something like:

          char const mt[] = "";

     but of course the source code was written in Algol 68.

     I don't know where he got `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.


File: autoconf.info,  Node: Balancing Parentheses,  Next: Quotation Rule Of Thumb,  Prev: Quadrigraphs,  Up: M4 Quotation

8.1.7 Dealing with unbalanced parentheses
-----------------------------------------

One of the pitfalls of portable shell programming is that `case'
statements require unbalanced parentheses (*note Limitations of Shell
Builtins: case.).  With syntax highlighting editors, the presence of
unbalanced `)' can interfere with editors that perform syntax
highlighting of macro contents based on finding the matching `('.
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
`my_case', which happens to expand to a portable `case' statement:

     AC_DEFUN([my_case],
     [case $file_name in
       *.c) echo "C source code";;
     esac])
     AS_IF(:, my_case)

In the above example, the `AS_IF' call underquotes its arguments.  As a
result, the unbalanced `)' generated by the premature expansion of
`my_case' results in expanding `AS_IF' with a truncated parameter, and
the expansion is syntactically invalid:

     if :; then
       case $file_name in
       *.c
     fi echo "C source code";;
     esac)

   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 `my_case' to be more robust, even when used
without proper quoting, each with some benefits and some drawbacks.

     Creative literal shell comment
          AC_DEFUN([my_case],
          [case $file_name in #(
            *.c) echo "C source code";;
          esac])
     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 `#(' is an M4
     comment that masks the normal properties of `('.

     Quadrigraph shell comment
          AC_DEFUN([my_case],
          [case $file_name in @%:@(
            *.c) echo "C source code";;
          esac])
     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 `@%:@' for `#' reduces
     readability.

     Quoting just the parenthesis
          AC_DEFUN([my_case],
          [case $file_name in
            *.c[)] echo "C source code";;
          esac])
     This version quotes the `)', 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 `[#(]' to meet that need, too.
     However, it still requires some edits before it can be copied and
     pasted into a terminal.

     Double-quoting the entire statement
          AC_DEFUN([my_case],
          [[case $file_name in #(
            *.c) echo "C source code";;
          esac]])
     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.

     Using `AS_CASE'
          AC_DEFUN([my_case],
          [AS_CASE([$file_name],
            [*.c], [echo "C source code"])])
     This version avoids the balancing issue altogether, by relying on
     `AS_CASE' (*note Common Shell Constructs::); it also allows for the
     expansion of `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.


File: autoconf.info,  Node: Quotation Rule Of Thumb,  Prev: Balancing Parentheses,  Up: M4 Quotation

8.1.8 Quotation Rule Of Thumb
-----------------------------

To conclude, the quotation rule of thumb is:

             _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 _the
arguments_!

   It is common to read Autoconf programs with snippets like:

     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)

which is incredibly useless since `AC_TRY_LINK' is _already_ double
quoting, so you just need:

     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])

The M4-fluent reader might note that these two examples are rigorously
equivalent, since M4 swallows both the `changequote(<<, >>)' and `<<'
`>>' when it "collects" the arguments: these quotes are not part of the
arguments!

   Simplified, the example above is just doing this:

     changequote(<<, >>)dnl
     <<[]>>
     changequote([, ])dnl

instead of simply:

     [[]]

   With macros that do not double quote their arguments (which is the
rule), double-quote the (risky) literals:

     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])

   Please note that the macro `AC_TRY_LINK' is obsolete, so you really
should be using `AC_LINK_IFELSE' instead.

   *Note Quadrigraphs::, for what to do if you run into a hopeless case
where quoting does not suffice.

   When you create a `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 `configure' script may contain unexpanded
macros.  The `autoconf' program checks for this problem by looking for
the string `AC_' in `configure'.  However, this heuristic does not work
in general: for example, it does not catch overquoting in `AC_DEFINE'
descriptions.


File: autoconf.info,  Node: Using autom4te,  Next: Programming in M4sugar,  Prev: M4 Quotation,  Up: Programming in M4

8.2 Using `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: `autom4te'(1).

   `autom4te' is a preprocessor that is like `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

   ---------- Footnotes ----------

   (1) Yet another great name from Lars J. Aas.


File: autoconf.info,  Node: autom4te Invocation,  Next: Customizing autom4te,  Up: Using autom4te

8.2.1 Invoking `autom4te'
-------------------------

The command line arguments are modeled after M4's:

     autom4te OPTIONS FILES

where the FILES are directly passed to `m4'.  By default, GNU M4 is
found during configuration, but the environment variable `M4' can be
set to tell `autom4te' where to look.  In addition to the regular
expansion, it handles the replacement of the quadrigraphs (*note
Quadrigraphs::), and of `__oline__', the current line in the output.
It supports an extended syntax for the FILES:

`FILE.m4f'
     This file is an M4 frozen file.  Note that _all the previous files
     are ignored_.  See the option `--melt' for the rationale.

`FILE?'
     If found in the library path, the FILE is included for expansion,
     otherwise it is ignored instead of triggering a failure.


   Of course, it supports the Autoconf common subset of options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

`--verbose'
`-v'
     Report processing steps.

`--debug'
`-d'
     Don't remove the temporary files and be even more verbose.

`--include=DIR'
`-I DIR'
     Also look for input files in DIR.  Multiple invocations accumulate.

`--output=FILE'
`-o FILE'
     Save output (script or trace) to FILE.  The file `-' stands for
     the standard output.


   As an extension of `m4', it includes the following options:

`--warnings=CATEGORY'
`-W CATEGORY'
     Report the warnings related to CATEGORY (which can actually be a
     comma separated list).  *Note Reporting Messages::, macro
     `AC_DIAGNOSE', for a comprehensive list of categories.  Special
     values include:

    `all'
          report all the warnings

    `none'
          report none

    `error'
          treats warnings as errors

    `no-CATEGORY'
          disable warnings falling into CATEGORY

     Warnings about `syntax' are enabled by default, and the environment
     variable `WARNINGS', a comma separated list of categories, is
     honored.  `autom4te -W CATEGORY' actually behaves as if you had
     run:

          autom4te --warnings=syntax,$WARNINGS,CATEGORY

     For example, if you want to disable defaults and `WARNINGS' of
     `autom4te', but enable the warnings about obsolete constructs, you
     would use `-W none,obsolete'.

     `autom4te' displays a back trace for errors, but not for warnings;
     if you want them, just pass `-W error'.

`--melt'
`-M'
     Do not use frozen files.  Any argument `FILE.m4f' is replaced by
     `FILE.m4'.  This helps tracing the macros which are executed only
     when the files are frozen, typically `m4_define'.  For instance,
     running:

          autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4

     is roughly equivalent to running:

          m4 1.m4 2.m4 3.m4 4.m4 input.m4

     while

          autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4

     is equivalent to:

          m4 --reload-state=4.m4f input.m4

`--freeze'
`-F'
     Produce a frozen state file.  `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 _not_ empty) and comments
     (starting with `#').  Unlike `m4''s similarly-named option, this
     option takes no argument:

          autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f

     corresponds to

          m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f

`--mode=OCTAL-MODE'
`-m OCTAL-MODE'
     Set the mode of the non-traces output to OCTAL-MODE; by default
     `0666'.


   As another additional feature over `m4', `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:
`autoheader' uses them to build `config.h.in', `autoreconf' to
determine what GNU Build System components are used, `automake' to
"parse" `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 `autom4te.cache'.
_It can safely be removed_ at any moment (especially if for some reason
`autom4te' considers it trashed).

`--cache=DIRECTORY'
`-C 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.

`--no-cache'
     Don't cache the results.

`--force'
`-f'
     If a cache is used, consider it obsolete (but update it anyway).


   Because traces are so important to the GNU Build System, `autom4te'
provides high level tracing features as compared to M4, and helps
exploiting the cache:

`--trace=MACRO[:FORMAT]'
`-t MACRO[:FORMAT]'
     Trace the invocations of MACRO according to the FORMAT.  Multiple
     `--trace' arguments can be used to list several macros.  Multiple
     `--trace' arguments for a single macro are not cumulative;
     instead, you should just make FORMAT as long as needed.

     The FORMAT is a regular string, with newlines if desired, and
     several special escape codes.  It defaults to `$f:$l:$n:$%'.  It
     can use the following special escapes:

    `$$'
          The character `$'.

    `$f'
          The file name from which MACRO is called.

    `$l'
          The line number from which MACRO is called.

    `$d'
          The depth of the MACRO call.  This is an M4 technical detail
          that you probably don't want to know about.

    `$n'
          The name of the MACRO.

    `$NUM'
          The NUMth argument of the call to MACRO.

    `$@'
    `$SEP@'
    `${SEPARATOR}@'
          All the arguments passed to MACRO, separated by the character
          SEP or the string SEPARATOR (`,' by default).  Each argument
          is quoted, i.e., enclosed in a pair of square brackets.

    `$*'
    `$SEP*'
    `${SEPARATOR}*'
          As above, but the arguments are not quoted.

    `$%'
    `$SEP%'
    `${SEPARATOR}%'
          As above, but the arguments are not quoted, all new line
          characters in the arguments are smashed, and the default
          separator is `:'.

          The escape `$%' produces single-line trace outputs (unless
          you put newlines in the `separator'), while `$@' and `$*' do
          not.

     *Note autoconf Invocation::, for examples of trace uses.

`--preselect=MACRO'
`-p MACRO'
     Cache the traces of MACRO, but do not enable traces.  This is
     especially important to save CPU cycles in the future.  For
     instance, when invoked, `autoconf' preselects all the macros that
     `autoheader', `automake', `autoreconf', etc., trace, so that
     running `m4' is not needed to trace them: the cache suffices.
     This results in a huge speed-up.


   Finally, `autom4te' introduces the concept of "Autom4te libraries".
They consists in a powerful yet extremely simple feature: sets of
combined command line arguments:

`--language=LANGUAGE'
`-l LANGUAGE'
     Use the LANGUAGE Autom4te library.  Current languages include:

    `M4sugar'
          create M4sugar output.

    `M4sh'
          create M4sh executable shell scripts.

    `Autotest'
          create Autotest executable test suites.

    `Autoconf-without-aclocal-m4'
          create Autoconf executable configure scripts without reading
          `aclocal.m4'.

    `Autoconf'
          create Autoconf executable configure scripts.  This language
          inherits all the characteristics of
          `Autoconf-without-aclocal-m4' and additionally reads
          `aclocal.m4'.

`--prepend-include=DIR'
`-B DIR'
     Prepend directory DIR to the search path.  This is used to include
     the language-specific files before any third-party macros.


   As an example, if Autoconf is installed in its default location,
`/usr/local', the command `autom4te -l m4sugar foo.m4' is strictly
equivalent to the command:

     autom4te --prepend-include /usr/local/share/autoconf \
       m4sugar/m4sugar.m4f --warnings syntax foo.m4

Recursive expansion applies here: the command `autom4te -l m4sh foo.m4'
is the same as `autom4te --language M4sugar m4sugar/m4sh.m4f foo.m4',
i.e.:

     autom4te --prepend-include /usr/local/share/autoconf \
       m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4

The definition of the languages is stored in `autom4te.cfg'.


File: autoconf.info,  Node: Customizing autom4te,  Prev: autom4te Invocation,  Up: Using autom4te

8.2.2 Customizing `autom4te'
----------------------------

One can customize `autom4te' via `~/.autom4te.cfg' (i.e., as found in
the user home directory), and `./.autom4te.cfg' (i.e., as found in the
directory from which `autom4te' is run).  The order is first reading
`autom4te.cfg', then `~/.autom4te.cfg', then `./.autom4te.cfg', and
finally the command line arguments.

   In these text files, comments are introduced with `#', and empty
lines are ignored.  Customization is performed on a per-language basis,
wrapped in between a `begin-language: "LANGUAGE"', `end-language:
"LANGUAGE"' pair.

   Customizing a language stands for appending options (*note autom4te
Invocation::) to the current definition of the language.  Options, and
more generally arguments, are introduced by `args: ARGUMENTS'.  You may
use the traditional shell syntax to quote the ARGUMENTS.

   As an example, to disable Autoconf caches (`autom4te.cache')
globally, include the following lines in `~/.autom4te.cfg':

## ------------------ ##
## User Preferences.  ##
## ------------------ ##

begin-language: "Autoconf-without-aclocal-m4"
args: --no-cache
end-language: "Autoconf-without-aclocal-m4"


File: autoconf.info,  Node: Programming in M4sugar,  Next: Debugging via autom4te,  Prev: Using autom4te,  Up: Programming in M4

8.3 Programming in 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 `^_m4_' for internal use, and
the macro namespace `^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


File: autoconf.info,  Node: Redefined M4 Macros,  Next: Diagnostic Macros,  Up: Programming in M4sugar

8.3.1 Redefined M4 Macros
-------------------------

With a few exceptions, all the M4 native macros are moved in the `m4_'
pseudo-namespace, e.g., M4sugar renames `define' as `m4_define' etc.

   The list of macros unchanged from M4, except for their name, is:
   - m4_builtin

   - m4_changecom

   - m4_changequote

   - m4_debugfile

   - m4_debugmode

   - m4_decr

   - m4_define

   - m4_divnum

   - m4_errprint

   - m4_esyscmd

   - m4_eval

   - m4_format

   - m4_ifdef

   - m4_incr

   - m4_index

   - m4_indir

   - m4_len

   - m4_pushdef

   - m4_shift

   - m4_substr

   - m4_syscmd

   - m4_sysval

   - m4_traceoff

   - m4_traceon

   - m4_translit

   Some M4 macros are redefined, and are slightly incompatible with
their native equivalent.

 -- Macro: __file__
 -- Macro: __line__
     All M4 macros starting with `__' retain their original name: for
     example, no `m4__file__' is defined.

 -- Macro: __oline__
     This is not technically a macro, but a feature of Autom4te.  The
     sequence `__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.

 -- Macro: dnl
     This macro kept its original name: no `m4_dnl' is defined.

 -- Macro: m4_bpatsubst (STRING, REGEXP, [REPLACEMENT])
     This macro corresponds to `patsubst'.  The name `m4_patsubst' is
     kept for future versions of M4sugar, once GNU M4 2.0 is released
     and supports extended regular expression syntax.

 -- Macro: m4_bregexp (STRING, REGEXP, [REPLACEMENT])
     This macro corresponds to `regexp'.  The name `m4_regexp' is kept
     for future versions of M4sugar, once GNU M4 2.0 is released and
     supports extended regular expression syntax.

 -- Macro: m4_copy (SOURCE, DEST)
 -- Macro: m4_copy_force (SOURCE, DEST)
 -- Macro: m4_rename (SOURCE, DEST)
 -- Macro: m4_rename_force (SOURCE, DEST)
     These macros aren't directly builtins, but are closely related to
     `m4_pushdef' and `m4_defn'.  `m4_copy' and `m4_rename' ensure that
     DEST is undefined, while `m4_copy_force' and `m4_rename_force'
     overwrite any existing definition.  All four macros then proceed
     to copy the entire pushdef stack of definitions of SOURCE over to
     DEST.  `m4_copy' and `m4_copy_force' preserve the source
     (including in the special case where SOURCE is undefined), while
     `m4_rename' and `m4_rename_force' undefine the original macro name
     (making it an error to rename an undefined 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 `$0' but that were not also renamed; likewise,
     other macros may have a hard-coded dependence on SOURCE and could
     break if 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.

 -- Macro: m4_defn (MACRO...)
     This macro fails if MACRO is not defined, even when using older
     versions of M4 that did not warn.  See `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.

 -- Macro: m4_divert (DIVERSION)
     M4sugar relies heavily on diversions, so rather than behaving as a
     primitive, `m4_divert' behaves like:
          m4_divert_pop()m4_divert_push([DIVERSION])
     *Note Diversion support::, for more details about the use of the
     diversion stack.  In particular, this implies that 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.

 -- Macro: m4_dumpdef (NAME...)
 -- Macro: m4_dumpdefs (NAME...)
     `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 NAME is
     undefined.  `m4_dumpdefs' is a convenience macro that calls
     `m4_dumpdef' for all of the `m4_pushdef' stack of definitions,
     starting with the current, and silently does nothing if 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 `m4_dumpdef' should only be used while
     developing m4sugar macros, and never in the final published form
     of a macro.

 -- Macro: m4_esyscmd_s (COMMAND)
     Like `m4_esyscmd', this macro expands to the result of running
     COMMAND in a shell.  The difference is that any trailing newlines
     are removed, so that the output behaves more like shell command
     substitution.

 -- Macro: m4_exit (EXIT-STATUS)
     This macro corresponds to `m4exit'.

 -- Macro: m4_if (COMMENT)
 -- Macro: m4_if (STRING-1, STRING-2, EQUAL, [NOT-EQUAL])
 -- Macro: m4_if (STRING-1, STRING-2, EQUAL-1, STRING-3, STRING-4,
          EQUAL-2, ..., [NOT-EQUAL])
     This macro corresponds to `ifelse'.  STRING-1 and STRING-2 are
     compared literally, so usually one of the two arguments is passed
     unquoted.  *Note Conditional constructs::, for more conditional
     idioms.

 -- Macro: m4_include (FILE)
 -- Macro: m4_sinclude (FILE)
     Like the M4 builtins, but warn against multiple inclusions of FILE.

 -- Macro: m4_mkstemp (TEMPLATE)
 -- Macro: m4_maketemp (TEMPLATE)
     Posix requires `maketemp' to replace the trailing `X' characters
     in TEMPLATE with the process id, without regards to the existence
     of a file by that name, but this a security hole.  When this was
     pointed out to the Posix folks, they agreed to invent a new macro
     `mkstemp' that always creates a uniquely named file, but not all
     versions of GNU M4 support the new macro.  In M4sugar,
     `m4_maketemp' and `m4_mkstemp' are synonyms for each other, and
     both have the secure semantics regardless of which macro the
     underlying M4 provides.

 -- Macro: m4_popdef (MACRO...)
     This macro fails if MACRO is not defined, even when using older
     versions of M4 that did not warn.  See `m4_undefine'.

 -- Macro: m4_undefine (MACRO...)
     This macro fails if MACRO is not defined, even when using older
     versions of M4 that did not warn.  Use

          m4_ifdef([MACRO], [m4_undefine([MACRO])])

     if you are not sure whether MACRO is defined.

 -- Macro: m4_undivert (DIVERSION...)
     Unlike the M4 builtin, at least one DIVERSION must be specified.
     Also, since the M4sugar diversion stack prefers named diversions,
     the use of `m4_undivert' to include files is risky.  *Note
     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.

 -- Macro: m4_wrap (TEXT)
 -- Macro: m4_wrap_lifo (TEXT)
     These macros correspond to `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
     `m4_wrap' to provide FIFO semantics and `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 `m4_wrap' from within wrapped
     text work just as in the builtin.


File: autoconf.info,  Node: Diagnostic Macros,  Next: Diversion support,  Prev: Redefined M4 Macros,  Up: Programming in M4sugar

8.3.2 Diagnostic messages from M4sugar
--------------------------------------

When macros statically diagnose abnormal situations, benign or fatal,
they should report them using these macros.  For issuing dynamic issues,
i.e., when `configure' is run, see *note Printing Messages::.

 -- Macro: m4_assert (EXPRESSION, [EXIT-STATUS = `1'])
     Assert that the arithmetic EXPRESSION evaluates to non-zero.
     Otherwise, issue a fatal error, and exit `autom4te' with
     EXIT-STATUS.

 -- Macro: m4_errprintn (MESSAGE)
     Similar to the builtin `m4_errprint', except that a newline is
     guaranteed after MESSAGE.

 -- Macro: m4_fatal (MESSAGE)
     Report a severe error MESSAGE prefixed with the current location,
     and have `autom4te' die.

 -- Macro: m4_location
     Useful as a prefix in a message line.  Short for:
          __file__:__line__

 -- Macro: m4_warn (CATEGORY, MESSAGE)
     Report MESSAGE as a warning (or as an error if requested by the
     user) if warnings of the 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 `AC_DEFUN' used to get
     to the current expansion.  You are encouraged to use standard
     categories, which currently include:

    `all'
          messages that don't fall into one of the following
          categories.  Use of an empty CATEGORY is equivalent.

    `cross'
          related to cross compilation issues.

    `obsolete'
          use of an obsolete construct.

    `syntax'
          dubious syntactic constructs, incorrectly ordered macro calls.


File: autoconf.info,  Node: Diversion support,  Next: Conditional constructs,  Prev: Diagnostic Macros,  Up: Programming in M4sugar

8.3.3 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 `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:

     m4_do([normal text]
     m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
     [m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
     =>normal text
     =>unwanted

Notice that the unquoted text `unwanted' is output, even though it was
processed while the current diversion was `KILL', because it was
collected as part of the argument to `m4_do'.  However, the text
`discarded' disappeared as desired, because the diversion changes were
single-quoted, and were not expanded until the top-level rescan of the
output of `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 (`m4_init', `AS_INIT', `AT_INIT', ...), although
there are some exceptions documented below.

   M4sugar defines two named diversions.
`KILL'
     Text written to this diversion is discarded.  This is the default
     diversion once M4sugar is initialized.

`GROW'
     This diversion is used behind the scenes by topological sorting
     macros, such as `AC_REQUIRE'.

   M4sh adds several more named diversions.
`BINSH'
     This diversion is reserved for the `#!' interpreter line.

`HEADER-REVISION'
     This diversion holds text from `AC_REVISION'.

`HEADER-COMMENT'
     This diversion holds comments about the purpose of a file.

`HEADER-COPYRIGHT'
     This diversion is managed by `AC_COPYRIGHT'.

`M4SH-SANITIZE'
     This diversion contains M4sh sanitization code, used to ensure
     M4sh is executing in a reasonable shell environment.

`M4SH-INIT'
     This diversion contains M4sh initialization code, initializing
     variables that are required by other M4sh macros.

`BODY'
     This diversion contains the body of the shell code, and is the
     default diversion once M4sh is initialized.

   Autotest inherits diversions from M4sh, and changes the default
diversion from `BODY' back to `KILL'.  It also adds several more named
diversions, with the following subset designed for developer use.
`PREPARE_TESTS'
     This diversion contains initialization sequences which are executed
     after `atconfig' and `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 `AT_INIT'.

   Autoconf inherits diversions from M4sh, and adds the following named
diversions which developers can utilize.
`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 `configure' that it is unsafe to expand
     any autoconf macros into this diversion.

`HELP_ENABLE'
     If `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 `--help' output of `configure' related to options
     created by `AC_ARG_WITH' and `AC_ARG_ENABLE'.

`INIT_PREPARE'
     This diversion occurs after all command line options have been
     parsed, but prior to the main body of the `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.

   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.

 -- Macro: m4_cleardivert (DIVERSION...)
     Permanently discard any text that has been diverted into DIVERSION.

 -- Macro: m4_divert_once (DIVERSION, [CONTENT])
     Similar to `m4_divert_text', except that CONTENT is only output to
     DIVERSION if this is the first time that `m4_divert_once' has been
     called with its particular arguments.

 -- Macro: m4_divert_pop ([DIVERSION])
     If provided, check that the current diversion is indeed 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 `KILL'.

 -- Macro: m4_divert_push (DIVERSION)
     Remember the former diversion on the diversion stack, and output
     subsequent text into DIVERSION.  M4sugar maintains a diversion
     stack, and issues an error if there is not a matching pop for every
     push.

 -- Macro: m4_divert_text (DIVERSION, [CONTENT])
     Output CONTENT and a newline into DIVERSION, without affecting the
     current diversion.  Shorthand for:
          m4_divert_push([DIVERSION])CONTENT
          m4_divert_pop([DIVERSION])dnl

     One use of `m4_divert_text' is to develop two related macros, where
     macro `MY_A' does the work, but adjusts what work is performed
     based on whether the optional macro `MY_B' has also been expanded.
     Of course, it is possible to use `AC_BEFORE' within `MY_A' to
     require that `MY_B' occurs first, if it occurs at all.  But this
     imposes an ordering restriction on the user; it would be nicer if
     macros `MY_A' and `MY_B' can be invoked in either order.  The trick
     is to let `MY_B' leave a breadcrumb in an early diversion, which
     `MY_A' can then use to determine whether `MY_B' has been expanded.

          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])])


 -- Macro: m4_init
     Initialize the M4sugar environment, setting up the default named
     diversion to be `KILL'.


File: autoconf.info,  Node: Conditional constructs,  Next: Looping constructs,  Prev: Diversion support,  Up: Programming in M4sugar

8.3.4 Conditional constructs
----------------------------

The following macros provide additional conditional constructs as
convenience wrappers around `m4_if'.

 -- Macro: m4_bmatch (STRING, REGEX-1, VALUE-1, [REGEX-2], [VALUE-2],
          ..., [DEFAULT])
     The string STRING is repeatedly compared against a series of REGEX
     arguments; if a match is found, the expansion is the corresponding
     VALUE, otherwise, the macro moves on to the next REGEX.  If no
     REGEX match, then the result is the optional DEFAULT, or nothing.

 -- Macro: m4_bpatsubsts (STRING, REGEX-1, SUBST-1, [REGEX-2],
          [SUBST-2], ...)
     The string STRING is altered by REGEX-1 and SUBST-1, as if by:
          m4_bpatsubst([[STRING]], [REGEX], [SUBST])

     The result of the substitution is then passed through the next set
     of REGEX and SUBST, and so forth.  An empty SUBST implies deletion
     of any matched portions in the current string.  Note that this
     macro over-quotes 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 (`^' and `$' in the REGEX
     will line up with the extra quotations, and not the characters of
     the original string.  The overquoting is removed after the final
     substitution.

 -- Macro: m4_case (STRING, VALUE-1, IF-VALUE-1, [VALUE-2],
          [IF-VALUE-2], ..., [DEFAULT])
     Test STRING against multiple VALUE possibilities, resulting in the
     first IF-VALUE for a match, or in the optional DEFAULT.  This is
     shorthand for:
          m4_if([STRING], [VALUE-1], [IF-VALUE-1],
                [STRING], [VALUE-2], [IF-VALUE-2], ...,
                [DEFAULT])

 -- Macro: m4_cond (TEST-1, VALUE-1, IF-VALUE-1, [TEST-2], [VALUE-2],
          [IF-VALUE-2], ..., [DEFAULT])
     This macro was introduced in Autoconf 2.62.  Similar to `m4_if',
     except that each TEST is expanded only when it is encountered.
     This is useful for short-circuiting expensive tests; while `m4_if'
     requires all its strings to be expanded up front before doing
     comparisons, `m4_cond' only expands a TEST when all earlier tests
     have failed.

     For an example, these two sequences give the same result, but in
     the case where `$1' does not contain a backslash, the `m4_cond'
     version only expands `m4_index' once, instead of five times, for
     faster computation if this is a common case for `$1'.  Notice that
     every third argument is unquoted for `m4_if', and quoted for
     `m4_cond':

          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])

 -- Macro: m4_default (EXPR-1, EXPR-2)
 -- Macro: m4_default_quoted (EXPR-1, EXPR-2)
 -- Macro: m4_default_nblank (EXPR-1, [EXPR-2])
 -- Macro: m4_default_nblank_quoted (EXPR-1, [EXPR-2])
     If EXPR-1 contains text, use it.  Otherwise, select EXPR-2.
     `m4_default' expands the result, while `m4_default_quoted' does
     not.  Useful for providing a fixed default if the expression that
     results in EXPR-1 would otherwise be empty.  The difference
     between `m4_default' and `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.

          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])
          =>ACTIVE
          demo1([], [active])
          =>ACTIVE
          demo1([empty], [text])
          =>
          -demo1([ ], [active])-
          =>- -
          demo2([active], [default])
          =>active
          demo2([], [active])
          =>active
          demo2([empty], [text])
          =>empty
          -demo2([ ], [active])-
          =>- -
          demo3([active], [default])
          =>ACTIVE
          demo3([], [active])
          =>ACTIVE
          demo3([empty], [text])
          =>
          -demo3([ ], [active])-
          =>-ACTIVE-
          demo4([active], [default])
          =>active
          demo4([], [active])
          =>active
          demo4([empty], [text])
          =>empty
          -demo4([ ], [active])-
          =>-active-

 -- Macro: m4_define_default (MACRO, [DEFAULT-DEFINITION])
     If MACRO does not already have a definition, then define it to
     DEFAULT-DEFINITION.

 -- Macro: m4_ifblank (COND, [IF-BLANK], [IF-TEXT])
 -- Macro: m4_ifnblank (COND, [IF-TEXT], [IF-BLANK])
     If COND is empty or consists only of blanks (space, tab, newline),
     then expand IF-BLANK; otherwise, expand 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:
          m4_ifval(m4_normalize([COND]), IF-TEXT, IF-BLANK)

 -- Macro: m4_ifndef (MACRO, IF-NOT-DEFINED, [IF-DEFINED])
     This is shorthand for:
          m4_ifdef([MACRO], [IF-DEFINED], [IF-NOT-DEFINED])

 -- Macro: m4_ifset (MACRO, [IF-TRUE], [IF-FALSE])
     If MACRO is undefined, or is defined as the empty string, expand
     to IF-FALSE.  Otherwise, expands to IF-TRUE.  Similar to:
          m4_ifval(m4_defn([MACRO]), [IF-TRUE], [IF-FALSE])
     except that it is not an error if MACRO is undefined.

 -- Macro: m4_ifval (COND, [IF-TRUE], [IF-FALSE])
     Expands to IF-TRUE if COND is not empty, otherwise to IF-FALSE.
     This is shorthand for:
          m4_if([COND], [], [IF-FALSE], [IF-TRUE])

 -- Macro: m4_ifvaln (COND, [IF-TRUE], [IF-FALSE])
     Similar to `m4_ifval', except guarantee that a newline is present
     after any non-empty expansion.  Often followed by `dnl'.

 -- Macro: m4_n (TEXT)
     Expand to TEXT, and add a newline if TEXT is not empty.  Often
     followed by `dnl'.


File: autoconf.info,  Node: Looping constructs,  Next: Evaluation Macros,  Prev: Conditional constructs,  Up: Programming in M4sugar

8.3.5 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
`m4_foreach_w' is whitespace-separated.  For example, the list `[[a],
[b,c]]' contains two elements: `[a]' and `[b,c]'.  It is common to see
lists with unquoted elements when those elements are not likely to be
macro names, as in `[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,

     m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
     error-->hi
     =>123
     m4_define([list], [[1], [2], [3]])
     =>
     m4_foreach([i], [list], [i])
     =>123

 -- Macro: m4_argn (N, [ARG]...)
     Extracts argument N (larger than 0) from the remaining arguments.
     If there are too few arguments, the empty string is used.  For any
     N besides 1, this is more efficient than the similar
     `m4_car(m4_shiftn([N], [], [ARG...]))'.

 -- Macro: m4_car (ARG...)
     Expands to the quoted first ARG.  Can be used with `m4_cdr' to
     recursively iterate through a list.  Generally, when using quoted
     lists of quoted elements, `m4_car' should be called without any
     extra quotes.

 -- Macro: m4_cdr (ARG...)
     Expands to a quoted list of all but the first ARG, or the empty
     string if there was only one argument.  Generally, when using
     quoted lists of quoted elements, `m4_cdr' should be called without
     any extra quotes.

     For example, this is a simple implementation of `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 `m4_map_sep', and also to avoid expanding side effects in
     `$2' twice).
          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]]])
          => 1 2 a

 -- Macro: m4_for (VAR, FIRST, LAST, [STEP], EXPRESSION)
     Loop over the numeric values between FIRST and LAST including
     bounds by increments of STEP.  For each iteration, expand
     EXPRESSION with the numeric value assigned to VAR.  If STEP is
     omitted, it defaults to `1' or `-1' depending on the order of the
     limits.  If given, STEP has to match this order.  The number of
     iterations is determined independently from definition of VAR;
     iteration cannot be short-circuited or lengthened by modifying VAR
     from within EXPRESSION.

 -- Macro: m4_foreach (VAR, LIST, EXPRESSION)
     Loop over the comma-separated M4 list LIST, assigning each value
     to VAR, and expand EXPRESSION.  The following example outputs two
     lines:

          m4_foreach([myvar], [[foo], [bar, baz]],
                     [echo myvar
          ])dnl
          =>echo foo
          =>echo bar, baz

     Note that for some forms of EXPRESSION, it may be faster to use
     `m4_map_args'.

 -- Macro: m4_foreach_w (VAR, LIST, EXPRESSION)
     Loop over the white-space-separated list LIST, assigning each value
     to VAR, and expand EXPRESSION.  If VAR is only referenced once in
     EXPRESSION, it is more efficient to use `m4_map_args_w'.

     The deprecated macro `AC_FOREACH' is an alias of `m4_foreach_w'.

 -- Macro: m4_map (MACRO, LIST)
 -- Macro: m4_mapall (MACRO, LIST)
 -- Macro: m4_map_sep (MACRO, SEPARATOR, LIST)
 -- Macro: m4_mapall_sep (MACRO, SEPARATOR, LIST)
     Loop over the comma separated quoted list of argument descriptions
     in LIST, and invoke MACRO with the arguments.  An argument
     description is in turn a comma-separated quoted list of quoted
     elements, suitable for `m4_apply'.  The macros `m4_map' and
     `m4_map_sep' ignore empty argument descriptions, while `m4_mapall'
     and `m4_mapall_sep' invoke MACRO with no arguments.  The macros
     `m4_map_sep' and `m4_mapall_sep' additionally expand SEPARATOR
     between invocations of MACRO.

     Note that SEPARATOR is expanded, unlike in `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
     SEPARATOR, or as a single string, by using a double-quoted comma.

          m4_map([m4_count], [])
          =>
          m4_map([ m4_count], [[],
                               [[1]],
                               [[1], [2]]])
          => 1 2
          m4_mapall([ m4_count], [[],
                                  [[1]],
                                  [[1], [2]]])
          => 0 1 2
          m4_map_sep([m4_eval], [,], [[[1+2]],
                                      [[10], [16]]])
          =>3,a
          m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
          =>a,b
          m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
          =>2
          m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
          =>a,b
          m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
          =>1

 -- Macro: m4_map_args (MACRO, ARG...)
     Repeatedly invoke MACRO with each successive ARG as its only
     argument.  In the following example, three solutions are presented
     with the same expansion; the solution using `m4_map_args' is the
     most efficient.
          m4_define([active], [ACTIVE])dnl
          m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
          => plain active
          m4_map([ m4_echo], [[[plain]], [[active]]])
          => plain active
          m4_map_args([ m4_echo], [plain], [active])
          => plain active

     In cases where it is useful to operate on additional parameters
     besides the list elements, the macro `m4_curry' can be used in
     MACRO to supply the argument currying necessary to generate the
     desired argument list.  In the following example, `list_add_n' is
     more efficient than `list_add_x'.  On the other hand, using
     `m4_map_args_sep' can be even more efficient.

          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)
          =>2,3,4
          list_add_n([2], list)
          =>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)
          =>2,3,4

 -- Macro: m4_map_args_pair (MACRO, [MACRO-END = `macro'], ARG...)
     For every pair of arguments ARG, invoke MACRO with two arguments.
     If there is an odd number of arguments, invoke MACRO-END, which
     defaults to MACRO, with the remaining argument.

          m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
          =>, 2, 1, 3
          m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
          =>, 2, 1, [3]
          m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
          =>, 2, 1, 4, 3

 -- Macro: m4_map_args_sep ([PRE], [POST], [SEP], ARG...)
     Expand the sequence `PRE[ARG]POST' for each argument, additionally
     expanding SEP between arguments.  One common use of this macro is
     constructing a macro call, where the opening and closing
     parentheses are split between PRE and POST; in particular,
     `m4_map_args([MACRO], [ARG])' is equivalent to
     `m4_map_args_sep([MACRO(], [)], [], [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 ARG.

 -- Macro: m4_map_args_w (STRING, [PRE], [POST], [SEP])
     Expand the sequence `PRE[word]POST' for each word in the
     whitespace-separated STRING, additionally expanding SEP between
     words.  This macro provides the most efficient means for iterating
     over a whitespace-separated string.  In particular,
     `m4_map_args_w([STRING], [ACTION(], [)])' is more efficient than
     `m4_foreach_w([var], [STRING], [ACTION(m4_defn([var]))])'.

 -- Macro: m4_shiftn (COUNT, ...)
 -- Macro: m4_shift2 (...)
 -- Macro: m4_shift3 (...)
     `m4_shiftn' performs COUNT iterations of `m4_shift', along with
     validation that enough arguments were passed in to match the shift
     count, and that the count is positive.  `m4_shift2' and
     `m4_shift3' are specializations of `m4_shiftn', introduced in
     Autoconf 2.62, and are more efficient for two and three shifts,
     respectively.

 -- Macro: m4_stack_foreach (MACRO, ACTION)
 -- Macro: m4_stack_foreach_lifo (MACRO, ACTION)
     For each of the `m4_pushdef' definitions of MACRO, expand ACTION
     with the single argument of a definition of MACRO.
     `m4_stack_foreach' starts with the oldest definition, while
     `m4_stack_foreach_lifo' starts with the current definition.
     ACTION should not push or pop definitions of MACRO, nor is there
     any guarantee that the current definition of MACRO matches the
     argument that was passed to ACTION.  The macro `m4_curry' can be
     used if ACTION needs more than one argument, although in that case
     it is more efficient to use M4_STACK_FOREACH_SEP.

     Due to technical limitations, there are a few low-level m4sugar
     functions, such as `m4_pushdef', that cannot be used as the MACRO
     argument.

          m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
          m4_stack_foreach([a], [ m4_incr])
          => 2 3
          m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
          => cd bcd

 -- Macro: m4_stack_foreach_sep (MACRO, [PRE], [POST], [SEP])
 -- Macro: m4_stack_foreach_sep_lifo (MACRO, [PRE], [POST], [SEP])
     Expand the sequence `PRE[definition]POST' for each `m4_pushdef'
     definition of MACRO, additionally expanding SEP between
     definitions.  `m4_stack_foreach_sep' visits the oldest definition
     first, while `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,
     `m4_stack_foreach([MACRO], [ACTION])' is short for
     `m4_stack_foreach_sep([MACRO], [ACTION(], [)])'.


File: autoconf.info,  Node: Evaluation Macros,  Next: Text processing Macros,  Prev: Looping constructs,  Up: Programming in M4sugar

8.3.6 Evaluation Macros
-----------------------

The following macros give some control over the order of the evaluation
by adding or removing levels of quotes.

 -- Macro: m4_apply (MACRO, LIST)
     Apply the elements of the quoted, comma-separated LIST as the
     arguments to MACRO.  If LIST is empty, invoke MACRO without
     arguments.  Note the difference between `m4_indir', which expects
     its first argument to be a macro name but can use names that are
     otherwise invalid, and `m4_apply', where MACRO can contain other
     text, but must end in a valid macro name.
          m4_apply([m4_count], [])
          =>0
          m4_apply([m4_count], [[]])
          =>1
          m4_apply([m4_count], [[1], [2]])
          =>2
          m4_apply([m4_join], [[|], [1], [2]])
          =>1|2

 -- Macro: m4_count (ARG, ...)
     This macro returns the decimal count of the number of arguments it
     was passed.

 -- Macro: m4_curry (MACRO, ARG...)
     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 ARG list, and then MACRO is
     expanded with the resulting argument list.

          m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
          =>3, 2, 1

     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 `m4_curry'; the empty string is used instead of the
     builtin token.  This behavior is rectified by using M4 1.6 or
     newer.

 -- Macro: m4_do (ARG, ...)
     This macro loops over its arguments and expands each ARG in
     sequence.  Its main use is for readability; it allows the use of
     indentation and fewer `dnl' to result in the same expansion.  This
     macro guarantees that no expansion will be concatenated with
     subsequent text; to achieve full concatenation, use
     `m4_unquote(m4_join([], ARG...))'.

          m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
          m4_do([a],[b])c
          =>abc
          m4_unquote(m4_join([],[a],[b]))c
          =>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
          =>ABC
          m4_unquote(m4_join([],[a],[b]))c
          =>3

 -- Macro: m4_dquote (ARG, ...)
     Return the arguments as a quoted list of quoted arguments.
     Conveniently, if there is just one ARG, this effectively adds a
     level of quoting.

 -- Macro: m4_dquote_elt (ARG, ...)
     Return the arguments as a series of double-quoted arguments.
     Whereas `m4_dquote' returns a single argument, `m4_dquote_elt'
     returns as many arguments as it was passed.

 -- Macro: m4_echo (ARG, ...)
     Return the arguments, with the same level of quoting.  Other than
     discarding whitespace after unquoted commas, this macro is a no-op.

 -- Macro: m4_expand (ARG)
     Return the expansion of ARG as a quoted string.  Whereas
     `m4_quote' is designed to collect expanded text into a single
     argument, `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 ARG.  Any time multiple
     arguments are collected into one with `m4_quote', the M4 argument
     collection rules discard the whitespace.  However, with
     `m4_expand', whitespace is preserved, even after the expansion of
     macros contained in ARG.  Additionally, `m4_expand' is able to
     expand text that would involve an unterminated comment, whereas
     expanding that same text as the argument to `m4_quote' runs into
     difficulty in finding the end of the argument.  Since manipulating
     diversions during argument collection is inherently unsafe,
     `m4_expand' issues an error if ARG attempts to change the current
     diversion (*note Diversion support::).

          m4_define([active], [ACT, IVE])dnl
          m4_define([active2], [[ACT, IVE]])dnl
          m4_quote(active, active)
          =>ACT,IVE,ACT,IVE
          m4_expand([active, active])
          =>ACT, IVE, ACT, IVE
          m4_quote(active2, active2)
          =>ACT, IVE,ACT, IVE
          m4_expand([active2, active2])
          =>ACT, IVE, ACT, IVE
          m4_expand([# m4_echo])
          =># m4_echo
          m4_quote(# m4_echo)
          )
          =># m4_echo)
          =>

     Note that `m4_expand' cannot handle an 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.

          m4_define([pattern], [[!@<:@]])dnl
          m4_define([bar], [BAR])dnl
          m4_expand([case $foo in
            m4_defn([pattern])@:}@ bar ;;
            *[)] blah ;;
          esac])
          =>case $foo in
          =>  [![]) BAR ;;
          =>  *) blah ;;
          =>esac

 -- Macro: m4_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.
          dnl foo outputs a message only if [debug] is defined.
          m4_define([foo],
          [m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])

     Note that for earlier versions of Autoconf, the macro `__gnu__' can
     serve the same purpose, although it is less readable.

 -- Macro: m4_make_list (ARG, ...)
     This macro exists to aid debugging of M4sugar algorithms.  Its net
     effect is similar to `m4_dquote'--it produces a quoted list of
     quoted arguments, for each 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 `m4_dquote'.
          m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
          m4_dquote(zero, [one], [[two]])
          =>[0],[one],[[two]]
          m4_make_list(zero, [one], [[two]])
          =>[0],
          =>[one],
          =>[[two]]
          m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
          => 0 1 two
          m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
          => 0 1 two

 -- Macro: m4_quote (ARG, ...)
     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.

 -- Macro: m4_reverse (ARG, ...)
     Outputs each argument with the same level of quoting, but in
     reverse order, and with space following each comma for readability.

          m4_define([active], [ACT,IVE])
          =>
          m4_reverse(active, [active])
          =>active, IVE, ACT

 -- Macro: m4_unquote (ARG, ...)
     This macro was introduced in Autoconf 2.62.  Expand each argument,
     separated by commas.  For a single ARG, this effectively removes a
     layer of quoting, and `m4_unquote([ARG])' is more efficient than
     the equivalent `m4_do([ARG])'.  For multiple arguments, this
     results in an unquoted list of expansions.  This is commonly used
     with `m4_split', in order to convert a single quoted list into a
     series of quoted elements.

   The following example aims at emphasizing the difference between
several scenarios: not using these macros, using `m4_defn', using
`m4_quote', using `m4_dquote', and using `m4_expand'.

     $ 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]))
     $ 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


File: autoconf.info,  Node: Text processing Macros,  Next: Number processing Macros,  Prev: Evaluation Macros,  Up: Programming in M4sugar

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

 -- Macro: m4_append (MACRO-NAME, STRING, [SEPARATOR])
 -- Macro: m4_append_uniq (MACRO-NAME, STRING, [SEPARATOR] [IF-UNIQ],
          [IF-DUPLICATE])
     Redefine MACRO-NAME to its former contents with SEPARATOR and
     STRING added at the end.  If MACRO-NAME was undefined before (but
     not if it was defined but empty), then no SEPARATOR is added.  As
     of Autoconf 2.62, neither STRING nor SEPARATOR are expanded during
     this macro; instead, they are expanded when MACRO-NAME is invoked.

     `m4_append' can be used to grow strings, and `m4_append_uniq' to
     grow strings without duplicating substrings.  Additionally,
     `m4_append_uniq' takes two optional parameters as of Autoconf 2.62;
     IF-UNIQ is expanded if STRING was appended, and IF-DUPLICATE is
     expanded if STRING was already present.  Also, `m4_append_uniq'
     warns if SEPARATOR is not empty, but occurs within STRING, since
     that can lead to duplicates.

     Note that `m4_append' can scale linearly in the length of the final
     string, depending on the quality of the underlying M4
     implementation, while `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 `m4_set_add' instead (*note Set
     manipulation Macros::).

          m4_define([active], [ACTIVE])dnl
          m4_append([sentence], [This is an])dnl
          m4_append([sentence], [ active ])dnl
          m4_append([sentence], [symbol.])dnl
          sentence
          =>This is an ACTIVE symbol.
          m4_undefine([active])dnl
          =>This is an active symbol.
          m4_append_uniq([list], [one], [, ], [new], [existing])
          =>new
          m4_append_uniq([list], [one], [, ], [new], [existing])
          =>existing
          m4_append_uniq([list], [two], [, ], [new], [existing])
          =>new
          m4_append_uniq([list], [three], [, ], [new], [existing])
          =>new
          m4_append_uniq([list], [two], [, ], [new], [existing])
          =>existing
          list
          =>one, two, three
          m4_dquote(list)
          =>[one],[two],[three]
          m4_append([list2], [one], [[, ]])dnl
          m4_append_uniq([list2], [two], [[, ]])dnl
          m4_append([list2], [three], [[, ]])dnl
          list2
          =>one, two, three
          m4_dquote(list2)
          =>[one, two, three]

 -- Macro: m4_append_uniq_w (MACRO-NAME, STRINGS)
     This macro was introduced in Autoconf 2.62.  It is similar to
     `m4_append_uniq', but treats STRINGS as a whitespace separated
     list of words to append, and only appends unique words.
     MACRO-NAME is updated with a single space between new words.
          m4_append_uniq_w([numbers], [1 1 2])dnl
          m4_append_uniq_w([numbers], [ 2 3 ])dnl
          numbers
          =>1 2 3

 -- Macro: m4_chomp (STRING)
 -- Macro: m4_chomp_all (STRING)
     Output STRING in quotes, but without a trailing newline.  The
     macro `m4_chomp' is slightly faster, and removes at most one
     newline; the macro `m4_chomp_all' removes all consecutive trailing
     newlines.  Unlike `m4_flatten', embedded newlines are left intact,
     and backslash does not influence the result.

 -- Macro: m4_combine ([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX-1,
          [SUFFIX-2], ...)
     This macro produces a quoted string containing the pairwise
     combination of every element of the quoted, comma-separated
     PREFIX-LIST, and every element from the SUFFIX arguments.  Each
     pairwise combination is joined with INFIX in the middle, and
     successive pairs are joined by SEPARATOR.  No expansion occurs on
     any of the arguments.  No output occurs if either the PREFIX or
     SUFFIX list is empty, but the lists can contain empty elements.
          m4_define([a], [oops])dnl
          m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
          =>a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
          m4_combine([, ], [[a], [b]], [-])
          =>
          m4_combine([, ], [[a], [b]], [-], [])
          =>a-, b-
          m4_combine([, ], [], [-], [1], [2])
          =>
          m4_combine([, ], [[]], [-], [1], [2])
          =>-1, -2

 -- Macro: m4_escape (STRING)
     Convert all instances of `[', `]', `#', and `$' within STRING into
     their respective quadrigraphs.  The result is still a quoted
     string.

 -- Macro: m4_flatten (STRING)
     Flatten 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.

 -- Macro: m4_join ([SEPARATOR], ARGS...)
 -- Macro: m4_joinall ([SEPARATOR], ARGS...)
     Concatenate each ARG, separated by SEPARATOR.  `joinall' uses
     every argument, while `join' omits empty arguments so that there
     are no back-to-back separators in the output.  The result is a
     quoted string.
          m4_define([active], [ACTIVE])dnl
          m4_join([|], [one], [], [active], [two])
          =>one|active|two
          m4_joinall([|], [one], [], [active], [two])
          =>one||active|two

     Note that if all you intend to do is join ARGS with commas between
     them, to form a quoted list suitable for `m4_foreach', it is more
     efficient to use `m4_dquote'.

 -- Macro: m4_newline ([TEXT])
     This macro was introduced in Autoconf 2.62, and expands to a
     newline, followed by any TEXT.  It is primarily useful for
     maintaining macro formatting, and ensuring that M4 does not
     discard leading whitespace during argument collection.

 -- Macro: m4_normalize (STRING)
     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
     `m4_flatten' and `m4_strip'.  To determine if STRING consists only
     of bytes that would be removed by `m4_normalize', you can use
     `m4_ifblank'.

 -- Macro: m4_re_escape (STRING)
     Backslash-escape all characters in STRING that are active in
     regexps.

 -- Macro: m4_split (STRING, [REGEXP = `[\t ]+'])
     Split STRING into an M4 list of elements quoted by `[' and `]',
     while keeping white space at the beginning and at the end.  If
     REGEXP is given, use it instead of `[\t ]+' for splitting.  If
     STRING is empty, the result is an empty list.

 -- Macro: m4_strip (STRING)
     Strip whitespace from 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 `m4_flatten', or do it all at once with
     `m4_normalize'.  To quickly test if STRING has only whitespace,
     use `m4_ifblank'.

 -- Macro: m4_text_box (MESSAGE, [FRAME = `-'])
     Add a text box around MESSAGE, using FRAME as the border character
     above and below the message.  The FRAME argument must be a single
     byte, and does not support quadrigraphs.  The frame correctly
     accounts for the subsequent expansion of MESSAGE.  For example:
          m4_define([macro], [abc])dnl
          m4_text_box([macro])
          =>## --- ##
          =>## abc ##
          =>## --- ##

     The MESSAGE must contain balanced quotes and parentheses, although
     quadrigraphs can be used to work around this.

 -- Macro: m4_text_wrap (STRING, [PREFIX], [PREFIX1 = `PREFIX'], [WIDTH
          = `79'])
     Break STRING into a series of whitespace-separated words, then
     output those words separated by spaces, and wrapping lines any
     time the output would exceed WIDTH columns.  If given, PREFIX1
     begins the first line, and PREFIX begins all wrapped lines.  If
     PREFIX1 is longer than PREFIX, then the first line consists of
     just PREFIX1.  If PREFIX is longer than PREFIX1, padding is
     inserted so that the first word of 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 PREFIX, PREFIX1, or
     the words of STRING, although quadrigraphs are recognized.

     For some examples:
          m4_text_wrap([Short string */], [   ], [/* ], [20])
          =>/* Short string */
          m4_text_wrap([Much longer string */], [   ], [/* ], [20])
          =>/* Much longer
          =>   string */
          m4_text_wrap([Short doc.], [          ], [  --short ], [30])
          =>  --short Short doc.
          m4_text_wrap([Short doc.], [          ], [  --too-wide ], [30])
          =>  --too-wide
          =>          Short doc.
          m4_text_wrap([Super long documentation.], [     ],
                       [  --too-wide ], 30)
          =>  --too-wide
          =>     Super long
          =>     documentation.

 -- Macro: m4_tolower (STRING)
 -- Macro: m4_toupper (STRING)
     Return STRING with letters converted to upper or lower case,
     respectively.


File: autoconf.info,  Node: Number processing Macros,  Next: Set manipulation Macros,  Prev: Text processing Macros,  Up: Programming in M4sugar

8.3.8 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 `m4_eval'.

 -- Macro: m4_cmp (EXPR-1, EXPR-2)
     Compare the arithmetic expressions EXPR-1 and EXPR-2, and expand
     to `-1' if EXPR-1 is smaller, `0' if they are equal, and `1' if
     EXPR-1 is larger.

 -- Macro: m4_list_cmp (LIST-1, LIST-2)
     Compare the two M4 lists consisting of comma-separated arithmetic
     expressions, left to right.  Expand to `-1' for the first element
     pairing where the value from LIST-1 is smaller, `1' where the
     value from LIST-2 is smaller, or `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.
          m4_list_cmp([1, 0],       [1])
          =>0
          m4_list_cmp([1, [1 * 0]], [1, 0])
          =>0
          m4_list_cmp([1, 2],       [1, 0])
          =>1
          m4_list_cmp([1, [1+1], 3],[1, 2])
          =>1
          m4_list_cmp([1, 2, -3],   [1, 2])
          =>-1
          m4_list_cmp([1, 0],       [1, 2])
          =>-1
          m4_list_cmp([1],          [1, 2])
          =>-1

 -- Macro: m4_max (ARG, ...)
     This macro was introduced in Autoconf 2.62.  Expand to the decimal
     value of the maximum arithmetic expression among all the arguments.

 -- Macro: m4_min (ARG, ...)
     This macro was introduced in Autoconf 2.62.  Expand to the decimal
     value of the minimum arithmetic expression among all the arguments.

 -- Macro: m4_sign (EXPR)
     Expand to `-1' if the arithmetic expression EXPR is negative, `1'
     if it is positive, and `0' if it is zero.

 -- Macro: m4_version_compare (VERSION-1, VERSION-2)
     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 VERSION-1 and VERSION-2, and expand to
     `-1' if VERSION-1 is smaller, `0' if they are the same, or `1'
     VERSION-2 is smaller.  Version strings must be a list of elements
     separated by `.', `,' or `-', 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 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
     `2.61a-248-dc51', or 248 commits after the 2.61a release, with an
     abbreviated commit identification of `dc51'.

          m4_version_compare([1.1], [2.0])
          =>-1
          m4_version_compare([2.0b], [2.0a])
          =>1
          m4_version_compare([1.1.1], [1.1.1a])
          =>-1
          m4_version_compare([1.2], [1.1.1a])
          =>1
          m4_version_compare([1.0], [1])
          =>0
          m4_version_compare([1.1pre], [1.1PRE])
          =>0
          m4_version_compare([1.1a], [1,10])
          =>-1
          m4_version_compare([2.61a], [2.61a-248-dc51])
          =>-1
          m4_version_compare([2.61b], [2.61a-248-dc51])
          =>1

 -- Macro: m4_version_prereq (VERSION, [IF-NEW-ENOUGH], [IF-OLD =
          `m4_fatal'])
     Compares VERSION against the version of Autoconf currently
     running.  If the running version is at VERSION or newer, expand
     IF-NEW-ENOUGH, but if VERSION is larger than the version currently
     executing, expand IF-OLD, which defaults to printing an error
     message and exiting m4sugar with status 63.  When given only one
     argument, this behaves like `AC_PREREQ' (*note Versioning::).
     Remember that the autoconf philosophy favors feature checks over
     version checks.


File: autoconf.info,  Node: Set manipulation Macros,  Next: Forbidden Patterns,  Prev: Number processing Macros,  Up: Programming in M4sugar

8.3.9 Set manipulation in M4
----------------------------

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

 -- Macro: m4_set_add (SET, VALUE, [IF-UNIQ], [IF-DUP])
     Adds the string VALUE as a member of set SET.  Expand IF-UNIQ if
     the element was added, or IF-DUP if it was previously in the set.
     Operates in amortized constant time, so that set creation scales
     linearly.

 -- Macro: m4_set_add_all (SET, VALUE...)
     Adds each VALUE to the set SET.  This is slightly more efficient
     than repeatedly invoking `m4_set_add'.

 -- Macro: m4_set_contains (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
     Expands IF-PRESENT if the string VALUE is a member of SET,
     otherwise IF-ABSENT.

          m4_set_contains([a], [1], [yes], [no])
          =>no
          m4_set_add([a], [1], [added], [dup])
          =>added
          m4_set_add([a], [1], [added], [dup])
          =>dup
          m4_set_contains([a], [1], [yes], [no])
          =>yes
          m4_set_remove([a], [1], [removed], [missing])
          =>removed
          m4_set_contains([a], [1], [yes], [no])
          =>no
          m4_set_remove([a], [1], [removed], [missing])
          =>missing

 -- Macro: m4_set_contents (SET, [SEP])
 -- Macro: m4_set_dump (SET, [SEP])
     Expands to a single string consisting of all the members of the set
     SET, each separated by SEP, which is not expanded.
     `m4_set_contents' leaves the elements in SET but reclaims any
     memory occupied by removed elements, while `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 SEP as a
     substring; use `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 `m4_set_dump' results from using a different output order
     than `m4_set_contents'.  These macros scale linearly in the size
     of the set before memory pruning, and `m4_set_contents([SET],
     [SEP])' is faster than `m4_joinall([SEP]m4_set_listc([SET]))'.

          m4_set_add_all([a], [1], [2], [3])
          =>
          m4_set_contents([a], [-])
          =>1-2-3
          m4_joinall([-]m4_set_listc([a]))
          =>1-2-3
          m4_set_dump([a], [-])
          =>3-2-1
          m4_set_contents([a])
          =>
          m4_set_add([a], [])
          =>
          m4_set_contents([a], [-])
          =>

 -- Macro: m4_set_delete (SET)
     Delete all elements and memory associated with SET.  This is
     linear in the set size, and faster than removing one element at a
     time.

 -- Macro: m4_set_difference (SETA, SETB)
 -- Macro: m4_set_intersection (SETA, SETB)
 -- Macro: m4_set_union (SETA, SETB)
     Compute the relation between SETA and SETB, and output the result
     as a list of quoted arguments without duplicates and with a
     leading comma.  Set difference selects the elements in SETA but
     not 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.

          m4_set_add_all([a], [1], [2], [3])
          =>
          m4_set_add_all([b], [3], [], [4])
          =>
          m4_set_difference([a], [b])
          =>,1,2
          m4_set_difference([b], [a])
          =>,,4
          m4_set_intersection([a], [b])
          =>,3
          m4_set_union([a], [b])
          =>,1,2,3,,4

 -- Macro: m4_set_empty (SET, [IF-EMPTY], [IF-ELEMENTS])
     Expand IF-EMPTY if the set SET has no elements, otherwise expand
     IF-ELEMENTS.  This macro operates in constant time.  Using this
     macro can help disambiguate output from `m4_set_contents' or
     `m4_set_list'.

 -- Macro: m4_set_foreach (SET, VARIABLE, ACTION)
     For each element in the set SET, expand ACTION with the macro
     VARIABLE defined as the set element.  Behavior is unspecified if
     ACTION recursively lists the contents of SET (although listing
     other sets is acceptable), or if it modifies the set in any way
     other than removing the element currently contained in VARIABLE.
     This macro is faster than the corresponding `m4_foreach([VARIABLE],
     m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])', although
     `m4_set_map' might be faster still.

          m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
          =>
          m4_set_contents([a])
          =>12345
          m4_set_foreach([a], [i],
            [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
          =>24
          m4_set_contents([a])
          =>135

 -- Macro: m4_set_list (SET)
 -- Macro: m4_set_listc (SET)
     Produce a list of arguments, where each argument is a quoted
     element from the set SET.  The variant `m4_set_listc' is
     unambiguous, by adding a leading comma if there are any set
     elements, whereas the variant `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 `m4_join' or `m4_set_add_all', or wrapped by `m4_dquote'
     for macros that take a quoted list, such as `m4_map' or
     `m4_foreach'.  Any memory occupied by removed elements is
     reclaimed during these macros.

          m4_set_add_all([a], [1], [2], [3])
          =>
          m4_set_list([a])
          =>1,2,3
          m4_set_list([b])
          =>
          m4_set_listc([b])
          =>
          m4_count(m4_set_list([b]))
          =>1
          m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
          =>0
          m4_set_add([b], [])
          =>
          m4_set_list([b])
          =>
          m4_set_listc([b])
          =>,
          m4_count(m4_set_list([b]))
          =>1
          m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
          =>1

 -- Macro: m4_set_map (SET, ACTION)
     For each element in the set SET, expand ACTION with a single
     argument of the set element.  Behavior is unspecified if ACTION
     recursively lists the contents of 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
     `m4_map_args([ACTION]m4_set_listc([SET]))' or
     `m4_set_foreach([SET], [var], [ACTION(m4_defn([var]))])'.  It is
     possible to use `m4_curry' if more than one argument is needed for
     ACTION, although it is more efficient to use `m4_set_map_sep' in
     that case.

 -- Macro: m4_set_map_sep (SET, [PRE], [POST], [SEP])
     For each element in the set SET, expand `PRE[element]POST',
     additionally expanding SEP between elements.  Behavior is
     unspecified if the expansion recursively lists the contents of 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,
     `m4_set_map([SET], [ACTION])' is equivalent to
     `m4_set_map_sep([SET], [ACTION(], [)])'.

 -- Macro: m4_set_remove (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
     If VALUE is an element in the set SET, then remove it and expand
     IF-PRESENT.  Otherwise expand IF-ABSENT.  This macro operates in
     constant time so that multiple removals will scale linearly rather
     than quadratically; but when used outside of `m4_set_foreach' or
     `m4_set_map', it leaves memory occupied until the set is later
     compacted by `m4_set_contents' or `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.

 -- Macro: m4_set_size (SET)
     Expand to the size of the set SET.  This implementation operates
     in constant time, and is thus more efficient than
     `m4_eval(m4_count(m4_set_listc([set])) - 1)'.


File: autoconf.info,  Node: Forbidden Patterns,  Prev: Set manipulation Macros,  Up: Programming in M4sugar

8.3.10 Forbidden Patterns
-------------------------

M4sugar provides a means to define suspicious patterns, patterns
describing tokens which should not be found in the output.  For
instance, if an Autoconf `configure' script includes tokens such as
`AC_DEFINE', or `dnl', then most probably something went wrong
(typically a macro was not evaluated because of overquotation).

   M4sugar forbids all the tokens matching `^_?m4_' and `^dnl$'.
Additional layers, such as M4sh and Autoconf, add additional forbidden
patterns to the list.

 -- Macro: m4_pattern_forbid (PATTERN)
     Declare that no token matching PATTERN must be found in the output.
     Comments are not checked; this can be a problem if, for instance,
     you have some macro left unexpanded after an `#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 `dnl' comments;
     reserving `#'-comments to document the output).

   Of course, you might encounter exceptions to these generic rules, for
instance you might have to refer to `$m4_flags'.

 -- Macro: m4_pattern_allow (PATTERN)
     Any token matching PATTERN is allowed, including if it matches an
     `m4_pattern_forbid' pattern.


File: autoconf.info,  Node: Debugging via autom4te,  Prev: Programming in M4sugar,  Up: Programming in M4

8.4 Debugging via autom4te
==========================

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 `autom4te' means that directly using the m4 builtin `m4_traceon' is
likely to interfere with operation.  Also, frequent diversion changes
and the concept of forbidden tokens make it difficult to use `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
`--trace' option provided by `autom4te' (as well as each of the
programs that wrap `autom4te', such as `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:

     $ autoconf --trace=AC_INIT
     configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@gnu.org
     $ autoconf --trace='AC_INIT:version is $2'
     version is 2.63b.95-3963

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

     $ cat <<\EOF > configure.ac
     AC_INIT
     m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
     m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
     AC_OUTPUT
     EOF
     $ autoconf
     error-->The definition of AC_DEFINE_UNQUOTED:
     error-->_AC_DEFINE_Q([], $@)


File: autoconf.info,  Node: Programming in M4sh,  Next: Writing Autoconf Macros,  Prev: Programming in M4,  Up: Top

9 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):

     Mash \Mash\, n.  [Akin to G. meisch, maisch, meische, maische,
     mash, wash, and prob. to AS. miscian to mix.  See "Mix".]

       1. A mass of mixed ingredients reduced to a soft pulpy state by
          beating or pressure...

       2. A mixture of meal or bran and water fed to animals.

       3. A mess; trouble.  [Obs.] -Beau. & Fl.

   M4sh reserves the M4 macro namespace `^_AS_' for internal use, and
the namespace `^AS_' for M4sh macros.  It also reserves the shell and
environment variable namespace `^as_', and the here-document delimiter
namespace `^_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


File: autoconf.info,  Node: Common Shell Constructs,  Next: Polymorphic Variables,  Up: Programming in M4sh

9.1 Common Shell Constructs
===========================

M4sh provides portable alternatives for some common shell constructs
that unfortunately are not portable in practice.

 -- Macro: AS_BOX (TEXT, [CHAR = `-'])
     Expand into shell code that will output TEXT surrounded by a box
     with CHAR in the top and bottom border.  TEXT should not contain a
     newline, but may contain shell expansions valid for unquoted
     here-documents.  CHAR defaults to `-', but can be any character
     except `/', `'', `"', `\', `&', or ``'.  This is useful for
     outputting a comment box into log files to separate distinct
     phases of script operation.

 -- Macro: AS_CASE (WORD, [PATTERN1], [IF-MATCHED1], ..., [DEFAULT])
     Expand into a shell `case' statement, where WORD is matched
     against one or more patterns.  IF-MATCHED is run if the
     corresponding pattern matched WORD, else DEFAULT is run.  Avoids
     several portability issues (*note Limitations of Shell Builtins:
     case.).

 -- Macro: AS_DIRNAME (FILE-NAME)
     Output the directory portion of FILE-NAME.  For example, if
     `$file' is `/one/two/three', the command
     `dir=`AS_DIRNAME(["$file"])`' sets `dir' to `/one/two'.

     This interface may be improved in the future to avoid forks and
     losing trailing newlines.

 -- Macro: AS_ECHO (WORD)
     Emits WORD to the standard output, followed by a newline.  WORD
     must be a single shell word (typically a quoted string).  The
     bytes of WORD are output as-is, even if it starts with "-" or
     contains "\".  Redirections can be placed outside the macro
     invocation.  This is much more portable than using `echo' (*note
     Limitations of Shell Builtins: echo.).

 -- Macro: AS_ECHO_N (WORD)
     Emits WORD to the standard output, without a following newline.
     WORD must be a single shell word (typically a quoted string) and,
     for portability, should not include more than one newline.  The
     bytes of WORD are output as-is, even if it starts with "-" or
     contains "\".  Redirections can be placed outside the macro
     invocation.

 -- Macro: AS_ESCAPE (STRING, [CHARS = ``\"$'])
     Expands to STRING, with any characters in CHARS escaped with a
     backslash (`\').  CHARS should be at most four bytes long, and
     only contain characters from the set ``\"$'; however, characters
     may be safely listed more than once in CHARS for the sake of
     syntax highlighting editors.  The current implementation expands
     STRING after adding escapes; if STRING contains macro calls that
     in turn expand to text needing shell quoting, you can use
     `AS_ESCAPE(m4_dquote(m4_expand([string])))'.

     The default for CHARS (`\"$`') is the set of characters needing
     escapes when STRING will be used literally within double quotes.
     One common variant is the set of characters to protect when STRING
     will be used literally within back-ticks or an unquoted
     here-document (`\$`').  Another common variant is `""', which can
     be used to form a double-quoted string containing the same
     expansions that would have occurred if STRING were expanded in an
     unquoted here-document; however, when using this variant, care
     must be taken that STRING does not use double quotes within
     complex variable expansions (such as `${foo-`echo "hi"`}') that
     would be broken with improper escapes.

     This macro is often used with `AS_ECHO'.  For an example, observe
     the output generated by the shell code generated from this snippet:

          foo=bar
          AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
          =>"$foo" = "bar"
          m4_define([macro], [a, [\b]])
          AS_ECHO(["AS_ESCAPE([[macro]])"])
          =>macro
          AS_ECHO(["AS_ESCAPE([macro])"])
          =>a, b
          AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
          =>a, \b

     To escape a string that will be placed within single quotes, use:

          m4_bpatsubst([[STRING]], ['], ['\\''])

 -- Macro: AS_EXECUTABLE_P (FILE)
     Emit code to probe whether FILE is a regular file with executable
     permissions (and not a directory with search permissions).  The
     caller is responsible for quoting FILE.

 -- Macro: AS_EXIT ([STATUS = `$?'])
     Emit code to exit the shell with STATUS, defaulting to `$?'.  This
     macro works around shells that see the exit status of the command
     prior to `exit' inside a `trap 0' handler (*note Limitations of
     Shell Builtins: trap.).

 -- Macro: AS_IF (TEST1, [RUN-IF-TRUE1], ..., [RUN-IF-FALSE])
     Run shell code TEST1.  If TEST1 exits with a zero status then run
     shell code RUN-IF-TRUE1, else examine further tests.  If no test
     exits with a zero status, run shell code RUN-IF-FALSE, with
     simplifications if either RUN-IF-TRUE1 or RUN-IF-FALSE is empty.
     For example,

          AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
                [test "x$foo" != xno], [HANDLE_FOO([maybe])],
                [echo foo not specified])

     ensures any required macros of `HANDLE_FOO' are expanded before
     the first test.

 -- Macro: AS_MKDIR_P (FILE-NAME)
     Make the directory FILE-NAME, including intervening directories as
     necessary.  This is equivalent to `mkdir -p -- FILE-NAME', except
     that it is portable to older versions of `mkdir' that lack support
     for the `-p' option or for the `--' delimiter (*note Limitations
     of Usual Tools: mkdir.).  Also, `AS_MKDIR_P' succeeds if FILE-NAME
     is a symbolic link to an existing directory, even though Posix is
     unclear whether `mkdir -p' should succeed in that case.  If
     creation of FILE-NAME fails, exit the script.

     Also see the `AC_PROG_MKDIR_P' macro (*note Particular Programs::).

 -- Macro: AS_SET_STATUS (STATUS)
     Emit shell code to set the value of `$?' to STATUS, as efficiently
     as possible.  However, this is not guaranteed to abort a shell
     running with `set -e' (*note Limitations of Shell Builtins: set.).
     This should also be used at the end of a complex shell function
     instead of `return' (*note Shell Functions::) to avoid a DJGPP
     shell bug.

 -- Macro: AS_TR_CPP (EXPRESSION)
     Transform EXPRESSION into a valid right-hand side for a C
     `#define'.  For 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"

 -- Macro: AS_TR_SH (EXPRESSION)
     Transform 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 `eval' if EXPRESSION causes shell
     indirections.  For 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

 -- Macro: AS_SET_CATFILE (VAR, DIR, FILE)
     Set the polymorphic shell variable VAR to DIR/FILE, but optimizing
     the common cases (DIR or FILE is `.', FILE is absolute, etc.).

 -- Macro: AS_UNSET (VAR)
     Unsets the shell variable VAR, working around bugs in older shells
     (*note Limitations of Shell Builtins: unset.).  VAR can be a
     literal or indirect variable name.

 -- Macro: AS_VERSION_COMPARE (VERSION-1, VERSION-2, [ACTION-IF-LESS],
          [ACTION-IF-EQUAL], [ACTION-IF-GREATER])
     Compare two strings VERSION-1 and VERSION-2, possibly containing
     shell variables, as version strings, and expand ACTION-IF-LESS,
     ACTION-IF-EQUAL, or ACTION-IF-GREATER depending upon the result.
     The algorithm to compare is similar to the one used by strverscmp
     in glibc (*note String/Array Comparison: (libc)String/Array
     Comparison.).


File: autoconf.info,  Node: Polymorphic Variables,  Next: Initialization Macros,  Prev: Common Shell Constructs,  Up: Programming in M4sh

9.2 Support for indirect variable names
=======================================

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.

 -- Macro: AS_LITERAL_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
          [IF-SIMPLE-REF = `IF-NOT'])
 -- Macro: AS_LITERAL_WORD_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
          [IF-SIMPLE-REF = `IF-NOT'])
     If the expansion of EXPRESSION is definitely a shell literal,
     expand IF-LITERAL.  If the expansion of EXPRESSION looks like it
     might contain shell indirections (such as `$var' or ``expr`'),
     then IF-NOT is expanded.  Sometimes, it is possible to output
     optimized code if EXPRESSION consists only of shell variable
     expansions (such as `${var}'), in which case IF-SIMPLE-REF can be
     provided; but defaulting to IF-NOT should always be safe.
     `AS_LITERAL_WORD_IF' only expands IF-LITERAL if EXPRESSION looks
     like a single shell word, containing no whitespace; while
     `AS_LITERAL_IF' allows whitespace in EXPRESSION.

     In order to reduce the time spent recognizing whether an
     EXPRESSION qualifies as a literal or a simple indirection, the
     implementation is somewhat conservative: 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, `a.b' results
     in IF-LITERAL, even though it is not a valid shell variable name;
     while both `'a'' and `[$]' result in IF-NOT, because they behave
     differently than `"'a'"' and `"[$]"').  This macro can be used in
     contexts for recognizing portable file names (such as in the
     implementation of `AC_LIBSOURCE'), or coupled with some
     transliterations for forming valid variable names (such as in the
     implementation of `AS_TR_SH', which uses an additional
     `m4_translit' to convert `.' to `_').

     This example shows how to read the contents of the shell variable
     `bar', exercising all three arguments to `AS_LITERAL_IF'.  It
     results in a script that will output the line `hello' three times.

          AC_DEFUN([MY_ACTION],
          [AS_LITERAL_IF([$1],
            [echo "$$1"],
            [AS_VAR_COPY([var], [$1])
             echo "$var"],
            [eval 'echo "$'"$1"\"])])
          foo=bar bar=hello
          MY_ACTION([bar])
          MY_ACTION([`echo bar`])
          MY_ACTION([$foo])

 -- Macro: AS_VAR_APPEND (VAR, TEXT)
     Emit shell code to append the shell expansion of TEXT to the end
     of the current contents of the polymorphic shell variable VAR,
     taking advantage of shells that provide the `+=' extension for more
     efficient scaling.

     For situations where the final contents of VAR are relatively
     short (less than 256 bytes), it is more efficient to use the
     simpler code sequence of `VAR=${VAR}TEXT' (or its polymorphic
     equivalent of `AS_VAR_COPY([t], [VAR])' and `AS_VAR_SET([VAR],
     ["$t"TEXT])').  But in the case when the script will be repeatedly
     appending text into `var', issues of scaling start to become
     apparent.  A naive implementation requires execution time linear
     to the length of the current contents of VAR as well as the length
     of TEXT for a single append, for an overall quadratic scaling with
     multiple appends.  This macro takes advantage of shells which
     provide the extension `VAR+=TEXT', which can provide amortized
     constant time for a single append, for an overall linear scaling
     with multiple appends.  Note that unlike `AS_VAR_SET', this macro
     requires that TEXT be quoted properly to avoid field splitting and
     file name expansion.

 -- Macro: AS_VAR_ARITH (VAR, EXPRESSION)
     Emit shell code to compute the arithmetic expansion of EXPRESSION,
     assigning the result as the contents of the polymorphic shell
     variable VAR.  The code takes advantage of shells that provide
     `$(())' for fewer forks, but uses `expr' as a fallback.
     Therefore, the syntax for a valid EXPRESSION is rather limited:
     all operators must occur as separate shell arguments and with
     proper quoting, there is no portable equality operator, all
     variables containing numeric values must be expanded prior to the
     computation, all numeric values must be provided in decimal
     without leading zeroes, and the first shell argument should not be
     a negative number.  In the following example, this snippet will
     print `(2+3)*4 == 20'.

          bar=3
          AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
          echo "(2+$bar)*4 == $foo"

 -- Macro: AS_VAR_COPY (DEST, SOURCE)
     Emit shell code to assign the contents of the polymorphic shell
     variable SOURCE to the polymorphic shell variable DEST.  For
     example, executing this M4sh snippet will output `bar hi':

          foo=bar bar=hi
          AS_VAR_COPY([a], [foo])
          AS_VAR_COPY([b], [$foo])
          echo "$a $b"

     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.

          for header in stdint_h inttypes_h ; do
            AS_VAR_COPY([var], [ac_cv_header_$header])
            echo "$header detected: $var"
          done

 -- Macro: AS_VAR_IF (VAR, [WORD], [IF-EQUAL], [IF-NOT-EQUAL])
     Output a shell conditional statement.  If the contents of the
     polymorphic shell variable VAR match the string WORD, execute
     IF-EQUAL; otherwise execute IF-NOT-EQUAL.  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 is
     being expanded.

 -- Macro: AS_VAR_PUSHDEF (M4-NAME, VALUE)
 -- Macro: AS_VAR_POPDEF (M4-NAME)
     A common M4sh idiom involves composing shell variable names from
     an m4 argument (for example, writing a macro that uses a cache
     variable).  VALUE can be an arbitrary string, which will be
     transliterated into a valid shell name by `AS_TR_SH'.  In order to
     access the composed variable name based on VALUE, it is easier to
     declare a temporary m4 macro M4-NAME with `AS_VAR_PUSHDEF', then
     use that macro as the argument to subsequent `AS_VAR' macros as a
     polymorphic variable name, and finally free the temporary macro
     with `AS_VAR_POPDEF'.  These macros are often followed with `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:

          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

     In the above example, `MY_CHECK_HEADER' can operate on polymorphic
     variable names.  In the first invocation, the m4 argument is
     `stdint.h', which transliterates into a literal `stdint_h'.  As a
     result, the temporary macro `my_Header' expands to the literal
     shell name `ac_cv_header_stdint_h'.  In the second invocation, the
     m4 argument to `MY_CHECK_HEADER' is `$header', and the temporary
     macro `my_Header' expands to the indirect shell name
     `$as_my_Header'.  During the shell execution of the for loop, when
     `$header' contains `inttypes.h', then `$as_my_Header' contains
     `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:

          header stdint.h detected
          header inttypes.h detected
          header stdlib.h detected

 -- Macro: AS_VAR_SET (VAR, [VALUE])
     Emit shell code to assign the contents of the polymorphic shell
     variable VAR to the shell expansion of VALUE.  VALUE is not
     subject to field splitting or file name expansion, so if command
     substitution is used, it may be done with ``""`' rather than using
     an intermediate variable (*note Shell Substitutions::).  However,
     VALUE does undergo rescanning for additional macro names; behavior
     is unspecified if late expansion results in any shell
     meta-characters.

 -- Macro: AS_VAR_SET_IF (VAR, [IF-SET], [IF-UNDEF])
     Emit a shell conditional statement, which executes IF-SET if the
     polymorphic shell variable `var' is set to any value, and IF-UNDEF
     otherwise.

 -- Macro: AS_VAR_TEST_SET (VAR)
     Emit a shell statement that results in a successful exit status
     only if the polymorphic shell variable `var' is set.


File: autoconf.info,  Node: Initialization Macros,  Next: File Descriptor Macros,  Prev: Polymorphic Variables,  Up: Programming in M4sh

9.3 Initialization Macros
=========================

 -- Macro: AS_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
     `AS_INIT' already invokes it.

 -- Macro: AS_INIT
     Initialize the M4sh environment.  This macro calls `m4_init', then
     outputs the `#! /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 `SHELL' to
     the shell chosen to run the script (*note CONFIG_SHELL::), and
     `LC_ALL' to ensure the C locale.  Finally, it changes the current
     diversion to `BODY'.  `AS_INIT' is called automatically by
     `AC_INIT' and `AT_INIT', so shell code in `configure',
     `config.status', and `testsuite' all benefit from a sanitized
     shell environment.

 -- Macro: AS_INIT_GENERATED (FILE, [COMMENT])
     Emit shell code to start the creation of a subsidiary shell script
     in FILE, including changing 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 `AS_INIT',
     `AS_BOURNE_COMPATIBLE', and `AS_SHELL_SANITIZE').  If present,
     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 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 (*note 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 `AS_MESSAGE_FD' redirected
     somewhere besides `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:

          AS_INIT_GENERATED([FILE], [[# My child script.
          ]]) || { AS_ECHO(["Failed to create child script"]); AS_EXIT; }
          m4_pushdef([AS_MESSAGE_LOG_FD])dnl
          cat >> "FILE" <<\__EOF__
          # Code to initialize AS_MESSAGE_LOG_FD
          m4_popdef([AS_MESSAGE_LOG_FD])dnl
          # Additional code
          __EOF__

     This, however, may change in the future as the M4sh interface is
     stabilized further.

     Also, be aware that use of `LINENO' within the child script may
     report line numbers relative to their location in the parent
     script, even when using `AS_LINENO_PREPARE', if the parent script
     was unable to locate a shell with working `LINENO' support.

 -- Macro: AS_LINENO_PREPARE
     Find a shell that supports the special variable `LINENO', which
     contains the number of the currently executing line.  This macro is
     automatically invoked by `AC_INIT' in configure scripts.

 -- Macro: AS_ME_PREPARE
     Set up variable `as_me' to be the basename of the currently
     executing script.  This macro is automatically invoked by
     `AC_INIT' in configure scripts.

 -- Macro: AS_TMPDIR (PREFIX, [DIR = `${TMPDIR:=/tmp}'])
     Create, as safely as possible, a temporary sub-directory within
     DIR with a name starting with PREFIX.  PREFIX should be 2-4
     characters, to make it slightly easier to identify the owner of
     the directory.  If DIR is omitted, then the value of `TMPDIR' will
     be used (defaulting to `/tmp').  On success, the name of the newly
     created directory is stored in the shell variable `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 PREFIX that makes it
     easier to determine if a leftover temporary directory from an
     interrupted script is safe to delete.

     The use of the output variable `$tmp' rather than something in the
     `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.

 -- Macro: AS_SHELL_SANITIZE
     Initialize the shell suitably for `configure' scripts.  This has
     the effect of `AS_BOURNE_COMPATIBLE', and sets some other
     environment variables for predictable results from configuration
     tests.  For example, it sets `LC_ALL' to change to the default C
     locale.  *Note Special Shell Variables::.  This macro is
     deprecated, since `AS_INIT' already invokes it.


File: autoconf.info,  Node: File Descriptor Macros,  Prev: Initialization Macros,  Up: Programming in M4sh

9.4 File Descriptor Macros
==========================

The following macros define file descriptors used to output messages
(or input values) from `configure' scripts.  For example:

     echo "$wombats found" >&AS_MESSAGE_LOG_FD
     echo 'Enter desired kangaroo count:' >&AS_MESSAGE_FD
     read kangaroos <&AS_ORIGINAL_STDIN_FD`

However doing so is seldom needed, because Autoconf provides higher
level macros as described below.

 -- Macro: AS_MESSAGE_FD
     The file descriptor for `checking for...'  messages and results.
     By default, `AS_INIT' sets this to `1' for standalone M4sh
     clients.  However, `AC_INIT' shuffles things around to another file
     descriptor, in order to allow the `-q' option of `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 (*note Printing Messages::) instead.  Copies of
     messages output via these macros are also recorded in `config.log'.

 -- Macro: AS_MESSAGE_LOG_FD
     This must either be empty, or expand to a file descriptor for log
     messages.  By default, `AS_INIT' sets this macro to the empty
     string for standalone M4sh clients, thus disabling logging.
     However, `AC_INIT' shuffles things around so that both `configure'
     and `config.status' use `config.log' for log messages.  Macros
     that run tools, like `AC_COMPILE_IFELSE' (*note Running the
     Compiler::), redirect all output to this descriptor.  You may want
     to do so if you develop such a low-level macro.

 -- Macro: AS_ORIGINAL_STDIN_FD
     This must expand to a file descriptor for the original standard
     input.  By default, `AS_INIT' sets this macro to `0' for standalone
     M4sh clients.  However, `AC_INIT' shuffles things around for
     safety.

     When `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 `configure' to stop, pending some
     user input.  Therefore `configure' redirects its standard input
     from `/dev/null' during its initialization.  This is not normally
     a problem, since `configure' normally does not need user input.

     In the extreme case where your `configure' script really needs to
     obtain some values from the original standard input, you can read
     them explicitly from `AS_ORIGINAL_STDIN_FD'.


File: autoconf.info,  Node: Writing Autoconf Macros,  Next: Portable Shell,  Prev: Programming in M4sh,  Up: Top

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

* Menu:

* Macro Definitions::           Basic format of an Autoconf macro
* Macro Names::                 What to call your new macros
* Reporting Messages::          Notifying `autoconf' users
* 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 a` la Autoconf


File: autoconf.info,  Node: Macro Definitions,  Next: Macro Names,  Up: Writing Autoconf Macros

10.1 Macro Definitions
======================

 -- Macro: AC_DEFUN (NAME, [BODY])
     Autoconf macros are defined using the `AC_DEFUN' macro, which is
     similar to the M4 builtin `m4_define' macro; this creates a macro
     named NAME and with BODY as its expansion.  In addition to
     defining a macro, `AC_DEFUN' adds to it some code that is used to
     constrain the order in which macros are called, while avoiding
     redundant output (*note Prerequisite Macros::).

   An Autoconf macro definition looks like this:

     AC_DEFUN(MACRO-NAME, MACRO-BODY)

   You can refer to any arguments passed to the macro as `$1', `$2',
etc.  *Note How to define new macros: (m4.info)Definitions, 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 `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 `AC_REQUIRE', or to declare
the macro with `AC_DEFUN_ONCE' (*note One-Shot Macros::).

   Be sure to properly quote both the MACRO-BODY _and_ the 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:

     # AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
     # --------------------------------------
     m4_define([AC_MSG_ERROR],
       [{ AS_MESSAGE([error: $1], [2])
          exit m4_default([$2], [1]); }])

   Comments about the macro should be left in the header comment.  Most
other comments make their way into `configure', so just keep using `#'
to introduce comments.

   If you have some special comments about pure M4 code, comments that
make no sense in `configure' and in the header comment, then use the
builtin `dnl': it causes M4 to discard the text through the next
newline.

   Keep in mind that `dnl' is rarely needed to introduce comments;
`dnl' is more useful to get rid of the newlines following macros that
produce no output, such as `AC_REQUIRE'.

   Public third-party macros need to use `AC_DEFUN', and not
`m4_define', in order to be found by `aclocal' (*note Extending
aclocal: (automake)Extending aclocal.).  Additionally, if it is ever
determined that a macro should be made obsolete, it is easy to convert
from `AC_DEFUN' to `AU_DEFUN' in order to have `autoupdate' assist the
user in choosing a better alternative, but there is no corresponding
way to make `m4_define' issue an upgrade notice (*note AU_DEFUN::).

   There is another subtle, but important, difference between using
`m4_define' and `AC_DEFUN': only the former is unaffected by
`AC_REQUIRE'.  When writing a file, it is always safe to replace a
block of text with a `m4_define' macro that will expand to the same
text.  But replacing a block of text with an `AC_DEFUN' macro with the
same content does not necessarily give the same results, because it
changes the location where any embedded but unsatisfied `AC_REQUIRE'
invocations within the block will be expanded.  For an example of this,
see *note Expanded Before Required::.


File: autoconf.info,  Node: Macro Names,  Next: Reporting Messages,  Prev: Macro Definitions,  Up: Writing Autoconf Macros

10.2 Macro Names
================

All of the public Autoconf macros have all-uppercase names in the
namespace `^AC_' to prevent them from accidentally conflicting with
other text; Autoconf also reserves the namespace `^_AC_' for internal
macros.  All shell variables that they use for internal purposes have
mostly-lowercase names starting with `ac_'.  Autoconf also uses
here-document delimiters in the namespace `^_AC[A-Z]'.  During
`configure', files produced by Autoconf make heavy use of the file
system namespace `^conf'.

   Since Autoconf is built on top of M4sugar (*note Programming in
M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
aware of those namespaces (`^_?\(m4\|AS\)_').  And since `configure.ac'
is also designed to be scanned by Autoheader, Autoscan, Autoupdate, and
Automake, you should be aware of the `^_?A[HNUM]_' namespaces.  In
general, you _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 `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 (*note Cache Variable Names::, for more
information on them).

   The first word of the name after the namespace initials (such as
`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.

`C'
     C language builtin features.

`DECL'
     Declarations of C variables in header files.

`FUNC'
     Functions in libraries.

`GROUP'
     Posix group owners of files.

`HEADER'
     Header files.

`LIB'
     C libraries.

`PROG'
     The base names of programs.

`MEMBER'
     Members of aggregates.

`SYS'
     Operating system features.

`TYPE'
     C builtin or declared types.

`VAR'
     C variables in libraries.

   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, `AC_PROG_CC_STDC' checks whether the C
compiler supports ISO Standard C.

   An internal macro should have a name that starts with an underscore;
Autoconf internals should therefore start with `_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, `AC_PATH_X' has internal macros `_AC_PATH_X_XMKMF' and
`_AC_PATH_X_DIRECT'.


File: autoconf.info,  Node: Reporting Messages,  Next: Dependencies Between Macros,  Prev: Macro Names,  Up: Writing Autoconf Macros

10.3 Reporting Messages
=======================

When macros statically diagnose abnormal situations, benign or fatal, it
is possible to make `autoconf' detect the problem, and refuse to create
`configure' in the case of an error.  The macros in this section are
considered obsolescent, and new code should use M4sugar macros for this
purpose, see *note Diagnostic Macros::.

   On the other hand, it is possible to want to detect errors when
`configure' is run, which are dependent on the environment of the user
rather than the maintainer.  For dynamic diagnostics, see *note
Printing Messages::.

 -- Macro: AC_DIAGNOSE (CATEGORY, MESSAGE)
     Report MESSAGE as a warning (or as an error if requested by the
     user) if warnings of the CATEGORY are turned on.  This macro is
     obsolescent; you are encouraged to use:
          m4_warn([CATEGORY], [MESSAGE])
     instead.  *Note m4_warn::, for more details, including valid
     CATEGORY names.

 -- Macro: AC_WARNING (MESSAGE)
     Report MESSAGE as a syntax warning.  This macro is obsolescent;
     you are encouraged to use:
          m4_warn([syntax], [MESSAGE])
     instead.  *Note m4_warn::, for more details, as well as better
     finer-grained categories of warnings (not all problems have to do
     with syntax).

 -- Macro: AC_FATAL (MESSAGE)
     Report a severe error MESSAGE, and have `autoconf' die.  This
     macro is obsolescent; you are encouraged to use:
          m4_fatal([MESSAGE])
     instead.  *Note m4_fatal::, for more details.

   When the user runs `autoconf -W error', warnings from `m4_warn'
(including those issued through `AC_DIAGNOSE' and `AC_WARNING') are
reported as errors, see *note autoconf Invocation::.


File: autoconf.info,  Node: Dependencies Between Macros,  Next: Obsoleting Macros,  Prev: Reporting Messages,  Up: Writing Autoconf Macros

10.4 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


File: autoconf.info,  Node: Prerequisite Macros,  Next: Suggested Ordering,  Up: Dependencies Between Macros

10.4.1 Prerequisite Macros
--------------------------

A macro that you write might need to use values that have previously
been computed by other macros.  For example, `AC_DECL_YYTEXT' examines
the output of `flex' or `lex', so it depends on `AC_PROG_LEX' having
been called first to set the shell variable `LEX'.

   Rather than forcing the user of the macros to keep track of the
dependencies between them, you can use the `AC_REQUIRE' macro to do it
automatically.  `AC_REQUIRE' can ensure that a macro is only called if
it is needed, and only called once.

 -- Macro: AC_REQUIRE (MACRO-NAME)
     If the M4 macro MACRO-NAME has not already been called, call it
     (without any arguments).  Make sure to quote MACRO-NAME with
     square brackets.  MACRO-NAME must have been defined using
     `AC_DEFUN' or else contain a call to `AC_PROVIDE' to indicate that
     it has been called.

     `AC_REQUIRE' must be used inside a macro defined by `AC_DEFUN'; it
     must not be called from the top level.  Also, it does not make
     sense to require a macro that takes parameters.

   `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 _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,
`AC_REQUIRE([FOO])' is not replaced with the body of `FOO'.  For
instance, this definition of macros:

     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])

     AC_DEFUN([RESERVE_DANCE_FLOOR],
     [if date | grep '^Sat.*pm' >/dev/null 2>&1; then
       AC_REQUIRE([TRAVOLTA])
       AC_REQUIRE([NEWTON_JOHN])
     fi])

with this `configure.ac'

     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

does not leave you with a better chance to meet a kindred soul at other
times than Saturday night since it expands into:

     test "$body_temperature_in_Celsius" -gt "38" &&
       dance_floor=occupied
     test "x$hair_style" = xcurly &&
       dance_floor=occupied
     fi
     if date | grep '^Sat.*pm' >/dev/null 2>&1; then


     fi

   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:

     if ...; then
       AC_REQUIRE([SOME_CHECK])
     fi
     ...
     SOME_CHECK

   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:

     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

Prior to Autoconf 2.64, the implementation of `AC_REQUIRE' recognized
that `TESTB' needed to be hoisted prior to the expansion of `OUTER',
but because `TESTA' had already been directly expanded, it failed to
hoist `TESTA'.  Therefore, the expansion of `TESTB' occurs prior to its
prerequisites, leading to the following output:

     in B
     bug
     in OUTER
     in A
     in C

Newer Autoconf is smart enough to recognize this situation, and hoists
`TESTA' even though it has already been expanded, but issues a syntax
warning in the process.  This is because the hoisted expansion of
`TESTA' defeats the purpose of using `AC_REQUIRE' to avoid redundant
code, and causes its own set of problems if the hoisted macro is not
idempotent:

     in A
     in B
     in OUTER
     in A
     duplicate
     in C

   The bug is not in Autoconf, but in the macro definitions.  If you
ever pass a particular macro name to `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 `AC_DEFUN_ONCE' (although this
only helps in Autoconf 2.64 or newer), or all uses of that macro should
be through `AC_REQUIRE'; directly expanding the macro defeats the point
of using `AC_REQUIRE' to eliminate redundant expansion.  In the
example, this rule of thumb was violated because `TESTB' requires
`TESTA' while `OUTER' directly expands it.  One way of fixing the bug
is to factor `TESTA' into two macros, the portion designed for direct
and repeated use (here, named `TESTA'), and the portion designed for
one-shot output and used only inside `AC_REQUIRE' (here, named
`TESTA_PREREQ').  Then, by fixing all clients to use the correct
calling convention according to their needs:

     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

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:

     in A_PREREQ
     in B
     in OUTER
     in A
     in C

   The helper macros `AS_IF' and `AS_CASE' may be used to enforce
expansion of required macros outside of shell conditional constructs.
You are furthermore encouraged, although not required, to put all
`AC_REQUIRE' calls at the beginning of a macro.  You can use `dnl' to
avoid the empty lines they leave.


File: autoconf.info,  Node: Suggested Ordering,  Next: One-Shot Macros,  Prev: Prerequisite Macros,  Up: Dependencies Between Macros

10.4.2 Suggested Ordering
-------------------------

Some macros should be run before another macro if both are called, but
neither _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 `AC_BEFORE' macro to warn users when macros
with this kind of dependency appear out of order in a `configure.ac'
file.  The warning occurs when creating `configure' from
`configure.ac', not when running `configure'.

   For example, `AC_PROG_CPP' checks whether the C compiler can run the
C preprocessor when given the `-E' option.  It should therefore be
called after any macros that change which C compiler is being used,
such as `AC_PROG_CC'.  So `AC_PROG_CC' contains:

     AC_BEFORE([$0], [AC_PROG_CPP])dnl

This warns the user if a call to `AC_PROG_CPP' has already occurred
when `AC_PROG_CC' is called.

 -- Macro: AC_BEFORE (THIS-MACRO-NAME, CALLED-MACRO-NAME)
     Make M4 print a warning message to the standard error output if
     CALLED-MACRO-NAME has already been called.  THIS-MACRO-NAME should
     be the name of the macro that is calling `AC_BEFORE'.  The macro
     CALLED-MACRO-NAME must have been defined using `AC_DEFUN' or else
     contain a call to `AC_PROVIDE' to indicate that it has been called.


File: autoconf.info,  Node: One-Shot Macros,  Prev: Suggested Ordering,  Up: Dependencies Between Macros

10.4.3 One-Shot Macros
----------------------

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 `AC_CANONICAL_BUILD' and cousins (*note
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 `AC_DEFUN_ONCE'.

 -- Macro: AC_DEFUN_ONCE (MACRO-NAME, MACRO-BODY)
     Declare macro MACRO-NAME like `AC_DEFUN' would (*note Macro
     Definitions::), but add additional logic that guarantees that only
     the first use of the macro (whether by direct expansion or
     `AC_REQUIRE') causes an expansion of MACRO-BODY; the expansion
     will occur before the start of any enclosing macro defined by
     `AC_DEFUN'.  Subsequent expansions are silently ignored.
     Generally, it does not make sense for MACRO-BODY to use parameters
     such as `$1'.

   Prior to Autoconf 2.64, a macro defined by `AC_DEFUN_ONCE' would
emit a warning if it was directly expanded a second time, so for
portability, it is better to use `AC_REQUIRE' than direct invocation of
MACRO-NAME inside a macro defined by `AC_DEFUN' (*note Prerequisite
Macros::).


File: autoconf.info,  Node: Obsoleting Macros,  Next: Coding Style,  Prev: Dependencies Between Macros,  Up: Writing Autoconf Macros

10.5 Obsoleting Macros
======================

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 "obsolete"; they still work, but are no longer considered
the best thing to do, hence they should be replaced with more modern
macros.  Ideally, `autoupdate' should replace the old macro calls with
their modern implementation.

   Autoconf provides a simple means to obsolete a macro.

 -- Macro: AU_DEFUN (OLD-MACRO, IMPLEMENTATION, [MESSAGE])
     Define OLD-MACRO as IMPLEMENTATION.  The only difference with
     `AC_DEFUN' is that the user is warned that OLD-MACRO is now
     obsolete.

     If she then uses `autoupdate', the call to OLD-MACRO is replaced
     by the modern IMPLEMENTATION.  MESSAGE should include information
     on what to do after running `autoupdate'; `autoupdate' prints it
     as a warning, and includes it in the updated `configure.ac' file.

     The details of this macro are hairy: if `autoconf' encounters an
     `AU_DEFUN'ed macro, all macros inside its second argument are
     expanded as usual.  However, when `autoupdate' is run, only M4 and
     M4sugar macros are expanded here, while all other macros are
     disabled and appear literally in the updated `configure.ac'.

 -- Macro: AU_ALIAS (OLD-NAME, NEW-NAME)
     Used if the OLD-NAME is to be replaced by a call to NEW-MACRO with
     the same parameters.  This happens for example if the macro was
     renamed.


File: autoconf.info,  Node: Coding Style,  Prev: Obsoleting Macros,  Up: Writing Autoconf Macros

10.6 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 Autoconf Macro
Archive (http://www.gnu.org/software/autoconf-archive/), or by other
means.

   The first requirement is to pay great attention to the quotation.
For more details, see *note Autoconf Language::, and *note 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 _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 (*note Macro Names::),
you are unlikely to generate conflicts.  Nevertheless, when you need to
set a special value, _avoid using a regular macro name_; rather, use an
"impossible" name.  For instance, up to version 2.13, the macro
`AC_SUBST' used to remember what SYMBOL macros were already defined by
setting `AC_SUBST_SYMBOL', which is a regular macro name.  But since
there is a macro named `AC_SUBST_FILE', it was just impossible to
`AC_SUBST(FILE)'!  In this case, `AC_SUBST(SYMBOL)' or
`_AC_SUBST(SYMBOL)' should have been used (yes, with the parentheses).

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

   Do not use `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 `configure'.  There are
exceptional cases where you do want to comment special M4 constructs,
in which case `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

     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])])

write

     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])])

or even

     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])])

   When using `AC_RUN_IFELSE' or any macro that cannot work when
cross-compiling, provide a pessimistic value (typically `no').

   Feel free to use various tricks to prevent auxiliary tools, such as
syntax-highlighting editors, from behaving improperly.  For instance,
instead of:

     m4_bpatsubst([$1], [$"])

use

     m4_bpatsubst([$1], [$""])

so that Emacsen do not open an endless "string" at the first quote.
For the same reasons, avoid:

     test $[#] != 0

and use:

     test $[@%:@] != 0

Otherwise, the closing bracket would be hidden inside a `#'-comment,
breaking the bracket-matching highlighting from Emacsen.  Note the
preferred style to escape from M4: `$[1]', `$[@]', etc.  Do not escape
when it is unnecessary.  Common examples of useless quotation are
`[$]$1' (write `$$1'), `[$]var' (use `$var'), etc.  If you add
portability issues to the picture, you'll prefer `${1+"$[@]"}' to
`"[$]@"', and you'll prefer do something better than hacking Autoconf
`:-)'.

   When using `sed', don't use `-e' except for indenting purposes.
With the `s' and `y' commands, the preferred separator is `/' unless
`/' itself might appear in the pattern or replacement, in which case
you should use `|', or optionally `,' 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 `"#$&'()*;<=>?`|~' 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.

   *Note Macro Definitions::, for details on how to define a macro.  If
a macro doesn't use `AC_REQUIRE', is expected to never be the object of
an `AC_REQUIRE' directive, and macros required by other macros inside
arguments do not need to be expanded before this macro, then use
`m4_define'.  In case of doubt, use `AC_DEFUN'.  Also take into account
that public third-party macros need to use `AC_DEFUN' in order to be
found by `aclocal' (*note Extending aclocal: (automake)Extending
aclocal.).  All the `AC_REQUIRE' statements should be at the beginning
of the macro, and each statement should be followed by `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 `])' 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
`configure'; normally, that is not a problem, but if you want to remove
it you can use `[]dnl' on the last line.  You can similarly use `[]dnl'
after a macro call to remove its newline.  `[]dnl' is recommended
instead of `dnl' to ensure that M4 does not interpret the `dnl' as
being attached to the preceding text or macro output.  For example,
instead of:

     AC_DEFUN([AC_PATH_X],
     [AC_MSG_CHECKING([for X])
     AC_REQUIRE_CPP()
     # ...omitted...
       AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
     fi])

you would write:

     AC_DEFUN([AC_PATH_X],
     [AC_REQUIRE_CPP()[]dnl
     AC_MSG_CHECKING([for X])
     # ...omitted...
       AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
     fi[]dnl
     ])# AC_PATH_X

   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
`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:

     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])

and the new way:

     # _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


File: autoconf.info,  Node: Portable Shell,  Next: Portable Make,  Prev: Writing Autoconf Macros,  Up: Top

11 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:

Russ Allbery:

     The GNU assumption that `/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 _never_
     (OK..."never say never") replace the Bourne shell (as `/bin/sh')
     with a Posix shell.

Robert Lipe:

     This is exactly the problem.  While most (at least most System
     V's) do have a Bourne shell that accepts shell functions most
     vendor `/bin/sh' programs are not the Posix shell.

     So while most modern systems do have a shell _somewhere_ that
     meets the Posix standard, the challenge is to find it.

   For this reason, part of the job of M4sh (*note 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 (*note Systemology::); you should not
use aliases, negated character classes, or even `unset'.  `#' 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, `return', `unset', and I/O redirection for builtins.  For
more information, refer to `http://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 *note Shell Functions:: and *note Limitations of Shell
Builtins: Limitations of Builtins.

   Some ancient systems have quite small limits on the length of the
`#!' line; for instance, 32 bytes (not including the newline) on SunOS
4.  However, these ancient systems are no longer of practical concern.

   The set of external programs you should run in a `configure' script
is fairly small.  *Note Utilities in Makefiles: (standards)Utilities in
Makefiles, 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 *note Limitations of Usual Tools::.

   There are other sources of documentation about shells.  The
specification for the Posix Shell Command Language
(http://www.opengroup.org/susv3/utilities/xcu_chap02.html), though more
generous than the restrictive shell subset described above, is fairly
portable nowadays.  Also please see the Shell FAQs
(http://www.faqs.org/faqs/unix-faq/shell/).

* Menu:

* 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
* Slashes::                     Slashes 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


File: autoconf.info,  Node: Shellology,  Next: Invoking the Shell,  Up: Portable Shell

11.1 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
the Shell difference FAQ
(http://www.faqs.org/faqs/unix-faq/shell/shell-differences/) 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.

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:

        - don't use `$?' after expanding empty or unset variables, or
          at the start of an `eval':

               foo=
               false
               $foo
               echo "Do not use it: $?"
               false
               eval 'echo "Do not use it: $?"'

        - don't use command substitution within variable expansion:

               cat ${FOO=`bar`}

        - beware that single builtin substitutions are not performed by
          a subshell, hence their effect applies to the current shell!
          *Note Shell Substitutions::, item "Command Substitution".

Bash
     To detect whether you are running Bash, test whether
     `BASH_VERSION' is set.  To require Posix compatibility, run `set
     -o posix'.  *Note Bash Posix Mode: (bash)Bash POSIX Mode, for
     details.

Bash 2.05 and later
     Versions 2.05 and later of Bash use a different format for the
     output of the `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 `configure', you'll need to use
     Bash 2.05 for all other build tasks as well.

Ksh
     The Korn shell is compatible with the Bourne family and it mostly
     conforms to Posix.  It has two major variants commonly called
     `ksh88' and `ksh93', named after the years of initial release.  It
     is usually called `ksh', but is called `sh' on some hosts if you
     set your path appropriately.

     Solaris systems have three variants: `/usr/bin/ksh' is `ksh88'; it
     is standard on Solaris 2.0 and later.  `/usr/xpg4/bin/sh' is a
     Posix-compliant variant of `ksh88'; it is standard on Solaris 9
     and later.  `/usr/dt/bin/dtksh' is `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.

     Starting with Tru64 Version 4.0, the Korn shell `/usr/bin/ksh' is
     also available as `/usr/bin/posix/sh'.  If the environment
     variable `BIN_SH' is set to `xpg4', subsidiary invocations of the
     standard shell conform to Posix.

Pdksh
     A public-domain clone of the Korn shell called `pdksh' is widely
     available: it has most of the `ksh88' features along with a few of
     its own.  It usually sets `KSH_VERSION', except if invoked as
     `/bin/sh' on OpenBSD, and similarly to Bash you can require Posix
     compatibility by running `set -o posix'.  Unfortunately, with
     `pdksh' 5.2.14 (the latest stable version as of January 2007)
     Posix mode is buggy and causes `pdksh' to depart from Posix in at
     least one respect, see *note Shell Substitutions::.

Zsh
     To detect whether you are running `zsh', test whether
     `ZSH_VERSION' is set.  By default `zsh' is _not_ compatible with
     the Bourne shell: you must execute `emulate sh', and for `zsh'
     versions before 3.1.6-dev-18 you must also set `NULLCMD' to `:'.
     *Note Compatibility: (zsh)Compatibility, for details.

     The default Mac OS X `sh' was originally Zsh; it was changed to
     Bash in Mac OS X 10.2.


File: autoconf.info,  Node: Invoking the Shell,  Next: Here-Documents,  Prev: Shellology,  Up: Portable Shell

11.2 Invoking the Shell
=======================

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 `PATH', and if found it executes that
rather than the original file.  For example, assuming there is a binary
executable `/usr/bin/script' in your `PATH', the last command in the
following example fails because the Korn shell finds `/usr/bin/script'
and refuses to execute it as a shell script:

     $ touch xxyzzyz script
     $ ksh xxyzzyz
     $ ksh ./script
     $ ksh script
     ksh: script: cannot execute

   Bash 2.03 has a bug when invoked with the `-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:

     $ $ bash -c 'echo foo \
     > '
     bash: -c: line 2: syntax error: unexpected end of file
     $ bash -c 'echo foo \
     >  '
     foo

*Note Backslash-Newline-Empty::, for how this can cause problems in
makefiles.


File: autoconf.info,  Node: Here-Documents,  Next: File Descriptors,  Prev: Invoking the Shell,  Up: Portable Shell

11.3 Here-Documents
===================

Don't rely on `\' being preserved just because it has no special
meaning together with the next symbol.  In the native `sh' on OpenBSD
2.7 `\"' expands to `"' in here-documents with unquoted delimiter.  As
a general rule, if `\\' expands to `\' use `\\' to get `\'.

   With OpenBSD 2.7's `sh'

     $ cat <<EOF
     > \" \\
     > EOF
     " \

and with Bash:

     bash-2.04$ cat <<EOF
     > \" \\
     > EOF
     \" \

   Using command substitutions in a here-document that is fed to a shell
function is not portable.  For example, with Solaris 10 `/bin/sh':

     $ kitty () { cat; }
     $ kitty <<EOF
     > `echo ok`
     > EOF
     /tmp/sh199886: cannot open
     $ echo $?
     1

   Some shells mishandle large here-documents: for example, Solaris 10
`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, `${variable}' could be replaced by the expansion of `${ble}'.
If the end of the variable name is aligned with the block boundary, the
shell reports an error, as if you used `${}'.  Instead of
`${variable-default}', the shell may expand `${riable-default}', or
even `${fault}'.  This bug can often be worked around by omitting the
braces: `$variable'.  The bug was fixed in `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, `zsh' up to at least version 4.3.10 creates a file with a single
newline, whereas other shells create an empty file:

     cat >file <<EOF
     EOF

   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 `configure.ac' includes something like:

     if <cross_compiling>; then
       assume this and that
     else
       check this
       check that
       check something else
       ...
       on and on forever
       ...
     fi

   A shell parses the whole `if'/`fi' construct, creating temporary
files for each here-document in it.  Some shells create links for such
here-documents on every `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 `if'/`fi', or creating multiple
`if'/`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 `<<-' to unindent here-documents.  The
behavior is only portable for stripping leading <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).

     $ printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done
     1
      2
     done
     $ printf 'cat <<-x\n 1\n  2\n x\n' | bash-3.2 && echo done
      1
       2
      x
     done


File: autoconf.info,  Node: File Descriptors,  Next: Signal Handling,  Prev: Here-Documents,  Up: Portable Shell

11.4 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:

     $ ash -x -c '(eval "echo foo >&2") 2>stderr'
     $ cat stderr
     + eval echo foo >&2
     + echo foo
     foo
     $ bash -x -c '(eval "echo foo >&2") 2>stderr'
     $ cat stderr
     + eval 'echo foo >&2'
     ++ echo foo
     foo
     $ zsh -x -c '(eval "echo foo >&2") 2>stderr'
     # Traces on startup files deleted here.
     $ cat stderr
     +zsh:1> eval echo foo >&2
     +zsh:1> echo foo
     foo

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 HP-UX, since
its shell mishandles tracing if standard error is redirected first:

     $ sh -x -c ': 2>err >out'
     + :
     + 2> err $ cat err
     1> out

   Don't try to redirect the standard error of a command substitution.
It must be done _inside_ the command substitution.  When running `: `cd
/zorglub` 2>/dev/null' expect the error message to escape, while `: `cd
/zorglub 2>/dev/null`' works properly.

   On the other hand, some shells, such as Solaris or FreeBSD
`/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:
     $ /bin/sh -c 'nosuch 2>/dev/null'
     nosuch: not found
     $ /bin/sh -c '(nosuch) 2>/dev/null'
     $ /bin/sh -c '{ nosuch; } 2>/dev/null'
     $ bash -c 'nosuch 2>/dev/null'

   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: `foo=`cd /zorglub` 2>/dev/null'.

   Some shells, like `ash', don't recognize bi-directional redirection
(`<>').  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:

     $ mkfifo fifo
     $ exec 5<>fifo
     $ echo hi >&5
     bash: echo: write error: Communication error on send

Furthermore, versions of `dash' before 0.5.6 mistakenly truncate
regular files when using `<>':

     $ echo a > file
     $ bash -c ': 1<>file'; cat file
     a
     $ dash -c ': 1<>file'; cat file
     $ rm a

   When catering to old systems, don't redirect the same file descriptor
several times, as you are doomed to failure under Ultrix.

     ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
     UWS V4.4 (Rev. 11)
     $ eval 'echo matter >fullness' >void
     illegal io
     $ eval '(echo matter >fullness)' >void
     illegal io
     $ (eval '(echo matter >fullness)') >void
     Ambiguous output redirect.

In each case the expected result is of course `fullness' containing
`matter' and `void' being empty.  However, this bug is probably not of
practical concern to modern platforms.

   Solaris 10 `sh' will try to optimize away a `:' command (even if it
is redirected) in a loop after the first iteration, or in a shell
function after the first call:

     $ for i in 1 2 3 ; do : >x$i; done
     $ ls x*
     x1
     $ f () { : >$1; }; f y1; f y2; f y3;
     $ ls y*
     y1

As a workaround, `echo' or `eval' can be used.

   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
new process image.  Posix 2008 says this may be done only if the
subsidiary program is set-user-ID or set-group-ID, but HP-UX 11.23 does
it even for ordinary programs, and the next version of Posix will allow
HP-UX behavior.

   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 `exec' in
the shell. In `ksh' as well as HP-UX `sh', file descriptors above 2
which are opened using `exec N>file' are closed by a subsequent `exec'
(such as that involved in the fork-and-exec which runs a program or
script):

     $ echo 'echo hello >&5' >k
     $ /bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
     hello
     $ bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
     hello
     $ ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
     ./k[1]: 5: cannot open [Bad file number]
     $ ksh -c '(ksh ./k) 5>t; cat t'
     hello
     $ ksh -c '{ ksh ./k; } 5>t; cat t'
     hello
     $ ksh -c '5>t ksh ./k; cat t
     hello

   Don't rely on duplicating a closed file descriptor to cause an
error.  With Solaris `/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:

     $ bash -c 'echo hi >&3' 3>&-; echo $?
     bash: 3: Bad file descriptor
     1
     $ /bin/sh -c 'echo hi >&3' 3>&-; echo $?
     hi
     0

   Fortunately, an attempt to close an already closed file descriptor
will portably succeed.  Likewise, it is safe to use either style of
`N<&-' or `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 `mv foo
bar >foo' or `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 `/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.  Solaris `ksh' doesn't understand any file descriptor
larger than `9':

     $ bash -c 'exec 10>&-'; echo $?
     0
     $ ksh -c 'exec 9>&-'; echo $?
     0
     $ ksh -c 'exec 10>&-'; echo $?
     ksh[1]: exec: 10: not found
     127


File: autoconf.info,  Node: Signal Handling,  Next: File System Conventions,  Prev: File Descriptors,  Up: Portable Shell

11.5 Signal Handling
====================

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
this article (http://www.cons.org/cracauer/sigint.html).

   Solaris 10 `/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):

     $ bash -c 'kill -1 $$'; echo $? # Will exit 128 + (signal number).
     Hangup
     129
     $ /bin/ksh -c 'kill -15 $$'; echo $? # Likewise.
     Terminated
     143
     $ for sig in 1 2 3 15; do
     >   echo $sig:
     >   /bin/sh -c "kill -$s \$\$"; echo $?
     > done
     signal 1:
     Hangup
     129
     signal 2:
     208
     signal 3:
     208
     signal 15:
     208

   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.

     $ 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
     $ cc -o foo foo.c
     $ ./a.out # On GNU/Linux
     Terminated by signal: no
     Exited normally: yes
     $ ./a.out # On Solaris 10
     Terminated by signal: yes
     Exited normally: no

   Various shells seem to handle `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 onwards), Zsh 4.3.12,
Solaris 10 `/bin/ksh' and `/usr/xpg4/bin/sh', and AT&T `ksh93' (2011).
Still, `SIGQUIT' seems to be trappable quite portably within all these
shells.  OTOH, some other shells doesn't special-case the handling of
`SIGQUIT'; among these shells are at least `pdksh' 5.2.14, Solaris 10
and NetBSD 5.1 `/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 `perl -e 'kill 2, $$'',
after the perl process has been interrupted AT&T `ksh93' (2011) will
proceed to send itself a `SIGINT', while Solaris 10 `/bin/ksh' and
`/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 `SIGINT',
those shells will correctly execute it.

   Some Korn shells, when a child process die due receiving a signal
with signal number N, can leave in `$?' an exit status of 256+N instead
of the more common 128+N.  Observe the difference between AT&T `ksh93'
(2011) and `bash' 4.1.5 on Debian:

     $ /bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'
     /bin/ksh: line 1: 7837: Hangup
     257
     $ /bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'
     /bin/bash: line 1:  7861 Hangup        (sh -c "kill -1 \$\$")
     129

This `ksh' behavior is allowed by POSIX, if implemented with due care;
see this Austin Group discussion
(http://www.austingroupbugs.net/view.php?id=51) 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:

     #!/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

If `wrapped_command' is interrupted by a `SIGHUP' (which has signal
number 1), `ret' will be set to 257.  Unless the `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 `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 `ksh93' (2011) and `bash' 4.1.5 on Debian:

     $ cat foo.sh
     #!/bin/sh
     sh -c 'kill -1 $$'
     ret=$?
     echo $ret
     exit $ret
     $ /bin/ksh foo.sh; echo $?
     foo.sh: line 2: 12479: Hangup
     257
     1
     $ /bin/bash foo.sh; echo $?
     foo.sh: line 2: 12487 Hangup        (sh -c 'kill -1 $$')
     129
     129


File: autoconf.info,  Node: File System Conventions,  Next: Shell Pattern Matching,  Prev: Signal Handling,  Up: Portable Shell

11.6 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:

     " # $ & ' ( ) * ; < = > ? [ \ ` |

   Also, file names should not begin with `~' or `-', and should
contain neither `-' immediately after `/' nor `~' immediately after
`:'.  On Posix-like platforms, directory names should not contain `:',
as this runs afoul of `:' 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, `!' and `^' are special too, so they
should be avoided.

   Posix lets implementations treat leading `//' specially, but
requires leading `///' and beyond to be equivalent to `/'.  Most Unix
variants treat `//' like `/'.  However, some treat `//' as a
"super-root" that can provide access to files that are not otherwise
reachable from `/'.  The super-root tradition began with Apollo
Domain/OS, which died out long ago, but unfortunately Cygwin has
revived it.

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

For example, the following code:

     case $foo_dir in
       /*) # Absolute
          ;;
       *)
          foo_dir=$dots$foo_dir ;;
     esac

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 `a:\b'), you can
check for absolute file names like this:

     case $foo_dir in
       [\\/]* | ?:[\\/]* ) # Absolute
          ;;
       *)
          foo_dir=$dots$foo_dir ;;
     esac

Make sure you quote the brackets if appropriate and keep the backslash
as first character (*note Limitations of Shell Builtins: case.).

   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 `PATH_SEPARATOR' output variable instead.
`configure' sets this to the appropriate value for the build system
(`:' or `;') when it starts up.

   File names need extra care as well.  While DOS variants that are
Posixy enough to run `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 doschk
(ftp://ftp.gnu.org/gnu/non-gnu/doschk/doschk-1.1.tar.gz) 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.

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 `autoconf' uses a .in suffix for template
     files.

     This is perfectly OK on Posix variants:

          AC_CONFIG_HEADERS([config.h])
          AC_CONFIG_FILES([source.c foo.bar])
          AC_OUTPUT

     but it causes problems on DOS, as it requires `config.h.in',
     `source.c.in' and `foo.bar.in'.  To make your package more portable
     to DOS-based environments, you should use this instead:

          AC_CONFIG_HEADERS([config.h:config.hin])
          AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
          AC_OUTPUT

No leading dot (SFN)
     DOS cannot handle file names that start with a dot.  This is
     usually not important for `autoconf'.

Case insensitivity (LFN)
     DOS is case insensitive, so you cannot, for example, have both a
     file called `INSTALL' and a directory called `install'.  This also
     affects `make'; if there's a file called `INSTALL' in the
     directory, `make install' does nothing (unless the `install'
     target is marked as PHONY).

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 `foobar-part1.c', `foobar-part2.c' and
     `foobar-prettybird.c' all resolve to the same file name
     (`FOOBAR-P.C').  The same goes for `foo.bar' and `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.

Invalid characters (LFN)
     Some characters are invalid in DOS file names, and should therefore
     be avoided.  In a LFN environment, these are `/', `\', `?', `*',
     `:', `<', `>', `|' and `"'.  In a SFN environment, other
     characters are also invalid.  These include `+', `,', `[' and `]'.

Invalid names (LFN)
     Some DOS file names are reserved, and cause problems if you try to
     use files with those names.  These names include `CON', `AUX',
     `COM1', `COM2', `COM3', `COM4', `LPT1', `LPT2', `LPT3', `NUL', and
     `PRN'.  File names are case insensitive, so even names like
     `aux/config.guess' are disallowed.



File: autoconf.info,  Node: Shell Pattern Matching,  Next: Shell Substitutions,  Prev: File System Conventions,  Up: Portable Shell

11.7 Shell Pattern Matching
===========================

Nowadays portable patterns can use negated character classes like
`[!-aeiou]'.  The older syntax `[^-aeiou]' is supported by some shells
but not others; hence portable scripts should never use `^' as the
first character of a bracket pattern.

   Outside the C locale, patterns like `[a-z]' are problematic since
they may match characters that are not lower-case letters.


File: autoconf.info,  Node: Shell Substitutions,  Next: Assignments,  Prev: Shell Pattern Matching,  Up: Portable Shell

11.8 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
`case'.  For instance, the following code:

     case "$given_srcdir" in
     .)  top_srcdir="`echo "$dots" | sed 's|/$||'`" ;;
     *)  top_srcdir="$dots$given_srcdir" ;;
     esac

is more readable when written as:

     case $given_srcdir in
     .)  top_srcdir=`echo "$dots" | sed 's|/$||'` ;;
     *)  top_srcdir=$dots$given_srcdir ;;
     esac

and in fact it is even _more_ portable: in the first case of the first
attempt, the computation of `top_srcdir' is not portable, since not all
shells properly understand `"`..."..."...`"', for example Solaris 10
ksh:

     $ foo="`echo " bar" | sed 's, ,,'`"
     ksh: : cannot execute
     ksh: bar | sed 's, ,,': cannot execute

Posix does not specify behavior for this sequence.  On the other hand,
behavior for `"`...\"...\"...`"' 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:

     $ echo "`echo \"hello\"`"
     hello
     $ set -o posix
     $ echo "`echo \"hello\"`"
     "hello"

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 `-', since word splitting collapses multiple spaces in `$f' but
leaves empty arguments intact.

     $ bash -c 'n() { echo "$#$@"; }; f="  -  "; n - ""$f"" -'
     3- - -
     $ ksh -c 'n() { echo "$#$@"; }; f="  -  "; n - ""$f"" -'
     5-  -  -
     $ zsh -c 'n() { echo "$#$@"; }; f="  -  "; n - ""$f"" -'
     3-   -   -
     $ zsh -c 'emulate sh;
     > n() { echo "$#$@"; }; f="  -  "; n - ""$f"" -'
     5-  -  -

You can work around this by doing manual word splitting, such as using
`"$str" $list' rather than `"$str"$list'.

   There are also portability pitfalls with particular expansions:

`$@'
     One of the most famous shell-portability issues is related to
     `"$@"'.  When there are no positional arguments, Posix says that
     `"$@"' is supposed to be equivalent to nothing, but the original
     Unix version 7 Bourne shell treated it as equivalent to `""'
     instead, and this behavior survives in later implementations like
     Digital Unix 5.0.

     The traditional way to work around this portability problem is to
     use `${1+"$@"}'.  Unfortunately this method does not work with Zsh
     (3.x and 4.x), which is used on Mac OS X.  When emulating the
     Bourne shell, Zsh performs word splitting on `${1+"$@"}':

          zsh $ emulate sh
          zsh $ for i in "$@"; do echo $i; done
          Hello World
          !
          zsh $ for i in ${1+"$@"}; do echo $i; done
          Hello
          World
          !

     Zsh handles plain `"$@"' properly, but we can't use plain `"$@"'
     because of the portability problems mentioned above.  One
     workaround relies on Zsh's "global aliases" to convert `${1+"$@"}'
     into `"$@"' by itself:

          test "${ZSH_VERSION+set}" = set && alias -g '${1+"$@"}'='"$@"'

     Zsh only recognizes this alias when a shell word matches it
     exactly; `"foo"${1+"$@"}' remains subject to word splitting.
     Since this case always yields at least one shell word, use plain
     `"$@"'.

     A more conservative workaround is to avoid `"$@"' if it is
     possible that there may be no positional arguments.  For example,
     instead of:

          cat conftest.c "$@"

     you can use this instead:

          case $# in
          0) cat conftest.c;;
          *) cat conftest.c "$@";;
          esac

     Autoconf macros often use the `set' command to update `$@', so if
     you are writing shell code intended for `configure' you should not
     assume that the value of `$@' persists for any length of time.

`${10}'
     The 10th, 11th, ... positional parameters can be accessed only
     after a `shift'.  The 7th Edition shell reported an error if given
     `${10}', and Solaris 10 `/bin/sh' still acts that way:

          $ set 1 2 3 4 5 6 7 8 9 10
          $ echo ${10}
          bad substitution

     Conversely, not all shells obey the Posix rule that when braces are
     omitted, multiple digits beyond a `$' imply the single-digit
     positional parameter expansion concatenated with the remaining
     literal digits.  To work around the issue, you must use braces.

          $ bash -c 'set a b c d e f g h i j; echo $10 ${1}0'
          a0 a0
          $ dash -c 'set a b c d e f g h i j; echo $10 ${1}0'
          j a0

`${VAR:-VALUE}'
     Old BSD shells, including the Ultrix `sh', don't accept the colon
     for any shell substitution, and complain and die.  Similarly for
     ${VAR:=VALUE}, ${VAR:?VALUE}, etc.  However, all shells that
     support functions allow the use of colon in shell substitution,
     and since m4sh requires functions, you can portably use null
     variable substitution patterns in configure scripts.

`${VAR+VALUE}'
     When using `${VAR-VALUE}' or `${VAR-VALUE}' for providing
     alternate substitutions, VALUE must either be a single shell word,
     quoted, or in the context of an unquoted here-document.  Solaris
     `/bin/sh' complains otherwise.

          $ /bin/sh -c 'echo ${a-b c}'
          /bin/sh: bad substitution
          $ /bin/sh -c 'echo ${a-'\''b c'\''}'
          b c
          $ /bin/sh -c 'echo "${a-b c}"'
          b c
          $ /bin/sh -c 'cat <<EOF
          ${a-b c}
          EOF
          b c

     According to Posix, if an expansion occurs inside double quotes,
     then the use of unquoted double quotes within 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:

          $ /bin/sh -c 'echo "${a-"b  c"}"'
          /bin/sh: bad substitution
          $ ksh -c 'echo "${a-"b  c"}"'
          b c
          $ bash -c 'echo "${a-"b  c"}"'
          b  c
          $ /bin/sh -c 'a=; echo ${a+'\''b  c'\''}'
          b  c
          $ /bin/sh -c 'a=; echo "${a+'\''b  c'\''}"'
          'b  c'
          $ /bin/sh -c 'a=; echo "${a+\"b  c\"}"'
          "b  c"
          $ /bin/sh -c 'a=; echo "${a+b  c}"'
          b  c
          $ /bin/sh -c 'cat <<EOF
          ${a-"b  c"}
          EOF'
          "b  c"
          $ /bin/sh -c 'cat <<EOF
          ${a-'b  c'}
          EOF'
          'b  c'
          $ bash -c 'cat <<EOF
          ${a-"b  c"}
          EOF'
          b  c
          $ bash -c 'cat <<EOF
          ${a-'b  c'}
          EOF'
          'b  c'

     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 `$t' as the VALUE, rather than trying to inline
     the expression needing quoting.

          $ /bin/sh -c 't="b  c\"'\''}\\"; echo "${a-$t}"'
          b  c"'}\
          $ ksh -c 't="b  c\"'\''}\\"; echo "${a-$t}"'
          b  c"'}\
          $ bash -c 't="b  c\"'\''}\\"; echo "${a-$t}"'
          b  c"'}\

`${VAR=VALUE}'
     When using `${VAR=VALUE}' to assign a default value to VAR,
     remember that even though the assignment to 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 `:' followed by unquoted variable expansion for the
     side effect of setting a default value, if the final value of
     `$var' contains any globbing characters (either from 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 VALUE.

          $ time bash -c ': "${a=/usr/bin/*}"; echo "$a"'
          /usr/bin/*

          real	0m0.005s
          user	0m0.002s
          sys	0m0.003s
          $ time bash -c ': ${a=/usr/bin/*}; echo "$a"'
          /usr/bin/*

          real	0m0.039s
          user	0m0.026s
          sys	0m0.009s
          $ time bash -c 'a=/usr/bin/*; : ${a=noglob}; echo "$a"'
          /usr/bin/*

          real	0m0.031s
          user	0m0.020s
          sys	0m0.010s

          $ time bash -c 'a=/usr/bin/*; : "${a=noglob}"; echo "$a"'
          /usr/bin/*

          real	0m0.006s
          user	0m0.002s
          sys	0m0.003s

     As with `+' and `-', you must use quotes when using `=' if the
     VALUE contains more than one shell word; either single quotes for
     just the VALUE, or double quotes around the entire expansion:

          $ : ${var1='Some words'}
          $ : "${var2=like this}"
          $ echo $var1 $var2
          Some words like this

     otherwise some shells, such as Solaris `/bin/sh' or on Digital
     Unix V 5.0, die because of a "bad substitution".  Meanwhile, Posix
     requires that with `=', quote removal happens prior to the
     assignment, and the expansion be the final contents of VAR without
     quoting (and thus subject to field splitting), in contrast to the
     behavior with `-' passing the quoting through to the final
     expansion.  However, `bash' 4.1 does not obey this rule.

          $ ksh -c 'echo ${var-a\ \ b}'
          a  b
          $ ksh -c 'echo ${var=a\ \ b}'
          a b
          $ bash -c 'echo ${var=a\ \ b}'
          a  b

     Finally, Posix states that when mixing `${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:

          $ bash -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
          +b+b+
          -b-
          $ /bin/sh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
          ++b+
          --
          $ ksh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
          +b+b+
          --

`${VAR=VALUE}'
     Solaris `/bin/sh' has a frightening bug in its handling of literal
     assignments.  Imagine you need set a variable to a string
     containing `}'.  This `}' character confuses Solaris `/bin/sh'
     when the affected variable was already set.  This bug can be
     exercised by running:

          $ unset foo
          $ foo=${foo='}'}
          $ echo $foo
          }
          $ foo=${foo='}'   # no error; this hints to what the bug is
          $ echo $foo
          }
          $ foo=${foo='}'}
          $ echo $foo
          }}
           ^ ugh!

     It seems that `}' is interpreted as matching `${', 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.

`${VAR=EXPANDED-VALUE}'
     On Ultrix, running

          default="yu,yaa"
          : ${var="$default"}

     sets VAR to `M-yM-uM-,M-yM-aM-a', i.e., the 8th bit of each char
     is set.  You don't observe the phenomenon using a simple `echo
     $var' since apparently the shell resets the 8th bit when it
     expands $var.  Here are two means to make this shell confess its
     sins:

          $ cat -v <<EOF
          $var
          EOF

     and

          $ set | grep '^var=' | cat -v

     One classic incarnation of this bug is:

          default="a b c"
          : ${list="$default"}
          for c in $list; do
            echo $c
          done

     You'll get `a b c' on a single line.  Why?  Because there are no
     spaces in `$list': there are `M- ', i.e., spaces with the 8th bit
     set, hence no IFS splitting is performed!!!

     One piece of good news is that Ultrix works fine with `:
     ${list=$default}'; i.e., if you _don't_ quote.  The bad news is
     then that QNX 4.25 then sets LIST to the _last_ item of DEFAULT!

     The portable way out consists in using a double assignment, to
     switch the 8th bit twice on Ultrix:

          list=${list="$default"}

     ...but beware of the `}' bug from Solaris (see above).  For safety,
     use:

          test "${var+set}" = set || var={VALUE}

`${#VAR}'
`${VAR%WORD}'
`${VAR%%WORD}'
`${VAR#WORD}'
`${VAR##WORD}'
     Posix requires support for these usages, but they do not work with
     many traditional shells, e.g., Solaris 10 `/bin/sh'.

     Also, `pdksh' 5.2.14 mishandles some WORD forms.  For example if
     `$1' is `a/b' and `$2' is `a', then `${1#$2}' should yield `/b',
     but with `pdksh' it yields the empty string.

``COMMANDS`'
     Posix requires shells to trim all trailing newlines from command
     output before substituting it, so assignments like `dir=`echo
     "$file" | tr a A`' do not work as expected if `$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 `cd' is silent, do not
     use `test -z "`cd /`"' because the following can happen:

          $ pwd
          /tmp
          $ test -z "`cd /`" && pwd
          /

     The result of `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:

          $ echo "`printf 'foo\r\n'` bar" > broken
          $ echo "`printf 'foo\r\n'`"" bar" | cmp - broken
          - broken differ: char 4, line 1

     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:

          $ sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'
          $ ^C
          sh: test: hi: unexpected operator/operand

     You can avoid this by assigning the command substitution to a
     temporary variable:

          $ sh -c 'res=`sleep 5; echo hi`
                   if test "x$res" = xhi; then echo yes; fi'
          $ ^C

`$(COMMANDS)'
     This construct is meant to replace ``COMMANDS`', and it has most
     of the problems listed under ``COMMANDS`'.

     This construct can be nested while this is impossible to do
     portably with back quotes.  Unfortunately it is not yet
     universally supported.  Most notably, even recent releases of
     Solaris don't support it:

          $ showrev -c /bin/sh | grep version
          Command version: SunOS 5.10 Generic 121005-03 Oct 2006
          $ echo $(echo blah)
          syntax error: `(' unexpected

     nor does IRIX 6.5's Bourne shell:
          $ uname -a
          IRIX firebird-image 6.5 07151432 IP22
          $ echo $(echo blah)
          $(echo blah)

     If you do use `$(COMMANDS)', make sure that the commands do not
     start with a parenthesis, as that would cause confusion with a
     different notation `$((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 COMMANDS that contain unbalanced parentheses in
     here-documents, comments, or case statement patterns, as many
     shells mishandle them.  For example, Bash 3.1, `ksh88', `pdksh'
     5.2.14, and Zsh 4.2.6 all mishandle the following valid command:

          echo $(case x in x) echo hello;; esac)

`$((EXPRESSION))'
     Arithmetic expansion is not portable as some shells (most notably
     Solaris 10 `/bin/sh') don't support it.

     Among shells that do support `$(( ))', not all of them obey the
     Posix rule that octal and hexadecimal constants must be recognized:

          $ bash -c 'echo $(( 010 + 0x10 ))'
          24
          $ zsh -c 'echo $(( 010 + 0x10 ))'
          26
          $ zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'
          24
          $ pdksh -c 'echo $(( 010 + 0x10 ))'
          pdksh:  010 + 0x10 : bad number `0x10'
          $ pdksh -c 'echo $(( 010 ))'
          10

     When it is available, using arithmetic expansion provides a
     noticeable speedup in script execution; but testing for support
     requires `eval' to avoid syntax errors.  The following construct
     is used by `AS_VAR_ARITH' to provide arithmetic computation when
     all arguments are provided in decimal and without a leading zero,
     and all operators are properly quoted and appear as distinct
     arguments:

          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

`^'
     Always quote `^', otherwise traditional shells such as `/bin/sh'
     on Solaris 10 treat this like `|'.



File: autoconf.info,  Node: Assignments,  Next: Parentheses,  Prev: Shell Substitutions,  Up: Portable Shell

11.9 Assignments
================

When setting several variables in a row, be aware that the order of the
evaluation is undefined.  For instance `foo=1 foo=2; echo $foo' gives
`1' with Solaris `/bin/sh', but `2' with Bash.  You must use `;' to
enforce the order: `foo=1; foo=2; echo $foo'.

   Don't rely on the following to find `subdir/program':

     PATH=subdir$PATH_SEPARATOR$PATH program

as this does not work with Zsh 3.0.6.  Use something like this instead:

     (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)

   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:

     $ false || foo=bar; echo $?
     1
     $ false || foo=`:`; echo $?
     0

and to make things even worse, QNX 4.25 just sets the exit status to 0
in any case:

     $ foo=`exit 1`; echo $?
     0

   To assign default values, follow this algorithm:

  1. If the default value is a literal and does not contain any closing
     brace, use:

          : "${var='my literal'}"

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

          : ${var="$default"}

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

          var=${var="$default"}

  4. If the default value contains a closing brace, then use:

          test "${var+set}" = set || var="has a '}'"

   In most cases `var=${var="$default"}' is fine, but in case of doubt,
just use the last form.  *Note Shell Substitutions::, items
`${VAR:-VALUE}' and `${VAR=VALUE}' for the rationale.


File: autoconf.info,  Node: Parentheses,  Next: Slashes,  Prev: Assignments,  Up: Portable Shell

11.10 Parentheses in Shell Scripts
==================================

Beware of two opening parentheses in a row, as many shell
implementations treat them specially, and Posix says that a portable
script cannot use `((' outside the `$((' form used for shell
arithmetic.  In traditional shells, `((cat))' behaves like `(cat)'; but
many shells, including Bash and the Korn shell, treat `((cat))' as an
arithmetic expression equivalent to `let "cat"', and may or may not
report an error when they detect that `cat' is not a number.  As another
example, `pdksh' 5.2.14 does not treat the following code as a
traditional shell would:

     if ((true) || false); then
       echo ok
     fi

To work around this problem, insert a space between the two opening
parentheses.  There is a similar problem and workaround with `$(('; see
*note Shell Substitutions::.


File: autoconf.info,  Node: Slashes,  Next: Special Shell Variables,  Prev: Parentheses,  Up: Portable Shell

11.11 Slashes in Shell Scripts
==============================

Unpatched Tru64 5.1 `sh' omits the last slash of command-line arguments
that contain two trailing slashes:

     $ echo / // /// //// .// //.
     / / // /// ./ //.
     $ x=//
     $ eval "echo \$x"
     /
     $ set -x
     $ echo abc | tr -t ab //
     + echo abc
     + tr -t ab /
     /bc

   Unpatched Tru64 4.0 `sh' adds a slash after `"$var"' if the variable
is empty and the second double-quote is followed by a word that begins
and ends with slash:

     $ sh -xc 'p=; echo "$p"/ouch/'
     p=
     + echo //ouch/
     //ouch/

   However, our understanding is that patches are available, so perhaps
it's not worth worrying about working around these horrendous bugs.


File: autoconf.info,  Node: Special Shell Variables,  Next: Shell Functions,  Prev: Slashes,  Up: Portable Shell

11.12 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 `/bin/sh' that does not support `unset'.  (*note
Portable Shell Programming: Portable Shell.).

   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 `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
`status' and names containing only upper-case letters and underscores.

`?'
     Not all shells correctly reset `$?' after conditionals (*note
     Limitations of Shell Builtins: if.).  Not all shells manage `$?'
     correctly in shell functions (*note Shell Functions::) or in traps
     (*note Limitations of Shell Builtins: trap.).  Not all shells reset
     `$?' to zero after an empty command.

          $ bash -c 'false; $empty; echo $?'
          0
          $ zsh -c 'false; $empty; echo $?'
          1

`_'
     Many shells reserve `$_' for various purposes, e.g., the name of
     the last command executed.

`BIN_SH'
     In Tru64, if `BIN_SH' is set to `xpg4', subsidiary invocations of
     the standard shell conform to Posix.

`CDPATH'
     When this variable is set it specifies a list of directories to
     search when invoking `cd' with a relative file name that did not
     start with `./' or `../'.  Posix 1003.1-2001 says that if a
     nonempty directory name from `CDPATH' is used successfully, `cd'
     prints the resulting absolute file name.  Unfortunately this
     output can break idioms like `abs=`cd src && pwd`' because `abs'
     receives the name twice.  Also, many shells do not conform to this
     part of Posix; for example, `zsh' prints the result only if a
     directory name other than `.' was chosen from `CDPATH'.

     In practice the shells that have this problem also support
     `unset', so you can work around the problem as follows:

          (unset CDPATH) >/dev/null 2>&1 && unset CDPATH

     You can also avoid output by ensuring that your directory name is
     absolute or anchored at `./', as in `abs=`cd ./src && pwd`'.

     Configure scripts use M4sh, which automatically unsets `CDPATH' if
     possible, so you need not worry about this problem in those
     scripts.

`CLICOLOR_FORCE'
     When this variable is set, some implementations of tools like `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.

`DUALCASE'
     In the MKS shell, case statements and file name generation are
     case-insensitive unless `DUALCASE' is nonzero.  Autoconf-generated
     scripts export this variable when they start up.

`ENV'
`MAIL'
`MAILPATH'
`PS1'
`PS2'
`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 `PS1' with a side
     effect can unexpectedly modify `$?'.  To work around this bug,
     M4sh scripts (including `configure' scripts) do something like
     this:

          (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
          PS1='$ '
          PS2='> '
          PS4='+ '

     (actually, there is some complication due to bugs in `unset';
     *note Limitations of Shell Builtins: unset.).

`FPATH'
     The Korn shell uses `FPATH' to find shell functions, so avoid
     `FPATH' in portable scripts.  `FPATH' is consulted after `PATH',
     but you still need to be wary of tests that use `PATH' to find
     whether a command exists, since they might report the wrong result
     if `FPATH' is also set.

`GREP_OPTIONS'
     When this variable is set, some implementations of `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.

`IFS'
     Long ago, shell scripts inherited `IFS' from the environment, but
     this caused many problems so modern shells ignore any environment
     settings for `IFS'.

     Don't set the first character of `IFS' to backslash.  Indeed,
     Bourne shells use the first character (backslash) when joining the
     components in `"$@"' and some shells then reinterpret (!) the
     backslash escapes, so you can end up with backspace and other
     strange characters.

     The proper value for `IFS' (in regular code, not when performing
     splits) is `<SPC><TAB><RET>'.  The first character is especially
     important, as it is used to join the arguments in `$*'; however,
     note that traditional shells, but also bash-2.04, fail to adhere
     to this and join with a space anyway.

     M4sh guarantees that `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 `IFS' in order to split on another character,
     but remember to restore it before expanding further macros.

     Unsetting `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:

          unset IFS
          # default separators used for field splitting

          save_IFS=$IFS
          IFS=:
          # ...
          IFS=$save_IFS
          # no field splitting performed

`LANG'
`LC_ALL'
`LC_COLLATE'
`LC_CTYPE'
`LC_MESSAGES'
`LC_MONETARY'
`LC_NUMERIC'
`LC_TIME'
     You should set all these variables to `C' because so much
     configuration code assumes the C locale and Posix requires that
     locale environment variables be set to `C' if the C locale is
     desired; `configure' scripts and M4sh do that for you.  Export
     these variables after setting them.

`LANGUAGE'
     `LANGUAGE' is not specified by Posix, but it is a GNU extension
     that overrides `LC_ALL' in some cases, so you (or M4sh) should set
     it too.

`LC_ADDRESS'
`LC_IDENTIFICATION'
`LC_MEASUREMENT'
`LC_NAME'
`LC_PAPER'
`LC_TELEPHONE'
     These locale environment variables are GNU extensions.  They are
     treated like their Posix brethren (`LC_COLLATE', etc.) as
     described above.

`LINENO'
     Most modern shells provide the current line number in `LINENO'.
     Its value is the line number of the beginning of the current
     command.  M4sh, and hence Autoconf, attempts to execute
     `configure' with a shell that supports `LINENO'.  If no such shell
     is available, it attempts to implement `LINENO' with a Sed prepass
     that replaces each instance of the string `$LINENO' (not followed
     by an alphanumeric character) with the line's number.  In M4sh
     scripts you should execute `AS_LINENO_PREPARE' so that these
     workarounds are included in your script; configure scripts do this
     automatically in `AC_INIT'.

     You should not rely on `LINENO' within `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 `$LINENO' substitutions within that
     command.  Also, the possibility of the Sed prepass means that you
     should not rely on `$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 `$LINENO' do not have
     deterministic values:

          $ 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
          $ 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
          $ 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
          $ 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
          $ sed '=' <lineno |
          >   sed '
          >     N
          >     s,$,-,
          >     t loop
          >     :loop
          >     s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,
          >     t loop
          >     s,-$,,
          >     s,^[0-9]*\n,,
          >   ' |
          >   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

     In particular, note that `config.status' (and any other subsidiary
     script created by `AS_INIT_GENERATED') might report line numbers
     relative to the parent script as a result of the potential Sed
     pass.

`NULLCMD'
     When executing the command `>foo', `zsh' executes `$NULLCMD >foo'
     unless it is operating in Bourne shell compatibility mode and the
     `zsh' version is newer than 3.1.6-dev-18.  If you are using an
     older `zsh' and forget to set `NULLCMD', your script might be
     suspended waiting for data on its standard input.

`options'
     For `zsh' 4.3.10, `options' is treated as an associative array
     even after `emulate sh', so it should not be used.

`PATH_SEPARATOR'
     On DJGPP systems, the `PATH_SEPARATOR' environment variable can be
     set to either `:' or `;' to control the path separator Bash uses
     to set up certain environment variables (such as `PATH').  You can
     set this variable to `;' if you want `configure' to use `;' as a
     separator; this might be useful if you plan to use non-Posix
     shells to execute files.  *Note File System Conventions::, for
     more information about `PATH_SEPARATOR'.

`POSIXLY_CORRECT'
     In the GNU environment, exporting `POSIXLY_CORRECT' with any value
     (even empty) causes programs to try harder to conform to Posix.
     Autoconf does not directly manipulate this variable, but `bash'
     ties the shell variable `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 `bash' is in
     Posix mode.

          $ bash --posix -c 'set -o | grep posix
          > unset POSIXLY_CORRECT
          > set -o | grep posix'
          posix           on
          posix           off

`PWD'
     Posix 1003.1-2001 requires that `cd' and `pwd' must update the
     `PWD' environment variable to point to the logical name of the
     current directory, but traditional shells do not support this.
     This can cause confusion if one shell instance maintains `PWD' but
     a subsidiary and different shell does not know about `PWD' and
     executes `cd'; in this case `PWD' points to the wrong directory.
     Use ``pwd`' rather than `$PWD'.

`RANDOM'
     Many shells provide `RANDOM', a variable that returns a different
     integer each time it is used.  Most of the time, its value does not
     change when it is not used, but on IRIX 6.5 the value changes all
     the time.  This can be observed by using `set'.  It is common
     practice to use `$RANDOM' as part of a file name, but code
     shouldn't rely on `$RANDOM' expanding to a nonempty string.

`status'
     This variable is an alias to `$?' for `zsh' (at least 3.1.6),
     hence read-only.  Do not use it.


File: autoconf.info,  Node: Shell Functions,  Next: Limitations of Builtins,  Prev: Special Shell Variables,  Up: Portable Shell

11.13 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 `)' after the function name and the start of the compound
expression, to avoid upsetting `ksh'.  While it is possible to use any
compound command, most scripts use `{...}'.

     $ /bin/sh -c 'a(){ echo hi;}; a'
     hi
     $ ksh -c 'a(){ echo hi;}; a'
     ksh: syntax error at line 1: `}' unexpected
     $ ksh -c 'a() { echo hi;}; a'
     hi

   Inside a shell function, you should not rely on the error status of a
subshell if the last command of that subshell was `exit' or `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 `$?' is not reliable when entering a shell
function.  This has the effect that using a function as the first
command in a `trap' handler can cause problems.

     $ bash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
     2
     2
     $ ash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
     0
     2

   DJGPP bash 2.04 has a bug in that `return' from a shell function
which also used a command substitution causes a segmentation fault.  To
work around the issue, you can use `return' from a subshell, or
`AS_SET_STATUS' as last command in the execution flow of the function
(*note Common Shell Constructs::).

   Not all shells treat shell functions as simple commands impacted by
`set -e', for example with Solaris 10 `/bin/sh':

     $ bash -c 'f() { return 1; }; set -e; f; echo oops'
     $ /bin/sh -c 'f() { return 1; }; set -e; f; echo oops'
     oops

   Shell variables and functions may share the same namespace, for
example with Solaris 10 `/bin/sh':

     $ f () { :; }; f=; f
     f: not found

For this reason, Autoconf (actually M4sh, *note Programming in M4sh::)
uses the prefix `as_fn_' for its functions.

   Handling of positional parameters and shell options varies among
shells.  For example, Korn shells reset and restore trace output (`set
-x') and other options upon function entry and exit.  Inside a function,
IRIX sh sets `$0' to the function name.

   It is not portable to pass temporary environment variables to shell
functions.  Solaris `/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.

     $ /bin/sh -c 'func() { echo $a;}; a=1 func; echo $a'
     =>
     =>
     $ ash -c 'func() { echo $a;}; a=1 func; echo $a'
     =>1
     =>
     $ bash -c 'set -o posix; func() { echo $a;}; a=1 func; echo $a'
     =>1
     =>1

   Some ancient Bourne shell variants with function support did not
reset `$I, 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 `trap' on 0 installed in a shell function triggers at
function exit rather than at script exit.  *Note Limitations of Shell
Builtins: trap.


File: autoconf.info,  Node: Limitations of Builtins,  Next: Limitations of Usual Tools,  Prev: Shell Functions,  Up: Portable Shell

11.14 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 `echo "$word"'
can give unexpected results when `word' starts with a dash.  It is
often possible to avoid this problem using `echo "x$word"', taking the
`x' into account later in the pipe.  Many of these limitations can be
worked around using M4sh (*note Programming in M4sh::).

`.'
     Use `.' only with regular files (use `test -f').  Bash 2.03, for
     instance, chokes on `. /dev/null'.  Remember that `.' uses `PATH'
     if its argument contains no slashes.  Also, some shells, including
     bash 3.2, implicitly append the current directory to this `PATH'
     search, even though Posix forbids it.  So if you want to use `.'
     on a file `foo' in the current directory, you must use `. ./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, `zsh' 4.3.10 has a bug where it
     fails to react to the syntax error.

          $ echo 'fi' > syntax
          $ bash -c '. ./syntax; echo $?'
          ./syntax: line 1: syntax error near unexpected token `fi'
          ./syntax: line 1: `fi'
          1
          $ ash -c '. ./syntax; echo $?'
          ./syntax: 1: Syntax error: "fi" unexpected
          $ zsh -c '. ./syntax; echo $?'
          ./syntax:1: parse error near `fi'
          0

`!'
     The Unix version 7 shell did not support negating the exit status
     of commands with `!', and this feature is still absent from some
     shells (e.g., Solaris `/bin/sh').  Other shells, such as FreeBSD
     `/bin/sh' or `ash', have bugs when using `!':

          $ sh -c '! : | :'; echo $?
          1
          $ ash -c '! : | :'; echo $?
          0
          $ sh -c '! { :; }'; echo $?
          1
          $ ash -c '! { :; }'; echo $?
          {: not found
          Syntax error: "}" unexpected
          2

     Shell code like this:

          if ! cmp file1 file2 >/dev/null 2>&1; then
            echo files differ or trouble
          fi

     is therefore not portable in practice.  Typically it is easy to
     rewrite such code, e.g.:

          cmp file1 file2 >/dev/null 2>&1 ||
            echo files differ or trouble

     More generally, one can always rewrite `! COMMAND' as:

          if COMMAND; then (exit 1); else :; fi

`{...}'
     Bash 3.2 (and earlier versions) sometimes does not properly set
     `$?' when failing to write redirected output of a compound command.
     This problem is most commonly observed with `{...}'; it does not
     occur with `(...)'.  For example:

          $ bash -c '{ echo foo; } >/bad; echo $?'
          bash: line 1: /bad: Permission denied
          0
          $ bash -c 'while :; do echo; done >/bad; echo $?'
          bash: line 1: /bad: Permission denied
          0

     To work around the bug, prepend `:;':

          $ bash -c ':;{ echo foo; } >/bad; echo $?'
          bash: line 1: /bad: Permission denied
          1

     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 `$?' is inconsistent.  To avoid
     problems, ensure that a brace list is never empty.

          $ bash -c 'false; { }; echo $?' || echo $?
          bash: line 1: syntax error near unexpected token `}'
          bash: line 1: `false; { }; echo $?'
          2
          $ zsh -c 'false; { }; echo $?' || echo $?
          1
          $ pdksh -c 'false; { }; echo $?' || echo $?
          0

`break'
     The use of `break 2' etc. is safe.

`case'
     You don't need to quote the argument; no splitting is performed.

     You don't need the final `;;', but you should use it.

     Posix requires support for `case' patterns with opening
     parentheses like this:

          case $file_name in
            (*.c) echo "C source code";;
          esac

     but the `(' in this example is not portable to many Bourne shell
     implementations, which is a pity for those of us using tools that
     rely on balanced parentheses.  For instance, with Solaris
     `/bin/sh':

          $ case foo in (foo) echo foo;; esac
          error-->syntax error: `(' unexpected

     The leading `(' 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.  *Note
     Balancing Parentheses::, for tradeoffs involved in various styles
     of dealing with unbalanced `)'.

     Zsh handles pattern fragments derived from parameter expansions or
     command substitutions as though quoted:

          $ pat=\?; case aa in ?$pat) echo match;; esac
          $ pat=\?; case a? in ?$pat) echo match;; esac
          match

     Because of a bug in its `fnmatch', Bash fails to properly handle
     backslashes in character classes:

          bash-2.02$ case /tmp in [/\\]*) echo OK;; esac
          bash-2.02$

     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:

          bash-2.02$ case '\TMP' in [\\/]*) echo OK;; esac
          OK
          bash-2.02$ case /tmp in [\\/]*) echo OK;; esac
          OK

     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:

          $ case '\' in [\<]) echo OK;; esac
          OK
          $ scanset='[<]'; case '\' in $scanset) echo OK;; esac
          $

     Even with this, Solaris `ksh' matches a backslash if the set
     contains any of the characters `|', `&', `(', or `)'.

     Conversely, Tru64 `ksh' (circa 2003) erroneously always matches a
     closing parenthesis if not specified in a character class:

          $ case foo in *\)*) echo fail ;; esac
          fail
          $ case foo in *')'*) echo fail ;; esac
          fail

     Some shells, such as Ash 0.3.8, are confused by an empty
     `case'/`esac':

          ash-0.3.8 $ case foo in esac;
          error-->Syntax error: ";" unexpected (expecting ")")

     Posix requires `case' to give an exit status of 0 if no cases
     match.  However, `/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 `AS_CASE' works around these inconsistencies.

          $ bash -c 'case `false` in ?) ;; esac; echo $?'
          0
          $ /bin/sh -c 'case `false` in ?) ;; esac; echo $?'
          255

`cd'
     Posix 1003.1-2001 requires that `cd' must support the `-L'
     ("logical") and `-P' ("physical") options, with `-L' being the
     default.  However, traditional shells do not support these
     options, and their `cd' command has the `-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,
     `ls ..' and `cd ..' may refer to different directories if the
     current logical directory is a symbolic link.  It is safe to use
     `cd DIR' if DIR contains no `..' components.  Also,
     Autoconf-generated scripts check for this problem when computing
     variables like `ac_top_srcdir' (*note Configuration Actions::), so
     it is safe to `cd' to these variables.

     Posix states that behavior is undefined if `cd' is given an
     explicit empty argument.  Some shells do nothing, some change to
     the first entry in `CDPATH', some change to `HOME', and some exit
     the shell rather than returning an error.  Unfortunately, this
     means that if `$var' is empty, then `cd "$var"' is less predictable
     than `cd $var' (at least the latter is well-behaved in all shells
     at changing to `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.

     *Note Special Shell Variables::, for portability problems involving
     `cd' and the `CDPATH' environment variable.  Also please see the
     discussion of the `pwd' command.

`echo'
     The simple `echo' is probably the most surprising source of
     portability troubles.  It is not possible to use `echo' portably
     unless both options and escape sequences are omitted.  Don't
     expect any option.

     Do not use backslashes in the arguments, as there is no consensus
     on their handling.  For `echo '\n' | wc -l', the `sh' of Solaris
     outputs 2, but Bash and Zsh (in `sh' emulation mode) output 1.
     The problem is truly `echo': all the shells understand `'\n'' as
     the string composed of a backslash and an `n'.  Within a command
     substitution, `echo 'string\c'' will mess up the internal state of
     ksh88 on AIX 6.1 so that it will print the first character `s'
     only, followed by a newline, and then entirely drop the output of
     the next echo in a command substitution.

     Because of these problems, do not pass a string containing
     arbitrary characters to `echo'.  For example, `echo "$foo"' is safe
     only if you know that FOO's value cannot contain backslashes and
     cannot start with `-'.

     If this may not be true, `printf' is in general safer and easier
     to use than `echo' and `echo -n'.  Thus, scripts where portability
     is not a major concern should use `printf '%s\n'' whenever `echo'
     could fail, and similarly use `printf %s' instead of `echo -n'.
     For portable shell scripts, instead, it is suggested to use a
     here-document like this:

          cat <<EOF
          $foo
          EOF

     Alternatively, M4sh provides `AS_ECHO' and `AS_ECHO_N' macros
     which choose between various portable implementations: `echo' or
     `print' where they work, `printf' if it is available, or else
     other creative tricks in order to work around the above problems.

`eval'
     The `eval' command is useful in limited circumstances, e.g., using
     commands like `eval table_$key=\$value' and `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 `eval' implementations.
     In some shell implementations (e.g., older `ash', OpenBSD 3.8
     `sh', `pdksh' v5.2.14 99/07/13.2, and `zsh' 4.2.5), the arguments
     of `eval' are evaluated in a context where `$?' is 0, so they
     exhibit behavior like this:

          $ false; eval 'echo $?'
          0

     The correct behavior here is to output a nonzero value, but
     portable scripts should not rely on this.

     You should not rely on `LINENO' within `eval'.  *Note Special
     Shell Variables::.

     Note that, even though these bugs are easily avoided, `eval' is
     tricky to use on arbitrary arguments.  It is obviously unwise to
     use `eval $cmd' if the string value of `cmd' was derived from an
     untrustworthy source.  But even if the string value is valid,
     `eval $cmd' might not work as intended, since it causes field
     splitting and file name expansion to occur twice, once for the
     `eval' and once for the command itself.  It is therefore safer to
     use `eval "$cmd"'.  For example, if CMD has the value `cat
     test?.c', `eval $cmd' might expand to the equivalent of `cat
     test;.c' if there happens to be a file named `test;.c' in the
     current directory; and this in turn mistakenly attempts to invoke
     `cat' on the file `test' and then execute the command `.c'.  To
     avoid this problem, use `eval "$cmd"' rather than `eval $cmd'.

     However, suppose that you want to output the text of the evaluated
     command just before executing it.  Assuming the previous example,
     `echo "Executing: $cmd"' outputs `Executing: cat test?.c', but
     this output doesn't show the user that `test;.c' is the actual name
     of the copied file.  Conversely, `eval "echo Executing: $cmd"'
     works on this example, but it fails with `cmd='cat foo >bar'',
     since it mistakenly replaces the contents of `bar' by the string
     `cat foo'.  No simple, general, and portable solution to this
     problem is known.

`exec'
     Posix describes several categories of shell built-ins.  Special
     built-ins (such as `exit') must impact the environment of the
     current shell, and need not be available through `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 `PATH' search (such as `cd'), in contrast to
     built-ins that are offered as a more efficient version of
     something that must still be found in a `PATH' search (such as
     `echo').  Posix is not clear on whether `exec' must work with the
     list of 17 utilities that are invoked without a `PATH' search, and
     many platforms lack an executable for some of those built-ins:

          $ sh -c 'exec cd /tmp'
          sh: line 0: exec: cd: not found

     All other built-ins that provide utilities specified by Posix must
     have a counterpart executable that exists on `PATH', although Posix
     allows `exec' to use the built-in instead of the executable.  For
     example, contrast `bash' 3.2 and `pdksh' 5.2.14:

          $ bash -c 'pwd --version' | head -n1
          bash: line 0: pwd: --: invalid option
          pwd: usage: pwd [-LP]
          $ bash -c 'exec pwd --version' | head -n1
          pwd (GNU coreutils) 6.10
          $ pdksh -c 'exec pwd --version' | head -n1
          pdksh: pwd: --: unknown option

     When it is desired to avoid a regular shell built-in, the
     workaround is to use some other forwarding command, such as `env'
     or `nice', that will ensure a path search:

          $ pdksh -c 'exec true --version' | head -n1
          $ pdksh -c 'nice true --version' | head -n1
          true (GNU coreutils) 6.10
          $ pdksh -c 'env true --version' | head -n1
          true (GNU coreutils) 6.10

`exit'
     The default value of `exit' is supposed to be `$?'; unfortunately,
     some shells, such as the DJGPP port of Bash 2.04, just perform
     `exit 0'.

          bash-2.04$ foo=`exit 1` || echo fail
          fail
          bash-2.04$ foo=`(exit 1)` || echo fail
          fail
          bash-2.04$ foo=`(exit 1); exit` || echo fail
          bash-2.04$

     Using `exit $?' restores the expected behavior.

     Some shell scripts, such as those generated by `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 `/bin/sh', an exit
     trap ignores the `exit' command's argument.  In these shells, a
     trap cannot determine whether it was invoked by plain `exit' or by
     `exit 1'.  Instead of calling `exit' directly, use the
     `AC_MSG_ERROR' macro that has a workaround for this problem.

`export'
     The builtin `export' dubs a shell variable "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, many shells, such as Solaris `/bin/sh', IRIX 6.3, IRIX 5.2,
     AIX 4.1.5, and Digital Unix 4.0, forget to `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:

          #!/bin/sh
          echo $FOO
          FOO=bar
          echo $FOO
          exec /bin/sh $0

     when run with `FOO=foo' in the environment, these shells print
     alternately `foo' and `bar', although they should print only `foo'
     and then a sequence of `bar's.

     Therefore you should `export' again each environment variable that
     you update; the export can occur before or after the assignment.

     Posix is not clear on whether the `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:

          $ sh -c 'export foo; env | grep foo'
          $ ash -c 'export foo; env | grep foo'
          foo=

     Posix requires `export' to honor assignments made as arguments,
     but older shells do not support this, including `/bin/sh' in
     Solaris 10.  Portable scripts should separate assignments and
     exports into different statements.

          $ bash -c 'export foo=bar; echo $foo'
          bar
          $ /bin/sh -c 'export foo=bar; echo $foo'
          /bin/sh: foo=bar: is not an identifier
          $ /bin/sh -c 'export foo; foo=bar; echo $foo'
          bar

`false'
     Don't expect `false' to exit with status 1: in native Solaris
     `/bin/false' exits with status 255.

`for'
     To loop over positional arguments, use:

          for arg
          do
            echo "$arg"
          done

     You may _not_ leave the `do' on the same line as `for', since some
     shells improperly grok:

          for arg; do
            echo "$arg"
          done

     If you want to explicitly refer to the positional arguments, given
     the `$@' bug (*note Shell Substitutions::), use:

          for arg in ${1+"$@"}; do
            echo "$arg"
          done

     But keep in mind that Zsh, even in Bourne shell emulation mode,
     performs word splitting on `${1+"$@"}'; see *note Shell
     Substitutions::, item `$@', for more.

     In Solaris `/bin/sh', when the list of arguments of a `for' loop
     starts with _unquoted_ tokens looking like variable assignments,
     the loop is not executed on those tokens:

          $ /bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'
          x
          e=f

     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:

          $ /bin/sh -c 'for v in "a=b"; do echo $v; done'
          a=b
          $ /bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'
          a=b
          c=d

`if'
     Using `!' is not portable.  Instead of:

          if ! cmp -s file file.new; then
            mv file.new file
          fi

     use:

          if cmp -s file file.new; then :; else
            mv file.new file
          fi

     Or, especially if the "else" branch is short, you can use `||'.
     In M4sh, the `AS_IF' macro provides an easy way to write these
     kinds of conditionals:

          AS_IF([cmp -s file file.new], [], [mv file.new file])

     This is especially useful in other M4 macros, where the "then" and
     "else" branches might be macro arguments.

     Some very old shells did not reset the exit status from an `if'
     with no `else':

          $ if (exit 42); then true; fi; echo $?
          42

     whereas a proper shell should have printed `0'.  But this is no
     longer a portability problem; any shell that supports functions
     gets it correct.  However, it explains why some makefiles have
     lengthy constructs:

          if test -f "$file"; then
            install "$file" "$dest"
          else
            :
          fi

`printf'
     A format string starting with a `-' can cause problems.  Bash
     interprets it as an option and gives an error.  And `--' 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 `-' in a `%c' or `%s' is probably easiest:

          printf %s -foo

     Bash 2.03 mishandles an escape sequence that happens to evaluate
     to `%':

          $ printf '\045'
          bash: printf: `%': missing format character

     Large outputs may cause trouble.  On Solaris 2.5.1 through 10, for
     example, `/usr/bin/printf' is buggy, so when using `/bin/sh' the
     command `printf %010000x 123' normally dumps core.

     Since `printf' is not always a shell builtin, there is a potential
     speed penalty for using `printf '%s\n'' as a replacement for an
     `echo' that does not interpret `\' or leading `-'. With Solaris
     `ksh', it is possible to use `print -r --' for this role instead.

     *Note Limitations of Shell Builtins: echo for a discussion of
     portable alternatives to both `printf' and `echo'.

`pwd'
     With modern shells, plain `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 1003.1-2001 requires that `pwd' must support the `-L'
     ("logical") and `-P' ("physical") options, with `-L' being the
     default.  However, traditional shells do not support these
     options, and their `pwd' command has the `-P' behavior.

     Portable scripts should assume neither option is supported, and
     should assume neither behavior is the default.  Also, on many hosts
     `/bin/pwd' is equivalent to `pwd -P', but Posix does not require
     this behavior and portable scripts should not rely on it.

     Typically it's best to use plain `pwd'.  On modern hosts this
     outputs logical directory names, which have the following
     advantages:

        * Logical names are what the user specified.

        * Physical names may not be portable from one installation host
          to another due to network file system gymnastics.

        * On modern hosts `pwd -P' may fail due to lack of permissions
          to some parent directory, but plain `pwd' cannot fail for this
          reason.

     Also please see the discussion of the `cd' command.

`read'
     No options are portable, not even support `-r' (Solaris `/bin/sh'
     for example).  Tru64/OSF 5.1 `sh' treats `read' as a special
     built-in, so it may exit if input is redirected from a
     non-existent or unreadable file.

`set'
     With the FreeBSD 6.0 shell, the `set' command (without any
     options) does not sort its output.

     The `set' builtin faces the usual problem with arguments starting
     with a dash.  Modern shells such as Bash or Zsh understand `--' to
     specify the end of the options (any argument after `--' is a
     parameter, even `-x' for instance), but many traditional shells
     (e.g., Solaris 10 `/bin/sh') simply stop option processing as soon
     as a non-option argument is found.  Therefore, use `dummy' or
     simply `x' to end the option processing, and use `shift' to pop it
     out:

          set x $my_list; shift

     Avoid `set -', e.g., `set - $my_list'.  Posix no longer requires
     support for this command, and in traditional shells `set -
     $my_list' resets the `-v' and `-x' options, which makes scripts
     harder to debug.

     Some nonstandard shells do not recognize more than one option
     (e.g., `set -e -x' assigns `-x' to the command line).  It is
     better to combine them:

          set -ex

     The option `-e' has historically been underspecified, with enough
     ambiguities to cause numerous differences across various shell
     implementations; see for example this overview
     (http://www.in-ulm.de/~mascheck/various/set-e/), or this link
     (http://www.austingroupbugs.net/view.php?id=52), documenting a
     change to Posix 2008 to match `ksh88' behavior.  Note that mixing
     `set -e' and shell functions is asking for surprises:

          set -e
          doit()
          {
            rm file
            echo one
          }
          doit || echo two

     According to the recommendation, `one' should always be output
     regardless of whether the `rm' failed, because it occurs within
     the body of the shell function `doit' invoked on the left side of
     `||', where the effects of `set -e' are not enforced.  Likewise,
     `two' should never be printed, since the failure of `rm' does not
     abort the function, such that the status of `doit' is 0.

     The BSD shell has had several problems with the `-e' option.
     Older versions of the BSD shell (circa 1990) mishandled `&&',
     `||', `if', and `case' when `-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 `sh -c
     'test -f file || touch file'', where the seemingly-unnecessary `sh
     -c '...'' wrapper works around the bug (*note Failure in Make
     Rules::).

     Even relatively-recent versions of the BSD shell (e.g., OpenBSD
     3.4) wrongly exit with `-e' if the last command within a compound
     statement fails and is guarded by an `&&' only.  For 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

     does not print `three'.  One workaround is to change the last
     instance of `test -n "$foo" && exit 1' to be `if test -n "$foo";
     then exit 1; fi' instead.  Another possibility is to warn BSD
     users not to use `sh -e'.

     When `set -e' is in effect, a failed command substitution in
     Solaris `/bin/sh' cannot be ignored, even with `||'.

          $ /bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'
          $ bash -c 'set -e; foo=`false` || echo foo; echo bar'
          foo
          bar

     Moreover, a command substitution, successful or not, causes this
     shell to exit from a failing outer command even in presence of an
     `&&' list:

          $ bash -c 'set -e; false `true` && echo notreached; echo ok'
          ok
          $ sh -c 'set -e; false `true` && echo notreached; echo ok'
          $

     Portable scripts should not use `set -e' if `trap' is used to
     install an exit handler.  This is because Tru64/OSF 5.1 `sh'
     sometimes enters the trap handler with the exit status of the
     command prior to the one that triggered the errexit handler:

          $ sh -ec 'trap '\''echo $?'\'' 0; false'
          0
          $ sh -c 'set -e; trap '\''echo $?'\'' 0; false'
          1

     Thus, when writing a script in M4sh, rather than trying to rely on
     `set -e', it is better to append `|| AS_EXIT' to any statement
     where it is desirable to abort on failure.

     Job control is not provided by all shells, so the use of `set -m'
     or `set -b' must be done with care.  When using `zsh' in native
     mode, asynchronous notification (`set -b') is enabled by default,
     and using `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, `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 `pdksh', fail to treat subshells as interactive, even
     though the parent shell was.

          $ echo $ZSH_VERSION
          4.3.10
          $ set -m; echo $?
          0
          $ zsh -c 'set -m; echo $?'
          set: can't change option: -m
          $ (set -m); echo $?
          set: can't change option: -m
          1
          $ pdksh -ci 'echo $-; (echo $-)'
          cim
          c

     Use of `set -n' (typically via `sh -n script') to validate a
     script is not foolproof.  Modern `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:

          $ ksh -nc '``'
          ksh: warning: line 1: `...` obsolete, use $(...)
          0

     Furthermore, on ancient hosts, such as SunOS 4, `sh -n' could go
     into an infinite loop; even with that bug fixed, Solaris 8
     `/bin/sh' takes extremely long to parse large scripts.  Autoconf
     itself uses `sh -n' within its testsuite to check that correct
     scripts were generated, but only after first probing for other
     shell features (such as `test -n "${BASH_VERSION+set}"') that
     indicate a reasonably fast and working implementation.

`shift'
     Not only is `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 `shift 2' etc.; while it in the SVR1 shell (1983), it is
     also absent in many pre-Posix shells.

`source'
     This command is not portable, as Posix does not require it; use
     `.' instead.

`test'
     The `test' program is the way to perform many file and string
     tests.  It is often invoked by the alternate name `[', but using
     that name in Autoconf code is asking for trouble since it is an M4
     quote character.

     The `-a', `-o', `(', and `)' 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, `test "$1" -a "$2"' looks like a binary operator to check
     whether two strings are both non-empty, but if `$1' is the literal
     `!', then some implementations of `test' treat it as a negation of
     the unary operator `-a'.

     Thus, portable uses of `test' should never have more than four
     arguments, and scripts should use shell constructs like `&&' and
     `||' instead.  If you combine `&&' and `||' 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:

          # 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"; }

     `test' does not process options like most other commands do; for
     example, it does not recognize the `--' argument as marking the
     end of options.

     It is safe to use `!' as a `test' operator.  For example, `if test
     ! -d foo; ...' is portable even though `if ! test -d foo; ...' is
     not.

`test' (files)
     To enable `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 `test -f', `test -r', or `test -x'.  Do not use `test -e',
     because Solaris 10 `/bin/sh' lacks it.  To test for symbolic links
     on systems that have them, use `test -h' rather than `test -L';
     either form conforms to Posix 1003.1-2001, but older shells like
     Solaris 8 `/bin/sh' support only `-h'.

     For historical reasons, Posix reluctantly allows implementations of
     `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 `test -r', `test -w',
     and `test -x'; some shells base test results strictly on the
     current user id compared to file owner and mode, as if by
     `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 `faccessat(2)'.  Furthermore, there is
     a classic time of check to time of use race between any use of
     `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 `test' guessed that it might not be
     permitted.

`test' (strings)
     Posix says that `test "STRING"' succeeds if STRING is not null,
     but this usage is not portable to traditional platforms like
     Solaris 10 `/bin/sh', which mishandle strings like `!' and `-n'.

     Posix also says that `test ! "STRING"', `test -n "STRING"' and
     `test -z "STRING"' work with any string, but many shells (such as
     Solaris, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4, etc.) get
     confused if STRING looks like an operator:

          $ test -n =
          test: argument expected
          $ test ! -n
          test: argument expected
          $ test -z ")"; echo $?
          0

     Similarly, Posix says that both `test "STRING1" = "STRING2"' and
     `test "STRING1" != "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 `-'.

     It is best to protect such strings with a leading `X', e.g., `test
     "XSTRING" != X' rather than `test -n "STRING"' or `test !
     "STRING"'.

     It is common to find variations of the following idiom:

          test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
            ACTION

     to take an action when a token matches a given pattern.  Such
     constructs should be avoided by using:

          case $ac_feature in
            *[!-a-zA-Z0-9_]*) ACTION;;
          esac

     If the pattern is a complicated regular expression that cannot be
     expressed as a shell pattern, use something like this instead:

          expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
            ACTION

     `expr "XFOO" : "XBAR"' is more robust than `echo "XFOO" | grep
     "^XBAR"', because it avoids problems when `FOO' contains
     backslashes.

`trap'
     It is safe to trap at least the signals 1, 2, 13, and 15.  You can
     also trap 0, i.e., have the `trap' run when the script ends
     (either via an explicit `exit', or the end of the script).  The
     trap for 0 should be installed outside of a shell function, or AIX
     5.3 `/bin/sh' will invoke the trap at the end of this function.

     Posix says that `trap - 1 2 13 15' resets the traps for the
     specified signals to their default values, but many common shells
     (e.g., Solaris `/bin/sh') misinterpret this and attempt to execute
     a "command" named `-' when the specified conditions arise.  Posix
     2008 also added a requirement to support `trap 1 2 13 15' to reset
     traps, as this is supported by a larger set of shells, but there
     are still shells like `dash' that mistakenly try to execute `1'
     instead of resetting the traps.  Therefore, there is no portable
     workaround, except for `trap - 0', for which `trap '' 0' is a
     portable substitute.

     Although Posix is not absolutely clear on this point, it is widely
     admitted that when entering the trap `$?' 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 `exit', what is
     the _last_ command run: that before `exit', or `exit' itself?"

     Bash considers `exit' to be the last command, while Zsh and
     Solaris `/bin/sh' consider that when the trap is run it is _still_
     in the `exit', hence it is the previous exit status that the trap
     receives:

          $ cat trap.sh
          trap 'echo $?' 0
          (exit 42); exit 0
          $ zsh trap.sh
          42
          $ bash trap.sh
          0

     The portable solution is then simple: when you want to `exit 42',
     run `(exit 42); exit 42', the first `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
     `AS_EXIT'.

     The shell in FreeBSD 4.0 has the following bug: `$?' is reset to 0
     by empty lines if the code is inside `trap'.

          $ trap 'false

          echo $?' 0
          $ exit
          0

     Fortunately, this bug only affects `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 `exit $?' as the shell builtin.

          $ bash -c '(trap "echo hi" 0; /bin/true)'
          hi
          $ /bin/sh -c '(trap "echo hi" 0; /bin/true)'
          $ /bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'
          hi

     Likewise, older implementations of `bash' failed to preserve `$?'
     across an exit trap consisting of a single cleanup command.

          $ bash -c 'trap "/bin/true" 0; exit 2'; echo $?
          2
          $ bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?
          0
          $ bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?
          2

`true'
     Don't worry: as far as we know `true' is portable.  Nevertheless,
     it's not always a builtin (e.g., Bash 1.x), and the portable shell
     community tends to prefer using `:'.  This has a funny side
     effect: when asked whether `false' is more portable than `true'
     Alexandre Oliva answered:

          In a sense, yes, because if it doesn't exist, the shell will
          produce an exit status of failure, which is correct for
          `false', but not for `true'.

     Remember that even though `:' ignores its arguments, it still takes
     time to compute those arguments.  It is a good idea to use double
     quotes around any arguments to `:' to avoid time spent in field
     splitting and file name expansion.

`unset'
     In some nonconforming shells (e.g., Solaris 10 `/bin/ksh' and
     `/usr/xpg4/bin/sh', NetBSD 5.99.43 sh, or Bash 2.05a), `unset FOO'
     fails when `FOO' is not set.  This can interfere with `set -e'
     operation.  You can use

          FOO=; unset FOO

     if you are not sure that `FOO' is set.

     A few ancient shells lack `unset' entirely.  For some variables
     such as `PS1', you can use a neutralizing value instead:

          PS1='$ '

     Usually, shells that do not support `unset' need less effort to
     make the environment sane, so for example is not a problem if you
     cannot unset `CDPATH' on those shells.  However, Bash 2.01
     mishandles `unset MAIL' and `unset MAILPATH' in some cases and
     dumps core.  So, you should do something like

          ( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :

     *Note Special Shell Variables::, for some neutralizing values.
     Also, see *note Limitations of Builtins: export, for the case of
     environment variables.

`wait'
     The exit status of `wait' is not always reliable.


File: autoconf.info,  Node: Limitations of Usual Tools,  Prev: Limitations of Builtins,  Up: Portable Shell

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

`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:

          $ gawk 'function die () { print "Aaaaarg!"  }
                  BEGIN { die () }'
          gawk: cmd. line:2:         BEGIN { die () }
          gawk: cmd. line:2:                      ^ parse error
          $ gawk 'function die () { print "Aaaaarg!"  }
                  BEGIN { die() }'
          Aaaaarg!

     Posix says that if a program contains only `BEGIN' actions, and
     contains no instances of `getline', then the program merely
     executes the actions without reading input.  However, traditional
     Awk implementations (such as Solaris 10 `awk') read and discard
     input in this case.  Portable scripts can redirect input from
     `/dev/null' to work around the problem.  For example:

          awk 'BEGIN {print "hello world"}' </dev/null

     Posix says that in an `END' action, `$NF' (and presumably, `$1')
     retain their value from the last record read, if no intervening
     `getline' occurred.  However, some implementations (such as
     Solaris 10 `/usr/bin/awk', `nawk', or Darwin `awk') reset these
     variables.  A workaround is to use an intermediate variable prior
     to the `END' block.  For example:

          $ cat end.awk
          { tmp = $1 }
          END { print "a", $1, $NF, "b", tmp }
          $ echo 1 | awk -f end.awk
          a   b 1
          $ echo 1 | gawk -f end.awk
          a 1 1 b 1

     If you want your program to be deterministic, don't depend on `for'
     on arrays:

          $ cat for.awk
          END {
            arr["foo"] = 1
            arr["bar"] = 1
            for (i in arr)
              print i
          }
          $ gawk -f for.awk </dev/null
          foo
          bar
          $ nawk -f for.awk </dev/null
          bar
          foo

     Some Awk implementations, such as HP-UX 11.0's native one,
     mishandle anchors:

          $ echo xfoo | $AWK '/foo|^bar/ { print }'
          $ echo bar | $AWK '/foo|^bar/ { print }'
          bar
          $ echo xfoo | $AWK '/^bar|foo/ { print }'
          xfoo
          $ echo bar | $AWK '/^bar|foo/ { print }'
          bar

     Either do not depend on such patterns (i.e., use `/^(.*foo|bar)/',
     or use a simple test to reject such implementations.

     On `ia64-hp-hpux11.23', Awk mishandles `printf' conversions after
     `%u':

          $ awk 'BEGIN { printf "%u %d\n", 0, -1 }'
          0 0

     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 `/bin/awk', have many limitations and do not conform to
     Posix.  Nowadays `AC_PROG_AWK' (*note Particular Programs::) finds
     you an Awk that doesn't have these problems, but if for some
     reason you prefer not to use `AC_PROG_AWK' you may need to address
     them.  For more detailed descriptions, see *note `awk' language
     history: (gawk)Language History.

     Traditional Awk does not support multidimensional arrays or
     user-defined functions.

     Traditional Awk does not support the `-v' option.  You can use
     assignments after the program instead, e.g., `$AWK '{print v $1}'
     v=x'; however, don't forget that such assignments are not
     evaluated until they are encountered (e.g., after any `BEGIN'
     action).

     Traditional Awk does not support the keywords `delete' or `do'.

     Traditional Awk does not support the expressions `A?B:C', `!A',
     `A^B', or `A^=B'.

     Traditional Awk does not support the predefined `CONVFMT' or
     `ENVIRON' variables.

     Traditional Awk supports only the predefined functions `exp',
     `index', `int', `length', `log', `split', `sprintf', `sqrt', and
     `substr'.

     Traditional Awk `getline' is not at all compatible with Posix;
     avoid it.

     Traditional Awk has `for (i in a) ...' but no other uses of the
     `in' keyword.  For example, it lacks `if (i in a) ...'.

     In code portable to both traditional and modern Awk, `FS' must be a
     string containing just one ordinary character, and similarly for
     the field-separator argument to `split'.

     Traditional Awk has a limit of 99 fields in a record.  Since some
     Awk implementations, like Tru64's, split the input even if you
     don't refer to any field in the script, to circumvent this
     problem, set `FS' to an unusual character and use `split'.

     Traditional Awk has a limit of at most 99 bytes in a number
     formatted by `OFMT'; for example, `OFMT="%.300e"; print 0.1;'
     typically dumps core.

     The original version of Awk had a limit of at most 99 bytes per
     `split' field, 99 bytes per `substr' substring, and 99 bytes per
     run of non-special characters in a `printf' format, but these bugs
     have been fixed on all practical hosts that we know of.

     HP-UX 11.00 and IRIX 6.5 Awk require that input files have a line
     length of at most 3070 bytes.

`basename'
     Not all hosts have a working `basename'.  You can use `expr'
     instead.

`cat'
     Don't rely on any option.

`cc'
     The command `cc -c foo.c' traditionally produces an object file
     named `foo.o'.  Most compilers allow `-c' to be combined with `-o'
     to specify a different object file name, but Posix does not
     require this combination and a few compilers lack support for it.
     *Note C Compiler::, for how GNU Make tests for this feature with
     `AC_PROG_CC_C_O'.

     When a compilation such as `cc -o foo foo.c' fails, some compilers
     (such as CDS on Reliant Unix) leave a `foo.o'.

     HP-UX `cc' doesn't accept `.S' files to preprocess and assemble.
     `cc -c foo.S' appears to succeed, but in fact does nothing.

     The default executable, produced by `cc foo.c', can be

        * `a.out' -- usual Posix convention.

        * `b.out' -- i960 compilers (including `gcc').

        * `a.exe' -- DJGPP port of `gcc'.

        * `a_out.exe' -- GNV `cc' wrapper for DEC C on OpenVMS.

        * `foo.exe' -- various MS-DOS compilers.

     The C compiler's traditional name is `cc', but other names like
     `gcc' are common.  Posix 1003.1-2001 specifies the name `c99', but
     older Posix editions specified `c89' and anyway these standard
     names are rarely used in practice.  Typically the C compiler is
     invoked from makefiles that use `$(CC)', so the value of the `CC'
     make variable selects the compiler name.

`chgrp'
`chown'
     It is not portable to change a file's group to a group that the
     owner does not belong to.

`chmod'
     Avoid usages like `chmod -w file'; use `chmod a-w file' instead,
     for two reasons.  First, plain `-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 `-w' might be interpreted as an
     implementation-specific option, not as a mode; Posix suggests
     using `chmod -- -w file' to avoid this confusion, but unfortunately
     `--' does not work on some older hosts.

`cmp'
     `cmp' performs a raw data comparison of two files, while `diff'
     compares two text files.  Therefore, if you might compare DOS
     files, even if only checking whether two files are different, use
     `diff' to avoid spurious differences due to differences of newline
     encoding.

`cp'
     Avoid the `-r' option, since Posix 1003.1-2004 marks it as
     obsolescent and its behavior on special files is
     implementation-defined.  Use `-R' instead.  On GNU hosts the two
     options are equivalent, but on Solaris hosts (for example) `cp -r'
     reads from pipes instead of replicating them.  AIX 5.3 `cp -R' may
     corrupt its own memory with some directory hierarchies and error
     out or dump core:

          mkdir -p 12345678/12345678/12345678/12345678
          touch 12345678/12345678/x
          cp -R 12345678 t
          cp: 0653-440 12345678/12345678/: name too long.

     Some `cp' implementations (e.g., BSD/OS 4.2) do not allow trailing
     slashes at the end of nonexistent destination directories.  To
     avoid this problem, omit the trailing slashes.  For example, use
     `cp -R source /tmp/newdir' rather than `cp -R source /tmp/newdir/'
     if `/tmp/newdir' does not exist.

     The ancient SunOS 4 `cp' does not support `-f', although its `mv'
     does.

     Traditionally, file timestamps had 1-second resolution, and `cp
     -p' copied the timestamps exactly.  However, many modern file
     systems have timestamps with 1-nanosecond resolution.
     Unfortunately, some older `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 `cp'
     uses.  Traditionally this was `utime', which has 1-second
     resolution.  Less-ancient `cp' implementations such as GNU Core
     Utilities 5.0.91 (2003) use `utimes', which has 1-microsecond
     resolution.  Modern implementations such as GNU Core Utilities
     6.12 (2008) can set timestamps to the full nanosecond resolution,
     using the modern system calls `futimens' and `utimensat' when they
     are available.  As of 2011, though, many platforms do not yet
     fully support these new system calls.

     Bob Proulx notes that `cp -p' always _tries_ to copy ownerships.
     But whether it actually does copy ownerships or not 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 `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 `/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 `chown' files and a sticky `/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 `chown'.  On the other hand, HP-UX
     follows System V, but can be configured to use the modern security
     model and disallow `chown'.  Since it is an
     administrator-configurable parameter you can't use the name of the
     kernel as an indicator of the behavior.

`date'
     Some versions of `date' do not recognize special `%' directives,
     and unfortunately, instead of complaining, they just pass them
     through, and exit with success:

          $ uname -a
          OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
          $ date "+%s"
          %s

`diff'
     Option `-u' is nonportable.

     Some implementations, such as Tru64's, fail when comparing to
     `/dev/null'.  Use an empty file instead.

`dirname'
     Not all hosts have a working `dirname', and you should instead use
     `AS_DIRNAME' (*note Programming in M4sh::).  For example:

          dir=`dirname "$file"`       # This is not portable.
          dir=`AS_DIRNAME(["$file"])` # This is more portable.

`egrep'
     Posix 1003.1-2001 no longer requires `egrep', but many hosts do
     not yet support the Posix replacement `grep -E'.  Also, some
     traditional implementations do not work on long input lines.  To
     work around these problems, invoke `AC_PROG_EGREP' and then use
     `$EGREP'.

     Portable extended regular expressions should use `\' only to escape
     characters in the string `$()*+.?[\^{|'.  For example, `\}' is not
     portable, even though it typically matches `}'.

     The empty alternative is not portable.  Use `?' instead.  For
     instance with Digital Unix v5.0:

          > 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

     `$EGREP' also suffers the limitations of `grep' (*note Limitations
     of Usual Tools: grep.).

`expr'
     Not all implementations obey the Posix rule that `--' 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 `-'.  When performing arithmetic, use `expr 0 + $var'
     if `$var' might be a negative number, to keep `expr' from
     interpreting it as an option.

     No `expr' keyword starts with `X', so use `expr X"WORD" :
     'XREGEX'' to keep `expr' from misinterpreting WORD.

     Don't use `length', `substr', `match' and `index'.

`expr' (`|')
     You can use `|'.  Although Posix does require that `expr '''
     return the empty string, it does not specify the result when you
     `|' together the empty string (or zero) with the empty string.  For
     example:

          expr '' \| ''

     Posix 1003.2-1992 returns the empty string for this case, but
     traditional Unix returns `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:

          expr bar : foo \| foo : bar

     Avoid this portability problem by avoiding the empty string.

`expr' (`:')
     Portable `expr' regular expressions should use `\' to escape only
     characters in the string `$()*.0123456789[\^n{}'.  For example,
     alternation, `\|', is common but Posix does not require its
     support, so it should be avoided in portable scripts.  Similarly,
     `\+' and `\?' should be avoided.

     Portable `expr' regular expressions should not begin with `^'.
     Patterns are automatically anchored so leading `^' is not needed
     anyway.

     On the other hand, the behavior of the `$' 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.

          $ baz='foo
          > bar'
          $ expr "X$baz" : 'X\(foo\)$'

          $ expr-5.97 "X$baz" : 'X\(foo\)$'
          foo

     The Posix standard is ambiguous as to whether `expr 'a' : '\(b\)''
     outputs `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 `expr' returns `0'.

     One might think that a way to get a uniform behavior would be to
     use the empty string as a default value:

          expr a : '\(b\)' \| ''

     Unfortunately this behaves exactly as the original expression; see
     the `expr' (`|') entry for more information.

     Some ancient `expr' implementations (e.g., SunOS 4 `expr' and
     Solaris 8 `/usr/ucb/expr') have a silly length limit that causes
     `expr' to fail if the matched substring is longer than 120 bytes.
     In this case, you might want to fall back on `echo|sed' if `expr'
     fails.  Nowadays this is of practical importance only for the rare
     installer who mistakenly puts `/usr/ucb' before `/usr/bin' in
     `PATH'.

     On Mac OS X 10.4, `expr' mishandles the pattern `[^-]' in some
     cases.  For example, the command
          expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'

     outputs `apple-darwin8.1.0' rather than the correct `darwin8.1.0'.
     This particular case can be worked around by substituting `[^--]'
     for `[^-]'.

     Don't leave, there is some more!

     The QNX 4.25 `expr', in addition of preferring `0' to the empty
     string, has a funny behavior in its exit status: it's always 1
     when parentheses are used!

          $ val=`expr 'a' : 'a'`; echo "$?: $val"
          0: 1
          $ val=`expr 'a' : 'b'`; echo "$?: $val"
          1: 0

          $ val=`expr 'a' : '\(a\)'`; echo "?: $val"
          1: a
          $ val=`expr 'a' : '\(b\)'`; echo "?: $val"
          1: 0

     In practice this can be a big problem if you are ready to catch
     failures of `expr' programs with some other method (such as using
     `sed'), since you may get twice the result.  For instance

          $ expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'

     outputs `a' on most hosts, but `aa' on QNX 4.25.  A simple
     workaround consists of testing `expr' and using a variable set to
     `expr' or to `false' according to the result.

     Tru64 `expr' incorrectly treats the result as a number, if it can
     be interpreted that way:

          $ expr 00001 : '.*\(...\)'
          1

     On HP-UX 11, `expr' only supports a single sub-expression.

          $ expr 'Xfoo' : 'X\(f\(oo\)*\)$'
          expr: More than one '\(' was used.

`fgrep'
     Posix 1003.1-2001 no longer requires `fgrep', but many hosts do
     not yet support the Posix replacement `grep -F'.  Also, some
     traditional implementations do not work on long input lines.  To
     work around these problems, invoke `AC_PROG_FGREP' and then use
     `$FGREP'.

     Tru64/OSF 5.1 `fgrep' does not match an empty pattern.

`find'
     The option `-maxdepth' seems to be GNU specific.  Tru64 v5.1,
     NetBSD 1.5 and Solaris `find' commands do not understand it.

     The replacement of `{}' is guaranteed only if the argument is
     exactly _{}_, not if it's only a part of an argument.  For
     instance on DU, and HP-UX 10.20 and HP-UX 11:

          $ touch foo
          $ find . -name foo -exec echo "{}-{}" \;
          {}-{}

     while GNU `find' reports `./foo-./foo'.

`grep'
     Portable scripts can rely on the `grep' options `-c', `-l', `-n',
     and `-v', but should avoid other options.  For example, don't use
     `-w', as Posix does not require it and Irix 6.5.16m's `grep' does
     not support it.  Also, portable scripts should not combine `-c'
     with `-l', as Posix does not allow this.

     Some of the options required by Posix are not portable in practice.
     Don't use `grep -q' to suppress output, because many `grep'
     implementations (e.g., Solaris) do not support `-q'.  Don't use
     `grep -s' to suppress output either, because Posix says `-s' does
     not suppress output, only some error messages; also, the `-s'
     option of traditional `grep' behaved like `-q' does in most modern
     implementations.  Instead, redirect the standard output and
     standard error (in case the file doesn't exist) of `grep' to
     `/dev/null'.  Check the exit status of `grep' to determine whether
     it found a match.

     The QNX4 implementation fails to count lines with `grep -c '$'',
     but works with `grep -c '^''.  Other alternatives for counting
     lines are to use `sed -n '$='' or `wc -l'.

     Some traditional `grep' implementations do not work on long input
     lines.  On AIX the default `grep' silently truncates long lines on
     the input before matching.

     Also, many implementations do not support multiple regexps with
     `-e': they either reject `-e' entirely (e.g., Solaris) or honor
     only the last pattern (e.g., IRIX 6.5 and NeXT).  To work around
     these problems, invoke `AC_PROG_GREP' and then use `$GREP'.

     Another possible workaround for the multiple `-e' problem is to
     separate the patterns by newlines, for example:

          grep 'foo
          bar' in.txt

     except that this fails with traditional `grep' implementations and
     with OpenBSD 3.8 `grep'.

     Traditional `grep' implementations (e.g., Solaris) do not support
     the `-E' or `-F' options.  To work around these problems, invoke
     `AC_PROG_EGREP' and then use `$EGREP', and similarly for
     `AC_PROG_FGREP' and `$FGREP'.  Even if you are willing to require
     support for Posix `grep', your script should not use both `-E' and
     `-F', since Posix does not allow this combination.

     Portable `grep' regular expressions should use `\' only to escape
     characters in the string `$()*.0123456789[\^{}'.  For example,
     alternation, `\|', 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 `grep' do not support it.
     Similarly, the following escape sequences should also be avoided:
     `\<', `\>', `\+', `\?', `\`', `\'', `\B', `\b', `\S', `\s', `\W',
     and `\w'.

     Posix does not specify the behavior of `grep' on binary files.  An
     example where this matters is using BSD `grep' to search text that
     includes embedded ANSI escape sequences for colored output to
     terminals (`\033[m' is the sequence to restore normal output); the
     behavior depends on whether input is seekable:

          $ printf 'esc\033[mape\n' > sample
          $ grep . sample
          Binary file sample matches
          $ cat sample | grep .
          escape

`join'
     Solaris 8 `join' has bugs when the second operand is standard
     input, and when standard input is a pipe.  For example, the
     following shell script causes Solaris 8 `join' to loop forever:

          cat >file <<'EOF'
          1 x
          2 y
          EOF
          cat file | join file -

     Use `join - file' instead.

     On NetBSD, `join -a 1 file1 file2' mistakenly behaves like `join
     -a 1 -a 2 1 file1 file2', resulting in a usage warning; the
     workaround is to use `join -a1 file1 file2' instead.

`ln'
     Don't rely on `ln' having a `-f' option.  Symbolic links are not
     available on old systems; use `$(LN_S)' as a portable substitute.

     For versions of the DJGPP before 2.04, `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 `ln -s file link' generates `link.exe', which
     attempts to call `file.exe' if run.  But this feature only works
     for executables, so `cp -p' is used instead for these systems.
     DJGPP versions 2.04 and later have full support for symbolic links.

`ls'
     The portable options are `-acdilrtu'.  Current practice is for
     `-l' to output both owner and group, even though ancient versions
     of `ls' omitted the group.

     On ancient hosts, `ls foo' sent the diagnostic `foo not found' to
     standard output if `foo' did not exist.  Hence a shell command
     like `sources=`ls *.c 2>/dev/null`' did not always work, since it
     was equivalent to `sources='*.c not found'' in the absence of `.c'
     files.  This is no longer a practical problem, since current `ls'
     implementations send diagnostics to standard error.

     The behavior of `ls' on a directory that is being concurrently
     modified is not always predictable, because of a data race where
     cached information returned by `readdir' does not match the current
     directory state.  In fact, MacOS 10.5 has an intermittent bug where
     `readdir', and thus `ls', sometimes lists a file more than once if
     other files were added or removed from the directory immediately
     prior to the `ls' call.  Since `ls' already sorts its output, the
     duplicate entries can be avoided by piping the results through
     `uniq'.

`mkdir'
     No `mkdir' option is portable to older systems.  Instead of `mkdir
     -p FILE-NAME', you should use `AS_MKDIR_P(FILE-NAME)' (*note
     Programming in M4sh::) or `AC_PROG_MKDIR_P' (*note Particular
     Programs::).

     Combining the `-m' and `-p' options, as in `mkdir -m go-w -p DIR',
     often leads to trouble.  FreeBSD `mkdir' incorrectly attempts to
     change the permissions of DIR even if it already exists.  HP-UX
     11.23 and IRIX 6.5 `mkdir' often assign the wrong permissions to
     any newly-created parents of DIR.

     Posix does not clearly specify whether `mkdir -p foo' should
     succeed when `foo' is a symbolic link to an already-existing
     directory.  The GNU Core Utilities 5.1.0 `mkdir' succeeds, but
     Solaris `mkdir' fails.

     Traditional `mkdir -p' implementations suffer from race conditions.
     For example, if you invoke `mkdir -p a/b' and `mkdir -p a/c' at
     the same time, both processes might detect that `a' is missing,
     one might create `a', then the other might try to create `a' and
     fail with a `File exists' diagnostic.  The GNU Core Utilities
     (`fileutils' version 4.1), FreeBSD 5.0, NetBSD 2.0.2, and OpenBSD
     2.4 are known to be race-free when two processes invoke `mkdir -p'
     simultaneously, but earlier versions are vulnerable.  Solaris
     `mkdir' is still vulnerable as of Solaris 10, and other
     traditional Unix systems are probably vulnerable too.  This
     possible race is harmful in parallel builds when several Make
     rules call `mkdir -p' to construct directories.  You may use
     `install-sh -d' as a safe replacement, provided this script is
     recent enough; the copy shipped with Autoconf 2.60 and Automake
     1.10 is OK, but copies from older versions are vulnerable.

`mkfifo'
`mknod'
     The GNU Coding Standards state that `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 `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.

`mktemp'
     Shell scripts can use temporary files safely with `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 `mktemp' is far less likely
     to fail gratuitously under attack.

     Here is sample code to create a new temporary directory `$dir'
     safely:

          # 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
            (umask 077 && mkdir "$dir")
          } || exit $?

`mv'
     The only portable options are `-f' and `-i'.

     Moving individual files between file systems is portable (it was
     in Unix version 6), but it is not always atomic: when doing `mv
     new existing', there's a critical section where neither the old
     nor the new version of `existing' actually exists.

     On some systems moving files from `/tmp' can sometimes cause
     undesirable (but perfectly valid) warnings, even if you created
     these files.  This is because `/tmp' belongs to a group that
     ordinary users are not members of, and files created in `/tmp'
     inherit the group of `/tmp'.  When the file is copied, `mv' issues
     a diagnostic without failing:

          $ touch /tmp/foo
          $ mv /tmp/foo .
          error-->mv: ./foo: set owner/group (was: 100/0): Operation not permitted
          $ echo $?
          0
          $ ls foo
          foo

     This annoying behavior conforms to Posix, unfortunately.

     Moving directories across mount points is not portable, use `cp'
     and `rm'.

     DOS variants cannot rename or remove open files, and do not
     support commands like `mv foo bar >foo', even though this is
     perfectly portable among Posix hosts.

`od'
     In Mac OS X 10.3, `od' does not support the standard Posix options
     `-A', `-j', `-N', or `-t', or the XSI option `-s'.  The only
     supported Posix option is `-v', and the only supported XSI options
     are those in `-bcdox'.  The BSD `hexdump' program can be used
     instead.

     This problem no longer exists in Mac OS X 10.4.3.

`rm'
     The `-f' and `-r' options are portable.

     It is not portable to invoke `rm' without options or operands.  On
     the other hand, Posix now requires `rm -f' to silently succeed
     when there are no operands (useful for constructs like `rm -rf
     $filelist' without first checking if `$filelist' was empty).  But
     this was not always portable; at least NetBSD `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 `rm foo >foo', even though this is perfectly
     portable among Posix hosts.

`rmdir'
     Just as with `rm', some platforms refuse to remove a working
     directory.

`sed'
     Patterns should not include the separator (unless escaped), even
     as part of a character class.  In conformance with Posix, the Cray
     `sed' rejects `s/[^/]*$//': use `s%[^/]*$%%'.  Even when escaped,
     patterns should not include separators that are also used as `sed'
     metacharacters.  For example, GNU sed 4.0.9 rejects
     `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., `\(\)').  Posix does
     not require support for empty patterns, and Unicos 9 `sed' rejects
     them.

     Unicos 9 `sed' loops endlessly on patterns like `.*\n.*'.

     Sed scripts should not use branch labels longer than 7 characters
     and should not contain comments; AIX 5.3 `sed' rejects indented
     comments.  HP-UX sed has a limit of 99 commands (not counting `:'
     commands) and 48 labels, which cannot be circumvented by using
     more than one script file.  It can execute up to 19 reads with the
     `r' command per cycle.  Solaris `/usr/ucb/sed' rejects usages that
     exceed a limit of about 6000 bytes for the internal representation
     of commands.

     Avoid redundant `;', as some `sed' implementations, such as NetBSD
     1.4.2's, incorrectly try to interpret the second `;' as a command:

          $ echo a | sed 's/x/x/;;s/x/x/'
          sed: 1: "s/x/x/;;s/x/x/": invalid command code ;

     Some `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 `sed'
     implementations can handle embedded `NUL' or a missing trailing
     newline.

     Remember that ranges within a bracket expression of a regular
     expression are only well-defined in the `C' (or `POSIX') locale.
     Meanwhile, support for character classes like `[[:upper:]]' is not
     yet universal, so if you cannot guarantee the setting of `LC_ALL',
     it is better to spell out a range `[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
     than to rely on `[A-Z]'.

     Additionally, Posix states that regular expressions are only
     well-defined on characters.  Unfortunately, there exist platforms
     such as MacOS X 10.5 where not all 8-bit byte values are valid
     characters, even though that platform has a single-byte `C'
     locale.  And Posix allows the existence of a multi-byte `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 `.':

          $ printf '\200\n' | LC_ALL=C sed -n /./p | wc -l
          0
          $ printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l
          1

     Portable `sed' regular expressions should use `\' only to escape
     characters in the string `$()*.0123456789[\^n{}'.  For example,
     alternation, `\|', is common but Posix does not require its
     support, so it should be avoided in portable scripts.  Solaris
     `sed' does not support alternation; e.g., `sed '/a\|b/d'' deletes
     only lines that contain the literal string `a|b'.  Similarly, `\+'
     and `\?' should be avoided.

     Anchors (`^' and `$') inside groups are not portable.

     Nested parentheses in patterns (e.g., `\(\(a*\)b*)\)') are quite
     portable to current hosts, but was not supported by some ancient
     `sed' implementations like SVR3.

     Some `sed' implementations, e.g., Solaris, restrict the special
     role of the asterisk `*' to one-character regular expressions and
     back-references, and the special role of interval expressions
     `\{M\}', `\{M,\}', or `\{M,N\}' to one-character regular
     expressions.  This may lead to unexpected behavior:

          $ echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'
          x2x4
          $ echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'
          x

     The `-e' option is mostly portable.  However, its argument cannot
     start with `a', `c', or `i', as this runs afoul of a Tru64 5.1 bug.
     Also, its argument cannot be empty, as this fails on AIX 5.3.
     Some people prefer to use `-e':

          sed -e 'COMMAND-1' \
              -e 'COMMAND-2'

     as opposed to the equivalent:

          sed '
            COMMAND-1
            COMMAND-2
          '

     The following usage is sometimes equivalent:

          sed 'COMMAND-1;COMMAND-2'

     but Posix says that this use of a semicolon has undefined effect if
     COMMAND-1's verb is `{', `a', `b', `c', `i', `r', `t', `w', `:',
     or `#', 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 `-e'
     option to be a syntactically complete script.  GNU `sed' allows to
     pass multiple script fragments, each as argument of a separate
     `-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 `sed' programs on Solaris 10, HP-UX
     11, and AIX don't allow splitting in this case:

          $ echo a | sed -n -e 'i\
          0'
          0
          $ echo a | sed -n -e 'i\' -e 0
          Unrecognized command: 0

     In practice, however, this technique of joining fragments through
     `-e' works for multiple `sed' functions within `{' and `}', even
     if that is not specified by Posix:

          $ echo a | sed -n -e '/a/{' -e s/a/b/ -e p -e '}'
          b

     Commands inside { } brackets are further restricted.  Posix 2008
     says that they cannot be preceded by addresses, `!', or `;', 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 `&' in
     the replacement part of the `s' command to mean "what was
     matched".  All descendants of Unix version 7 `sed' (at least; we
     don't have first hand experience with older `sed' implementations)
     have supported it.

     Posix requires that you must not have any white space between `!'
     and the following command.  It is OK to have blanks between the
     address and the `!'.  For instance, on Solaris:

          $ echo "foo" | sed -n '/bar/ ! p'
          error-->Unrecognized command: /bar/ ! p
          $ echo "foo" | sed -n '/bar/! p'
          error-->Unrecognized command: /bar/! p
          $ echo "foo" | sed -n '/bar/ !p'
          foo

     Posix also says that you should not combine `!' and `;'.  If you
     use `!', it is best to put it on a command that is delimited by
     newlines rather than `;'.

     Also note that Posix requires that the `b', `t', `r', and `w'
     commands be followed by exactly one space before their argument.
     On the other hand, no white space is allowed between `:' and the
     subsequent label name.

     If a sed script is specified on the command line and ends in an
     `a', `c', or `i' command, the last line of inserted text should be
     followed by a newline.  Otherwise some `sed' implementations
     (e.g., OpenBSD 3.9) do not append a newline to the inserted text.

     Many `sed' implementations (e.g., MacOS X 10.4, OpenBSD 3.9,
     Solaris 10 `/usr/ucb/sed') strip leading white space from the text
     of `a', `c', and `i' commands.  Prepend a backslash to work around
     this incompatibility with Posix:

          $ echo flushleft | sed 'a\
          >    indented
          > '
          flushleft
          indented
          $ echo foo | sed 'a\
          > \   indented
          > '
          flushleft
             indented

     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.

          $ echo abc | busybox sed '/a\(b\)c/ s//\1/'
          sed: No previous regexp.
          $ echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'
          b

`sed' (`t')
     Some old systems have `sed' that "forget" to reset their `t' flag
     when starting a new cycle.  For instance on MIPS RISC/OS, and on
     IRIX 5.3, if you run the following `sed' script (the line numbers
     are not actual part of the texts):

          s/keep me/kept/g  # a
          t end             # b
          s/.*/deleted/g    # c
          :end              # d

     on

          delete me         # 1
          delete me         # 2
          keep me           # 3
          delete me         # 4

     you get

          deleted
          delete me
          kept
          deleted

     instead of

          deleted
          deleted
          kept
          deleted

     Why?  When processing line 1, (c) matches, therefore sets the `t'
     flag, and the output is produced.  When processing line 2, the `t'
     flag is still set (this is the bug).  Command (a) fails to match,
     but `sed' is not supposed to clear the `t' flag when a
     substitution fails.  Command (b) sees that the flag is set,
     therefore it clears it, and jumps to (d), hence you get `delete me'
     instead of `deleted'.  When processing line (3), `t' is clear, (a)
     matches, so the flag is set, hence (b) clears the flags and jumps.
     Finally, since the flag is clear, line 4 is processed properly.

     There are two things one should remember about `t' in `sed'.
     Firstly, always remember that `t' jumps if _some_ substitution
     succeeded, not only the immediately preceding substitution.
     Therefore, always use a fake `t clear' followed by a `:clear' on
     the next line, to reset the `t' flag where needed.

     Secondly, you cannot rely on `sed' to clear the flag at each new
     cycle.

     One portable implementation of the script above is:

          t clear
          :clear
          s/keep me/kept/g
          t end
          s/.*/deleted/g
          :end

`sleep'
     Using `sleep' is generally portable.  However, remember that
     adding a `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.

`sort'
     Remember that sort order is influenced by the current locale.
     Inside `configure', the C locale is in effect, but in Makefile
     snippets, you may need to specify `LC_ALL=C sort'.

`tar'
     There are multiple file formats for `tar'; if you use Automake,
     the macro `AM_INIT_AUTOMAKE' has some options controlling which
     level of portability to use.

`touch'
     If you specify the desired timestamp (e.g., with the `-r' option),
     older `touch' implementations use the `utime' or `utimes' system
     call, which can result in the same kind of timestamp truncation
     problems that `cp -p' has.

     On ancient BSD systems, `touch' or any command that results in an
     empty file does not update the timestamps, so use a command like
     `echo' as a workaround.  Also, GNU `touch' 3.16r (and presumably
     all before that) fails to work on SunOS 4.1.3 when the empty file
     is on an NFS-mounted 4.2 volume.  However, these problems are no
     longer of practical concern.

`tr'
     Not all versions of `tr' handle all backslash character escapes.
     For example, Solaris 10 `/usr/ucb/tr' falls over, even though
     Solaris contains more modern `tr' in other locations.  Using octal
     escapes is more portable for carriage returns, since `\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.

          $ { echo moon; echo light; } | /usr/ucb/tr -d '\n' ; echo
          moo
          light
          $ { echo moon; echo light; } | /usr/bin/tr -d '\n' ; echo
          moonlight
          $ { echo moon; echo light; } | /usr/ucb/tr -d '\012' ; echo
          moonlight
          $ nl='
          '; { echo moon; echo light; } | /usr/ucb/tr -d "$nl" ; echo
          moonlight

     Not all versions of `tr' recognize direct ranges of characters: at
     least Solaris `/usr/bin/tr' still fails to do so.  But you can use
     `/usr/xpg4/bin/tr' instead, or add brackets (which in Posix
     transliterate to themselves).

          $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z
          HAZy FAntAZy
          $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'
          HAZY FANTAZY
          $ echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z
          HAZY FANTAZY

     When providing two arguments, be sure the second string is at
     least as long as the first.

          $ echo abc | /usr/xpg4/bin/tr bc d
          adc
          $ echo abc | coreutils/tr bc d
          add

     Posix requires `tr' to operate on binary files.  But at least
     Solaris `/usr/ucb/tr' and `/usr/bin/tr' silently discard `NUL' in
     the input prior to doing any translation.  When using `tr' to
     process a binary file that may contain `NUL' bytes, it is
     necessary to use `/usr/xpg4/bin/tr' instead, or `/usr/xpg6/bin/tr'
     if that is available.

          $ printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1
           61 62
          $ printf 'a\0b' | /usr/bin/tr x x | od -An -tx1
           61 62
          $ printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1
           61 00 62

     Solaris `/usr/ucb/tr' additionally fails to handle `\0' as the
     octal escape for `NUL'.

          $ printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1
           61 62 63
          $ printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1
           61 00 64
          $ printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1
           61 00 64



File: autoconf.info,  Node: Portable Make,  Next: Portable C and C++,  Prev: Portable Shell,  Up: Top

12 Portable Make Programming
****************************

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 `make' itself.

* Menu:

* $< in Ordinary Make Rules::   $< in ordinary rules
* Failure in Make Rules::       Failing portably in rules
* 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
* Long Lines in Makefiles::     Line length limitations
* Macros and Submakes::         `make macro=value' and submakes
* The Make Macro MAKEFLAGS::    `$(MAKEFLAGS)' portability issues
* The Make Macro SHELL::        `$(SHELL)' portability issues
* Parallel Make::               Parallel `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 `obj'
* make -k Status::              Exit status of `make -k'
* VPATH and Make::              `VPATH' woes
* Single Suffix Rules::         Single suffix rules and separated dependencies
* Timestamps and Make::         Subsecond timestamp resolution


File: autoconf.info,  Node: $< in Ordinary Make Rules,  Next: Failure in Make Rules,  Up: Portable Make

12.1 `$<' in Ordinary Make Rules
================================

Posix says that the `$<' construct in makefiles can be used only in
inference rules and in the `.DEFAULT' rule; its meaning in ordinary
rules is unspecified.  Solaris `make' for instance replaces it with the
empty string.  OpenBSD (3.0 and later) `make' diagnoses these uses and
errors out.


File: autoconf.info,  Node: Failure in Make Rules,  Next: Special Chars in Names,  Prev: $< in Ordinary Make Rules,  Up: Portable Make

12.2 Failure in Make Rules
==========================

Posix 2008 requires that `make' must invoke each command with the
equivalent of a `sh -e -c' subshell, which causes the subshell to exit
immediately if a subsidiary simple-command fails, although not all
`make' implementations have historically followed this rule.  For
example, the command `touch T; rm -f U' may attempt to remove `U' even
if the `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., `touch T || :; rm -f U'.  However, even
this approach can run into common bugs in BSD implementations of the
`-e' option of `sh' and `set' (*note Limitations of Shell Builtins:
set.), so if you are worried about porting to buggy BSD shells it may
be simpler to migrate complicated `make' actions into separate scripts.


File: autoconf.info,  Node: Special Chars in Names,  Next: Backslash-Newline-Empty,  Prev: Failure in Make Rules,  Up: Portable Make

12.3 Special Characters in Make Macro Names
===========================================

Posix limits macro names to nonempty strings containing only ASCII
letters and digits, `.', and `_'.  Many `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.,
`$(.FOO)'.

   Some ancient `make' implementations don't support leading
underscores in macro names.  An example is NEWS-OS 4.2R.

     $ cat Makefile
     _am_include = #
     _am_quote =
     all:; @echo this is test
     $ make
     Make: Must be a separator on rules line 2.  Stop.
     $ cat Makefile2
     am_include = #
     am_quote =
     all:; @echo this is test
     $ make -f Makefile2
     this is test

However, this problem is no longer of practical concern.


File: autoconf.info,  Node: Backslash-Newline-Empty,  Next: Backslash-Newline Comments,  Prev: Special Chars in Names,  Up: Portable Make

12.4 Backslash-Newline Before Empty Lines
=========================================

A bug in Bash 2.03 can cause problems if a Make rule contains a
backslash-newline followed by line that expands to nothing.  For
example, on Solaris 8:

     SHELL = /bin/bash
     EMPTY =
     foo:
     	touch foo \
     	$(EMPTY)

executes

     /bin/bash -c 'touch foo \
     '

which fails with a syntax error, due to the Bash bug.  To avoid this
problem, avoid nullable macros in the last line of a multiline command.

   On some versions of HP-UX, `make' reads multiple newlines following
a backslash, continuing to the next non-empty line.  For example,

     FOO = one \

     BAR = two

     test:
             : FOO is "$(FOO)"
             : BAR is "$(BAR)"

shows `FOO' equal to `one BAR = two'.  Other implementations sensibly
let a backslash continue only to the immediately following line.


File: autoconf.info,  Node: Backslash-Newline Comments,  Next: Long Lines in Makefiles,  Prev: Backslash-Newline-Empty,  Up: Portable Make

12.5 Backslash-Newline in Make Comments
=======================================

According to Posix, Make comments start with `#' and continue until an
unescaped newline is reached.

     $ cat Makefile
     # A = foo \
           bar \
           baz

     all:
             @echo ok
     $ make   # GNU make
     ok

However this is not always the case.  Some implementations discard
everything from `#' through the end of the line, ignoring any trailing
backslash.

     $ pmake  # BSD make
     "Makefile", line 3: Need an operator
     Fatal errors encountered -- cannot continue

Therefore, if you want to comment out a multi-line definition, prefix
each line with `#', not only the first.

     # A = foo \
     #     bar \
     #     baz


File: autoconf.info,  Node: Long Lines in Makefiles,  Next: Macros and Submakes,  Prev: Backslash-Newline Comments,  Up: Portable Make

12.6 Long Lines in Makefiles
============================

Tru64 5.1's `make' has been reported to crash when given a makefile
with lines longer than around 20 kB.  Earlier versions are reported to
exit with `Line too long' diagnostics.


File: autoconf.info,  Node: Macros and Submakes,  Next: The Make Macro MAKEFLAGS,  Prev: Long Lines in Makefiles,  Up: Portable Make

12.7 `make macro=value' and Submakes
====================================

A command-line variable definition such as `foo=bar' overrides any
definition of `foo' in a makefile.  Some `make' implementations (such
as GNU `make') propagate this override to subsidiary invocations of
`make'.  Some other implementations do not pass the substitution along
to submakes.

     $ cat Makefile
     foo = foo
     one:
             @echo $(foo)
             $(MAKE) two
     two:
             @echo $(foo)
     $ make foo=bar            # GNU make 3.79.1
     bar
     make two
     make[1]: Entering directory `/home/adl'
     bar
     make[1]: Leaving directory `/home/adl'
     $ pmake foo=bar           # BSD make
     bar
     pmake two
     foo

   You have a few possibilities if you do want the `foo=bar' override
to propagate to submakes.  One is to use the `-e' option, which causes
all environment variables to have precedence over the makefile macro
definitions, and declare foo as an environment variable:

     $ env foo=bar make -e

   The `-e' option is propagated to submakes automatically, and since
the environment is inherited between `make' invocations, the `foo'
macro is overridden in submakes as expected.

   This syntax (`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 `make' rule, GNU `make' 3.80 and prior versions
forget to propagate the `-e' option to submakes.

   Moreover, using `-e' could have unexpected side effects if your
environment contains some other macros usually defined by the makefile.
(See also the note about `make -e' and `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:

     foo = foo
     one:
             @echo $(foo)
             $(MAKE) foo=$(foo) two
     two:
             @echo $(foo)

   Another way to propagate a variable to submakes in a portable way is
to expand an extra variable in every invocation of `$(MAKE)' within
your makefile:

     foo = foo
     one:
             @echo $(foo)
             $(MAKE) $(SUBMAKEFLAGS) two
     two:
             @echo $(foo)

   Users must be aware that this technique is in use to take advantage
of it, e.g. with `make foo=bar SUBMAKEFLAGS='foo=bar'', but it allows
any macro to be overridden.  Makefiles generated by `automake' use this
technique, expanding `$(AM_MAKEFLAGS)' on the command lines of submakes
(*note Automake: (automake)Subdirectories.).


File: autoconf.info,  Node: The Make Macro MAKEFLAGS,  Next: The Make Macro SHELL,  Prev: Macros and Submakes,  Up: Portable Make

12.8 The Make Macro MAKEFLAGS
=============================

Posix requires `make' to use `MAKEFLAGS' to affect the current and
recursive invocations of make, but allows implementations several
formats for the variable.  It is tricky to parse `$MAKEFLAGS' to
determine whether `-s' for silent execution or `-k' for continued
execution are in effect.  For example, you cannot assume that the first
space-separated word in `$MAKEFLAGS' contains single-letter options,
since in the Cygwin version of GNU `make' it is either `--unix' or
`--win32' with the second word containing single-letter options.

     $ cat Makefile
     all:
             @echo MAKEFLAGS = $(MAKEFLAGS)
     $ make
     MAKEFLAGS = --unix
     $ make -k
     MAKEFLAGS = --unix -k


File: autoconf.info,  Node: The Make Macro SHELL,  Next: Parallel Make,  Prev: The Make Macro MAKEFLAGS,  Up: Portable Make

12.9 The Make Macro `SHELL'
===========================

Posix-compliant `make' internally uses the `$(SHELL)' macro to spawn
shell processes and execute Make rules.  This is a builtin macro
supplied by `make', but it can be modified by a makefile or by a
command-line argument.

   Not all `make' implementations define this `SHELL' macro.  Tru64
`make' is an example; this implementation always uses `/bin/sh'.  So
it's a good idea to always define `SHELL' in your makefiles.  If you
use Autoconf, do

     SHELL = @SHELL@

If you use Automake, this is done for you.

   Do not force `SHELL = /bin/sh' because that is not correct
everywhere.  Remember, `/bin/sh' is not Posix compliant on many
systems, such as FreeBSD 4, NetBSD 3, AIX 3, Solaris 10, or Tru64.
Additionally, DJGPP lacks `/bin/sh', and when its GNU `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.com'.
Unfortunately this emulation is incomplete; for instance it does not
handle command substitutions.  Using `@SHELL@' means that your makefile
will benefit from the same improved shell, such as `bash' or `ksh',
that was discovered during `configure', so that you aren't fighting two
different sets of shell bugs between the two contexts.

   Posix-compliant `make' should never acquire the value of $(SHELL)
from the environment, even when `make -e' is used (otherwise, think
about what would happen to your rules if `SHELL=/bin/tcsh').

   However not all `make' implementations have this exception.  For
instance it's not surprising that Tru64 `make' doesn't protect `SHELL',
since it doesn't use it.

     $ cat Makefile
     SHELL = /bin/sh
     FOO = foo
     all:
             @echo $(SHELL)
             @echo $(FOO)
     $ env SHELL=/bin/tcsh FOO=bar make -e   # Tru64 Make
     /bin/tcsh
     bar
     $ env SHELL=/bin/tcsh FOO=bar gmake -e  # GNU make
     /bin/sh
     bar

   Conversely, `make' is not supposed to export any changes to the
macro `SHELL' to child processes.  Again, many implementations break
this rule:

     $ cat Makefile
     all:
             @echo $(SHELL)
             @printenv SHELL
     $ env SHELL=sh make -e SHELL=/bin/ksh   # BSD Make, GNU make 3.80
     /bin/ksh
     /bin/ksh
     $ env SHELL=sh gmake -e SHELL=/bin/ksh  # GNU make 3.81
     /bin/ksh
     sh


File: autoconf.info,  Node: Parallel Make,  Next: Comments in Make Rules,  Prev: The Make Macro SHELL,  Up: Portable Make

12.10 Parallel Make
===================

Support for parallel execution in `make' implementation varies.
Generally, using GNU make is your best bet.

   When NetBSD or FreeBSD `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:

     all:
             @var=value; cd /; pwd; echo $$var; echo $$$$
             @pwd; echo $$var; echo $$$$

may output the following with `make -j1', at least on NetBSD up to 5.1
and FreeBSD up to 8.2:

     /
     value
     32235
     /
     value
     32235

while without `-j1', or with `-B', the output looks less surprising:

     /
     value
     32238
     /tmp

     32239

Another consequence is that, if one command in a recipe uses `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 `make' implementations, when run in parallel mode, will also
pass the `Makefile' recipes to the shell through its standard input,
thus making it unusable from the recipes:

     $ cat Makefile
     read:
             @read line; echo LINE: $$line
     $ echo foo | make read
     LINE: foo
     $ echo foo | make -j1 read # NetBSD 5.1 and FreeBSD 8.2
     LINE:

Moreover, when FreeBSD `make' (up at least to 8.2) is run in parallel
mode, it implements the `@' and `-' "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 `@'
modifier if they also unset the `errexit' shell flag, and of mangling
the output in unexpected ways:

     $ cat Makefile
     a:
             @echo $$-; set +e; false
     b:
             -echo $$-; false; echo set -
     $ make a; echo status: $?
     ehBc
     *** Error code 1
     status: 1
     $ make -j1 a; echo status: $?
     ehB
     status: 0
     $ make b
     echo $-; echo set -
     hBc
     set -
     $ make -j1 b
     echo $-; echo hvB

You can avoid all these issues by using the `-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 `make', NetBSD
`make', and Solaris `dmake'), when invoked with a `-jN' 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 `make' standard output is connected to a tty, the recipe command
will not be:

     $ cat Makefile
     all:
             @test -t 1 && echo "Is a tty" || echo "Is not a tty"
     $ make -j 2 # FreeBSD 8.2 make
     Is not a tty
     $ make -j 2 # NetBSD 5.1 make
     --- all ---
     Is not a tty
     $ dmake -j 2 # Solaris 10 dmake
     HOSTNAME --> 1 job
     HOSTNAME --> Job output
     Is not a tty

On the other hand:

     $ make -j 2 # GNU make, Heirloom make
     Is a tty

The above examples also show additional status output produced in
parallel mode for targets being updated by Solaris `dmake' and NetBSD
`make' (but _not_ by FreeBSD `make').

   Furthermore, parallel runs of those `make' implementations will
route standard error from commands that they spawn into their own
standard output, and may remove leading whitespace from output lines.


File: autoconf.info,  Node: Comments in Make Rules,  Next: Newlines in Make Rules,  Prev: Parallel Make,  Up: Portable Make

12.11 Comments in Make Rules
============================

Never put comments in a rule.

   Some `make' treat anything starting with a tab as a command for the
current rule, even if the tab is immediately followed by a `#'.  The
`make' from Tru64 Unix V5.1 is one of them.  The following makefile
runs `# foo' through the shell.

     all:
             # foo

   As a workaround, you can use the `:' no-op command with a string
argument that gets ignored:

     all:
             : "foo"

   Conversely, if you want to use the `#' character in some command,
you can only do so by expanding it inside a rule (*note Comments in
Make Macros::).  So for example, if `COMMENT_CHAR' is substituted by
`config.status' as `#', then the following substitutes `@COMMENT_CHAR@'
in a generated header:

     foo.h: foo.h.in
             sed -e 's|@''COMMENT_CHAR''@|@COMMENT_CHAR@|g' \
                 $(srcdir)/foo.h.in > $@

   The funny shell quoting avoids a substitution at `config.status' run
time of the left-hand side of the `sed' `s' command.


File: autoconf.info,  Node: Newlines in Make Rules,  Next: Comments in Make Macros,  Prev: Comments in Make Rules,  Up: Portable Make

12.12 Newlines in Make Rules
============================

In shell scripts, newlines can be used inside string literals.  But in
the shell statements of `Makefile' rules, this is not possible: A
newline not preceded by a backslash is a separator between shell
statements.  Whereas a newline that is preceded by a backslash becomes
part of the shell statement according to POSIX, but gets replaced,
together with the backslash that precedes it, by a space in GNU `make'
3.80 and older.  So, how can a newline be used in a string literal?

   The trick is to set up a shell variable that contains a newline:

     nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"

   For example, in order to create a multiline `sed' expression that
inserts a blank line after every line of a file, this code can be used:

     nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
     sed -e "s/\$$/\\$${nl}/" < input > output


File: autoconf.info,  Node: Comments in Make Macros,  Next: Trailing whitespace in Make Macros,  Prev: Newlines in Make Rules,  Up: Portable Make

12.13 Comments in Make Macros
=============================

Avoid putting comments in macro values as far as possible.  Posix
specifies that the text starting from the `#' sign until the end of the
line is to be ignored, which has the unfortunate effect of disallowing
them even within quotes.  Thus, the following might lead to a syntax
error at compile time:

     CPPFLAGS = "-DCOMMENT_CHAR='#'"

as `CPPFLAGS' may be expanded to `"-DCOMMENT_CHAR=''.

   Most `make' implementations disregard this and treat single and
double quotes specially here.  Also, GNU `make' lets you put `#' into a
macro value by escaping it with a backslash, i.e., `\#'.  However,
neither of these usages are portable.  *Note 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:

     foo = bar # trailing comment
     print: ; @echo "$(foo)."

prints `bar .', which is usually not intended, and can expose `make'
bugs as described below.


File: autoconf.info,  Node: Trailing whitespace in Make Macros,  Next: Command-line Macros and whitespace,  Prev: Comments in Make Macros,  Up: Portable Make

12.14 Trailing whitespace in Make Macros
========================================

GNU `make' 3.80 mistreats trailing whitespace in macro substitutions
and appends another spurious suffix:

     empty =
     foo = bar $(empty)
     print: ; @echo $(foo:=.test)

prints `bar.test .test'.

   BSD and Solaris `make' implementations do not honor trailing
whitespace in macro definitions as Posix requires:

     foo = bar # Note the space after "bar".
     print: ; @echo $(foo)t

prints `bart' instead of `bar t'.  To work around this, you can use a
helper macro as in the previous example.


File: autoconf.info,  Node: Command-line Macros and whitespace,  Next: obj/ and Make,  Prev: Trailing whitespace in Make Macros,  Up: Portable Make

12.15 Command-line Macros and whitespace
========================================

Some `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:

     $ 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, IRIX, Tru64/OSF make
     x f f xb bx   # Solaris make


File: autoconf.info,  Node: obj/ and Make,  Next: make -k Status,  Prev: Command-line Macros and whitespace,  Up: Portable Make

12.16 The `obj/' Subdirectory and Make
======================================

Never name one of your subdirectories `obj/' if you don't like
surprises.

   If an `obj/' directory exists, BSD `make' enters it before reading
the makefile.  Hence the makefile in the current directory is not read.

     $ cat Makefile
     all:
             echo Hello
     $ cat obj/Makefile
     all:
             echo World
     $ make      # GNU make
     echo Hello
     Hello
     $ pmake     # BSD make
     echo World
     World


File: autoconf.info,  Node: make -k Status,  Next: VPATH and Make,  Prev: obj/ and Make,  Up: Portable Make

12.17 Exit Status of `make -k'
==============================

Do not rely on the exit status of `make -k'.  Some implementations
reflect whether they encountered an error in their exit status; other
implementations always succeed.

     $ cat Makefile
     all:
             false
     $ make -k; echo exit status: $?    # GNU make
     false
     make: *** [all] Error 1
     exit status: 2
     $ pmake -k; echo exit status: $?   # BSD make
     false
     *** Error code 1 (continuing)
     exit status: 0


File: autoconf.info,  Node: VPATH and Make,  Next: Single Suffix Rules,  Prev: make -k Status,  Up: Portable Make

12.18 `VPATH' and Make
======================

Posix does not specify the semantics of `VPATH'.  Typically, `make'
supports `VPATH', but its implementation is not consistent.

   Autoconf and Automake support makefiles whose usages of `VPATH' are
portable to recent-enough popular implementations of `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
`VPATH' should expect to find many bugs in this area.  If you use
`VPATH', the simplest way to avoid these portability bugs is to stick
with GNU `make', since it is the most commonly-used `make' among
Autoconf users.

   Here are some known issues with some `VPATH' implementations.

* Menu:

* Variables listed in VPATH::   `VPATH' must be literal on ancient hosts
* VPATH and Double-colon::      Problems with `::' on ancient hosts
* $< in Explicit Rules::        `$<' does not work in ordinary rules
* Automatic Rule Rewriting::    `VPATH' goes wild on Solaris
* Tru64 Directory Magic::       `mkdir' goes wild on Tru64
* Make Target Lookup::          More details about `VPATH' lookup


File: autoconf.info,  Node: Variables listed in VPATH,  Next: VPATH and Double-colon,  Up: VPATH and Make

12.18.1 Variables listed in `VPATH'
-----------------------------------

Do not set `VPATH' to the value of another variable, for example `VPATH
= $(srcdir)', because some ancient versions of `make' do not do
variable substitutions on the value of `VPATH'.  For example, use this

     srcdir = @srcdir@
     VPATH = @srcdir@

rather than `VPATH = $(srcdir)'.  Note that with GNU Automake, there is
no need to set this yourself.


File: autoconf.info,  Node: VPATH and Double-colon,  Next: $< in Explicit Rules,  Prev: Variables listed in VPATH,  Up: VPATH and Make

12.18.2 `VPATH' and Double-colon Rules
--------------------------------------

With ancient versions of Sun `make', any assignment to `VPATH' causes
`make' to execute only the first set of double-colon rules.  However,
this problem is no longer of practical concern.


File: autoconf.info,  Node: $< in Explicit Rules,  Next: Automatic Rule Rewriting,  Prev: VPATH and Double-colon,  Up: VPATH and Make

12.18.3 `$<' Not Supported in Explicit Rules
--------------------------------------------

Using `$<' 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 `VPATH' search, you have to code the whole thing
manually.  *Note Build Directories::.


File: autoconf.info,  Node: Automatic Rule Rewriting,  Next: Tru64 Directory Magic,  Prev: $< in Explicit Rules,  Up: VPATH and Make

12.18.4 Automatic Rule Rewriting
--------------------------------

Some `make' implementations, such as Solaris and Tru64, search for
prerequisites in `VPATH' and then rewrite each occurrence as a plain
word in the rule.  For instance:

     # This isn't portable to GNU make.
     VPATH = ../pkg/src
     f.c: if.c
             cp if.c f.c

executes `cp ../pkg/src/if.c f.c' if `if.c' is found in `../pkg/src'.

   However, this rule leads to real problems in practice.  For example,
if the source directory contains an ordinary file named `test' that is
used in a dependency, Solaris `make' rewrites commands like `if test -r
foo; ...' to `if ../pkg/src/test -r foo; ...', which is typically
undesirable.  In fact, `make' is completely unaware of shell syntax
used in the rules, so the VPATH rewrite can potentially apply to _any_
whitespace-separated word in a rule, including shell variables,
functions, and keywords.

     $ mkdir build
     $ cd build
     $ cat > Makefile <<'END'
     VPATH = ..
     all: arg func for echo
             func () { for arg in "$$@"; do echo $$arg; done; }; \
             func "hello world"
     END
     $ touch ../arg ../func ../for ../echo
     $ make
     ../func () { ../for ../arg in "$@"; do ../echo $arg; done; }; \
     ../func "hello world"
     sh: syntax error at line 1: `do' unexpected
     *** Error code 2

To avoid this problem, portable makefiles should never mention a source
file or dependency whose name is that of a shell keyword like `for' or
`until', a shell command like `cat' or `gcc' or `test', or a shell
function or variable used in the corresponding `Makefile' recipe.

   Because of these problems GNU `make' and many other `make'
implementations do not rewrite commands, so portable makefiles should
search `VPATH' manually.  It is tempting to write this:

     # 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

However, the "prerequisite rewriting" still applies here.  So if `if.c'
is in `../pkg/src', Solaris and Tru64 `make' execute

     cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c

which reduces to

     cp if.c f.c

and thus fails.  Oops.

   A simple workaround, and good practice anyway, is to use `$?' and
`$@' when possible:

     VPATH = ../pkg/src
     f.c: if.c
             cp $? $@

but this does not generalize well to commands with multiple
prerequisites.  A more general workaround is to rewrite the rule so that
the prerequisite `if.c' never appears as a plain word.  For example,
these three rules would be safe, assuming `if.c' is in `../pkg/src' and
the other files are in the working directory:

     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 >$@

   Things get worse when your prerequisites are in a macro.

     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; \
             done

   The above `install-HEADERS' rule is not Solaris-proof because `for i
in $(HEADERS);' is expanded to `for i in f.h g.h h.h;' where `f.h' and
`g.h' are plain words and are hence subject to `VPATH' adjustments.

   If the three files are in `../pkg/src', the rule is run as:

     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

   where the two first `install' calls fail.  For instance, consider
the `f.h' installation:

     install -m 644 \
       `test -f ../pkg/src/f.h || \
         echo ../pkg/src/ \
       `../pkg/src/f.h \
       /usr/local/include/../pkg/src/f.h;

It reduces to:

     install -m 644 \
       ../pkg/src/f.h \
       /usr/local/include/../pkg/src/f.h;

   Note that the manual `VPATH' search did not cause any problems here;
however this command installs `f.h' in an incorrect directory.

   Trying to quote `$(HEADERS)' in some way, as we did for `foo.c' a
few makefiles ago, does not help:

     install-HEADERS: $(HEADERS)
             headers='$(HEADERS)'; \
             for i in $$headers; do \
               $(INSTALL) -m 644 \
                 `test -f $$i || echo $(VPATH)/`$$i \
                 $(DESTDIR)$(includedir)/$$i; \
             done

   Now, `headers='$(HEADERS)'' macro-expands to:

     headers='f.h g.h h.h'

but `g.h' is still a plain word.  (As an aside, the idiom
`headers='$(HEADERS)'; for i in $$headers;' is a good idea if
`$(HEADERS)' can be empty, because some shells diagnose a syntax error
on `for i in;'.)

   One workaround is to strip this unwanted `../pkg/src/' prefix
manually:

     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; \
             done

   Automake does something similar.  However the above hack works only
if the files listed in `HEADERS' are in the current directory or a
subdirectory; they should not be in an enclosing directory.  If we had
`HEADERS = ../f.h', the above fragment would fail in a VPATH build with
Tru64 `make'.  The reason is that not only does Tru64 `make' rewrite
dependencies, but it also simplifies them.  Hence `../f.h' becomes
`../pkg/f.h' instead of `../pkg/src/../f.h'.  This obviously defeats
any attempt to strip a leading `../pkg/src/' component.

   The following example makes the behavior of Tru64 `make' more
apparent.

     $ cat Makefile
     VPATH = sub
     all: ../foo
             echo ../foo
     $ ls
     Makefile foo
     $ make
     echo foo
     foo

Dependency `../foo' was found in `sub/../foo', but Tru64 `make'
simplified it as `foo'.  (Note that the `sub/' directory does not even
exist, this just means that the simplification occurred before the file
was checked for.)

   For the record here is how SunOS 4 `make' behaves on this example.

     $ make
     make: Fatal error: Don't know how to make target `../foo'
     $ mkdir sub
     $ make
     echo sub/../foo
     sub/../foo


File: autoconf.info,  Node: Tru64 Directory Magic,  Next: Make Target Lookup,  Prev: Automatic Rule Rewriting,  Up: VPATH and Make

12.18.5 Tru64 `make' Creates Prerequisite Directories Magically
---------------------------------------------------------------

When a prerequisite is a subdirectory of `VPATH', Tru64 `make' creates
it in the current directory.

     $ mkdir -p foo/bar build
     $ cd build
     $ cat >Makefile <<END
     VPATH = ..
     all: foo/bar
     END
     $ make
     mkdir foo
     mkdir foo/bar

   This can yield unexpected results if a rule uses a manual `VPATH'
search as presented before.

     VPATH = ..
     all : foo/bar
             command `test -d foo/bar || echo ../`foo/bar

   The above `command' is run on the empty `foo/bar' directory that was
created in the current directory.


File: autoconf.info,  Node: Make Target Lookup,  Prev: Tru64 Directory Magic,  Up: VPATH and Make

12.18.6 Make Target Lookup
--------------------------

GNU `make' uses a complex algorithm to decide when it should use files
found via a `VPATH' search.  *Note How Directory Searches are
Performed: (make)Search Algorithm.

   If a target needs to be rebuilt, GNU `make' discards the file name
found during the `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 `make' uses the file name found during the
`VPATH' search.

   Other `make' implementations, like NetBSD `make', are easier to
describe: the file name found during the `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 `VPATH' location.

   OpenBSD and FreeBSD `make', however, never perform a `VPATH' search
for a dependency that has an explicit rule.  This is extremely annoying.

   When attempting a `VPATH' build for an autoconfiscated package
(e.g., `mkdir build && cd build && ../configure'), this means GNU
`make' builds everything locally in the `build' directory, while BSD
`make' builds new files locally and updates existing files in the
source directory.

     $ cat Makefile
     VPATH = ..
     all: foo.x bar.x
     foo.x bar.x: newer.x
             @echo Building $@
     $ touch ../bar.x
     $ touch ../newer.x
     $ make        # GNU make
     Building foo.x
     Building bar.x
     $ pmake       # NetBSD make
     Building foo.x
     Building ../bar.x
     $ fmake       # FreeBSD make, OpenBSD make
     Building foo.x
     Building bar.x
     $ tmake       # Tru64 make
     Building foo.x
     Building bar.x
     $ touch ../bar.x
     $ make        # GNU make
     Building foo.x
     $ pmake       # NetBSD make
     Building foo.x
     $ fmake       # FreeBSD make, OpenBSD make
     Building foo.x
     Building bar.x
     $ tmake       # Tru64 make
     Building foo.x
     Building bar.x

   Note how NetBSD `make' updates `../bar.x' in its VPATH location, and
how FreeBSD, OpenBSD, and Tru64 `make' always update `bar.x', even when
`../bar.x' is up to date.

   Another point worth mentioning is that once GNU `make' has decided
to ignore a `VPATH' file name (e.g., it ignored `../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 `make' does not look up `bar.x'
in `VPATH' before performing the `.x.y' rule, because it ignored the
`VPATH' result of `bar.x' while running the `bar.x: newer.x' rule.

     $ cat Makefile
     VPATH = ..
     all: bar.y
     bar.x: newer.x
             @echo Building $@
     .SUFFIXES: .x .y
     .x.y:
             cp $< $@
     $ touch ../bar.x
     $ touch ../newer.x
     $ 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
     $ pmake       # NetBSD make
     Building ../bar.x
     cp ../bar.x bar.y
     $ rm bar.y
     $ 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
     $ tmake       # Tru64 make
     Building bar.x
     cp: bar.x: No such file or directory
     *** Exit 1

   Note that if you drop away the command from the `bar.x: newer.x'
rule, GNU `make' magically starts to work: it knows that `bar.x' hasn't
been updated, therefore it doesn't discard the result from `VPATH'
(`../bar.x') in succeeding uses.  Tru64 also works, but FreeBSD and
OpenBSD still don't.

     $ cat Makefile
     VPATH = ..
     all: bar.y
     bar.x: newer.x
     .SUFFIXES: .x .y
     .x.y:
             cp $< $@
     $ touch ../bar.x
     $ touch ../newer.x
     $ make        # GNU make
     cp ../bar.x bar.y
     $ rm bar.y
     $ pmake       # NetBSD make
     cp ../bar.x bar.y
     $ rm bar.y
     $ fmake       # FreeBSD make, OpenBSD make
     cp bar.x bar.y
     cp: cannot stat `bar.x': No such file or directory
     *** Error code 1
     $ tmake       # Tru64 make
     cp ../bar.x bar.y

   It seems the sole solution that would please every `make'
implementation is to never rely on `VPATH' searches for targets.  In
other words, `VPATH' should be reserved to unbuilt sources.


File: autoconf.info,  Node: Single Suffix Rules,  Next: Timestamps and Make,  Prev: VPATH and Make,  Up: Portable Make

12.19 Single Suffix Rules and Separated Dependencies
====================================================

A "Single Suffix Rule" is basically a usual suffix (inference) rule
(`.from.to:'), but which _destination_ suffix is empty (`.from:').

   "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 `make' does not support separated dependencies for targets
defined by single suffix rules:

     $ cat Makefile
     .SUFFIXES: .in
     foo: foo.in
     .in:
             cp $< $@
     $ touch foo.in
     $ make
     $ ls
     Makefile  foo.in

while GNU Make does:

     $ gmake
     cp foo.in foo
     $ ls
     Makefile  foo       foo.in

   Note it works without the `foo: foo.in' dependency.

     $ cat Makefile
     .SUFFIXES: .in
     .in:
             cp $< $@
     $ make foo
     cp foo.in foo

and it works with double suffix inference rules:

     $ cat Makefile
     foo.out: foo.in
     .SUFFIXES: .in .out
     .in.out:
             cp $< $@
     $ make
     cp foo.in foo.out

   As a result, in such a case, you have to write target rules.


File: autoconf.info,  Node: Timestamps and Make,  Prev: Single Suffix Rules,  Up: Portable Make

12.20 Timestamp Resolution and Make
===================================

Traditionally, file timestamps had 1-second resolution, and `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 `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 `sleep 1' to work around
timestamp truncation bugs.

   Commands like `cp -p' and `touch -r' typically do not copy file
timestamps to their full resolutions (*note Limitations of Usual Tools:
touch.).  Hence you should be wary of rules like this:

     dest: src
             cp -p src dest

   as `dest' often appears to be older than `src' after the timestamp
is truncated, and this can cause `make' to do needless rework the next
time it is invoked.  To work around this problem, you can use a
timestamp file, e.g.:

     dest-stamp: src
             cp -p src dest
             date >dest-stamp

   Apart from timestamp resolution, there are also differences in
handling equal timestamps.  HP-UX `make' updates targets if it has the
same time stamp as one of its prerequisites, in violation of Posix
rules.

   This can cause spurious rebuilds for repeated runs of `make'.  This
in turn can cause `make' to fail if it tries to rebuild generated files
in a possibly read-only source tree with tools not present on the
end-user machine.  Use GNU `make' instead.


File: autoconf.info,  Node: Portable C and C++,  Next: Manual Configuration,  Prev: Portable Make,  Up: Top

13 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.  *Note Language Standards Supported by GCC: (gcc)Standards,
for a list of C-related standards.  Many programs also assume the Posix
standard (http://www.opengroup.org/susv3).

   Some old code is written to be portable to K&R C, which predates any
C standard.  K&R C compilers are no longer of practical interest,
though, and the rest of section assumes at least C89, the first C
standard.

   Program portability is a huge topic, and this section can only
briefly introduce common pitfalls.  *Note Portability between System
Types: (standards)System Portability, for more information.

* Menu:

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


File: autoconf.info,  Node: Varieties of Unportability,  Next: Integer Overflow,  Up: Portable C and C++

13.1 Varieties of Unportability
===============================

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

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

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


File: autoconf.info,  Node: Integer Overflow,  Next: Preprocessor Arithmetic,  Prev: Varieties of Unportability,  Up: Portable C and C++

13.2 Integer Overflow
=====================

In practice many portable C programs assume that signed integer
overflow wraps around reliably using two's complement arithmetic.  Yet
the C standard says that program behavior is undefined on overflow, and
in a few cases C programs do not work on some modern implementations
because their overflows do not wrap around as their authors expected.
Conversely, in signed integer remainder, the C standard requires
overflow behavior that is commonly not implemented.

* 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::     `INT_MIN / -1' and `INT_MIN % -1'


File: autoconf.info,  Node: Integer Overflow Basics,  Next: Signed Overflow Examples,  Up: Integer Overflow

13.2.1 Basics of Integer Overflow
---------------------------------

In languages like C, unsigned integer overflow reliably wraps around;
e.g., `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.

   Despite this requirement of the standard, many C programs and
Autoconf tests assume that signed integer overflow silently wraps
around modulo a power of two, using two's complement arithmetic, so
long as you cast the resulting value to a signed integer type or store
it into a signed integer variable.  If you use conservative
optimization flags, such programs are generally portable to the vast
majority of modern platforms, with a few exceptions discussed later.

   For historical reasons the C standard also allows implementations
with ones' complement or signed magnitude arithmetic, but 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, but this might include raising an exception.  In practice all
known implementations support silent wraparound in this case, so you
need not worry about other possibilities.


File: autoconf.info,  Node: Signed Overflow Examples,  Next: Optimization and Wraparound,  Prev: Integer Overflow Basics,  Up: Integer Overflow

13.2.2 Examples of Code Assuming Wraparound Overflow
----------------------------------------------------

There has long been a tension between what the C standard requires for
signed integer overflow, and what C programs commonly assume.  The
standard allows aggressive optimizations based on assumptions that
overflow never occurs, but many practical C programs rely on overflow
wrapping around.  These programs do not conform to the standard, but
they commonly work in practice because compiler writers are
understandably reluctant to implement optimizations that would break
many programs, unless perhaps a user specifies aggressive optimization.

   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:

     if (password == expected_password)
       allow_superuser_privileges ();
     else if (counter++ == INT_MAX)
       abort ();
     else
       printf ("%d password mismatches\n", counter);

If the `int' variable `counter' equals `INT_MAX', `counter++' must
overflow and the behavior is undefined, so the C standard allows the
compiler to optimize away the test against `INT_MAX' and the `abort'
call.  Worse, if an earlier bug in the program lets the compiler deduce
that `counter == INT_MAX' or that `counter' previously overflowed, the
C standard allows the compiler to optimize away the password test and
generate code that allows superuser privileges unconditionally.

   Despite this requirement by the standard, it has long been common
for C code to assume wraparound arithmetic after signed overflow, and
all known practical C implementations support some C idioms that assume
wraparound signed arithmetic, even if the idioms do not conform
strictly to the standard.  If your code looks like the following
examples it will almost surely work with real-world compilers.

   Here is an example derived from the 7th Edition Unix implementation
of `atoi' (1979-01-10):

     char *p;
     int f, n;
     ...
     while (*p >= '0' && *p <= '9')
       n = n * 10 + *p++ - '0';
     return (f ? -n : n);

Even if the input string is in range, on most modern machines this has
signed overflow when computing the most negative integer (the `-n'
overflows) or a value near an extreme integer (the first `+' overflows).

   Here is another example, derived from the 7th Edition implementation
of `rand' (1979-01-10).  Here the programmer expects both
multiplication and addition to wrap on overflow:

     static long int randx = 1;
     ...
     randx = randx * 1103515245 + 12345;
     return (randx >> 16) & 077777;

   In the following example, derived from the GNU C Library 2.5
implementation of `mktime' (2006-09-09), the code assumes wraparound
arithmetic in `+' to detect signed overflow:

     time_t t, t1, t2;
     int sec_requested, sec_adjustment;
     ...
     t1 = t + sec_requested;
     t2 = t1 + sec_adjustment;
     if (((t1 < t) != (sec_requested < 0))
         | ((t2 < t1) != (sec_adjustment < 0)))
       return -1;

   If your code looks like these examples, it is probably safe even
though it does not strictly conform to the C standard.  This might lead
one to believe that one can generally assume wraparound on overflow,
but that is not always true, as can be seen in the next section.


File: autoconf.info,  Node: Optimization and Wraparound,  Next: Signed Overflow Advice,  Prev: Signed Overflow Examples,  Up: Integer Overflow

13.2.3 Optimizations That Break Wraparound Arithmetic
-----------------------------------------------------

Compilers sometimes generate code that is incompatible with wraparound
integer arithmetic.  A simple example is an algebraic simplification: a
compiler might translate `(i * 2000) / 1000' to `i * 2' because it
assumes that `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 `int', if `i' has
type `int' and value `1073742', the original expression returns
-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
`sumc':

     int
     sumc (int lo, int hi)
     {
       int sum = 0;
       int i;
       for (i = lo; i <= hi; i++)
         sum ^= i * 53;
       return sum;
     }

To avoid multiplying by 53 each time through the loop, an optimizing
compiler might internally transform `sumc' to the equivalent of the
following:

     int
     transformed_sumc (int lo, int hi)
     {
       int sum = 0;
       int hic = hi * 53;
       int ic;
       for (ic = lo * 53; ic <= hic; ic += 53)
         sum ^= ic;
       return sum;
     }

This transformation is allowed by the C standard, but it is invalid for
wraparound arithmetic when `INT_MAX / 53 < hi', because then the
overflow in computing expressions like `hi * 53' can cause the
expression `i <= hi' to yield a different value from the transformed
expression `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 `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:

     int j;
     for (j = 1; 0 < j; j *= 2)
       test (j);

Here, the loop attempts to iterate through all powers of 2 that `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 not done by any production version of GCC with `-O2',
but it might be performed by other compilers, or by more aggressive GCC
optimization options, and the GCC developers have not decided whether
it will continue to work with GCC and `-O2'.


File: autoconf.info,  Node: Signed Overflow Advice,  Next: Signed Integer Division,  Prev: Optimization and Wraparound,  Up: Integer Overflow

13.2.4 Practical Advice for Signed Overflow Issues
--------------------------------------------------

Ideally the safest approach is to avoid signed integer overflow
entirely.  For example, instead of multiplying two signed integers, you
can convert them to unsigned integers, multiply the unsigned values,
then test whether the result is in signed range.

   Rewriting code in this way will be inconvenient, though,
particularly if the signed values might be negative.  Also, it may hurt
performance.  Using unsigned arithmetic to check for overflow is
particularly painful to do portably and efficiently when dealing with an
integer type like `uid_t' whose width and signedness vary from platform
to platform.

   Furthermore, many C applications pervasively assume wraparound
behavior and typically it is not easy to find and remove all these
assumptions.  Hence it is often useful to maintain nonstandard code
that assumes wraparound on overflow, instead of rewriting the code.
The rest of this section attempts to give practical advice for this
situation.

   If your code wants to detect signed integer overflow in `sum = a +
b', it is generally safe to use an expression like `(sum < a) != (b <
0)'.

   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.

     for (i = INT_MAX - 10; i <= INT_MAX; i++)
       if (i + 1 < 0)
         {
           report_overflow ();
           break;
         }

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 uses an expression like `(i * 2000) / 1000' and you
actually want the multiplication to wrap around on overflow, use
unsigned arithmetic to do it, e.g., `((int) (i * 2000u)) / 1000'.

   If your code 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 `-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 port to platforms where signed integer overflow does
not reliably wrap around (e.g., due to hardware overflow checking, or to
highly aggressive optimizations), you should consider debugging with
GCC's `-ftrapv' option, which causes signed overflow to raise an
exception.


File: autoconf.info,  Node: Signed Integer Division,  Prev: Signed Overflow Advice,  Up: Integer Overflow

13.2.5 Signed Integer Division and Integer Overflow
---------------------------------------------------

Overflow in signed integer division is not always harmless: for
example, on CPUs of the i386 family, dividing `INT_MIN' by `-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, even though the C standard requires `INT_MIN % -1' to yield
zero because the expression does not overflow.


File: autoconf.info,  Node: Preprocessor Arithmetic,  Next: Null Pointers,  Prev: Integer Overflow,  Up: Portable C and C++

13.3 Preprocessor Arithmetic
============================

In C99, preprocessor arithmetic, used for `#if' expressions, must be
evaluated as if all signed values are of type `intmax_t' and all
unsigned values of type `uintmax_t'.  Many compilers are buggy in this
area, though.  For example, as of 2007, Sun C mishandles `#if LLONG_MIN
< 0' on a platform with 32-bit `long int' and 64-bit `long long int'.
Also, some older preprocessors mishandle constants ending in `LL'.  To
work around these problems, you can compute the value of expressions
like `LONG_MAX < LLONG_MAX' at `configure'-time rather than at
`#if'-time.


File: autoconf.info,  Node: Null Pointers,  Next: Buffer Overruns,  Prev: Preprocessor Arithmetic,  Up: Portable C and C++

13.4 Properties of 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 `memset' with 0 to set
all the pointers in an array to null values.

   If `p' is a null pointer to an object type, the C expression `p + 0'
always evaluates to `p' on modern hosts, even though the standard says
that it has undefined behavior.


File: autoconf.info,  Node: Buffer Overruns,  Next: Volatile Objects,  Prev: Null Pointers,  Up: Portable C and C++

13.5 Buffer Overruns and Subscript Errors
=========================================

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., `&a[N]' where `a' has `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., `&a[-1]'; nor
is it valid to compute two past the end, e.g., `&a[N+1]'.  On most
platforms `&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.

   Valgrind (http://valgrind.org/) can catch many overruns.  GCC users
might also consider using the `-fmudflap' option to catch overruns.

   Buffer overruns are usually caused by off-by-one errors, but there
are more subtle ways to get them.

   Using `int' values to index into an array or compute array sizes
causes problems on typical 64-bit hosts where an array index might be
2^31 or larger.  Index values of type `size_t' avoid this problem, but
cannot be negative.  Index values of type `ptrdiff_t' are signed, and
are wide enough in practice.

   If you add or multiply two numbers to calculate an array size, e.g.,
`malloc (x * sizeof y + z)', havoc ensues if the addition or
multiplication overflows.

   Many implementations of the `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 `asctime', `asctime_r', `ctime', `ctime_r',
and `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
`gets' function is the worst, since it almost invariably overflows its
buffer when presented with an input line larger than the buffer.


File: autoconf.info,  Node: Volatile Objects,  Next: Floating Point Portability,  Prev: Buffer Overruns,  Up: Portable C and C++

13.6 Volatile Objects
=====================

The keyword `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.

   `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 `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 `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, the standard does not make it clear whether users can
observe accesses by volatile lvalues to ordinary objects.  For 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.
        It's not clear whether accesses to *P are "visible".  */
     int y;
     int *z = malloc (sizeof (int));
     int volatile *p;
     p = &y;
     *p = 1;
     p = z;
     *p = 1;

   Programmers often wish that `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.  Worse,
it is not clear from the standard whether volatile lvalues provide more
guarantees in general than nonvolatile lvalues, if the underlying
objects are ordinary.

   Even when accessing objects defined with a volatile type, the C
standard allows only extremely limited signal handlers: the behavior is
undefined if a signal handler reads any nonlocal object, or writes to
any nonlocal object whose type is not `sig_atomic_t volatile', or calls
any standard library function other than `abort', `signal', and (if C99)
`_Exit'.  Hence C compilers need not worry about a signal handler
disturbing ordinary computation, unless the computation accesses a
`sig_atomic_t volatile' lvalue that is not a local variable.  (There is
an obscure exception for accesses via a pointer to a volatile
character, since it may point into part of a `sig_atomic_t volatile'
object.)  Posix adds to the list of library functions callable from a
portable signal handler, but otherwise is like the C standard in this
area.

   Some C implementations allow memory-access optimizations within each
translation unit, such that actual behavior agrees with the behavior
required by the standard only when calling a function in some other
translation unit, and a signal handler acts like it was called from a
different translation unit.  The C standard hints that in these
implementations, objects referred to by signal handlers "would require
explicit specification of `volatile' storage, as well as other
implementation-defined restrictions."  But unfortunately even for this
special case these other restrictions are often not documented well.
*Note When is a Volatile Object Accessed?: (gcc)Volatiles, for some
restrictions imposed by GCC.  *Note Defining Signal Handlers:
(libc)Defining Handlers, 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
`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
handwaving 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 `volatile', C++ has the same problems that C does.
Multithreaded applications have even more problems with `volatile', but
they are beyond the scope of this section.

   The bottom line is that using `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 `volatile' to a data structure merely alleviates some
symptoms of a bug while not fixing the bug in general.


File: autoconf.info,  Node: Floating Point Portability,  Next: Exiting Portably,  Prev: Volatile Objects,  Up: Portable C and C++

13.7 Floating Point Portability
===============================

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 What Every Computer Scientist
Should Know About Floating-Point Arithmetic
(http://www.validlab.com/goldberg/paper.pdf).


File: autoconf.info,  Node: Exiting Portably,  Prev: Floating Point Portability,  Up: Portable C and C++

13.8 Exiting Portably
=====================

A C or C++ program can exit with status N by returning N from the
`main' function.  Portable programs are supposed to exit either with
status 0 or `EXIT_SUCCESS' to succeed, or with status `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.  Programs on SunOS 2.0 (1985) through 3.5.2
(1988) incorrectly exited with zero status when `main' returned
nonzero, but ancient systems like these are no longer of practical
concern.

   A program can also exit with status N by passing N to the `exit'
function, and a program can fail by calling the `abort' function.  If a
program is specialized to just some platforms, it can fail by calling
functions specific to those platforms, e.g., `_exit' (Posix) and
`_Exit' (C99).  However, like other functions, an exit function should
be declared, typically by including a header.  For example, if a C
program calls `exit', it should include `stdlib.h' either directly or
via the default includes (*note 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.


File: autoconf.info,  Node: Manual Configuration,  Next: Site Configuration,  Prev: Portable C and C++,  Up: Top

14 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.  You
can check for such features using ad-hoc means, such as having
`configure' check the output of the `uname' program, or looking for
libraries that are unique to particular systems.  However, Autoconf
provides a uniform method for handling unguessable features.

* Menu:

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


File: autoconf.info,  Node: Specifying Target Triplets,  Next: Canonicalizing,  Up: Manual Configuration

14.1 Specifying target triplets
===============================

Autoconf-generated `configure' scripts can make decisions based on a
canonical name for the system type, or "target triplet", which has the
form: `CPU-VENDOR-OS', where OS can be `SYSTEM' or `KERNEL-SYSTEM'

   `configure' can usually guess the canonical name for the type of
system it's running on.  To do so it runs a script called
`config.guess', which infers the name using the `uname' command or
symbols predefined by the C preprocessor.

   Alternately, the user can specify the system type with command line
arguments to `configure' (*note System Type::.  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:

`--build=BUILD-TYPE'
     the type of system on which the package is being configured and
     compiled.  It defaults to the result of running `config.guess'.
     Specifying a BUILD-TYPE that differs from HOST-TYPE enables
     cross-compilation mode.

`--host=HOST-TYPE'
     the type of system on which the package runs.  By default it is the
     same as the build machine.  Specifying a HOST-TYPE that differs
     from BUILD-TYPE, when BUILD-TYPE was also explicitly specified,
     enables cross-compilation mode.

`--target=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.

   If you mean to override the result of `config.guess', use `--build',
not `--host', since the latter enables cross-compilation.  For
historical reasons, whenever you specify `--host', be sure to specify
`--build' too; this will be fixed in the future.  So, to enter
cross-compilation mode, use a command like this

     ./configure --build=i686-pc-linux-gnu --host=m68k-coff

Note that if you do not specify `--host', `configure' fails if it can't
run the code generated by the specified compiler.  For example,
configuring as follows fails:

     ./configure CC=m68k-coff-gcc

   When cross-compiling, `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 `cc' is used
with a native `pkg-config', then libraries found by `pkg-config' will
likely cause subtle build failures; but using the names `m68k-coff-cc'
and `m68k-coff-pkg-config' avoids any confusion.  Avoiding the warning
is as simple as creating the correct symlinks naming the cross tools.

   `configure' recognizes short aliases for many system types; for
example, `decstation' can be used instead of `mips-dec-ultrix4.2'.
`configure' runs a script called `config.sub' to canonicalize system
type aliases.

   This section deliberately omits the description of the obsolete
interface; see *note Hosts and Cross-Compilation::.


File: autoconf.info,  Node: Canonicalizing,  Next: Using System Type,  Prev: Specifying Target Triplets,  Up: Manual Configuration

14.2 Getting the Canonical System Type
======================================

The following macros make the system type available to `configure'
scripts.

   The variables `build_alias', `host_alias', and `target_alias' are
always exactly the arguments of `--build', `--host', and `--target'; in
particular, they are left empty if the user did not use them, even if
the corresponding `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.

   If you use these macros, you must distribute `config.guess' and
`config.sub' along with your source code.  *Note Output::, for
information about the `AC_CONFIG_AUX_DIR' macro which you can use to
control in which directory `configure' looks for those scripts.

 -- Macro: AC_CANONICAL_BUILD
     Compute the canonical build-system type variable, `build', and its
     three individual parts `build_cpu', `build_vendor', and `build_os'.

     If `--build' was specified, then `build' is the canonicalization
     of `build_alias' by `config.sub', otherwise it is determined by
     the shell script `config.guess'.

 -- Macro: AC_CANONICAL_HOST
     Compute the canonical host-system type variable, `host', and its
     three individual parts `host_cpu', `host_vendor', and `host_os'.

     If `--host' was specified, then `host' is the canonicalization of
     `host_alias' by `config.sub', otherwise it defaults to `build'.

 -- Macro: AC_CANONICAL_TARGET
     Compute the canonical target-system type variable, `target', and
     its three individual parts `target_cpu', `target_vendor', and
     `target_os'.

     If `--target' was specified, then `target' is the canonicalization
     of `target_alias' by `config.sub', otherwise it defaults to `host'.

   Note that there can be artifacts due to the backward compatibility
code.  *Note Hosts and Cross-Compilation::, for more.


File: autoconf.info,  Node: Using System Type,  Prev: Canonicalizing,  Up: Manual Configuration

14.3 Using the System Type
==========================

In `configure.ac' the system type is generally used by one or more
`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.  `$(CYCLE_OBJ)' in the
following would be used in a makefile to add the object to a program or
library.

     AS_CASE([$host],
       [alpha*-*-*], [CYCLE_OBJ=rpcc.o],
       [i?86-*-*],   [CYCLE_OBJ=rdtsc.o],
       [CYCLE_OBJ=""]
     )
     AC_SUBST([CYCLE_OBJ])

   `AC_CONFIG_LINKS' (*note 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.

     case $host in
       alpha*-*-*)   AC_CONFIG_LINKS([dither.c:alpha/dither.c]) ;;
       powerpc*-*-*) AC_CONFIG_LINKS([dither.c:powerpc/dither.c]) ;;
       *-*-*)        AC_CONFIG_LINKS([dither.c:generic/dither.c]) ;;
     esac

   The host system type can also be used to find cross-compilation tools
with `AC_CHECK_TOOL' (*note Generic Programs::).

   The above examples all show `$host', since this is where the code is
going to run.  Only rarely is it necessary to test `$build' (which is
where the build is being done).

   Whenever you're tempted to use `$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,

   * Availability of libraries and library functions should always be
     checked by probing.

   * 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 `$host'.

   * Assembler code is inevitably highly CPU-specific and is best
     selected according to `$host_cpu'.

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

   `$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.  `$target' generally selects various hard-coded CPU and
system conventions, since usually the compiler or tools under
construction themselves determine how the target works.


File: autoconf.info,  Node: Site Configuration,  Next: Running configure Scripts,  Prev: Manual Configuration,  Up: Top

15 Site Configuration
*********************

`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 `configure' options.

* Menu:

* Help Formatting::             Customizing `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 `configure' options
* Site Details::                Configuring site details
* Transforming Names::          Changing program names when installing
* Site Defaults::               Giving `configure' local defaults


File: autoconf.info,  Node: Help Formatting,  Next: External Software,  Up: Site Configuration

15.1 Controlling Help Output
============================

Users consult `configure --help' to learn of configuration decisions
specific to your package.  By default, `configure' breaks this output
into sections for each type of option; within each section, help
strings appear in the order `configure.ac' defines them:

     Optional Features:
       ...
       --enable-bar            include bar

     Optional Packages:
       ...
       --with-foo              use foo

 -- Macro: AC_PRESERVE_HELP_ORDER
     Request an alternate `--help' format, in which options of all
     types appear together, in the order defined.  Call this macro
     before any `AC_ARG_ENABLE' or `AC_ARG_WITH'.

          Optional Features and Packages:
            ...
            --enable-bar            include bar
            --with-foo              use foo



File: autoconf.info,  Node: External Software,  Next: Package Options,  Prev: Help Formatting,  Up: Site Configuration

15.2 Working With External Software
===================================

Some packages require, or can optionally use, other software packages
that are already installed.  The user can give `configure' command line
options to specify which such external software to use.  The options
have one of these forms:

     --with-PACKAGE[=ARG]
     --without-PACKAGE

   For example, `--with-gnu-ld' means work with the GNU linker instead
of some other linker.  `--with-x' means work with The X Window System.

   The user can give an argument by following the package name with `='
and the argument.  Giving an argument of `no' is for packages that are
used by default; it says to _not_ use the package.  An argument that is
neither `yes' nor `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 `yes'.  `--without-PACKAGE' is equivalent to `--with-PACKAGE=no'.

   Normally `configure' scripts complain about `--with-PACKAGE' options
that they do not support.  *Note Option Checking::, for details, and
for how to override the defaults.

   For each external software package that may be used, `configure.ac'
should call `AC_ARG_WITH' to detect whether the `configure' user asked
to use it.  Whether each package is used or not by default, and which
arguments are valid, is up to you.

 -- Macro: AC_ARG_WITH (PACKAGE, HELP-STRING, [ACTION-IF-GIVEN],
          [ACTION-IF-NOT-GIVEN])
     If the user gave `configure' the option `--with-PACKAGE' or
     `--without-PACKAGE', run shell commands ACTION-IF-GIVEN.  If
     neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
     The name 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
     ACTION-IF-GIVEN in the shell variable `withval', which is actually
     just the value of the shell variable named `with_PACKAGE', with
     any non-alphanumeric characters in PACKAGE changed into `_'.  You
     may use that variable instead, if you wish.

     The argument HELP-STRING is a description of the option that looks
     like this:
            --with-readline         support fancy command line editing

     HELP-STRING may be more than one line long, if more detail is
     needed.  Just make sure the columns line up in `configure --help'.
     Avoid tabs in the help string.  The easiest way to provide the
     proper leading whitespace is to format your HELP-STRING with the
     macro `AS_HELP_STRING' (*note Pretty Help Strings::).

     The following example shows how to use the `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 `--with-readline' nor
     `--without-readline', you want to enable support for readline only
     if the library is available on the system.

          AC_ARG_WITH([readline],
            [AS_HELP_STRING([--with-readline],
              [support fancy command line editing @<:@default=check@:>@])],
            [],
            [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)])

     The next example shows how to use `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.

          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])])

     The last example shows how to use `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.

          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])])

     These three examples can be easily adapted to the case where
     `AC_ARG_ENABLE' should be preferred to `AC_ARG_WITH' (see *note
     Package Options::).


File: autoconf.info,  Node: Package Options,  Next: Pretty Help Strings,  Prev: External Software,  Up: Site Configuration

15.3 Choosing Package Options
=============================

If a software package has optional compile-time features, the user can
give `configure' command line options to specify whether to compile
them.  The options have one of these forms:

     --enable-FEATURE[=ARG]
     --disable-FEATURE

   These options allow users to choose which optional features to build
and install.  `--enable-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 `='
and the argument.  Giving an argument of `no' requests that the feature
_not_ be made available.  A feature with an argument looks like
`--enable-debug=stabs'.  If no argument is given, it defaults to `yes'.
`--disable-FEATURE' is equivalent to `--enable-FEATURE=no'.

   Normally `configure' scripts complain about `--enable-PACKAGE'
options that they do not support.  *Note Option Checking::, for
details, and for how to override the defaults.

   For each optional feature, `configure.ac' should call
`AC_ARG_ENABLE' to detect whether the `configure' user asked to include
it.  Whether each feature is included or not by default, and which
arguments are valid, is up to you.

 -- Macro: AC_ARG_ENABLE (FEATURE, HELP-STRING, [ACTION-IF-GIVEN],
          [ACTION-IF-NOT-GIVEN])
     If the user gave `configure' the option `--enable-FEATURE' or
     `--disable-FEATURE', run shell commands ACTION-IF-GIVEN.  If
     neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
     The name 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
     ACTION-IF-GIVEN in the shell variable `enableval', which is
     actually just the value of the shell variable named
     `enable_FEATURE', with any non-alphanumeric characters in FEATURE
     changed into `_'.  You may use that variable instead, if you wish.
     The HELP-STRING argument is like that of `AC_ARG_WITH' (*note
     External Software::).

     You should format your HELP-STRING with the macro `AS_HELP_STRING'
     (*note Pretty Help Strings::).

     See the examples suggested with the definition of `AC_ARG_WITH'
     (*note External Software::) to get an idea of possible
     applications of `AC_ARG_ENABLE'.


File: autoconf.info,  Node: Pretty Help Strings,  Next: Option Checking,  Prev: Package Options,  Up: Site Configuration

15.4 Making Your Help Strings Look Pretty
=========================================

Properly formatting the `help strings' which are used in `AC_ARG_WITH'
(*note External Software::) and `AC_ARG_ENABLE' (*note Package
Options::) can be challenging.  Specifically, you want your own `help
strings' to line up in the appropriate columns of `configure --help'
just like the standard Autoconf `help strings' do.  This is the purpose
of the `AS_HELP_STRING' macro.

 -- Macro: AS_HELP_STRING (LEFT-HAND-SIDE, RIGHT-HAND-SIDE
          [INDENT-COLUMN = `26'], [WRAP-COLUMN = `79'])
     Expands into a help string that looks pretty when the user executes
     `configure --help'.  It is typically used in `AC_ARG_WITH' (*note
     External Software::) or `AC_ARG_ENABLE' (*note Package Options::).
     The following example makes this clearer.

          AC_ARG_WITH([foo],
            [AS_HELP_STRING([--with-foo],
               [use foo (default is no)])],
            [use_foo=$withval],
            [use_foo=no])

     Then the last few lines of `configure --help' appear like this:

          --enable and --with options recognized:
            --with-foo              use foo (default is no)

     Macro expansion is performed on the first argument.  However, the
     second argument of `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.  *Note Autoconf Language::, for a more detailed
     explanation.

     The `AS_HELP_STRING' macro is particularly helpful when the
     LEFT-HAND-SIDE and/or RIGHT-HAND-SIDE are composed of macro
     arguments, as shown in the following example.  Be aware that
     LEFT-HAND-SIDE may not expand to unbalanced quotes, although
     quadrigraphs can be used.

          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])
     Here, the last few lines of `configure --help' will include:

          --enable and --with options recognized:
            --with-a-b              use a_b (default is no)

     The parameters INDENT-COLUMN and WRAP-COLUMN were introduced in
     Autoconf 2.62.  Generally, they should not be specified; they exist
     for fine-tuning of the wrapping.
          AS_HELP_STRING([--option], [description of option])
          =>  --option                description of option
          AS_HELP_STRING([--option], [description of option], [15], [30])
          =>  --option     description of
          =>               option


File: autoconf.info,  Node: Option Checking,  Next: Site Details,  Prev: Pretty Help Strings,  Up: Site Configuration

15.5 Controlling Checking of `configure' Options
================================================

The `configure' script checks its command-line options against a list
of known options, like `--help' or `--config-cache'.  An unknown option
ordinarily indicates a mistake by the user and `configure' halts with
an error.  However, by default unknown `--with-PACKAGE' and
`--enable-FEATURE' options elicit only a warning, to support
configuring entire source trees.

   Source trees often contain multiple packages with a top-level
`configure' script that uses the `AC_CONFIG_SUBDIRS' macro (*note
Subdirectories::).  Because the packages generally support different
`--with-PACKAGE' and `--enable-FEATURE' options, the GNU Coding
Standards say they must accept unrecognized options without halting.
Even a warning message is undesirable here, so `AC_CONFIG_SUBDIRS'
automatically disables the warnings.

   This default behavior may be modified in two ways.  First, the
installer can invoke `configure --disable-option-checking' to disable
these warnings, or invoke `configure --enable-option-checking=fatal'
options to turn them into fatal errors, respectively.  Second, the
maintainer can use `AC_DISABLE_OPTION_CHECKING'.

 -- Macro: AC_DISABLE_OPTION_CHECKING
     By default, disable warnings related to any unrecognized
     `--with-PACKAGE' or `--enable-FEATURE' options.  This is implied
     by `AC_CONFIG_SUBDIRS'.

     The installer can override this behavior by passing
     `--enable-option-checking' (enable warnings) or
     `--enable-option-checking=fatal' (enable errors) to `configure'.


File: autoconf.info,  Node: Site Details,  Next: Transforming Names,  Prev: Option Checking,  Up: Site Configuration

15.6 Configuring 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 _only by users_, not by programs.  The location of the file can
either be based on the `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.  *Note Variables for
Installation Directories: (standards)Directory Variables, for more
information on where to put data files.


File: autoconf.info,  Node: Transforming Names,  Next: Site Defaults,  Prev: Site Details,  Up: Site Configuration

15.7 Transforming Program Names When Installing
===============================================

Autoconf supports changing the names of programs when installing them.
In order to use these transformations, `configure.ac' must call the
macro `AC_ARG_PROGRAM'.

 -- Macro: AC_ARG_PROGRAM
     Place in output variable `program_transform_name' a sequence of
     `sed' commands for changing the names of installed programs.

     If any of the options described below are given to `configure',
     program names are transformed accordingly.  Otherwise, if
     `AC_CANONICAL_TARGET' has been called and a `--target' value is
     given, the target type followed by a dash is used as a prefix.
     Otherwise, no program name transformation is done.

* Menu:

* Transformation Options::      `configure' options to transform names
* Transformation Examples::     Sample uses of transforming names
* Transformation Rules::        Makefile uses of transforming names


File: autoconf.info,  Node: Transformation Options,  Next: Transformation Examples,  Up: Transforming Names

15.7.1 Transformation Options
-----------------------------

You can specify name transformations by giving `configure' these
command line options:

`--program-prefix=PREFIX'
     prepend PREFIX to the names;

`--program-suffix=SUFFIX'
     append SUFFIX to the names;

`--program-transform-name=EXPRESSION'
     perform `sed' substitution EXPRESSION on the names.


File: autoconf.info,  Node: Transformation Examples,  Next: Transformation Rules,  Prev: Transformation Options,  Up: Transforming Names

15.7.2 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 a Sun 4 configured with
`--target=i960-vxworks' is normally installed as `i960-vxworks-as',
rather than `as', which could be confused with a native Sun 4 assembler.

   You can force a program name to begin with `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 `diff' with
`--program-prefix=g', then when you run `make install' it is installed
as `/usr/local/bin/gdiff'.

   As a more sophisticated example, you could use

     --program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
   to prepend `g' to most of the program names in a source tree,
excepting those like `gdb' that already have one and those like `less'
and `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 `--program-suffix=2' to install the
programs as `/usr/local/bin/autoconf2', `/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.


File: autoconf.info,  Node: Transformation Rules,  Prev: Transformation Examples,  Up: Transforming Names

15.7.3 Transformation Rules
---------------------------

Here is how to use the variable `program_transform_name' in a
`Makefile.in':

     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)'`; \
             done

   It is guaranteed that `program_transform_name' is never empty, and
that there are no useless separators.  Therefore you may safely embed
`program_transform_name' within a sed program using `;':

     transform = @program_transform_name@
     transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/

   Whether to do the transformations on documentation files (Texinfo or
`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 `man' pages sometimes do
conflict with system documentation.  As a compromise, it is probably
best to do name transformations on `man' pages but not on Texinfo
manuals.


File: autoconf.info,  Node: Site Defaults,  Prev: Transforming Names,  Up: Site Configuration

15.8 Setting Site Defaults
==========================

Autoconf-generated `configure' scripts allow your site to provide
default values for some configuration values.  You do this by creating
site- and system-wide initialization files.

   If the environment variable `CONFIG_SITE' is set, `configure' uses
its value as the name of a shell script to read; it is recommended that
this be an absolute file name.  Otherwise, it reads the shell script
`PREFIX/share/config.site' if it exists, then `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 `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
`configure' scripts run on that system (*note Cache Files::).  If you
set a default cache file in a site file, it is a good idea to also set
the output variable `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
`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 `--without-' and `--disable-' options are like
giving the corresponding `--with-' or `--enable-' option and the value
`no'.  Thus, `--cache-file=localcache' sets the variable `cache_file'
to the value `localcache'; `--enable-warnings=no' or
`--disable-warnings' sets the variable `enable_warnings' to the value
`no'; `--prefix=/usr' sets the variable `prefix' to the value `/usr';
etc.

   Site files are also good places to set default values for other
output variables, such as `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 PREFIX or EXEC_PREFIX
(wherever you locate the site file), you can set them in the site file
if you specify it with the `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
`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 `_cv_' in their names in the
affected `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 `prefix'
and `cache_file' have their default values (as set near the top of
`configure') before changing them.

   Here is a sample file `/usr/share/local/gnu/share/config.site'.  The
command `configure --prefix=/usr/share/local/gnu' would read this file
(if `CONFIG_SITE' is not set to a different file).

     # /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

     # 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

   Another use of `config.site' is for priming the directory variables
in a manner consistent with the Filesystem Hierarchy Standard (FHS).
Once the following file is installed at `/usr/share/config.site', a
user can execute simply `./configure --prefix=/usr' to get all the
directories chosen in the locations recommended by FHS.

     # /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

   Likewise, on platforms where 64-bit libraries are built by default,
then installed in `/usr/local/lib64' instead of `/usr/local/lib', it is
appropriate to install `/usr/local/share/config.site':

     # /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'


File: autoconf.info,  Node: Running configure Scripts,  Next: config.status Invocation,  Prev: Site Configuration,  Up: Top

16 Running `configure' Scripts
******************************

Below are instructions on how to configure a package that uses a
`configure' script, suitable for inclusion as an `INSTALL' file in the
package.  A plain-text version of `INSTALL' which you may use comes
with Autoconf.

* Menu:

* Basic Installation::          Instructions for typical cases
* 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
* Particular Systems::          Particular systems
* System Type::                 Specifying the system type
* Sharing Defaults::            Setting site-wide defaults for `configure'
* Defining Variables::          Specifying the compiler etc.
* configure Invocation::        Changing how `configure' runs


File: autoconf.info,  Node: Basic Installation,  Next: Compilers and Options,  Up: Running configure Scripts

16.1 Basic Installation
=======================

Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package.  The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package.  More recommendations for GNU
packages can be found in *note Makefile Conventions:
(standards)Makefile Conventions.

   The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation.  It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions.  Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').

   It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring.  Caching is
disabled by default to prevent problems with accidental use of stale
cache files.

   If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release.  If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.

   The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'.  You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.

   The simplest way to compile this package is:

  1. `cd' to the directory containing the package's source code and type
     `./configure' to configure the package for your system.

     Running `configure' might take a while.  While running, it prints
     some messages telling which features it is checking for.

  2. Type `make' to compile the package.

  3. Optionally, type `make check' to run any self-tests that come with
     the package, generally using the just-built uninstalled binaries.

  4. Type `make install' to install the programs and any data files and
     documentation.  When installing into a prefix owned by root, it is
     recommended that the package be configured and built as a regular
     user, and only the `make install' phase executed with root
     privileges.

  5. Optionally, type `make installcheck' to repeat any self-tests, but
     this time using the binaries in their final installed location.
     This target does not install anything.  Running this target as a
     regular user, particularly if the prior `make install' required
     root privileges, verifies that the installation completed
     correctly.

  6. You can remove the program binaries and object files from the
     source code directory by typing `make clean'.  To also remove the
     files that `configure' created (so you can compile the package for
     a different kind of computer), type `make distclean'.  There is
     also a `make maintainer-clean' target, but that is intended mainly
     for the package's developers.  If you use it, you may have to get
     all sorts of other programs in order to regenerate files that came
     with the distribution.

  7. Often, you can also type `make uninstall' to remove the installed
     files again.  In practice, not all packages have tested that
     uninstallation works correctly, even though it is required by the
     GNU Coding Standards.

  8. Some packages, particularly those that use Automake, provide `make
     distcheck', which can by used by developers to test that all other
     targets like `make install' and `make uninstall' work correctly.
     This target is generally not run by end users.


File: autoconf.info,  Node: Compilers and Options,  Next: Multiple Architectures,  Prev: Basic Installation,  Up: Running configure Scripts

16.2 Compilers and Options
==========================

Some systems require unusual options for compilation or linking that the
`configure' script does not know about.  Run `./configure --help' for
details on some of the pertinent environment variables.

   You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment.  Here
is an example:

     ./configure CC=c99 CFLAGS=-g LIBS=-lposix

   *Note Defining Variables::, for more details.


File: autoconf.info,  Node: Multiple Architectures,  Next: Installation Names,  Prev: Compilers and Options,  Up: Running configure Scripts

16.3 Compiling For Multiple Architectures
=========================================

You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory.  To do this, you can use GNU `make'.  `cd' to the
directory where you want the object files and executables to go and run
the `configure' script.  `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.  This
is known as a "VPATH" build.

   With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory.  After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.

   On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor.  Like
this:

     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
                 CPP="gcc -E" CXXCPP="g++ -E"

   This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.


File: autoconf.info,  Node: Installation Names,  Next: Optional Features,  Prev: Multiple Architectures,  Up: Running configure Scripts

16.4 Installation Names
=======================

By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc.  You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.

   You can specify separate installation prefixes for
architecture-specific files and architecture-independent files.  If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.

   In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files.  Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.  In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.

   The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.

   The first method involves providing an override variable for each
affected directory.  For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'.  Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated.  The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.

   The second method involves providing the `DESTDIR' variable.  For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names.  The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters.  On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.


File: autoconf.info,  Node: Optional Features,  Next: Particular Systems,  Prev: Installation Names,  Up: Running configure Scripts

16.5 Optional Features
======================

If the package supports it, you can cause programs to be installed with
an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.

   Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System).  The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.

   For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.

   Some packages offer the ability to configure how verbose the
execution of `make' will be.  For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.


File: autoconf.info,  Node: Particular Systems,  Next: System Type,  Prev: Optional Features,  Up: Running configure Scripts

16.6 Particular systems
=======================

On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC is
not installed, it is recommended to use the following options in order
to use an ANSI C compiler:

     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"

and if that doesn't work, install pre-built binaries of GCC for HP-UX.

   HP-UX `make' updates targets which have the same time stamps as
their prerequisites, which makes it generally unusable when shipped
generated files such as `configure' are involved.  Use GNU `make'
instead.

   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
a workaround.  If GNU CC is not installed, it is therefore recommended
to try

     ./configure CC="cc"

and if that doesn't work, try

     ./configure CC="cc -nodtk"

   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.

   On Haiku, software installed for all users goes in `/boot/common',
not `/usr/local'.  It is recommended to use the following options:

     ./configure --prefix=/boot/common


File: autoconf.info,  Node: System Type,  Next: Sharing Defaults,  Prev: Particular Systems,  Up: Running configure Scripts

16.7 Specifying the System Type
===============================

There may be some features `configure' cannot figure out automatically,
but needs to determine by the type of machine the package will run on.
Usually, assuming the package is built to be run on the _same_
architectures, `configure' can figure that out, but if it prints a
message saying it cannot guess the machine type, give it the
`--build=TYPE' option.  TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:

     CPU-COMPANY-SYSTEM

where SYSTEM can have one of these forms:

     OS
     KERNEL-OS

   See the file `config.sub' for the possible values of each field.  If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.

   If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.

   If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.


File: autoconf.info,  Node: Sharing Defaults,  Next: Defining Variables,  Prev: System Type,  Up: Running configure Scripts

16.8 Sharing Defaults
=====================

If you want to set default values for `configure' scripts to share, you
can create a site shell script called `config.site' that gives default
values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists.  Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.


File: autoconf.info,  Node: Defining Variables,  Next: configure Invocation,  Prev: Sharing Defaults,  Up: Running configure Scripts

16.9 Defining Variables
=======================

Variables not defined in a site shell script can be set in the
environment passed to `configure'.  However, some packages may run
configure again during the build, and the customized values of these
variables may be lost.  In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'.  For example:

     ./configure CC=/usr/local2/bin/gcc

causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).

Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf limitation.  Until the limitation is lifted, you can use
this workaround:

     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash


File: autoconf.info,  Node: configure Invocation,  Prev: Defining Variables,  Up: Running configure Scripts

16.10 `configure' Invocation
============================

`configure' recognizes the following options to control how it operates.

`--help'
`-h'
     Print a summary of all of the options to `configure', and exit.

`--help=short'
`--help=recursive'
     Print a summary of the options unique to this package's
     `configure', and exit.  The `short' variant lists options used
     only in the top level, while the `recursive' variant lists options
     also present in any nested packages.

`--version'
`-V'
     Print the version of Autoconf used to generate the `configure'
     script, and exit.

`--cache-file=FILE'
     Enable the cache: use and save the results of the tests in FILE,
     traditionally `config.cache'.  FILE defaults to `/dev/null' to
     disable caching.

`--config-cache'
`-C'
     Alias for `--cache-file=config.cache'.

`--quiet'
`--silent'
`-q'
     Do not print messages saying which checks are being made.  To
     suppress all normal output, redirect it to `/dev/null' (any error
     messages will still be shown).

`--srcdir=DIR'
     Look for the package's source code in directory DIR.  Usually
     `configure' can determine that directory automatically.

`--prefix=DIR'
     Use DIR as the installation prefix.  *note Installation Names::
     for more details, including other options available for fine-tuning
     the installation locations.

`--no-create'
`-n'
     Run the configure checks, but stop before creating any output
     files.

`configure' also accepts some other, not widely useful, options.  Run
`configure --help' for more details.


File: autoconf.info,  Node: config.status Invocation,  Next: Obsolete Constructs,  Prev: Running configure Scripts,  Up: Top

17 config.status Invocation
***************************

The `configure' script creates a file named `config.status', which
actually configures, "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:
     ./config.status [OPTION]... [TAG]...

   It configures each TAG; if none are specified, all the templates are
instantiated.  A TAG refers to a file or other tag associated with a
configuration action, as specified by an `AC_CONFIG_ITEMS' macro (*note
Configuration Actions::).  The files must be specified without their
dependencies, as in

     ./config.status foobar

not

     ./config.status foobar:foo.in:bar.in

   The supported options are:

`--help'
`-h'
     Print a summary of the command line options, the list of the
     template files, and exit.

`--version'
`-V'
     Print the version number of Autoconf and the configuration
     settings, and exit.

`--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 BUILD-DIR of a package in SRC-DIR, you could use the
     following:

          args=`BUILD-DIR/config.status --config`
          eval SRC-DIR/configure "$args" CFLAGS=-g --srcdir=SRC-DIR

     Note that it may be necessary to override a `--srcdir' setting
     that was saved in the configuration, if the arguments are used in a
     different build directory.

`--silent'
`--quiet'
`-q'
     Do not print progress messages.

`--debug'
`-d'
     Don't remove the temporary files.

`--file=FILE[:TEMPLATE]'
     Require that FILE be instantiated as if
     `AC_CONFIG_FILES(FILE:TEMPLATE)' was used.  Both FILE and TEMPLATE
     may be `-' in which case the standard output and/or standard
     input, respectively, is used.  If a TEMPLATE file name is
     relative, it is first looked for in the build tree, and then in
     the source tree.  *Note Configuration Actions::, for more details.

     This option and the following ones provide one way for separately
     distributed packages to share the values computed by `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 `config.status' file to create files other
     than the ones that its `configure.ac' specifies, so it can be used
     for a different package, or for extracting a subset of values.
     For example,

          echo '@CC@' | ./config.status --file=-

     provides the value of `@CC@' on standard output.

`--header=FILE[:TEMPLATE]'
     Same as `--file' above, but with `AC_CONFIG_HEADERS'.

`--recheck'
     Ask `config.status' to update itself and exit (no instantiation).
     This option is useful if you change `configure', so that the
     results of some tests might be different from the previous run.
     The `--recheck' option reruns `configure' with the same arguments
     you used before, plus the `--no-create' option, which prevents
     `configure' from running `config.status' and creating `Makefile'
     and other files, and the `--no-recursion' option, which prevents
     `configure' from running other `configure' scripts in
     subdirectories.  (This is so other Make rules can run
     `config.status' when it changes; *note Automatic Remaking::, for
     an example).

   `config.status' checks several optional environment variables that
can alter its behavior:

 -- Variable: CONFIG_SHELL
     The shell with which to run `configure'.  It must be
     Bourne-compatible, and the absolute name of the shell should be
     passed.  The default is a shell that supports `LINENO' if
     available, and `/bin/sh' otherwise.

 -- Variable: CONFIG_STATUS
     The file name to use for the shell script that records the
     configuration.  The default is `./config.status'.  This variable is
     useful when one package uses parts of another and the `configure'
     scripts shouldn't be merged because they are maintained separately.

   You can use `./config.status' in your makefiles.  For example, in
the dependencies given above (*note Automatic Remaking::),
`config.status' is run twice when `configure.ac' has changed.  If that
bothers you, you can make each run only regenerate the files for that
rule:
     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

   The calling convention of `config.status' has changed; see *note
Obsolete config.status Use::, for details.


File: autoconf.info,  Node: Obsolete Constructs,  Next: Using Autotest,  Prev: config.status Invocation,  Up: Top

18 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 `config.status'
* acconfig Header::             Additional entries in `config.h.in'
* autoupdate Invocation::       Automatic update of `configure.ac'
* Obsolete Macros::             Backward compatibility macros
* Autoconf 1::                  Tips for upgrading your files
* Autoconf 2.13::               Some fresher tips


File: autoconf.info,  Node: Obsolete config.status Use,  Next: acconfig Header,  Up: Obsolete Constructs

18.1 Obsolete `config.status' Invocation
========================================

`config.status' now supports arguments to specify the files to
instantiate; see *note config.status Invocation::, for more details.
Before, environment variables had to be used.

 -- Variable: CONFIG_COMMANDS
     The tags of the commands to execute.  The default is the arguments
     given to `AC_OUTPUT' and `AC_CONFIG_COMMANDS' in `configure.ac'.

 -- Variable: CONFIG_FILES
     The files in which to perform `@VARIABLE@' substitutions.  The
     default is the arguments given to `AC_OUTPUT' and
     `AC_CONFIG_FILES' in `configure.ac'.

 -- Variable: CONFIG_HEADERS
     The files in which to substitute C `#define' statements.  The
     default is the arguments given to `AC_CONFIG_HEADERS'; if that
     macro was not called, `config.status' ignores this variable.

 -- Variable: CONFIG_LINKS
     The symbolic links to establish.  The default is the arguments
     given to `AC_CONFIG_LINKS'; if that macro was not called,
     `config.status' ignores this variable.

   In *note config.status Invocation::, using this old interface, the
example would be:

     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

(If `configure.ac' does not call `AC_CONFIG_HEADERS', there is no need
to set `CONFIG_HEADERS' in the `make' rules.  Equally for
`CONFIG_COMMANDS', etc.)


File: autoconf.info,  Node: acconfig Header,  Next: autoupdate Invocation,  Prev: Obsolete config.status Use,  Up: Obsolete Constructs

18.2 `acconfig.h'
=================

In order to produce `config.h.in', `autoheader' needs to build or to
find templates for each symbol.  Modern releases of Autoconf use
`AH_VERBATIM' and `AH_TEMPLATE' (*note Autoheader Macros::), but in
older releases a file, `acconfig.h', contained the list of needed
templates.  `autoheader' copied comments and `#define' and `#undef'
statements from `acconfig.h' in the current directory, if present.
This file used to be mandatory if you `AC_DEFINE' any additional
symbols.

   Modern releases of Autoconf also provide `AH_TOP' and `AH_BOTTOM' if
you need to prepend/append some information to `config.h.in'.  Ancient
versions of Autoconf had a similar feature: if `./acconfig.h' contains
the string `@TOP@', `autoheader' copies the lines before the line
containing `@TOP@' into the top of the file that it generates.
Similarly, if `./acconfig.h' contains the string `@BOTTOM@',
`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.top' (typically `config.h.top')
and/or `FILE.bot' in the current directory.  If they exist,
`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:
     configure.ac --.   .------> autoconf* -----> configure
                    +---+
     [aclocal.m4] --+   `---.
     [acsite.m4] ---'       |
                            +--> [autoheader*] -> [config.h.in]
     [acconfig.h] ----.     |
                      +-----'
     [config.h.top] --+
     [config.h.bot] --'

   Using only the `AH_' macros, `configure.ac' should be
self-contained, and should not depend upon `acconfig.h' etc.


File: autoconf.info,  Node: autoupdate Invocation,  Next: Obsolete Macros,  Prev: acconfig Header,  Up: Obsolete Constructs

18.3 Using `autoupdate' to Modernize `configure.ac'
===================================================

The `autoupdate' program updates a `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.  *Note Macro Names::, for a
description of the new scheme.  Although the old names still work
(*note Obsolete Macros::, for a list of the old macros and the
corresponding new names), you can make your `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.

   If given no arguments, `autoupdate' updates `configure.ac', backing
up the original version with the suffix `~' (or the value of the
environment variable `SIMPLE_BACKUP_SUFFIX', if that is set).  If you
give `autoupdate' an argument, it reads that file instead of
`configure.ac' and writes the updated file to the standard output.

`autoupdate' accepts the following options:

`--help'
`-h'
     Print a summary of the command line options and exit.

`--version'
`-V'
     Print the version number of Autoconf and exit.

`--verbose'
`-v'
     Report processing steps.

`--debug'
`-d'
     Don't remove the temporary files.

`--force'
`-f'
     Force the update even if the file has not changed.  Disregard the
     cache.

`--include=DIR'
`-I DIR'
     Also look for input files in DIR.  Multiple invocations accumulate.
     Directories are browsed from last to first.

`--prepend-include=DIR'
`-B DIR'
     Prepend directory DIR to the search path.  This is used to include
     the language-specific files before any third-party macros.


File: autoconf.info,  Node: Obsolete Macros,  Next: Autoconf 1,  Prev: autoupdate Invocation,  Up: Obsolete Constructs

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

 -- Macro: AC_AIX
     This macro is a platform-specific subset of
     `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).

 -- Macro: AC_ALLOCA
     Replaced by `AC_FUNC_ALLOCA' (*note AC_FUNC_ALLOCA::).

 -- Macro: AC_ARG_ARRAY
     Removed because of limited usefulness.

 -- Macro: AC_C_CROSS
     This macro is obsolete; it does nothing.

 -- Macro: AC_C_LONG_DOUBLE
     If the C compiler supports a working `long double' type with more
     range or precision than the `double' type, define
     `HAVE_LONG_DOUBLE'.

     You should use `AC_TYPE_LONG_DOUBLE' or
     `AC_TYPE_LONG_DOUBLE_WIDER' instead.  *Note Particular Types::.

 -- Macro: AC_CANONICAL_SYSTEM
     Determine the system type and set output variables to the names of
     the canonical system types.  *Note Canonicalizing::, for details
     about the variables this macro sets.

     The user is encouraged to use either `AC_CANONICAL_BUILD', or
     `AC_CANONICAL_HOST', or `AC_CANONICAL_TARGET', depending on the
     needs.  Using `AC_CANONICAL_TARGET' is enough to run the two other
     macros (*note Canonicalizing::).

 -- Macro: AC_CHAR_UNSIGNED
     Replaced by `AC_C_CHAR_UNSIGNED' (*note AC_C_CHAR_UNSIGNED::).

 -- Macro: AC_CHECK_TYPE (TYPE, DEFAULT)
     Autoconf, up to 2.13, used to provide this version of
     `AC_CHECK_TYPE', deprecated because of its flaws.  First, although
     it is a member of the `CHECK' clan, it does more than just
     checking.  Secondly, missing types are defined using `#define',
     not `typedef', and this can lead to problems in the case of
     pointer types.

     This use of `AC_CHECK_TYPE' is obsolete and discouraged; see *note
     Generic Types::, for the description of the current macro.

     If the type TYPE is not defined, define it to be the C (or C++)
     builtin type DEFAULT, e.g., `short int' or `unsigned int'.

     This macro is equivalent to:

          AC_CHECK_TYPE([TYPE], [],
            [AC_DEFINE_UNQUOTED([TYPE], [DEFAULT],
               [Define to `DEFAULT'
                if <sys/types.h> does not define.])])

     In order to keep backward compatibility, the two versions of
     `AC_CHECK_TYPE' are implemented, selected using these heuristics:

       1. If there are three or four arguments, the modern version is
          used.

       2. 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++ _builtin_ type or a C identifier ending in `_t',
          optionally followed by one of `[(* ' and then by a string of
          zero or more characters taken from the set `[]()* _a-zA-Z0-9'.

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

       4. Otherwise, the modern version is used.

     You are encouraged either to use a valid builtin type, or to use
     the equivalent modern code (see above), or better yet, to use
     `AC_CHECK_TYPES' together with

          #ifndef HAVE_LOFF_T
          typedef loff_t off_t;
          #endif

 -- Macro: AC_CHECKING (FEATURE-DESCRIPTION)
     Same as

          AC_MSG_NOTICE([checking FEATURE-DESCRIPTION...]

     *Note AC_MSG_NOTICE::.

 -- Macro: AC_COMPILE_CHECK (ECHO-TEXT, INCLUDES, FUNCTION-BODY,
          ACTION-IF-TRUE, [ACTION-IF-FALSE])
     This is an obsolete version of `AC_TRY_COMPILE' itself replaced by
     `AC_COMPILE_IFELSE' (*note Running the Compiler::), with the
     addition that it prints `checking for ECHO-TEXT' to the standard
     output first, if ECHO-TEXT is non-empty.  Use `AC_MSG_CHECKING'
     and `AC_MSG_RESULT' instead to print messages (*note Printing
     Messages::).

 -- Macro: AC_CONST
     Replaced by `AC_C_CONST' (*note AC_C_CONST::).

 -- Macro: AC_CROSS_CHECK
     Same as `AC_C_CROSS', which is obsolete too, and does nothing
     `:-)'.

 -- Macro: AC_CYGWIN
     Check for the Cygwin environment in which case the shell variable
     `CYGWIN' is set to `yes'.  Don't use this macro, the dignified
     means to check the nature of the host is using `AC_CANONICAL_HOST'
     (*note Canonicalizing::).  As a matter of fact this macro is
     defined as:

          AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
          case $host_os in
            *cygwin* ) CYGWIN=yes;;
                   * ) CYGWIN=no;;
          esac

     Beware that the variable `CYGWIN' has a special meaning when
     running Cygwin, and should not be changed.  That's yet another
     reason not to use this macro.

 -- Macro: AC_DECL_SYS_SIGLIST
     Same as:

          AC_CHECK_DECLS([sys_siglist], [], [],
          [#include <signal.h>
          /* NetBSD declares sys_siglist in unistd.h.  */
          #ifdef HAVE_UNISTD_H
          # include <unistd.h>
          #endif
          ])

     *Note AC_CHECK_DECLS::.

 -- Macro: AC_DECL_YYTEXT
     Does nothing, now integrated in `AC_PROG_LEX' (*note
     AC_PROG_LEX::).

 -- Macro: AC_DIR_HEADER
     Like calling `AC_FUNC_CLOSEDIR_VOID' (*note
     AC_FUNC_CLOSEDIR_VOID::) and `AC_HEADER_DIRENT' (*note
     AC_HEADER_DIRENT::), but defines a different set of C preprocessor
     macros to indicate which header file is found:

     Header         Old Symbol   New Symbol
     `dirent.h'     `DIRENT'     `HAVE_DIRENT_H'
     `sys/ndir.h'   `SYSNDIR'    `HAVE_SYS_NDIR_H'
     `sys/dir.h'    `SYSDIR'     `HAVE_SYS_DIR_H'
     `ndir.h'       `NDIR'       `HAVE_NDIR_H'

 -- Macro: AC_DYNIX_SEQ
     If on DYNIX/ptx, add `-lseq' to output variable `LIBS'.  This
     macro used to be defined as

          AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])

     now it is just `AC_FUNC_GETMNTENT' (*note AC_FUNC_GETMNTENT::).

 -- Macro: AC_EXEEXT
     Defined the output variable `EXEEXT' based on the output of the
     compiler, which is now done automatically.  Typically set to empty
     string if Posix and `.exe' if a DOS variant.

 -- Macro: AC_EMXOS2
     Similar to `AC_CYGWIN' but checks for the EMX environment on OS/2
     and sets `EMXOS2'.  Don't use this macro, the dignified means to
     check the nature of the host is using `AC_CANONICAL_HOST' (*note
     Canonicalizing::).

 -- Macro: AC_ENABLE (FEATURE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
     This is an obsolete version of `AC_ARG_ENABLE' that does not
     support providing a help string (*note AC_ARG_ENABLE::).

 -- Macro: AC_ERROR
     Replaced by `AC_MSG_ERROR' (*note AC_MSG_ERROR::).

 -- Macro: AC_FIND_X
     Replaced by `AC_PATH_X' (*note AC_PATH_X::).

 -- Macro: AC_FIND_XTRA
     Replaced by `AC_PATH_XTRA' (*note AC_PATH_XTRA::).

 -- Macro: AC_FOREACH
     Replaced by `m4_foreach_w' (*note m4_foreach_w::).

 -- Macro: AC_FUNC_CHECK
     Replaced by `AC_CHECK_FUNC' (*note AC_CHECK_FUNC::).

 -- Macro: AC_FUNC_SETVBUF_REVERSED
     Do nothing.  Formerly, this macro checked whether `setvbuf' takes
     the buffering type as its second argument and the buffer pointer
     as the third, instead of the other way around, and defined
     `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.

 -- Macro: AC_FUNC_WAIT3
     If `wait3' is found and fills in the contents of its third argument
     (a `struct rusage *'), which HP-UX does not do, define
     `HAVE_WAIT3'.

     These days portable programs should use `waitpid', not `wait3', as
     `wait3' has been removed from Posix.

 -- Macro: AC_GCC_TRADITIONAL
     Replaced by `AC_PROG_GCC_TRADITIONAL' (*note
     AC_PROG_GCC_TRADITIONAL::).

 -- Macro: AC_GETGROUPS_T
     Replaced by `AC_TYPE_GETGROUPS' (*note AC_TYPE_GETGROUPS::).

 -- Macro: AC_GETLOADAVG
     Replaced by `AC_FUNC_GETLOADAVG' (*note AC_FUNC_GETLOADAVG::).

 -- Macro: AC_GNU_SOURCE
     This macro is a platform-specific subset of
     `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).

 -- Macro: AC_HAVE_FUNCS
     Replaced by `AC_CHECK_FUNCS' (*note AC_CHECK_FUNCS::).

 -- Macro: AC_HAVE_HEADERS
     Replaced by `AC_CHECK_HEADERS' (*note AC_CHECK_HEADERS::).

 -- Macro: AC_HAVE_LIBRARY (LIBRARY, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
     This macro is equivalent to calling `AC_CHECK_LIB' with a FUNCTION
     argument of `main'.  In addition, LIBRARY can be written as any of
     `foo', `-lfoo', or `libfoo.a'.  In all of those cases, the
     compiler is passed `-lfoo'.  However, LIBRARY cannot be a shell
     variable; it must be a literal name.  *Note AC_CHECK_LIB::.

 -- Macro: AC_HAVE_POUNDBANG
     Replaced by `AC_SYS_INTERPRETER' (*note AC_SYS_INTERPRETER::).

 -- Macro: AC_HEADER_CHECK
     Replaced by `AC_CHECK_HEADER' (*note AC_CHECK_HEADER::).

 -- Macro: AC_HEADER_EGREP
     Replaced by `AC_EGREP_HEADER' (*note AC_EGREP_HEADER::).

 -- Macro: AC_HELP_STRING
     Replaced by `AS_HELP_STRING' (*note AS_HELP_STRING::).

 -- Macro: AC_INIT (UNIQUE-FILE-IN-SOURCE-DIR)
     Formerly `AC_INIT' used to have a single argument, and was
     equivalent to:

          AC_INIT
          AC_CONFIG_SRCDIR(UNIQUE-FILE-IN-SOURCE-DIR)
     See *note AC_INIT:: and *note AC_CONFIG_SRCDIR::.

 -- Macro: AC_INLINE
     Replaced by `AC_C_INLINE' (*note AC_C_INLINE::).

 -- Macro: AC_INT_16_BITS
     If the C type `int' is 16 bits wide, define `INT_16_BITS'.  Use
     `AC_CHECK_SIZEOF(int)' instead (*note AC_CHECK_SIZEOF::).

 -- Macro: AC_IRIX_SUN
     If on IRIX (Silicon Graphics Unix), add `-lsun' to output `LIBS'.
     If you were using it to get `getmntent', use `AC_FUNC_GETMNTENT'
     instead.  If you used it for the NIS versions of the password and
     group functions, use `AC_CHECK_LIB(sun, getpwnam)'.  Up to
     Autoconf 2.13, it used to be

          AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])

     now it is defined as

          AC_FUNC_GETMNTENT
          AC_CHECK_LIB([sun], [getpwnam])

     See *note AC_FUNC_GETMNTENT:: and *note AC_CHECK_LIB::.

 -- Macro: AC_ISC_POSIX
     This macro adds `-lcposix' to output variable `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
     `AC_SEARCH_LIBS([strerror], [cposix])' (*note AC_SEARCH_LIBS::).

 -- Macro: AC_LANG_C
     Same as `AC_LANG([C])' (*note AC_LANG::).

 -- Macro: AC_LANG_CPLUSPLUS
     Same as `AC_LANG([C++])' (*note AC_LANG::).

 -- Macro: AC_LANG_FORTRAN77
     Same as `AC_LANG([Fortran 77])' (*note AC_LANG::).

 -- Macro: AC_LANG_RESTORE
     Select the LANGUAGE that is saved on the top of the stack, as set
     by `AC_LANG_SAVE', remove it from the stack, and call
     `AC_LANG(LANGUAGE)'.  *Note Language Choice::, for the preferred
     way to change languages.

 -- Macro: AC_LANG_SAVE
     Remember the current language (as set by `AC_LANG') on a stack.
     The current language does not change.  `AC_LANG_PUSH' is preferred
     (*note AC_LANG_PUSH::).

 -- Macro: AC_LINK_FILES (SOURCE..., DEST...)
     This is an obsolete version of `AC_CONFIG_LINKS' (*note
     AC_CONFIG_LINKS::.  An updated version of:

          AC_LINK_FILES(config/$machine.h config/$obj_format.h,
                        host.h            object.h)

     is:

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

 -- Macro: AC_LN_S
     Replaced by `AC_PROG_LN_S' (*note AC_PROG_LN_S::).

 -- Macro: AC_LONG_64_BITS
     Define `LONG_64_BITS' if the C type `long int' is 64 bits wide.
     Use the generic macro `AC_CHECK_SIZEOF([long int])' instead (*note
     AC_CHECK_SIZEOF::).

 -- Macro: AC_LONG_DOUBLE
     If the C compiler supports a working `long double' type with more
     range or precision than the `double' type, define
     `HAVE_LONG_DOUBLE'.

     You should use `AC_TYPE_LONG_DOUBLE' or
     `AC_TYPE_LONG_DOUBLE_WIDER' instead.  *Note Particular Types::.

 -- Macro: AC_LONG_FILE_NAMES
     Replaced by
          AC_SYS_LONG_FILE_NAMES
     *Note AC_SYS_LONG_FILE_NAMES::.

 -- Macro: AC_MAJOR_HEADER
     Replaced by `AC_HEADER_MAJOR' (*note AC_HEADER_MAJOR::).

 -- Macro: AC_MEMORY_H
     Used to define `NEED_MEMORY_H' if the `mem' functions were defined
     in `memory.h'.  Today it is equivalent to
     `AC_CHECK_HEADERS([memory.h])' (*note AC_CHECK_HEADERS::).  Adjust
     your code to depend upon `HAVE_MEMORY_H', not `NEED_MEMORY_H'; see
     *note Standard Symbols::.

 -- Macro: AC_MINGW32
     Similar to `AC_CYGWIN' but checks for the MinGW compiler
     environment and sets `MINGW32'.  Don't use this macro, the
     dignified means to check the nature of the host is using
     `AC_CANONICAL_HOST' (*note Canonicalizing::).

 -- Macro: AC_MINIX
     This macro is a platform-specific subset of
     `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).

 -- Macro: AC_MINUS_C_MINUS_O
     Replaced by `AC_PROG_CC_C_O' (*note AC_PROG_CC_C_O::).

 -- Macro: AC_MMAP
     Replaced by `AC_FUNC_MMAP' (*note AC_FUNC_MMAP::).

 -- Macro: AC_MODE_T
     Replaced by `AC_TYPE_MODE_T' (*note AC_TYPE_MODE_T::).

 -- Macro: AC_OBJEXT
     Defined the output variable `OBJEXT' based on the output of the
     compiler, after .c files have been excluded.  Typically set to `o'
     if Posix, `obj' if a DOS variant.  Now the compiler checking
     macros handle this automatically.

 -- Macro: AC_OBSOLETE (THIS-MACRO-NAME, [SUGGESTION])
     Make M4 print a message to the standard error output warning that
     THIS-MACRO-NAME is obsolete, and giving the file and line number
     where it was called.  THIS-MACRO-NAME should be the name of the
     macro that is calling `AC_OBSOLETE'.  If 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 THIS-MACRO-NAME.

     For instance

          AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl

     You are encouraged to use `AU_DEFUN' instead, since it gives better
     services to the user (*note AU_DEFUN::).

 -- Macro: AC_OFF_T
     Replaced by `AC_TYPE_OFF_T' (*note AC_TYPE_OFF_T::).

 -- Macro: AC_OUTPUT ([FILE]..., [EXTRA-CMDS], [INIT-CMDS])
     The use of `AC_OUTPUT' with arguments is deprecated.  This
     obsoleted interface is equivalent to:

          AC_CONFIG_FILES(FILE...)
          AC_CONFIG_COMMANDS([default],
                             EXTRA-CMDS, INIT-CMDS)
          AC_OUTPUT

     See *note AC_CONFIG_FILES::, *note AC_CONFIG_COMMANDS::, and *note
     AC_OUTPUT::.

 -- Macro: AC_OUTPUT_COMMANDS (EXTRA-CMDS, [INIT-CMDS])
     Specify additional shell commands to run at the end of
     `config.status', and shell commands to initialize any variables
     from `configure'.  This macro may be called multiple times.  It is
     obsolete, replaced by `AC_CONFIG_COMMANDS' (*note
     AC_CONFIG_COMMANDS::).

     Here is an unrealistic example:

          fubar=27
          AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.],
                             [fubar=$fubar])
          AC_OUTPUT_COMMANDS([echo this is another, extra, bit],
                             [echo init bit])

     Aside from the fact that `AC_CONFIG_COMMANDS' requires an
     additional key, an important difference is that
     `AC_OUTPUT_COMMANDS' is quoting its arguments twice, unlike
     `AC_CONFIG_COMMANDS'.  This means that `AC_CONFIG_COMMANDS' can
     safely be given macro calls as arguments:

          AC_CONFIG_COMMANDS(foo, [my_FOO()])

     Conversely, where one level of quoting was enough for literal
     strings with `AC_OUTPUT_COMMANDS', you need two with
     `AC_CONFIG_COMMANDS'.  The following lines are equivalent:

          AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
          AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])

 -- Macro: AC_PID_T
     Replaced by `AC_TYPE_PID_T' (*note AC_TYPE_PID_T::).

 -- Macro: AC_PREFIX
     Replaced by `AC_PREFIX_PROGRAM' (*note AC_PREFIX_PROGRAM::).

 -- Macro: AC_PROGRAMS_CHECK
     Replaced by `AC_CHECK_PROGS' (*note AC_CHECK_PROGS::).

 -- Macro: AC_PROGRAMS_PATH
     Replaced by `AC_PATH_PROGS' (*note AC_PATH_PROGS::).

 -- Macro: AC_PROGRAM_CHECK
     Replaced by `AC_CHECK_PROG' (*note AC_CHECK_PROG::).

 -- Macro: AC_PROGRAM_EGREP
     Replaced by `AC_EGREP_CPP' (*note AC_EGREP_CPP::).

 -- Macro: AC_PROGRAM_PATH
     Replaced by `AC_PATH_PROG' (*note AC_PATH_PROG::).

 -- Macro: AC_REMOTE_TAPE
     Removed because of limited usefulness.

 -- Macro: AC_RESTARTABLE_SYSCALLS
     This macro was renamed `AC_SYS_RESTARTABLE_SYSCALLS'.  However,
     these days portable programs should use `sigaction' with
     `SA_RESTART' if they want restartable system calls.  They should
     not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
     system call is restartable is a dynamic issue, not a
     configuration-time issue.

 -- Macro: AC_RETSIGTYPE
     Replaced by `AC_TYPE_SIGNAL' (*note AC_TYPE_SIGNAL::), which itself
     is obsolete when assuming C89 or better.

 -- Macro: AC_RSH
     Removed because of limited usefulness.

 -- Macro: AC_SCO_INTL
     If on SCO Unix, add `-lintl' to output variable `LIBS'.  This
     macro used to do this:

          AC_CHECK_LIB([intl], [strftime], [LIBS="-lintl $LIBS"])

     Now it just calls `AC_FUNC_STRFTIME' instead (*note
     AC_FUNC_STRFTIME::).

 -- Macro: AC_SETVBUF_REVERSED
     Replaced by
          AC_FUNC_SETVBUF_REVERSED
     *Note AC_FUNC_SETVBUF_REVERSED::.

 -- Macro: AC_SET_MAKE
     Replaced by `AC_PROG_MAKE_SET' (*note AC_PROG_MAKE_SET::).

 -- Macro: AC_SIZEOF_TYPE
     Replaced by `AC_CHECK_SIZEOF' (*note AC_CHECK_SIZEOF::).

 -- Macro: AC_SIZE_T
     Replaced by `AC_TYPE_SIZE_T' (*note AC_TYPE_SIZE_T::).

 -- Macro: AC_STAT_MACROS_BROKEN
     Replaced by `AC_HEADER_STAT' (*note AC_HEADER_STAT::).

 -- Macro: AC_STDC_HEADERS
     Replaced by `AC_HEADER_STDC' (*note AC_HEADER_STDC::).

 -- Macro: AC_STRCOLL
     Replaced by `AC_FUNC_STRCOLL' (*note AC_FUNC_STRCOLL::).

 -- Macro: AC_STRUCT_ST_BLKSIZE
     If `struct stat' contains an `st_blksize' member, define
     `HAVE_STRUCT_STAT_ST_BLKSIZE'.  The former name, `HAVE_ST_BLKSIZE'
     is to be avoided, as its support will cease in the future.  This
     macro is obsoleted, and should be replaced by

          AC_CHECK_MEMBERS([struct stat.st_blksize])
     *Note AC_CHECK_MEMBERS::.

 -- Macro: AC_STRUCT_ST_RDEV
     If `struct stat' contains an `st_rdev' member, define
     `HAVE_STRUCT_STAT_ST_RDEV'.  The former name for this macro,
     `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:
          AC_CHECK_MEMBERS([struct stat.st_rdev])
     *Note AC_CHECK_MEMBERS::.

 -- Macro: AC_ST_BLKSIZE
     Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).

 -- Macro: AC_ST_BLOCKS
     Replaced by `AC_STRUCT_ST_BLOCKS' (*note AC_STRUCT_ST_BLOCKS::).

 -- Macro: AC_ST_RDEV
     Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).

 -- Macro: AC_SYS_RESTARTABLE_SYSCALLS
     If the system automatically restarts a system call that is
     interrupted by a signal, define `HAVE_RESTARTABLE_SYSCALLS'.  This
     macro does not check whether system calls are restarted in
     general--it checks whether a signal handler installed with
     `signal' (but not `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 `sigaction' with
     `SA_RESTART' if they want restartable system calls.  They should
     not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
     system call is restartable is a dynamic issue, not a
     configuration-time issue.

 -- Macro: AC_SYS_SIGLIST_DECLARED
     This macro was renamed `AC_DECL_SYS_SIGLIST'.  However, even that
     name is obsolete, as the same functionality is now achieved via
     `AC_CHECK_DECLS' (*note AC_CHECK_DECLS::).

 -- Macro: AC_TEST_CPP
     This macro was renamed `AC_TRY_CPP', which in turn was replaced by
     `AC_PREPROC_IFELSE' (*note AC_PREPROC_IFELSE::).

 -- Macro: AC_TEST_PROGRAM
     This macro was renamed `AC_TRY_RUN', which in turn was replaced by
     `AC_RUN_IFELSE' (*note AC_RUN_IFELSE::).

 -- Macro: AC_TIMEZONE
     Replaced by `AC_STRUCT_TIMEZONE' (*note AC_STRUCT_TIMEZONE::).

 -- Macro: AC_TIME_WITH_SYS_TIME
     Replaced by `AC_HEADER_TIME' (*note AC_HEADER_TIME::).

 -- Macro: AC_TRY_COMPILE (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
          [ACTION-IF-FALSE])
     Same as:

          AC_COMPILE_IFELSE(
            [AC_LANG_PROGRAM([[INCLUDES]],
               [[FUNCTION-BODY]])],
            [ACTION-IF-TRUE],
            [ACTION-IF-FALSE])

     *Note Running the Compiler::.

     This macro double quotes both INCLUDES and FUNCTION-BODY.

     For C and C++, INCLUDES is any `#include' statements needed by the
     code in FUNCTION-BODY (INCLUDES is ignored if the currently
     selected language is Fortran or Fortran 77).  The compiler and
     compilation flags are determined by the current language (*note
     Language Choice::).

 -- Macro: AC_TRY_CPP (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
     Same as:

          AC_PREPROC_IFELSE(
            [AC_LANG_SOURCE([[INPUT]])],
            [ACTION-IF-TRUE],
            [ACTION-IF-FALSE])

     *Note Running the Preprocessor::.

     This macro double quotes the INPUT.

 -- Macro: AC_TRY_LINK (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
          [ACTION-IF-FALSE])
     Same as:

          AC_LINK_IFELSE(
            [AC_LANG_PROGRAM([[INCLUDES]],
               [[FUNCTION-BODY]])],
            [ACTION-IF-TRUE],
            [ACTION-IF-FALSE])

     *Note Running the Compiler::.

     This macro double quotes both INCLUDES and FUNCTION-BODY.

     Depending on the current language (*note Language Choice::),
     create a test program to see whether a function whose body
     consists of FUNCTION-BODY can be compiled and linked.  If the file
     compiles and links successfully, run shell commands
     ACTION-IF-FOUND, otherwise run ACTION-IF-NOT-FOUND.

     This macro double quotes both INCLUDES and FUNCTION-BODY.

     For C and C++, INCLUDES is any `#include' statements needed by the
     code in FUNCTION-BODY (INCLUDES is ignored if the currently
     selected language is Fortran or Fortran 77).  The compiler and
     compilation flags are determined by the current language (*note
     Language Choice::), and in addition `LDFLAGS' and `LIBS' are used
     for linking.

 -- Macro: AC_TRY_LINK_FUNC (FUNCTION, [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     This macro is equivalent to
          AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])],
            [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
     *Note AC_LINK_IFELSE::.

 -- Macro: AC_TRY_RUN (PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
          [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
     Same as:

          AC_RUN_IFELSE(
            [AC_LANG_SOURCE([[PROGRAM]])],
            [ACTION-IF-TRUE],
            [ACTION-IF-FALSE],
            [ACTION-IF-CROSS-COMPILING])

     *Note Runtime::.

 -- Macro: AC_TYPE_SIGNAL
     If `signal.h' declares `signal' as returning a pointer to a
     function returning `void', define `RETSIGTYPE' to be `void';
     otherwise, define it to be `int'.  These days, it is portable to
     assume C89, and that signal handlers return `void', without
     needing to use this macro or `RETSIGTYPE'.

     When targeting older K&R C, it is possible to define signal
     handlers as returning type `RETSIGTYPE', and omit a return
     statement:

          RETSIGTYPE
          hup_handler ()
          {
          ...
          }

 -- Macro: AC_UID_T
     Replaced by `AC_TYPE_UID_T' (*note AC_TYPE_UID_T::).

 -- Macro: AC_UNISTD_H
     Same as `AC_CHECK_HEADERS([unistd.h])' (*note AC_CHECK_HEADERS::).

 -- Macro: AC_USG
     Define `USG' if the BSD string functions are defined in
     `strings.h'.  You should no longer depend upon `USG', but on
     `HAVE_STRING_H'; see *note Standard Symbols::.

 -- Macro: AC_UTIME_NULL
     Replaced by `AC_FUNC_UTIME_NULL' (*note AC_FUNC_UTIME_NULL::).

 -- Macro: AC_VALIDATE_CACHED_SYSTEM_TUPLE ([CMD])
     If the cache file is inconsistent with the current host, target and
     build system types, it used to execute CMD or print a default
     error message.  This is now handled by default.

 -- Macro: AC_VERBOSE (RESULT-DESCRIPTION)
     Replaced by `AC_MSG_RESULT' (*note AC_MSG_RESULT::).

 -- Macro: AC_VFORK
     Replaced by `AC_FUNC_FORK' (*note AC_FUNC_FORK::).

 -- Macro: AC_VPRINTF
     Replaced by `AC_FUNC_VPRINTF' (*note AC_FUNC_VPRINTF::).

 -- Macro: AC_WAIT3
     This macro was renamed `AC_FUNC_WAIT3'.  However, these days
     portable programs should use `waitpid', not `wait3', as `wait3'
     has been removed from Posix.

 -- Macro: AC_WARN
     Replaced by `AC_MSG_WARN' (*note AC_MSG_WARN::).

 -- Macro: AC_WITH (PACKAGE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
     This is an obsolete version of `AC_ARG_WITH' that does not support
     providing a help string (*note AC_ARG_WITH::).

 -- Macro: AC_WORDS_BIGENDIAN
     Replaced by `AC_C_BIGENDIAN' (*note AC_C_BIGENDIAN::).

 -- Macro: AC_XENIX_DIR
     This macro used to add `-lx' to output variable `LIBS' if on
     Xenix.  Also, if `dirent.h' is being checked for, added `-ldir' to
     `LIBS'.  Now it is merely an alias of `AC_HEADER_DIRENT' instead,
     plus some code to detect whether running XENIX on which you should
     not depend:

          AC_MSG_CHECKING([for Xenix])
          AC_EGREP_CPP([yes],
          [#if defined M_XENIX && !defined M_UNIX
            yes
          #endif],
                       [AC_MSG_RESULT([yes]); XENIX=yes],
                       [AC_MSG_RESULT([no]); XENIX=])
     Don't use this macro, the dignified means to check the nature of
     the host is using `AC_CANONICAL_HOST' (*note Canonicalizing::).

 -- Macro: AC_YYTEXT_POINTER
     This macro was renamed `AC_DECL_YYTEXT', which in turn was
     integrated into `AC_PROG_LEX' (*note AC_PROG_LEX::).


File: autoconf.info,  Node: Autoconf 1,  Next: Autoconf 2.13,  Prev: Obsolete Macros,  Up: Obsolete Constructs

18.5 Upgrading From Version 1
=============================

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 `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
`configure' scripts could benefit from some of the new features in
version 2; the changes are summarized in the file `NEWS' in the
Autoconf distribution.

* Menu:

* Changed File Names::          Files you might rename
* Changed Makefiles::           New things to put in `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


File: autoconf.info,  Node: Changed File Names,  Next: Changed Makefiles,  Up: Autoconf 1

18.5.1 Changed File Names
-------------------------

If you have an `aclocal.m4' installed with Autoconf (as opposed to in a
particular package's source directory), you must rename it to
`acsite.m4'.  *Note autoconf Invocation::.

   If you distribute `install.sh' with your package, rename it to
`install-sh' so `make' builtin rules don't inadvertently create a file
called `install' from it.  `AC_PROG_INSTALL' looks for the script under
both names, but it is best to use the new name.

   If you were using `config.h.top', `config.h.bot', or `acconfig.h',
you still can, but you have less clutter if you use the `AH_' macros.
*Note Autoheader Macros::.


File: autoconf.info,  Node: Changed Makefiles,  Next: Changed Macros,  Prev: Changed File Names,  Up: Autoconf 1

18.5.2 Changed Makefiles
------------------------

Add `@CFLAGS@', `@CPPFLAGS@', and `@LDFLAGS@' in your `Makefile.in'
files, so they can take advantage of the values of those variables in
the environment when `configure' is run.  Doing this isn't necessary,
but it's a convenience for users.

   Also add `@configure_input@' in a comment to each input file for
`AC_OUTPUT', so that the output files contain a comment saying they
were produced by `configure'.  Automatically selecting the right
comment syntax for all the kinds of files that people call `AC_OUTPUT'
on became too much work.

   Add `config.log' and `config.cache' to the list of files you remove
in `distclean' targets.

   If you have the following in `Makefile.in':

     prefix = /usr/local
     exec_prefix = $(prefix)

you must change it to:

     prefix = @prefix@
     exec_prefix = @exec_prefix@

The old behavior of replacing those variables without `@' characters
around them has been removed.


File: autoconf.info,  Node: Changed Macros,  Next: Changed Results,  Prev: Changed Makefiles,  Up: Autoconf 1

18.5.3 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.  *Note Obsolete Macros::, for a table
showing the new names for the old macros.  Use the `autoupdate' program
to convert your `configure.ac' to using the new macro names.  *Note
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 `autoconf', you may safely ignore them,
but your `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 `echo' or `AC_VERBOSE' (perhaps via
`AC_COMPILE_CHECK'), your `configure' script's output looks better if
you switch to `AC_MSG_CHECKING' and `AC_MSG_RESULT'.  *Note Printing
Messages::.  Those macros work best in conjunction with cache
variables.  *Note Caching Results::.


File: autoconf.info,  Node: Changed Results,  Next: Changed Macro Writing,  Prev: Changed Macros,  Up: Autoconf 1

18.5.4 Changed Results
----------------------

If you were checking the results of previous tests by examining the
shell variable `DEFS', you need to switch to checking the values of the
cache variables for those tests.  `DEFS' no longer exists while
`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 `AC_DEFINE' is called.  *Note Cache
Variable Names::.

   For example, here is a `configure.ac' fragment written for Autoconf
version 1:

     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

   Here is a way to write it for version 2:

     AC_CHECK_FUNCS([syslog])
     if test "x$ac_cv_func_syslog" = xno; then
       # 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
     fi

   If you were working around bugs in `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.
*Note Setting Output Variables::.

   All of the Boolean shell variables set by Autoconf macros now use
`yes' for the true value.  Most of them use `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 `t' for
true, you need to change your tests.


File: autoconf.info,  Node: Changed Macro Writing,  Prev: Changed Results,  Up: Autoconf 1

18.5.5 Changed Macro Writing
----------------------------

When defining your own macros, you should now use `AC_DEFUN' instead of
`define'.  `AC_DEFUN' automatically calls `AC_PROVIDE' and ensures that
macros called via `AC_REQUIRE' do not interrupt other macros, to
prevent nested `checking...' messages on the screen.  There's no actual
harm in continuing to use the older way, but it's less convenient and
attractive.  *Note 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.


File: autoconf.info,  Node: Autoconf 2.13,  Prev: Autoconf 1,  Up: Obsolete Constructs

18.6 Upgrading From Version 2.13
================================

The introduction of the previous section (*note Autoconf 1::) perfectly
suits this section...

     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 `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 `configure' scripts could benefit
     from some of the new features in version 2.50; the changes are
     summarized in the file `NEWS' in the Autoconf distribution.

* 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


File: autoconf.info,  Node: Changed Quotation,  Next: New Macros,  Up: Autoconf 2.13

18.6.1 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:

     AC_INIT
     AC_CHECK_HEADERS(foo.h, ,
       AC_MSG_ERROR(cannot find foo.h, bailing out))
     AC_OUTPUT

Autoconf 2.13 simply ignores it:

     $ autoconf-2.13; ./configure --silent
     creating cache ./config.cache
     configure: error: cannot find foo.h
     $

while Autoconf 2.50 produces a broken `configure':

     $ 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'
     $

   The message needs to be quoted, and the `AC_MSG_ERROR' invocation
too!

     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

   Many many (and many more) Autoconf macros were lacking proper
quotation, including no less than... `AC_DEFUN' itself!

     $ cat configure.in
     AC_DEFUN([AC_PROG_INSTALL],
     [# My own much better version
     ])
     AC_INIT
     AC_PROG_INSTALL
     AC_OUTPUT
     $ 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
     $ autoconf-2.50
     $


File: autoconf.info,  Node: New Macros,  Next: Hosts and Cross-Compilation,  Prev: Changed Quotation,  Up: Autoconf 2.13

18.6.2 New Macros
-----------------

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
`AC_' namespace, instead of `AM_'.  But in order to ease the upgrading
via `autoupdate', bindings to such `AM_' macros are provided.

   Unfortunately older versions of Automake (e.g., Automake 1.4) did
not quote the names of these macros.  Therefore, when `m4' finds
something like `AC_DEFUN(AM_TYPE_PTRDIFF_T, ...)' in `aclocal.m4',
`AM_TYPE_PTRDIFF_T' is expanded, replaced with its Autoconf definition.

   Fortunately Autoconf catches pre-`AC_INIT' expansions, and
complains, in its own words:

     $ cat configure.ac
     AC_INIT([Example], [1.0], [bug-example@example.org])
     AM_TYPE_PTRDIFF_T
     $ aclocal-1.4
     $ 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
     $

   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):

     $ cat configure.ac
     AC_INIT([Example], [1.0], [bug-example@example.org])
     AM_TYPE_PTRDIFF_T
     $ rm aclocal.m4
     $ autoupdate
     autoupdate: `configure.ac' is updated
     $ cat configure.ac
     AC_INIT([Example], [1.0], [bug-example@example.org])
     AC_CHECK_TYPES([ptrdiff_t])
     $ aclocal-1.4
     $ autoconf
     $


File: autoconf.info,  Node: Hosts and Cross-Compilation,  Next: AC_LIBOBJ vs LIBOBJS,  Prev: New Macros,  Up: Autoconf 2.13

18.6.3 Hosts and Cross-Compilation
----------------------------------

Based on the experience of compiler writers, and after long public
debates, many aspects of the cross-compilation chain have changed:

   - the relationship between the build, host, and target architecture
     types,

   - the command line interface for specifying them to `configure',

   - the variables defined in `configure',

   - the enabling of cross-compilation mode.


   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 `config.guess'.  Nevertheless, in
order to ease the transition from 2.13 to 2.50, the following
transition scheme is implemented.  _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 `config.guess', unless you
specify either `--build' or `--host'.  In this case, the default
becomes the system type you specified.  If you specify both, and
they're different, `configure' enters cross compilation mode, so it
doesn't run any tests that require execution.

   Hint: if you mean to override the result of `config.guess', prefer
`--build' over `--host'.


   For backward compatibility, `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/alpha but generates
code for GNU Hurd/sparc, which is also the build platform.

     ./configure --host=alpha-netbsd sparc-gnu


   In Autoconf 2.13 and before, the variables `build', `host', and
`target' had a different semantics before and after the invocation of
`AC_CANONICAL_BUILD' etc.  Now, the argument of `--build' is strictly
copied into `build_alias', and is left empty otherwise.  After the
`AC_CANONICAL_BUILD', `build' is set to the canonicalized build type.
To ease the transition, before, its contents is the same as that of
`build_alias'.  Do _not_ rely on this broken feature.

   For consistency with the backward compatibility scheme exposed above,
when `--host' is specified but `--build' isn't, the build system is
assumed to be the same as `--host', and `build_alias' is set to that
value.  Eventually, this historically incorrect behavior will go away.


   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.
`configure' could even enter cross-compilation mode only because the
compiler was not functional.  This is mainly because `configure' used
to try to detect cross-compilation, instead of waiting for an explicit
flag from the user.

   Now, `configure' enters cross-compilation mode if and only if
`--host' is passed.

   That's the short documentation.  To ease the transition between 2.13
and its successors, a more complicated scheme is implemented.  _Do not
rely on the following_, as it will be removed in the near future.

   If you specify `--host', but not `--build', when `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
`--host', be sure to specify `--build' too.

     ./configure --build=i686-pc-linux-gnu --host=m68k-coff

enters cross-compilation mode.  The former interface, which consisted
in setting the compiler to a cross-compiler without informing
`configure' is obsolete.  For instance, `configure' fails if it can't
run the code generated by the specified compiler if you configure as
follows:

     ./configure CC=m68k-coff-gcc


File: autoconf.info,  Node: AC_LIBOBJ vs LIBOBJS,  Next: AC_ACT_IFELSE vs AC_TRY_ACT,  Prev: Hosts and Cross-Compilation,  Up: Autoconf 2.13

18.6.4 `AC_LIBOBJ' vs. `LIBOBJS'
--------------------------------

Up to Autoconf 2.13, the replacement of functions was triggered via the
variable `LIBOBJS'.  Since Autoconf 2.50, the macro `AC_LIBOBJ' should
be used instead (*note Generic Functions::).  Starting at Autoconf
2.53, the use of `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 `configure.ac' are all replaced with the use of traces.  As a
consequence, any action must be traceable, which obsoletes critical
variable assignments.  Fortunately, `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 `LIBOBJS': asking for a replacement
function, and adjusting `LIBOBJS' for Automake and/or Libtool.


   As for function replacement, the fix is immediate: use `AC_LIBOBJ'.
For instance:

     LIBOBJS="$LIBOBJS fnmatch.o"
     LIBOBJS="$LIBOBJS malloc.$ac_objext"

should be replaced with:

     AC_LIBOBJ([fnmatch])
     AC_LIBOBJ([malloc])


   When used with Automake 1.10 or newer, a suitable value for
`LIBOBJDIR' is set so that the `LIBOBJS' and `LTLIBOBJS' can be
referenced from any `Makefile.am'.  Even without Automake, arranging
for `LIBOBJDIR' to be set correctly enables referencing `LIBOBJS' and
`LTLIBOBJS' in another directory.  The `LIBOBJDIR' feature is
experimental.


File: autoconf.info,  Node: AC_ACT_IFELSE vs AC_TRY_ACT,  Prev: AC_LIBOBJ vs LIBOBJS,  Up: Autoconf 2.13

18.6.5 `AC_ACT_IFELSE' vs. `AC_TRY_ACT'
---------------------------------------

Since Autoconf 2.50, internal codes uses `AC_PREPROC_IFELSE',
`AC_COMPILE_IFELSE', `AC_LINK_IFELSE', and `AC_RUN_IFELSE' on one hand
and `AC_LANG_SOURCE', and `AC_LANG_PROGRAM' on the other hand instead
of the deprecated `AC_TRY_CPP', `AC_TRY_COMPILE', `AC_TRY_LINK', and
`AC_TRY_RUN'.  The motivations where:
   - a more consistent interface: `AC_TRY_COMPILE' etc. were double
     quoting their arguments;

   - the combinatoric explosion is solved by decomposing on the one
     hand the generation of sources, and on the other hand executing
     the program;

   - this scheme helps supporting more languages than plain C and C++.

   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..., the
expense of speed.

   As a perfect example of what is _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
`AC_EGREP_HEADER' instead of running `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 `AC_EGREP_CPP':

     AC_EGREP_CPP(yes,
     [#ifdef _AIX
       yes
     #endif
     ], is_aix=yes, is_aix=no)

   The above example, properly written would (i) use `AC_LANG_PROGRAM',
and (ii) run the compiler:

     AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
     [[#ifndef _AIX
      error: This isn't AIX!
     #endif
     ]])],
                        [is_aix=yes],
                        [is_aix=no])


File: autoconf.info,  Node: Using Autotest,  Next: FAQ,  Prev: Obsolete Constructs,  Up: Top

19 Generating Test Suites with Autotest
***************************************

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

   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, Free Recode, Free 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 `testsuite' scripts
* Making testsuite Scripts::    Using autom4te to create `testsuite'


File: autoconf.info,  Node: Using an Autotest Test Suite,  Next: Writing Testsuites,  Up: Using Autotest

19.1 Using an Autotest Test Suite
=================================

* Menu:

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


File: autoconf.info,  Node: testsuite Scripts,  Next: Autotest Logs,  Up: Using an Autotest Test Suite

19.1.1 `testsuite' Scripts
--------------------------

Generating testing or validation suites using Autotest is rather easy.
The whole validation suite is held in a file to be processed through
`autom4te', itself using GNU M4 under the hood, to produce a
stand-alone Bourne shell script which then gets distributed.  Neither
`autom4te' nor GNU M4 are needed at the installer's end.

   Each test of the validation suite should be part of some test group.
A "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 `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, `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 `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 `AT_INIT'
invocation) into the file `local.at', and making `testsuite.at' be a
simple list of `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 `autom4te' command line arguments.

   The validation scripts that Autotest produces are by convention
called `testsuite'.  When run, `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
`testsuite.dir/NN', where NN is the sequence number of the test group,
and they include:

   * a debugging script named `run' which reruns the test in "debug
     mode" (*note testsuite Invocation::).  The automatic generation of
     debugging scripts has the purpose of easing the chase for bugs.

   * all the files created with `AT_DATA'

   * all the Erlang source code files created with `AT_CHECK_EUNIT'

   * a log of the run, named `testsuite.log'

   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 `atconfig', automatically created by
`AC_CONFIG_TESTDIR'.  For configuration information which your testing
environment specifically needs, you might prepare an optional file
named `atlocal.in', instantiated by `AC_CONFIG_FILES'.  The
configuration process produces `atconfig' and `atlocal' out of these
two input files, and these two produced files are automatically read by
the `testsuite' script.

   Here is a diagram showing the relationship between files.

Files used in preparing a software package for distribution:

                     [package.m4] -->.
                                      \
     subfile-1.at ->.  [local.at] ---->+
         ...         \                  \
     subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
         ...         /
     subfile-n.at ->'

Files used in configuring a software package:

                                          .--> atconfig
                                         /
     [atlocal.in] -->  config.status* --<
                                         \
                                          `--> [atlocal]

Files created during test suite execution:

     atconfig -->.                    .--> testsuite.log
                  \                  /
                   >-- testsuite* --<
                  /                  \
     [atlocal] ->'                    `--> [testsuite.dir]


File: autoconf.info,  Node: Autotest Logs,  Prev: testsuite Scripts,  Up: Using an Autotest Test Suite

19.1.2 Autotest Logs
--------------------

When run, the test suite creates a log file named after itself, e.g., a
test suite named `testsuite' creates `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:

command line arguments
     A bad but unfortunately widespread habit consists of setting
     environment variables before the command, such as in
     `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 `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.

`ChangeLog' excerpts
     The topmost lines of all the `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 `ChangeLog'.

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
     BUILD, while running programs on a machine HOST.  It is much
     simpler to run both the test suite and the programs on HOST, but
     then, from the point of view of the test suite, there remains a
     single environment, HOST = BUILD.  The log contains relevant
     information on the state of the BUILD machine, including some
     important environment variables.

tested programs
     The absolute file name and answers to `--version' of the tested
     programs (see *note Writing Testsuites::, `AT_TESTED').

configuration log
     The contents of `config.log', as created by `configure', are
     appended.  It contains the configuration flags and a detailed
     report on the configuration itself.


File: autoconf.info,  Node: Writing Testsuites,  Next: testsuite Invocation,  Prev: Using an Autotest Test Suite,  Up: Using Autotest

19.2 Writing `testsuite.at'
===========================

The `testsuite.at' is a Bourne shell script making use of special
Autotest M4 macros.  It often contains a call to `AT_INIT' near its
beginning followed by one call to `m4_include' per source file for
tests.  Each such included file, or the remainder of `testsuite.at' if
include files are not used, contain a sequence of test groups.  Each
test group begins with a call to `AT_SETUP', then an arbitrary number
of shell commands or calls to `AT_CHECK', and then completes with a
call to `AT_CLEANUP'.  Multiple test groups can be categorized by a
call to `AT_BANNER'.

   All of the public Autotest macros have all-uppercase names in the
namespace `^AT_' to prevent them from accidentally conflicting with
other text; Autoconf also reserves the namespace `^_AT_' for internal
macros.  All shell variables used in the testsuite for internal
purposes have mostly-lowercase names starting with `at_'.  Autotest
also uses here-document delimiters in the namespace `^_AT[A-Z]', and
makes use of the file system namespace `^at-'.

   Since Autoconf is built on top of M4sugar (*note Programming in
M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
aware of those namespaces (`^_?\(m4\|AS\)_').  In general, you _should
not use_ the namespace of a package that does not own the macro or
shell code you are writing.

 -- Macro: AT_INIT ([NAME])
     Initialize Autotest.  Giving a NAME to the test suite is
     encouraged if your package includes several test suites.  Before
     this macro is called, `AT_PACKAGE_STRING' and
     `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 `package.m4' built by `make' (*note
     Making testsuite Scripts::), in order to inherit the package name,
     version, and bug reporting address from `configure.ac'.

 -- Macro: AT_COPYRIGHT (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 COPYRIGHT-NOTICE.

     The COPYRIGHT-NOTICE shows up in both the head of `testsuite' and
     in `testsuite --version'.

 -- Macro: AT_ARG_OPTION (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
          [ACTION-IF-NOT-GIVEN])
     Accept options from the space-separated list OPTIONS, a list that
     has leading dashes removed from the options.  Long options will be
     prefixed with `--', single-character options with `-'.  The first
     word in this list is the primary OPTION, any others are assumed to
     be short-hand aliases.  The variable associated with it is
     `at_arg_OPTION', with any dashes in OPTION replaced with
     underscores.

     If the user passes `--OPTION' to the `testsuite', the variable
     will be set to `:'.  If the user does not pass the option, or
     passes `--no-OPTION', then the variable will be set to `false'.

     ACTION-IF-GIVEN is run each time the option is encountered; here,
     the variable `at_optarg' will be set to `:' or `false' as
     appropriate.  `at_optarg' is actually just a copy of
     `at_arg_OPTION'.

     ACTION-IF-NOT-GIVEN will be run once after option parsing is
     complete and if no option from OPTIONS was used.

     HELP-TEXT is added to the end of the list of options shown in
     `testsuite --help' (*note AS_HELP_STRING::).

     It is recommended that you use a package-specific prefix to OPTIONS
     names in order to avoid clashes with future Autotest built-in
     options.

 -- Macro: AT_ARG_OPTION_ARG (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
          [ACTION-IF-NOT-GIVEN])
     Accept options with arguments from the space-separated list
     OPTIONS, a list that has leading dashes removed from the options.
     Long options will be prefixed with `--', single-character options
     with `-'.  The first word in this list is the primary OPTION, any
     others are assumed to be short-hand aliases.  The variable
     associated with it is `at_arg_OPTION', with any dashes in OPTION
     replaced with underscores.

     If the user passes `--OPTION=ARG' or `--OPTION ARG' to the
     `testsuite', the variable will be set to `ARG'.

     ACTION-IF-GIVEN is run each time the option is encountered; here,
     the variable `at_optarg' will be set to `ARG'.  `at_optarg' is
     actually just a copy of `at_arg_OPTION'.

     ACTION-IF-NOT-GIVEN will be run once after option parsing is
     complete and if no option from OPTIONS was used.

     HELP-TEXT is added to the end of the list of options shown in
     `testsuite --help' (*note AS_HELP_STRING::).

     It is recommended that you use a package-specific prefix to OPTIONS
     names in order to avoid clashes with future Autotest built-in
     options.

 -- Macro: AT_COLOR_TESTS
     Enable colored test results by default when the output is
     connected to a terminal.

 -- Macro: AT_TESTED (EXECUTABLES)
     Log the file name and answer to `--version' of each program in
     space-separated list EXECUTABLES.  Several invocations register
     new executables, in other words, don't fear registering one program
     several times.

     Autotest test suites rely on `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.


 -- Macro: AT_BANNER (TEST-CATEGORY-NAME)
     This macro identifies the start of a category of related test
     groups.  When the resulting `testsuite' is invoked with more than
     one test group to run, its output will include a banner containing
     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.

 -- Macro: AT_SETUP (TEST-GROUP-NAME)
     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.
     TEST-GROUP-NAME must not expand to unbalanced quotes, although
     quadrigraphs can be used.

 -- Macro: AT_KEYWORDS (KEYWORDS)
     Associate the space-separated list of 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
     `foo' feature, then using `AT_KEYWORDS(foo)' lets you run
     `./testsuite -k foo' to run exclusively these test groups.  The
     TEST-GROUP-NAME of the test group is automatically recorded to
     `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.

 -- Macro: AT_CAPTURE_FILE (FILE)
     If the current test group fails, log the contents of FILE.
     Several identical calls within one test group have no additional
     effect.

 -- Macro: AT_FAIL_IF (SHELL-CONDITION)
     Make the test group fail and skip the rest of its execution, if
     SHELL-CONDITION is true.  SHELL-CONDITION is a shell expression
     such as a `test' command.  Tests before `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 SHELL-CONDITION could emit any kind of output you should
     instead use `AT_CHECK' like
          AT_CHECK([if SHELL-CONDITION; then exit 99; fi])
     so that such output is properly recorded in the `testsuite.log'
     file.

 -- Macro: AT_SKIP_IF (SHELL-CONDITION)
     Determine whether the test should be skipped because it requires
     features that are unsupported on the machine under test.
     SHELL-CONDITION is a shell expression such as a `test' command.
     Tests before `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 SHELL-CONDITION could emit any kind of output you should
     instead use `AT_CHECK' like
          AT_CHECK([if SHELL-CONDITION; then exit 77; fi])
     so that such output is properly recorded in the `testsuite.log'
     file.

 -- Macro: AT_XFAIL_IF (SHELL-CONDITION)
     Determine whether the test is expected to fail because it is a
     known bug (for unsupported features, you should skip the test).
     SHELL-CONDITION is a shell expression such as a `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.

 -- Macro: AT_CLEANUP
     End the current test group.


 -- Macro: AT_DATA (FILE, CONTENTS)
     Initialize an input data FILE with given CONTENTS.  Of course, the
     CONTENTS have to be properly quoted between square brackets to
     protect against included commas or spurious M4 expansion.
     CONTENTS must be empty or end with a newline.  FILE must be a
     single shell word that expands into a single file name.

 -- Macro: AT_CHECK (COMMANDS, [STATUS = `0'], [STDOUT], [STDERR],
          [RUN-IF-FAIL], [RUN-IF-PASS])
 -- Macro: AT_CHECK_UNQUOTED (COMMANDS, [STATUS = `0'], [STDOUT],
          [STDERR], [RUN-IF-FAIL], [RUN-IF-PASS])
     Execute a test by performing given shell COMMANDS in a subshell.
     COMMANDS is output as-is, so shell expansions are honored.  These
     commands should normally exit with STATUS, while producing expected
     STDOUT and STDERR contents.  If COMMANDS exit with unexpected
     status 77, then the rest of the test group is skipped.  If
     COMMANDS exit with unexpected status 99, then the test group is
     immediately failed.  Otherwise, if this test fails, run shell
     commands RUN-IF-FAIL or, if this test passes, run shell commands
     RUN-IF-PASS, both inside the current shell execution environment.
     At the beginning of RUN-IF-FAIL and RUN-IF-PASS, the status of
     COMMANDS is available in the `at_status' shell variable.

     This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.

     If STATUS is the literal `ignore', then the corresponding exit
     status 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 `AT_XFAIL_IF' because a
     feature has not yet been implemented, but to still distinguish
     between gracefully handling the missing feature and dumping core.
     A hard failure also inhibits post-test actions in RUN-IF-FAIL.

     If the value of the STDOUT or STDERR parameter is one of the
     literals in the following table, then the test treats the output
     according to the rules of that literal.  Otherwise, the value of
     the parameter is treated as text that must exactly match the
     output given by 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).  The
     difference between `AT_CHECK' and `AT_CHECK_UNQUOTED' is that only
     the latter performs shell variable expansion (`$'), command
     substitution (``'), and backslash escaping (`\') on comparison
     text given in the STDOUT and STDERR arguments; if the text
     includes a trailing newline, this would be the same as if it were
     specified via an unquoted here-document.  (However, there is no
     difference in the interpretation of COMMANDS).

    `ignore'
          The content of the output is ignored, but still captured in
          the test group log (if the testsuite is run with option `-v',
          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 STDOUT and STDERR.

    `ignore-nolog'
          The content of the output is ignored, and nothing is captured
          in the log files.  If 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
          `testsuite -v'.

    `stdout'
          For the STDOUT parameter, capture the content of standard
          output to both the 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 `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.

    `stderr'
          Like `stdout', except that it only works for the STDERR
          parameter, and the standard error capture file will be named
          `stderr'.

    `stdout-nolog'
    `stderr-nolog'
          Like `stdout' or `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.

    `expout'
          For the STDOUT parameter, compare standard output contents
          with the previously created file `expout', and list any
          differences in the testsuite log.

    `experr'
          Like `expout', except that it only works for the STDERR
          parameter, and the standard error contents are compared with
          `experr'.

 -- Macro: AT_CHECK_EUNIT (MODULE, TEST-SPEC, [ERLFLAGS],
          [RUN-IF-FAIL], [RUN-IF-PASS])
     Initialize and execute an Erlang module named MODULE that performs
     tests following the TEST-SPEC EUnit test specification.  TEST-SPEC
     must be a valid EUnit test specification, as defined in the EUnit
     Reference Manual (http://erlang.org/doc/apps/eunit/index.html).
     ERLFLAGS are optional command-line options passed to the Erlang
     interpreter to execute the test Erlang module.  Typically,
     ERLFLAGS defines at least the paths to directories containing the
     compiled Erlang modules under test, as `-pa path1 path2 ...'.

     For example, the unit tests associated with Erlang module `testme',
     which compiled code is in subdirectory `src', can be performed
     with:

          AT_CHECK_EUNIT([testme_testsuite], [{module, testme}],
                         [-pa "${abs_top_builddir}/src"])

     This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.

     Variables `ERL', `ERLC', and (optionally) `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
     `configure.ac' using the `AC_ERLANG_PATH_ERL' and
     `AC_ERLANG_PATH_ERLC' macros, and the configured values of those
     variables are automatically defined in the testsuite.  If `ERL' or
     `ERLC' is not defined, the test group is skipped.

     If the EUnit library cannot be found, i.e. if module `eunit' cannot
     be loaded, the test group is skipped.  Otherwise, if TEST-SPEC is
     an invalid EUnit test specification, the test group fails.
     Otherwise, if the EUnit test passes, shell commands RUN-IF-PASS
     are executed or, if the EUnit test fails, shell commands
     RUN-IF-FAIL are executed and the test group fails.

     Only the generated test Erlang module is automatically compiled and
     executed.  If TEST-SPEC involves testing other Erlang modules,
     e.g. module `testme' in the example above, those modules must be
     already compiled.

     If the testsuite is run in verbose mode, with option `--verbose',
     EUnit is also run in verbose mode to output more details about
     individual unit tests.


File: autoconf.info,  Node: testsuite Invocation,  Next: Making testsuite Scripts,  Prev: Writing Testsuites,  Up: Using Autotest

19.3 Running `testsuite' Scripts
================================

Autotest test suites support the following options:

`--help'
`-h'
     Display the list of options and exit successfully.

`--version'
`-V'
     Display the version of the test suite and exit successfully.

`--directory=DIR'
`-C DIR'
     Change the current directory to DIR before creating any files.
     Useful for running the testsuite in a subdirectory from a top-level
     Makefile.

`--jobs[=N]'
`-j[N]'
     Run N tests in parallel, if possible.  If N is not given, run all
     given tests in parallel.  Note that there should be no space
     before the argument to `-j', as `-j NUMBER' denotes the separate
     arguments `-j' and `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 `mkfifo' command to work, and will be
     silently disabled otherwise.

`--clean'
`-c'
     Remove all the files the test suite might have created and exit.
     Meant for `clean' Make targets.

`--list'
`-l'
     List all the tests (or only the selection), including their
     possible keywords.


   By default all tests are performed (or described with `--list')
silently in the default environment, but the environment, set of tests,
and verbosity level can be tuned:

`VARIABLE=VALUE'
     Set the environment VARIABLE to VALUE.  Use this rather than
     `FOO=foo ./testsuite' as debugging scripts would then run in a
     different environment.

     The variable `AUTOTEST_PATH' specifies the testing path to prepend
     to `PATH'.  Relative directory names (not starting with `/') 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 _build_ tree, then from the _source_ tree.  For instance
     `./testsuite AUTOTEST_PATH=tests:bin' for a `/src/foo-1.0' source
     package built in `/tmp/foo' results in
     `/tmp/foo/tests:/tmp/foo/bin' and then
     `/src/foo-1.0/tests:/src/foo-1.0/bin' being prepended to `PATH'.

`NUMBER'
`NUMBER-NUMBER'
`NUMBER-'
`-NUMBER'
     Add the corresponding test groups, with obvious semantics, to the
     selection.

`--keywords=KEYWORDS'
`-k KEYWORDS'
     Add to the selection the test groups with title or keywords
     (arguments to `AT_SETUP' or `AT_KEYWORDS') that match _all_
     keywords of the comma separated list KEYWORDS, case-insensitively.
     Use `!' immediately before the keyword to invert the selection for
     this keyword.  By default, the keywords match whole words; enclose
     them in `.*' to also match parts of words.

     For example, running

          ./testsuite -k 'autoupdate,.*FUNC.*'

     selects all tests tagged `autoupdate' _and_ with tags containing
     `FUNC' (as in `AC_CHECK_FUNC', `AC_FUNC_ALLOCA', etc.), while

          ./testsuite -k '!autoupdate' -k '.*FUNC.*'

     selects all tests not tagged `autoupdate' _or_ with tags
     containing `FUNC'.

`--errexit'
`-e'
     If any test fails, immediately abort testing.  This implies
     `--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 `--jobs', then
     concurrently running tests will finish before exiting.

`--verbose'
`-v'
     Force more verbosity in the detailed output of what is being done.
     This is the default for debugging scripts.

`--color'
`--color[=never|auto|always]'
     Enable colored test results.  Without an argument, or with
     `always', test results will be colored.  With `never', color mode
     is turned off.  Otherwise, if either the macro `AT_COLOR_TESTS' is
     used by the testsuite author, or the argument `auto' is given,
     then test results are colored if standard output is connected to a
     terminal.

`--debug'
`-d'
     Do not remove the files after a test group was performed--but they
     are still removed _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.

`--recheck'
     Add to the selection all test groups that failed or passed
     unexpectedly during the last non-debugging test run.

`--trace'
`-x'
     Trigger shell tracing of the test groups.

   Besides these options accepted by every Autotest testsuite, the
testsuite author might have added package-specific options via the
`AT_ARG_OPTION' and `AT_ARG_OPTION_ARG' macros (*note Writing
Testsuites::); refer to `testsuite --help' and the package
documentation for details.


File: autoconf.info,  Node: Making testsuite Scripts,  Prev: testsuite Invocation,  Up: Using Autotest

19.4 Making `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 `tests/' as the name of the directory
holding all your tests and their makefile.  Here is a check list of
things to do.

   - Make sure to create the file `package.m4', which defines the
     identity of the package.  It must define `AT_PACKAGE_STRING', the
     full signature of the package, and `AT_PACKAGE_BUGREPORT', the
     address to which bug reports should be sent.  For sake of
     completeness, we suggest that you also define `AT_PACKAGE_NAME',
     `AT_PACKAGE_TARNAME', `AT_PACKAGE_VERSION', and `AT_PACKAGE_URL'.
     *Note Initializing configure::, for a description of these
     variables.  Be sure to distribute `package.m4' and to put it into
     the source hierarchy: the test suite ought to be shipped!  See
     below for an example `Makefile' excerpt.

   - Invoke `AC_CONFIG_TESTDIR'.

      -- Macro: AC_CONFIG_TESTDIR (DIRECTORY, [TEST-PATH = `directory'])
          An Autotest test suite is to be configured in DIRECTORY.  This
          macro causes `DIRECTORY/atconfig' to be created by
          `config.status' and sets the default `AUTOTEST_PATH' to
          TEST-PATH (*note testsuite Invocation::).

   - Still within `configure.ac', as appropriate, ensure that some
     `AC_CONFIG_FILES' command includes substitution for
     `tests/atlocal'.

   - The appropriate `Makefile' should be modified so the validation in
     your package is triggered by `make check'.  An example is provided
     below.

   With Automake, here is a minimal example for inclusion in
`tests/Makefile.am', in order to link `make check' with a validation
suite.

     # The `:;' works around a Bash 3.2 bug when the output is not writable.
     $(srcdir)/package.m4: $(top_srcdir)/configure.ac
             :;{ \
               echo '# Signature of the current package.' && \
               echo 'm4_define([AT_PACKAGE_NAME],' && \
               echo '  [$(PACKAGE_NAME)])' && \
               echo 'm4_define([AT_PACKAGE_TARNAME],' && \
               echo '  [$(PACKAGE_TARNAME)])' && \
               echo 'm4_define([AT_PACKAGE_VERSION],' && \
               echo '  [$(PACKAGE_VERSION)])' && \
               echo 'm4_define([AT_PACKAGE_STRING],' && \
               echo '  [$(PACKAGE_STRING)])' && \
               echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \
               echo '  [$(PACKAGE_BUGREPORT)])'; \
               echo 'm4_define([AT_PACKAGE_URL],' && \
               echo '  [$(PACKAGE_URL)])'; \
             } >'$(srcdir)/package.m4'

     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

     AUTOM4TE = $(SHELL) $(srcdir)/build-aux/missing --run autom4te
     AUTOTEST = $(AUTOM4TE) --language=autotest
     $(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
             $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
             mv $@.tmp $@

   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 `missing' provides 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 `testsuite.at' includes.

   If you don't use Automake, you should include the above example in
`tests/Makefile.in', along with additional lines inspired from the
following:

     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@

     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)/$@

and manage to have `$(EXTRA_DIST)' distributed.  You will also want to
distribute the file `build-aux/missing' from the Automake project; a
copy of this file resides in the Autoconf source tree.

   With all this in place, and if you have not initialized
`TESTSUITEFLAGS' within your makefile, you can fine-tune test suite
execution with this variable, for example:

     make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'


File: autoconf.info,  Node: FAQ,  Next: History,  Prev: Using Autotest,  Up: Top

20 Frequent Autoconf Questions, with answers
********************************************

Several questions about Autoconf come up occasionally.  Here some of
them are addressed.

* Menu:

* Distributing::                Distributing `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 `configure' instead of Imake
* Defining Directories::        Passing `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 `configure' scripts


File: autoconf.info,  Node: Distributing,  Next: Why GNU M4,  Up: FAQ

20.1 Distributing `configure' Scripts
=====================================

     What are the restrictions on distributing `configure'
     scripts that Autoconf generates?  How does that affect my
     programs that use them?

   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 `configure',
`config.h.in' is under whatever copyright you use for your
`configure.ac'.  `config.sub' and `config.guess' have an exception to
the GPL when they are used with an Autoconf-generated `configure'
script, which permits you to distribute them under the same terms as
the rest of your package.  `install-sh' is from the X Consortium and is
not copyrighted.


File: autoconf.info,  Node: Why GNU M4,  Next: Bootstrapping,  Prev: Distributing,  Up: FAQ

20.2 Why Require GNU M4?
========================

     Why does Autoconf require GNU M4?

   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:

     m4_builtin
     m4_indir
     m4_bpatsubst
     __file__
     __line__

   Autoconf requires version 1.4.6 or later of GNU M4.

   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.


File: autoconf.info,  Node: Bootstrapping,  Next: Why Not Imake,  Prev: Why GNU M4,  Up: FAQ

20.3 How Can I Bootstrap?
=========================

     If Autoconf requires GNU M4 and GNU M4 has an Autoconf
     `configure' script, how do I bootstrap?  It seems like a chicken
     and egg problem!

   This is a misunderstanding.  Although GNU M4 does come with a
`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 `configure' script, which few people have
to do (mainly its maintainer).


File: autoconf.info,  Node: Why Not Imake,  Next: Defining Directories,  Prev: Bootstrapping,  Up: FAQ

20.4 Why Not Imake?
===================

     Why not use Imake instead of `configure' scripts?

   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:

     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.

   Here is some further explanation, written by Per Bothner:

     One of the advantages of Imake is that it is easy to generate large
     makefiles using the `#include' and macro mechanisms of `cpp'.
     However, `cpp' is not programmable: it has limited conditional
     facilities, and no looping.  And `cpp' cannot inspect its
     environment.

     All of these problems are solved by using `sh' instead of `cpp'.
     The shell is fully programmable, has macro substitution, can
     execute (or source) other shell scripts, and can inspect its
     environment.

   Paul Eggert elaborates more:

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

   Finally, Mark Eichin notes:

     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 `configure': `Imakefile'
     files tend to be much shorter (likewise, less redundant) than
     `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
     `post.in' and `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 `configure' setups.


File: autoconf.info,  Node: Defining Directories,  Next: Autom4te Cache,  Prev: Why Not Imake,  Up: FAQ

20.5 How Do I `#define' Installation Directories?
=================================================

     My program needs library files, installed in `datadir' and
     similar.  If I use
          AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
            [Define to the read-only architecture-independent
             data directory.])

     I get
          #define DATADIR "${prefix}/share"

As already explained, this behavior is on purpose, mandated by the GNU
Coding Standards, see *note Installation Directory Variables::.  There
are several means to achieve a similar goal:

   - Do not use `AC_DEFINE' but use your makefile to pass the actual
     value of `datadir' via compilation flags.  *Note Installation
     Directory Variables::, for the details.

   - This solution can be simplified when compiling a program: you may
     either extend the `CPPFLAGS':

          CPPFLAGS = -DDATADIR='"$(datadir)"' @CPPFLAGS@

     If you are using Automake, you should use `AM_CPPFLAGS' instead:

          AM_CPPFLAGS = -DDATADIR='"$(datadir)"'

     Alternatively, create a dedicated header file:

          DISTCLEANFILES = myprog-paths.h
          myprog-paths.h: Makefile
                  echo '#define DATADIR "$(datadir)"' >$@

     The gnulib module `configmake' provides such a header with all the
     standard directory variables defined, *note configmake:
     (gnulib)configmake.

   - Use `AC_DEFINE' but have `configure' compute the literal value of
     `datadir' and others.  Many people have wrapped macros to automate
     this task; for an example, see the macro `AC_DEFINE_DIR' from the
     Autoconf Macro Archive
     (http://www.gnu.org/software/autoconf-archive/).

     This solution does not conform to the GNU Coding Standards.

   - 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 `prefix',
     and try to find `prefix' at runtime, this way your package is
     relocatable.


File: autoconf.info,  Node: Autom4te Cache,  Next: Present But Cannot Be Compiled,  Prev: Defining Directories,  Up: FAQ

20.6 What is `autom4te.cache'?
==============================

     What is this directory `autom4te.cache'?  Can I safely remove it?

   In the GNU Build System, `configure.ac' plays a central role and is
read by many tools: `autoconf' to create `configure', `autoheader' to
create `config.h.in', `automake' to create `Makefile.in', `autoscan' to
check the completeness of `configure.ac', `autoreconf' to check the GNU
Build System components that are used.  To "read `configure.ac'"
actually means to compile it with M4, which can be a long process for
complex `configure.ac'.

   This is why all these tools, instead of running directly M4, invoke
`autom4te' (*note autom4te Invocation::) which, while answering to a
specific demand, stores additional information in `autom4te.cache' for
future runs.  For instance, if you run `autoconf', behind the scenes,
`autom4te' also stores information for the other tools, so that when
you invoke `autoheader' or `automake' etc., reprocessing `configure.ac'
is not needed.  The speed up is frequently 30%, and is increasing with
the size of `configure.ac'.

   But it is and remains being simply a cache: you can safely remove it.


     Can I permanently get rid of it?

   The creation of this cache can be disabled from `~/.autom4te.cfg',
see *note 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 `autoreconf -f' on the Core Utilities
is twice slower without the cache _although `--force' implies that the
cache is not fully exploited_, and eight times slower than without
`--force'.


File: autoconf.info,  Node: Present But Cannot Be Compiled,  Next: Expanded Before Required,  Prev: Autom4te Cache,  Up: FAQ

20.7 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 `AC_CHECK_HEADER' and `AC_CHECK_HEADERS' failed to follow
this idea, and called the preprocessor, instead of the compiler, to
check for headers.  As a result, incompatibilities between headers went
unnoticed during configuration, and maintainers finally had to deal
with this issue elsewhere.

   The transition began with Autoconf 2.56.  As of Autoconf 2.64 both
checks are performed, and `configure' complains loudly if the compiler
and the preprocessor do not agree.  However, only the compiler result
is considered.

   Consider the following example:

     $ cat number.h
     typedef int number;
     $ cat pi.h
     const number pi = 3;
     $ cat configure.ac
     AC_INIT([Example], [1.0], [bug-example@example.org])
     AC_CHECK_HEADERS([pi.h])
     $ autoconf -Wall
     $ ./configure
     checking for gcc... gcc
     checking for C compiler default output file name... a.out
     checking whether the C compiler works... yes
     checking whether we are cross compiling... no
     checking for suffix of executables...
     checking for suffix of object files... o
     checking whether we are using the GNU C compiler... yes
     checking whether gcc accepts -g... yes
     checking for gcc option to accept ISO C89... none needed
     checking how to run the C preprocessor... gcc -E
     checking for grep that handles long lines and -e... grep
     checking for egrep... grep -E
     checking for ANSI C header files... yes
     checking for sys/types.h... yes
     checking for sys/stat.h... yes
     checking for stdlib.h... yes
     checking for string.h... yes
     checking for memory.h... yes
     checking for strings.h... yes
     checking for inttypes.h... yes
     checking for stdint.h... yes
     checking for unistd.h... yes
     checking pi.h usability... no
     checking pi.h presence... yes
     configure: WARNING: pi.h: present but cannot be compiled
     configure: WARNING: pi.h:     check for missing prerequisite headers?
     configure: WARNING: pi.h: see the Autoconf documentation
     configure: WARNING: pi.h:     section "Present But Cannot Be Compiled"
     configure: WARNING: pi.h: proceeding with the compiler's result
     configure: WARNING:     ## -------------------------------------- ##
     configure: WARNING:     ## Report this to bug-example@example.org ##
     configure: WARNING:     ## -------------------------------------- ##
     checking for pi.h... yes

The proper way the handle this case is using the fourth argument (*note
Generic Headers::):

     $ cat configure.ac
     AC_INIT([Example], [1.0], [bug-example@example.org])
     AC_CHECK_HEADERS([number.h pi.h], [], [],
     [[#ifdef HAVE_NUMBER_H
     # include <number.h>
     #endif
     ]])
     $ autoconf -Wall
     $ ./configure
     checking for gcc... gcc
     checking for C compiler default output... a.out
     checking whether the C compiler works... yes
     checking whether we are cross compiling... no
     checking for suffix of executables...
     checking for suffix of object files... o
     checking whether we are using the GNU C compiler... yes
     checking whether gcc accepts -g... yes
     checking for gcc option to accept ANSI C... none needed
     checking for number.h... yes
     checking for pi.h... yes

   See *note Particular Headers::, for a list of headers with their
prerequisites.


File: autoconf.info,  Node: Expanded Before Required,  Next: Debugging,  Prev: Present But Cannot Be Compiled,  Up: FAQ

20.8 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:

     $ cat configure.ac
     =>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])
     =>AC_INIT
     =>OUTER
     =>AC_OUTPUT
     $ autoconf
     =>configure.ac:11: warning: AC_REQUIRE:
     => `TESTA' was expanded before it was required
     =>configure.ac:4: TESTB is expanded from...
     =>configure.ac:6: TESTC is expanded from...
     =>configure.ac:7: OUTER is expanded from...
     =>configure.ac:11: the top level

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 `AC_DEFUN_ONCE' (*note 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 `AC_REQUIRE' (*note 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 `configure.ac':

     AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
     foobar=
     AC_PROG_CC
     FOO

but that was getting complex, so the author wanted to offload some of
the text into a new macro in another file included via `aclocal.m4'.
The nai"ve approach merely wraps the text in a new macro:

     AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
     AC_DEFUN([BAR], [
     foobar=
     AC_PROG_CC
     FOO
     ])
     BAR

With older versions of Autoconf, the setting of `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
`AC_PROG_CC', and outputs two copies of the compiler check, one before
`foobar=', and one after.  To understand why this is happening,
remember that the use of `AC_COMPILE_IFELSE' includes a call to
`AC_REQUIRE([AC_PROG_CC])' under the hood.  According to the documented
semantics of `AC_REQUIRE', this means that `AC_PROG_CC' _must_ occur
before the body of the outermost `AC_DEFUN', which in this case is
`BAR', thus preceding the use of `foobar='.  The older versions of
Autoconf were broken with regards to the rules of `AC_REQUIRE', which
explains why the code changed from one over to two copies of
`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 `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 `AC_DEFUN' is impacted by `AC_REQUIRE'; there is
always the possibility of using the lower-level `m4_define':

     AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
     m4_define([BAR], [
     foobar=
     AC_PROG_CC
     FOO
     ])
     BAR

This works great if everything is in the same file.  However, it does
not help in the case where the author wants to have `aclocal' find the
definition of `BAR' from its own file, since `aclocal' requires the use
of `AC_DEFUN'.  In this case, a better fix is to recognize that if
`BAR' also uses `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
`AC_PROG_CC', which will still occur after `foobar='.  The author can
also use `AC_BEFORE' to make sure no other macro appearing before `BAR'
has triggered an unwanted expansion of `AC_PROG_CC'.

     AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
     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


File: autoconf.info,  Node: Debugging,  Prev: Expanded Before Required,  Up: FAQ

20.9 Debugging `configure' scripts
==================================

While in general, `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 `configure'.  Together with the
rather arcane error message that `m4' and `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:

   * When `autoconf' fails, common causes for error include:

        * mismatched or unbalanced parentheses or braces (*note
          Balancing Parentheses::),

        * under- or overquoted macro arguments (*note Autoconf
          Language::, *note Quoting and Parameters::, *note Quotation
          and Nested Macros::),

        * spaces between macro name and opening parenthesis (*note
          Autoconf Language::).

     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 `m4_traceon' and
     `m4_traceoff' judiciously in the code, either without a parameter
     or listing some macro names and watch `m4' expand its input
     verbosely (*note Debugging via autom4te::).

   * Sometimes `autoconf' succeeds but the generated `configure' script
     has invalid shell syntax.  You can detect this case by running
     `bash -n configure' or `sh -n configure'.  If this command fails,
     the same tips apply, as if `autoconf' had failed.

   * Debugging `configure' script execution may be done by sprinkling
     pairs of `set -x' and `set +x' into the shell script before and
     after the region that contains a bug.  Running the whole script
     with `SHELL -vx ./configure 2>&1 | tee LOG-FILE' with a decent
     SHELL may work, but produces lots of output.  Here, it can help to
     search for markers like `checking for' a particular test in the
     LOG-FILE.

   * Alternatively, you might use a shell with debugging capabilities
     like bashdb (http://bashdb.sourceforge.net/).

   * When `configure' tests produce invalid results for your system, it
     may be necessary to override them:

        * For programs, tools or libraries variables, preprocessor,
          compiler, or linker flags, it is often sufficient to override
          them at `make' run time with some care (*note Macros and
          Submakes::).  Since this normally won't cause `configure' to
          be run again with these changed settings, it may fail if the
          changed variable would have caused different test results
          from `configure', so this may work only for simple
          differences.

        * Most tests which produce their result in a substituted
          variable allow to override the test by setting the variable
          on the `configure' command line (*note Compilers and
          Options::, *note Defining Variables::, *note Particular
          Systems::).

        * Many tests store their result in a cache variable (*note
          Caching Results::).  This lets you override them either on the
          `configure' command line as above, or through a primed cache
          or site file (*note Cache Files::, *note Site Defaults::).
          The name of a cache variable is documented with a test macro
          or may be inferred from *note Cache Variable Names::; the
          precise semantics of undocumented variables are often
          internal details, subject to change.

   * Alternatively, `configure' may produce invalid results because of
     uncaught programming errors, in your package or in an upstream
     library package.  For example, when `AC_CHECK_LIB' fails to find a
     library with a specified function, always check `config.log'.  This
     will reveal the exact error that produced the failing result: the
     library linked by `AC_CHECK_LIB' probably has a fatal bug.

   Conversely, as macro author, you can make it easier for users of your
macro:

   * by minimizing dependencies between tests and between test results
     as far as possible,

   * by using `make' variables to factorize and allow override of
     settings at `make' run time,

   * by honoring the GNU Coding Standards and not overriding flags
     reserved for the user except temporarily during `configure' tests,

   * by not requiring users of your macro to use the cache variables.
     Instead, expose the result of the test via RUN-IF-TRUE and
     RUN-IF-FALSE parameters.  If the result is not a boolean, then
     provide it through documented shell variables.


File: autoconf.info,  Node: History,  Next: GNU Free Documentation License,  Prev: FAQ,  Up: Top

21 History of Autoconf
**********************

_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 _are_ wondering, then
let there be light...

* Menu:

* Genesis::                     Prehistory and naming of `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


File: autoconf.info,  Node: Genesis,  Next: Exodus,  Up: History

21.1 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 `-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
`configure' script worked well enough that the next month I adapted it
(by hand) to create similar `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 `configure' scripts to support their evolving interface:
using the file name `Makefile.in' as the templates; adding `+srcdir',
the first option (of many); and creating `config.status' files.


File: autoconf.info,  Node: Exodus,  Next: Leviticus,  Prev: Genesis,  Up: History

21.2 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
`configure' scripts, updating them all by hand became impractical.
Rich Murphey, the maintainer of the GNU graphics utilities, sent me
mail saying that the `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 `configure' scripts to the
abundance and ease of Autoconf began.

   Cygnus `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
`configure', where there is a single `configure' script that reads
pieces of `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 `configure' made from each `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 `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 `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 `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 `tvtwm', and I was interested in trying out a new language.


File: autoconf.info,  Node: Leviticus,  Next: Numbers,  Prev: Exodus,  Up: History

21.3 Leviticus
==============

Since my `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 Franc,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 `-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.


File: autoconf.info,  Node: Numbers,  Next: Deuteronomy,  Prev: Leviticus,  Up: History

21.4 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 `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.  Franc,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 `autoheader'
script to automate the creation of C header file templates, and added a
`--verbose' option to `configure'.  Noah Friedman added the
`--autoconf-dir' option and `AC_MACRODIR' environment variable.  (He
also coined the term "autoconfiscate" to mean "adapt a software package
to use Autoconf".)  Roland and Noah improved the quoting protection in
`AC_DEFINE' and fixed many bugs, especially when I got sick of dealing
with portability problems from February through June, 1993.


File: autoconf.info,  Node: Deuteronomy,  Prev: Numbers,  Up: History

21.5 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
`configure' that Autoconf had lacked, largely by adapting the relevant
parts of Cygnus `configure' with the help of david zuhn and Ken
Raeburn.  These features include support for using `config.sub',
`config.guess', `--host', and `--target'; making links to files; and
running `configure' scripts in subdirectories.  Adding these features
enabled Ken to convert GNU `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 `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 `.in' extension on the file names, which produced file
names like `config.h.in' containing two dots.  Jim Avera did an
extensive examination of the problems with quoting in `AC_DEFINE' and
`AC_SUBST'; his insights led to significant improvements.  Richard
Stallman asked that compiler output be sent to `config.log' instead of
`/dev/null', to help people debug the Emacs `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 Franc,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
Franc,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.)


File: autoconf.info,  Node: GNU Free Documentation License,  Next: Indices,  Prev: History,  Up: Top

Appendix A GNU Free Documentation License
*****************************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it
     can be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You
     accept the license if you copy, modify or distribute the work in a
     way requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.  If a section does not fit the above definition of
     Secondary then it is not allowed to be designated as Invariant.
     The Document may contain zero Invariant Sections.  If the Document
     does not identify any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup, or absence of
     markup, has been arranged to thwart or discourage subsequent
     modification by readers is not Transparent.  An image format is
     not Transparent if used for any substantial amount of text.  A
     copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML, PostScript or PDF designed for
     human modification.  Examples of transparent image formats include
     PNG, XCF and JPG.  Opaque formats include proprietary formats that
     can be read and edited only by proprietary word processors, SGML or
     XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML, PostScript or PDF
     produced by some word processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a computer-network location from
     which the general network-using public has access to download
     using public-standard network protocols a complete Transparent
     copy of the Document, free of added material.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of
          previous versions (which should, if there were any, be listed
          in the History section of the Document).  You may use the
          same title as a previous version if the original publisher of
          that version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on
          the Title Page.  If there is no section Entitled "History" in
          the Document, create one stating the title, year, authors,
          and publisher of the Document as given on its Title Page,
          then add an item describing the Modified Version as stated in
          the previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in
          the "History" section.  You may omit a network location for a
          work that was published at least four years before the
          Document itself, or if the original publisher of the version
          it refers to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the
          section all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document,
          unaltered in their text and in their titles.  Section numbers
          or the equivalent are not considered part of the section
          titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, receipt of a copy of some or all of
     the same material does not give you any rights to use it.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     `http://www.gnu.org/copyleft/'.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.  If the Document specifies that a proxy
     can decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

 11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.


ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       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''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.


File: autoconf.info,  Node: Indices,  Prev: GNU Free Documentation License,  Up: Top

Appendix B 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


File: autoconf.info,  Node: Environment Variable Index,  Next: Output Variable Index,  Up: Indices

B.1 Environment Variable Index
==============================

This is an alphabetical list of the environment variables that might
influence Autoconf checks.

 [index ]
* Menu:

* _:                                     Special Shell Variables.
                                                              (line  36)
* BIN_SH:                                Special Shell Variables.
                                                              (line  40)
* CC:                                    C Compiler.          (line  61)
* CDPATH:                                Special Shell Variables.
                                                              (line  44)
* CFLAGS <1>:                            C Compiler.          (line  61)
* CFLAGS:                                Preset Output Variables.
                                                              (line  23)
* CLICOLOR_FORCE:                        Special Shell Variables.
                                                              (line  67)
* CONFIG_COMMANDS:                       Obsolete config.status Use.
                                                              (line  11)
* CONFIG_FILES:                          Obsolete config.status Use.
                                                              (line  15)
* CONFIG_HEADERS:                        Obsolete config.status Use.
                                                              (line  20)
* CONFIG_LINKS:                          Obsolete config.status Use.
                                                              (line  25)
* CONFIG_SHELL:                          config.status Invocation.
                                                              (line 102)
* CONFIG_SITE:                           Site Defaults.       (line  10)
* CONFIG_STATUS:                         config.status Invocation.
                                                              (line 108)
* CPP:                                   C Compiler.          (line 113)
* CPPFLAGS:                              Preset Output Variables.
                                                              (line  72)
* CXX:                                   C++ Compiler.        (line   7)
* CXXCPP:                                C++ Compiler.        (line  35)
* CXXFLAGS <1>:                          C++ Compiler.        (line   7)
* CXXFLAGS:                              Preset Output Variables.
                                                              (line  94)
* CYGWIN:                                Obsolete Macros.     (line 124)
* DUALCASE:                              Special Shell Variables.
                                                              (line  74)
* ENV:                                   Special Shell Variables.
                                                              (line  84)
* ERL:                                   Erlang Compiler and Interpreter.
                                                              (line  29)
* ERLC:                                  Erlang Compiler and Interpreter.
                                                              (line  10)
* ERLCFLAGS <1>:                         Erlang Compiler and Interpreter.
                                                              (line  10)
* ERLCFLAGS:                             Preset Output Variables.
                                                              (line 120)
* F77:                                   Fortran Compiler.    (line  19)
* FC:                                    Fortran Compiler.    (line  44)
* FCFLAGS <1>:                           Fortran Compiler.    (line  44)
* FCFLAGS:                               Preset Output Variables.
                                                              (line 126)
* FFLAGS <1>:                            Fortran Compiler.    (line  19)
* FFLAGS:                                Preset Output Variables.
                                                              (line 133)
* FPATH:                                 Special Shell Variables.
                                                              (line 101)
* GOFLAGS:                               Preset Output Variables.
                                                              (line 170)
* GREP_OPTIONS:                          Special Shell Variables.
                                                              (line 108)
* IFS:                                   Special Shell Variables.
                                                              (line 116)
* LANG:                                  Special Shell Variables.
                                                              (line 160)
* LANGUAGE:                              Special Shell Variables.
                                                              (line 167)
* LC_ADDRESS:                            Special Shell Variables.
                                                              (line 177)
* LC_ALL <1>:                            Special Shell Variables.
                                                              (line 160)
* LC_ALL:                                Initialization Macros.
                                                              (line  14)
* LC_COLLATE:                            Special Shell Variables.
                                                              (line 160)
* LC_CTYPE:                              Special Shell Variables.
                                                              (line 160)
* LC_IDENTIFICATION:                     Special Shell Variables.
                                                              (line 177)
* LC_MEASUREMENT:                        Special Shell Variables.
                                                              (line 177)
* LC_MESSAGES:                           Special Shell Variables.
                                                              (line 160)
* LC_MONETARY:                           Special Shell Variables.
                                                              (line 160)
* LC_NAME:                               Special Shell Variables.
                                                              (line 177)
* LC_NUMERIC:                            Special Shell Variables.
                                                              (line 160)
* LC_PAPER:                              Special Shell Variables.
                                                              (line 177)
* LC_TELEPHONE:                          Special Shell Variables.
                                                              (line 177)
* LC_TIME:                               Special Shell Variables.
                                                              (line 160)
* LDFLAGS:                               Preset Output Variables.
                                                              (line 140)
* LIBS:                                  Preset Output Variables.
                                                              (line 154)
* LINENO <1>:                            Special Shell Variables.
                                                              (line 182)
* LINENO:                                Initialization Macros.
                                                              (line  67)
* M4:                                    autom4te Invocation. (line  10)
* MAIL:                                  Special Shell Variables.
                                                              (line  84)
* MAILPATH:                              Special Shell Variables.
                                                              (line  84)
* NULLCMD:                               Special Shell Variables.
                                                              (line 311)
* OBJC:                                  Objective C Compiler.
                                                              (line   7)
* OBJCFLAGS <1>:                         Objective C Compiler.
                                                              (line   7)
* OBJCFLAGS:                             Preset Output Variables.
                                                              (line 162)
* OBJCPP:                                Objective C Compiler.
                                                              (line  26)
* OBJCXX:                                Objective C++ Compiler.
                                                              (line   7)
* OBJCXXCPP:                             Objective C++ Compiler.
                                                              (line  27)
* OBJCXXFLAGS <1>:                       Objective C++ Compiler.
                                                              (line   7)
* OBJCXXFLAGS:                           Preset Output Variables.
                                                              (line 166)
* options:                               Special Shell Variables.
                                                              (line 318)
* PATH_SEPARATOR:                        Special Shell Variables.
                                                              (line 322)
* POSIXLY_CORRECT:                       Special Shell Variables.
                                                              (line 331)
* PS1:                                   Special Shell Variables.
                                                              (line  84)
* PS2:                                   Special Shell Variables.
                                                              (line  84)
* PS4:                                   Special Shell Variables.
                                                              (line  84)
* PWD:                                   Special Shell Variables.
                                                              (line 346)
* RANDOM:                                Special Shell Variables.
                                                              (line 355)
* SHELL:                                 Initialization Macros.
                                                              (line  14)
* SIMPLE_BACKUP_SUFFIX:                  autoupdate Invocation.
                                                              (line  16)
* status:                                Special Shell Variables.
                                                              (line 363)
* TMPDIR:                                Initialization Macros.
                                                              (line  77)
* WARNINGS <1>:                          autom4te Invocation. (line  58)
* WARNINGS <2>:                          autoheader Invocation.
                                                              (line  83)
* WARNINGS <3>:                          autoreconf Invocation.
                                                              (line  97)
* WARNINGS:                              autoconf Invocation. (line  62)
* XMKMF:                                 System Services.     (line  10)
* YACC:                                  Particular Programs. (line 200)
* YFLAGS:                                Particular Programs. (line 200)


File: autoconf.info,  Node: Output Variable Index,  Next: Preprocessor Symbol Index,  Prev: Environment Variable Index,  Up: Indices

B.2 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.
*Note Setting Output Variables::, for more information on how this is
done.

 [index ]
* Menu:

* abs_builddir:                          Preset Output Variables.
                                                              (line 177)
* abs_srcdir:                            Preset Output Variables.
                                                              (line 199)
* abs_top_builddir:                      Preset Output Variables.
                                                              (line 192)
* abs_top_srcdir:                        Preset Output Variables.
                                                              (line 206)
* ac_empty:                              Fortran Compiler.    (line 465)
* ALLOCA:                                Particular Functions.
                                                              (line  10)
* AWK:                                   Particular Programs. (line  10)
* bindir:                                Installation Directory Variables.
                                                              (line  15)
* build:                                 Canonicalizing.      (line  26)
* build_alias:                           Canonicalizing.      (line   9)
* build_cpu:                             Canonicalizing.      (line  26)
* build_os:                              Canonicalizing.      (line  26)
* build_vendor:                          Canonicalizing.      (line  26)
* builddir:                              Preset Output Variables.
                                                              (line 174)
* CC <1>:                                System Services.     (line  49)
* CC:                                    C Compiler.          (line  61)
* CFLAGS <1>:                            C Compiler.          (line  61)
* CFLAGS:                                Preset Output Variables.
                                                              (line  23)
* configure_input:                       Preset Output Variables.
                                                              (line  58)
* CPP:                                   C Compiler.          (line 113)
* CPPFLAGS:                              Preset Output Variables.
                                                              (line  72)
* cross_compiling:                       Runtime.             (line  71)
* CXX:                                   C++ Compiler.        (line   7)
* CXXCPP:                                C++ Compiler.        (line  35)
* CXXFLAGS <1>:                          C++ Compiler.        (line   7)
* CXXFLAGS:                              Preset Output Variables.
                                                              (line  94)
* datadir:                               Installation Directory Variables.
                                                              (line  18)
* datarootdir:                           Installation Directory Variables.
                                                              (line  22)
* DEFS:                                  Preset Output Variables.
                                                              (line  98)
* docdir:                                Installation Directory Variables.
                                                              (line  26)
* dvidir:                                Installation Directory Variables.
                                                              (line  30)
* ECHO_C:                                Preset Output Variables.
                                                              (line 108)
* ECHO_N:                                Preset Output Variables.
                                                              (line 108)
* ECHO_T:                                Preset Output Variables.
                                                              (line 108)
* EGREP:                                 Particular Programs. (line  29)
* ERL <1>:                               Running the Compiler.
                                                              (line  30)
* ERL <2>:                               Language Choice.     (line  40)
* ERL:                                   Erlang Compiler and Interpreter.
                                                              (line  29)
* ERLANG_ERTS_VER:                       Erlang Libraries.    (line  12)
* ERLANG_INSTALL_LIB_DIR <1>:            Erlang Libraries.    (line  86)
* ERLANG_INSTALL_LIB_DIR:                Installation Directory Variables.
                                                              (line 201)
* ERLANG_INSTALL_LIB_DIR_LIBRARY <1>:    Erlang Libraries.    (line  93)
* ERLANG_INSTALL_LIB_DIR_LIBRARY:        Installation Directory Variables.
                                                              (line 206)
* ERLANG_LIB_DIR:                        Erlang Libraries.    (line  28)
* ERLANG_LIB_DIR_LIBRARY:                Erlang Libraries.    (line  36)
* ERLANG_LIB_VER_LIBRARY:                Erlang Libraries.    (line  36)
* ERLANG_ROOT_DIR:                       Erlang Libraries.    (line  22)
* ERLC <1>:                              Language Choice.     (line  40)
* ERLC:                                  Erlang Compiler and Interpreter.
                                                              (line  10)
* ERLCFLAGS <1>:                         Language Choice.     (line  40)
* ERLCFLAGS <2>:                         Erlang Compiler and Interpreter.
                                                              (line  10)
* ERLCFLAGS:                             Preset Output Variables.
                                                              (line 120)
* exec_prefix:                           Installation Directory Variables.
                                                              (line  33)
* EXEEXT <1>:                            Obsolete Macros.     (line 178)
* EXEEXT:                                Compilers and Preprocessors.
                                                              (line   6)
* F77:                                   Fortran Compiler.    (line  19)
* FC:                                    Fortran Compiler.    (line  44)
* FC_MODEXT:                             Fortran Compiler.    (line 438)
* FC_MODINC:                             Fortran Compiler.    (line 465)
* FC_MODOUT:                             Fortran Compiler.    (line 501)
* FCFLAGS <1>:                           Fortran Compiler.    (line  44)
* FCFLAGS:                               Preset Output Variables.
                                                              (line 126)
* FCLIBS:                                Fortran Compiler.    (line  92)
* FFLAGS <1>:                            Fortran Compiler.    (line  19)
* FFLAGS:                                Preset Output Variables.
                                                              (line 133)
* FGREP:                                 Particular Programs. (line  36)
* FLIBS:                                 Fortran Compiler.    (line  92)
* GETGROUPS_LIBS:                        Particular Functions.
                                                              (line 155)
* GETLOADAVG_LIBS:                       Particular Functions.
                                                              (line 161)
* GOFLAGS:                               Preset Output Variables.
                                                              (line 170)
* GREP:                                  Particular Programs. (line  20)
* host:                                  Canonicalizing.      (line  34)
* host_alias:                            Canonicalizing.      (line   9)
* host_cpu:                              Canonicalizing.      (line  34)
* host_os:                               Canonicalizing.      (line  34)
* host_vendor:                           Canonicalizing.      (line  34)
* htmldir:                               Installation Directory Variables.
                                                              (line  40)
* includedir:                            Installation Directory Variables.
                                                              (line  43)
* infodir:                               Installation Directory Variables.
                                                              (line  46)
* INSTALL:                               Particular Programs. (line  43)
* INSTALL_DATA:                          Particular Programs. (line  43)
* INSTALL_PROGRAM:                       Particular Programs. (line  43)
* INSTALL_SCRIPT:                        Particular Programs. (line  43)
* KMEM_GROUP:                            Particular Functions.
                                                              (line 161)
* LDFLAGS:                               Preset Output Variables.
                                                              (line 140)
* LEX:                                   Particular Programs. (line 114)
* LEX_OUTPUT_ROOT:                       Particular Programs. (line 114)
* LEXLIB:                                Particular Programs. (line 114)
* libdir:                                Installation Directory Variables.
                                                              (line  49)
* libexecdir:                            Installation Directory Variables.
                                                              (line  52)
* LIBOBJDIR:                             AC_LIBOBJ vs LIBOBJS.
                                                              (line  35)
* LIBOBJS <1>:                           Particular Structures.
                                                              (line  26)
* LIBOBJS <2>:                           Generic Functions.   (line  56)
* LIBOBJS:                               Particular Functions.
                                                              (line 161)
* LIBS <1>:                              Obsolete Macros.     (line 295)
* LIBS:                                  Preset Output Variables.
                                                              (line 154)
* LN_S:                                  Particular Programs. (line 168)
* localedir:                             Installation Directory Variables.
                                                              (line  55)
* localstatedir:                         Installation Directory Variables.
                                                              (line  60)
* mandir:                                Installation Directory Variables.
                                                              (line  63)
* MKDIR_P:                               Particular Programs. (line  80)
* NEED_SETGID:                           Particular Functions.
                                                              (line 161)
* OBJC:                                  Objective C Compiler.
                                                              (line   7)
* OBJCFLAGS <1>:                         Objective C Compiler.
                                                              (line   7)
* OBJCFLAGS:                             Preset Output Variables.
                                                              (line 162)
* OBJCPP:                                Objective C Compiler.
                                                              (line  26)
* OBJCXX:                                Objective C++ Compiler.
                                                              (line   7)
* OBJCXXCPP:                             Objective C++ Compiler.
                                                              (line  27)
* OBJCXXFLAGS <1>:                       Objective C++ Compiler.
                                                              (line   7)
* OBJCXXFLAGS:                           Preset Output Variables.
                                                              (line 166)
* OBJEXT <1>:                            Obsolete Macros.     (line 384)
* OBJEXT:                                Compilers and Preprocessors.
                                                              (line  11)
* oldincludedir:                         Installation Directory Variables.
                                                              (line  66)
* OPENMP_CFLAGS:                         Generic Compiler Characteristics.
                                                              (line  64)
* OPENMP_CXXFLAGS:                       Generic Compiler Characteristics.
                                                              (line  64)
* OPENMP_FCFLAGS:                        Generic Compiler Characteristics.
                                                              (line  64)
* OPENMP_FFLAGS:                         Generic Compiler Characteristics.
                                                              (line  64)
* PACKAGE_BUGREPORT:                     Initializing configure.
                                                              (line  57)
* PACKAGE_NAME:                          Initializing configure.
                                                              (line  45)
* PACKAGE_STRING:                        Initializing configure.
                                                              (line  54)
* PACKAGE_TARNAME:                       Initializing configure.
                                                              (line  48)
* PACKAGE_URL:                           Initializing configure.
                                                              (line  61)
* PACKAGE_VERSION:                       Initializing configure.
                                                              (line  51)
* pdfdir:                                Installation Directory Variables.
                                                              (line  69)
* POW_LIB:                               Particular Functions.
                                                              (line 408)
* prefix:                                Installation Directory Variables.
                                                              (line  72)
* program_transform_name:                Transforming Names.  (line  11)
* psdir:                                 Installation Directory Variables.
                                                              (line  77)
* RANLIB:                                Particular Programs. (line 187)
* sbindir:                               Installation Directory Variables.
                                                              (line  80)
* SED:                                   Particular Programs. (line 191)
* SET_MAKE:                              Output.              (line  45)
* sharedstatedir:                        Installation Directory Variables.
                                                              (line  84)
* srcdir:                                Preset Output Variables.
                                                              (line 195)
* subdirs:                               Subdirectories.      (line  12)
* sysconfdir:                            Installation Directory Variables.
                                                              (line  88)
* target:                                Canonicalizing.      (line  41)
* target_alias:                          Canonicalizing.      (line   9)
* target_cpu:                            Canonicalizing.      (line  41)
* target_os:                             Canonicalizing.      (line  41)
* target_vendor:                         Canonicalizing.      (line  41)
* tmp:                                   Initialization Macros.
                                                              (line  77)
* top_build_prefix:                      Preset Output Variables.
                                                              (line 184)
* top_builddir:                          Preset Output Variables.
                                                              (line 180)
* top_srcdir:                            Preset Output Variables.
                                                              (line 202)
* X_CFLAGS:                              System Services.     (line  30)
* X_EXTRA_LIBS:                          System Services.     (line  30)
* X_LIBS:                                System Services.     (line  30)
* X_PRE_LIBS:                            System Services.     (line  30)
* YACC:                                  Particular Programs. (line 200)


File: autoconf.info,  Node: Preprocessor Symbol Index,  Next: Cache Variable Index,  Prev: Output Variable Index,  Up: Indices

B.3 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 `#if' or `#ifdef' directives.

 [index ]
* Menu:

* __CHAR_UNSIGNED__:                     C Compiler.          (line 291)
* __EXTENSIONS__:                        Posix Variants.      (line  10)
* __PROTOTYPES:                          C Compiler.          (line 351)
* _ALL_SOURCE <1>:                       Obsolete Macros.     (line  20)
* _ALL_SOURCE:                           Posix Variants.      (line  10)
* _FILE_OFFSET_BITS:                     System Services.     (line  49)
* _GNU_SOURCE <1>:                       Obsolete Macros.     (line 234)
* _GNU_SOURCE:                           Posix Variants.      (line  10)
* _LARGE_FILES:                          System Services.     (line  49)
* _LARGEFILE_SOURCE:                     Particular Functions.
                                                              (line 147)
* _MINIX <1>:                            Obsolete Macros.     (line 371)
* _MINIX:                                Posix Variants.      (line  10)
* _OPENMP:                               Generic Compiler Characteristics.
                                                              (line  64)
* _POSIX_1_SOURCE <1>:                   Obsolete Macros.     (line 371)
* _POSIX_1_SOURCE:                       Posix Variants.      (line  10)
* _POSIX_PTHREAD_SEMANTICS:              Posix Variants.      (line  10)
* _POSIX_SOURCE <1>:                     Obsolete Macros.     (line 371)
* _POSIX_SOURCE:                         Posix Variants.      (line  10)
* _POSIX_VERSION:                        Particular Headers.  (line 228)
* _TANDEM_SOURCE:                        Posix Variants.      (line  10)
* ALIGNOF_TYPE:                          Generic Compiler Characteristics.
                                                              (line  30)
* C_ALLOCA:                              Particular Functions.
                                                              (line  10)
* C_GETLOADAVG:                          Particular Functions.
                                                              (line 161)
* CLOSEDIR_VOID:                         Particular Functions.
                                                              (line  69)
* const:                                 C Compiler.          (line 217)
* CXX_NO_MINUS_C_MINUS_O:                C++ Compiler.        (line  48)
* DGUX:                                  Particular Functions.
                                                              (line 161)
* DIRENT:                                Obsolete Macros.     (line 158)
* F77_DUMMY_MAIN:                        Fortran Compiler.    (line 130)
* F77_FUNC:                              Fortran Compiler.    (line 202)
* F77_FUNC_:                             Fortran Compiler.    (line 202)
* F77_MAIN:                              Fortran Compiler.    (line 176)
* F77_NO_MINUS_C_MINUS_O:                Fortran Compiler.    (line  76)
* FC_DUMMY_MAIN:                         Fortran Compiler.    (line 130)
* FC_FUNC:                               Fortran Compiler.    (line 202)
* FC_FUNC_:                              Fortran Compiler.    (line 202)
* FC_MAIN:                               Fortran Compiler.    (line 176)
* FC_NO_MINUS_C_MINUS_O:                 Fortran Compiler.    (line  76)
* FLEXIBLE_ARRAY_MEMBER:                 C Compiler.          (line 315)
* GETGROUPS_T:                           Particular Types.    (line  14)
* GETLOADAVG_PRIVILEGED:                 Particular Functions.
                                                              (line 161)
* GETPGRP_VOID:                          Particular Functions.
                                                              (line 205)
* gid_t:                                 Particular Types.    (line 126)
* GWINSZ_IN_SYS_IOCTL:                   Particular Headers.  (line 270)
* HAVE__BOOL:                            Particular Headers.  (line  10)
* HAVE_AGGREGATE_MEMBER:                 Generic Structures.  (line  29)
* HAVE_ALLOCA_H:                         Particular Functions.
                                                              (line  10)
* HAVE_C_BACKSLASH_A:                    C Compiler.          (line 176)
* HAVE_C_VARARRAYS:                      C Compiler.          (line 339)
* HAVE_CHOWN:                            Particular Functions.
                                                              (line  63)
* HAVE_CONFIG_H:                         Configuration Headers.
                                                              (line  33)
* HAVE_DECL_STRERROR_R:                  Particular Functions.
                                                              (line 388)
* HAVE_DECL_SYMBOL:                      Generic Declarations.
                                                              (line  34)
* HAVE_DECL_TZNAME:                      Particular Structures.
                                                              (line  43)
* HAVE_DIRENT_H:                         Particular Headers.  (line  25)
* HAVE_DOPRNT:                           Particular Functions.
                                                              (line 443)
* HAVE_FSEEKO:                           Particular Functions.
                                                              (line 147)
* HAVE_FUNCTION:                         Generic Functions.   (line  27)
* HAVE_GETGROUPS:                        Particular Functions.
                                                              (line 155)
* HAVE_GETMNTENT:                        Particular Functions.
                                                              (line 195)
* HAVE_HEADER:                           Generic Headers.     (line  46)
* HAVE_INT16_T:                          Particular Types.    (line  40)
* HAVE_INT32_T:                          Particular Types.    (line  43)
* HAVE_INT64_T:                          Particular Types.    (line  46)
* HAVE_INT8_T:                           Particular Types.    (line  21)
* HAVE_INTMAX_T:                         Particular Types.    (line  49)
* HAVE_INTPTR_T:                         Particular Types.    (line  54)
* HAVE_LONG_DOUBLE <1>:                  Obsolete Macros.     (line  33)
* HAVE_LONG_DOUBLE:                      Particular Types.    (line  59)
* HAVE_LONG_DOUBLE_WIDER:                Particular Types.    (line  70)
* HAVE_LONG_FILE_NAMES:                  System Services.     (line  71)
* HAVE_LONG_LONG_INT:                    Particular Types.    (line  78)
* HAVE_LSTAT_EMPTY_STRING_BUG:           Particular Functions.
                                                              (line 363)
* HAVE_MALLOC:                           Particular Functions.
                                                              (line 247)
* HAVE_MBRTOWC:                          Particular Functions.
                                                              (line 279)
* HAVE_MMAP:                             Particular Functions.
                                                              (line 311)
* HAVE_NDIR_H:                           Particular Headers.  (line  25)
* HAVE_NLIST_H:                          Particular Functions.
                                                              (line 161)
* HAVE_OBSTACK:                          Particular Functions.
                                                              (line 319)
* HAVE_REALLOC:                          Particular Functions.
                                                              (line 326)
* HAVE_RESOLV_H:                         Particular Headers.  (line  73)
* HAVE_RESTARTABLE_SYSCALLS:             Obsolete Macros.     (line 548)
* HAVE_ST_BLKSIZE:                       Obsolete Macros.     (line 521)
* HAVE_ST_BLOCKS:                        Particular Structures.
                                                              (line  26)
* HAVE_ST_RDEV:                          Obsolete Macros.     (line 530)
* HAVE_STAT_EMPTY_STRING_BUG:            Particular Functions.
                                                              (line 363)
* HAVE_STDBOOL_H:                        Particular Headers.  (line 101)
* HAVE_STRCOLL:                          Particular Functions.
                                                              (line 379)
* HAVE_STRERROR_R:                       Particular Functions.
                                                              (line 388)
* HAVE_STRFTIME:                         Particular Functions.
                                                              (line 401)
* HAVE_STRINGIZE:                        C Compiler.          (line 305)
* HAVE_STRNLEN:                          Particular Functions.
                                                              (line 426)
* HAVE_STRTOLD:                          Particular Functions.
                                                              (line 420)
* HAVE_STRUCT_DIRENT_D_INO:              Particular Structures.
                                                              (line   9)
* HAVE_STRUCT_DIRENT_D_TYPE:             Particular Structures.
                                                              (line  21)
* HAVE_STRUCT_STAT_ST_BLKSIZE:           Obsolete Macros.     (line 521)
* HAVE_STRUCT_STAT_ST_BLOCKS:            Particular Structures.
                                                              (line  26)
* HAVE_STRUCT_STAT_ST_RDEV:              Obsolete Macros.     (line 530)
* HAVE_STRUCT_TM_TM_ZONE:                Particular Structures.
                                                              (line  43)
* HAVE_SYS_DIR_H:                        Particular Headers.  (line  25)
* HAVE_SYS_NDIR_H:                       Particular Headers.  (line  25)
* HAVE_SYS_WAIT_H:                       Particular Headers.  (line 204)
* HAVE_TM_ZONE:                          Particular Structures.
                                                              (line  43)
* HAVE_TYPE:                             Generic Types.       (line  28)
* HAVE_TYPEOF:                           C Compiler.          (line 345)
* HAVE_TZNAME:                           Particular Structures.
                                                              (line  43)
* HAVE_UINT16_T:                         Particular Types.    (line 138)
* HAVE_UINT32_T:                         Particular Types.    (line 141)
* HAVE_UINT64_T:                         Particular Types.    (line 144)
* HAVE_UINT8_T:                          Particular Types.    (line 132)
* HAVE_UINTMAX_T:                        Particular Types.    (line 147)
* HAVE_UINTPTR_T:                        Particular Types.    (line 152)
* HAVE_UNSIGNED_LONG_LONG_INT:           Particular Types.    (line 157)
* HAVE_UTIME_NULL:                       Particular Functions.
                                                              (line 433)
* HAVE_VFORK_H:                          Particular Functions.
                                                              (line 120)
* HAVE_VPRINTF:                          Particular Functions.
                                                              (line 443)
* HAVE_WAIT3:                            Obsolete Macros.     (line 216)
* HAVE_WORKING_FORK:                     Particular Functions.
                                                              (line 120)
* HAVE_WORKING_VFORK:                    Particular Functions.
                                                              (line 120)
* inline:                                C Compiler.          (line 286)
* int16_t:                               Particular Types.    (line  40)
* int32_t:                               Particular Types.    (line  43)
* int64_t:                               Particular Types.    (line  46)
* int8_t:                                Particular Types.    (line  21)
* INT_16_BITS:                           Obsolete Macros.     (line 275)
* intmax_t:                              Particular Types.    (line  49)
* intptr_t:                              Particular Types.    (line  54)
* LONG_64_BITS:                          Obsolete Macros.     (line 337)
* LSTAT_FOLLOWS_SLASHED_SYMLINK:         Particular Functions.
                                                              (line 228)
* MAJOR_IN_MKDEV:                        Particular Headers.  (line  68)
* MAJOR_IN_SYSMACROS:                    Particular Headers.  (line  68)
* malloc:                                Particular Functions.
                                                              (line 247)
* mbstate_t:                             Particular Types.    (line  88)
* mode_t:                                Particular Types.    (line  96)
* NDEBUG:                                Particular Headers.  (line  20)
* NDIR:                                  Obsolete Macros.     (line 158)
* NEED_MEMORY_H:                         Obsolete Macros.     (line 358)
* NEED_SETGID:                           Particular Functions.
                                                              (line 161)
* NLIST_NAME_UNION:                      Particular Functions.
                                                              (line 161)
* NO_MINUS_C_MINUS_O:                    C Compiler.          (line 102)
* off_t:                                 Particular Types.    (line 102)
* PACKAGE_BUGREPORT:                     Initializing configure.
                                                              (line  57)
* PACKAGE_NAME:                          Initializing configure.
                                                              (line  45)
* PACKAGE_STRING:                        Initializing configure.
                                                              (line  54)
* PACKAGE_TARNAME:                       Initializing configure.
                                                              (line  48)
* PACKAGE_URL:                           Initializing configure.
                                                              (line  61)
* PACKAGE_VERSION:                       Initializing configure.
                                                              (line  51)
* PARAMS:                                C Compiler.          (line 351)
* pid_t:                                 Particular Types.    (line 108)
* PROTOTYPES:                            C Compiler.          (line 351)
* realloc:                               Particular Functions.
                                                              (line 326)
* restrict:                              C Compiler.          (line 247)
* RETSIGTYPE:                            Obsolete Macros.     (line 662)
* SELECT_TYPE_ARG1:                      Particular Functions.
                                                              (line 337)
* SELECT_TYPE_ARG234:                    Particular Functions.
                                                              (line 337)
* SELECT_TYPE_ARG5:                      Particular Functions.
                                                              (line 337)
* SETPGRP_VOID:                          Particular Functions.
                                                              (line 348)
* SETVBUF_REVERSED:                      Obsolete Macros.     (line 208)
* size_t:                                Particular Types.    (line 114)
* SIZEOF_TYPE-OR-EXPR:                   Generic Compiler Characteristics.
                                                              (line   8)
* ssize_t:                               Particular Types.    (line 120)
* STAT_MACROS_BROKEN:                    Particular Headers.  (line  92)
* STDC_HEADERS:                          Particular Headers.  (line 135)
* STRERROR_R_CHAR_P:                     Particular Functions.
                                                              (line 388)
* SVR4:                                  Particular Functions.
                                                              (line 161)
* SYS_SIGLIST_DECLARED:                  Obsolete Macros.     (line 141)
* SYSDIR:                                Obsolete Macros.     (line 158)
* SYSNDIR:                               Obsolete Macros.     (line 158)
* TIME_WITH_SYS_TIME:                    Particular Headers.  (line 244)
* TM_IN_SYS_TIME:                        Particular Structures.
                                                              (line  35)
* typeof:                                C Compiler.          (line 345)
* uid_t:                                 Particular Types.    (line 126)
* uint16_t:                              Particular Types.    (line 138)
* uint32_t:                              Particular Types.    (line 141)
* uint64_t:                              Particular Types.    (line 144)
* uint8_t:                               Particular Types.    (line 132)
* uintmax_t:                             Particular Types.    (line 147)
* uintptr_t:                             Particular Types.    (line 152)
* UMAX:                                  Particular Functions.
                                                              (line 161)
* UMAX4_3:                               Particular Functions.
                                                              (line 161)
* USG:                                   Obsolete Macros.     (line 685)
* VARIABLE:                              Defining Symbols.    (line  32)
* vfork:                                 Particular Functions.
                                                              (line 120)
* volatile:                              C Compiler.          (line 265)
* WORDS_BIGENDIAN:                       C Compiler.          (line 184)
* X_DISPLAY_MISSING:                     System Services.     (line  30)
* YYTEXT_POINTER:                        Particular Programs. (line 114)


File: autoconf.info,  Node: Cache Variable Index,  Next: Autoconf Macro Index,  Prev: Preprocessor Symbol Index,  Up: Indices

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

 [index ]
* Menu:

* ac_cv_alignof_TYPE-OR-EXPR:            Generic Compiler Characteristics.
                                                              (line  30)
* ac_cv_c_const:                         C Compiler.          (line 217)
* ac_cv_c_int16_t:                       Particular Types.    (line  40)
* ac_cv_c_int32_t:                       Particular Types.    (line  43)
* ac_cv_c_int64_t:                       Particular Types.    (line  46)
* ac_cv_c_int8_t:                        Particular Types.    (line  21)
* ac_cv_c_restrict:                      C Compiler.          (line 247)
* ac_cv_c_uint16_t:                      Particular Types.    (line 138)
* ac_cv_c_uint32_t:                      Particular Types.    (line 141)
* ac_cv_c_uint64_t:                      Particular Types.    (line 144)
* ac_cv_c_uint8_t:                       Particular Types.    (line 132)
* ac_cv_f77_compiler_gnu:                Fortran Compiler.    (line  19)
* ac_cv_f77_dummy_main:                  Fortran Compiler.    (line 130)
* ac_cv_f77_implicit_none:               Fortran Compiler.    (line 427)
* ac_cv_f77_libs:                        Fortran Compiler.    (line  92)
* ac_cv_f77_main:                        Fortran Compiler.    (line 176)
* ac_cv_f77_mangling:                    Fortran Compiler.    (line 202)
* ac_cv_fc_check_bounds:                 Fortran Compiler.    (line 413)
* ac_cv_fc_compiler_gnu:                 Fortran Compiler.    (line  44)
* ac_cv_fc_dummy_main:                   Fortran Compiler.    (line 130)
* ac_cv_fc_fixedform:                    Fortran Compiler.    (line 375)
* ac_cv_fc_freeform:                     Fortran Compiler.    (line 351)
* ac_cv_fc_implicit_none:                Fortran Compiler.    (line 427)
* ac_cv_fc_libs:                         Fortran Compiler.    (line  92)
* ac_cv_fc_line_length:                  Fortran Compiler.    (line 396)
* ac_cv_fc_main:                         Fortran Compiler.    (line 176)
* ac_cv_fc_mangling:                     Fortran Compiler.    (line 202)
* ac_cv_fc_module_ext:                   Fortran Compiler.    (line 438)
* ac_cv_fc_module_flag:                  Fortran Compiler.    (line 465)
* ac_cv_fc_module_output_flag:           Fortran Compiler.    (line 501)
* ac_cv_fc_pp_define:                    Fortran Compiler.    (line 336)
* ac_cv_fc_pp_srcext_EXT:                Fortran Compiler.    (line 279)
* ac_cv_fc_srcext_EXT:                   Fortran Compiler.    (line 279)
* ac_cv_file_FILE:                       Files.               (line  13)
* ac_cv_func_chown_works:                Particular Functions.
                                                              (line  63)
* ac_cv_func_closedir_void:              Particular Functions.
                                                              (line  69)
* ac_cv_func_fnmatch_gnu:                Particular Functions.
                                                              (line 109)
* ac_cv_func_fnmatch_works:              Particular Functions.
                                                              (line  94)
* ac_cv_func_FUNCTION:                   Generic Functions.   (line  15)
* ac_cv_func_getgroups_works:            Particular Functions.
                                                              (line 155)
* ac_cv_func_getpgrp_void:               Particular Functions.
                                                              (line 205)
* ac_cv_func_lstat_dereferences_slashed_symlink: Particular Functions.
                                                              (line 228)
* ac_cv_func_lstat_empty_string_bug:     Particular Functions.
                                                              (line 363)
* ac_cv_func_malloc_0_nonnull:           Particular Functions.
                                                              (line 247)
* ac_cv_func_mbrtowc:                    Particular Functions.
                                                              (line 279)
* ac_cv_func_memcmp_working:             Particular Functions.
                                                              (line 286)
* ac_cv_func_mmap_fixed_mapped:          Particular Functions.
                                                              (line 311)
* ac_cv_func_obstack:                    Particular Functions.
                                                              (line 319)
* ac_cv_func_pow:                        Particular Functions.
                                                              (line 408)
* ac_cv_func_realloc_0_nonnull:          Particular Functions.
                                                              (line 326)
* ac_cv_func_setpgrp_void:               Particular Functions.
                                                              (line 348)
* ac_cv_func_stat_empty_string_bug:      Particular Functions.
                                                              (line 363)
* ac_cv_func_strcoll_works:              Particular Functions.
                                                              (line 379)
* ac_cv_func_strerror_r_char_p:          Particular Functions.
                                                              (line 388)
* ac_cv_func_strnlen_working:            Particular Functions.
                                                              (line 426)
* ac_cv_func_strtod:                     Particular Functions.
                                                              (line 408)
* ac_cv_func_strtold:                    Particular Functions.
                                                              (line 420)
* ac_cv_func_utime_null:                 Particular Functions.
                                                              (line 433)
* ac_cv_func_working_mktime:             Particular Functions.
                                                              (line 299)
* ac_cv_have_decl_SYMBOL:                Generic Declarations.
                                                              (line  11)
* ac_cv_header_HEADER-FILE:              Generic Headers.     (line  13)
* ac_cv_header_stdbool_h:                Particular Headers.  (line  10)
* ac_cv_header_stdc:                     Particular Headers.  (line 135)
* ac_cv_header_sys_wait_h:               Particular Headers.  (line 204)
* ac_cv_header_time:                     Particular Headers.  (line 244)
* ac_cv_lib_error_at_line:               Particular Functions.
                                                              (line  84)
* ac_cv_lib_LIBRARY_FUNCTION:            Libraries.           (line  11)
* ac_cv_member_AGGREGATE_MEMBER:         Generic Structures.  (line  11)
* ac_cv_member_struct_stat_st_blocks:    Particular Structures.
                                                              (line  26)
* ac_cv_path_install:                    Particular Programs. (line  43)
* ac_cv_path_mkdir:                      Particular Programs. (line  80)
* ac_cv_path_SED:                        Particular Programs. (line 191)
* ac_cv_path_VARIABLE:                   Generic Programs.    (line 108)
* ac_cv_prog_AWK:                        Particular Programs. (line  10)
* ac_cv_prog_c_openmp:                   Generic Compiler Characteristics.
                                                              (line  64)
* ac_cv_prog_cc_c89:                     C Compiler.          (line  61)
* ac_cv_prog_cc_c99:                     C Compiler.          (line 161)
* ac_cv_prog_cc_COMPILER_c_o:            C Compiler.          (line 102)
* ac_cv_prog_cc_stdc:                    C Compiler.          (line 137)
* ac_cv_prog_cxx_openmp:                 Generic Compiler Characteristics.
                                                              (line  64)
* ac_cv_prog_EGREP:                      Particular Programs. (line  29)
* ac_cv_prog_f77_c_o:                    Fortran Compiler.    (line  76)
* ac_cv_prog_f77_g:                      Fortran Compiler.    (line  19)
* ac_cv_prog_f77_openmp:                 Generic Compiler Characteristics.
                                                              (line  64)
* ac_cv_prog_f77_v:                      Fortran Compiler.    (line  92)
* ac_cv_prog_fc_c_o:                     Fortran Compiler.    (line  76)
* ac_cv_prog_fc_g:                       Fortran Compiler.    (line  44)
* ac_cv_prog_fc_openmp:                  Generic Compiler Characteristics.
                                                              (line  64)
* ac_cv_prog_fc_v:                       Fortran Compiler.    (line  92)
* ac_cv_prog_FGREP:                      Particular Programs. (line  36)
* ac_cv_prog_GREP:                       Particular Programs. (line  20)
* ac_cv_prog_LEX:                        Particular Programs. (line 114)
* ac_cv_prog_VARIABLE:                   Generic Programs.    (line  24)
* ac_cv_prog_YACC:                       Particular Programs. (line 200)
* ac_cv_search_FUNCTION:                 Libraries.           (line  52)
* ac_cv_search_getmntent:                Particular Functions.
                                                              (line 195)
* ac_cv_sizeof_TYPE-OR-EXPR:             Generic Compiler Characteristics.
                                                              (line   8)
* ac_cv_sys_posix_termios:               System Services.     (line  75)
* ac_cv_type_getgroups:                  Particular Types.    (line  14)
* ac_cv_type_long_double:                Particular Types.    (line  59)
* ac_cv_type_long_double_wider:          Particular Types.    (line  70)
* ac_cv_type_long_long_int:              Particular Types.    (line  78)
* ac_cv_type_mbstate_t:                  Particular Types.    (line  88)
* ac_cv_type_mode_t:                     Particular Types.    (line  96)
* ac_cv_type_off_t:                      Particular Types.    (line 102)
* ac_cv_type_pid_t:                      Particular Types.    (line 108)
* ac_cv_type_size_t:                     Particular Types.    (line 114)
* ac_cv_type_ssize_t:                    Particular Types.    (line 120)
* ac_cv_type_TYPE:                       Generic Types.       (line  11)
* ac_cv_type_uid_t:                      Particular Types.    (line 126)
* ac_cv_type_unsigned_long_long_int:     Particular Types.    (line 157)


File: autoconf.info,  Node: Autoconf Macro Index,  Next: M4 Macro Index,  Prev: Cache Variable Index,  Up: Indices

B.5 Autoconf Macro Index
========================

This is an alphabetical list of the Autoconf macros.

 [index ]
* Menu:

* AC_ACT_IFELSE:                         AC_ACT_IFELSE vs AC_TRY_ACT.
                                                              (line   6)
* AC_AIX:                                Obsolete Macros.     (line  20)
* AC_ALLOCA:                             Obsolete Macros.     (line  24)
* AC_ARG_ARRAY:                          Obsolete Macros.     (line  27)
* AC_ARG_ENABLE:                         Package Options.     (line  35)
* AC_ARG_PROGRAM:                        Transforming Names.  (line  11)
* AC_ARG_VAR:                            Setting Output Variables.
                                                              (line  79)
* AC_ARG_WITH:                           External Software.   (line  36)
* AC_AUTOCONF_VERSION:                   Versioning.          (line  21)
* AC_BEFORE:                             Suggested Ordering.  (line  28)
* AC_C_BACKSLASH_A:                      C Compiler.          (line 176)
* AC_C_BIGENDIAN:                        C Compiler.          (line 184)
* AC_C_CHAR_UNSIGNED:                    C Compiler.          (line 291)
* AC_C_CONST:                            C Compiler.          (line 217)
* AC_C_CROSS:                            Obsolete Macros.     (line  30)
* AC_C_FLEXIBLE_ARRAY_MEMBER:            C Compiler.          (line 315)
* AC_C_INLINE:                           C Compiler.          (line 286)
* AC_C_LONG_DOUBLE:                      Obsolete Macros.     (line  33)
* AC_C_PROTOTYPES:                       C Compiler.          (line 351)
* AC_C_RESTRICT:                         C Compiler.          (line 247)
* AC_C_STRINGIZE:                        C Compiler.          (line 305)
* AC_C_TYPEOF:                           C Compiler.          (line 345)
* AC_C_VARARRAYS:                        C Compiler.          (line 339)
* AC_C_VOLATILE:                         C Compiler.          (line 265)
* AC_CACHE_CHECK:                        Caching Results.     (line  30)
* AC_CACHE_LOAD:                         Cache Checkpointing. (line  13)
* AC_CACHE_SAVE:                         Cache Checkpointing. (line  17)
* AC_CACHE_VAL:                          Caching Results.     (line  16)
* AC_CANONICAL_BUILD:                    Canonicalizing.      (line  26)
* AC_CANONICAL_HOST:                     Canonicalizing.      (line  34)
* AC_CANONICAL_SYSTEM:                   Obsolete Macros.     (line  41)
* AC_CANONICAL_TARGET:                   Canonicalizing.      (line  41)
* AC_CHAR_UNSIGNED:                      Obsolete Macros.     (line  51)
* AC_CHECK_ALIGNOF:                      Generic Compiler Characteristics.
                                                              (line  30)
* AC_CHECK_DECL:                         Generic Declarations.
                                                              (line  11)
* AC_CHECK_DECLS:                        Generic Declarations.
                                                              (line  34)
* AC_CHECK_DECLS_ONCE:                   Generic Declarations.
                                                              (line  79)
* AC_CHECK_FILE:                         Files.               (line  13)
* AC_CHECK_FILES:                        Files.               (line  21)
* AC_CHECK_FUNC:                         Generic Functions.   (line  15)
* AC_CHECK_FUNCS:                        Generic Functions.   (line  27)
* AC_CHECK_FUNCS_ONCE:                   Generic Functions.   (line  38)
* AC_CHECK_HEADER:                       Generic Headers.     (line  13)
* AC_CHECK_HEADER_STDBOOL:               Particular Headers.  (line  10)
* AC_CHECK_HEADERS:                      Generic Headers.     (line  46)
* AC_CHECK_HEADERS_ONCE:                 Generic Headers.     (line  87)
* AC_CHECK_LIB:                          Libraries.           (line  11)
* AC_CHECK_MEMBER:                       Generic Structures.  (line  11)
* AC_CHECK_MEMBERS:                      Generic Structures.  (line  29)
* AC_CHECK_PROG:                         Generic Programs.    (line  24)
* AC_CHECK_PROGS:                        Generic Programs.    (line  36)
* AC_CHECK_SIZEOF:                       Generic Compiler Characteristics.
                                                              (line   8)
* AC_CHECK_TARGET_TOOL:                  Generic Programs.    (line  48)
* AC_CHECK_TARGET_TOOLS:                 Generic Programs.    (line  79)
* AC_CHECK_TOOL:                         Generic Programs.    (line  64)
* AC_CHECK_TOOLS:                        Generic Programs.    (line  92)
* AC_CHECK_TYPE <1>:                     Obsolete Macros.     (line  54)
* AC_CHECK_TYPE:                         Generic Types.       (line  11)
* AC_CHECK_TYPES:                        Generic Types.       (line  28)
* AC_CHECKING:                           Obsolete Macros.     (line 101)
* AC_COMPILE_CHECK:                      Obsolete Macros.     (line 109)
* AC_COMPILE_IFELSE:                     Running the Compiler.
                                                              (line  13)
* AC_COMPUTE_INT:                        Generic Compiler Characteristics.
                                                              (line  42)
* AC_CONFIG_AUX_DIR:                     Input.               (line  20)
* AC_CONFIG_COMMANDS:                    Configuration Commands.
                                                              (line  13)
* AC_CONFIG_COMMANDS_POST:               Configuration Commands.
                                                              (line  41)
* AC_CONFIG_COMMANDS_PRE:                Configuration Commands.
                                                              (line  35)
* AC_CONFIG_FILES:                       Configuration Files. (line   9)
* AC_CONFIG_HEADERS:                     Configuration Headers.
                                                              (line  33)
* AC_CONFIG_ITEMS:                       Configuration Actions.
                                                              (line  12)
* AC_CONFIG_LIBOBJ_DIR:                  Generic Functions.   (line  97)
* AC_CONFIG_LINKS:                       Configuration Links. (line  12)
* AC_CONFIG_MACRO_DIR:                   Input.               (line  48)
* AC_CONFIG_SRCDIR:                      Input.               (line   7)
* AC_CONFIG_SUBDIRS:                     Subdirectories.      (line  12)
* AC_CONFIG_TESTDIR:                     Making testsuite Scripts.
                                                              (line  26)
* AC_CONST:                              Obsolete Macros.     (line 117)
* AC_COPYRIGHT:                          Notices.             (line  10)
* AC_CROSS_CHECK:                        Obsolete Macros.     (line 120)
* AC_CYGWIN:                             Obsolete Macros.     (line 124)
* AC_DATAROOTDIR_CHECKED:                Changed Directory Variables.
                                                              (line  58)
* AC_DECL_SYS_SIGLIST:                   Obsolete Macros.     (line 141)
* AC_DECL_YYTEXT:                        Obsolete Macros.     (line 154)
* AC_DEFINE:                             Defining Symbols.    (line  32)
* AC_DEFINE_UNQUOTED:                    Defining Symbols.    (line  74)
* AC_DEFUN:                              Macro Definitions.   (line   7)
* AC_DEFUN_ONCE:                         One-Shot Macros.     (line  14)
* AC_DIAGNOSE:                           Reporting Messages.  (line  18)
* AC_DIR_HEADER:                         Obsolete Macros.     (line 158)
* AC_DISABLE_OPTION_CHECKING:            Option Checking.     (line  28)
* AC_DYNIX_SEQ:                          Obsolete Macros.     (line 170)
* AC_EGREP_CPP:                          Running the Preprocessor.
                                                              (line  74)
* AC_EGREP_HEADER:                       Running the Preprocessor.
                                                              (line  67)
* AC_EMXOS2:                             Obsolete Macros.     (line 183)
* AC_ENABLE:                             Obsolete Macros.     (line 189)
* AC_ERLANG_CHECK_LIB:                   Erlang Libraries.    (line  36)
* AC_ERLANG_NEED_ERL:                    Erlang Compiler and Interpreter.
                                                              (line  41)
* AC_ERLANG_NEED_ERLC:                   Erlang Compiler and Interpreter.
                                                              (line  24)
* AC_ERLANG_PATH_ERL:                    Erlang Compiler and Interpreter.
                                                              (line  29)
* AC_ERLANG_PATH_ERLC:                   Erlang Compiler and Interpreter.
                                                              (line  10)
* AC_ERLANG_SUBST_ERTS_VER:              Erlang Libraries.    (line  12)
* AC_ERLANG_SUBST_INSTALL_LIB_DIR <1>:   Erlang Libraries.    (line  86)
* AC_ERLANG_SUBST_INSTALL_LIB_DIR:       Installation Directory Variables.
                                                              (line 201)
* AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR <1>: Erlang Libraries.   (line  93)
* AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR:    Installation Directory Variables.
                                                              (line 206)
* AC_ERLANG_SUBST_LIB_DIR:               Erlang Libraries.    (line  28)
* AC_ERLANG_SUBST_ROOT_DIR:              Erlang Libraries.    (line  22)
* AC_ERROR:                              Obsolete Macros.     (line 193)
* AC_EXEEXT:                             Obsolete Macros.     (line 178)
* AC_F77_DUMMY_MAIN:                     Fortran Compiler.    (line 130)
* AC_F77_FUNC:                           Fortran Compiler.    (line 266)
* AC_F77_IMPLICIT_NONE:                  Fortran Compiler.    (line 427)
* AC_F77_LIBRARY_LDFLAGS:                Fortran Compiler.    (line  92)
* AC_F77_MAIN:                           Fortran Compiler.    (line 176)
* AC_F77_WRAPPERS:                       Fortran Compiler.    (line 202)
* AC_FATAL:                              Reporting Messages.  (line  34)
* AC_FC_CHECK_BOUNDS:                    Fortran Compiler.    (line 413)
* AC_FC_DUMMY_MAIN:                      Fortran Compiler.    (line 130)
* AC_FC_FIXEDFORM:                       Fortran Compiler.    (line 375)
* AC_FC_FREEFORM:                        Fortran Compiler.    (line 351)
* AC_FC_FUNC:                            Fortran Compiler.    (line 266)
* AC_FC_IMPLICIT_NONE:                   Fortran Compiler.    (line 427)
* AC_FC_LIBRARY_LDFLAGS:                 Fortran Compiler.    (line  92)
* AC_FC_LINE_LENGTH:                     Fortran Compiler.    (line 396)
* AC_FC_MAIN:                            Fortran Compiler.    (line 176)
* AC_FC_MODULE_EXTENSION:                Fortran Compiler.    (line 438)
* AC_FC_MODULE_FLAG:                     Fortran Compiler.    (line 465)
* AC_FC_MODULE_OUTPUT_FLAG:              Fortran Compiler.    (line 501)
* AC_FC_PP_DEFINE:                       Fortran Compiler.    (line 336)
* AC_FC_PP_SRCEXT:                       Fortran Compiler.    (line 279)
* AC_FC_SRCEXT:                          Fortran Compiler.    (line 279)
* AC_FC_WRAPPERS:                        Fortran Compiler.    (line 202)
* AC_FIND_X:                             Obsolete Macros.     (line 196)
* AC_FIND_XTRA:                          Obsolete Macros.     (line 199)
* AC_FOREACH:                            Obsolete Macros.     (line 202)
* AC_FUNC_ALLOCA:                        Particular Functions.
                                                              (line  10)
* AC_FUNC_CHECK:                         Obsolete Macros.     (line 205)
* AC_FUNC_CHOWN:                         Particular Functions.
                                                              (line  63)
* AC_FUNC_CLOSEDIR_VOID:                 Particular Functions.
                                                              (line  69)
* AC_FUNC_ERROR_AT_LINE:                 Particular Functions.
                                                              (line  84)
* AC_FUNC_FNMATCH:                       Particular Functions.
                                                              (line  94)
* AC_FUNC_FNMATCH_GNU:                   Particular Functions.
                                                              (line 109)
* AC_FUNC_FORK:                          Particular Functions.
                                                              (line 120)
* AC_FUNC_FSEEKO:                        Particular Functions.
                                                              (line 147)
* AC_FUNC_GETGROUPS:                     Particular Functions.
                                                              (line 155)
* AC_FUNC_GETLOADAVG:                    Particular Functions.
                                                              (line 161)
* AC_FUNC_GETMNTENT:                     Particular Functions.
                                                              (line 195)
* AC_FUNC_GETPGRP:                       Particular Functions.
                                                              (line 205)
* AC_FUNC_LSTAT:                         Particular Functions.
                                                              (line 363)
* AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK: Particular Functions.
                                                              (line 228)
* AC_FUNC_MALLOC:                        Particular Functions.
                                                              (line 247)
* AC_FUNC_MBRTOWC:                       Particular Functions.
                                                              (line 279)
* AC_FUNC_MEMCMP:                        Particular Functions.
                                                              (line 286)
* AC_FUNC_MKTIME:                        Particular Functions.
                                                              (line 299)
* AC_FUNC_MMAP:                          Particular Functions.
                                                              (line 311)
* AC_FUNC_OBSTACK:                       Particular Functions.
                                                              (line 319)
* AC_FUNC_REALLOC:                       Particular Functions.
                                                              (line 326)
* AC_FUNC_SELECT_ARGTYPES:               Particular Functions.
                                                              (line 337)
* AC_FUNC_SETPGRP:                       Particular Functions.
                                                              (line 348)
* AC_FUNC_SETVBUF_REVERSED:              Obsolete Macros.     (line 208)
* AC_FUNC_STAT:                          Particular Functions.
                                                              (line 363)
* AC_FUNC_STRCOLL:                       Particular Functions.
                                                              (line 379)
* AC_FUNC_STRERROR_R:                    Particular Functions.
                                                              (line 388)
* AC_FUNC_STRFTIME:                      Particular Functions.
                                                              (line 401)
* AC_FUNC_STRNLEN:                       Particular Functions.
                                                              (line 426)
* AC_FUNC_STRTOD:                        Particular Functions.
                                                              (line 408)
* AC_FUNC_STRTOLD:                       Particular Functions.
                                                              (line 420)
* AC_FUNC_UTIME_NULL:                    Particular Functions.
                                                              (line 433)
* AC_FUNC_VPRINTF:                       Particular Functions.
                                                              (line 443)
* AC_FUNC_WAIT3:                         Obsolete Macros.     (line 216)
* AC_GCC_TRADITIONAL:                    Obsolete Macros.     (line 224)
* AC_GETGROUPS_T:                        Obsolete Macros.     (line 228)
* AC_GETLOADAVG:                         Obsolete Macros.     (line 231)
* AC_GNU_SOURCE:                         Obsolete Macros.     (line 234)
* AC_HAVE_FUNCS:                         Obsolete Macros.     (line 238)
* AC_HAVE_HEADERS:                       Obsolete Macros.     (line 241)
* AC_HAVE_LIBRARY:                       Obsolete Macros.     (line 245)
* AC_HAVE_POUNDBANG:                     Obsolete Macros.     (line 252)
* AC_HEADER_ASSERT:                      Particular Headers.  (line  20)
* AC_HEADER_CHECK:                       Obsolete Macros.     (line 255)
* AC_HEADER_DIRENT:                      Particular Headers.  (line  25)
* AC_HEADER_EGREP:                       Obsolete Macros.     (line 258)
* AC_HEADER_MAJOR:                       Particular Headers.  (line  68)
* AC_HEADER_RESOLV:                      Particular Headers.  (line  73)
* AC_HEADER_STAT:                        Particular Headers.  (line  92)
* AC_HEADER_STDBOOL:                     Particular Headers.  (line 101)
* AC_HEADER_STDC:                        Particular Headers.  (line 135)
* AC_HEADER_SYS_WAIT:                    Particular Headers.  (line 204)
* AC_HEADER_TIME:                        Particular Headers.  (line 244)
* AC_HEADER_TIOCGWINSZ:                  Particular Headers.  (line 270)
* AC_HELP_STRING:                        Obsolete Macros.     (line 261)
* AC_INCLUDES_DEFAULT:                   Default Includes.    (line  29)
* AC_INIT <1>:                           Obsolete Macros.     (line 264)
* AC_INIT:                               Initializing configure.
                                                              (line  14)
* AC_INLINE:                             Obsolete Macros.     (line 272)
* AC_INT_16_BITS:                        Obsolete Macros.     (line 275)
* AC_IRIX_SUN:                           Obsolete Macros.     (line 279)
* AC_ISC_POSIX:                          Obsolete Macros.     (line 295)
* AC_LANG:                               Language Choice.     (line  14)
* AC_LANG_ASSERT:                        Language Choice.     (line  79)
* AC_LANG_C:                             Obsolete Macros.     (line 302)
* AC_LANG_CALL:                          Generating Sources.  (line 142)
* AC_LANG_CONFTEST:                      Generating Sources.  (line  12)
* AC_LANG_CPLUSPLUS:                     Obsolete Macros.     (line 305)
* AC_LANG_DEFINES_PROVIDED:              Generating Sources.  (line  31)
* AC_LANG_FORTRAN77:                     Obsolete Macros.     (line 308)
* AC_LANG_FUNC_LINK_TRY:                 Generating Sources.  (line 154)
* AC_LANG_POP:                           Language Choice.     (line  66)
* AC_LANG_PROGRAM:                       Generating Sources.  (line  78)
* AC_LANG_PUSH:                          Language Choice.     (line  61)
* AC_LANG_RESTORE:                       Obsolete Macros.     (line 311)
* AC_LANG_SAVE:                          Obsolete Macros.     (line 317)
* AC_LANG_SOURCE:                        Generating Sources.  (line  40)
* AC_LANG_WERROR:                        Generic Compiler Characteristics.
                                                              (line  54)
* AC_LIBOBJ:                             Generic Functions.   (line  56)
* AC_LIBSOURCE:                          Generic Functions.   (line  65)
* AC_LIBSOURCES:                         Generic Functions.   (line  89)
* AC_LINK_FILES:                         Obsolete Macros.     (line 322)
* AC_LINK_IFELSE:                        Running the Linker.  (line  24)
* AC_LN_S:                               Obsolete Macros.     (line 334)
* AC_LONG_64_BITS:                       Obsolete Macros.     (line 337)
* AC_LONG_DOUBLE:                        Obsolete Macros.     (line 342)
* AC_LONG_FILE_NAMES:                    Obsolete Macros.     (line 350)
* AC_MAJOR_HEADER:                       Obsolete Macros.     (line 355)
* AC_MEMORY_H:                           Obsolete Macros.     (line 358)
* AC_MINGW32:                            Obsolete Macros.     (line 365)
* AC_MINIX:                              Obsolete Macros.     (line 371)
* AC_MINUS_C_MINUS_O:                    Obsolete Macros.     (line 375)
* AC_MMAP:                               Obsolete Macros.     (line 378)
* AC_MODE_T:                             Obsolete Macros.     (line 381)
* AC_MSG_CHECKING:                       Printing Messages.   (line  24)
* AC_MSG_ERROR:                          Printing Messages.   (line  56)
* AC_MSG_FAILURE:                        Printing Messages.   (line  66)
* AC_MSG_NOTICE:                         Printing Messages.   (line  46)
* AC_MSG_RESULT:                         Printing Messages.   (line  35)
* AC_MSG_WARN:                           Printing Messages.   (line  72)
* AC_OBJEXT:                             Obsolete Macros.     (line 384)
* AC_OBSOLETE:                           Obsolete Macros.     (line 390)
* AC_OFF_T:                              Obsolete Macros.     (line 405)
* AC_OPENMP:                             Generic Compiler Characteristics.
                                                              (line  64)
* AC_OUTPUT <1>:                         Obsolete Macros.     (line 408)
* AC_OUTPUT:                             Output.              (line  13)
* AC_OUTPUT_COMMANDS:                    Obsolete Macros.     (line 420)
* AC_PACKAGE_BUGREPORT:                  Initializing configure.
                                                              (line  57)
* AC_PACKAGE_NAME:                       Initializing configure.
                                                              (line  45)
* AC_PACKAGE_STRING:                     Initializing configure.
                                                              (line  54)
* AC_PACKAGE_TARNAME:                    Initializing configure.
                                                              (line  48)
* AC_PACKAGE_URL:                        Initializing configure.
                                                              (line  61)
* AC_PACKAGE_VERSION:                    Initializing configure.
                                                              (line  51)
* AC_PATH_PROG:                          Generic Programs.    (line 108)
* AC_PATH_PROGS:                         Generic Programs.    (line 115)
* AC_PATH_PROGS_FEATURE_CHECK:           Generic Programs.    (line 123)
* AC_PATH_TARGET_TOOL:                   Generic Programs.    (line 159)
* AC_PATH_TOOL:                          Generic Programs.    (line 164)
* AC_PATH_X:                             System Services.     (line  10)
* AC_PATH_XTRA:                          System Services.     (line  30)
* AC_PID_T:                              Obsolete Macros.     (line 450)
* AC_PREFIX:                             Obsolete Macros.     (line 453)
* AC_PREFIX_DEFAULT:                     Default Prefix.      (line  16)
* AC_PREFIX_PROGRAM:                     Default Prefix.      (line  25)
* AC_PREPROC_IFELSE:                     Running the Preprocessor.
                                                              (line  20)
* AC_PREREQ:                             Versioning.          (line  11)
* AC_PRESERVE_HELP_ORDER:                Help Formatting.     (line  20)
* AC_PROG_AWK:                           Particular Programs. (line  10)
* AC_PROG_CC:                            C Compiler.          (line  61)
* AC_PROG_CC_C89:                        C Compiler.          (line 147)
* AC_PROG_CC_C99:                        C Compiler.          (line 161)
* AC_PROG_CC_C_O:                        C Compiler.          (line 102)
* AC_PROG_CC_STDC:                       C Compiler.          (line 137)
* AC_PROG_CPP:                           C Compiler.          (line 113)
* AC_PROG_CPP_WERROR:                    C Compiler.          (line 126)
* AC_PROG_CXX:                           C++ Compiler.        (line   7)
* AC_PROG_CXX_C_O:                       C++ Compiler.        (line  48)
* AC_PROG_CXXCPP:                        C++ Compiler.        (line  35)
* AC_PROG_EGREP:                         Particular Programs. (line  29)
* AC_PROG_F77:                           Fortran Compiler.    (line  19)
* AC_PROG_F77_C_O:                       Fortran Compiler.    (line  76)
* AC_PROG_FC:                            Fortran Compiler.    (line  44)
* AC_PROG_FC_C_O:                        Fortran Compiler.    (line  76)
* AC_PROG_FGREP:                         Particular Programs. (line  36)
* AC_PROG_GCC_TRADITIONAL:               C Compiler.          (line 361)
* AC_PROG_GREP:                          Particular Programs. (line  20)
* AC_PROG_INSTALL:                       Particular Programs. (line  43)
* AC_PROG_LEX:                           Particular Programs. (line 114)
* AC_PROG_LN_S:                          Particular Programs. (line 168)
* AC_PROG_MAKE_SET:                      Output.              (line  45)
* AC_PROG_MKDIR_P:                       Particular Programs. (line  80)
* AC_PROG_OBJC:                          Objective C Compiler.
                                                              (line   7)
* AC_PROG_OBJCPP:                        Objective C Compiler.
                                                              (line  26)
* AC_PROG_OBJCXX:                        Objective C++ Compiler.
                                                              (line   7)
* AC_PROG_OBJCXXCPP:                     Objective C++ Compiler.
                                                              (line  27)
* AC_PROG_RANLIB:                        Particular Programs. (line 187)
* AC_PROG_SED:                           Particular Programs. (line 191)
* AC_PROG_YACC:                          Particular Programs. (line 200)
* AC_PROGRAM_CHECK:                      Obsolete Macros.     (line 462)
* AC_PROGRAM_EGREP:                      Obsolete Macros.     (line 465)
* AC_PROGRAM_PATH:                       Obsolete Macros.     (line 468)
* AC_PROGRAMS_CHECK:                     Obsolete Macros.     (line 456)
* AC_PROGRAMS_PATH:                      Obsolete Macros.     (line 459)
* AC_REMOTE_TAPE:                        Obsolete Macros.     (line 471)
* AC_REPLACE_FNMATCH:                    Particular Functions.
                                                              (line 452)
* AC_REPLACE_FUNCS:                      Generic Functions.   (line 117)
* AC_REQUIRE:                            Prerequisite Macros. (line  17)
* AC_REQUIRE_AUX_FILE:                   Input.               (line  37)
* AC_REQUIRE_CPP:                        Language Choice.     (line  94)
* AC_RESTARTABLE_SYSCALLS:               Obsolete Macros.     (line 474)
* AC_RETSIGTYPE:                         Obsolete Macros.     (line 482)
* AC_REVISION:                           Notices.             (line  18)
* AC_RSH:                                Obsolete Macros.     (line 486)
* AC_RUN_IFELSE:                         Runtime.             (line  20)
* AC_SCO_INTL:                           Obsolete Macros.     (line 489)
* AC_SEARCH_LIBS:                        Libraries.           (line  52)
* AC_SET_MAKE:                           Obsolete Macros.     (line 503)
* AC_SETVBUF_REVERSED:                   Obsolete Macros.     (line 498)
* AC_SIZE_T:                             Obsolete Macros.     (line 509)
* AC_SIZEOF_TYPE:                        Obsolete Macros.     (line 506)
* AC_ST_BLKSIZE:                         Obsolete Macros.     (line 539)
* AC_ST_BLOCKS:                          Obsolete Macros.     (line 542)
* AC_ST_RDEV:                            Obsolete Macros.     (line 545)
* AC_STAT_MACROS_BROKEN:                 Obsolete Macros.     (line 512)
* AC_STDC_HEADERS:                       Obsolete Macros.     (line 515)
* AC_STRCOLL:                            Obsolete Macros.     (line 518)
* AC_STRUCT_DIRENT_D_INO:                Particular Structures.
                                                              (line   9)
* AC_STRUCT_DIRENT_D_TYPE:               Particular Structures.
                                                              (line  21)
* AC_STRUCT_ST_BLKSIZE:                  Obsolete Macros.     (line 521)
* AC_STRUCT_ST_BLOCKS:                   Particular Structures.
                                                              (line  26)
* AC_STRUCT_ST_RDEV:                     Obsolete Macros.     (line 530)
* AC_STRUCT_TIMEZONE:                    Particular Structures.
                                                              (line  43)
* AC_STRUCT_TM:                          Particular Structures.
                                                              (line  35)
* AC_SUBST:                              Setting Output Variables.
                                                              (line  13)
* AC_SUBST_FILE:                         Setting Output Variables.
                                                              (line  38)
* AC_SYS_INTERPRETER:                    System Services.     (line  42)
* AC_SYS_LARGEFILE:                      System Services.     (line  49)
* AC_SYS_LONG_FILE_NAMES:                System Services.     (line  71)
* AC_SYS_POSIX_TERMIOS:                  System Services.     (line  75)
* AC_SYS_RESTARTABLE_SYSCALLS:           Obsolete Macros.     (line 548)
* AC_SYS_SIGLIST_DECLARED:               Obsolete Macros.     (line 563)
* AC_TEST_CPP:                           Obsolete Macros.     (line 568)
* AC_TEST_PROGRAM:                       Obsolete Macros.     (line 572)
* AC_TIME_WITH_SYS_TIME:                 Obsolete Macros.     (line 579)
* AC_TIMEZONE:                           Obsolete Macros.     (line 576)
* AC_TRY_ACT:                            AC_ACT_IFELSE vs AC_TRY_ACT.
                                                              (line   6)
* AC_TRY_COMPILE:                        Obsolete Macros.     (line 583)
* AC_TRY_CPP:                            Obsolete Macros.     (line 602)
* AC_TRY_LINK:                           Obsolete Macros.     (line 615)
* AC_TRY_LINK_FUNC:                      Obsolete Macros.     (line 644)
* AC_TRY_RUN:                            Obsolete Macros.     (line 651)
* AC_TYPE_GETGROUPS:                     Particular Types.    (line  14)
* AC_TYPE_INT16_T:                       Particular Types.    (line  40)
* AC_TYPE_INT32_T:                       Particular Types.    (line  43)
* AC_TYPE_INT64_T:                       Particular Types.    (line  46)
* AC_TYPE_INT8_T:                        Particular Types.    (line  21)
* AC_TYPE_INTMAX_T:                      Particular Types.    (line  49)
* AC_TYPE_INTPTR_T:                      Particular Types.    (line  54)
* AC_TYPE_LONG_DOUBLE:                   Particular Types.    (line  59)
* AC_TYPE_LONG_DOUBLE_WIDER:             Particular Types.    (line  70)
* AC_TYPE_LONG_LONG_INT:                 Particular Types.    (line  78)
* AC_TYPE_MBSTATE_T:                     Particular Types.    (line  88)
* AC_TYPE_MODE_T:                        Particular Types.    (line  96)
* AC_TYPE_OFF_T:                         Particular Types.    (line 102)
* AC_TYPE_PID_T:                         Particular Types.    (line 108)
* AC_TYPE_SIGNAL:                        Obsolete Macros.     (line 662)
* AC_TYPE_SIZE_T:                        Particular Types.    (line 114)
* AC_TYPE_SSIZE_T:                       Particular Types.    (line 120)
* AC_TYPE_UID_T:                         Particular Types.    (line 126)
* AC_TYPE_UINT16_T:                      Particular Types.    (line 138)
* AC_TYPE_UINT32_T:                      Particular Types.    (line 141)
* AC_TYPE_UINT64_T:                      Particular Types.    (line 144)
* AC_TYPE_UINT8_T:                       Particular Types.    (line 132)
* AC_TYPE_UINTMAX_T:                     Particular Types.    (line 147)
* AC_TYPE_UINTPTR_T:                     Particular Types.    (line 152)
* AC_TYPE_UNSIGNED_LONG_LONG_INT:        Particular Types.    (line 157)
* AC_UID_T:                              Obsolete Macros.     (line 679)
* AC_UNISTD_H:                           Obsolete Macros.     (line 682)
* AC_USE_SYSTEM_EXTENSIONS:              Posix Variants.      (line  10)
* AC_USG:                                Obsolete Macros.     (line 685)
* AC_UTIME_NULL:                         Obsolete Macros.     (line 690)
* AC_VALIDATE_CACHED_SYSTEM_TUPLE:       Obsolete Macros.     (line 693)
* AC_VERBOSE:                            Obsolete Macros.     (line 698)
* AC_VFORK:                              Obsolete Macros.     (line 701)
* AC_VPRINTF:                            Obsolete Macros.     (line 704)
* AC_WAIT3:                              Obsolete Macros.     (line 707)
* AC_WARN:                               Obsolete Macros.     (line 712)
* AC_WARNING:                            Reporting Messages.  (line  26)
* AC_WITH:                               Obsolete Macros.     (line 715)
* AC_WORDS_BIGENDIAN:                    Obsolete Macros.     (line 719)
* AC_XENIX_DIR:                          Obsolete Macros.     (line 722)
* AC_YYTEXT_POINTER:                     Obsolete Macros.     (line 739)
* AH_BOTTOM:                             Autoheader Macros.   (line  50)
* AH_HEADER:                             Configuration Headers.
                                                              (line  54)
* AH_TEMPLATE:                           Autoheader Macros.   (line  19)
* AH_TOP:                                Autoheader Macros.   (line  47)
* AH_VERBATIM:                           Autoheader Macros.   (line  40)
* AU_ALIAS:                              Obsoleting Macros.   (line  34)
* AU_DEFUN:                              Obsoleting Macros.   (line  18)


File: autoconf.info,  Node: M4 Macro Index,  Next: Autotest Macro Index,  Prev: Autoconf Macro Index,  Up: Indices

B.6 M4 Macro Index
==================

This is an alphabetical list of the M4, M4sugar, and M4sh macros.

 [index ]
* Menu:

* __file__:                              Redefined M4 Macros. (line  65)
* __line__:                              Redefined M4 Macros. (line  65)
* __oline__:                             Redefined M4 Macros. (line  69)
* AS_BOURNE_COMPATIBLE:                  Initialization Macros.
                                                              (line   7)
* AS_BOX:                                Common Shell Constructs.
                                                              (line  10)
* AS_CASE:                               Common Shell Constructs.
                                                              (line  19)
* AS_DIRNAME:                            Common Shell Constructs.
                                                              (line  26)
* AS_ECHO:                               Common Shell Constructs.
                                                              (line  34)
* AS_ECHO_N:                             Common Shell Constructs.
                                                              (line  42)
* AS_ESCAPE:                             Common Shell Constructs.
                                                              (line  50)
* AS_EXECUTABLE_P:                       Common Shell Constructs.
                                                              (line  90)
* AS_EXIT:                               Common Shell Constructs.
                                                              (line  95)
* AS_HELP_STRING:                        Pretty Help Strings. (line  15)
* AS_IF:                                 Common Shell Constructs.
                                                              (line 101)
* AS_INIT:                               Initialization Macros.
                                                              (line  14)
* AS_INIT_GENERATED:                     Initialization Macros.
                                                              (line  26)
* AS_LINENO_PREPARE:                     Initialization Macros.
                                                              (line  67)
* AS_LITERAL_IF:                         Polymorphic Variables.
                                                              (line  21)
* AS_LITERAL_WORD_IF:                    Polymorphic Variables.
                                                              (line  21)
* AS_ME_PREPARE:                         Initialization Macros.
                                                              (line  72)
* AS_MESSAGE_FD:                         File Descriptor Macros.
                                                              (line  17)
* AS_MESSAGE_LOG_FD:                     File Descriptor Macros.
                                                              (line  29)
* AS_MKDIR_P:                            Common Shell Constructs.
                                                              (line 115)
* AS_ORIGINAL_STDIN_FD:                  File Descriptor Macros.
                                                              (line  39)
* AS_SET_CATFILE:                        Common Shell Constructs.
                                                              (line 155)
* AS_SET_STATUS:                         Common Shell Constructs.
                                                              (line 127)
* AS_SHELL_SANITIZE:                     Initialization Macros.
                                                              (line 101)
* AS_TMPDIR:                             Initialization Macros.
                                                              (line  77)
* AS_TR_CPP:                             Common Shell Constructs.
                                                              (line 135)
* AS_TR_SH:                              Common Shell Constructs.
                                                              (line 144)
* AS_UNSET:                              Common Shell Constructs.
                                                              (line 159)
* AS_VAR_APPEND:                         Polymorphic Variables.
                                                              (line  63)
* AS_VAR_ARITH:                          Polymorphic Variables.
                                                              (line  85)
* AS_VAR_COPY:                           Polymorphic Variables.
                                                              (line 103)
* AS_VAR_IF:                             Polymorphic Variables.
                                                              (line 122)
* AS_VAR_POPDEF:                         Polymorphic Variables.
                                                              (line 131)
* AS_VAR_PUSHDEF:                        Polymorphic Variables.
                                                              (line 131)
* AS_VAR_SET:                            Polymorphic Variables.
                                                              (line 173)
* AS_VAR_SET_IF:                         Polymorphic Variables.
                                                              (line 183)
* AS_VAR_TEST_SET:                       Polymorphic Variables.
                                                              (line 188)
* AS_VERSION_COMPARE:                    Common Shell Constructs.
                                                              (line 165)
* dnl:                                   Redefined M4 Macros. (line  76)
* m4_append:                             Text processing Macros.
                                                              (line  16)
* m4_append_uniq:                        Text processing Macros.
                                                              (line  16)
* m4_append_uniq_w:                      Text processing Macros.
                                                              (line  69)
* m4_apply:                              Evaluation Macros.   (line  10)
* m4_argn:                               Looping constructs.  (line  29)
* m4_assert:                             Diagnostic Macros.   (line  11)
* m4_bmatch:                             Conditional constructs.
                                                              (line  11)
* m4_bpatsubst:                          Redefined M4 Macros. (line  79)
* m4_bpatsubsts:                         Conditional constructs.
                                                              (line  18)
* m4_bregexp:                            Redefined M4 Macros. (line  84)
* m4_builtin:                            Redefined M4 Macros. (line   6)
* m4_car:                                Looping constructs.  (line  35)
* m4_case:                               Conditional constructs.
                                                              (line  33)
* m4_cdr:                                Looping constructs.  (line  41)
* m4_changecom:                          Redefined M4 Macros. (line   6)
* m4_changequote:                        Redefined M4 Macros. (line   6)
* m4_chomp:                              Text processing Macros.
                                                              (line  80)
* m4_chomp_all:                          Text processing Macros.
                                                              (line  80)
* m4_cleardivert:                        Diversion support.   (line 125)
* m4_cmp:                                Number processing Macros.
                                                              (line  11)
* m4_combine:                            Text processing Macros.
                                                              (line  88)
* m4_cond:                               Conditional constructs.
                                                              (line  42)
* m4_copy:                               Redefined M4 Macros. (line  92)
* m4_copy_force:                         Redefined M4 Macros. (line  92)
* m4_count:                              Evaluation Macros.   (line  26)
* m4_curry:                              Evaluation Macros.   (line  30)
* m4_debugfile:                          Redefined M4 Macros. (line   6)
* m4_debugmode:                          Redefined M4 Macros. (line   6)
* m4_decr:                               Redefined M4 Macros. (line   6)
* m4_default:                            Conditional constructs.
                                                              (line  73)
* m4_default_nblank:                     Conditional constructs.
                                                              (line  73)
* m4_default_nblank_quoted:              Conditional constructs.
                                                              (line  73)
* m4_default_quoted:                     Conditional constructs.
                                                              (line  73)
* m4_define:                             Redefined M4 Macros. (line   6)
* m4_define_default:                     Conditional constructs.
                                                              (line 122)
* m4_defn:                               Redefined M4 Macros. (line 111)
* m4_divert:                             Redefined M4 Macros. (line 119)
* m4_divert_once:                        Diversion support.   (line 128)
* m4_divert_pop:                         Diversion support.   (line 133)
* m4_divert_push:                        Diversion support.   (line 139)
* m4_divert_text:                        Diversion support.   (line 145)
* m4_divnum:                             Redefined M4 Macros. (line   6)
* m4_do:                                 Evaluation Macros.   (line  45)
* m4_dquote:                             Evaluation Macros.   (line  65)
* m4_dquote_elt:                         Evaluation Macros.   (line  70)
* m4_dumpdef:                            Redefined M4 Macros. (line 131)
* m4_dumpdefs:                           Redefined M4 Macros. (line 131)
* m4_echo:                               Evaluation Macros.   (line  75)
* m4_errprint:                           Redefined M4 Macros. (line   6)
* m4_errprintn:                          Diagnostic Macros.   (line  16)
* m4_escape:                             Text processing Macros.
                                                              (line 108)
* m4_esyscmd:                            Redefined M4 Macros. (line   6)
* m4_esyscmd_s:                          Redefined M4 Macros. (line 148)
* m4_eval:                               Redefined M4 Macros. (line   6)
* m4_exit:                               Redefined M4 Macros. (line 154)
* m4_expand:                             Evaluation Macros.   (line  79)
* m4_fatal:                              Diagnostic Macros.   (line  20)
* m4_flatten:                            Text processing Macros.
                                                              (line 113)
* m4_for:                                Looping constructs.  (line  59)
* m4_foreach:                            Looping constructs.  (line  69)
* m4_foreach_w:                          Looping constructs.  (line  83)
* m4_format:                             Redefined M4 Macros. (line   6)
* m4_if:                                 Redefined M4 Macros. (line 160)
* m4_ifblank:                            Conditional constructs.
                                                              (line 127)
* m4_ifdef:                              Redefined M4 Macros. (line   6)
* m4_ifnblank:                           Conditional constructs.
                                                              (line 127)
* m4_ifndef:                             Conditional constructs.
                                                              (line 135)
* m4_ifset:                              Conditional constructs.
                                                              (line 139)
* m4_ifval:                              Conditional constructs.
                                                              (line 145)
* m4_ifvaln:                             Conditional constructs.
                                                              (line 150)
* m4_ignore:                             Evaluation Macros.   (line 129)
* m4_include:                            Redefined M4 Macros. (line 167)
* m4_incr:                               Redefined M4 Macros. (line   6)
* m4_index:                              Redefined M4 Macros. (line   6)
* m4_indir:                              Redefined M4 Macros. (line   6)
* m4_init:                               Diversion support.   (line 171)
* m4_join:                               Text processing Macros.
                                                              (line 119)
* m4_joinall:                            Text processing Macros.
                                                              (line 119)
* m4_len:                                Redefined M4 Macros. (line   6)
* m4_list_cmp:                           Number processing Macros.
                                                              (line  16)
* m4_location:                           Diagnostic Macros.   (line  24)
* m4_make_list:                          Evaluation Macros.   (line 142)
* m4_maketemp:                           Redefined M4 Macros. (line 171)
* m4_map:                                Looping constructs.  (line  93)
* m4_map_args:                           Looping constructs.  (line 130)
* m4_map_args_pair:                      Looping constructs.  (line 166)
* m4_map_args_sep:                       Looping constructs.  (line 178)
* m4_map_args_w:                         Looping constructs.  (line 189)
* m4_map_sep:                            Looping constructs.  (line  93)
* m4_mapall:                             Looping constructs.  (line  93)
* m4_mapall_sep:                         Looping constructs.  (line  93)
* m4_max:                                Number processing Macros.
                                                              (line  38)
* m4_min:                                Number processing Macros.
                                                              (line  42)
* m4_mkstemp:                            Redefined M4 Macros. (line 171)
* m4_n:                                  Conditional constructs.
                                                              (line 154)
* m4_newline:                            Text processing Macros.
                                                              (line 134)
* m4_normalize:                          Text processing Macros.
                                                              (line 140)
* m4_pattern_allow:                      Forbidden Patterns.  (line  30)
* m4_pattern_forbid:                     Forbidden Patterns.  (line  17)
* m4_popdef:                             Redefined M4 Macros. (line 182)
* m4_pushdef:                            Redefined M4 Macros. (line   6)
* m4_quote:                              Evaluation Macros.   (line 161)
* m4_re_escape:                          Text processing Macros.
                                                              (line 148)
* m4_rename:                             Redefined M4 Macros. (line  92)
* m4_rename_force:                       Redefined M4 Macros. (line  92)
* m4_reverse:                            Evaluation Macros.   (line 167)
* m4_set_add:                            Set manipulation Macros.
                                                              (line  19)
* m4_set_add_all:                        Set manipulation Macros.
                                                              (line  25)
* m4_set_contains:                       Set manipulation Macros.
                                                              (line  29)
* m4_set_contents:                       Set manipulation Macros.
                                                              (line  49)
* m4_set_delete:                         Set manipulation Macros.
                                                              (line  79)
* m4_set_difference:                     Set manipulation Macros.
                                                              (line  86)
* m4_set_dump:                           Set manipulation Macros.
                                                              (line  49)
* m4_set_empty:                          Set manipulation Macros.
                                                              (line 109)
* m4_set_foreach:                        Set manipulation Macros.
                                                              (line 115)
* m4_set_intersection:                   Set manipulation Macros.
                                                              (line  86)
* m4_set_list:                           Set manipulation Macros.
                                                              (line 136)
* m4_set_listc:                          Set manipulation Macros.
                                                              (line 136)
* m4_set_map:                            Set manipulation Macros.
                                                              (line 171)
* m4_set_map_sep:                        Set manipulation Macros.
                                                              (line 184)
* m4_set_remove:                         Set manipulation Macros.
                                                              (line 195)
* m4_set_size:                           Set manipulation Macros.
                                                              (line 206)
* m4_set_union:                          Set manipulation Macros.
                                                              (line  86)
* m4_shift:                              Redefined M4 Macros. (line   6)
* m4_shift2:                             Looping constructs.  (line 199)
* m4_shift3:                             Looping constructs.  (line 199)
* m4_shiftn:                             Looping constructs.  (line 199)
* m4_sign:                               Number processing Macros.
                                                              (line  46)
* m4_sinclude:                           Redefined M4 Macros. (line 167)
* m4_split:                              Text processing Macros.
                                                              (line 152)
* m4_stack_foreach:                      Looping constructs.  (line 208)
* m4_stack_foreach_lifo:                 Looping constructs.  (line 208)
* m4_stack_foreach_sep:                  Looping constructs.  (line 230)
* m4_stack_foreach_sep_lifo:             Looping constructs.  (line 230)
* m4_strip:                              Text processing Macros.
                                                              (line 158)
* m4_substr:                             Redefined M4 Macros. (line   6)
* m4_syscmd:                             Redefined M4 Macros. (line   6)
* m4_sysval:                             Redefined M4 Macros. (line   6)
* m4_text_box:                           Text processing Macros.
                                                              (line 167)
* m4_text_wrap:                          Text processing Macros.
                                                              (line 182)
* m4_tolower:                            Text processing Macros.
                                                              (line 213)
* m4_toupper:                            Text processing Macros.
                                                              (line 213)
* m4_traceoff:                           Redefined M4 Macros. (line   6)
* m4_traceon:                            Redefined M4 Macros. (line   6)
* m4_translit:                           Redefined M4 Macros. (line   6)
* m4_undefine:                           Redefined M4 Macros. (line 186)
* m4_undivert:                           Redefined M4 Macros. (line 194)
* m4_unquote:                            Evaluation Macros.   (line 176)
* m4_version_compare:                    Number processing Macros.
                                                              (line  50)
* m4_version_prereq:                     Number processing Macros.
                                                              (line  90)
* m4_warn:                               Diagnostic Macros.   (line  28)
* m4_wrap:                               Redefined M4 Macros. (line 204)
* m4_wrap_lifo:                          Redefined M4 Macros. (line 204)


File: autoconf.info,  Node: Autotest Macro Index,  Next: Program & Function Index,  Prev: M4 Macro Index,  Up: Indices

B.7 Autotest Macro Index
========================

This is an alphabetical list of the Autotest macros.

 [index ]
* Menu:

* AT_ARG_OPTION:                         Writing Testsuites.  (line  50)
* AT_ARG_OPTION_ARG:                     Writing Testsuites.  (line  79)
* AT_BANNER:                             Writing Testsuites.  (line 124)
* AT_CAPTURE_FILE:                       Writing Testsuites.  (line 155)
* AT_CHECK:                              Writing Testsuites.  (line 212)
* AT_CHECK_EUNIT:                        Writing Testsuites.  (line 302)
* AT_CHECK_UNQUOTED:                     Writing Testsuites.  (line 212)
* AT_CLEANUP:                            Writing Testsuites.  (line 198)
* AT_COLOR_TESTS:                        Writing Testsuites.  (line 105)
* AT_COPYRIGHT:                          Writing Testsuites.  (line  41)
* AT_DATA:                               Writing Testsuites.  (line 202)
* AT_FAIL_IF:                            Writing Testsuites.  (line 160)
* AT_INIT:                               Writing Testsuites.  (line  31)
* AT_KEYWORDS:                           Writing Testsuites.  (line 142)
* AT_PACKAGE_BUGREPORT:                  Making testsuite Scripts.
                                                              (line  12)
* AT_PACKAGE_NAME:                       Making testsuite Scripts.
                                                              (line  12)
* AT_PACKAGE_STRING:                     Making testsuite Scripts.
                                                              (line  12)
* AT_PACKAGE_TARNAME:                    Making testsuite Scripts.
                                                              (line  12)
* AT_PACKAGE_URL:                        Making testsuite Scripts.
                                                              (line  12)
* AT_PACKAGE_VERSION:                    Making testsuite Scripts.
                                                              (line  12)
* AT_SETUP:                              Writing Testsuites.  (line 134)
* AT_SKIP_IF:                            Writing Testsuites.  (line 175)
* AT_TESTED:                             Writing Testsuites.  (line 109)
* AT_XFAIL_IF:                           Writing Testsuites.  (line 190)


File: autoconf.info,  Node: Program & Function Index,  Next: Concept Index,  Prev: Autotest Macro Index,  Up: Indices

B.8 Program and Function Index
==============================

This is an alphabetical list of the programs and functions whose
portability is discussed in this document.

 [index ]
* Menu:

* !:                                     Limitations of Builtins.
                                                              (line  41)
* .:                                     Limitations of Builtins.
                                                              (line  17)
* /usr/bin/ksh on Solaris:               Shellology.          (line  63)
* /usr/dt/bin/dtksh on Solaris:          Shellology.          (line  66)
* /usr/xpg4/bin/sh on Solaris:           Shellology.          (line  64)
* alloca:                                Particular Functions.
                                                              (line  10)
* alloca.h:                              Particular Functions.
                                                              (line  10)
* assert.h:                              Particular Headers.  (line  20)
* awk:                                   Limitations of Usual Tools.
                                                              (line  10)
* basename:                              Limitations of Usual Tools.
                                                              (line 142)
* break:                                 Limitations of Builtins.
                                                              (line 107)
* case:                                  Limitations of Builtins.
                                                              (line 110)
* cat:                                   Limitations of Usual Tools.
                                                              (line 146)
* cc:                                    Limitations of Usual Tools.
                                                              (line 149)
* cd:                                    Limitations of Builtins.
                                                              (line 203)
* chgrp:                                 Limitations of Usual Tools.
                                                              (line 183)
* chmod:                                 Limitations of Usual Tools.
                                                              (line 187)
* chown <1>:                             Limitations of Usual Tools.
                                                              (line 183)
* chown:                                 Particular Functions.
                                                              (line  63)
* closedir:                              Particular Functions.
                                                              (line  69)
* cmp:                                   Limitations of Usual Tools.
                                                              (line 197)
* cp:                                    Limitations of Usual Tools.
                                                              (line 204)
* ctype.h:                               Particular Headers.  (line 135)
* date:                                  Limitations of Usual Tools.
                                                              (line 264)
* diff:                                  Limitations of Usual Tools.
                                                              (line 274)
* dirent.h:                              Particular Headers.  (line  25)
* dirname:                               Limitations of Usual Tools.
                                                              (line 280)
* echo:                                  Limitations of Builtins.
                                                              (line 233)
* egrep:                                 Limitations of Usual Tools.
                                                              (line 287)
* error_at_line:                         Particular Functions.
                                                              (line  84)
* eval:                                  Limitations of Builtins.
                                                              (line 270)
* exec:                                  Limitations of Builtins.
                                                              (line 315)
* exit <1>:                              Limitations of Builtins.
                                                              (line 355)
* exit:                                  Function Portability.
                                                              (line  17)
* export:                                Limitations of Builtins.
                                                              (line 380)
* expr:                                  Limitations of Usual Tools.
                                                              (line 312)
* expr (|):                              Limitations of Usual Tools.
                                                              (line 326)
* false:                                 Limitations of Builtins.
                                                              (line 428)
* fgrep:                                 Limitations of Usual Tools.
                                                              (line 435)
* find:                                  Limitations of Usual Tools.
                                                              (line 444)
* float.h:                               Particular Headers.  (line 135)
* fnmatch:                               Particular Functions.
                                                              (line  94)
* fnmatch.h:                             Particular Functions.
                                                              (line 452)
* for:                                   Limitations of Builtins.
                                                              (line 432)
* fork:                                  Particular Functions.
                                                              (line 120)
* free:                                  Function Portability.
                                                              (line  27)
* fseeko:                                Particular Functions.
                                                              (line 147)
* ftello:                                Particular Functions.
                                                              (line 147)
* getgroups:                             Particular Functions.
                                                              (line 155)
* getloadavg:                            Particular Functions.
                                                              (line 161)
* getmntent:                             Particular Functions.
                                                              (line 195)
* getpgid:                               Particular Functions.
                                                              (line 205)
* getpgrp:                               Particular Functions.
                                                              (line 205)
* grep:                                  Limitations of Usual Tools.
                                                              (line 458)
* if:                                    Limitations of Builtins.
                                                              (line 477)
* inttypes.h <1>:                        Particular Types.    (line   6)
* inttypes.h:                            Header Portability.  (line  20)
* isinf:                                 Function Portability.
                                                              (line  32)
* isnan:                                 Function Portability.
                                                              (line  32)
* join:                                  Limitations of Usual Tools.
                                                              (line 526)
* ksh:                                   Shellology.          (line  57)
* ksh88:                                 Shellology.          (line  57)
* ksh93:                                 Shellology.          (line  57)
* linux/irda.h:                          Header Portability.  (line  27)
* linux/random.h:                        Header Portability.  (line  30)
* ln:                                    Limitations of Usual Tools.
                                                              (line 543)
* ls:                                    Limitations of Usual Tools.
                                                              (line 555)
* lstat:                                 Particular Functions.
                                                              (line 228)
* make:                                  Portable Make.       (line   6)
* malloc <1>:                            Particular Functions.
                                                              (line 247)
* malloc:                                Function Portability.
                                                              (line  82)
* mbrtowc:                               Particular Functions.
                                                              (line 279)
* memcmp:                                Particular Functions.
                                                              (line 286)
* mkdir:                                 Limitations of Usual Tools.
                                                              (line 577)
* mkfifo:                                Limitations of Usual Tools.
                                                              (line 611)
* mknod:                                 Limitations of Usual Tools.
                                                              (line 611)
* mktemp:                                Limitations of Usual Tools.
                                                              (line 621)
* mktime:                                Particular Functions.
                                                              (line 299)
* mmap:                                  Particular Functions.
                                                              (line 311)
* mv:                                    Limitations of Usual Tools.
                                                              (line 646)
* ndir.h:                                Particular Headers.  (line  25)
* net/if.h:                              Header Portability.  (line  33)
* netinet/if_ether.h:                    Header Portability.  (line  53)
* nlist.h:                               Particular Functions.
                                                              (line 178)
* od:                                    Limitations of Usual Tools.
                                                              (line 678)
* pdksh:                                 Shellology.          (line  77)
* printf:                                Limitations of Builtins.
                                                              (line 516)
* putenv:                                Function Portability.
                                                              (line  89)
* pwd:                                   Limitations of Builtins.
                                                              (line 543)
* read:                                  Limitations of Builtins.
                                                              (line 574)
* realloc <1>:                           Particular Functions.
                                                              (line 326)
* realloc:                               Function Portability.
                                                              (line 105)
* resolv.h:                              Particular Headers.  (line  73)
* rm:                                    Limitations of Usual Tools.
                                                              (line 687)
* rmdir:                                 Limitations of Usual Tools.
                                                              (line 706)
* sed:                                   Limitations of Usual Tools.
                                                              (line 710)
* sed (t):                               Limitations of Usual Tools.
                                                              (line 905)
* select:                                Particular Functions.
                                                              (line 337)
* set:                                   Limitations of Builtins.
                                                              (line 580)
* setpgrp:                               Particular Functions.
                                                              (line 348)
* setvbuf:                               Obsolete Macros.     (line 208)
* shift:                                 Limitations of Builtins.
                                                              (line 732)
* sigaction:                             Function Portability.
                                                              (line 110)
* signal:                                Function Portability.
                                                              (line 110)
* signal.h:                              Obsolete Macros.     (line 662)
* sleep:                                 Limitations of Usual Tools.
                                                              (line 965)
* snprintf:                              Function Portability.
                                                              (line 124)
* sort:                                  Limitations of Usual Tools.
                                                              (line 971)
* source:                                Limitations of Builtins.
                                                              (line 740)
* sprintf:                               Function Portability.
                                                              (line 135)
* sscanf:                                Function Portability.
                                                              (line 141)
* stat:                                  Particular Functions.
                                                              (line 363)
* stdarg.h:                              Particular Headers.  (line 135)
* stdbool.h:                             Particular Headers.  (line  10)
* stdint.h <1>:                          Particular Types.    (line   6)
* stdint.h:                              Header Portability.  (line  20)
* stdlib.h <1>:                          Particular Types.    (line   6)
* stdlib.h <2>:                          Particular Headers.  (line 135)
* stdlib.h:                              Header Portability.  (line  76)
* strcoll:                               Particular Functions.
                                                              (line 379)
* strerror_r <1>:                        Particular Functions.
                                                              (line 388)
* strerror_r:                            Function Portability.
                                                              (line 149)
* strftime:                              Particular Functions.
                                                              (line 401)
* string.h:                              Particular Headers.  (line 135)
* strings.h:                             Particular Headers.  (line 154)
* strnlen <1>:                           Particular Functions.
                                                              (line 426)
* strnlen:                               Function Portability.
                                                              (line 155)
* strtod:                                Particular Functions.
                                                              (line 408)
* strtold:                               Particular Functions.
                                                              (line 420)
* sys/dir.h:                             Particular Headers.  (line  25)
* sys/ioctl.h:                           Particular Headers.  (line 270)
* sys/mkdev.h:                           Particular Headers.  (line  68)
* sys/mount.h:                           Header Portability.  (line  79)
* sys/ndir.h:                            Particular Headers.  (line  25)
* sys/ptem.h:                            Header Portability.  (line  83)
* sys/socket.h:                          Header Portability.  (line  86)
* sys/stat.h:                            Particular Headers.  (line  92)
* sys/sysmacros.h:                       Particular Headers.  (line  68)
* sys/time.h <1>:                        Particular Structures.
                                                              (line  35)
* sys/time.h:                            Particular Headers.  (line 244)
* sys/types.h:                           Particular Types.    (line   6)
* sys/ucred.h:                           Header Portability.  (line  89)
* sys/wait.h:                            Particular Headers.  (line 204)
* sysconf:                               Function Portability.
                                                              (line 170)
* tar:                                   Limitations of Usual Tools.
                                                              (line 976)
* termios.h:                             Particular Headers.  (line 270)
* test:                                  Limitations of Builtins.
                                                              (line 744)
* time.h <1>:                            Particular Structures.
                                                              (line  35)
* time.h:                                Particular Headers.  (line 244)
* touch:                                 Limitations of Usual Tools.
                                                              (line 981)
* tr:                                    Limitations of Usual Tools.
                                                              (line 994)
* trap:                                  Limitations of Builtins.
                                                              (line 856)
* true:                                  Limitations of Builtins.
                                                              (line 930)
* unistd.h:                              Particular Headers.  (line 228)
* unlink:                                Function Portability.
                                                              (line 174)
* unset:                                 Limitations of Builtins.
                                                              (line 946)
* unsetenv:                              Function Portability.
                                                              (line 180)
* utime:                                 Particular Functions.
                                                              (line 433)
* va_copy:                               Function Portability.
                                                              (line 185)
* va_list:                               Function Portability.
                                                              (line 192)
* vfork:                                 Particular Functions.
                                                              (line 120)
* vfork.h:                               Particular Functions.
                                                              (line 120)
* vprintf:                               Particular Functions.
                                                              (line 443)
* vsnprintf:                             Function Portability.
                                                              (line 124)
* vsprintf <1>:                          Particular Functions.
                                                              (line 443)
* vsprintf:                              Function Portability.
                                                              (line 135)
* wait:                                  Limitations of Builtins.
                                                              (line 973)
* wait3:                                 Obsolete Macros.     (line 216)
* wchar.h:                               Particular Types.    (line  88)
* X11/extensions/scrnsaver.h:            Header Portability.  (line  92)
* {...}:                                 Limitations of Builtins.
                                                              (line  74)


File: autoconf.info,  Node: Concept Index,  Prev: Program & Function Index,  Up: Indices

B.9 Concept Index
=================

This is an alphabetical list of the files, tools, and concepts
introduced in this document.

 [index ]
* Menu:

* "$@":                                  Shell Substitutions. (line  70)
* $((EXPRESSION)):                       Shell Substitutions. (line 456)
* $(COMMANDS):                           Shell Substitutions. (line 423)
* $<, explicit rules, and VPATH:         $< in Explicit Rules.
                                                              (line   6)
* ${#VAR}:                               Shell Substitutions. (line 369)
* ${VAR##WORD}:                          Shell Substitutions. (line 369)
* ${VAR#WORD}:                           Shell Substitutions. (line 369)
* ${VAR%%WORD}:                          Shell Substitutions. (line 369)
* ${VAR%WORD}:                           Shell Substitutions. (line 369)
* ${VAR+VALUE}:                          Shell Substitutions. (line 148)
* ${VAR-VALUE}:                          Shell Substitutions. (line 140)
* ${VAR=EXPANDED-VALUE}:                 Shell Substitutions. (line 319)
* ${VAR=LITERAL}:                        Shell Substitutions. (line 295)
* ${VAR=VALUE}:                          Shell Substitutions. (line 215)
* 64-bit libraries:                      Site Defaults.       (line  97)
* @&t@:                                  Quadrigraphs.        (line   6)
* @S|@:                                  Quadrigraphs.        (line   6)
* ^ quoting:                             Shell Substitutions. (line 496)
* _m4_divert_diversion:                  New Macros.          (line   6)
* `COMMANDS`:                            Shell Substitutions. (line 377)
* abs_builddir:                          Preset Output Variables.
                                                              (line 177)
* abs_srcdir:                            Preset Output Variables.
                                                              (line 199)
* abs_top_builddir:                      Preset Output Variables.
                                                              (line 192)
* abs_top_srcdir:                        Preset Output Variables.
                                                              (line 206)
* absolute file names, detect:           File System Conventions.
                                                              (line  52)
* ac_objext:                             Generic Functions.   (line  59)
* ac_path_VARIABLE:                      Generic Programs.    (line 123)
* ac_path_VARIABLE_found:                Generic Programs.    (line 123)
* ac_srcdir:                             Configuration Actions.
                                                              (line  85)
* ac_top_build_prefix:                   Configuration Actions.
                                                              (line  80)
* ac_top_srcdir:                         Configuration Actions.
                                                              (line  76)
* acconfig.h:                            acconfig Header.     (line   6)
* aclocal.m4:                            Making configure Scripts.
                                                              (line   6)
* Ash:                                   Shellology.          (line  16)
* at_arg_OPTION:                         Writing Testsuites.  (line  50)
* at_optarg:                             Writing Testsuites.  (line  62)
* at_optarg_OPTION:                      Writing Testsuites.  (line  62)
* at_status:                             Writing Testsuites.  (line 212)
* autoconf:                              autoconf Invocation. (line   6)
* Autoconf upgrading <1>:                Autoconf 2.13.       (line   6)
* Autoconf upgrading:                    Autoconf 1.          (line   6)
* Autoconf version:                      Versioning.          (line   6)
* autoheader:                            autoheader Invocation.
                                                              (line   6)
* Autoheader macros:                     Autoheader Macros.   (line   6)
* autom4te debugging tips:               Debugging via autom4te.
                                                              (line   6)
* Autom4te Library:                      autom4te Invocation. (line 225)
* autom4te.cache:                        autom4te Invocation. (line 130)
* autom4te.cfg:                          autom4te Invocation. (line 258)
* Automake:                              Automake.            (line  19)
* Automatic remaking:                    Automatic Remaking.  (line   6)
* automatic rule rewriting and VPATH:    Automatic Rule Rewriting.
                                                              (line   6)
* autopoint:                             autoreconf Invocation.
                                                              (line  30)
* autoreconf:                            autoreconf Invocation.
                                                              (line   6)
* autoscan:                              autoscan Invocation. (line   6)
* Autotest:                              Using Autotest.      (line   6)
* AUTOTEST_PATH:                         testsuite Invocation.
                                                              (line  60)
* autoupdate:                            autoupdate Invocation.
                                                              (line   6)
* Back trace <1>:                        autom4te Invocation. (line  86)
* Back trace:                            autoconf Invocation. (line  86)
* balancing parentheses:                 Balancing Parentheses.
                                                              (line   6)
* Bash:                                  Shellology.          (line  43)
* Bash 2.05 and later:                   Shellology.          (line  49)
* bindir:                                Installation Directory Variables.
                                                              (line  15)
* Bootstrap:                             Bootstrapping.       (line   6)
* BSD make and obj/:                     obj/ and Make.       (line   6)
* buffer overruns:                       Buffer Overruns.     (line   6)
* Build directories:                     Build Directories.   (line   6)
* builddir:                              Preset Output Variables.
                                                              (line 174)
* C function portability:                Function Portability.
                                                              (line   6)
* C types:                               Types.               (line   6)
* Cache:                                 Caching Results.     (line   6)
* Cache variable:                        Cache Variable Names.
                                                              (line   6)
* Cache, enabling:                       configure Invocation.
                                                              (line  25)
* Canonical system type:                 Canonicalizing.      (line   6)
* carriage return, deleting:             Limitations of Usual Tools.
                                                              (line 994)
* CFLAGS:                                Preset Output Variables.
                                                              (line  23)
* changequote:                           Changequote is Evil. (line   6)
* Coding style:                          Coding Style.        (line   6)
* Command Substitution:                  Shell Substitutions. (line 377)
* command-line, macros set on:           Command-line Macros and whitespace.
                                                              (line   6)
* Commands for configuration:            Configuration Commands.
                                                              (line   6)
* Comments in Makefile macros:           Comments in Make Macros.
                                                              (line   6)
* Comments in Makefile rules:            Comments in Make Rules.
                                                              (line   6)
* Common autoconf behavior:              Common Behavior.     (line   6)
* Compilers:                             Compilers and Preprocessors.
                                                              (line   6)
* composing variable names:              Polymorphic Variables.
                                                              (line 131)
* config.h:                              Configuration Headers.
                                                              (line   6)
* config.h.bot:                          acconfig Header.     (line   6)
* config.h.in:                           Header Templates.    (line   6)
* config.h.top:                          acconfig Header.     (line   6)
* config.site:                           Site Defaults.       (line   6)
* config.status:                         config.status Invocation.
                                                              (line   6)
* config.sub:                            Specifying Target Triplets.
                                                              (line  59)
* CONFIG_COMMANDS:                       Obsolete config.status Use.
                                                              (line  11)
* CONFIG_FILES:                          Obsolete config.status Use.
                                                              (line  15)
* CONFIG_HEADERS:                        Obsolete config.status Use.
                                                              (line  20)
* CONFIG_LINKS:                          Obsolete config.status Use.
                                                              (line  25)
* CONFIG_SHELL:                          config.status Invocation.
                                                              (line 102)
* CONFIG_STATUS:                         config.status Invocation.
                                                              (line 108)
* Configuration actions:                 Configuration Actions.
                                                              (line   6)
* Configuration commands:                Configuration Commands.
                                                              (line   6)
* Configuration file creation:           Configuration Files. (line   6)
* Configuration Header:                  Configuration Headers.
                                                              (line   6)
* Configuration Header Template:         Header Templates.    (line   6)
* Configuration links:                   Configuration Links. (line   6)
* configure <1>:                         Running configure Scripts.
                                                              (line   6)
* configure:                             Making configure Scripts.
                                                              (line   6)
* Configure subdirectories:              Subdirectories.      (line   6)
* configure.ac:                          Making configure Scripts.
                                                              (line  27)
* configure.in:                          Making configure Scripts.
                                                              (line  27)
* configure_input:                       Preset Output Variables.
                                                              (line  58)
* Copyright Notice <1>:                  Writing Testsuites.  (line  41)
* Copyright Notice:                      Notices.             (line  10)
* CPPFLAGS:                              Preset Output Variables.
                                                              (line  72)
* Creating configuration files:          Configuration Files. (line   6)
* Creating temporary files:              Limitations of Usual Tools.
                                                              (line 621)
* Cross compilation:                     Hosts and Cross-Compilation.
                                                              (line   6)
* CXXFLAGS:                              Preset Output Variables.
                                                              (line  94)
* Darwin:                                Systemology.         (line  23)
* Data structure, set:                   Set manipulation Macros.
                                                              (line   6)
* datadir:                               Installation Directory Variables.
                                                              (line  18)
* datarootdir <1>:                       Changed Directory Variables.
                                                              (line   6)
* datarootdir:                           Installation Directory Variables.
                                                              (line  22)
* debugging tips:                        Debugging via autom4te.
                                                              (line   6)
* Declaration, checking:                 Declarations.        (line   6)
* Default includes:                      Default Includes.    (line   6)
* DEFS:                                  Preset Output Variables.
                                                              (line  98)
* deleting carriage return:              Limitations of Usual Tools.
                                                              (line 994)
* Dependencies between macros:           Dependencies Between Macros.
                                                              (line   6)
* Descriptors:                           File Descriptors.    (line   6)
* descriptors:                           File Descriptor Macros.
                                                              (line   6)
* Directories, build:                    Build Directories.   (line   6)
* Directories, installation:             Installation Directory Variables.
                                                              (line   6)
* division, integer:                     Signed Integer Division.
                                                              (line   6)
* dnl <1>:                               Coding Style.        (line  42)
* dnl:                                   Macro Definitions.   (line  51)
* docdir:                                Installation Directory Variables.
                                                              (line  26)
* double-colon rules and VPATH:          VPATH and Double-colon.
                                                              (line   6)
* dvidir:                                Installation Directory Variables.
                                                              (line  30)
* ECHO_C:                                Preset Output Variables.
                                                              (line 106)
* ECHO_N:                                Preset Output Variables.
                                                              (line 107)
* ECHO_T:                                Preset Output Variables.
                                                              (line 108)
* Endianness:                            C Compiler.          (line 184)
* environment, macros set from:          Command-line Macros and whitespace.
                                                              (line   6)
* Erlang:                                Erlang Compiler and Interpreter.
                                                              (line   6)
* Erlang, Library, checking:             Erlang Libraries.    (line   6)
* ERLANG_INSTALL_LIB_DIR:                Installation Directory Variables.
                                                              (line 201)
* ERLANG_INSTALL_LIB_DIR_:               Installation Directory Variables.
                                                              (line 206)
* ERLCFLAGS:                             Preset Output Variables.
                                                              (line 120)
* exec_prefix:                           Installation Directory Variables.
                                                              (line  33)
* exiting portably:                      Exiting Portably.    (line   6)
* expanded before required:              Expanded Before Required.
                                                              (line   6)
* explicit rules, $<, and VPATH:         $< in Explicit Rules.
                                                              (line   6)
* External software:                     External Software.   (line   6)
* F77:                                   Fortran Compiler.    (line   6)
* FCFLAGS:                               Preset Output Variables.
                                                              (line 126)
* FFLAGS:                                Preset Output Variables.
                                                              (line 133)
* FHS:                                   Site Defaults.       (line  83)
* File descriptors:                      File Descriptors.    (line   6)
* file descriptors:                      File Descriptor Macros.
                                                              (line   6)
* File system conventions:               File System Conventions.
                                                              (line   6)
* File, checking:                        Files.               (line   6)
* Filesystem Hierarchy Standard:         Site Defaults.       (line  83)
* floating point:                        Floating Point Portability.
                                                              (line   6)
* Forbidden patterns:                    Forbidden Patterns.  (line   6)
* Fortran:                               Fortran Compiler.    (line   6)
* Function, checking:                    Particular Functions.
                                                              (line   6)
* Gettext:                               autoreconf Invocation.
                                                              (line  30)
* GNU build system:                      The GNU Build System.
                                                              (line   6)
* Gnulib:                                Gnulib.              (line  11)
* Go:                                    Go Compiler.         (line   6)
* GOFLAGS:                               Preset Output Variables.
                                                              (line 170)
* Header portability:                    Header Portability.  (line   6)
* Header templates:                      Header Templates.    (line   6)
* Header, checking:                      Header Files.        (line   6)
* Help strings:                          Pretty Help Strings. (line   6)
* Here-documents:                        Here-Documents.      (line   6)
* History of autoconf:                   History.             (line   6)
* htmldir:                               Installation Directory Variables.
                                                              (line  40)
* ifnames:                               ifnames Invocation.  (line   6)
* Imake:                                 Why Not Imake.       (line   6)
* includedir:                            Installation Directory Variables.
                                                              (line  43)
* Includes, default:                     Default Includes.    (line   6)
* indirection, variable name:            Polymorphic Variables.
                                                              (line   6)
* infodir:                               Installation Directory Variables.
                                                              (line  46)
* input:                                 File Descriptor Macros.
                                                              (line   6)
* Install prefix:                        Default Prefix.      (line   6)
* Installation directories:              Installation Directory Variables.
                                                              (line   6)
* Instantiation:                         Output.              (line  13)
* integer overflow <1>:                  Signed Overflow Advice.
                                                              (line   6)
* integer overflow <2>:                  Signed Overflow Examples.
                                                              (line   6)
* integer overflow <3>:                  Integer Overflow Basics.
                                                              (line   6)
* integer overflow:                      Integer Overflow.    (line   6)
* Introduction:                          Introduction.        (line   6)
* invoking the shell:                    Invoking the Shell.  (line   6)
* Korn shell:                            Shellology.          (line  57)
* Ksh:                                   Shellology.          (line  57)
* Language:                              Language Choice.     (line   6)
* Large file support:                    System Services.     (line  49)
* LDFLAGS:                               Preset Output Variables.
                                                              (line 140)
* LFS:                                   System Services.     (line  49)
* lib64:                                 Site Defaults.       (line  97)
* libdir:                                Installation Directory Variables.
                                                              (line  49)
* libexecdir:                            Installation Directory Variables.
                                                              (line  52)
* Library, checking:                     Libraries.           (line   6)
* LIBS:                                  Preset Output Variables.
                                                              (line 154)
* Libtool:                               Libtool.             (line  14)
* License:                               Distributing.        (line   6)
* Limitations of make:                   Portable Make.       (line   6)
* Limitations of shell builtins:         Limitations of Builtins.
                                                              (line   6)
* Limitations of usual tools:            Limitations of Usual Tools.
                                                              (line   6)
* Links:                                 Configuration Links. (line  12)
* Links for configuration:               Configuration Links. (line   6)
* Listing directories:                   Limitations of Usual Tools.
                                                              (line 555)
* localedir:                             Installation Directory Variables.
                                                              (line  55)
* localstatedir:                         Installation Directory Variables.
                                                              (line  60)
* loop induction:                        Optimization and Wraparound.
                                                              (line   6)
* low-level output:                      File Descriptor Macros.
                                                              (line   6)
* M4:                                    Programming in M4.   (line   6)
* M4 quotation:                          M4 Quotation.        (line   6)
* M4sugar:                               Programming in M4sugar.
                                                              (line   6)
* m4sugar debugging tips:                Debugging via autom4te.
                                                              (line   6)
* Macro invocation stack <1>:            autom4te Invocation. (line  86)
* Macro invocation stack:                autoconf Invocation. (line  86)
* Macros, called once:                   One-Shot Macros.     (line   6)
* Macros, obsoleting:                    Obsoleting Macros.   (line   6)
* Macros, ordering:                      Suggested Ordering.  (line   6)
* Macros, prerequisites:                 Prerequisite Macros. (line   6)
* make -k:                               make -k Status.      (line   6)
* make and MAKEFLAGS:                    The Make Macro MAKEFLAGS.
                                                              (line   6)
* make and SHELL:                        The Make Macro SHELL.
                                                              (line   6)
* Makefile macros and comments:          Comments in Make Macros.
                                                              (line   6)
* Makefile macros and whitespace:        Trailing whitespace in Make Macros.
                                                              (line   6)
* Makefile rules and comments:           Comments in Make Rules.
                                                              (line   6)
* Makefile rules and newlines:           Newlines in Make Rules.
                                                              (line   6)
* Makefile substitutions:                Makefile Substitutions.
                                                              (line   6)
* MAKEFLAGS and make:                    The Make Macro MAKEFLAGS.
                                                              (line   6)
* Making directories:                    Limitations of Usual Tools.
                                                              (line 577)
* mandir:                                Installation Directory Variables.
                                                              (line  63)
* Messages, from autoconf:               Reporting Messages.  (line   6)
* Messages, from configure:              Printing Messages.   (line   6)
* Messages, from M4sugar:                Diagnostic Macros.   (line   6)
* Moving open files:                     Limitations of Usual Tools.
                                                              (line 646)
* newline, deleting:                     Limitations of Usual Tools.
                                                              (line 994)
* Newlines in Makefile rules:            Newlines in Make Rules.
                                                              (line   6)
* Notices in configure:                  Notices.             (line   6)
* null pointers:                         Null Pointers.       (line   6)
* obj/, subdirectory:                    obj/ and Make.       (line   6)
* OBJCFLAGS:                             Preset Output Variables.
                                                              (line 162)
* OBJCXXFLAGS:                           Preset Output Variables.
                                                              (line 166)
* Obsolete constructs:                   Obsolete Constructs. (line   6)
* Obsoleting macros:                     Obsoleting Macros.   (line   6)
* obstack:                               Particular Functions.
                                                              (line 319)
* oldincludedir:                         Installation Directory Variables.
                                                              (line  66)
* One-shot macros:                       One-Shot Macros.     (line   6)
* Options, Package:                      Option Checking.     (line   6)
* Options, package:                      Package Options.     (line   6)
* Ordering macros:                       Suggested Ordering.  (line   6)
* Output variables <1>:                  Setting Output Variables.
                                                              (line   6)
* Output variables:                      Preset Output Variables.
                                                              (line   6)
* Output variables, special characters in: Special Chars in Variables.
                                                              (line   6)
* output, low-level:                     File Descriptor Macros.
                                                              (line   6)
* Outputting files:                      Output.              (line   6)
* overflow, signed integer <1>:          Signed Overflow Advice.
                                                              (line   6)
* overflow, signed integer <2>:          Signed Overflow Examples.
                                                              (line   6)
* overflow, signed integer <3>:          Integer Overflow Basics.
                                                              (line   6)
* overflow, signed integer:              Integer Overflow.    (line   6)
* Package options:                       Package Options.     (line   6)
* package.m4:                            Making testsuite Scripts.
                                                              (line  12)
* Parallel make:                         Parallel Make.       (line   6)
* parentheses, balancing:                Balancing Parentheses.
                                                              (line   6)
* Patterns, forbidden:                   Forbidden Patterns.  (line   6)
* pdfdir:                                Installation Directory Variables.
                                                              (line  69)
* polymorphic variable name:             Polymorphic Variables.
                                                              (line   6)
* portability:                           Varieties of Unportability.
                                                              (line   6)
* Portability of C functions:            Function Portability.
                                                              (line   6)
* Portability of headers:                Header Portability.  (line   6)
* Portable C and C++ programming:        Portable C and C++.  (line   6)
* Portable shell programming:            Portable Shell.      (line   6)
* positional parameters:                 Shell Substitutions. (line 121)
* Posix termios headers:                 System Services.     (line  75)
* Precious Variable:                     Setting Output Variables.
                                                              (line  65)
* prefix:                                Installation Directory Variables.
                                                              (line  72)
* Prefix for install:                    Default Prefix.      (line   6)
* preprocessor arithmetic:               Preprocessor Arithmetic.
                                                              (line   6)
* Preprocessors:                         Compilers and Preprocessors.
                                                              (line   6)
* prerequisite directories and VPATH:    Tru64 Directory Magic.
                                                              (line   6)
* Prerequisite macros:                   Prerequisite Macros. (line   6)
* Program names, transforming:           Transforming Names.  (line   6)
* Programs, checking:                    Alternative Programs.
                                                              (line   6)
* psdir:                                 Installation Directory Variables.
                                                              (line  77)
* QNX 4.25:                              Systemology.         (line  37)
* quadrigraphs:                          Quadrigraphs.        (line   6)
* quotation <1>:                         M4 Quotation.        (line   6)
* quotation:                             Autoconf Language.   (line   6)
* Remaking automatically:                Automatic Remaking.  (line   6)
* Revision:                              Notices.             (line  18)
* Rule, Single Suffix Inference:         Single Suffix Rules. (line   6)
* sbindir:                               Installation Directory Variables.
                                                              (line  80)
* Separated Dependencies:                Single Suffix Rules. (line   9)
* set -b:                                Limitations of Builtins.
                                                              (line 689)
* set -e:                                Limitations of Builtins.
                                                              (line 605)
* set -m:                                Limitations of Builtins.
                                                              (line 689)
* set -n:                                Limitations of Builtins.
                                                              (line 713)
* Set manipulation:                      Set manipulation Macros.
                                                              (line   6)
* sharedstatedir:                        Installation Directory Variables.
                                                              (line  84)
* SHELL and make:                        The Make Macro SHELL.
                                                              (line   6)
* Shell assignments:                     Assignments.         (line   6)
* Shell builtins:                        Limitations of Builtins.
                                                              (line   6)
* Shell file descriptors:                File Descriptors.    (line   6)
* Shell Functions:                       Shell Functions.     (line   6)
* Shell here-documents:                  Here-Documents.      (line   6)
* shell invocation:                      Invoking the Shell.  (line   6)
* Shell parentheses:                     Parentheses.         (line   6)
* Shell pattern matching:                Shell Pattern Matching.
                                                              (line   6)
* Shell slashes:                         Slashes.             (line   6)
* Shell substitutions:                   Shell Substitutions. (line   6)
* Shell variables:                       Special Shell Variables.
                                                              (line   6)
* Shellology:                            Shellology.          (line   6)
* Signal handling in the shell:          Signal Handling.     (line   6)
* Signals, shells and:                   Signal Handling.     (line   6)
* signed integer overflow <1>:           Signed Overflow Advice.
                                                              (line   6)
* signed integer overflow <2>:           Signed Overflow Examples.
                                                              (line   6)
* signed integer overflow <3>:           Integer Overflow Basics.
                                                              (line   6)
* signed integer overflow:               Integer Overflow.    (line   6)
* Single Suffix Inference Rule:          Single Suffix Rules. (line   6)
* Site defaults:                         Site Defaults.       (line   6)
* Site details:                          Site Details.        (line   6)
* Special shell variables:               Special Shell Variables.
                                                              (line   6)
* srcdir <1>:                            Preset Output Variables.
                                                              (line 195)
* srcdir:                                Configuration Actions.
                                                              (line  71)
* standard input:                        File Descriptor Macros.
                                                              (line   6)
* Standard symbols:                      Standard Symbols.    (line   6)
* Structure, checking:                   Structures.          (line   6)
* Subdirectory configure:                Subdirectories.      (line   6)
* Substitutions in makefiles:            Makefile Substitutions.
                                                              (line   6)
* Symbolic links:                        Limitations of Usual Tools.
                                                              (line 543)
* sysconfdir:                            Installation Directory Variables.
                                                              (line  88)
* System type <1>:                       Canonicalizing.      (line   6)
* System type:                           Specifying Target Triplets.
                                                              (line   6)
* Systemology:                           Systemology.         (line   6)
* Target triplet:                        Specifying Target Triplets.
                                                              (line   6)
* termios Posix headers:                 System Services.     (line  75)
* test group:                            testsuite Scripts.   (line  12)
* testsuite <1>:                         testsuite Invocation.
                                                              (line   6)
* testsuite:                             testsuite Scripts.   (line   6)
* timestamp resolution <1>:              Timestamps and Make. (line   6)
* timestamp resolution:                  Limitations of Usual Tools.
                                                              (line 226)
* tmp:                                   Configuration Actions.
                                                              (line  89)
* top_build_prefix:                      Preset Output Variables.
                                                              (line 184)
* top_builddir:                          Preset Output Variables.
                                                              (line 180)
* top_srcdir:                            Preset Output Variables.
                                                              (line 202)
* Transforming program names:            Transforming Names.  (line   6)
* Tru64:                                 Systemology.         (line  44)
* Types:                                 Types.               (line   6)
* unbalanced parentheses, managing:      Balancing Parentheses.
                                                              (line   6)
* undefined macro:                       New Macros.          (line   6)
* Unix version 7:                        Systemology.         (line  49)
* Unordered set manipulation:            Set manipulation Macros.
                                                              (line   6)
* Upgrading autoconf <1>:                Autoconf 2.13.       (line   6)
* Upgrading autoconf:                    Autoconf 1.          (line   6)
* V7:                                    Systemology.         (line  49)
* variable name indirection:             Polymorphic Variables.
                                                              (line   6)
* variable names, composing:             Polymorphic Variables.
                                                              (line 131)
* Variable, Precious:                    Setting Output Variables.
                                                              (line  65)
* variables and VPATH:                   Variables listed in VPATH.
                                                              (line   6)
* Version:                               Versioning.          (line  11)
* version, Autoconf:                     Versioning.          (line   6)
* volatile objects:                      Volatile Objects.    (line   6)
* VPATH:                                 VPATH and Make.      (line   6)
* VPATH and automatic rule rewriting:    Automatic Rule Rewriting.
                                                              (line   6)
* VPATH and double-colon rules:          VPATH and Double-colon.
                                                              (line   6)
* VPATH and prerequisite directories:    Tru64 Directory Magic.
                                                              (line   6)
* VPATH and variables:                   Variables listed in VPATH.
                                                              (line   6)
* VPATH, explicit rules, and $<:         $< in Explicit Rules.
                                                              (line   6)
* VPATH, resolving target pathnames:     Make Target Lookup.  (line   6)
* whitespace in command-line macros:     Command-line Macros and whitespace.
                                                              (line   6)
* whitespace in Makefile macros:         Trailing whitespace in Make Macros.
                                                              (line   6)
* wraparound arithmetic <1>:             Signed Overflow Advice.
                                                              (line   6)
* wraparound arithmetic <2>:             Signed Overflow Examples.
                                                              (line   6)
* wraparound arithmetic <3>:             Integer Overflow Basics.
                                                              (line   6)
* wraparound arithmetic:                 Integer Overflow.    (line   6)
* X Window System:                       System Services.     (line  10)
* Zsh:                                   Shellology.          (line  87)



Tag Table:
Node: Top1954
Node: Introduction21371
Node: The GNU Build System27935
Node: Automake28914
Node: Gnulib30863
Node: Libtool32172
Node: Pointers33594
Ref: Pointers-Footnote-134895
Node: Making configure Scripts35055
Node: Writing Autoconf Input38404
Node: Shell Script Compiler39867
Node: Autoconf Language42228
Node: Autoconf Input Layout49397
Node: autoscan Invocation50805
Node: ifnames Invocation53361
Node: autoconf Invocation54561
Node: autoreconf Invocation59846
Node: Setup64607
Node: Initializing configure65929
Ref: AC_INIT66434
Node: Versioning69318
Node: Notices71179
Node: Input72354
Ref: AC_CONFIG_SRCDIR72495
Node: Output75442
Ref: AC_OUTPUT75877
Ref: AC_PROG_MAKE_SET77495
Node: Configuration Actions77920
Node: Configuration Files83208
Ref: AC_CONFIG_FILES83469
Node: Makefile Substitutions84688
Node: Preset Output Variables86431
Node: Installation Directory Variables95945
Node: Changed Directory Variables103793
Node: Build Directories106387
Node: Automatic Remaking108242
Node: Configuration Headers110410
Node: Header Templates113712
Node: autoheader Invocation116447
Node: Autoheader Macros120089
Node: Configuration Commands122354
Ref: AC_CONFIG_COMMANDS122866
Node: Configuration Links124151
Ref: AC_CONFIG_LINKS124602
Node: Subdirectories125575
Node: Default Prefix128055
Ref: AC_PREFIX_PROGRAM128946
Node: Existing Tests129477
Node: Common Behavior131279
Node: Standard Symbols131918
Node: Default Includes132499
Node: Alternative Programs134753
Node: Particular Programs135439
Ref: AC_PROG_LEX141187
Ref: AC_PROG_LN_S143798
Node: Generic Programs145416
Ref: AC_CHECK_PROG146388
Ref: AC_CHECK_PROGS147114
Ref: AC_PATH_PROG151114
Ref: AC_PATH_PROGS151488
Node: Files154567
Node: Libraries155767
Ref: AC_CHECK_LIB156008
Ref: AC_SEARCH_LIBS158267
Node: Library Functions159451
Node: Function Portability160074
Node: Particular Functions169586
Ref: AC_FUNC_ALLOCA169917
Ref: AC_FUNC_CLOSEDIR_VOID172306
Ref: AC_FUNC_FORK174296
Ref: AC_FUNC_GETLOADAVG176338
Ref: AC_FUNC_GETMNTENT177903
Ref: AC_FUNC_MMAP182145
Ref: AC_FUNC_STRCOLL185000
Ref: AC_FUNC_STRFTIME185975
Ref: AC_FUNC_UTIME_NULL187257
Ref: AC_FUNC_VPRINTF187605
Node: Generic Functions188821
Ref: AC_CHECK_FUNC189347
Ref: AC_CHECK_FUNCS189976
Node: Header Files194602
Node: Header Portability195235
Node: Particular Headers198330
Ref: AC_HEADER_DIRENT199369
Ref: AC_HEADER_MAJOR200899
Ref: AC_HEADER_STAT201683
Ref: AC_HEADER_STDC203189
Ref: AC_HEADER_TIME207928
Node: Generic Headers209315
Ref: AC_CHECK_HEADER209715
Ref: AC_CHECK_HEADERS211588
Node: Declarations214153
Node: Particular Declarations214749
Node: Generic Declarations214973
Ref: AC_CHECK_DECLS216358
Node: Structures218884
Node: Particular Structures219499
Ref: AC_STRUCT_ST_BLOCKS220568
Ref: AC_STRUCT_TIMEZONE221264
Node: Generic Structures221593
Ref: AC_CHECK_MEMBERS222584
Node: Types223417
Node: Particular Types223937
Ref: AC_TYPE_GETGROUPS224380
Ref: AC_TYPE_MODE_T227416
Ref: AC_TYPE_OFF_T227599
Ref: AC_TYPE_PID_T227779
Ref: AC_TYPE_SIZE_T227959
Ref: AC_TYPE_UID_T228328
Node: Generic Types229973
Node: Compilers and Preprocessors232128
Node: Specific Compiler Characteristics233402
Node: Generic Compiler Characteristics234507
Ref: AC_CHECK_SIZEOF234747
Node: C Compiler239537
Ref: AC_PROG_CC_C_O243988
Ref: AC_C_BIGENDIAN247796
Ref: AC_C_CONST249637
Ref: AC_C_INLINE252955
Ref: AC_C_CHAR_UNSIGNED253178
Ref: AC_PROG_GCC_TRADITIONAL255800
Node: C++ Compiler256212
Node: Objective C Compiler258609
Node: Objective C++ Compiler259983
Node: Erlang Compiler and Interpreter261433
Node: Fortran Compiler263478
Node: Go Compiler288878
Node: System Services289923
Ref: AC_PATH_X290168
Ref: AC_PATH_XTRA291161
Ref: AC_SYS_INTERPRETER291738
Ref: AC_SYS_LONG_FILE_NAMES293150
Node: Posix Variants293527
Ref: AC_USE_SYSTEM_EXTENSIONS293827
Node: Erlang Libraries294903
Node: Writing Tests299841
Node: Language Choice301865
Ref: AC_LANG302362
Ref: AC_LANG_PUSH304161
Ref: Language Choice-Footnote-1306034
Node: Writing Test Programs306190
Node: Guidelines306768
Node: Test Functions309028
Node: Generating Sources310426
Node: Running the Preprocessor316510
Ref: AC_PREPROC_IFELSE317242
Ref: AC_EGREP_HEADER319172
Ref: AC_EGREP_CPP319501
Node: Running the Compiler319926
Node: Running the Linker321681
Ref: AC_LINK_IFELSE322821
Node: Runtime323697
Ref: AC_RUN_IFELSE324472
Node: Systemology329322
Node: Multiple Cases331671
Node: Results333372
Node: Defining Symbols334191
Node: Setting Output Variables339082
Node: Special Chars in Variables344973
Node: Caching Results346233
Node: Cache Variable Names349951
Node: Cache Files351602
Node: Cache Checkpointing353927
Node: Printing Messages355301
Ref: AC_MSG_RESULT356815
Ref: AC_MSG_NOTICE357322
Ref: AC_MSG_ERROR357686
Ref: AC_MSG_WARN358519
Node: Programming in M4358942
Node: M4 Quotation359747
Node: Active Characters360716
Ref: Active Characters-Footnote-1362106
Ref: Active Characters-Footnote-2362220
Node: One Macro Call362242
Node: Quoting and Parameters363798
Node: Quotation and Nested Macros366134
Node: Changequote is Evil369144
Node: Quadrigraphs371674
Node: Balancing Parentheses374356
Node: Quotation Rule Of Thumb378450
Node: Using autom4te381348
Ref: Using autom4te-Footnote-1381999
Node: autom4te Invocation382048
Node: Customizing autom4te390550
Node: Programming in M4sugar391831
Node: Redefined M4 Macros393012
Node: Diagnostic Macros401342
Ref: m4_fatal402095
Ref: m4_warn402334
Node: Diversion support403102
Node: Conditional constructs410888
Node: Looping constructs417742
Ref: m4_foreach_w421354
Node: Evaluation Macros428706
Node: Text processing Macros437395
Node: Number processing Macros447105
Ref: m4_version_compare449057
Node: Set manipulation Macros451364
Node: Forbidden Patterns460480
Node: Debugging via autom4te461971
Node: Programming in M4sh463790
Node: Common Shell Constructs465163
Node: Polymorphic Variables473136
Node: Initialization Macros482725
Node: File Descriptor Macros488314
Ref: AS_MESSAGE_LOG_FD489466
Node: Writing Autoconf Macros490968
Node: Macro Definitions491773
Node: Macro Names495452
Node: Reporting Messages499213
Node: Dependencies Between Macros501057
Node: Prerequisite Macros501752
Node: Suggested Ordering507827
Node: One-Shot Macros509370
Node: Obsoleting Macros510723
Ref: AU_DEFUN511477
Node: Coding Style512506
Node: Portable Shell520313
Node: Shellology524621
Node: Invoking the Shell528792
Node: Here-Documents529974
Node: File Descriptors533594
Node: Signal Handling540032
Node: File System Conventions545240
Node: Shell Pattern Matching551052
Node: Shell Substitutions551616
Node: Assignments569492
Node: Parentheses571383
Node: Slashes572340
Node: Special Shell Variables573194
Node: Shell Functions586526
Node: Limitations of Builtins589933
Ref: case593955
Ref: echo599113
Ref: export606087
Ref: if609507
Ref: set613318
Ref: trap625040
Ref: unset628851
Node: Limitations of Usual Tools629946
Ref: awk630245
Ref: grep648349
Ref: mkdir653981
Ref: sed659801
Ref: touch670932
Node: Portable Make674207
Node: $< in Ordinary Make Rules675869
Node: Failure in Make Rules676335
Node: Special Chars in Names677363
Node: Backslash-Newline-Empty678335
Node: Backslash-Newline Comments679367
Node: Long Lines in Makefiles680256
Node: Macros and Submakes680632
Node: The Make Macro MAKEFLAGS683319
Node: The Make Macro SHELL684204
Node: Parallel Make686703
Node: Comments in Make Rules690387
Node: Newlines in Make Rules691557
Node: Comments in Make Macros692602
Node: Trailing whitespace in Make Macros693812
Node: Command-line Macros and whitespace694563
Node: obj/ and Make695233
Node: make -k Status695884
Node: VPATH and Make696506
Node: Variables listed in VPATH697830
Node: VPATH and Double-colon698369
Node: $< in Explicit Rules698775
Node: Automatic Rule Rewriting699242
Node: Tru64 Directory Magic705924
Node: Make Target Lookup706750
Node: Single Suffix Rules711192
Node: Timestamps and Make712538
Node: Portable C and C++714223
Node: Varieties of Unportability715864
Node: Integer Overflow717961
Node: Integer Overflow Basics718974
Node: Signed Overflow Examples720722
Node: Optimization and Wraparound724224
Node: Signed Overflow Advice727186
Node: Signed Integer Division729860
Node: Preprocessor Arithmetic730471
Node: Null Pointers731220
Node: Buffer Overruns731854
Node: Volatile Objects734643
Node: Floating Point Portability740321
Node: Exiting Portably740828
Node: Manual Configuration742304
Node: Specifying Target Triplets743137
Ref: Specifying Names743310
Node: Canonicalizing746185
Node: Using System Type748448
Node: Site Configuration751252
Node: Help Formatting752224
Node: External Software753168
Ref: AC_ARG_WITH754714
Node: Package Options759039
Ref: AC_ARG_ENABLE760494
Node: Pretty Help Strings761655
Ref: AS_HELP_STRING762241
Node: Option Checking764582
Node: Site Details766310
Node: Transforming Names767539
Node: Transformation Options768621
Node: Transformation Examples769098
Node: Transformation Rules770819
Node: Site Defaults772365
Node: Running configure Scripts777706
Node: Basic Installation778771
Node: Compilers and Options782868
Node: Multiple Architectures783522
Node: Installation Names785102
Node: Optional Features787997
Node: Particular Systems789351
Node: System Type790775
Node: Sharing Defaults792103
Node: Defining Variables792741
Node: configure Invocation793639
Node: config.status Invocation795345
Ref: CONFIG_SHELL799092
Node: Obsolete Constructs800258
Node: Obsolete config.status Use801221
Node: acconfig Header802999
Node: autoupdate Invocation805021
Node: Obsolete Macros806887
Ref: AC_FUNC_SETVBUF_REVERSED814529
Ref: AC_TYPE_SIGNAL831075
Node: Autoconf 1834053
Node: Changed File Names835119
Node: Changed Makefiles835869
Node: Changed Macros836957
Node: Changed Results838211
Node: Changed Macro Writing840335
Node: Autoconf 2.13841615
Node: Changed Quotation842823
Node: New Macros844741
Node: Hosts and Cross-Compilation846536
Node: AC_LIBOBJ vs LIBOBJS850691
Node: AC_ACT_IFELSE vs AC_TRY_ACT852306
Ref: AC_FOO_IFELSE vs AC_TRY_FOO852495
Node: Using Autotest854308
Node: Using an Autotest Test Suite856712
Node: testsuite Scripts857003
Node: Autotest Logs861485
Node: Writing Testsuites863826
Node: testsuite Invocation880858
Node: Making testsuite Scripts886205
Node: FAQ891343
Node: Distributing892203
Node: Why GNU M4893252
Node: Bootstrapping894121
Node: Why Not Imake894731
Node: Defining Directories899482
Node: Autom4te Cache901640
Node: Present But Cannot Be Compiled903478
Node: Expanded Before Required907195
Node: Debugging912093
Node: History917116
Node: Genesis917985
Node: Exodus919163
Node: Leviticus922208
Node: Numbers923736
Node: Deuteronomy925651
Node: GNU Free Documentation License928322
Node: Indices953487
Node: Environment Variable Index954206
Node: Output Variable Index965546
Node: Preprocessor Symbol Index982426
Node: Cache Variable Index1000695
Node: Autoconf Macro Index1011383
Node: M4 Macro Index1045712
Node: Autotest Macro Index1066462
Node: Program & Function Index1068865
Node: Concept Index1089579

End Tag Table
