mirror of
git://git.sv.gnu.org/autoconf
synced 2024-11-27 01:49:56 +08:00
27043 lines
979 KiB
Plaintext
27043 lines
979 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
|
@comment ========================================================
|
|
@comment %**start of header
|
|
@setfilename autoconf.info
|
|
@include version.texi
|
|
@settitle Autoconf
|
|
@documentencoding UTF-8
|
|
@set txicodequoteundirected
|
|
@set txicodequotebacktick
|
|
@setchapternewpage odd
|
|
@finalout
|
|
|
|
@c @ovar(ARG)
|
|
@c ----------
|
|
@c The ARG is an optional argument. To be used for macro arguments in
|
|
@c their documentation (@defmac).
|
|
@macro ovar{varname}
|
|
@r{[}@var{\varname\}@r{]}
|
|
@end macro
|
|
|
|
@c @dvar(ARG, DEFAULT)
|
|
@c -------------------
|
|
@c The ARG is an optional argument, defaulting to DEFAULT. To be used
|
|
@c for macro arguments in their documentation (@defmac).
|
|
@macro dvar{varname, default}
|
|
@r{[}@var{\varname\} = @samp{\default\}@r{]}
|
|
@end macro
|
|
|
|
@c @dvarv(ARG, DEFAULT-VAR)
|
|
@c ------------------------
|
|
@c Same as @dvar{ARG, DEFAULT-VAR}, but with @var instead of @samp
|
|
@c around DEFAULT-VAR.
|
|
@macro dvarv{varname, default}
|
|
@r{[}@var{\varname\} = @var{\default\}@r{]}
|
|
@end macro
|
|
|
|
@c Handling the indexes with Texinfo yields several different problems.
|
|
@c
|
|
@c Because we want to drop out the AC_ part of the macro names in the
|
|
@c printed manual, but not in the other outputs, we need a layer above
|
|
@c the usual @acindex{} etc. That's why we first define indexes such as
|
|
@c acx meant to become the macro @acindex. First of all, using 'ac_'
|
|
@c does not work with makeinfo, and using 'ac1' doesn't work with TeX.
|
|
@c So use something more regular 'acx'. Then you finish with a printed
|
|
@c index saying 'index is not existent'. Of course: you ought to use
|
|
@c two letters :( So you use capitals.
|
|
@c
|
|
@c Second, when defining a macro in the TeX world, following spaces are
|
|
@c eaten. But then, since we embed @acxindex commands that use the end
|
|
@c of line as an end marker, the whole things wrecks itself. So make
|
|
@c sure you do *force* an additional end of line, add a '@c'.
|
|
@c
|
|
@c Finally, you might want to get rid of TeX expansion, using --expand
|
|
@c with texi2dvi. But then you wake up an old problem: we use macros
|
|
@c in @defmac etc. where TeX does perform the expansion, but not makeinfo.
|
|
|
|
@c Define an environment variable index, for variables users may set
|
|
@c in their environment or on the configure command line.
|
|
@defcodeindex ev
|
|
@c Define an output variable index, for commonly AC_SUBST'ed variables.
|
|
@defcodeindex ov
|
|
@c Define a cache variable index, for variables matching *_cv_*.
|
|
@defcodeindex CA
|
|
@c Other shell variables not fitting the above categories should be
|
|
@c listed in the predefined vrindex, which we merge in the concept index.
|
|
@syncodeindex vr cp
|
|
@c Define a CPP preprocessor macro index, for #define'd strings.
|
|
@defcodeindex cv
|
|
@c Define an Autoconf macro index that @defmac doesn't write to.
|
|
@defcodeindex AC
|
|
@c Define an Autotest macro index that @defmac doesn't write to.
|
|
@defcodeindex AT
|
|
@c Define an M4sugar macro index that @defmac doesn't write to.
|
|
@defcodeindex MS
|
|
@c Define an index for *foreign* programs: 'mv' etc. Used for the
|
|
@c portability sections and so on.
|
|
@defindex pr
|
|
|
|
@c shortindexflag
|
|
@c --------------
|
|
@c Shall we factor AC_ out of the Autoconf macro index etc.?
|
|
@iftex
|
|
@set shortindexflag
|
|
@end iftex
|
|
|
|
@c @acindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an AC_\MACRO\.
|
|
@ifset shortindexflag
|
|
@macro acindex{macro}
|
|
@ACindex \macro\
|
|
@c
|
|
@end macro
|
|
@end ifset
|
|
@ifclear shortindexflag
|
|
@macro acindex{macro}
|
|
@ACindex AC_\macro\
|
|
@end macro
|
|
@end ifclear
|
|
|
|
@c @ahindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an AH_\MACRO\.
|
|
@macro ahindex{macro}
|
|
@ACindex AH_\macro\
|
|
@c
|
|
@end macro
|
|
|
|
@c @asindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an AS_\MACRO\.
|
|
@ifset shortindexflag
|
|
@macro asindex{macro}
|
|
@MSindex \macro\
|
|
@c
|
|
@end macro
|
|
@end ifset
|
|
@ifclear shortindexflag
|
|
@macro asindex{macro}
|
|
@MSindex AS_\macro\
|
|
@end macro
|
|
@end ifclear
|
|
|
|
@c @atindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an AT_\MACRO\.
|
|
@ifset shortindexflag
|
|
@macro atindex{macro}
|
|
@ATindex \macro\
|
|
@c
|
|
@end macro
|
|
@end ifset
|
|
@ifclear shortindexflag
|
|
@macro atindex{macro}
|
|
@ATindex AT_\macro\
|
|
@end macro
|
|
@end ifclear
|
|
|
|
@c @auindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an AU_\MACRO\.
|
|
@macro auindex{macro}
|
|
@ACindex AU_\macro\
|
|
@c
|
|
@end macro
|
|
|
|
@c @hdrindex{MACRO}
|
|
@c ----------------
|
|
@c Indexing a header.
|
|
@macro hdrindex{macro}
|
|
@prindex @file{\macro\}
|
|
@c
|
|
@end macro
|
|
|
|
@c @msindex{MACRO}
|
|
@c ---------------
|
|
@c Registering an m4_\MACRO\.
|
|
@ifset shortindexflag
|
|
@macro msindex{macro}
|
|
@MSindex \macro\
|
|
@c
|
|
@end macro
|
|
@end ifset
|
|
@ifclear shortindexflag
|
|
@macro msindex{macro}
|
|
@MSindex m4_\macro\
|
|
@end macro
|
|
@end ifclear
|
|
|
|
|
|
@c @caindex{VARIABLE}
|
|
@c ------------------
|
|
@c Registering an ac_cv_\VARIABLE\ cache variable.
|
|
@ifset shortindexflag
|
|
@macro caindex{macro}
|
|
@CAindex \macro\
|
|
@end macro
|
|
@end ifset
|
|
@ifclear shortindexflag
|
|
@macro caindex{macro}
|
|
@CAindex ac_cv_\macro\
|
|
@end macro
|
|
@end ifclear
|
|
|
|
@c Define an index for functions: 'alloca' etc. Used for the
|
|
@c portability sections and so on. We can't use 'fn' (aka 'fnindex'),
|
|
@c since '@defmac' goes into it => we'd get all the macros too.
|
|
|
|
@c FIXME: Aaarg! It seems there are too many indices for TeX :(
|
|
@c
|
|
@c ! No room for a new @write .
|
|
@c l.112 @defcodeindex fu
|
|
@c
|
|
@c so don't define yet another one :( Just put some tags before each
|
|
@c @prindex which is actually a @funindex.
|
|
@c
|
|
@c @defcodeindex fu
|
|
@c
|
|
@c
|
|
@c @c Put the programs and functions into their own index.
|
|
@c @syncodeindex fu pr
|
|
|
|
@comment %**end of header
|
|
@comment ========================================================
|
|
|
|
@copying
|
|
|
|
This manual (@value{UPDATED}) is for GNU Autoconf
|
|
(version @value{VERSION}),
|
|
a package for creating scripts to configure source code packages using
|
|
templates and an M4 macro package.
|
|
|
|
Copyright @copyright{} 1992--1996, 1998--2017, 2020--2024 Free Software
|
|
Foundation, Inc.
|
|
|
|
@quotation
|
|
Permission is granted to copy, distribute and/or modify this document
|
|
under the terms of the GNU Free Documentation License,
|
|
Version 1.3 or any later version published by the Free Software
|
|
Foundation; with no Invariant Sections, no Front-Cover texts, and
|
|
no Back-Cover Texts. A copy of the license is included in the section
|
|
entitled ``GNU Free Documentation License.''
|
|
@end quotation
|
|
@end copying
|
|
|
|
|
|
|
|
@dircategory Software development
|
|
@direntry
|
|
* Autoconf: (autoconf). Create source code configuration scripts.
|
|
@end direntry
|
|
|
|
@dircategory Individual utilities
|
|
@direntry
|
|
* autoscan: (autoconf)autoscan Invocation.
|
|
Semi-automatic @file{configure.ac} writing
|
|
* ifnames: (autoconf)ifnames Invocation. Listing conditionals in source.
|
|
* autoconf-invocation: (autoconf)autoconf Invocation.
|
|
How to create configuration scripts
|
|
* autoreconf: (autoconf)autoreconf Invocation.
|
|
Remaking multiple @command{configure} scripts
|
|
* autoheader: (autoconf)autoheader Invocation.
|
|
How to create configuration templates
|
|
* autom4te: (autoconf)autom4te Invocation.
|
|
The Autoconf executables backbone
|
|
* configure: (autoconf)configure Invocation. Configuring a package.
|
|
* autoupdate: (autoconf)autoupdate Invocation.
|
|
Automatic update of @file{configure.ac}
|
|
* config.status: (autoconf)config.status Invocation. Recreating configurations.
|
|
* testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite.
|
|
@end direntry
|
|
|
|
@titlepage
|
|
@title Autoconf
|
|
@subtitle Creating Automatic Configuration Scripts
|
|
@subtitle for version @value{VERSION}, @value{UPDATED}
|
|
@author David MacKenzie
|
|
@author Ben Elliston
|
|
@author Akim Demaille
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@insertcopying
|
|
@end titlepage
|
|
|
|
@contents
|
|
|
|
|
|
@ifnottex
|
|
@node Top
|
|
@top Autoconf
|
|
@insertcopying
|
|
@end ifnottex
|
|
|
|
@c The master menu, created with texinfo-master-menu, goes here.
|
|
|
|
@menu
|
|
* Introduction:: Autoconf's purpose, strengths, and weaknesses
|
|
* The GNU Build System:: A set of tools for portable software packages
|
|
* Making configure Scripts:: How to organize and produce Autoconf scripts
|
|
* Setup:: Initialization and output
|
|
* Existing Tests:: Macros that check for particular features
|
|
* Writing Tests:: How to write new feature checks
|
|
* Results:: What to do with results from feature checks
|
|
* Programming in M4:: Layers on top of which Autoconf is written
|
|
* Programming in M4sh:: Shell portability layer
|
|
* Writing Autoconf Macros:: Adding new macros to Autoconf
|
|
* Portable Shell:: Shell script portability pitfalls
|
|
* Portable Make:: Makefile portability pitfalls
|
|
* Portable C and C++:: C and C++ portability pitfalls
|
|
* Manual Configuration:: Selecting features that can't be guessed
|
|
* Site Configuration:: Local defaults for @command{configure}
|
|
* Running configure Scripts:: How to use the Autoconf output
|
|
* config.status Invocation:: Recreating a configuration
|
|
* Obsolete Constructs:: Kept for backward compatibility
|
|
* Using Autotest:: Creating portable test suites
|
|
* FAQ:: Frequent Autoconf Questions, with answers
|
|
* History:: History of Autoconf
|
|
* GNU Free Documentation License:: License for copying this manual
|
|
* Indices:: Indices of symbols, concepts, etc.
|
|
|
|
@detailmenu
|
|
--- The Detailed Node Listing ---
|
|
|
|
The GNU Build System
|
|
|
|
* Automake:: Escaping makefile hell
|
|
* Gnulib:: The GNU portability library
|
|
* Libtool:: Building libraries portably
|
|
* Pointers:: More info on the GNU build system
|
|
|
|
Making @command{configure} Scripts
|
|
|
|
* Writing Autoconf Input:: What to put in an Autoconf input file
|
|
* autoscan Invocation:: Semi-automatic @file{configure.ac} writing
|
|
* ifnames Invocation:: Listing the conditionals in source code
|
|
* autoconf Invocation:: How to create configuration scripts
|
|
* autoreconf Invocation:: Remaking multiple @command{configure} scripts
|
|
|
|
Writing @file{configure.ac}
|
|
|
|
* Shell Script Compiler:: Autoconf as solution of a problem
|
|
* Autoconf Language:: Programming in Autoconf
|
|
* Autoconf Input Layout:: Standard organization of @file{configure.ac}
|
|
|
|
Initialization and Output Files
|
|
|
|
* Initializing configure:: Option processing etc.
|
|
* Versioning:: Dealing with Autoconf versions
|
|
* Notices:: Copyright, version numbers in @command{configure}
|
|
* Input:: Where Autoconf should find files
|
|
* Output:: Outputting results from the configuration
|
|
* Configuration Actions:: Preparing the output based on results
|
|
* Configuration Files:: Creating output files
|
|
* Makefile Substitutions:: Using output variables in makefiles
|
|
* Configuration Headers:: Creating a configuration header file
|
|
* Configuration Commands:: Running arbitrary instantiation commands
|
|
* Configuration Links:: Links depending on the configuration
|
|
* Subdirectories:: Configuring independent packages together
|
|
* Default Prefix:: Changing the default installation prefix
|
|
|
|
Substitutions in Makefiles
|
|
|
|
* Preset Output Variables:: Output variables that are always set
|
|
* Installation Directory Variables:: Other preset output variables
|
|
* Changed Directory Variables:: Warnings about @file{datarootdir}
|
|
* Build Directories:: Supporting multiple concurrent compiles
|
|
* Automatic Remaking:: Makefile rules for configuring
|
|
|
|
Configuration Header Files
|
|
|
|
* Header Templates:: Input for the configuration headers
|
|
* autoheader Invocation:: How to create configuration templates
|
|
* Autoheader Macros:: How to specify CPP templates
|
|
|
|
Existing Tests
|
|
|
|
* Common Behavior:: Macros' standard schemes
|
|
* Alternative Programs:: Selecting between alternative programs
|
|
* Files:: Checking for the existence of files
|
|
* Libraries:: Library archives that might be missing
|
|
* Library Functions:: C library functions that might be missing
|
|
* Header Files:: Header files that might be missing
|
|
* Declarations:: Declarations that may be missing
|
|
* Structures:: Structures or members that might be missing
|
|
* Types:: Types that might be missing
|
|
* Compilers and Preprocessors:: Checking for compiling programs
|
|
* System Services:: Operating system services
|
|
* C and POSIX Variants:: Kludges for C and POSIX variants
|
|
* Erlang Libraries:: Checking for the existence of Erlang libraries
|
|
|
|
Common Behavior
|
|
|
|
* Standard Symbols:: Symbols defined by the macros
|
|
* Default Includes:: Includes used by the generic macros
|
|
|
|
Alternative Programs
|
|
|
|
* Particular Programs:: Special handling to find certain programs
|
|
* Generic Programs:: How to find other programs
|
|
|
|
Library Functions
|
|
|
|
* Function Portability:: Pitfalls with usual functions
|
|
* Particular Functions:: Special handling to find certain functions
|
|
* Generic Functions:: How to find other functions
|
|
|
|
Header Files
|
|
|
|
* Header Portability:: Collected knowledge on common headers
|
|
* Particular Headers:: Special handling to find certain headers
|
|
* Generic Headers:: How to find other headers
|
|
|
|
Declarations
|
|
|
|
* Particular Declarations:: Macros to check for certain declarations
|
|
* Generic Declarations:: How to find other declarations
|
|
|
|
Structures
|
|
|
|
* Particular Structures:: Macros to check for certain structure members
|
|
* Generic Structures:: How to find other structure members
|
|
|
|
Types
|
|
|
|
* Particular Types:: Special handling to find certain types
|
|
* Generic Types:: How to find other types
|
|
|
|
Compilers and Preprocessors
|
|
|
|
* Specific Compiler Characteristics:: Some portability issues
|
|
* Generic Compiler Characteristics:: Language independent tests and features
|
|
* C Compiler:: Checking its characteristics
|
|
* C++ Compiler:: Likewise
|
|
* Objective C Compiler:: Likewise
|
|
* Objective C++ Compiler:: Likewise
|
|
* Erlang Compiler and Interpreter:: Likewise
|
|
* Fortran Compiler:: Likewise
|
|
* Go Compiler:: Likewise
|
|
|
|
Writing Tests
|
|
|
|
* Language Choice:: Selecting which language to use for testing
|
|
* Writing Test Programs:: Forging source files for compilers
|
|
* Running the Preprocessor:: Detecting preprocessor symbols
|
|
* Running the Compiler:: Detecting language or header features
|
|
* Running the Linker:: Detecting library features
|
|
* Runtime:: Testing for runtime features
|
|
* Multiple Cases:: Tests for several possible values
|
|
|
|
Writing Test Programs
|
|
|
|
* Guidelines:: General rules for writing test programs
|
|
* Test Functions:: Avoiding pitfalls in test programs
|
|
* Generating Sources:: Source program boilerplate
|
|
|
|
Results of Tests
|
|
|
|
* Defining Symbols:: Defining C preprocessor symbols
|
|
* Setting Output Variables:: Replacing variables in output files
|
|
* Special Chars in Variables:: Characters to beware of in variables
|
|
* Caching Results:: Speeding up subsequent @command{configure} runs
|
|
* Printing Messages:: Notifying @command{configure} users
|
|
|
|
Caching Results
|
|
|
|
* Cache Variable Names:: Shell variables used in caches
|
|
* Cache Files:: Files @command{configure} uses for caching
|
|
* Cache Checkpointing:: Loading and saving the cache file
|
|
|
|
Programming in M4
|
|
|
|
* M4 Quotation:: Protecting macros from unwanted expansion
|
|
* Using autom4te:: The Autoconf executables backbone
|
|
* Programming in M4sugar:: Convenient pure M4 macros
|
|
* Debugging via autom4te:: Figuring out what M4 was doing
|
|
|
|
M4 Quotation
|
|
|
|
* Active Characters:: Characters that change the behavior of M4
|
|
* One Macro Call:: Quotation and one macro call
|
|
* Quoting and Parameters:: M4 vs. shell parameters
|
|
* Quotation and Nested Macros:: Macros calling macros
|
|
* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
|
|
* Quadrigraphs:: Another way to escape special characters
|
|
* Balancing Parentheses:: Dealing with unbalanced parentheses
|
|
* Quotation Rule Of Thumb:: One parenthesis, one quote
|
|
|
|
Using @command{autom4te}
|
|
|
|
* autom4te Invocation:: A GNU M4 wrapper
|
|
* Customizing autom4te:: Customizing the Autoconf package
|
|
|
|
Programming in M4sugar
|
|
|
|
* Redefined M4 Macros:: M4 builtins changed in M4sugar
|
|
* Diagnostic Macros:: Diagnostic messages from M4sugar
|
|
* Diversion support:: Diversions in M4sugar
|
|
* Conditional constructs:: Conditions in M4
|
|
* Looping constructs:: Iteration in M4
|
|
* Evaluation Macros:: More quotation and evaluation control
|
|
* Text processing Macros:: String manipulation in M4
|
|
* Number processing Macros:: Arithmetic computation in M4
|
|
* Set manipulation Macros:: Set manipulation in M4
|
|
* Forbidden Patterns:: Catching unexpanded macros
|
|
|
|
Programming in M4sh
|
|
|
|
* Common Shell Constructs:: Portability layer for common shell constructs
|
|
* Polymorphic Variables:: Support for indirect variable names
|
|
* Initialization Macros:: Macros to establish a sane shell environment
|
|
* File Descriptor Macros:: File descriptor macros for input and output
|
|
|
|
Writing Autoconf Macros
|
|
|
|
* Macro Definitions:: Basic format of an Autoconf macro
|
|
* Macro Names:: What to call your new macros
|
|
* Dependencies Between Macros:: What to do when macros depend on other macros
|
|
* Obsoleting Macros:: Warning about old ways of doing things
|
|
* Coding Style:: Writing Autoconf macros à la Autoconf
|
|
|
|
Dependencies Between Macros
|
|
|
|
* Prerequisite Macros:: Ensuring required information
|
|
* Suggested Ordering:: Warning about possible ordering problems
|
|
* One-Shot Macros:: Ensuring a macro is called only once
|
|
|
|
Portable Shell Programming
|
|
|
|
* Systemology:: A zoology of operating systems
|
|
* Shellology:: A zoology of shells
|
|
* Invoking the Shell:: Invoking the shell as a command
|
|
* Here-Documents:: Quirks and tricks
|
|
* File Descriptors:: FDs and redirections
|
|
* Signal Handling:: Shells, signals, and headaches
|
|
* File System Conventions:: File names
|
|
* Shell Pattern Matching:: Pattern matching
|
|
* Shell Substitutions:: Variable and command expansions
|
|
* Assignments:: Varying side effects of assignments
|
|
* Parentheses:: Parentheses in shell scripts
|
|
* Special Shell Variables:: Variables you should not change
|
|
* Shell Functions:: What to look out for if you use them
|
|
* Limitations of Builtins:: Portable use of not so portable /bin/sh
|
|
* Limitations of Usual Tools:: Portable use of portable tools
|
|
|
|
Portable Make Programming
|
|
|
|
* $< in Ordinary Make Rules:: $< in ordinary rules
|
|
* Failure in Make Rules:: Failing portably in rules
|
|
* Command Line Prefixes:: What's at the start of makefile command lines
|
|
* Special Chars in Names:: Special characters in macro names
|
|
* Backslash-Newline-Empty:: Empty lines after backslash-newline
|
|
* Backslash-Newline Comments:: Spanning comments across line boundaries
|
|
* Macros and Submakes:: @code{make macro=value} and submakes
|
|
* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
|
|
* The Make Macro SHELL:: @code{$(SHELL)} portability issues
|
|
* Parallel Make:: Parallel @command{make} quirks
|
|
* Comments in Make Rules:: Other problems with Make comments
|
|
* Newlines in Make Rules:: Using literal newlines in rules
|
|
* Comments in Make Macros:: Other problems with Make comments in macros
|
|
* Trailing whitespace in Make Macros:: Macro substitution problems
|
|
* Command-line Macros and whitespace:: Whitespace trimming of values
|
|
* obj/ and Make:: Don't name a subdirectory @file{obj}
|
|
* make -k Status:: Exit status of @samp{make -k}
|
|
* VPATH and Make:: @code{VPATH} woes
|
|
* Single Suffix Rules:: Single suffix rules and separated dependencies
|
|
* Timestamps and Make:: Sub-second timestamp resolution
|
|
|
|
@code{VPATH} and Make
|
|
|
|
* Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts
|
|
* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
|
|
* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
|
|
* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
|
|
* Make Target Lookup:: More details about @code{VPATH} lookup
|
|
|
|
Portable C and C++ Programming
|
|
|
|
* Varieties of Unportability:: How to make your programs unportable
|
|
* Integer Overflow:: When integers get too large
|
|
* Preprocessor Arithmetic:: @code{#if} expression problems
|
|
* Null Pointers:: Properties of null pointers
|
|
* Buffer Overruns:: Subscript errors and the like
|
|
* Volatile Objects:: @code{volatile} and signals
|
|
* Floating Point Portability:: Portable floating-point arithmetic
|
|
* Exiting Portably:: Exiting and the exit status
|
|
|
|
Integer Overflow
|
|
|
|
* Integer Overflow Basics:: Why integer overflow is a problem
|
|
* Signed Overflow Examples:: Examples of code assuming wraparound
|
|
* Optimization and Wraparound:: Optimizations that break uses of wraparound
|
|
* Signed Overflow Advice:: Practical advice for signed overflow issues
|
|
* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1}
|
|
|
|
Manual Configuration
|
|
|
|
* Specifying Target Triplets:: Specifying target triplets
|
|
* Canonicalizing:: Getting the canonical system type
|
|
* Using System Type:: What to do with the system type
|
|
|
|
Site Configuration
|
|
|
|
* Help Formatting:: Customizing @samp{configure --help}
|
|
* External Software:: Working with other optional software
|
|
* Package Options:: Selecting optional features
|
|
* Pretty Help Strings:: Formatting help string
|
|
* Option Checking:: Controlling checking of @command{configure} options
|
|
* Site Details:: Configuring site details
|
|
* Transforming Names:: Changing program names when installing
|
|
* Site Defaults:: Giving @command{configure} local defaults
|
|
|
|
Transforming Program Names When Installing
|
|
|
|
* Transformation Options:: @command{configure} options to transform names
|
|
* Transformation Examples:: Sample uses of transforming names
|
|
* Transformation Rules:: Makefile uses of transforming names
|
|
|
|
Running @command{configure} Scripts
|
|
|
|
* Basic Installation:: Instructions for typical cases
|
|
* Compilers and Options:: Selecting compilers and optimization
|
|
* Multiple Architectures:: Compiling for multiple architectures at once
|
|
* Installation Names:: Installing in different directories
|
|
* Optional Features:: Selecting optional features
|
|
* System Types:: Specifying a system type
|
|
* Sharing Defaults:: Setting site-wide defaults for @command{configure}
|
|
* Defining Variables:: Specifying the compiler etc.
|
|
* configure Invocation:: Changing how @command{configure} runs
|
|
|
|
Obsolete Constructs
|
|
|
|
* Obsolete config.status Use:: Obsolete convention for @command{config.status}
|
|
* acconfig Header:: Additional entries in @file{config.h.in}
|
|
* autoupdate Invocation:: Automatic update of @file{configure.ac}
|
|
* Obsolete Macros:: Backward compatibility macros
|
|
* Autoconf 1:: Tips for upgrading your files
|
|
* Autoconf 2.13:: Some fresher tips
|
|
|
|
Upgrading From Version 1
|
|
|
|
* Changed File Names:: Files you might rename
|
|
* Changed Makefiles:: New things to put in @file{Makefile.in}
|
|
* Changed Macros:: Macro calls you might replace
|
|
* Changed Results:: Changes in how to check test results
|
|
* Changed Macro Writing:: Better ways to write your own macros
|
|
|
|
Upgrading From Version 2.13
|
|
|
|
* Changed Quotation:: Broken code which used to work
|
|
* New Macros:: Interaction with foreign macros
|
|
* Hosts and Cross-Compilation:: Bugward compatibility kludges
|
|
* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
|
|
* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
|
|
|
|
Generating Test Suites with Autotest
|
|
|
|
* Using an Autotest Test Suite:: Autotest and the user
|
|
* Writing Testsuites:: Autotest macros
|
|
* testsuite Invocation:: Running @command{testsuite} scripts
|
|
* Making testsuite Scripts:: Using autom4te to create @command{testsuite}
|
|
|
|
Using an Autotest Test Suite
|
|
|
|
* testsuite Scripts:: The concepts of Autotest
|
|
* Autotest Logs:: Their contents
|
|
|
|
Frequent Autoconf Questions, with answers
|
|
|
|
* Distributing:: Distributing @command{configure} scripts
|
|
* Why GNU M4:: Why not use the standard M4?
|
|
* Bootstrapping:: Autoconf and GNU M4 require each other?
|
|
* Why Not Imake:: Why GNU uses @command{configure} instead of Imake
|
|
* Defining Directories:: Passing @code{datadir} to program
|
|
* Autom4te Cache:: What is it? Can I remove it?
|
|
* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
|
|
* Expanded Before Required:: Expanded Before Required
|
|
* Debugging:: Debugging @command{configure} scripts
|
|
|
|
History of Autoconf
|
|
|
|
* Genesis:: Prehistory and naming of @command{configure}
|
|
* Exodus:: The plagues of M4 and Perl
|
|
* Leviticus:: The priestly code of portability arrives
|
|
* Numbers:: Growth and contributors
|
|
* Deuteronomy:: Approaching the promises of easy configuration
|
|
|
|
Indices
|
|
|
|
* Environment Variable Index:: Index of environment variables used
|
|
* Output Variable Index:: Index of variables set in output files
|
|
* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
|
|
* Cache Variable Index:: Index of documented cache variables
|
|
* Autoconf Macro Index:: Index of Autoconf macros
|
|
* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
|
|
* Autotest Macro Index:: Index of Autotest macros
|
|
* Program & Function Index:: Index of those with portability problems
|
|
* Concept Index:: General index
|
|
|
|
@end detailmenu
|
|
@end menu
|
|
|
|
@c ============================================================= Introduction.
|
|
|
|
@node Introduction
|
|
@chapter Introduction
|
|
@cindex Introduction
|
|
|
|
@flushright
|
|
A physicist, an engineer, and a computer scientist were discussing the
|
|
nature of God. ``Surely a Physicist,'' said the physicist, ``because
|
|
early in the Creation, God made Light; and you know, Maxwell's
|
|
equations, the dual nature of electromagnetic waves, the relativistic
|
|
consequences@enddots{}'' ``An Engineer!,'' said the engineer, ``because
|
|
before making Light, God split the Chaos into Land and Water; it takes
|
|
a hell of an engineer to handle that big amount of mud, and orderly
|
|
separation of solids from liquids@enddots{}'' The computer scientist
|
|
shouted: ``And the Chaos, where do you think it was coming from, hmm?''
|
|
|
|
---Anonymous
|
|
@end flushright
|
|
@c (via François Pinard)
|
|
|
|
Autoconf is a tool for producing shell scripts that automatically
|
|
configure software source code packages to adapt to many kinds of
|
|
POSIX-like systems. The configuration scripts produced by Autoconf
|
|
are independent of Autoconf when they are run, so their users do not
|
|
need to have Autoconf.
|
|
|
|
The configuration scripts produced by Autoconf require no manual user
|
|
intervention when run; they do not normally even need an argument
|
|
specifying the system type. Instead, they individually test for the
|
|
presence of each feature that the software package they are for might need.
|
|
(Before each check, they print a one-line message stating what they are
|
|
checking for, so the user doesn't get too bored while waiting for the
|
|
script to finish.) As a result, they deal well with systems that are
|
|
hybrids or customized from the more common POSIX variants. There is
|
|
no need to maintain files that list the features supported by each
|
|
release of each variant of POSIX.
|
|
|
|
For each software package that Autoconf is used with, it creates a
|
|
configuration script from a template file that lists the system features
|
|
that the package needs or can use. After the shell code to recognize
|
|
and respond to a system feature has been written, Autoconf allows it to
|
|
be shared by many software packages that can use (or need) that feature.
|
|
If it later turns out that the shell code needs adjustment for some
|
|
reason, it needs to be changed in only one place; all of the
|
|
configuration scripts can be regenerated automatically to take advantage
|
|
of the updated code.
|
|
|
|
@c "Those who do not understand Unix are condemned to reinvent it, poorly."
|
|
@c --Henry Spencer, 1987 (see https://en.wikipedia.org/wiki/Unix_philosophy)
|
|
Those who do not understand Autoconf are condemned to reinvent it, poorly.
|
|
The primary goal of Autoconf is making the @emph{user's} life easier;
|
|
making the @emph{maintainer's} life easier is only a secondary goal.
|
|
Put another way, the primary goal is not to make the generation of
|
|
@file{configure} automatic for package maintainers (although patches
|
|
along that front are welcome, since package maintainers form the user
|
|
base of Autoconf); rather, the goal is to make @file{configure}
|
|
painless, portable, and predictable for the end user of each
|
|
@dfn{autoconfiscated} package. And to this degree, Autoconf is highly
|
|
successful at its goal---most complaints to the Autoconf list are
|
|
about difficulties in writing Autoconf input, and not in the behavior of
|
|
the resulting @file{configure}. Even packages that don't use Autoconf
|
|
will generally provide a @file{configure} script, and the most common
|
|
complaint about these alternative home-grown scripts is that they fail
|
|
to meet one or more of the GNU Coding Standards (@pxref{Configuration, , ,
|
|
standards, The GNU Coding Standards}) that users
|
|
have come to expect from Autoconf-generated @file{configure} scripts.
|
|
|
|
The Metaconfig package is similar in purpose to Autoconf, but the
|
|
scripts it produces require manual user intervention, which is quite
|
|
inconvenient when configuring large source trees. Unlike Metaconfig
|
|
scripts, Autoconf scripts can support cross-compiling, if some care is
|
|
taken in writing them.
|
|
|
|
Autoconf does not solve all problems related to making portable
|
|
software packages---for a more complete solution, it should be used in
|
|
concert with other GNU build tools like Automake and
|
|
Libtool. These other tools take on jobs like the creation of a
|
|
portable, recursive makefile with all of the standard targets,
|
|
linking of shared libraries, and so on. @xref{The GNU Build System},
|
|
for more information.
|
|
|
|
Autoconf imposes some restrictions on the names of macros used with
|
|
@code{#if} in C programs (@pxref{Preprocessor Symbol Index}).
|
|
|
|
Autoconf requires GNU M4 version 1.4.8 or later in order to
|
|
generate the scripts. It uses features that some versions of M4,
|
|
including GNU M4 1.3, do not have. Autoconf works better
|
|
with GNU M4 version 1.4.16 or later, though this is not
|
|
required.
|
|
|
|
@xref{Autoconf 1}, for information about upgrading from version 1.
|
|
@xref{History}, for the story of Autoconf's development. @xref{FAQ},
|
|
for answers to some common questions about Autoconf.
|
|
|
|
See the @uref{https://@/www.gnu.org/@/software/@/autoconf/,
|
|
Autoconf web page} for up-to-date information, details on the mailing
|
|
lists, pointers to a list of known bugs, etc.
|
|
|
|
Mail suggestions to @email{autoconf@@gnu.org, the Autoconf mailing
|
|
list}. Past suggestions are
|
|
@uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf/, archived}.
|
|
|
|
Mail bug reports to @email{bug-autoconf@@gnu.org, the
|
|
Autoconf Bugs mailing list}. Past bug reports are
|
|
@uref{https://@/lists.gnu.org/@/archive/@/html/@/bug-autoconf/, archived}.
|
|
|
|
If possible, first check that your bug is
|
|
not already solved in current development versions, and that it has not
|
|
been reported yet. Be sure to include all the needed information and a
|
|
short @file{configure.ac} that demonstrates the problem.
|
|
|
|
Autoconf's development tree is accessible via @command{git}; see the
|
|
@uref{https://@/savannah.gnu.org/@/projects/@/autoconf/, Autoconf
|
|
Summary} for details, or view
|
|
@uref{https://@/git.savannah.gnu.org/@/cgit/@/autoconf.git, the actual
|
|
repository}. Patches relative to the current @command{git} version can
|
|
be sent for review to the @email{autoconf-patches@@gnu.org, Autoconf
|
|
Patches mailing list}, with discussion on prior patches
|
|
@uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-@/patches/,
|
|
archived}; and all commits are posted in the read-only
|
|
@email{autoconf-commit@@gnu.org, Autoconf Commit mailing list}, which is
|
|
also @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-commit/,
|
|
archived}.
|
|
|
|
Because of its mission, the Autoconf package itself
|
|
includes only a set of often-used
|
|
macros that have already demonstrated their usefulness. Nevertheless,
|
|
if you wish to share your macros, or find existing ones, see the
|
|
@uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
|
|
Archive}, which is kindly run by @email{simons@@cryp.to,
|
|
Peter Simons}.
|
|
|
|
|
|
@c ================================================= The GNU Build System
|
|
|
|
@node The GNU Build System
|
|
@chapter The GNU Build System
|
|
@cindex GNU build system
|
|
|
|
Autoconf solves an important problem---reliable discovery of
|
|
system-specific build and runtime information---but this is only one
|
|
piece of the puzzle for the development of portable software. To this
|
|
end, the GNU project has developed a suite of integrated
|
|
utilities to finish the job Autoconf started: the GNU build
|
|
system, whose most important components are Autoconf, Automake, and
|
|
Libtool. In this chapter, we introduce you to those tools, point you
|
|
to sources of more information, and try to convince you to use the
|
|
entire GNU build system for your software.
|
|
|
|
@menu
|
|
* Automake:: Escaping makefile hell
|
|
* Gnulib:: The GNU portability library
|
|
* Libtool:: Building libraries portably
|
|
* Pointers:: More info on the GNU build system
|
|
@end menu
|
|
|
|
@node Automake
|
|
@section Automake
|
|
|
|
The ubiquity of @command{make} means that a makefile is almost the
|
|
only viable way to distribute automatic build rules for software, but
|
|
one quickly runs into its numerous limitations. Its lack of
|
|
support for automatic dependency tracking, recursive builds in
|
|
subdirectories, reliable timestamps (e.g., for network file systems), and
|
|
so on, mean that developers must painfully (and often incorrectly)
|
|
reinvent the wheel for each project. Portability is non-trivial, thanks
|
|
to the quirks of @command{make} on many systems. On top of all this is the
|
|
manual labor required to implement the many standard targets that users
|
|
have come to expect (@code{make install}, @code{make distclean},
|
|
@code{make uninstall}, etc.). Since you are, of course, using Autoconf,
|
|
you also have to insert repetitive code in your @file{Makefile.in} to
|
|
recognize @code{@@CC@@}, @code{@@CFLAGS@@}, and other substitutions
|
|
provided by @command{configure}. Into this mess steps @dfn{Automake}.
|
|
@cindex Automake
|
|
|
|
Automake allows you to specify your build needs in a @file{Makefile.am}
|
|
file with a vastly simpler and more powerful syntax than that of a plain
|
|
makefile, and then generates a portable @file{Makefile.in} for
|
|
use with Autoconf. For example, the @file{Makefile.am} to build and
|
|
install a simple ``Hello world'' program might look like:
|
|
|
|
@example
|
|
bin_PROGRAMS = hello
|
|
hello_SOURCES = hello.c
|
|
@end example
|
|
|
|
@noindent
|
|
The resulting @file{Makefile.in} (~400 lines) automatically supports all
|
|
the standard targets, the substitutions provided by Autoconf, automatic
|
|
dependency tracking, @code{VPATH} building, and so on. @command{make}
|
|
builds the @code{hello} program, and @code{make install} installs it
|
|
in @file{/usr/local/bin} (or whatever prefix was given to
|
|
@command{configure}, if not @file{/usr/local}).
|
|
|
|
The benefits of Automake increase for larger packages (especially ones
|
|
with subdirectories), but even for small programs the added convenience
|
|
and portability can be substantial. And that's not all@enddots{}
|
|
|
|
@node Gnulib
|
|
@section Gnulib
|
|
|
|
GNU software has a well-deserved reputation for running on
|
|
many different types of systems. While our primary goal is to write
|
|
software for the GNU system, many users and developers have
|
|
been introduced to us through the systems that they were already using.
|
|
|
|
@cindex Gnulib
|
|
Gnulib is a central location for common GNU code, intended to
|
|
be shared among free software packages. Its components are typically
|
|
shared at the source level, rather than being a library that gets built,
|
|
installed, and linked against. The idea is to copy files from Gnulib
|
|
into your own source tree. There is no distribution tarball; developers
|
|
should just grab source modules from the repository. The source files
|
|
are available online, under various licenses, mostly GNU
|
|
GPL or GNU LGPL.
|
|
|
|
Gnulib modules typically contain C source code along with Autoconf
|
|
macros used to configure the source code. For example, the Gnulib
|
|
@code{stdckdint} module implements a @file{stdckdint.h} header that nearly
|
|
conforms to C23, even on older hosts that lack @file{stdckdint.h}.
|
|
This module contains a source file for the replacement header, along
|
|
with an Autoconf macro that arranges to use the replacement header on
|
|
older systems.
|
|
|
|
For more information, consult the Gnulib website,
|
|
@uref{https://@/www.gnu.org/@/software/@/gnulib/}.
|
|
|
|
@node Libtool
|
|
@section Libtool
|
|
|
|
Often, one wants to build not only programs, but libraries, so that
|
|
other programs can benefit from the fruits of your labor. Ideally, one
|
|
would like to produce @emph{shared} (dynamically linked) libraries,
|
|
which can be used by multiple programs without duplication on disk or in
|
|
memory and can be updated independently of the linked programs.
|
|
Producing shared libraries portably, however, is the stuff of
|
|
nightmares---each system has its own incompatible tools, compiler flags,
|
|
and magic incantations. Fortunately, GNU provides a solution:
|
|
@dfn{Libtool}.
|
|
@cindex Libtool
|
|
|
|
Libtool handles all the requirements of building shared libraries for
|
|
you, and at this time seems to be the @emph{only} way to do so with any
|
|
portability. It also handles many other headaches, such as: the
|
|
interaction of Make rules with the variable suffixes of
|
|
shared libraries, linking reliably with shared libraries before they are
|
|
installed by the superuser, and supplying a consistent versioning system
|
|
(so that different versions of a library can be installed or upgraded
|
|
without breaking binary compatibility). Although Libtool, like
|
|
Autoconf, can be used without Automake, it is most simply utilized in
|
|
conjunction with Automake---there, Libtool is used automatically
|
|
whenever shared libraries are needed, and you need not know its syntax.
|
|
|
|
@node Pointers
|
|
@section Pointers
|
|
|
|
Developers who are used to the simplicity of @command{make} for small
|
|
projects on a single system might be daunted at the prospect of
|
|
learning to use Automake and Autoconf. As your software is
|
|
distributed to more and more users, however, you otherwise
|
|
quickly find yourself putting lots of effort into reinventing the
|
|
services that the GNU build tools provide, and making the
|
|
same mistakes that they once made and overcame. (Besides, since
|
|
you're already learning Autoconf, Automake is a piece of cake.)
|
|
|
|
There are a number of places that you can go to for more information on
|
|
the GNU build tools.
|
|
|
|
@itemize @minus
|
|
|
|
@item Web
|
|
|
|
The project home pages for
|
|
@uref{https://@/www@/.gnu@/.org/@/software/@/autoconf/, Autoconf},
|
|
@uref{https://@/www@/.gnu@/.org/@/software/@/automake/, Automake},
|
|
@uref{https://@/www@/.gnu@/.org/@/software/@/gnulib/, Gnulib}, and
|
|
@uref{https://@/www@/.gnu@/.org/@/software/@/libtool/, Libtool}.
|
|
|
|
@item Automake Manual
|
|
|
|
@xref{Top, , Automake, automake, GNU Automake}, for more
|
|
information on Automake.
|
|
|
|
@item Books
|
|
|
|
The book @cite{GNU Autoconf, Automake and
|
|
Libtool}@footnote{@cite{GNU Autoconf, Automake and Libtool},
|
|
by G. V. Vaughan, B. Elliston, T. Tromey, and I. L. Taylor. SAMS (originally
|
|
New Riders), 2000, ISBN 1578701902.} describes the complete GNU
|
|
build environment. You can also find
|
|
@uref{https://@/www.sourceware.org/@/autobook/, the entire book on-line}.
|
|
|
|
@end itemize
|
|
|
|
@c ================================================= Making configure Scripts.
|
|
|
|
@node Making configure Scripts
|
|
@chapter Making @command{configure} Scripts
|
|
@cindex @file{aclocal.m4}
|
|
@cindex @command{configure}
|
|
|
|
The configuration scripts that Autoconf produces are by convention
|
|
called @command{configure}. When run, @command{configure} creates several
|
|
files, replacing configuration parameters in them with appropriate
|
|
values. The files that @command{configure} creates are:
|
|
|
|
@itemize @minus
|
|
@item
|
|
one or more @file{Makefile} files, usually one in each subdirectory of the
|
|
package (@pxref{Makefile Substitutions});
|
|
|
|
@item
|
|
optionally, a C header file, the name of which is configurable,
|
|
containing @code{#define} directives (@pxref{Configuration Headers});
|
|
|
|
@item
|
|
a shell script called @file{config.status} that, when run, recreates
|
|
the files listed above (@pxref{config.status Invocation});
|
|
|
|
@item
|
|
an optional shell script normally called @file{config.cache}
|
|
(created when using @samp{configure --config-cache}) that
|
|
saves the results of running many of the tests (@pxref{Cache Files});
|
|
|
|
@item
|
|
a file called @file{config.log} containing any messages produced by
|
|
compilers, to help debugging if @command{configure} makes a mistake.
|
|
@end itemize
|
|
|
|
@cindex @file{configure.ac}
|
|
To create a @command{configure} script with Autoconf, you need
|
|
to write an Autoconf input file @file{configure.ac} and run
|
|
@command{autoconf} on it. If you write your own feature tests to
|
|
supplement those that come with Autoconf, you might also write files
|
|
called @file{aclocal.m4} and @file{acsite.m4}. If you use a C header
|
|
file to contain @code{#define} directives, you might also run
|
|
@command{autoheader}, and you can distribute the generated file
|
|
@file{config.h.in} with the package.
|
|
|
|
Here is a diagram showing how the files that can be used in
|
|
configuration are produced. Programs that are executed are suffixed by
|
|
@samp{*}. Optional files are enclosed in square brackets (@samp{[]}).
|
|
@command{autoconf} and @command{autoheader} also read the installed Autoconf
|
|
macro files (by reading @file{autoconf.m4}).
|
|
|
|
@noindent
|
|
Files used in preparing a software package for distribution, when using
|
|
just Autoconf:
|
|
@example
|
|
your source files --> [autoscan*] --> [configure.scan] --> configure.ac
|
|
|
|
@group
|
|
configure.ac --.
|
|
| .------> autoconf* -----> configure
|
|
[aclocal.m4] --+---+
|
|
| `-----> [autoheader*] --> [config.h.in]
|
|
[acsite.m4] ---'
|
|
@end group
|
|
|
|
Makefile.in
|
|
@end example
|
|
|
|
@noindent
|
|
Additionally, if you use Automake, the following additional productions
|
|
come into play:
|
|
|
|
@example
|
|
@group
|
|
[acinclude.m4] --.
|
|
|
|
|
[local macros] --+--> aclocal* --> aclocal.m4
|
|
|
|
|
configure.ac ----'
|
|
@end group
|
|
|
|
@group
|
|
configure.ac --.
|
|
+--> automake* --> Makefile.in
|
|
Makefile.am ---'
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
Files used in configuring a software package:
|
|
@example
|
|
@group
|
|
.-------------> [config.cache]
|
|
configure* ------------+-------------> config.log
|
|
|
|
|
[config.h.in] -. v .-> [config.h] -.
|
|
+--> config.status* -+ +--> make*
|
|
Makefile.in ---' `-> Makefile ---'
|
|
@end group
|
|
@end example
|
|
|
|
@menu
|
|
* Writing Autoconf Input:: What to put in an Autoconf input file
|
|
* autoscan Invocation:: Semi-automatic @file{configure.ac} writing
|
|
* ifnames Invocation:: Listing the conditionals in source code
|
|
* autoconf Invocation:: How to create configuration scripts
|
|
* autoreconf Invocation:: Remaking multiple @command{configure} scripts
|
|
@end menu
|
|
|
|
@node Writing Autoconf Input
|
|
@section Writing @file{configure.ac}
|
|
|
|
To produce a @command{configure} script for a software package, create a
|
|
file called @file{configure.ac} that contains invocations of the
|
|
Autoconf macros that test the system features your package needs or can
|
|
use. Autoconf macros already exist to check for many features; see
|
|
@ref{Existing Tests}, for their descriptions. For most other features,
|
|
you can use Autoconf template macros to produce custom checks; see
|
|
@ref{Writing Tests}, for information about them. For especially tricky
|
|
or specialized features, @file{configure.ac} might need to contain some
|
|
hand-crafted shell commands; see @ref{Portable Shell, , Portable Shell
|
|
Programming}. The @command{autoscan} program can give you a good start
|
|
in writing @file{configure.ac} (@pxref{autoscan Invocation}, for more
|
|
information).
|
|
|
|
@cindex @file{configure.in}
|
|
Previous versions of Autoconf promoted the name @file{configure.in},
|
|
which is somewhat ambiguous (the tool needed to process this file is not
|
|
described by its extension), and introduces a slight confusion with
|
|
@file{config.h.in} and so on (for which @samp{.in} means ``to be
|
|
processed by @command{configure}''). Using @file{configure.ac} is now
|
|
preferred, while the use of @file{configure.in} will cause warnings
|
|
from @command{autoconf}.
|
|
|
|
@menu
|
|
* Shell Script Compiler:: Autoconf as solution of a problem
|
|
* Autoconf Language:: Programming in Autoconf
|
|
* Autoconf Input Layout:: Standard organization of @file{configure.ac}
|
|
@end menu
|
|
|
|
@node Shell Script Compiler
|
|
@subsection A Shell Script Compiler
|
|
|
|
Just as for any other computer language, in order to properly program
|
|
@file{configure.ac} in Autoconf you must understand @emph{what} problem
|
|
the language tries to address and @emph{how} it does so.
|
|
|
|
The problem Autoconf addresses is that the world is a mess. After all,
|
|
you are using Autoconf in order to have your package compile easily on
|
|
all sorts of different systems, some of them being extremely hostile.
|
|
Autoconf itself bears the price for these differences: @command{configure}
|
|
must run on all those systems, and thus @command{configure} must limit itself
|
|
to their lowest common denominator of features.
|
|
|
|
Naturally, you might then think of shell scripts; who needs
|
|
@command{autoconf}? A set of properly written shell functions is enough to
|
|
make it easy to write @command{configure} scripts by hand. Sigh!
|
|
Unfortunately, even in 2008, where shells without any function support are
|
|
far and few between, there are pitfalls to avoid when making use of them.
|
|
Also, finding a Bourne shell that accepts shell functions is not trivial,
|
|
even though there is almost always one on interesting porting targets.
|
|
|
|
So, what is really needed is some kind of compiler, @command{autoconf},
|
|
that takes an Autoconf program, @file{configure.ac}, and transforms it
|
|
into a portable shell script, @command{configure}.
|
|
|
|
How does @command{autoconf} perform this task?
|
|
|
|
There are two obvious possibilities: creating a brand new language or
|
|
extending an existing one. The former option is attractive: all
|
|
sorts of optimizations could easily be implemented in the compiler and
|
|
many rigorous checks could be performed on the Autoconf program
|
|
(e.g., rejecting any non-portable construct). Alternatively, you can
|
|
extend an existing language, such as the @code{sh} (Bourne shell)
|
|
language.
|
|
|
|
Autoconf does the latter: it is a layer on top of @code{sh}. It was
|
|
therefore most convenient to implement @command{autoconf} as a macro
|
|
expander: a program that repeatedly performs @dfn{macro expansions} on
|
|
text input, replacing macro calls with macro bodies and producing a pure
|
|
@code{sh} script in the end. Instead of implementing a dedicated
|
|
Autoconf macro expander, it is natural to use an existing
|
|
general-purpose macro language, such as M4, and implement the extensions
|
|
as a set of M4 macros.
|
|
|
|
|
|
@node Autoconf Language
|
|
@subsection The Autoconf Language
|
|
@cindex quotation
|
|
|
|
The Autoconf language differs from many other computer
|
|
languages because it treats actual code the same as plain text. Whereas
|
|
in C, for instance, data and instructions have different syntactic
|
|
status, in Autoconf their status is rigorously the same. Therefore, we
|
|
need a means to distinguish literal strings from text to be expanded:
|
|
quotation.
|
|
|
|
When calling macros that take arguments, there must not be any white
|
|
space between the macro name and the open parenthesis.
|
|
|
|
@example
|
|
AC_INIT ([oops], [1.0]) # incorrect
|
|
AC_INIT([hello], [1.0]) # good
|
|
@end example
|
|
|
|
Arguments should
|
|
be enclosed within the quote characters @samp{[} and @samp{]}, and be
|
|
separated by commas. Any leading blanks or newlines in arguments are ignored,
|
|
unless they are quoted. You should always quote an argument that
|
|
might contain a macro name, comma, parenthesis, or a leading blank or
|
|
newline. This rule applies recursively for every macro
|
|
call, including macros called from other macros. For more details on
|
|
quoting rules, see @ref{Programming in M4}.
|
|
|
|
For instance:
|
|
|
|
@example
|
|
AC_CHECK_HEADER([stdio.h],
|
|
[AC_DEFINE([HAVE_STDIO_H], [1],
|
|
[Define to 1 if you have <stdio.h>.])],
|
|
[AC_MSG_ERROR([sorry, can't do anything for you])])
|
|
@end example
|
|
|
|
@noindent
|
|
is quoted properly. You may safely simplify its quotation to:
|
|
|
|
@example
|
|
AC_CHECK_HEADER([stdio.h],
|
|
[AC_DEFINE([HAVE_STDIO_H], 1,
|
|
[Define to 1 if you have <stdio.h>.])],
|
|
[AC_MSG_ERROR([sorry, can't do anything for you])])
|
|
@end example
|
|
|
|
@noindent
|
|
because @samp{1} cannot contain a macro call. Here, the argument of
|
|
@code{AC_MSG_ERROR} must be quoted; otherwise, its comma would be
|
|
interpreted as an argument separator. Also, the second and third arguments
|
|
of @samp{AC_CHECK_HEADER} must be quoted, since they contain
|
|
macro calls. The three arguments @samp{HAVE_STDIO_H}, @samp{stdio.h},
|
|
and @samp{Define to 1 if you have <stdio.h>.} do not need quoting, but
|
|
if you unwisely defined a macro with a name like @samp{Define} or
|
|
@samp{stdio} then they would need quoting. Cautious Autoconf users
|
|
would keep the quotes, but many Autoconf users find such precautions
|
|
annoying, and would rewrite the example as follows:
|
|
|
|
@example
|
|
AC_CHECK_HEADER(stdio.h,
|
|
[AC_DEFINE(HAVE_STDIO_H, 1,
|
|
[Define to 1 if you have <stdio.h>.])],
|
|
[AC_MSG_ERROR([sorry, can't do anything for you])])
|
|
@end example
|
|
|
|
@noindent
|
|
This is safe, so long as you adopt good naming conventions and do not
|
|
define macros with names like @samp{HAVE_STDIO_H}, @samp{stdio}, or
|
|
@samp{h}. Though it is also safe here to omit the quotes around
|
|
@samp{Define to 1 if you have <stdio.h>.} this is not recommended, as
|
|
message strings are more likely to inadvertently contain commas.
|
|
|
|
The following example is wrong and dangerous, as it is underquoted:
|
|
|
|
@example
|
|
AC_CHECK_HEADER(stdio.h,
|
|
AC_DEFINE(HAVE_STDIO_H, 1,
|
|
Define to 1 if you have <stdio.h>.),
|
|
AC_MSG_ERROR([sorry, can't do anything for you]))
|
|
@end example
|
|
|
|
In other cases, you may want to use text that also resembles a macro
|
|
call. You must quote that text (whether just the potential problem, or
|
|
the entire line) even when it is not passed as a macro argument; and you
|
|
may also have to use @code{m4_pattern_allow} (@pxref{Forbidden
|
|
Patterns}), to declare your intention that the resulting configure file
|
|
will have a literal that resembles what would otherwise be reserved for
|
|
a macro name. For example:
|
|
|
|
@example
|
|
dnl Simulate a possible future autoconf macro
|
|
m4_define([AC_DC], [oops])
|
|
dnl Underquoted:
|
|
echo "Hard rock was here! --AC_DC"
|
|
dnl Correctly quoted:
|
|
m4_pattern_allow([AC_DC])
|
|
echo "Hard rock was here! --[AC_DC]"
|
|
[echo "Hard rock was here! --AC_DC"]
|
|
@end example
|
|
|
|
@noindent
|
|
which results in this text in @file{configure}:
|
|
|
|
@example
|
|
echo "Hard rock was here! --oops"
|
|
echo "Hard rock was here! --AC_DC"
|
|
echo "Hard rock was here! --AC_DC"
|
|
@end example
|
|
|
|
@noindent
|
|
When you use the same text in a macro argument, you must therefore have
|
|
an extra quotation level (since one is stripped away by the macro
|
|
substitution). In general, then, it is a good idea to @emph{use double
|
|
quoting for all literal string arguments}, either around just the
|
|
problematic portions, or over the entire argument:
|
|
|
|
@example
|
|
m4_pattern_allow([AC_DC])
|
|
AC_MSG_WARN([[AC_DC] stinks --Iron Maiden])
|
|
AC_MSG_WARN([[AC_DC stinks --Iron Maiden]])
|
|
@end example
|
|
|
|
It is also possible to avoid the problematic patterns in the first
|
|
place, by the use of additional escaping (either a quadrigraph, or
|
|
creative shell constructs), in which case it is no longer necessary to
|
|
use @code{m4_pattern_allow}:
|
|
|
|
@example
|
|
echo "Hard rock was here! --AC""_DC"
|
|
AC_MSG_WARN([[AC@@&t@@_DC stinks --Iron Maiden]])
|
|
@end example
|
|
|
|
You are now able to understand one of the constructs of Autoconf that
|
|
has been continually misunderstood@enddots{} The rule of thumb is that
|
|
@emph{whenever you expect macro expansion, expect quote expansion};
|
|
i.e., expect one level of quotes to be lost. For instance:
|
|
|
|
@example
|
|
AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [],
|
|
[AC_MSG_ERROR([you lose])])
|
|
@end example
|
|
|
|
@noindent
|
|
is incorrect: here, the first argument of @code{AC_LANG_SOURCE} is
|
|
@samp{char b[10];} and is expanded once, which results in
|
|
@samp{char b10;}; and the @code{AC_LANG_SOURCE} is also expanded prior
|
|
to being passed to @code{AC_COMPILE_IFELSE}. (There was an idiom common
|
|
in Autoconf's past to
|
|
address this issue via the M4 @code{changequote} primitive, but do not
|
|
use it!) Let's take a closer look: the author meant the first argument
|
|
to be understood as a literal, and therefore it must be quoted twice;
|
|
likewise, the intermediate @code{AC_LANG_SOURCE} macro should be quoted
|
|
once so that it is only expanded after the rest of the body of
|
|
@code{AC_COMPILE_IFELSE} is in place:
|
|
|
|
@example
|
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [],
|
|
[AC_MSG_ERROR([you lose])])
|
|
@end example
|
|
|
|
@noindent
|
|
Voilà, you actually produce @samp{char b[10];} this time!
|
|
|
|
On the other hand, descriptions (e.g., the last parameter of
|
|
@code{AC_DEFINE} or @code{AS_HELP_STRING}) are not literals---they
|
|
are subject to line breaking, for example---and should not be double quoted.
|
|
Even if these descriptions are short and are not actually broken, double
|
|
quoting them yields weird results.
|
|
|
|
Some macros take optional arguments, which this documentation represents
|
|
as @ovar{arg} (not to be confused with the quote characters). You may
|
|
just leave them empty, or use @samp{[]} to make the emptiness of the
|
|
argument explicit, or you may simply omit the trailing commas. The
|
|
three lines below are equivalent:
|
|
|
|
@example
|
|
AC_CHECK_HEADERS([stdio.h], [], [], [])
|
|
AC_CHECK_HEADERS([stdio.h],,,)
|
|
AC_CHECK_HEADERS([stdio.h])
|
|
@end example
|
|
|
|
It is best to put each macro call on its own line in
|
|
@file{configure.ac}. Most of the macros don't add extra newlines; they
|
|
rely on the newline after the macro call to terminate the commands.
|
|
This approach makes the generated @command{configure} script a little
|
|
easier to read by not inserting lots of blank lines. It is generally
|
|
safe to set shell variables on the same line as a macro call, because
|
|
the shell allows assignments without intervening newlines.
|
|
|
|
You can include comments in @file{configure.ac} files by starting them
|
|
with the @samp{#}. For example, it is helpful to begin
|
|
@file{configure.ac} files with a line like this:
|
|
|
|
@example
|
|
# Process this file with autoconf to produce a configure script.
|
|
@end example
|
|
|
|
@node Autoconf Input Layout
|
|
@subsection Standard @file{configure.ac} Layout
|
|
|
|
The order in which @file{configure.ac} calls the Autoconf macros is not
|
|
important, with a few exceptions. Every @file{configure.ac} must
|
|
contain a call to @code{AC_INIT} before the checks, and a call to
|
|
@code{AC_OUTPUT} at the end (@pxref{Output}). Additionally, some macros
|
|
rely on other macros having been called first, because they check
|
|
previously set values of some variables to decide what to do. These
|
|
macros are noted in the individual descriptions (@pxref{Existing
|
|
Tests}), and they also warn you when @command{configure} is created if they
|
|
are called out of order.
|
|
|
|
To encourage consistency, here is a suggested order for calling the
|
|
Autoconf macros. Generally speaking, the things near the end of this
|
|
list are those that could depend on things earlier in it. For example,
|
|
library functions could be affected by types and libraries.
|
|
|
|
@display
|
|
@group
|
|
Autoconf requirements
|
|
@code{AC_INIT(@var{package}, @var{version}, @var{bug-report-address})}
|
|
information on the package
|
|
checks for programs
|
|
checks for libraries
|
|
checks for header files
|
|
checks for types
|
|
checks for structures
|
|
checks for compiler characteristics
|
|
checks for library functions
|
|
checks for system services
|
|
@code{AC_CONFIG_FILES(@r{[}@var{file@dots{}}@r{]})}
|
|
@code{AC_OUTPUT}
|
|
@end group
|
|
@end display
|
|
|
|
|
|
@node autoscan Invocation
|
|
@section Using @command{autoscan} to Create @file{configure.ac}
|
|
@cindex @command{autoscan}
|
|
|
|
The @command{autoscan} program can help you create and/or maintain a
|
|
@file{configure.ac} file for a software package. @command{autoscan}
|
|
examines source files in the directory tree rooted at a directory given
|
|
as a command line argument, or the current directory if none is given.
|
|
It searches the source files for common portability problems and creates
|
|
a file @file{configure.scan} which is a preliminary @file{configure.ac}
|
|
for that package, and checks a possibly existing @file{configure.ac} for
|
|
completeness.
|
|
|
|
When using @command{autoscan} to create a @file{configure.ac}, you
|
|
should manually examine @file{configure.scan} before renaming it to
|
|
@file{configure.ac}; it probably needs some adjustments.
|
|
Occasionally, @command{autoscan} outputs a macro in the wrong order
|
|
relative to another macro, so that @command{autoconf} produces a warning;
|
|
you need to move such macros manually. Also, if you want the package to
|
|
use a configuration header file, you must add a call to
|
|
@code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}). You might
|
|
also have to change or add some @code{#if} directives to your program in
|
|
order to make it work with Autoconf (@pxref{ifnames Invocation}, for
|
|
information about a program that can help with that job).
|
|
|
|
When using @command{autoscan} to maintain a @file{configure.ac}, simply
|
|
consider adding its suggestions. The file @file{autoscan.log}
|
|
contains detailed information on why a macro is requested.
|
|
|
|
@command{autoscan} uses several data files (installed along with Autoconf)
|
|
to determine which macros to output when it finds particular symbols in
|
|
a package's source files. These data files all have the same format:
|
|
each line consists of a symbol, one or more blanks, and the Autoconf macro to
|
|
output if that symbol is encountered. Lines starting with @samp{#} are
|
|
comments.
|
|
|
|
@command{autoscan} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Print the names of the files it examines and the potentially interesting
|
|
symbols it finds in them. This output can be voluminous.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove temporary files.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Append @var{dir} to the include path. Multiple invocations accumulate.
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend @var{dir} to the include path. Multiple invocations accumulate.
|
|
@end table
|
|
|
|
@node ifnames Invocation
|
|
@section Using @command{ifnames} to List Conditionals
|
|
@cindex @command{ifnames}
|
|
|
|
@command{ifnames} can help you write @file{configure.ac} for a software
|
|
package. It prints the identifiers that the package already uses in C
|
|
preprocessor conditionals. If a package has already been set up to have
|
|
some portability, @command{ifnames} can thus help you figure out what its
|
|
@command{configure} needs to check for. It may help fill in some gaps in a
|
|
@file{configure.ac} generated by @command{autoscan} (@pxref{autoscan
|
|
Invocation}).
|
|
|
|
@command{ifnames} scans all of the C source files named on the command line
|
|
(or the standard input, if none are given) and writes to the standard
|
|
output a sorted list of all the identifiers that appear in those files
|
|
in @code{#if}, @code{#ifdef}, @code{#ifndef}, @code{#elif},
|
|
@code{#elifdef}, or @code{#elifndef} directives.
|
|
It prints each identifier on a line, followed by a
|
|
space-separated list of the files in which that identifier occurs.
|
|
|
|
@noindent
|
|
@command{ifnames} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
@end table
|
|
|
|
@node autoconf Invocation
|
|
@section Using @command{autoconf} to Create @command{configure}
|
|
@cindex @command{autoconf}
|
|
|
|
To create @command{configure} from @file{configure.ac}, run the
|
|
@command{autoconf} program with no arguments. @command{autoconf} processes
|
|
@file{configure.ac} with the M4 macro processor, using the
|
|
Autoconf macros. If you give @command{autoconf} an argument, it reads that
|
|
file instead of @file{configure.ac} and writes the configuration script
|
|
to the standard output instead of to @command{configure}. If you give
|
|
@command{autoconf} the argument @option{-}, it reads from the standard
|
|
input instead of @file{configure.ac} and writes the configuration script
|
|
to the standard output.
|
|
|
|
The Autoconf macros are defined in several files. Some of the files are
|
|
distributed with Autoconf; @command{autoconf} reads them first. Then it
|
|
looks for the optional file @file{acsite.m4} in the directory that
|
|
contains the distributed Autoconf macro files, and for the optional file
|
|
@file{aclocal.m4} in the current directory. Those files can contain
|
|
your site's or the package's own Autoconf macro definitions
|
|
(@pxref{Writing Autoconf Macros}, for more information). If a macro is
|
|
defined in more than one of the files that @command{autoconf} reads, the
|
|
last definition it reads overrides the earlier ones.
|
|
|
|
@command{autoconf} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Report processing steps.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files.
|
|
|
|
@item --force
|
|
@itemx -f
|
|
Remake @file{configure} even if newer than its input files.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Append @var{dir} to the include path. Multiple invocations accumulate.
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend @var{dir} to the include path. Multiple invocations accumulate.
|
|
|
|
@item --output=@var{file}
|
|
@itemx -o @var{file}
|
|
Save output (script or trace) to @var{file}. The file @option{-} stands
|
|
for the standard output.
|
|
|
|
@item --warnings=@var{category}[,@var{category}...]
|
|
@itemx -W@var{category}[,@var{category}...]
|
|
@evindex WARNINGS
|
|
Enable or disable warnings related to each @var{category}.
|
|
@xref{m4_warn}, for a comprehensive list of categories.
|
|
Special values include:
|
|
|
|
@table @samp
|
|
@item all
|
|
Enable all categories of warnings.
|
|
|
|
@item none
|
|
Disable all categories of warnings.
|
|
|
|
@item error
|
|
Treat all warnings as errors.
|
|
|
|
@item no-@var{category}
|
|
Disable warnings falling into @var{category}.
|
|
@end table
|
|
|
|
The environment variable @env{WARNINGS} may also be set to a
|
|
comma-separated list of warning categories to enable or disable.
|
|
It is interpreted exactly the same way as the argument of
|
|
@option{--warnings}, but unknown categories are silently ignored.
|
|
The command line takes precedence; for instance, if @env{WARNINGS}
|
|
is set to @code{obsolete}, but @option{-Wnone} is given on the
|
|
command line, no warnings will be issued.
|
|
|
|
Some categories of warnings are on by default.
|
|
Again, for details see @ref{m4_warn}.
|
|
|
|
@item --trace=@var{macro}[:@var{format}]
|
|
@itemx -t @var{macro}[:@var{format}]
|
|
Do not create the @command{configure} script, but list the calls to
|
|
@var{macro} according to the @var{format}. Multiple @option{--trace}
|
|
arguments can be used to list several macros. Multiple @option{--trace}
|
|
arguments for a single macro are not cumulative; instead, you should
|
|
just make @var{format} as long as needed.
|
|
|
|
The @var{format} is a regular string, with newlines if desired, and
|
|
several special escape codes. It defaults to @samp{$f:$l:$n:$%}; see
|
|
@ref{autom4te Invocation}, for details on the @var{format}.
|
|
|
|
@item --initialization
|
|
@itemx -i
|
|
By default, @option{--trace} does not trace the initialization of the
|
|
Autoconf macros (typically the @code{AC_DEFUN} definitions). This
|
|
results in a noticeable speedup, but can be disabled by this option.
|
|
@end table
|
|
|
|
|
|
It is often necessary to check the content of a @file{configure.ac}
|
|
file, but parsing it yourself is extremely fragile and error-prone. It
|
|
is suggested that you rely upon @option{--trace} to scan
|
|
@file{configure.ac}. For instance, to find the list of variables that
|
|
are substituted, use:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{autoconf -t AC_SUBST}
|
|
configure.ac:28:AC_SUBST:SHELL
|
|
configure.ac:28:AC_SUBST:PATH_SEPARATOR
|
|
@i{More traces deleted}
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
The example below highlights the difference between @samp{$@@},
|
|
@samp{$*}, and @samp{$%}.
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{cat configure.ac}
|
|
AC_DEFINE(This, is, [an
|
|
[example]])
|
|
$ @kbd{autoconf -t 'AC_DEFINE:@@: $@@}
|
|
*: $*
|
|
%: $%'
|
|
@@: [This],[is],[an
|
|
[example]]
|
|
*: This,is,an
|
|
[example]
|
|
%: This:is:an [example]
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
The @var{format} gives you a lot of freedom:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{autoconf -t 'AC_SUBST:$$ac_subst@{"$1"@} = "$f:$l";'}
|
|
$ac_subst@{"SHELL"@} = "configure.ac:28";
|
|
$ac_subst@{"PATH_SEPARATOR"@} = "configure.ac:28";
|
|
@i{More traces deleted}
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
A long @var{separator} can be used to improve the readability of complex
|
|
structures, and to ease their parsing (for instance when no single
|
|
character is suitable as a separator):
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{autoconf -t 'AM_MISSING_PROG:$@{|:::::|@}*'}
|
|
ACLOCAL|:::::|aclocal|:::::|$missing_dir
|
|
AUTOCONF|:::::|autoconf|:::::|$missing_dir
|
|
AUTOMAKE|:::::|automake|:::::|$missing_dir
|
|
@i{More traces deleted}
|
|
@end group
|
|
@end example
|
|
|
|
@node autoreconf Invocation
|
|
@section Using @command{autoreconf} to Update @command{configure} Scripts
|
|
@cindex @command{autoreconf}
|
|
|
|
Installing the various components of the GNU Build System can be
|
|
tedious: running @command{autopoint} for Gettext, @command{automake} for
|
|
@file{Makefile.in} etc.@: in each directory. It may be needed either
|
|
because some tools such as @command{automake} have been updated on your
|
|
system, or because some of the sources such as @file{configure.ac} have
|
|
been updated, or finally, simply in order to install the GNU Build
|
|
System in a fresh tree.
|
|
|
|
@command{autoreconf} runs @command{autoconf}, @command{autoheader},
|
|
@command{aclocal}, @command{automake}, @command{libtoolize}, @command{intltoolize},
|
|
@command{gtkdocize}, and @command{autopoint} (when appropriate) repeatedly
|
|
to update the GNU Build System in the specified directories and their
|
|
subdirectories (@pxref{Subdirectories}). By default, it only remakes
|
|
those files that are older than their sources. The environment variables
|
|
@env{AUTOM4TE}, @env{AUTOCONF}, @env{AUTOHEADER}, @env{AUTOMAKE}, @env{ACLOCAL},
|
|
@env{AUTOPOINT}, @env{LIBTOOLIZE}, @env{INTLTOOLIZE}, @env{GTKDOCIZE}, @env{M4},
|
|
and @env{MAKE} may be used to override the invocation of the respective tools.
|
|
|
|
If you install a new version of some tool, you can make
|
|
@command{autoreconf} remake @emph{all} of the files by giving it the
|
|
@option{--force} option.
|
|
|
|
@xref{Automatic Remaking}, for Make rules to automatically
|
|
rebuild @command{configure} scripts when their source files change. That
|
|
method handles the timestamps of configuration header templates
|
|
properly, but does not pass @option{--autoconf-dir=@var{dir}} or
|
|
@option{--localdir=@var{dir}}.
|
|
|
|
@cindex Gettext
|
|
@cindex @command{autopoint}
|
|
Gettext supplies the @command{autopoint} command to add translation
|
|
infrastructure to a source package. If you use @command{autopoint},
|
|
your @file{configure.ac} should invoke @code{AM_GNU_GETTEXT} and
|
|
one of @code{AM_GNU_GETTEXT_VERSION(@var{gettext-version})} or
|
|
@code{AM_GNU_GETTEXT_REQUIRE_VERSION(@var{min-gettext-version})}.
|
|
@xref{autopoint Invocation, , Invoking the @code{autopoint} Program,
|
|
gettext, GNU @code{gettext} utilities}, for further details.
|
|
|
|
@noindent
|
|
@command{autoreconf} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Print the name of each directory @command{autoreconf} examines and the
|
|
commands it runs. If given two or more times, pass @option{--verbose}
|
|
to subordinate tools that support it.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files.
|
|
|
|
@item --force
|
|
@itemx -f
|
|
Consider all generated and standard auxiliary files to be obsolete.
|
|
This remakes even @file{configure} scripts and configuration headers
|
|
that are newer than their input files (@file{configure.ac} and, if
|
|
present, @file{aclocal.m4}).
|
|
|
|
If deemed appropriate, this option triggers calls to @samp{automake
|
|
--force-missing}. Passing both @option{--force} and @option{--install}
|
|
to @command{autoreconf} will in turn undo any customizations to standard
|
|
files. Note that the macro @code{AM_INIT_AUTOMAKE} has some options
|
|
which change the set of files considered to be standard.
|
|
|
|
@item --install
|
|
@itemx -i
|
|
Install any missing standard auxiliary files in the package. By
|
|
default, files are copied; this can be changed with @option{--symlink}.
|
|
|
|
If deemed appropriate, this option triggers calls to
|
|
@samp{automake --add-missing},
|
|
@samp{libtoolize}, @samp{autopoint}, etc.
|
|
|
|
@item --no-recursive
|
|
Do not rebuild files in subdirectories to configure (see @ref{Subdirectories},
|
|
macro @code{AC_CONFIG_SUBDIRS}).
|
|
|
|
@item --symlink
|
|
@itemx -s
|
|
When used with @option{--install}, install symbolic links to the missing
|
|
auxiliary files instead of copying them.
|
|
|
|
@item --make
|
|
@itemx -m
|
|
When the directories were configured, update the configuration by
|
|
running @samp{./config.status --recheck && ./config.status}, and then
|
|
run @samp{make}.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Append @var{dir} to the include path. Multiple invocations accumulate.
|
|
Passed on to @command{aclocal}, @command{autoconf} and
|
|
@command{autoheader} internally.
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend @var{dir} to the include path. Multiple invocations accumulate.
|
|
Passed on to @command{autoconf} and @command{autoheader} internally.
|
|
|
|
@item --warnings=@var{category}[,@var{category}...]
|
|
@itemx -W@var{category}[,@var{category}...]
|
|
@evindex WARNINGS
|
|
Enable or disable warnings related to each @var{category}.
|
|
@xref{m4_warn}, for a comprehensive list of categories.
|
|
Special values include:
|
|
|
|
@table @samp
|
|
@item all
|
|
Enable all categories of warnings.
|
|
|
|
@item none
|
|
Disable all categories of warnings.
|
|
|
|
@item error
|
|
Treat all warnings as errors.
|
|
|
|
@item no-@var{category}
|
|
Disable warnings falling into @var{category}.
|
|
@end table
|
|
|
|
The environment variable @env{WARNINGS} may also be set to a
|
|
comma-separated list of warning categories to enable or disable.
|
|
It is interpreted exactly the same way as the argument of
|
|
@option{--warnings}, but unknown categories are silently ignored.
|
|
The command line takes precedence; for instance, if @env{WARNINGS}
|
|
is set to @code{obsolete}, but @option{-Wnone} is given on the
|
|
command line, no warnings will be issued.
|
|
|
|
Some categories of warnings are on by default.
|
|
Again, for details see @ref{m4_warn}.
|
|
@end table
|
|
|
|
If you want @command{autoreconf} to pass flags that are not listed here
|
|
on to @command{aclocal}, set @code{ACLOCAL_AMFLAGS} in your @file{Makefile.am}.
|
|
Due to a limitation in the Autoconf implementation these flags currently
|
|
must be set on a single line in @file{Makefile.am}, without any
|
|
backslash-newlines or makefile comments.
|
|
Also, be aware that future Automake releases might
|
|
start flagging @code{ACLOCAL_AMFLAGS} as obsolescent, or even remove
|
|
support for it.
|
|
|
|
@c ========================================= Initialization and Output Files.
|
|
|
|
@node Setup
|
|
@chapter Initialization and Output Files
|
|
|
|
Autoconf-generated @command{configure} scripts need some information about
|
|
how to initialize, such as how to find the package's source files and
|
|
about the output files to produce. The following sections describe the
|
|
initialization and the creation of output files.
|
|
|
|
@menu
|
|
* Initializing configure:: Option processing etc.
|
|
* Versioning:: Dealing with Autoconf versions
|
|
* Notices:: Copyright, version numbers in @command{configure}
|
|
* Input:: Where Autoconf should find files
|
|
* Output:: Outputting results from the configuration
|
|
* Configuration Actions:: Preparing the output based on results
|
|
* Configuration Files:: Creating output files
|
|
* Makefile Substitutions:: Using output variables in makefiles
|
|
* Configuration Headers:: Creating a configuration header file
|
|
* Configuration Commands:: Running arbitrary instantiation commands
|
|
* Configuration Links:: Links depending on the configuration
|
|
* Subdirectories:: Configuring independent packages together
|
|
* Default Prefix:: Changing the default installation prefix
|
|
@end menu
|
|
|
|
@node Initializing configure
|
|
@section Initializing @command{configure}
|
|
|
|
Every @command{configure} script must call @code{AC_INIT} before doing
|
|
anything else that produces output. Calls to silent macros, such as
|
|
@code{AC_DEFUN}, may also occur prior to @code{AC_INIT}, although these
|
|
are generally used via @file{aclocal.m4}, since that is implicitly
|
|
included before the start of @file{configure.ac}. The only other
|
|
required macro is @code{AC_OUTPUT} (@pxref{Output}).
|
|
|
|
@anchor{AC_INIT}
|
|
@defmac AC_INIT (@var{package}, @var{version}, @ovar{bug-report}, @
|
|
@ovar{tarname}, @ovar{url})
|
|
@acindex{INIT}
|
|
Process any command-line arguments and perform initialization
|
|
and verification.
|
|
|
|
Set the name of the @var{package} and its @var{version}. These are
|
|
typically used in @option{--version} support, including that of
|
|
@command{configure}. The optional argument @var{bug-report} should be
|
|
the email to which users should send bug reports. The package
|
|
@var{tarname} differs from @var{package}: the latter designates the full
|
|
package name (e.g., @samp{GNU Autoconf}), while the former is meant for
|
|
distribution tar ball names (e.g., @samp{autoconf}). It defaults to
|
|
@var{package} with @samp{GNU } stripped, lower-cased, and all characters
|
|
other than alphanumerics and underscores are changed to @samp{-}. If
|
|
provided, @var{url} should be the home page for the package.
|
|
|
|
Leading and trailing whitespace is stripped from all the arguments to
|
|
@code{AC_INIT}, and interior whitespace is collapsed to a single space.
|
|
This means that, for instance, if you want to put several email
|
|
addresses in @var{bug-report}, you can put each one on its own line:
|
|
|
|
@smallexample
|
|
@group
|
|
# We keep having problems with the mail hosting for
|
|
# gnomovision.example, so give people an alternative.
|
|
AC_INIT([Gnomovision], [17.0.1], [
|
|
bugs@@gnomovision.example
|
|
or gnomo-bugs@@reliable-email.example
|
|
])
|
|
@end group
|
|
@end smallexample
|
|
|
|
The arguments to @code{AC_INIT} may be computed by M4, when
|
|
@command{autoconf} is run. For instance, if you want to include the
|
|
package's version number in the @var{tarname}, but you don't want to
|
|
repeat it, you can use a helper macro:
|
|
|
|
@smallexample
|
|
@group
|
|
m4_define([gnomo_VERSION], [17.0.1])
|
|
AC_INIT([Gnomovision],
|
|
m4_defn([gnomo_VERSION]),
|
|
[bugs@@gnomovision.example],
|
|
[gnomo-]m4_defn([gnomo_VERSION]))
|
|
@end group
|
|
@end smallexample
|
|
|
|
This uses @code{m4_defn} to produce the expansion of
|
|
@code{gnomo_VERSION} @emph{as a quoted string}, so that if there happen
|
|
to be any more M4 macro names in @code{gnomo_VERSION}, they will not be
|
|
expanded. @xref{Defn,,Renaming Macros,m4,GNU m4 macro processor}.
|
|
|
|
Continuing this example, if you don't want to embed the version number
|
|
in @file{configure.ac} at all, you can use @code{m4_esyscmd} to look it
|
|
up somewhere else when @command{autoconf} is run:
|
|
|
|
@smallexample
|
|
@group
|
|
m4_define([gnomo_VERSION],
|
|
m4_esyscmd([build-aux/git-version-gen .tarball-version]))
|
|
AC_INIT([Gnomovision],
|
|
m4_defn([gnomo_VERSION]),
|
|
[bugs@@gnomovision.example],
|
|
[gnomo-]m4_defn([gnomo_VERSION]))
|
|
@end group
|
|
@end smallexample
|
|
|
|
This uses the utility script @command{git-version-gen} to look up
|
|
the package's version in its version control metadata. This script
|
|
is part of Gnulib (@pxref{Gnulib}).
|
|
|
|
The arguments to @code{AC_INIT} are written into @file{configure} in
|
|
several different places. Therefore, we strongly recommend that you
|
|
write any M4 logic in @code{AC_INIT} arguments to be evaluated
|
|
@emph{before} @code{AC_INIT} itself is evaluated. For instance, in the
|
|
above example, the second argument to @code{m4_define} is @emph{not}
|
|
quoted, so the @code{m4_esyscmd} is evaluated only once, and
|
|
@code{gnomo_VERSION} is defined to the output of the command. If the
|
|
second argument to @code{m4_define} were quoted, @code{m4_esyscmd} would
|
|
be evaluated each time the @var{version} or @var{tarname} arguments were
|
|
written to @file{configure}, and the command would be run repeatedly.
|
|
|
|
In some of the places where the arguments to @code{AC_INIT} are used,
|
|
within @file{configure}, shell evaluation cannot happen. Therefore, the
|
|
arguments to @code{AC_INIT} may @emph{not} be computed when
|
|
@command{configure} is run. If they contain any construct that isn't
|
|
always treated as literal by the shell (e.g.@: variable expansions),
|
|
@command{autoconf} will issue an error.
|
|
|
|
The @var{tarname} argument is used to construct filenames. It should
|
|
not contain wildcard characters, white space, or anything else that
|
|
could be troublesome as part of a file or directory name.
|
|
|
|
Some of M4's active characters (notably parentheses, square brackets,
|
|
@samp{,} and @samp{#}) commonly appear in URLs and lists of email
|
|
addresses. If any of these characters appear in an argument to AC_INIT,
|
|
that argument will probably need to be double-quoted to avoid errors
|
|
and mistranscriptions. @xref{M4 Quotation}.
|
|
|
|
The following M4 macros (e.g., @code{AC_PACKAGE_NAME}), output variables
|
|
(e.g., @code{PACKAGE_NAME}), and preprocessor symbols (e.g.,
|
|
@code{PACKAGE_NAME}), are defined by @code{AC_INIT}:
|
|
|
|
@table @asis
|
|
@item @code{AC_PACKAGE_NAME}, @code{PACKAGE_NAME}
|
|
@acindex{PACKAGE_NAME}
|
|
@ovindex PACKAGE_NAME
|
|
@cvindex PACKAGE_NAME
|
|
Exactly @var{package}.
|
|
|
|
@item @code{AC_PACKAGE_TARNAME}, @code{PACKAGE_TARNAME}
|
|
@acindex{PACKAGE_TARNAME}
|
|
@ovindex PACKAGE_TARNAME
|
|
@cvindex PACKAGE_TARNAME
|
|
Exactly @var{tarname}, possibly generated from @var{package}.
|
|
|
|
@item @code{AC_PACKAGE_VERSION}, @code{PACKAGE_VERSION}
|
|
@acindex{PACKAGE_VERSION}
|
|
@ovindex PACKAGE_VERSION
|
|
@cvindex PACKAGE_VERSION
|
|
Exactly @var{version}.
|
|
|
|
@item @code{AC_PACKAGE_STRING}, @code{PACKAGE_STRING}
|
|
@acindex{PACKAGE_STRING}
|
|
@ovindex PACKAGE_STRING
|
|
@cvindex PACKAGE_STRING
|
|
Exactly @samp{@var{package} @var{version}}.
|
|
|
|
@item @code{AC_PACKAGE_BUGREPORT}, @code{PACKAGE_BUGREPORT}
|
|
@acindex{PACKAGE_BUGREPORT}
|
|
@ovindex PACKAGE_BUGREPORT
|
|
@cvindex PACKAGE_BUGREPORT
|
|
Exactly @var{bug-report}, if one was provided. Typically an email
|
|
address, or URL to a bug management web page.
|
|
|
|
@item @code{AC_PACKAGE_URL}, @code{PACKAGE_URL}
|
|
@acindex{PACKAGE_URL}
|
|
@ovindex PACKAGE_URL
|
|
@cvindex PACKAGE_URL
|
|
Exactly @var{url}, if one was provided. If @var{url} was empty, but
|
|
@var{package} begins with @samp{GNU }, then this defaults to
|
|
@samp{https://@/www.gnu.org/@/software/@/@var{tarname}/}, otherwise, no URL is
|
|
assumed.
|
|
@end table
|
|
@end defmac
|
|
|
|
If your @command{configure} script does its own option processing, it
|
|
should inspect @samp{$@@} or @samp{$*} immediately after calling
|
|
@code{AC_INIT}, because other Autoconf macros liberally use the
|
|
@command{set} command to process strings, and this has the side effect
|
|
of updating @samp{$@@} and @samp{$*}. However, we suggest that you use
|
|
standard macros like @code{AC_ARG_ENABLE} instead of attempting to
|
|
implement your own option processing. @xref{Site Configuration}.
|
|
|
|
@node Versioning
|
|
@section Dealing with Autoconf versions
|
|
@cindex Autoconf version
|
|
@cindex version, Autoconf
|
|
|
|
The following optional macros can be used to help choose the minimum
|
|
version of Autoconf that can successfully compile a given
|
|
@file{configure.ac}.
|
|
|
|
@defmac AC_PREREQ (@var{version})
|
|
@acindex{PREREQ}
|
|
@cindex Version
|
|
Ensure that a recent enough version of Autoconf is being used. If the
|
|
version of Autoconf being used to create @command{configure} is
|
|
earlier than @var{version}, print an error message to the standard
|
|
error output and exit with failure (exit status is 63). For example:
|
|
|
|
@example
|
|
AC_PREREQ([@value{VERSION}])
|
|
@end example
|
|
|
|
This macro may be used before @code{AC_INIT}.
|
|
@end defmac
|
|
|
|
@defmac AC_AUTOCONF_VERSION
|
|
@acindex{AUTOCONF_VERSION}
|
|
This macro was introduced in Autoconf 2.62. It identifies the version
|
|
of Autoconf that is currently parsing the input file, in a format
|
|
suitable for @code{m4_version_compare} (@pxref{m4_version_compare}); in
|
|
other words, for this release of Autoconf, its value is
|
|
@samp{@value{VERSION}}. One potential use of this macro is for writing
|
|
conditional fallbacks based on when a feature was added to Autoconf,
|
|
rather than using @code{AC_PREREQ} to require the newer version of
|
|
Autoconf. However, remember that the Autoconf philosophy favors feature
|
|
checks over version checks.
|
|
|
|
You should not expand this macro directly; use
|
|
@samp{m4_defn([AC_AUTOCONF_VERSION])} instead. This is because some
|
|
users might
|
|
have a beta version of Autoconf installed, with arbitrary letters
|
|
included in its version string. This means it is possible for the
|
|
version string to contain the name of a defined macro, such that
|
|
expanding @code{AC_AUTOCONF_VERSION} would trigger the expansion of that
|
|
macro during rescanning, and change the version string to be different
|
|
than what you intended to check.
|
|
@end defmac
|
|
|
|
@node Notices
|
|
@section Notices in @command{configure}
|
|
@cindex Notices in @command{configure}
|
|
|
|
The following macros manage version numbers for @command{configure}
|
|
scripts. Using them is optional.
|
|
|
|
@defmac AC_COPYRIGHT (@var{copyright-notice})
|
|
@acindex{COPYRIGHT}
|
|
@cindex Copyright Notice
|
|
State that, in addition to the Free Software Foundation's copyright on
|
|
the Autoconf macros, parts of your @command{configure} are covered by the
|
|
@var{copyright-notice}.
|
|
|
|
The @var{copyright-notice} shows up in both the head of
|
|
@command{configure} and in @samp{configure --version}.
|
|
@end defmac
|
|
|
|
|
|
@defmac AC_REVISION (@var{revision-info})
|
|
@acindex{REVISION}
|
|
@cindex Revision
|
|
Copy revision stamp @var{revision-info} into the @command{configure}
|
|
script, with any dollar signs or double-quotes removed. This macro lets
|
|
you put a revision stamp from @file{configure.ac} into @command{configure}
|
|
that the traditional version control systems RCS and CVS can update,
|
|
without these systems changing it again when you check in the resulting
|
|
@command{configure}. That way, you can determine easily which revision of
|
|
@file{configure.ac} a particular @command{configure} corresponds to.
|
|
|
|
For example, this line in @file{configure.ac}:
|
|
|
|
@example
|
|
AC_REVISION([$Revision: 1.30 $])
|
|
@end example
|
|
|
|
@noindent
|
|
produces this in @command{configure}:
|
|
|
|
@example
|
|
#!/bin/sh
|
|
# From configure.ac Revision: 1.30
|
|
@end example
|
|
@end defmac
|
|
|
|
|
|
@node Input
|
|
@section Configure Input: Source Code, Macros, and Auxiliary Files
|
|
|
|
The following macros help you manage the contents of your source tree.
|
|
|
|
@anchor{AC_CONFIG_SRCDIR}
|
|
@defmac AC_CONFIG_SRCDIR (@var{unique-file-in-source-dir})
|
|
@acindex{CONFIG_SRCDIR}
|
|
Distinguish this package's source directory from other source
|
|
directories that might happen to exist in the file system.
|
|
@var{unique-file-in-source-dir} should name a file that is unique to
|
|
this package. @command{configure} will verify that this file exists in
|
|
@file{@var{srcdir}}, before it runs any other checks.
|
|
|
|
Use of this macro is strongly recommended. It protects against people
|
|
accidentally specifying the wrong directory with @option{--srcdir}.
|
|
@xref{configure Invocation}, for more information.
|
|
@end defmac
|
|
|
|
Packages that use @command{aclocal} to generate @file{aclocal.m4}
|
|
should declare where local macros can be found using
|
|
@code{AC_CONFIG_MACRO_DIRS}.
|
|
|
|
@defmac AC_CONFIG_MACRO_DIRS (@var{dir1} [@var{dir2} ... @var{dirN}])
|
|
@defmacx AC_CONFIG_MACRO_DIR (@var{dir})
|
|
@acindex{CONFIG_MACRO_DIRS}
|
|
@acindex{CONFIG_MACRO_DIR}
|
|
@acindex{CONFIG_MACRO_DIR_TRACE}
|
|
Specify the given directories as the location of additional local Autoconf
|
|
macros. These macros are intended for use by commands like
|
|
@command{autoreconf} or @command{aclocal} that trace macro calls; they should
|
|
be called directly from @file{configure.ac} so that tools that install
|
|
macros for @command{aclocal} can find the macros' declarations. Tools
|
|
that want to learn which directories have been selected should trace
|
|
@code{AC_CONFIG_MACRO_DIR_TRACE}, which will be called once per directory.
|
|
|
|
AC_CONFIG_MACRO_DIRS is the preferred form, and can be called multiple
|
|
times and with multiple arguments; in such cases, directories in earlier
|
|
calls are expected to be searched before directories in later calls, and
|
|
directories appearing in the same call are expected to be searched in
|
|
the order in which they appear in the call. For historical reasons, the
|
|
macro AC_CONFIG_MACRO_DIR can also be used once, if it appears first,
|
|
for tools such as older @command{libtool} that weren't prepared to
|
|
handle multiple directories. For example, a usage like
|
|
|
|
@smallexample
|
|
AC_CONFIG_MACRO_DIR([dir1])
|
|
AC_CONFIG_MACRO_DIRS([dir2])
|
|
AC_CONFIG_MACRO_DIRS([dir3 dir4])
|
|
@end smallexample
|
|
|
|
will cause the trace of AC_CONFIG_MACRO_DIR_TRACE to appear four times,
|
|
and should cause the directories to be searched in this order:
|
|
@samp{dir1 dir2 dir3 dir4}.
|
|
|
|
Note that if you use @command{aclocal} from an Automake release prior to
|
|
1.13 to generate @file{aclocal.m4}, you must also set
|
|
@code{ACLOCAL_AMFLAGS = -I @var{dir1} [-I @var{dir2} ... -I @var{dirN}]}
|
|
in your top-level @file{Makefile.am}. Due to a limitation in
|
|
the Autoconf implementation of @command{autoreconf}, these include
|
|
directives currently must be set on a single line in @file{Makefile.am},
|
|
without any backslash-newlines or makefile comments.
|
|
@end defmac
|
|
|
|
@prindex @command{config.guess}
|
|
@prindex @command{config.sub}
|
|
@prindex @command{install-sh}
|
|
|
|
Some Autoconf macros require auxiliary scripts. @code{AC_PROG_INSTALL}
|
|
(@pxref{Particular Programs}) requires a
|
|
fallback implementation of @command{install} called @file{install-sh},
|
|
and the @code{AC_CANONICAL} macros (@pxref{Manual Configuration})
|
|
require the system-identification scripts @file{config.sub} and
|
|
@file{config.guess}. Third-party tools, such as Automake and Libtool,
|
|
may require additional auxiliary scripts.
|
|
|
|
By default, @command{configure} looks for these scripts next to itself,
|
|
in @file{@var{srcdir}}. For convenience when working with subdirectories
|
|
with their own configure scripts (@pxref{Subdirectories}), if the
|
|
scripts are not in @file{@var{srcdir}} it will also look in
|
|
@file{@var{srcdir}/..} and @file{@var{srcdir}/../..}. All of the
|
|
scripts must be found in the same directory.
|
|
|
|
If these default locations are not adequate, or simply to reduce clutter
|
|
at the top level of the source tree, packages can use
|
|
@code{AC_CONFIG_AUX_DIR} to declare where to look for auxiliary scripts.
|
|
|
|
@defmac AC_CONFIG_AUX_DIR (@var{dir})
|
|
@acindex{CONFIG_AUX_DIR}
|
|
Look for auxiliary scripts in @var{dir}. Normally, @var{dir} should be a
|
|
relative path, which is taken as relative to @file{@var{srcdir}}.
|
|
If @var{dir} is an absolute path or contains shell variables, however,
|
|
it is used as-is.
|
|
|
|
When the goal of using @code{AC_CONFIG_AUX_DIR} is to reduce clutter at
|
|
the top level of the source tree, the conventional name for @var{dir} is
|
|
@file{build-aux}. If you need portability to DOS variants, do not name
|
|
the auxiliary directory @file{aux}. @xref{File System Conventions}.
|
|
@end defmac
|
|
|
|
@defmac AC_REQUIRE_AUX_FILE (@var{file})
|
|
@acindex{REQUIRE_AUX_FILE}
|
|
@vrindex ac_aux_dir
|
|
Declare that @var{file} is an auxiliary script needed by this configure
|
|
script, and set the shell variable @code{ac_aux_dir} to the directory
|
|
where it can be found. The value of @code{ac_aux_dir} is guaranteed to
|
|
end with a @samp{/}.
|
|
|
|
Macros that need auxiliary scripts must use this macro to register each
|
|
script they need.
|
|
@end defmac
|
|
|
|
@command{configure} checks for all the auxiliary scripts it needs on
|
|
startup, and exits with an error if any are missing.
|
|
|
|
@command{autoreconf} also detects missing auxiliary scripts. When used
|
|
with the @option{--install} option, @command{autoreconf} will try to add
|
|
missing scripts to the directory specified by @code{AC_CONFIG_AUX_DIR},
|
|
or to the top level of the source tree if @code{AC_CONFIG_AUX_DIR} was
|
|
not used. It can always do this for the scripts needed by Autoconf core
|
|
macros: @file{install-sh}, @file{config.sub}, and @file{config.guess}.
|
|
Many other commonly-needed scripts are installed by the third-party
|
|
tools that @command{autoreconf} knows how to run, such as @file{missing}
|
|
for Automake and @file{ltmain.sh} for Libtool.
|
|
|
|
If you are using Automake, auxiliary scripts will automatically be
|
|
included in the tarball created by @command{make dist}. If you are
|
|
not using Automake you will need to arrange for auxiliary scripts to
|
|
be included in tarballs yourself. Auxiliary scripts should normally
|
|
@emph{not} be checked into a version control system, for the same
|
|
reasons that @command{configure} shouldn't be.
|
|
|
|
The scripts needed by Autoconf core macros can be found in
|
|
@file{$(datadir)/autoconf/build-aux} of the Autoconf installation
|
|
(@pxref{Installation Directory Variables}).
|
|
@file{install-sh} can be downloaded from
|
|
@url{https://git.savannah.gnu.org/cgit/automake.git/plain/lib/install-sh}.
|
|
@file{config.sub} and @file{config.guess} can be downloaded from
|
|
@url{https://git.savannah.gnu.org/cgit/config.git/tree/}.
|
|
|
|
@node Output
|
|
@section Outputting Files
|
|
@cindex Outputting files
|
|
|
|
Every Autoconf script, e.g., @file{configure.ac}, should finish by
|
|
calling @code{AC_OUTPUT}. That is the macro that generates and runs
|
|
@file{config.status}, which in turn creates the makefiles and any
|
|
other files resulting from configuration. This is the only required
|
|
macro besides @code{AC_INIT} (@pxref{Input}).
|
|
|
|
@anchor{AC_OUTPUT}
|
|
@defmac AC_OUTPUT
|
|
@acindex{OUTPUT}
|
|
@cindex Instantiation
|
|
Generate @file{config.status} and launch it. Call this macro once, at
|
|
the end of @file{configure.ac}.
|
|
|
|
@file{config.status} performs all the configuration actions: all the
|
|
output files (see @ref{Configuration Files}, macro
|
|
@code{AC_CONFIG_FILES}), header files (see @ref{Configuration Headers},
|
|
macro @code{AC_CONFIG_HEADERS}), commands (see @ref{Configuration
|
|
Commands}, macro @code{AC_CONFIG_COMMANDS}), links (see
|
|
@ref{Configuration Links}, macro @code{AC_CONFIG_LINKS}), subdirectories
|
|
to configure (see @ref{Subdirectories}, macro @code{AC_CONFIG_SUBDIRS})
|
|
are honored.
|
|
|
|
The location of your @code{AC_OUTPUT} invocation is the exact point
|
|
where configuration actions are taken: any code afterwards is
|
|
executed by @command{configure} once @command{config.status} was run. If
|
|
you want to bind actions to @command{config.status} itself
|
|
(independently of whether @command{configure} is being run), see
|
|
@ref{Configuration Commands, , Running Arbitrary Configuration
|
|
Commands}.
|
|
@end defmac
|
|
|
|
Historically, the usage of @code{AC_OUTPUT} was somewhat different.
|
|
@xref{Obsolete Macros}, for a description of the arguments that
|
|
@code{AC_OUTPUT} used to support.
|
|
|
|
|
|
If you run @command{make} in subdirectories, you should run it using the
|
|
@command{make} variable @code{MAKE}. Most versions of @command{make} set
|
|
@code{MAKE} to the name of the @command{make} program plus any options it
|
|
was given. (But many do not include in it the values of any variables
|
|
set on the command line, so those are not passed on automatically.)
|
|
Some old versions of @command{make} do not set this variable. The
|
|
following macro allows you to use it even with those versions.
|
|
|
|
@anchor{AC_PROG_MAKE_SET}
|
|
@defmac AC_PROG_MAKE_SET
|
|
@acindex{PROG_MAKE_SET}
|
|
@ovindex SET_MAKE
|
|
If the Make command, @code{$MAKE} if set or else @samp{make}, predefines
|
|
@code{$(MAKE)}, define output variable @code{SET_MAKE} to be empty.
|
|
Otherwise, define @code{SET_MAKE} to a macro definition that sets
|
|
@code{$(MAKE)}, such as @samp{MAKE=make}. Calls @code{AC_SUBST} for
|
|
@code{SET_MAKE}.
|
|
@end defmac
|
|
|
|
If you use this macro, place a line like this in each @file{Makefile.in}
|
|
that runs @command{MAKE} on other directories:
|
|
|
|
@example
|
|
@@SET_MAKE@@
|
|
@end example
|
|
|
|
|
|
|
|
@node Configuration Actions
|
|
@section Performing Configuration Actions
|
|
@cindex Configuration actions
|
|
|
|
@file{configure} is designed so that it appears to do everything itself,
|
|
but there is actually a hidden slave: @file{config.status}.
|
|
@file{configure} is in charge of examining your system, but it is
|
|
@file{config.status} that actually takes the proper actions based on the
|
|
results of @file{configure}. The most typical task of
|
|
@file{config.status} is to @emph{instantiate} files.
|
|
|
|
@acindex{CONFIG_@var{ITEMS}}
|
|
This section describes the common behavior of the four standard
|
|
instantiating macros: @code{AC_CONFIG_FILES}, @code{AC_CONFIG_HEADERS},
|
|
@code{AC_CONFIG_COMMANDS} and @code{AC_CONFIG_LINKS}. They all
|
|
have this prototype:
|
|
|
|
@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
|
|
@c awful.
|
|
@example
|
|
AC_CONFIG_@var{ITEMS}(@var{tag}@dots{}, @r{[}@var{commands}@r{]}, @r{[}@var{init-cmds}@r{]})
|
|
@end example
|
|
|
|
@noindent
|
|
where the arguments are:
|
|
|
|
@table @var
|
|
@item tag@dots{}
|
|
A blank-or-newline-separated list of tags, which are typically the names of
|
|
the files to instantiate.
|
|
|
|
You are encouraged to use literals as @var{tags}. In particular, you
|
|
should avoid
|
|
|
|
@example
|
|
AS_IF([@dots{}], [my_foos="$my_foos fooo"])
|
|
AS_IF([@dots{}], [my_foos="$my_foos foooo"])
|
|
AC_CONFIG_@var{ITEMS}([$my_foos])
|
|
@end example
|
|
|
|
@noindent
|
|
and use this instead:
|
|
|
|
@example
|
|
AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([fooo])])
|
|
AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([foooo])])
|
|
@end example
|
|
|
|
The macros @code{AC_CONFIG_FILES} and @code{AC_CONFIG_HEADERS} use
|
|
special @var{tag} values: they may have the form @samp{@var{output}} or
|
|
@samp{@var{output}:@var{inputs}}. The file @var{output} is instantiated
|
|
from its templates, @var{inputs} (defaulting to @samp{@var{output}.in}).
|
|
|
|
@samp{AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])},
|
|
for example, asks for
|
|
the creation of the file @file{Makefile} that contains the expansion of the
|
|
output variables in the concatenation of @file{boiler/top.mk} and
|
|
@file{boiler/bot.mk}.
|
|
|
|
The special value @samp{-} might be used to denote the standard output
|
|
when used in @var{output}, or the standard input when used in the
|
|
@var{inputs}. You most probably don't need to use this in
|
|
@file{configure.ac}, but it is convenient when using the command line
|
|
interface of @file{./config.status}, see @ref{config.status Invocation},
|
|
for more details.
|
|
|
|
The @var{inputs} may be absolute or relative file names. In the latter
|
|
case they are first looked for in the build tree, and then in the source
|
|
tree. Input files should be text files, and a line length below 2000
|
|
bytes should be safe.
|
|
|
|
@item commands
|
|
Shell commands output literally into @file{config.status}, and
|
|
associated with a tag that the user can use to tell @file{config.status}
|
|
which commands to run. The commands are run each time a @var{tag}
|
|
request is given to @file{config.status}, typically each time the file
|
|
@file{@var{tag}} is created.
|
|
|
|
The variables set during the execution of @command{configure} are
|
|
@emph{not} available here: you first need to set them via the
|
|
@var{init-cmds}. Nonetheless the following variables are pre-computed:
|
|
|
|
@table @code
|
|
@item srcdir
|
|
@vrindex srcdir
|
|
The name of the top source directory, assuming that the working
|
|
directory is the top build directory. This
|
|
is what @command{configure}'s @option{--srcdir} option sets.
|
|
|
|
@item ac_top_srcdir
|
|
@vrindex ac_top_srcdir
|
|
The name of the top source directory, assuming that the working
|
|
directory is the current build directory.
|
|
|
|
@item ac_top_build_prefix
|
|
@vrindex ac_top_build_prefix
|
|
The name of the top build directory, assuming that the working
|
|
directory is the current build directory.
|
|
It can be empty, or else ends with a slash, so that you may concatenate
|
|
it.
|
|
|
|
@item ac_srcdir
|
|
@vrindex ac_srcdir
|
|
The name of the corresponding source directory, assuming that the
|
|
working directory is the current build directory.
|
|
|
|
@item tmp
|
|
@vrindex tmp
|
|
The name of a temporary directory within the build tree, which you
|
|
can use if you need to create additional temporary files. The
|
|
directory is cleaned up when @command{config.status} is done or
|
|
interrupted. Please use package-specific file name prefixes to
|
|
avoid clashing with files that @command{config.status} may use
|
|
internally.
|
|
@end table
|
|
|
|
@noindent
|
|
The @dfn{current} directory refers to the directory (or
|
|
pseudo-directory) containing the input part of @var{tags}. For
|
|
instance, running
|
|
|
|
@example
|
|
AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [@dots{}], [@dots{}])
|
|
@end example
|
|
|
|
@noindent
|
|
with @option{--srcdir=../package} produces the following values:
|
|
|
|
@example
|
|
# Argument of --srcdir
|
|
srcdir='../package'
|
|
# Reversing deep/dir
|
|
ac_top_build_prefix='../../'
|
|
# Concatenation of $ac_top_build_prefix and srcdir
|
|
ac_top_srcdir='../../../package'
|
|
# Concatenation of $ac_top_srcdir and deep/dir
|
|
ac_srcdir='../../../package/deep/dir'
|
|
@end example
|
|
|
|
@noindent
|
|
independently of @samp{in/in.in}.
|
|
|
|
@item init-cmds
|
|
Shell commands output @emph{unquoted} near the beginning of
|
|
@file{config.status}, and executed each time @file{config.status} runs
|
|
(regardless of the tag). Because they are unquoted, for example,
|
|
@samp{$var} is output as the value of @code{var}. @var{init-cmds}
|
|
is typically used by @file{configure} to give @file{config.status} some
|
|
variables it needs to run the @var{commands}.
|
|
|
|
You should be extremely cautious in your variable names: all the
|
|
@var{init-cmds} share the same name space and may overwrite each other
|
|
in unpredictable ways. Sorry@enddots{}
|
|
@end table
|
|
|
|
All these macros can be called multiple times, with different
|
|
@var{tag} values, of course!
|
|
|
|
|
|
@node Configuration Files
|
|
@section Creating Configuration Files
|
|
@cindex Creating configuration files
|
|
@cindex Configuration file creation
|
|
|
|
Be sure to read the previous section, @ref{Configuration Actions}.
|
|
|
|
@anchor{AC_CONFIG_FILES}
|
|
@defmac AC_CONFIG_FILES (@var{file}@dots{}, @ovar{cmds}, @ovar{init-cmds})
|
|
@acindex{CONFIG_FILES}
|
|
Make @code{AC_OUTPUT} create each @file{@var{file}} by copying an input
|
|
file (by default @file{@var{file}.in}), substituting the output variable
|
|
values.
|
|
@c Before we used to have this feature, which was later rejected
|
|
@c because it complicates the writing of makefiles:
|
|
@c If the file would be unchanged, it is left untouched, to preserve
|
|
@c timestamp.
|
|
This macro is one of the instantiating macros; see @ref{Configuration
|
|
Actions}. @xref{Makefile Substitutions}, for more information on using
|
|
output variables. @xref{Setting Output Variables}, for more information
|
|
on creating them. This macro creates the directory that the file is in
|
|
if it doesn't exist. Usually, makefiles are created this way,
|
|
but other files, such as @file{.gdbinit}, can be specified as well.
|
|
|
|
Typical calls to @code{AC_CONFIG_FILES} look like this:
|
|
|
|
@example
|
|
AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
|
|
AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
|
|
@end example
|
|
|
|
You can override an input file name by appending to @var{file} a
|
|
colon-separated list of input files. Examples:
|
|
|
|
@example
|
|
AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
|
|
[lib/Makefile:boiler/lib.mk])
|
|
@end example
|
|
|
|
@noindent
|
|
Doing this allows you to keep your file names acceptable to
|
|
DOS variants, or
|
|
to prepend and/or append boilerplate to the file.
|
|
|
|
The @var{file} names should not contain shell metacharacters.
|
|
@xref{Special Chars in Variables}.
|
|
@end defmac
|
|
|
|
|
|
|
|
@node Makefile Substitutions
|
|
@section Substitutions in Makefiles
|
|
@cindex Substitutions in makefiles
|
|
@cindex Makefile substitutions
|
|
|
|
Each subdirectory in a distribution that contains something to be
|
|
compiled or installed should come with a file @file{Makefile.in}, from
|
|
which @command{configure} creates a file @file{Makefile} in that directory.
|
|
To create @file{Makefile}, @command{configure} performs a simple variable
|
|
substitution, replacing occurrences of @samp{@@@var{variable}@@} in
|
|
@file{Makefile.in} with the value that @command{configure} has determined
|
|
for that variable. Variables that are substituted into output files in
|
|
this way are called @dfn{output variables}. They are ordinary shell
|
|
variables that are set in @command{configure}. To make @command{configure}
|
|
substitute a particular variable into the output files, the macro
|
|
@code{AC_SUBST} must be called with that variable name as an argument.
|
|
Any occurrences of @samp{@@@var{variable}@@} for other variables are
|
|
left unchanged. @xref{Setting Output Variables}, for more information
|
|
on creating output variables with @code{AC_SUBST}.
|
|
|
|
A software package that uses a @command{configure} script should be
|
|
distributed with a file @file{Makefile.in}, but no makefile; that
|
|
way, the user has to properly configure the package for the local system
|
|
before compiling it.
|
|
|
|
@xref{Makefile Conventions, , Makefile Conventions, standards, The
|
|
GNU Coding Standards}, for more information on what to put in
|
|
makefiles.
|
|
|
|
@menu
|
|
* Preset Output Variables:: Output variables that are always set
|
|
* Installation Directory Variables:: Other preset output variables
|
|
* Changed Directory Variables:: Warnings about @file{datarootdir}
|
|
* Build Directories:: Supporting multiple concurrent compiles
|
|
* Automatic Remaking:: Makefile rules for configuring
|
|
@end menu
|
|
|
|
@node Preset Output Variables
|
|
@subsection Preset Output Variables
|
|
@cindex Output variables
|
|
|
|
Some output variables are preset by the Autoconf macros. Some of the
|
|
Autoconf macros set additional output variables, which are mentioned in
|
|
the descriptions for those macros. @xref{Output Variable Index}, for a
|
|
complete list of output variables. @xref{Installation Directory
|
|
Variables}, for the list of the preset ones related to installation
|
|
directories. Below are listed the other preset ones, many of which are
|
|
precious variables (@pxref{Setting Output Variables},
|
|
@code{AC_ARG_VAR}).
|
|
|
|
The preset variables which are available during @file{config.status}
|
|
(@pxref{Configuration Actions}) may also be used during
|
|
@command{configure} tests. For example, it is permissible to reference
|
|
@samp{$srcdir} when constructing a list of directories to pass via
|
|
the @option{-I} option during a compiler feature check. When used in this
|
|
manner, coupled with the fact that @command{configure} is always run
|
|
from the top build directory, it is sufficient to use just
|
|
@samp{$srcdir} instead of @samp{$top_srcdir}.
|
|
|
|
@c Just say no to ASCII sorting! We're humans, not computers.
|
|
@c These variables are listed as they would be in a dictionary:
|
|
@c actor
|
|
@c Actress
|
|
@c actress
|
|
|
|
@defvar CFLAGS
|
|
@evindex CFLAGS
|
|
@ovindex CFLAGS
|
|
Debugging and optimization options for the C compiler. If it is not set
|
|
in the environment when @command{configure} runs, the default value is set
|
|
when you call @code{AC_PROG_CC} (or empty if you don't). @command{configure}
|
|
uses this variable when compiling or linking programs to test for C features.
|
|
|
|
If a compiler option affects only the behavior of the preprocessor
|
|
(e.g., @option{-D@var{name}}), it should be put into @code{CPPFLAGS}
|
|
instead. If it affects only the linker (e.g., @option{-L@var{directory}}),
|
|
it should be put into @code{LDFLAGS} instead. If it
|
|
affects only the compiler proper, @code{CFLAGS} is the natural home for
|
|
it. If an option affects multiple phases of the compiler, though,
|
|
matters get tricky:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
If an option selects a 32-bit or 64-bit build on a bi-arch system, it
|
|
must be put direcly into @code{CC}, e.g., @code{CC='gcc -m64'}. This is
|
|
necessary for @code{config.guess} to work right.
|
|
@item
|
|
Otherwise one approach is to put the option into @code{CC}. Another is
|
|
to put it into both @code{CPPFLAGS} and @code{LDFLAGS}, but not into
|
|
@code{CFLAGS}.
|
|
@end itemize
|
|
|
|
However, remember that some @file{Makefile} variables are reserved by
|
|
the GNU Coding Standards for the use of the ``user''---the person
|
|
building the package. For instance, @code{CFLAGS} is one such variable.
|
|
|
|
Sometimes package developers are tempted to set user variables such as
|
|
@code{CFLAGS} because it appears to make their job easier. However, the
|
|
package itself should never set a user variable, particularly not to
|
|
include switches that are required for proper compilation of the
|
|
package. Since these variables are documented as being for the package
|
|
builder, that person rightfully expects to be able to override any of
|
|
these variables at build time. If the package developer needs to add
|
|
switches without interfering with the user, the proper way to do that is
|
|
to introduce an additional variable. Automake makes this easy by
|
|
introducing @code{AM_CFLAGS} (@pxref{Flag Variables Ordering, , ,
|
|
automake, GNU Automake}), but the concept is the same even if
|
|
Automake is not used.
|
|
@end defvar
|
|
|
|
@defvar configure_input
|
|
@ovindex configure_input
|
|
A comment saying that the file was generated automatically by
|
|
@command{configure} and giving the name of the input file.
|
|
@code{AC_OUTPUT} adds a comment line containing this variable to the top
|
|
of every makefile it creates. For other files, you should
|
|
reference this variable in a comment at the top of each input file. For
|
|
example, an input shell script should begin like this:
|
|
|
|
@example
|
|
#!/bin/sh
|
|
# @@configure_input@@
|
|
@end example
|
|
|
|
@noindent
|
|
The presence of that line also reminds people editing the file that it
|
|
needs to be processed by @command{configure} in order to be used.
|
|
@end defvar
|
|
|
|
@defvar CPPFLAGS
|
|
@evindex CPPFLAGS
|
|
@ovindex CPPFLAGS
|
|
Preprocessor options for the C, C++, Objective C, and Objective C++
|
|
preprocessors and compilers. If
|
|
it is not set in the environment when @command{configure} runs, the default
|
|
value is empty. @command{configure} uses this variable when preprocessing
|
|
or compiling programs to test for C, C++, Objective C, and Objective C++
|
|
features.
|
|
|
|
This variable's contents should contain options like @option{-I},
|
|
@option{-D}, and @option{-U} that affect only the behavior of the
|
|
preprocessor. Please see the explanation of @code{CFLAGS} for what you
|
|
can do if an option affects other phases of the compiler as well.
|
|
|
|
Currently, @command{configure} always links as part of a single
|
|
invocation of the compiler that also preprocesses and compiles, so it
|
|
uses this variable also when linking programs. However, it is unwise to
|
|
depend on this behavior because the GNU Coding Standards do
|
|
not require it and many packages do not use @code{CPPFLAGS} when linking
|
|
programs.
|
|
|
|
@xref{Special Chars in Variables}, for limitations that @code{CPPFLAGS}
|
|
might run into.
|
|
@end defvar
|
|
|
|
@defvar CXXFLAGS
|
|
@evindex CXXFLAGS
|
|
@ovindex CXXFLAGS
|
|
Debugging and optimization options for the C++ compiler. It acts like
|
|
@code{CFLAGS}, but for C++ instead of C.
|
|
@end defvar
|
|
|
|
@defvar DEFS
|
|
@ovindex DEFS
|
|
@option{-D} options to pass to the C compiler. If @code{AC_CONFIG_HEADERS}
|
|
is called, @command{configure} replaces @samp{@@DEFS@@} with
|
|
@option{-DHAVE_CONFIG_H} instead (@pxref{Configuration Headers}). This
|
|
variable is not defined while @command{configure} is performing its tests,
|
|
only when creating the output files. @xref{Setting Output Variables}, for
|
|
how to check the results of previous tests.
|
|
@end defvar
|
|
|
|
@defvar ECHO_C
|
|
@defvarx ECHO_N
|
|
@defvarx ECHO_T
|
|
@ovindex ECHO_C
|
|
@ovindex ECHO_N
|
|
@ovindex ECHO_T
|
|
These obsolescent variables let you suppress the trailing newline from
|
|
@command{echo} for question-answer message pairs.
|
|
Nowadays it is better to use @code{AS_ECHO_N}.
|
|
@end defvar
|
|
|
|
@defvar ERLCFLAGS
|
|
@evindex ERLCFLAGS
|
|
@ovindex ERLCFLAGS
|
|
Debugging and optimization options for the Erlang compiler. If it is not set
|
|
in the environment when @command{configure} runs, the default value is empty.
|
|
@command{configure} uses this variable when compiling
|
|
programs to test for Erlang features.
|
|
@end defvar
|
|
|
|
@defvar FCFLAGS
|
|
@evindex FCFLAGS
|
|
@ovindex FCFLAGS
|
|
Debugging and optimization options for the Fortran compiler. If it
|
|
is not set in the environment when @command{configure} runs, the default
|
|
value is set when you call @code{AC_PROG_FC} (or empty if you don't).
|
|
@command{configure} uses this variable when compiling or linking
|
|
programs to test for Fortran features.
|
|
@end defvar
|
|
|
|
@defvar FFLAGS
|
|
@evindex FFLAGS
|
|
@ovindex FFLAGS
|
|
Debugging and optimization options for the Fortran 77 compiler. If it
|
|
is not set in the environment when @command{configure} runs, the default
|
|
value is set when you call @code{AC_PROG_F77} (or empty if you don't).
|
|
@command{configure} uses this variable when compiling or linking
|
|
programs to test for Fortran 77 features.
|
|
@end defvar
|
|
|
|
@defvar LDFLAGS
|
|
@evindex LDFLAGS
|
|
@ovindex LDFLAGS
|
|
Options for the linker. If it is not set
|
|
in the environment when @command{configure} runs, the default value is empty.
|
|
@command{configure} uses this variable when linking programs to test for
|
|
C, C++, Objective C, Objective C++, Fortran, and Go features.
|
|
|
|
This variable's contents should contain options like @option{-s} and
|
|
@option{-L} that affect only the behavior of the linker. Please see the
|
|
explanation of @code{CFLAGS} for what you can do if an option also
|
|
affects other phases of the compiler.
|
|
|
|
Don't use this variable to pass library names
|
|
(@option{-l}) to the linker; use @code{LIBS} instead.
|
|
@end defvar
|
|
|
|
@defvar LIBS
|
|
@evindex LIBS
|
|
@ovindex LIBS
|
|
@option{-l} options to pass to the linker. The default value is empty,
|
|
but some Autoconf macros may prepend extra libraries to this variable if
|
|
those libraries are found and provide necessary functions, see
|
|
@ref{Libraries}. @command{configure} uses this variable when linking
|
|
programs to test for C, C++, Objective C, Objective C++, Fortran, and Go
|
|
features.
|
|
@end defvar
|
|
|
|
@defvar OBJCFLAGS
|
|
@evindex OBJCFLAGS
|
|
@ovindex OBJCFLAGS
|
|
Debugging and optimization options for the Objective C compiler. It
|
|
acts like @code{CFLAGS}, but for Objective C instead of C.
|
|
@end defvar
|
|
|
|
@defvar OBJCXXFLAGS
|
|
@evindex OBJCXXFLAGS
|
|
@ovindex OBJCXXFLAGS
|
|
Debugging and optimization options for the Objective C++ compiler. It
|
|
acts like @code{CXXFLAGS}, but for Objective C++ instead of C++.
|
|
@end defvar
|
|
|
|
@defvar GOFLAGS
|
|
@evindex GOFLAGS
|
|
@ovindex GOFLAGS
|
|
Debugging and optimization options for the Go compiler. It acts like
|
|
@code{CFLAGS}, but for Go instead of C.
|
|
@end defvar
|
|
|
|
@defvar builddir
|
|
@ovindex builddir
|
|
Rigorously equal to @samp{.}. Added for symmetry only.
|
|
@end defvar
|
|
|
|
@defvar abs_builddir
|
|
@ovindex abs_builddir
|
|
Absolute name of @code{builddir}.
|
|
@end defvar
|
|
|
|
@defvar top_builddir
|
|
@ovindex top_builddir
|
|
The relative name of the top level of the current build tree. In the
|
|
top-level directory, this is the same as @code{builddir}.
|
|
@end defvar
|
|
|
|
@defvar top_build_prefix
|
|
@ovindex top_build_prefix
|
|
The relative name of the top level of the current build tree with final
|
|
slash if nonempty. This is the same as @code{top_builddir}, except that
|
|
it contains zero or more runs of @code{../}, so it should not be
|
|
appended with a slash for concatenation. This helps for @command{make}
|
|
implementations that otherwise do not treat @file{./file} and @file{file}
|
|
as equal in the top-level build directory.
|
|
@end defvar
|
|
|
|
@defvar abs_top_builddir
|
|
@ovindex abs_top_builddir
|
|
Absolute name of @code{top_builddir}.
|
|
@end defvar
|
|
|
|
@defvar srcdir
|
|
@ovindex srcdir
|
|
The name of the directory that contains the source code for
|
|
that makefile.
|
|
@end defvar
|
|
|
|
@defvar abs_srcdir
|
|
@ovindex abs_srcdir
|
|
Absolute name of @code{srcdir}.
|
|
@end defvar
|
|
|
|
@defvar top_srcdir
|
|
@ovindex top_srcdir
|
|
The name of the top-level source code directory for the
|
|
package. In the top-level directory, this is the same as @code{srcdir}.
|
|
@end defvar
|
|
|
|
@defvar abs_top_srcdir
|
|
@ovindex abs_top_srcdir
|
|
Absolute name of @code{top_srcdir}.
|
|
@end defvar
|
|
|
|
@node Installation Directory Variables
|
|
@subsection Installation Directory Variables
|
|
@cindex Installation directories
|
|
@cindex Directories, installation
|
|
|
|
The following variables specify the directories for
|
|
package installation, see @ref{Directory Variables, , Variables for
|
|
Installation Directories, standards, The GNU Coding
|
|
Standards}, for more information. Each variable corresponds to an
|
|
argument of @command{configure}; trailing slashes are stripped so that
|
|
expressions such as @samp{$@{prefix@}/lib} expand with only one slash
|
|
between directory names. See the end of this section for
|
|
details on when and how to use these variables.
|
|
|
|
@defvar bindir
|
|
@ovindex bindir
|
|
The directory for installing executables that users run.
|
|
@end defvar
|
|
|
|
@defvar datadir
|
|
@ovindex datadir
|
|
The directory for installing idiosyncratic read-only
|
|
architecture-independent data.
|
|
@end defvar
|
|
|
|
@defvar datarootdir
|
|
@ovindex datarootdir
|
|
The root of the directory tree for read-only architecture-independent
|
|
data files.
|
|
@end defvar
|
|
|
|
@defvar docdir
|
|
@ovindex docdir
|
|
The directory for installing documentation files (other than Info and
|
|
man).
|
|
@end defvar
|
|
|
|
@defvar dvidir
|
|
@ovindex dvidir
|
|
The directory for installing documentation files in DVI format.
|
|
@end defvar
|
|
|
|
@defvar exec_prefix
|
|
@ovindex exec_prefix
|
|
The installation prefix for architecture-dependent files. By default
|
|
it's the same as @code{prefix}. You should avoid installing anything
|
|
directly to @code{exec_prefix}. However, the default value for
|
|
directories containing architecture-dependent files should be relative
|
|
to @code{exec_prefix}.
|
|
@end defvar
|
|
|
|
@defvar htmldir
|
|
@ovindex htmldir
|
|
The directory for installing HTML documentation.
|
|
@end defvar
|
|
|
|
@defvar includedir
|
|
@ovindex includedir
|
|
The directory for installing C header files.
|
|
@end defvar
|
|
|
|
@defvar infodir
|
|
@ovindex infodir
|
|
The directory for installing documentation in Info format.
|
|
@end defvar
|
|
|
|
@defvar libdir
|
|
@ovindex libdir
|
|
The directory for installing object code libraries.
|
|
@end defvar
|
|
|
|
@defvar libexecdir
|
|
@ovindex libexecdir
|
|
The directory for installing executables that other programs run.
|
|
@end defvar
|
|
|
|
@defvar localedir
|
|
@ovindex localedir
|
|
The directory for installing locale-dependent but
|
|
architecture-independent data, such as message catalogs. This directory
|
|
usually has a subdirectory per locale.
|
|
@end defvar
|
|
|
|
@defvar localstatedir
|
|
@ovindex localstatedir
|
|
The directory for installing modifiable single-machine data. Content in
|
|
this directory typically survives a reboot.
|
|
@end defvar
|
|
|
|
@defvar runstatedir
|
|
@ovindex runstatedir
|
|
The directory for installing temporary modifiable single-machine data.
|
|
Content in this directory survives as long as the process is running
|
|
(such as pid files), as contrasted with @file{/tmp} that may be
|
|
periodically cleaned. Conversely, this directory is typically cleaned
|
|
on a reboot. By default, this is a subdirectory of
|
|
@code{localstatedir}.
|
|
@end defvar
|
|
|
|
@defvar mandir
|
|
@ovindex mandir
|
|
The top-level directory for installing documentation in man format.
|
|
@end defvar
|
|
|
|
@defvar oldincludedir
|
|
@ovindex oldincludedir
|
|
The directory for installing C header files for non-GCC compilers.
|
|
@end defvar
|
|
|
|
@defvar pdfdir
|
|
@ovindex pdfdir
|
|
The directory for installing PDF documentation.
|
|
@end defvar
|
|
|
|
@defvar prefix
|
|
@ovindex prefix
|
|
The common installation prefix for all files. If @code{exec_prefix}
|
|
is defined to a different value, @code{prefix} is used only for
|
|
architecture-independent files.
|
|
@end defvar
|
|
|
|
@defvar psdir
|
|
@ovindex psdir
|
|
The directory for installing PostScript documentation.
|
|
@end defvar
|
|
|
|
@defvar sbindir
|
|
@ovindex sbindir
|
|
The directory for installing executables that system
|
|
administrators run.
|
|
@end defvar
|
|
|
|
@defvar sharedstatedir
|
|
@ovindex sharedstatedir
|
|
The directory for installing modifiable architecture-independent data.
|
|
@end defvar
|
|
|
|
@defvar sysconfdir
|
|
@ovindex sysconfdir
|
|
The directory for installing read-only single-machine data.
|
|
@end defvar
|
|
|
|
|
|
Most of these variables have values that rely on @code{prefix} or
|
|
@code{exec_prefix}. It is deliberate that the directory output
|
|
variables keep them unexpanded: typically @samp{@@datarootdir@@} is
|
|
replaced by @samp{$@{prefix@}/share}, not @samp{/usr/local/share}, and
|
|
@samp{@@datadir@@} is replaced by @samp{$@{datarootdir@}}.
|
|
|
|
This behavior is mandated by the GNU Coding Standards, so that when
|
|
the user runs:
|
|
|
|
@table @samp
|
|
@item make
|
|
she can still specify a different prefix from the one specified to
|
|
@command{configure}, in which case, if needed, the package should hard
|
|
code dependencies corresponding to the make-specified prefix.
|
|
|
|
@item make install
|
|
she can specify a different installation location, in which case the
|
|
package @emph{must} still depend on the location which was compiled in
|
|
(i.e., never recompile when @samp{make install} is run). This is an
|
|
extremely important feature, as many people may decide to install all
|
|
the files of a package grouped together, and then install links from
|
|
the final locations to there.
|
|
@end table
|
|
|
|
In order to support these features, it is essential that
|
|
@code{datarootdir} remains defined as @samp{$@{prefix@}/share},
|
|
so that its value can be expanded based
|
|
on the current value of @code{prefix}.
|
|
|
|
A corollary is that you should not use these variables except in
|
|
makefiles. For instance, instead of trying to evaluate @code{datadir}
|
|
in @file{configure} and hard-coding it in makefiles using
|
|
e.g., @samp{AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])},
|
|
you should add
|
|
@option{-DDATADIR='$(datadir)'} to your makefile's definition of
|
|
@code{CPPFLAGS} (@code{AM_CPPFLAGS} if you are also using Automake).
|
|
|
|
Similarly, you should not rely on @code{AC_CONFIG_FILES} to replace
|
|
@code{bindir} and friends in your shell scripts and other files; instead,
|
|
let @command{make} manage their replacement. For instance Autoconf
|
|
ships templates of its shell scripts ending with @samp{.in}, and uses a
|
|
makefile snippet similar to the following to build scripts like
|
|
@command{autoheader} and @command{autom4te}:
|
|
|
|
@example
|
|
@group
|
|
edit = sed \
|
|
-e 's|@@bindir[@@]|$(bindir)|g' \
|
|
-e 's|@@pkgdatadir[@@]|$(pkgdatadir)|g' \
|
|
-e 's|@@prefix[@@]|$(prefix)|g'
|
|
@end group
|
|
|
|
@group
|
|
autoheader autom4te: Makefile
|
|
rm -f $@@ $@@.tmp
|
|
srcdir=''; \
|
|
test -f ./$@@.in || srcdir=$(srcdir)/; \
|
|
$(edit) $$@{srcdir@}$@@.in >$@@.tmp
|
|
@c $$ restore font-lock
|
|
chmod +x $@@.tmp
|
|
chmod a-w $@@.tmp
|
|
mv $@@.tmp $@@
|
|
@end group
|
|
|
|
@group
|
|
autoheader: $(srcdir)/autoheader.in
|
|
autom4te: $(srcdir)/autom4te.in
|
|
@end group
|
|
@end example
|
|
|
|
Some details are noteworthy:
|
|
|
|
@table @asis
|
|
@item @samp{@@bindir[@@]}
|
|
The brackets prevent @command{configure} from replacing
|
|
@samp{@@bindir@@} in the Sed expression itself.
|
|
Brackets are preferable to a backslash here, since
|
|
POSIX says @samp{\@@} is not portable.
|
|
|
|
@item @samp{$(bindir)}
|
|
Don't use @samp{@@bindir@@}! Use the matching makefile variable
|
|
instead.
|
|
|
|
@item @samp{$(pkgdatadir)}
|
|
The example takes advantage of the variable @samp{$(pkgdatadir)}
|
|
provided by Automake; it is equivalent to @samp{$(datadir)/$(PACKAGE)}.
|
|
|
|
@item @samp{/}
|
|
Don't use @samp{/} in the Sed expressions that replace file names since
|
|
most likely the
|
|
variables you use, such as @samp{$(bindir)}, contain @samp{/}.
|
|
Use a shell metacharacter instead, such as @samp{|}.
|
|
|
|
@item special characters
|
|
File names, file name components, and the value of @code{VPATH} should
|
|
not contain shell metacharacters or white
|
|
space. @xref{Special Chars in Variables}.
|
|
|
|
@item dependency on @file{Makefile}
|
|
Since @code{edit} uses values that depend on the configuration specific
|
|
values (@code{prefix}, etc.)@: and not only on @code{VERSION} and so forth,
|
|
the output depends on @file{Makefile}, not @file{configure.ac}.
|
|
|
|
@item @samp{$@@}
|
|
The main rule is generic, and uses @samp{$@@} extensively to
|
|
avoid the need for multiple copies of the rule.
|
|
|
|
@item Separated dependencies and single suffix rules
|
|
You can't use them! The above snippet cannot be (portably) rewritten
|
|
as:
|
|
|
|
@example
|
|
autoconf autoheader: Makefile
|
|
@group
|
|
.in:
|
|
rm -f $@@ $@@.tmp
|
|
$(edit) $< >$@@.tmp
|
|
chmod +x $@@.tmp
|
|
mv $@@.tmp $@@
|
|
@end group
|
|
@end example
|
|
|
|
@xref{Single Suffix Rules}, for details.
|
|
|
|
@item @samp{$(srcdir)}
|
|
Be sure to specify the name of the source directory,
|
|
otherwise the package won't support separated builds.
|
|
@end table
|
|
|
|
For the more specific installation of Erlang libraries, the following variables
|
|
are defined:
|
|
|
|
@defvar ERLANG_INSTALL_LIB_DIR
|
|
@ovindex ERLANG_INSTALL_LIB_DIR
|
|
@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
|
|
The common parent directory of Erlang library installation directories.
|
|
This variable is set by calling the @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR}
|
|
macro in @file{configure.ac}.
|
|
@end defvar
|
|
|
|
@defvar ERLANG_INSTALL_LIB_DIR_@var{library}
|
|
@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}
|
|
@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
|
|
The installation directory for Erlang library @var{library}.
|
|
This variable is set by using the
|
|
@samp{AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR}
|
|
macro in @file{configure.ac}.
|
|
@end defvar
|
|
|
|
@xref{Erlang Libraries}, for details.
|
|
|
|
|
|
@node Changed Directory Variables
|
|
@subsection Changed Directory Variables
|
|
@cindex @file{datarootdir}
|
|
|
|
In Autoconf 2.60, the set of directory variables has changed, and the
|
|
defaults of some variables have been adjusted
|
|
(@pxref{Installation Directory Variables}) to changes in the
|
|
GNU Coding Standards. Notably, @file{datadir}, @file{infodir}, and
|
|
@file{mandir} are now expressed in terms of @file{datarootdir}. If you are
|
|
upgrading from an earlier Autoconf version, you may need to adjust your files
|
|
to ensure that the directory variables are substituted correctly
|
|
(@pxref{Defining Directories}), and that a definition of @file{datarootdir} is
|
|
in place. For example, in a @file{Makefile.in}, adding
|
|
|
|
@example
|
|
datarootdir = @@datarootdir@@
|
|
@end example
|
|
|
|
@noindent
|
|
is usually sufficient. If you use Automake to create @file{Makefile.in},
|
|
it will add this for you.
|
|
|
|
To help with the transition, Autoconf warns about files that seem to use
|
|
@code{datarootdir} without defining it. In some cases, it then expands
|
|
the value of @code{$datarootdir} in substitutions of the directory
|
|
variables. The following example shows such a warning:
|
|
|
|
@example
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT
|
|
AC_CONFIG_FILES([Makefile])
|
|
AC_OUTPUT
|
|
$ @kbd{cat Makefile.in}
|
|
prefix = @@prefix@@
|
|
datadir = @@datadir@@
|
|
$ @kbd{autoconf}
|
|
$ @kbd{configure}
|
|
configure: creating ./config.status
|
|
config.status: creating Makefile
|
|
config.status: WARNING:
|
|
Makefile.in seems to ignore the --datarootdir setting
|
|
$ @kbd{cat Makefile}
|
|
prefix = /usr/local
|
|
datadir = $@{prefix@}/share
|
|
@end example
|
|
|
|
Usually one can easily change the file to accommodate both older and newer
|
|
Autoconf releases:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile.in}
|
|
prefix = @@prefix@@
|
|
datarootdir = @@datarootdir@@
|
|
datadir = @@datadir@@
|
|
$ @kbd{configure}
|
|
configure: creating ./config.status
|
|
config.status: creating Makefile
|
|
$ @kbd{cat Makefile}
|
|
prefix = /usr/local
|
|
datarootdir = $@{prefix@}/share
|
|
datadir = $@{datarootdir@}
|
|
@end example
|
|
|
|
@acindex{DATAROOTDIR_CHECKED}
|
|
In some cases, however, the checks may not be able to detect that a suitable
|
|
initialization of @code{datarootdir} is in place, or they may fail to detect
|
|
that such an initialization is necessary in the output file. If, after
|
|
auditing your package, there are still spurious @file{configure} warnings about
|
|
@code{datarootdir}, you may add the line
|
|
|
|
@example
|
|
AC_DEFUN([AC_DATAROOTDIR_CHECKED])
|
|
@end example
|
|
|
|
@noindent
|
|
to your @file{configure.ac} to disable the warnings. This is an exception
|
|
to the usual rule that you should not define a macro whose name begins with
|
|
@code{AC_} (@pxref{Macro Names}).
|
|
|
|
|
|
|
|
@node Build Directories
|
|
@subsection Build Directories
|
|
@cindex Build directories
|
|
@cindex Directories, build
|
|
|
|
You can support compiling a software package for several architectures
|
|
simultaneously from the same copy of the source code. The object files
|
|
for each architecture are kept in their own directory.
|
|
|
|
To support doing this, @command{make} uses the @code{VPATH} variable to
|
|
find the files that are in the source directory. GNU Make
|
|
can do this. Most other recent @command{make} programs can do this as
|
|
well, though they may have difficulties and it is often simpler to
|
|
recommend GNU @command{make} (@pxref{VPATH and Make}). Older
|
|
@command{make} programs do not support @code{VPATH}; when using them, the
|
|
source code must be in the same directory as the object files.
|
|
|
|
If you are using GNU Automake, the remaining details in this
|
|
section are already covered for you, based on the contents of your
|
|
@file{Makefile.am}. But if you are using Autoconf in isolation, then
|
|
supporting @code{VPATH} requires the following in your
|
|
@file{Makefile.in}:
|
|
|
|
@example
|
|
srcdir = @@srcdir@@
|
|
VPATH = @@srcdir@@
|
|
@end example
|
|
|
|
Do not set @code{VPATH} to the value of another variable (@pxref{Variables
|
|
listed in VPATH}.
|
|
|
|
@command{configure} substitutes the correct value for @code{srcdir} when
|
|
it produces @file{Makefile}.
|
|
|
|
Do not use the @command{make} variable @code{$<}, which expands to the
|
|
file name of the file in the source directory (found with @code{VPATH}),
|
|
except in implicit rules. (An implicit rule is one such as @samp{.c.o},
|
|
which tells how to create a @file{.o} file from a @file{.c} file.) Some
|
|
versions of @command{make} do not set @code{$<} in explicit rules; they
|
|
expand it to an empty value.
|
|
|
|
Instead, Make command lines should always refer to source
|
|
files by prefixing them with @samp{$(srcdir)/}. It's safer
|
|
to quote the source directory name, in case it contains characters that
|
|
are special to the shell. Because @samp{$(srcdir)} is expanded by Make,
|
|
single-quoting works and is safer than double-quoting. For example:
|
|
|
|
@example
|
|
time.info: time.texinfo
|
|
$(MAKEINFO) '$(srcdir)/time.texinfo'
|
|
@end example
|
|
|
|
@node Automatic Remaking
|
|
@subsection Automatic Remaking
|
|
@cindex Automatic remaking
|
|
@cindex Remaking automatically
|
|
|
|
You can put rules like the following in the top-level @file{Makefile.in}
|
|
for a package to automatically update the configuration information when
|
|
you change the configuration files. This example includes all of the
|
|
optional files, such as @file{aclocal.m4} and those related to
|
|
configuration header files. Omit from the @file{Makefile.in} rules for
|
|
any of these files that your package does not use.
|
|
|
|
The @samp{$(srcdir)/} prefix is included because of limitations in the
|
|
@code{VPATH} mechanism.
|
|
|
|
The @file{stamp-} files are necessary because the timestamps of
|
|
@file{config.h.in} and @file{config.h} are not changed if remaking
|
|
them does not change their contents. This feature avoids unnecessary
|
|
recompilation. You should include the file @file{stamp-h.in} in your
|
|
package's distribution, so that @command{make} considers
|
|
@file{config.h.in} up to date. Don't use @command{touch}
|
|
(@pxref{touch, , Limitations of Usual Tools}); instead, use
|
|
@command{echo} (using
|
|
@command{date} would cause needless output differences).
|
|
|
|
@example
|
|
@group
|
|
$(srcdir)/configure: configure.ac aclocal.m4
|
|
cd '$(srcdir)' && autoconf
|
|
|
|
# autoheader might not change config.h.in, so touch a stamp file.
|
|
$(srcdir)/config.h.in: stamp-h.in ;
|
|
$(srcdir)/stamp-h.in: configure.ac aclocal.m4
|
|
cd '$(srcdir)' && autoheader
|
|
echo timestamp > '$(srcdir)/stamp-h.in'
|
|
|
|
config.h: stamp-h ;
|
|
stamp-h: config.h.in config.status
|
|
./config.status
|
|
|
|
Makefile: Makefile.in config.status
|
|
./config.status
|
|
|
|
config.status: configure
|
|
./config.status --recheck
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
(Be careful if you copy these lines directly into your makefile, as you
|
|
need to convert the indented lines to start with the tab character.)
|
|
|
|
In addition, you should use
|
|
|
|
@example
|
|
AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
|
|
@end example
|
|
|
|
@noindent
|
|
so @file{config.status} ensures that @file{config.h} is considered up to
|
|
date. @xref{Output}, for more information about @code{AC_OUTPUT}.
|
|
|
|
@xref{config.status Invocation}, for more examples of handling
|
|
configuration-related dependencies.
|
|
|
|
@node Configuration Headers
|
|
@section Configuration Header Files
|
|
@cindex Configuration Header
|
|
@cindex @file{config.h}
|
|
|
|
When a package contains more than a few tests that define C preprocessor
|
|
symbols, the command lines to pass @option{-D} options to the compiler
|
|
can get quite long. This causes two problems. One is that the
|
|
@command{make} output is hard to visually scan for errors. More
|
|
seriously, the command lines can exceed the length limits of some
|
|
operating systems. As an alternative to passing @option{-D} options to
|
|
the compiler, @command{configure} scripts can create a C header file
|
|
containing @samp{#define} directives. The @code{AC_CONFIG_HEADERS}
|
|
macro selects this kind of output. Though it can be called anywhere
|
|
between @code{AC_INIT} and @code{AC_OUTPUT}, it is customary to call
|
|
it right after @code{AC_INIT}.
|
|
|
|
The package should @samp{#include} the configuration header file before
|
|
any other header files, to prevent inconsistencies in declarations (for
|
|
example, if it redefines @code{const}, or if it defines a macro like
|
|
@code{_FILE_OFFSET_BITS} that affects the behavior of system
|
|
headers). Note that it is okay to only include @file{config.h} from
|
|
@file{.c} files; the project's @file{.h} files can rely on
|
|
@file{config.h} already being included first by the corresponding
|
|
@file{.c} file.
|
|
|
|
To provide for VPATH builds, remember to pass the C compiler a @option{-I.}
|
|
option (or @option{-I..}; whichever directory contains @file{config.h}).
|
|
Even if you use @samp{#include "config.h"}, the preprocessor searches only
|
|
the directory of the currently read file, i.e., the source directory, not
|
|
the build directory.
|
|
|
|
With the appropriate @option{-I} option, you can use
|
|
@samp{#include <config.h>}. Actually, it's a good habit to use it,
|
|
because in the rare case when the source directory contains another
|
|
@file{config.h}, the build directory should be searched first.
|
|
|
|
|
|
@defmac AC_CONFIG_HEADERS (@var{header} @dots{}, @ovar{cmds}, @ovar{init-cmds})
|
|
@acindex{CONFIG_HEADERS}
|
|
@cvindex HAVE_CONFIG_H
|
|
This macro is one of the instantiating macros; see @ref{Configuration
|
|
Actions}. Make @code{AC_OUTPUT} create the file(s) in the
|
|
blank-or-newline-separated list @var{header} containing C preprocessor
|
|
@code{#define} statements, and replace @samp{@@DEFS@@} in generated
|
|
files with @option{-DHAVE_CONFIG_H} instead of the value of @code{DEFS}.
|
|
The usual name for @var{header} is @file{config.h};
|
|
@var{header} should not contain shell metacharacters.
|
|
@xref{Special Chars in Variables}.
|
|
|
|
If @var{header} already exists and its contents are identical to what
|
|
@code{AC_OUTPUT} would put in it, it is left alone. Doing this allows
|
|
making some changes in the configuration without needlessly causing
|
|
object files that depend on the header file to be recompiled.
|
|
|
|
Usually the input file is named @file{@var{header}.in}; however, you can
|
|
override the input file name by appending to @var{header} a
|
|
colon-separated list of input files. For example, you might need to make
|
|
the input file name acceptable to DOS variants:
|
|
|
|
@example
|
|
AC_CONFIG_HEADERS([config.h:config.hin])
|
|
@end example
|
|
|
|
@end defmac
|
|
|
|
@defmac AH_HEADER
|
|
@ahindex{HEADER}
|
|
This macro is defined as the name of the first declared config header
|
|
and undefined if no config headers have been declared up to this point.
|
|
A third-party macro may, for example, require use of a config header
|
|
without invoking AC_CONFIG_HEADERS twice, like this:
|
|
|
|
@example
|
|
AC_CONFIG_COMMANDS_PRE(
|
|
[m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])])
|
|
@end example
|
|
|
|
@end defmac
|
|
|
|
@xref{Configuration Actions}, for more details on @var{header}.
|
|
|
|
@menu
|
|
* Header Templates:: Input for the configuration headers
|
|
* autoheader Invocation:: How to create configuration templates
|
|
* Autoheader Macros:: How to specify CPP templates
|
|
@end menu
|
|
|
|
@node Header Templates
|
|
@subsection Configuration Header Templates
|
|
@cindex Configuration Header Template
|
|
@cindex Header templates
|
|
@cindex @file{config.h.in}
|
|
|
|
Your distribution should contain a template file that looks as you want
|
|
the final header file to look, including comments, with @code{#undef}
|
|
statements which are used as hooks. For example, suppose your
|
|
@file{configure.ac} makes these calls:
|
|
|
|
@example
|
|
AC_CONFIG_HEADERS([conf.h])
|
|
AC_CHECK_HEADERS([unistd.h])
|
|
@end example
|
|
|
|
@noindent
|
|
Then you could have code like the following in @file{conf.h.in}.
|
|
The @file{conf.h} created by @command{configure} defines @samp{HAVE_UNISTD_H}
|
|
to 1, if and only if the system has @file{unistd.h}.
|
|
|
|
@example
|
|
@group
|
|
/* Define as 1 if you have unistd.h. */
|
|
#undef HAVE_UNISTD_H
|
|
@end group
|
|
@end example
|
|
|
|
The format of the template file is stricter than what the C preprocessor
|
|
is required to accept. A directive line should contain only whitespace,
|
|
@samp{#undef}, and @samp{HAVE_UNISTD_H}. The use of @samp{#define}
|
|
instead of @samp{#undef}, or of comments on the same line as
|
|
@samp{#undef}, is strongly discouraged. Each hook should only be listed
|
|
once. Other preprocessor lines, such as @samp{#ifdef} or
|
|
@samp{#include}, are copied verbatim from the template into the
|
|
generated header.
|
|
|
|
Since it is a tedious task to keep a template header up to date, you may
|
|
use @command{autoheader} to generate it, see @ref{autoheader Invocation}.
|
|
|
|
During the instantiation of the header, each @samp{#undef} line in the
|
|
template file for each symbol defined by @samp{AC_DEFINE} is changed to an
|
|
appropriate @samp{#define}. If the corresponding @samp{AC_DEFINE} has not
|
|
been executed during the @command{configure} run, the @samp{#undef} line is
|
|
commented out. (This is important, e.g., for @samp{_POSIX_SOURCE}:
|
|
on many systems, it can be implicitly defined by the compiler, and
|
|
undefining it in the header would then break compilation of subsequent
|
|
headers.)
|
|
|
|
Currently, @emph{all} remaining @samp{#undef} lines in the header
|
|
template are commented out, whether or not there was a corresponding
|
|
@samp{AC_DEFINE} for the macro name; but this behavior is not guaranteed
|
|
for future releases of Autoconf.
|
|
|
|
Generally speaking, since you should not use @samp{#define}, and you
|
|
cannot guarantee whether a @samp{#undef} directive in the header
|
|
template will be converted to a @samp{#define} or commented out in the
|
|
generated header file, the template file cannot be used for conditional
|
|
definition effects. Consequently, if you need to use the construct
|
|
|
|
@example
|
|
@group
|
|
#ifdef THIS
|
|
# define THAT
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
you must place it outside of the template.
|
|
If you absolutely need to hook it to the config header itself, please put
|
|
the directives to a separate file, and @samp{#include} that file from the
|
|
config header template. If you are using @command{autoheader}, you would
|
|
probably use @samp{AH_BOTTOM} to append the @samp{#include} directive.
|
|
|
|
|
|
@node autoheader Invocation
|
|
@subsection Using @command{autoheader} to Create @file{config.h.in}
|
|
@cindex @command{autoheader}
|
|
|
|
The @command{autoheader} program can create a template file of C
|
|
@samp{#define} statements for @command{configure} to use.
|
|
It searches for the first invocation of @code{AC_CONFIG_HEADERS} in
|
|
@file{configure} sources to determine the name of the template.
|
|
(If the first call of @code{AC_CONFIG_HEADERS} specifies more than one
|
|
input file name, @command{autoheader} uses the first one.)
|
|
|
|
It is recommended that only one input file is used. If you want to append
|
|
a boilerplate code, it is preferable to use
|
|
@samp{AH_BOTTOM([#include <conf_post.h>])}.
|
|
File @file{conf_post.h} is not processed during the configuration then,
|
|
which make things clearer. Analogically, @code{AH_TOP} can be used to
|
|
prepend a boilerplate code.
|
|
|
|
In order to do its job, @command{autoheader} needs you to document all
|
|
of the symbols that you might use. Typically this is done via an
|
|
@code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED} call whose first argument
|
|
is a literal symbol and whose third argument describes the symbol
|
|
(@pxref{Defining Symbols}). Alternatively, you can use
|
|
@code{AH_TEMPLATE} (@pxref{Autoheader Macros}), or you can supply a
|
|
suitable input file for a subsequent configuration header file.
|
|
Symbols defined by Autoconf's builtin tests are already documented properly;
|
|
you need to document only those that you
|
|
define yourself.
|
|
|
|
You might wonder why @command{autoheader} is needed: after all, why
|
|
would @command{configure} need to ``patch'' a @file{config.h.in} to
|
|
produce a @file{config.h} instead of just creating @file{config.h} from
|
|
scratch? Well, when everything rocks, the answer is just that we are
|
|
wasting our time maintaining @command{autoheader}: generating
|
|
@file{config.h} directly is all that is needed. When things go wrong,
|
|
however, you'll be thankful for the existence of @command{autoheader}.
|
|
|
|
The fact that the symbols are documented is important in order to
|
|
@emph{check} that @file{config.h} makes sense. The fact that there is a
|
|
well-defined list of symbols that should be defined (or not) is
|
|
also important for people who are porting packages to environments where
|
|
@command{configure} cannot be run: they just have to @emph{fill in the
|
|
blanks}.
|
|
|
|
But let's come back to the point: the invocation of @command{autoheader}@dots{}
|
|
|
|
If you give @command{autoheader} an argument, it uses that file instead
|
|
of @file{configure.ac} and writes the header file to the standard output
|
|
instead of to @file{config.h.in}. If you give @command{autoheader} an
|
|
argument of @option{-}, it reads the standard input instead of
|
|
@file{configure.ac} and writes the header file to the standard output.
|
|
|
|
@command{autoheader} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Report processing steps.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files.
|
|
|
|
@item --force
|
|
@itemx -f
|
|
Remake the template file even if newer than its input files.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Append @var{dir} to the include path. Multiple invocations accumulate.
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend @var{dir} to the include path. Multiple invocations accumulate.
|
|
|
|
@item --warnings=@var{category}[,@var{category}...]
|
|
@itemx -W@var{category}[,@var{category}...]
|
|
@evindex WARNINGS
|
|
Enable or disable warnings related to each @var{category}.
|
|
@xref{m4_warn}, for a comprehensive list of categories.
|
|
Special values include:
|
|
|
|
@table @samp
|
|
@item all
|
|
Enable all categories of warnings.
|
|
|
|
@item none
|
|
Disable all categories of warnings.
|
|
|
|
@item error
|
|
Treat all warnings as errors.
|
|
|
|
@item no-@var{category}
|
|
Disable warnings falling into @var{category}.
|
|
@end table
|
|
|
|
The environment variable @env{WARNINGS} may also be set to a
|
|
comma-separated list of warning categories to enable or disable.
|
|
It is interpreted exactly the same way as the argument of
|
|
@option{--warnings}, but unknown categories are silently ignored.
|
|
The command line takes precedence; for instance, if @env{WARNINGS}
|
|
is set to @code{obsolete}, but @option{-Wnone} is given on the
|
|
command line, no warnings will be issued.
|
|
|
|
Some categories of warnings are on by default.
|
|
Again, for details see @ref{m4_warn}.
|
|
@end table
|
|
|
|
|
|
|
|
@node Autoheader Macros
|
|
@subsection Autoheader Macros
|
|
@cindex Autoheader macros
|
|
|
|
@command{autoheader} scans @file{configure.ac} and figures out which C
|
|
preprocessor symbols it might define. It knows how to generate
|
|
templates for symbols defined by @code{AC_CHECK_HEADERS},
|
|
@code{AC_CHECK_FUNCS} etc., but if you @code{AC_DEFINE} any additional
|
|
symbol, you must define a template for it. If there are missing
|
|
templates, @command{autoheader} fails with an error message.
|
|
|
|
The template for a @var{symbol} is created
|
|
by @command{autoheader} from
|
|
the @var{description} argument to an @code{AC_DEFINE};
|
|
see @ref{Defining Symbols}.
|
|
|
|
For special needs, you can use the following macros.
|
|
|
|
|
|
@defmac AH_TEMPLATE (@var{key}, @var{description})
|
|
@ahindex{TEMPLATE}
|
|
Tell @command{autoheader} to generate a template for @var{key}. This macro
|
|
generates standard templates just like @code{AC_DEFINE} when a
|
|
@var{description} is given.
|
|
|
|
For example:
|
|
|
|
@example
|
|
AH_TEMPLATE([NULL_DEVICE],
|
|
[Name of the file to open to get
|
|
a null file, or a data sink.])
|
|
@end example
|
|
|
|
@noindent
|
|
generates the following template, with the description properly
|
|
justified.
|
|
|
|
@example
|
|
/* Name of the file to open to get a null file, or a data sink. */
|
|
#undef NULL_DEVICE
|
|
@end example
|
|
@end defmac
|
|
|
|
|
|
@defmac AH_VERBATIM (@var{key}, @var{template})
|
|
@ahindex{VERBATIM}
|
|
Tell @command{autoheader} to include the @var{template} as-is in the header
|
|
template file. This @var{template} is associated with the @var{key},
|
|
which is used to sort all the different templates and guarantee their
|
|
uniqueness. It should be a symbol that can be defined via @code{AC_DEFINE}.
|
|
@end defmac
|
|
|
|
|
|
@defmac AH_TOP (@var{text})
|
|
@ahindex{TOP}
|
|
Include @var{text} at the top of the header template file.
|
|
@end defmac
|
|
|
|
|
|
@defmac AH_BOTTOM (@var{text})
|
|
@ahindex{BOTTOM}
|
|
Include @var{text} at the bottom of the header template file.
|
|
@end defmac
|
|
|
|
|
|
Please note that @var{text} gets included ``verbatim'' to the template file,
|
|
not to the resulting config header, so it can easily get mangled when the
|
|
template is processed. There is rarely a need for something other than
|
|
|
|
@example
|
|
AH_BOTTOM([#include <custom.h>])
|
|
@end example
|
|
|
|
|
|
|
|
@node Configuration Commands
|
|
@section Running Arbitrary Configuration Commands
|
|
@cindex Configuration commands
|
|
@cindex Commands for configuration
|
|
|
|
You can execute arbitrary commands before, during, and after
|
|
@file{config.status} is run. The three following macros accumulate the
|
|
commands to run when they are called multiple times.
|
|
@code{AC_CONFIG_COMMANDS} replaces the obsolete macro
|
|
@code{AC_OUTPUT_COMMANDS}; see @ref{Obsolete Macros}, for details.
|
|
|
|
@anchor{AC_CONFIG_COMMANDS}
|
|
@defmac AC_CONFIG_COMMANDS (@var{tag}@dots{}, @ovar{cmds}, @ovar{init-cmds})
|
|
@acindex{CONFIG_COMMANDS}
|
|
Specify additional shell commands to run at the end of
|
|
@file{config.status}, and shell commands to initialize any variables
|
|
from @command{configure}. Associate the commands with @var{tag}.
|
|
Since typically the @var{cmds} create a file, @var{tag} should
|
|
naturally be the name of that file. If needed, the directory hosting
|
|
@var{tag} is created. The @var{tag} should not contain shell
|
|
metacharacters. @xref{Special Chars in Variables}.
|
|
This macro is one of the instantiating macros;
|
|
see @ref{Configuration Actions}.
|
|
|
|
Here is an unrealistic example:
|
|
@example
|
|
fubar=42
|
|
AC_CONFIG_COMMANDS([fubar],
|
|
[AS_ECHO(["this is extra $fubar, and so on."])],
|
|
[fubar=$fubar])
|
|
@end example
|
|
|
|
Here is a better one:
|
|
@example
|
|
AC_CONFIG_COMMANDS([timestamp], [echo >timestamp])
|
|
@end example
|
|
@end defmac
|
|
|
|
The following two macros look similar, but in fact they are not of the same
|
|
breed: they are executed directly by @file{configure}, so you cannot use
|
|
@file{config.status} to rerun them.
|
|
|
|
@c Yet it is good to leave them here. The user sees them together and
|
|
@c decides which best fits their needs.
|
|
|
|
@defmac AC_CONFIG_COMMANDS_PRE (@var{cmds})
|
|
@acindex{CONFIG_COMMANDS_PRE}
|
|
Execute the @var{cmds} right before creating @file{config.status}.
|
|
|
|
This macro presents the last opportunity to call @code{AC_SUBST},
|
|
@code{AC_DEFINE}, or @code{AC_CONFIG_@var{ITEMS}} macros.
|
|
@end defmac
|
|
|
|
@defmac AC_CONFIG_COMMANDS_POST (@var{cmds})
|
|
@acindex{CONFIG_COMMANDS_POST}
|
|
Execute the @var{cmds} right after creating @file{config.status}.
|
|
@end defmac
|
|
|
|
|
|
|
|
|
|
@node Configuration Links
|
|
@section Creating Configuration Links
|
|
@cindex Configuration links
|
|
@cindex Links for configuration
|
|
|
|
You may find it convenient to create links whose destinations depend upon
|
|
results of tests. One can use @code{AC_CONFIG_COMMANDS} but the
|
|
creation of relative symbolic links can be delicate when the package is
|
|
built in a directory different from the source directory.
|
|
|
|
@anchor{AC_CONFIG_LINKS}
|
|
@defmac AC_CONFIG_LINKS (@var{dest}:@var{source}@dots{}, @ovar{cmds}, @
|
|
@ovar{init-cmds})
|
|
@acindex{CONFIG_LINKS}
|
|
@cindex Links
|
|
Make @code{AC_OUTPUT} link each of the existing files @var{source} to
|
|
the corresponding link name @var{dest}. Makes a symbolic link if
|
|
possible, otherwise a hard link if possible, otherwise a copy. The
|
|
@var{dest} and @var{source} names should be relative to the top level
|
|
source or build directory, and should not contain shell metacharacters.
|
|
@xref{Special Chars in Variables}.
|
|
|
|
This macro is one of the instantiating
|
|
macros; see @ref{Configuration Actions}.
|
|
|
|
For example, this call:
|
|
|
|
@example
|
|
AC_CONFIG_LINKS([host.h:config/$machine.h
|
|
object.h:config/$obj_format.h])
|
|
@end example
|
|
|
|
@noindent
|
|
creates in the current directory @file{host.h} as a link to
|
|
@file{@var{srcdir}/config/$machine.h}, and @file{object.h} as a
|
|
link to @file{@var{srcdir}/config/$obj_format.h}.
|
|
|
|
The tempting value @samp{.} for @var{dest} is invalid: it makes it
|
|
impossible for @samp{config.status} to guess the links to establish.
|
|
|
|
One can then run:
|
|
@example
|
|
./config.status host.h object.h
|
|
@end example
|
|
@noindent
|
|
to create the links.
|
|
@end defmac
|
|
|
|
|
|
|
|
@node Subdirectories
|
|
@section Configuring Other Packages in Subdirectories
|
|
@cindex Configure subdirectories
|
|
@cindex Subdirectory configure
|
|
|
|
In most situations, calling @code{AC_OUTPUT} is sufficient to produce
|
|
makefiles in subdirectories. However, @command{configure} scripts
|
|
that control more than one independent package can use
|
|
@code{AC_CONFIG_SUBDIRS} to run @command{configure} scripts for other
|
|
packages in subdirectories.
|
|
|
|
@defmac AC_CONFIG_SUBDIRS (@var{dir} @dots{})
|
|
@acindex{CONFIG_SUBDIRS}
|
|
@ovindex subdirs
|
|
Make @code{AC_OUTPUT} run @command{configure} in each subdirectory
|
|
@var{dir} in the given blank-or-newline-separated list. Each @var{dir} should
|
|
be a literal, i.e., please do not use:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/torture.at:Non-literal AC_CONFIG_SUBDIRS.
|
|
if test "x$package_foo_enabled" = xyes; then
|
|
my_subdirs="$my_subdirs foo"
|
|
fi
|
|
AC_CONFIG_SUBDIRS([$my_subdirs])
|
|
@end example
|
|
|
|
@noindent
|
|
because this prevents @samp{./configure --help=recursive} from
|
|
displaying the options of the package @code{foo}. Instead, you should
|
|
write:
|
|
|
|
@example
|
|
AS_IF([test "x$package_foo_enabled" = xyes],
|
|
[AC_CONFIG_SUBDIRS([foo])])
|
|
@end example
|
|
|
|
If a given @var{dir} is not found at @command{configure} run time, a
|
|
warning is reported; if the subdirectory is optional, write:
|
|
|
|
@example
|
|
AS_IF([test -d "$srcdir/foo"],
|
|
[AC_CONFIG_SUBDIRS([foo])])
|
|
@end example
|
|
|
|
These examples use @code{AS_IF} instead of ordinary shell @code{if} to
|
|
avoid problems that Autoconf has with macro calls in shell conditionals
|
|
outside macro definitions. @xref{Common Shell Constructs}.
|
|
|
|
If a given @var{dir} contains @command{configure.gnu}, it is run instead
|
|
of @command{configure}. This is for packages that might use a
|
|
non-Autoconf script @command{Configure}, which can't be called through a
|
|
wrapper @command{configure} since it would be the same file on
|
|
case-insensitive file systems.
|
|
|
|
The subdirectory @command{configure} scripts are given the same command
|
|
line options that were given to this @command{configure} script, with minor
|
|
changes if needed, which include:
|
|
|
|
@itemize @minus
|
|
@item
|
|
adjusting a relative name for the cache file;
|
|
|
|
@item
|
|
adjusting a relative name for the source directory;
|
|
|
|
@item
|
|
propagating the current value of @code{$prefix}, including if it was
|
|
defaulted, and if the default values of the top level and of the subdirectory
|
|
@file{configure} differ.
|
|
@end itemize
|
|
|
|
This macro also sets the output variable @code{subdirs} to the list of
|
|
directories @samp{@var{dir} @dots{}}. Make rules can use
|
|
this variable to determine which subdirectories to recurse into.
|
|
|
|
This macro may be called multiple times.
|
|
@end defmac
|
|
|
|
@node Default Prefix
|
|
@section Default Prefix
|
|
@cindex Install prefix
|
|
@cindex Prefix for install
|
|
|
|
By default, @command{configure} sets the prefix for files it installs to
|
|
@file{/usr/local}. The user of @command{configure} can select a different
|
|
prefix using the @option{--prefix} and @option{--exec-prefix} options.
|
|
There are two ways to change the default: when creating
|
|
@command{configure}, and when running it.
|
|
|
|
Some software packages might want to install in a directory other than
|
|
@file{/usr/local} by default. To accomplish that, use the
|
|
@code{AC_PREFIX_DEFAULT} macro.
|
|
|
|
@defmac AC_PREFIX_DEFAULT (@var{prefix})
|
|
@acindex{PREFIX_DEFAULT}
|
|
Set the default installation prefix to @var{prefix} instead of
|
|
@file{/usr/local}.
|
|
@end defmac
|
|
|
|
It may be convenient for users to have @command{configure} guess the
|
|
installation prefix from the location of a related program that they
|
|
have already installed. If you wish to do that, you can call
|
|
@code{AC_PREFIX_PROGRAM}.
|
|
|
|
@anchor{AC_PREFIX_PROGRAM}
|
|
@defmac AC_PREFIX_PROGRAM (@var{program})
|
|
@acindex{PREFIX_PROGRAM}
|
|
If the user did not specify an installation prefix (using the
|
|
@option{--prefix} option), guess a value for it by looking for
|
|
@var{program} in @env{PATH}, the way the shell does. If @var{program}
|
|
is found, set the prefix to the parent of the directory containing
|
|
@var{program}, else default the prefix as described above
|
|
(@file{/usr/local} or @code{AC_PREFIX_DEFAULT}). For example, if
|
|
@var{program} is @code{gcc} and the @env{PATH} contains
|
|
@file{/usr/local/gnu/bin/gcc}, set the prefix to @file{/usr/local/gnu}.
|
|
@end defmac
|
|
|
|
|
|
|
|
@c ======================================================== Existing tests
|
|
|
|
@node Existing Tests
|
|
@chapter Existing Tests
|
|
|
|
These macros test for particular system features that packages might
|
|
need or want to use. If you need to test for a kind of feature that
|
|
none of these macros check for, you can probably do it by calling
|
|
primitive test macros with appropriate arguments (@pxref{Writing
|
|
Tests}).
|
|
|
|
These tests print messages telling the user which feature they're
|
|
checking for, and what they find. They cache their results for future
|
|
@command{configure} runs (@pxref{Caching Results}).
|
|
|
|
Some of these macros set output variables. @xref{Makefile
|
|
Substitutions}, for how to get their values. The phrase ``define
|
|
@var{name}'' is used below as a shorthand to mean ``define the C
|
|
preprocessor symbol @var{name} to the value 1''. @xref{Defining
|
|
Symbols}, for how to get those symbol definitions into your program.
|
|
|
|
@menu
|
|
* Common Behavior:: Macros' standard schemes
|
|
* Alternative Programs:: Selecting between alternative programs
|
|
* Files:: Checking for the existence of files
|
|
* Libraries:: Library archives that might be missing
|
|
* Library Functions:: C library functions that might be missing
|
|
* Header Files:: Header files that might be missing
|
|
* Declarations:: Declarations that may be missing
|
|
* Structures:: Structures or members that might be missing
|
|
* Types:: Types that might be missing
|
|
* Compilers and Preprocessors:: Checking for compiling programs
|
|
* System Services:: Operating system services
|
|
* C and POSIX Variants:: Kludges for C and POSIX variants
|
|
* Erlang Libraries:: Checking for the existence of Erlang libraries
|
|
@end menu
|
|
|
|
@node Common Behavior
|
|
@section Common Behavior
|
|
@cindex Common autoconf behavior
|
|
|
|
Much effort has been expended to make Autoconf easy to learn. The most
|
|
obvious way to reach this goal is simply to enforce standard interfaces
|
|
and behaviors, avoiding exceptions as much as possible. Because of
|
|
history and inertia, unfortunately, there are still too many exceptions
|
|
in Autoconf; nevertheless, this section describes some of the common
|
|
rules.
|
|
|
|
@menu
|
|
* Standard Symbols:: Symbols defined by the macros
|
|
* Default Includes:: Includes used by the generic macros
|
|
@end menu
|
|
|
|
@node Standard Symbols
|
|
@subsection Standard Symbols
|
|
@cindex Standard symbols
|
|
|
|
All the generic macros that @code{AC_DEFINE} a symbol as a result of
|
|
their test transform their @var{argument} values to a standard alphabet.
|
|
First, @var{argument} is converted to upper case and any asterisks
|
|
(@samp{*}) are each converted to @samp{P}. Any remaining characters
|
|
that are not alphanumeric are converted to underscores.
|
|
|
|
For instance,
|
|
|
|
@example
|
|
AC_CHECK_TYPES([struct $Expensive*])
|
|
@end example
|
|
|
|
@noindent
|
|
defines the symbol @samp{HAVE_STRUCT__EXPENSIVEP} if the check
|
|
succeeds.
|
|
|
|
|
|
@node Default Includes
|
|
@subsection Default Includes
|
|
@cindex Default includes
|
|
@cindex Includes, default
|
|
@hdrindex{assert.h}
|
|
@hdrindex{ctype.h}
|
|
@hdrindex{errno.h}
|
|
@hdrindex{float.h}
|
|
@hdrindex{iso646.h}
|
|
@hdrindex{limits.h}
|
|
@hdrindex{locale.h}
|
|
@hdrindex{math.h}
|
|
@hdrindex{setjmp.h}
|
|
@hdrindex{signal.h}
|
|
@hdrindex{stdarg.h}
|
|
@hdrindex{stddef.h}
|
|
@hdrindex{stdio.h}
|
|
@hdrindex{stdlib.h}
|
|
@hdrindex{string.h}
|
|
@hdrindex{time.h}
|
|
@hdrindex{wchar.h}
|
|
@hdrindex{wctype.h}
|
|
|
|
Test programs frequently need to include headers that may or may not be
|
|
available on the system whose features are being tested. Each test can
|
|
use all the preprocessor macros that have been @code{AC_DEFINE}d by
|
|
previous tests, so for example one may write
|
|
|
|
@example
|
|
@group
|
|
#include <time.h>
|
|
#ifdef HAVE_SYS_TIME_H
|
|
# include <sys/time.h>
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
if @file{sys/time.h} has already been tested for.
|
|
|
|
All hosted environments that are still of interest for portable code
|
|
provide all of the headers specified in C89 (as amended in 1995):
|
|
@file{assert.h}, @file{ctype.h}, @file{errno.h}, @file{float.h},
|
|
@file{iso646.h}, @file{limits.h}, @file{locale.h}, @file{math.h},
|
|
@file{setjmp.h}, @file{signal.h}, @file{stdarg.h}, @file{stddef.h},
|
|
@file{stdio.h}, @file{stdlib.h}, @file{string.h}, @file{time.h},
|
|
@file{wchar.h}, and @file{wctype.h}. Most programs can safely include
|
|
these headers unconditionally. A program not intended to be portable to
|
|
C89 can also safely include the C99-specified header @file{stdbool.h}.
|
|
Other headers, including headers from C99 and later revisions of the C
|
|
standard, might need to be tested for (@pxref{Header Files}) or their
|
|
bugs may need to be worked around (@pxref{Gnulib}).
|
|
|
|
If your program needs to be portable to a @emph{freestanding}
|
|
environment, such as an embedded OS that doesn't provide all of the
|
|
facilities of the C89 standard library, you may need to test for some of
|
|
the above headers as well. Note that many Autoconf macros internally
|
|
assume that the complete set of C89 headers are available.
|
|
|
|
Most generic macros use the following macro to provide a default set
|
|
of includes:
|
|
|
|
@defmac AC_INCLUDES_DEFAULT (@ovar{include-directives})
|
|
@acindex{INCLUDES_DEFAULT}
|
|
Expand to @var{include-directives} if present and nonempty, otherwise to:
|
|
|
|
@example
|
|
@group
|
|
#include <stddef.h>
|
|
#ifdef HAVE_STDIO_H
|
|
# include <stdio.h>
|
|
#endif
|
|
#ifdef HAVE_STDLIB_H
|
|
# include <stdlib.h>
|
|
#endif
|
|
#ifdef HAVE_STRING_H
|
|
# include <string.h>
|
|
#endif
|
|
#ifdef HAVE_INTTYPES_H
|
|
# include <inttypes.h>
|
|
#endif
|
|
#ifdef HAVE_STDINT_H
|
|
# include <stdint.h>
|
|
#endif
|
|
#ifdef HAVE_STRINGS_H
|
|
# include <strings.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
# include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_STAT_H
|
|
# include <sys/stat.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
Using this macro without @var{include-directives} has the side effect of
|
|
checking for @file{stdio.h}, @file{stdlib.h}, @file{string.h},
|
|
@file{inttypes.h}, @file{stdint.h}, @file{strings.h},
|
|
@file{sys/types.h}, @file{sys/stat.h}, and @file{unistd.h}, as if by
|
|
@code{AC_CHECK_HEADERS_ONCE}. For backward compatibility, the macro
|
|
@code{STDC_HEADERS} will be defined when both @file{stdlib.h} and
|
|
@file{string.h} are available.
|
|
|
|
@strong{Portability Note:} It is safe for most programs to assume the
|
|
presence of all of the headers required by the original 1990 C standard.
|
|
@code{AC_INCLUDES_DEFAULT} checks for @file{stdio.h}, @file{stdlib.h},
|
|
and @file{string.h}, even though they are in that list, because they
|
|
might not be available when compiling for a ``freestanding environment''
|
|
(in which most of the features of the C library are optional). You
|
|
probably do not need to write @samp{#ifdef HAVE_STDIO_H} in your own
|
|
code.
|
|
|
|
@file{inttypes.h} and @file{stdint.h} were added to C in the 1999
|
|
revision of the standard, and @file{strings.h}, @file{sys/types.h},
|
|
@file{sys/stat.h}, and @file{unistd.h} are POSIX extensions. You
|
|
@emph{should} guard uses of these headers with appropriate conditionals.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_INCLUDES_DEFAULT
|
|
@acindex{CHECK_INCLUDES_DEFAULT}
|
|
Check for all the headers that @code{AC_INCLUDES_DEFAULT} would check
|
|
for as a side-effect, if this has not already happened.
|
|
|
|
This macro mainly exists so that @code{autoupdate} can replace certain
|
|
obsolete constructs with it. You should not need to use it yourself; in
|
|
fact, it is likely to be safe to delete it from any script in which it
|
|
appears. (@code{autoupdate} does not know whether preprocessor macros
|
|
such as @code{HAVE_STDINT_H} are used in the program, nor whether they
|
|
would get defined as a side-effect of other checks.)
|
|
@end defmac
|
|
|
|
@node Alternative Programs
|
|
@section Alternative Programs
|
|
@cindex Programs, checking
|
|
|
|
These macros check for the presence or behavior of particular programs.
|
|
They are used to choose between several alternative programs and to
|
|
decide what to do once one has been chosen. If there is no macro
|
|
specifically defined to check for a program you need, and you don't need
|
|
to check for any special properties of it, then you can use one of the
|
|
general program-check macros.
|
|
|
|
@menu
|
|
* Particular Programs:: Special handling to find certain programs
|
|
* Generic Programs:: How to find other programs
|
|
@end menu
|
|
|
|
@node Particular Programs
|
|
@subsection Particular Program Checks
|
|
|
|
These macros check for particular programs---whether they exist, and
|
|
in some cases whether they support certain features.
|
|
|
|
@defmac AC_PROG_AR
|
|
@acindex{PROG_AR}
|
|
@ovindex AR
|
|
@c @caindex prog_AR
|
|
@c @caindex prog_ac_ct_AR
|
|
Set output variable @code{AR} to @samp{ar} if @code{ar} is found, and
|
|
otherwise to @samp{:} (do nothing).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_AWK
|
|
@acindex{PROG_AWK}
|
|
@ovindex AWK
|
|
@caindex prog_AWK
|
|
Check for @code{gawk}, @code{mawk}, @code{nawk}, and @code{awk}, in that
|
|
order, and set output variable @code{AWK} to the first one that is found.
|
|
It tries @code{gawk} first because that is reported to be the
|
|
best implementation. The result can be overridden by setting the
|
|
variable @code{AWK} or the cache variable @code{ac_cv_prog_AWK}.
|
|
|
|
Using this macro is sufficient to avoid the pitfalls of traditional
|
|
@command{awk} (@pxref{awk, , Limitations of Usual Tools}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_GREP
|
|
@acindex{PROG_GREP}
|
|
@ovindex GREP
|
|
@caindex prog_GREP
|
|
Look for the best available @code{grep} or @code{ggrep} that accepts the
|
|
longest input lines possible, and that supports multiple @option{-e} options.
|
|
Set the output variable @code{GREP} to whatever is chosen.
|
|
@xref{grep, , Limitations of Usual Tools}, for more information about
|
|
portability problems with the @command{grep} command family. The result
|
|
can be overridden by setting the @code{GREP} variable and is cached in the
|
|
@code{ac_cv_path_GREP} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_EGREP
|
|
@acindex{PROG_EGREP}
|
|
@ovindex EGREP
|
|
@caindex prog_EGREP
|
|
Check whether @code{$GREP -E} works, or else look for the best available
|
|
@code{egrep} or @code{gegrep} that accepts the longest input lines possible.
|
|
Set the output variable @code{EGREP} to whatever is chosen. The result
|
|
can be overridden by setting the @code{EGREP} variable and is cached in the
|
|
@code{ac_cv_path_EGREP} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_FGREP
|
|
@acindex{PROG_FGREP}
|
|
@ovindex FGREP
|
|
@caindex prog_FGREP
|
|
Check whether @code{$GREP -F} works, or else look for the best available
|
|
@code{fgrep} or @code{gfgrep} that accepts the longest input lines possible.
|
|
Set the output variable @code{FGREP} to whatever is chosen. The result
|
|
can be overridden by setting the @code{FGREP} variable and is cached in the
|
|
@code{ac_cv_path_FGREP} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_INSTALL
|
|
@acindex{PROG_INSTALL}
|
|
@ovindex INSTALL
|
|
@ovindex INSTALL_PROGRAM
|
|
@ovindex INSTALL_DATA
|
|
@ovindex INSTALL_SCRIPT
|
|
@caindex path_install
|
|
@prindex @command{install-sh}
|
|
Set output variable @code{INSTALL} to the name of a BSD-compatible
|
|
@command{install} program, if one is found in the current @env{PATH}.
|
|
Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c},
|
|
checking the directories specified to @code{AC_CONFIG_AUX_DIR} (or its
|
|
default directories) to determine @var{dir} (@pxref{Output}). Also set
|
|
the variables @code{INSTALL_PROGRAM} and @code{INSTALL_SCRIPT} to
|
|
@samp{$@{INSTALL@}} and @code{INSTALL_DATA} to @samp{$@{INSTALL@} -m 644}.
|
|
|
|
@samp{@@INSTALL@@} is special, as its value may vary for different
|
|
configuration files.
|
|
|
|
This macro screens out various instances of @command{install} known not to
|
|
work. It prefers to find a C program rather than a shell script, for
|
|
speed. Instead of @file{install-sh}, it can also use @file{install.sh},
|
|
but that name is obsolete because some @command{make} programs have a rule
|
|
that creates @file{install} from it if there is no makefile. Further, this
|
|
macro requires @command{install} to be able to install multiple files into a
|
|
target directory in a single invocation.
|
|
|
|
Autoconf comes with a copy of @file{install-sh} that you can use.
|
|
If you use @code{AC_PROG_INSTALL}, you must include @file{install-sh} in
|
|
your distribution; otherwise @command{autoreconf} and @command{configure}
|
|
will produce an error message saying they can't find it---even if the
|
|
system you're on has a good @command{install} program. This check is a
|
|
safety measure to prevent you from accidentally leaving that file out,
|
|
which would prevent your package from installing on systems that don't
|
|
have a BSD-compatible @command{install} program.
|
|
|
|
If you need to use your own installation program because it has features
|
|
not found in standard @command{install} programs, there is no reason to use
|
|
@code{AC_PROG_INSTALL}; just put the file name of your program into your
|
|
@file{Makefile.in} files.
|
|
|
|
The result of the test can be overridden by setting the variable
|
|
@code{INSTALL} or the cache variable @code{ac_cv_path_install}.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_MKDIR_P
|
|
@acindex{PROG_MKDIR_P}
|
|
@ovindex MKDIR_P
|
|
@caindex path_mkdir
|
|
@prindex @command{install-sh}
|
|
Set output variable @code{MKDIR_P} to a program that ensures that for
|
|
each argument, a directory named by this argument exists, creating it
|
|
and its parent directories if needed, and without race conditions when
|
|
two instances of the program attempt to make the same directory at
|
|
nearly the same time.
|
|
|
|
This macro uses the equivalent of the @samp{mkdir -p} command. Ancient
|
|
versions of @command{mkdir} are vulnerable to race conditions, so if you
|
|
want to support parallel installs from different packages into the same
|
|
directory you should use a non-ancient @command{mkdir}.
|
|
|
|
This macro is related to the @code{AS_MKDIR_P} macro (@pxref{Programming
|
|
in M4sh}), but it sets an output variable intended for use in other
|
|
files, whereas @code{AS_MKDIR_P} is intended for use in scripts like
|
|
@command{configure}. Also, @code{AS_MKDIR_P} does not accept options,
|
|
but @code{MKDIR_P} supports the @option{-m} option, e.g., a makefile
|
|
might invoke @code{$(MKDIR_P) -m 0 dir} to create an inaccessible
|
|
directory, and conversely a makefile should use @code{$(MKDIR_P) --
|
|
$(FOO)} if @var{FOO} might yield a value that begins with @samp{-}.
|
|
|
|
The result of the test can be overridden by setting the variable
|
|
@code{MKDIR_P} or the cache variable @code{ac_cv_path_mkdir}.
|
|
@end defmac
|
|
|
|
@anchor{AC_PROG_LEX}
|
|
@defmac AC_PROG_LEX (@var{options})
|
|
@acindex{PROG_LEX}
|
|
@ovindex LEX
|
|
@ovindex LEXLIB
|
|
@cvindex YYTEXT_POINTER
|
|
@ovindex LEX_OUTPUT_ROOT
|
|
@caindex prog_LEX
|
|
Search for a lexical analyzer generator, preferring @code{flex}
|
|
to plain @code{lex}. Output variable @code{LEX} is set to whichever
|
|
program is available. If neither program is available, @code{LEX}
|
|
is set to @samp{:};
|
|
for packages that ship the generated @file{file.yy.c}
|
|
alongside the source @file{file.l}, this default allows users without a
|
|
lexer generator to still build the package even if the timestamp for
|
|
@file{file.l} is inadvertently changed.
|
|
|
|
The name of the program to use can be overridden by setting the
|
|
output variable @code{LEX} or the cache variable @code{ac_cv_prog_LEX}
|
|
when running @command{configure}.
|
|
|
|
If a lexical analyzer generator is found, this macro performs additional
|
|
checks for common portability pitfalls. If these additional checks
|
|
fail, @code{LEX} is reset to @samp{:}; otherwise the following
|
|
additional macros and variables are provided.
|
|
|
|
Preprocessor macro @code{YYTEXT_POINTER} is defined if the lexer
|
|
skeleton, by default, declares @code{yytext} as a @samp{@w{char *}}
|
|
rather than a @samp{@w{char []}}.
|
|
|
|
Output variable @code{LEX_OUTPUT_ROOT} is set to the base of the file
|
|
name that the lexer generates; this is usually either @file{lex.yy} or
|
|
@file{lexyy}.
|
|
|
|
If generated lexers need a library to work, output variable
|
|
@code{LEXLIB} is set to a link option for that library (e.g.,
|
|
@option{-ll}), otherwise it is set to empty.
|
|
|
|
The @var{options} argument modifies the behavior of @code{AC_PROG_LEX}.
|
|
It should be a whitespace-separated list of options. Currently there
|
|
are only two options, and they are mutually exclusive:
|
|
|
|
@table @code
|
|
@item yywrap
|
|
Indicate that the library in @code{LEXLIB} needs to define the function
|
|
@code{yywrap}. If a library that defines this function cannot be found,
|
|
@code{LEX} will be reset to @samp{:}.
|
|
|
|
@item noyywrap
|
|
Indicate that the library in @code{LEXLIB} does not need to define the
|
|
function @code{yywrap}. @command{configure} will not search for it at
|
|
all.
|
|
@end table
|
|
|
|
Prior to Autoconf 2.70, @code{AC_PROG_LEX} did not take any arguments,
|
|
and its behavior was different from either of the above possibilities:
|
|
it would search for a library that defines @code{yywrap}, and would set
|
|
@code{LEXLIB} to that library if it finds one. However, if a library
|
|
that defines this function could not be found, @code{LEXLIB} would be
|
|
left empty and @code{LEX} would @emph{not} be reset. This behavior was
|
|
due to a bug, but several packages came to depend on it, so
|
|
@code{AC_PROG_LEX} still does this if neither the @code{yywrap} nor the
|
|
@code{noyywrap} option is given.
|
|
|
|
Usage of @code{AC_PROG_LEX} without choosing one of the @code{yywrap}
|
|
or @code{noyywrap} options is deprecated. It is usually better to
|
|
use @code{noyywrap} and define the @code{yywrap} function yourself,
|
|
as this almost always renders the @code{LEXLIB} unnecessary.
|
|
|
|
@strong{Caution:} As a side-effect of the test, this macro may delete
|
|
any file in the configure script's current working directory named
|
|
@file{lex.yy.c} or @file{lexyy.c}.
|
|
|
|
@strong{Caution:} Packages that ship a generated @file{lex.yy.c}
|
|
cannot assume that the definition of @code{YYTEXT_POINTER} matches
|
|
the code in that file. They also cannot assume that @code{LEXLIB}
|
|
provides the library routines required by the code in that file.
|
|
|
|
If you use Flex to generate @file{lex.yy.c}, you can work around these
|
|
limitations by defining @code{yywrap} and @code{main} yourself
|
|
(rendering @code{-lfl} unnecessary), and by using either the
|
|
@option{--array} or @option{--pointer} options to control how
|
|
@code{yytext} is declared. The code generated by Flex is also more
|
|
portable than the code generated by historical versions of Lex.
|
|
|
|
If you have used Flex to generate @file{lex.yy.c}, and especially if
|
|
your scanner depends on Flex features, we recommend you use this
|
|
Autoconf snippet to prevent the scanner being regenerated with
|
|
historical Lex:
|
|
|
|
@example
|
|
AC_PROG_LEX
|
|
AS_IF([test "x$LEX" != xflex],
|
|
[LEX="$SHELL $missing_dir/missing flex"
|
|
AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
|
|
AC_SUBST([LEXLIB], [''])])
|
|
@end example
|
|
|
|
The shell script @command{missing} can be found in the Automake
|
|
distribution.
|
|
|
|
Remember that the user may have supplied an alternate location in
|
|
@env{LEX}, so if Flex is required, it is better to check that the user
|
|
provided something sufficient by parsing the output of @samp{$LEX
|
|
--version} than by simply relying on @code{test "x$LEX" = xflex}.
|
|
@end defmac
|
|
|
|
@anchor{AC_PROG_LN_S}
|
|
@defmac AC_PROG_LN_S
|
|
@acindex{PROG_LN_S}
|
|
@ovindex LN_S
|
|
If @samp{ln -s} works on the current file system (the operating system
|
|
and file system support symbolic links), set the output variable
|
|
@code{LN_S} to @samp{ln -s}; otherwise, if @samp{ln} works, set
|
|
@code{LN_S} to @samp{ln}, and otherwise set it to @samp{cp -pR}.
|
|
|
|
If you make a link in a directory other than the current directory, its
|
|
meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely
|
|
create links using @samp{$(LN_S)}, either find out which form is used
|
|
and adjust the arguments, or always invoke @code{ln} in the directory
|
|
where the link is to be created.
|
|
|
|
In other words, it does not work to do:
|
|
@example
|
|
$(LN_S) foo /x/bar
|
|
@end example
|
|
|
|
Instead, do:
|
|
|
|
@example
|
|
(cd /x && $(LN_S) foo bar)
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_RANLIB
|
|
@acindex{PROG_RANLIB}
|
|
@ovindex RANLIB
|
|
@c @caindex prog_RANLIB
|
|
@c @caindex prog_ac_ct_RANLIB
|
|
Set output variable @code{RANLIB} to @samp{ranlib} if @code{ranlib}
|
|
is found, and otherwise to @samp{:} (do nothing).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_SED
|
|
@acindex{PROG_SED}
|
|
@ovindex SED
|
|
@caindex path_SED
|
|
Set output variable @code{SED} to a Sed implementation that conforms to
|
|
POSIX and does not have arbitrary length limits. Report an error if no
|
|
acceptable Sed is found. @xref{sed, , Limitations of Usual Tools}, for more
|
|
information about portability problems with Sed.
|
|
|
|
The result of this test can be overridden by setting the @code{SED} variable
|
|
and is cached in the @code{ac_cv_path_SED} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_YACC
|
|
@acindex{PROG_YACC}
|
|
@evindex YACC
|
|
@evindex YFLAGS
|
|
@ovindex YACC
|
|
@caindex prog_YACC
|
|
If @code{bison} is found, set output variable @code{YACC} to @samp{bison
|
|
-y}. Otherwise, if @code{byacc} is found, set @code{YACC} to
|
|
@samp{byacc}. Otherwise set @code{YACC} to @samp{yacc}.
|
|
The result of this test can be influenced by setting the variable
|
|
@code{YACC} or the cache variable @code{ac_cv_prog_YACC}.
|
|
@end defmac
|
|
|
|
@node Generic Programs
|
|
@subsection Generic Program and File Checks
|
|
|
|
These macros are used to find programs not covered by the ``particular''
|
|
test macros. If you need to check the behavior of a program as well as
|
|
find out whether it is present, you have to write your own test for it
|
|
(@pxref{Writing Tests}). By default, these macros use the environment
|
|
variable @env{PATH}. If you need to check for a program that might not
|
|
be in the user's @env{PATH}, you can pass a modified path to use
|
|
instead, like this:
|
|
|
|
@example
|
|
AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
|
|
[$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
|
|
[/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
|
|
@end example
|
|
|
|
You are strongly encouraged to declare the @var{variable} passed to
|
|
@code{AC_CHECK_PROG} etc.@: as precious. @xref{Setting Output Variables},
|
|
@code{AC_ARG_VAR}, for more details.
|
|
|
|
@anchor{AC_CHECK_PROG}
|
|
@defmac AC_CHECK_PROG (@var{variable}, @var{prog-to-check-for}, @
|
|
@var{value-if-found}, @ovar{value-if-not-found}, @dvar{path, $PATH}, @
|
|
@ovar{reject})
|
|
@acindex{CHECK_PROG}
|
|
@caindex prog_@var{variable}
|
|
Check whether program @var{prog-to-check-for} exists in @var{path}. If
|
|
it is found, set @var{variable} to @var{value-if-found}, otherwise to
|
|
@var{value-if-not-found}, if given. Always pass over @var{reject} (an
|
|
absolute file name) even if it is the first found in the search path; in
|
|
that case, set @var{variable} using the absolute file name of the
|
|
@var{prog-to-check-for} found that is not @var{reject}. If
|
|
@var{variable} was already set, do nothing. Calls @code{AC_SUBST} for
|
|
@var{variable}. The result of this test can be overridden by setting the
|
|
@var{variable} variable or the cache variable
|
|
@code{ac_cv_prog_@var{variable}}.
|
|
@end defmac
|
|
|
|
@anchor{AC_CHECK_PROGS}
|
|
@defmac AC_CHECK_PROGS (@var{variable}, @var{progs-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{CHECK_PROGS}
|
|
@caindex prog_@var{variable}
|
|
Check for each program in the blank-separated list
|
|
@var{progs-to-check-for} existing in the @var{path}. If one is found, set
|
|
@var{variable} to the name of that program. Otherwise, continue
|
|
checking the next program in the list. If none of the programs in the
|
|
list are found, set @var{variable} to @var{value-if-not-found}; if
|
|
@var{value-if-not-found} is not specified, the value of @var{variable}
|
|
is not changed. Calls @code{AC_SUBST} for @var{variable}. The result of
|
|
this test can be overridden by setting the @var{variable} variable or the
|
|
cache variable @code{ac_cv_prog_@var{variable}}.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{CHECK_TARGET_TOOL}
|
|
Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
|
|
with a prefix of the target type as determined by
|
|
@code{AC_CANONICAL_TARGET}, followed by a dash (@pxref{Canonicalizing}).
|
|
If the tool cannot be found with a prefix, and if the build and target
|
|
types are equal, then it is also searched for without a prefix.
|
|
|
|
As noted in @ref{Specifying Target Triplets}, the
|
|
target is rarely specified, because most of the time it is the same
|
|
as the host: it is the type of system for which any compiler tool in
|
|
the package produces code. What this macro looks for is,
|
|
for example, @emph{a tool @r{(assembler, linker, etc.)}@: that the
|
|
compiler driver @r{(@command{gcc} for the GNU C Compiler)}
|
|
uses to produce objects, archives or executables}.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_TOOL (@var{variable}, @var{prog-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{CHECK_TOOL}
|
|
@c @caindex prog_@var{VARIABLE}
|
|
@c @caindex prog_ac_ct_@var{VARIABLE}
|
|
Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
|
|
with a prefix of the host type as specified by @option{--host}, followed by a
|
|
dash. For example, if the user runs
|
|
@samp{configure --build=x86_64-gnu --host=aarch64-linux-gnu}, then this call:
|
|
@example
|
|
AC_CHECK_TOOL([RANLIB], [ranlib], [:])
|
|
@end example
|
|
@noindent
|
|
sets @code{RANLIB} to @file{aarch64-linux-gnu-ranlib} if that program exists in
|
|
@var{path}, or otherwise to @samp{ranlib} if that program exists in
|
|
@var{path}, or to @samp{:} if neither program exists.
|
|
|
|
When cross-compiling, this macro will issue a warning if no program
|
|
prefixed with the host type could be found.
|
|
For more information, see @ref{Specifying Target Triplets}.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_TARGET_TOOLS (@var{variable}, @var{progs-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{CHECK_TARGET_TOOLS}
|
|
Like @code{AC_CHECK_TARGET_TOOL}, each of the tools in the list
|
|
@var{progs-to-check-for} are checked with a prefix of the target type as
|
|
determined by @code{AC_CANONICAL_TARGET}, followed by a dash
|
|
(@pxref{Canonicalizing}). If none of the tools can be found with a
|
|
prefix, and if the build and target types are equal, then the first one
|
|
without a prefix is used. If a tool is found, set @var{variable} to
|
|
the name of that program. If none of the tools in the list are found,
|
|
set @var{variable} to @var{value-if-not-found}; if @var{value-if-not-found}
|
|
is not specified, the value of @var{variable} is not changed. Calls
|
|
@code{AC_SUBST} for @var{variable}.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_TOOLS (@var{variable}, @var{progs-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{CHECK_TOOLS}
|
|
Like @code{AC_CHECK_TOOL}, each of the tools in the list
|
|
@var{progs-to-check-for} are checked with a prefix of the host type as
|
|
determined by @code{AC_CANONICAL_HOST}, followed by a dash
|
|
(@pxref{Canonicalizing}). If none of the tools can be found with a
|
|
prefix, then the first one without a prefix is used. If a tool is found,
|
|
set @var{variable} to the name of that program. If none of the tools in
|
|
the list are found, set @var{variable} to @var{value-if-not-found}; if
|
|
@var{value-if-not-found} is not specified, the value of @var{variable}
|
|
is not changed. Calls @code{AC_SUBST} for @var{variable}.
|
|
|
|
When cross-compiling, this macro will issue a warning if no program
|
|
prefixed with the host type could be found.
|
|
For more information, see @ref{Specifying Target Triplets}.
|
|
@end defmac
|
|
|
|
@anchor{AC_PATH_PROG}
|
|
@defmac AC_PATH_PROG (@var{variable}, @var{prog-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{PATH_PROG}
|
|
@caindex path_@var{variable}
|
|
Like @code{AC_CHECK_PROG}, but set @var{variable} to the absolute
|
|
name of @var{prog-to-check-for} if found. The result of this test
|
|
can be overridden by setting the @var{variable} variable. A positive
|
|
result of this test is cached in the @code{ac_cv_path_@var{variable}}
|
|
variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_PATH_PROGS}
|
|
@defmac AC_PATH_PROGS (@var{variable}, @var{progs-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{PATH_PROGS}
|
|
@caindex path_@var{variable}
|
|
Like @code{AC_CHECK_PROGS}, but if any of @var{progs-to-check-for}
|
|
are found, set @var{variable} to the absolute name of the program
|
|
found. The result of this test can be overridden by setting the
|
|
@var{variable} variable. A positive result of this test is cached in
|
|
the @code{ac_cv_path_@var{variable}} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PATH_PROGS_FEATURE_CHECK (@var{variable}, @
|
|
@var{progs-to-check-for}, @var{feature-test}, @
|
|
@ovar{action-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{PATH_PROGS_FEATURE_CHECK}
|
|
@caindex path_@var{variable}
|
|
@vrindex ac_path_@var{variable}
|
|
@vrindex ac_path_@var{variable}_found
|
|
This macro was introduced in Autoconf 2.62. If @var{variable} is not
|
|
empty, then set the cache variable @code{ac_cv_path_@var{variable}} to
|
|
its value. Otherwise, check for each program in the blank-separated
|
|
list @var{progs-to-check-for} existing in @var{path}. For each program
|
|
found, execute @var{feature-test} with @code{ac_path_@var{variable}}
|
|
set to the absolute name of the candidate program. If no invocation of
|
|
@var{feature-test} sets the shell variable
|
|
@code{ac_cv_path_@var{variable}}, then @var{action-if-not-found} is
|
|
executed. @var{feature-test} will be run even when
|
|
@code{ac_cv_path_@var{variable}} is set, to provide the ability to
|
|
choose a better candidate found later in @var{path}; to accept the
|
|
current setting and bypass all further checks, @var{feature-test} can
|
|
execute @code{ac_path_@var{variable}_found=:}.
|
|
|
|
Note that this macro has some subtle differences from
|
|
@code{AC_CHECK_PROGS}. It is designed to be run inside
|
|
@code{AC_CACHE_VAL}, therefore, it should have no side effects. In
|
|
particular, @var{variable} is not set to the final value of
|
|
@code{ac_cv_path_@var{variable}}, nor is @code{AC_SUBST} automatically
|
|
run. Also, on failure, any action can be performed, whereas
|
|
@code{AC_CHECK_PROGS} only performs
|
|
@code{@var{variable}=@var{value-if-not-found}}.
|
|
|
|
Here is an example that searches for an implementation of @command{m4} that
|
|
supports the @code{indir} builtin, even if it goes by the name
|
|
@command{gm4} or is not the first implementation on @env{PATH}.
|
|
|
|
@example
|
|
AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
|
|
[AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
|
|
[[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
|
|
test "x$m4out" = x0 \
|
|
&& ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
|
|
[AC_MSG_ERROR([could not find m4 that supports indir])])])
|
|
AC_SUBST([M4], [$ac_cv_path_M4])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_PATH_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{PATH_TARGET_TOOL}
|
|
Like @code{AC_CHECK_TARGET_TOOL}, but set @var{variable} to the absolute
|
|
name of the program if it is found.
|
|
@end defmac
|
|
|
|
@defmac AC_PATH_TOOL (@var{variable}, @var{prog-to-check-for}, @
|
|
@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{PATH_TOOL}
|
|
Like @code{AC_CHECK_TOOL}, but set @var{variable} to the absolute
|
|
name of the program if it is found.
|
|
|
|
When cross-compiling, this macro will issue a warning if no program
|
|
prefixed with the host type could be found.
|
|
For more information, see @ref{Specifying Target Triplets}.
|
|
@end defmac
|
|
|
|
|
|
@node Files
|
|
@section Files
|
|
@cindex File, checking
|
|
|
|
You might also need to check for the existence of files. Before using
|
|
these macros, ask yourself whether a runtime test might not be a better
|
|
solution. Be aware that, like most Autoconf macros, they test a feature
|
|
of the host machine, and therefore, they die when cross-compiling.
|
|
|
|
@defmac AC_CHECK_FILE (@var{file}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{CHECK_FILE}
|
|
@caindex file_@var{file}
|
|
Check whether file @var{file} exists on the native system. If it is
|
|
found, execute @var{action-if-found}, otherwise do
|
|
@var{action-if-not-found}, if given. Cache the result of this test
|
|
in the @code{ac_cv_file_@var{file}} variable, with characters not
|
|
suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_FILES (@var{files}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{CHECK_FILES}
|
|
@caindex file_@var{file}
|
|
For each file listed in @var{files}, execute @code{AC_CHECK_FILE}
|
|
and perform either @var{action-if-found} or @var{action-if-not-found}.
|
|
Like @code{AC_CHECK_FILE}, this defines @samp{HAVE_@var{file}}
|
|
(@pxref{Standard Symbols}) for each file found and caches the results of
|
|
each test in the @code{ac_cv_file_@var{file}} variable, with characters
|
|
not suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
|
|
@node Libraries
|
|
@section Library Files
|
|
@cindex Library, checking
|
|
|
|
The following macros check for the presence of certain C, C++, Fortran,
|
|
or Go library archive files.
|
|
|
|
@anchor{AC_CHECK_LIB}
|
|
@defmac AC_CHECK_LIB (@var{library}, @var{function}, @
|
|
@ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
|
|
@acindex{CHECK_LIB}
|
|
@caindex lib_@var{library}_@var{function}
|
|
Test whether the library @var{library} is available by trying to link
|
|
a test program that calls function @var{function} with the library.
|
|
@var{function} should be a function provided by the library.
|
|
Use the base
|
|
name of the library; e.g., to check for @option{-lmp}, use @samp{mp} as
|
|
the @var{library} argument.
|
|
|
|
@var{action-if-found} is a list of shell commands to run if the link
|
|
with the library succeeds; @var{action-if-not-found} is a list of shell
|
|
commands to run if the link fails. If @var{action-if-found} is not
|
|
specified, the default action prepends @option{-l@var{library}} to
|
|
@code{LIBS} and defines @samp{HAVE_LIB@var{library}} (in all
|
|
capitals). This macro is intended to support building @code{LIBS} in
|
|
a right-to-left (least-dependent to most-dependent) fashion such that
|
|
library dependencies are satisfied as a natural side effect of
|
|
consecutive tests. Linkers are sensitive to library ordering
|
|
so the order in which @code{LIBS} is generated is important to reliable
|
|
detection of libraries.
|
|
|
|
If linking with @var{library} results in unresolved symbols that would
|
|
be resolved by linking with additional libraries, give those libraries
|
|
as the @var{other-libraries} argument, separated by spaces:
|
|
e.g., @option{-lXt -lX11}. Otherwise, this macro may fail to detect
|
|
that @var{library} is present, because linking the test program can
|
|
fail with unresolved symbols. The @var{other-libraries} argument
|
|
should be limited to cases where it is desirable to test for one library
|
|
in the presence of another that is not already in @code{LIBS}.
|
|
|
|
@code{AC_CHECK_LIB} requires some care in usage, and should be avoided
|
|
in some common cases. Many standard functions like @code{gethostbyname}
|
|
appear in the standard C library on some hosts, and in special libraries
|
|
like @code{nsl} on other hosts. On some hosts the special libraries
|
|
contain variant implementations that you may not want to use. These
|
|
days it is normally better to use @code{AC_SEARCH_LIBS([gethostbyname],
|
|
[nsl])} instead of @code{AC_CHECK_LIB([nsl], [gethostbyname])}.
|
|
|
|
The result of this test is cached in the
|
|
@code{ac_cv_lib_@var{library}_@var{function}} variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_SEARCH_LIBS}
|
|
@defmac AC_SEARCH_LIBS (@var{function}, @var{search-libs}, @
|
|
@ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
|
|
@acindex{SEARCH_LIBS}
|
|
@caindex search_@var{function}
|
|
Search for a library defining @var{function} if it's not already
|
|
available. This equates to calling
|
|
@samp{AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])])} first with
|
|
no libraries, then for each library listed in @var{search-libs}.
|
|
|
|
Prepend @option{-l@var{library}} to @code{LIBS} for the first library found
|
|
to contain @var{function}, and run @var{action-if-found}. If the
|
|
function is not found, run @var{action-if-not-found}.
|
|
|
|
If linking with @var{library} results in unresolved symbols that would
|
|
be resolved by linking with additional libraries, give those libraries
|
|
as the @var{other-libraries} argument, separated by spaces:
|
|
e.g., @option{-lXt -lX11}. Otherwise, this macro fails to detect
|
|
that @var{function} is present, because linking the test program
|
|
always fails with unresolved symbols.
|
|
|
|
The result of this test is cached in the
|
|
@code{ac_cv_search_@var{function}} variable as @samp{none required} if
|
|
@var{function} is already available, as @samp{no} if no library
|
|
containing @var{function} was found, otherwise as the
|
|
@option{-l@var{library}} option that needs to be prepended to @code{LIBS}.
|
|
@end defmac
|
|
|
|
|
|
|
|
@node Library Functions
|
|
@section Library Functions
|
|
|
|
The following macros check for particular C library functions.
|
|
If there is no macro specifically defined to check for a function you need,
|
|
and you don't need to check for any special properties of
|
|
it, then you can use one of the general function-check macros.
|
|
|
|
@menu
|
|
* Function Portability:: Pitfalls with usual functions
|
|
* Particular Functions:: Special handling to find certain functions
|
|
* Generic Functions:: How to find other functions
|
|
@end menu
|
|
|
|
@node Function Portability
|
|
@subsection Portability of C Functions
|
|
@cindex Portability of C functions
|
|
@cindex C function portability
|
|
|
|
Most usual functions can either be missing, or be buggy, or be limited
|
|
on some architectures. This section tries to make an inventory of these
|
|
portability issues. By definition, this list always requires
|
|
additions. A much more complete list is maintained by the Gnulib
|
|
project (@pxref{Gnulib}), covering @ref{Function Substitutes, ,
|
|
Current POSIX Functions, gnulib, Gnulib}, @ref{Legacy Function
|
|
Substitutes, , Legacy Functions, gnulib, Gnulib}, and @ref{Glibc
|
|
Function Substitutes, , Glibc Functions, gnulib, Gnulib}. Please
|
|
help us keep the Gnulib list as complete as possible.
|
|
|
|
@table @asis
|
|
@item @code{exit}
|
|
@c @fuindex exit
|
|
@prindex @code{exit}
|
|
On ancient hosts, @code{exit} returned @code{int}.
|
|
This is because @code{exit} predates @code{void}, and there was a long
|
|
tradition of it returning @code{int}.
|
|
|
|
On current hosts, the problem more likely is that @code{exit} is not
|
|
declared, due to C++ problems of some sort or another. For this reason
|
|
we suggest that test programs not invoke @code{exit}, but return from
|
|
@code{main} instead.
|
|
|
|
@item @code{malloc}
|
|
@c @fuindex malloc
|
|
@prindex @code{malloc}
|
|
The C standard says a successful call @code{malloc (0)} is implementation
|
|
dependent. It can return either @code{NULL} or a new non-null pointer.
|
|
The latter is more common (e.g., the GNU C Library) but is by
|
|
no means universal. @code{AC_FUNC_MALLOC}
|
|
can be used to insist on non-@code{NULL} (@pxref{Particular Functions}).
|
|
|
|
@item @code{putenv}
|
|
@c @fuindex putenv
|
|
@prindex @code{putenv}
|
|
POSIX prefers @code{setenv} to @code{putenv}; among other things,
|
|
@code{putenv} is not required of all POSIX implementations, but
|
|
@code{setenv} is.
|
|
|
|
POSIX specifies that @code{putenv} puts the given string directly in
|
|
@code{environ}, but some systems make a copy of it instead (e.g.,
|
|
glibc 2.0, or BSD). And when a copy is made, @code{unsetenv} might
|
|
not free it, causing a memory leak (e.g., FreeBSD 4).
|
|
|
|
On some systems @code{putenv ("FOO")} removes @samp{FOO} from the
|
|
environment, but this is not standard usage and it dumps core
|
|
on some systems (e.g., AIX).
|
|
|
|
On MinGW, a call @code{putenv ("FOO=")} removes @samp{FOO} from the
|
|
environment, rather than inserting it with an empty value.
|
|
|
|
@item @code{realloc}
|
|
@c @fuindex realloc
|
|
@prindex @code{realloc}
|
|
It is problematic to call @code{realloc} with a zero size.
|
|
The C standard says @code{realloc (NULL, 0)} is equivalent to
|
|
@code{malloc (0)}, which means one cannot portably tell whether the call
|
|
has succeeded if it returns a null pointer. If @code{ptr} is non-null,
|
|
the C standard says @code{realloc (ptr, 0)} has undefined behavior.
|
|
|
|
The @code{AC_FUNC_REALLOC} macro avoids some of these portability issues.
|
|
@xref{Particular Functions}.
|
|
|
|
@item @code{signal} handler
|
|
@c @fuindex signal
|
|
@prindex @code{signal}
|
|
@prindex @code{sigaction}
|
|
In most cases, it is more robust to use @code{sigaction} when it is
|
|
available, rather than @code{signal}.
|
|
|
|
@item @code{snprintf}
|
|
@c @fuindex snprintf
|
|
@prindex @code{snprintf}
|
|
@c @fuindex vsnprintf
|
|
@prindex @code{vsnprintf}
|
|
In C99 and later, if the output array isn't big enough
|
|
and if no other errors occur, @code{snprintf} and @code{vsnprintf}
|
|
truncate the output and return the number of bytes that ought to have
|
|
been produced. Some older systems, notably Microsoft Windows before
|
|
Visual Studio 2015 and Windows 10, do not null-terminate the output
|
|
and return @minus{}1 instead.
|
|
|
|
Portable code can check the return value of @code{snprintf (buf, sizeof
|
|
buf, ...)}: if the value is negative or is not less than @code{sizeof
|
|
buf}, an error occurred and the contents of @code{buf} can be ignored.
|
|
Alternatively, one of the Gnulib modules related to @code{snprintf} can
|
|
be used. @xref{Gnulib}.
|
|
|
|
@item @code{strerror_r}
|
|
@c @fuindex strerror_r
|
|
@prindex @code{strerror_r}
|
|
POSIX specifies that @code{strerror_r} returns an @code{int}, but many
|
|
systems (e.g., GNU C Library version 2.36) provide a
|
|
different version returning a @code{char *}. @code{AC_FUNC_STRERROR_R}
|
|
can detect which is in use (@pxref{Particular Functions}).
|
|
|
|
@item @code{strnlen}
|
|
@c @fuindex strnlen
|
|
@prindex @code{strnlen}
|
|
Android 5.0's strnlen was broken, because it assumed the addressed array
|
|
always had at least the specified number of bytes. For example,
|
|
@code{strnlen ("", SIZE_MAX)} should return 0 but on Android 5.0 it
|
|
crashed.
|
|
|
|
AIX 4.3 provided a broken version which produces the
|
|
following results:
|
|
|
|
@example
|
|
strnlen ("foobar", 0) = 0
|
|
strnlen ("foobar", 1) = 3
|
|
strnlen ("foobar", 2) = 2
|
|
strnlen ("foobar", 3) = 1
|
|
strnlen ("foobar", 4) = 0
|
|
strnlen ("foobar", 5) = 6
|
|
strnlen ("foobar", 6) = 6
|
|
strnlen ("foobar", 7) = 6
|
|
strnlen ("foobar", 8) = 6
|
|
strnlen ("foobar", 9) = 6
|
|
@end example
|
|
|
|
@item @code{sysconf}
|
|
@c @fuindex sysconf
|
|
@prindex @code{sysconf}
|
|
@code{_SC_PAGESIZE} is standard, but some older systems (e.g., HP-UX
|
|
9) have @code{_SC_PAGE_SIZE} instead. This can be tested with
|
|
@code{#ifdef}.
|
|
|
|
@item @code{unlink}
|
|
@c @fuindex unlink
|
|
@prindex @code{unlink}
|
|
The POSIX spec says that @code{unlink} causes the given file to be
|
|
removed only after there are no more open file handles for it. Some
|
|
non-POSIX hosts have trouble with this requirement, though,
|
|
and some DOS variants even corrupt the file system.
|
|
|
|
@item @code{unsetenv}
|
|
@c @fuindex unsetenv
|
|
@prindex @code{unsetenv}
|
|
On MinGW, @code{unsetenv} is not available, but a variable @samp{FOO}
|
|
can be removed with a call @code{putenv ("FOO=")}, as described under
|
|
@code{putenv} above.
|
|
|
|
@item @code{va_copy}
|
|
@c @fuindex va_copy
|
|
@prindex @code{va_copy}
|
|
C99 and later provide @code{va_copy} for copying
|
|
@code{va_list} variables. It may be available in older environments
|
|
too, though possibly as @code{__va_copy} (e.g., @command{gcc} in strict
|
|
pre-C99 mode). These can be tested with @code{#ifdef}. A fallback to
|
|
@code{memcpy (&dst, &src, sizeof (va_list))} gives maximum
|
|
portability.
|
|
|
|
@item @code{va_list}
|
|
@c @fuindex va_list
|
|
@prindex @code{va_list}
|
|
@code{va_list} is not necessarily just a pointer. It can be a
|
|
@code{struct}, which means @code{NULL} is not portable.
|
|
Or it can be an array, which means as a function parameter it can be
|
|
effectively call-by-reference and library routines might modify the
|
|
value back in the caller.
|
|
|
|
@item Signed @code{>>}
|
|
Normally the C @code{>>} right shift of a signed type replicates the
|
|
high bit, giving a so-called ``arithmetic'' shift. But care should be
|
|
taken since Standard C doesn't require that behavior. On a few platforms
|
|
(e.g., Cray C by default) zero bits are shifted in, the same as a shift of an
|
|
unsigned type.
|
|
|
|
@item Integer @code{/}
|
|
C divides signed integers by truncating their quotient toward zero,
|
|
yielding the same result as Fortran. However, before C99 the standard
|
|
allowed C implementations to take the floor or ceiling of the quotient
|
|
in some cases. Hardly any implementations took advantage of this
|
|
freedom, though, and it's probably not worth worrying about this issue
|
|
nowadays.
|
|
@end table
|
|
|
|
|
|
@node Particular Functions
|
|
@subsection Particular Function Checks
|
|
@cindex Function, checking
|
|
|
|
These macros check for particular C functions---whether they exist, and
|
|
in some cases how they respond when given certain arguments.
|
|
|
|
@anchor{AC_FUNC_ALLOCA}
|
|
@defmac AC_FUNC_ALLOCA
|
|
@acindex{FUNC_ALLOCA}
|
|
@cvindex C_ALLOCA
|
|
@cvindex HAVE_ALLOCA_H
|
|
@ovindex ALLOCA
|
|
@c @fuindex alloca
|
|
@prindex @code{alloca}
|
|
@hdrindex{alloca.h}
|
|
@c @caindex working_alloca_h
|
|
Check for the @code{alloca} function. Define @code{HAVE_ALLOCA_H} if
|
|
@file{alloca.h} defines a working @code{alloca}. If not, look for a
|
|
builtin alternative. If either method succeeds, define
|
|
@code{HAVE_ALLOCA}. Otherwise, set the output variable @code{ALLOCA} to
|
|
@samp{$@{LIBOBJDIR@}alloca.o} and define
|
|
@code{C_ALLOCA} (so programs can periodically call @samp{alloca (0)} to
|
|
garbage collect). This variable is separate from @code{LIBOBJS} so
|
|
multiple programs can share the value of @code{ALLOCA} without needing
|
|
to create an actual library, in case only some of them use the code in
|
|
@code{LIBOBJS}. The @samp{$@{LIBOBJDIR@}} prefix serves the same
|
|
purpose as in @code{LIBOBJS} (@pxref{AC_LIBOBJ vs LIBOBJS}).
|
|
|
|
Source files that use @code{alloca} should start with a piece of code
|
|
like the following, to declare it properly.
|
|
|
|
@example
|
|
@group
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
#ifdef HAVE_ALLOCA_H
|
|
# include <alloca.h>
|
|
#elif !defined alloca
|
|
# ifdef __GNUC__
|
|
# define alloca __builtin_alloca
|
|
# elif defined _MSC_VER
|
|
# include <malloc.h>
|
|
# define alloca _alloca
|
|
# elif !defined HAVE_ALLOCA
|
|
# ifdef __cplusplus
|
|
extern "C"
|
|
# endif
|
|
void *alloca (size_t);
|
|
# endif
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
If you don't want to maintain this piece of code in your package manually,
|
|
you can instead use the Gnulib module @code{alloca-opt} or @code{alloca}.
|
|
@xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_CHOWN
|
|
@acindex{FUNC_CHOWN}
|
|
@cvindex HAVE_CHOWN
|
|
@c @fuindex chown
|
|
@prindex @code{chown}
|
|
@caindex func_chown_works
|
|
If the @code{chown} function is available and works (in particular, it
|
|
should accept @option{-1} for @code{uid} and @code{gid}), define
|
|
@code{HAVE_CHOWN}. The result of this macro is cached in the
|
|
@code{ac_cv_func_chown_works} variable.
|
|
|
|
If you want a workaround, that is, a @code{chown} function that is
|
|
available and works, you can use the Gnulib module @code{chown}.
|
|
@xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_CLOSEDIR_VOID}
|
|
@defmac AC_FUNC_CLOSEDIR_VOID
|
|
@acindex{FUNC_CLOSEDIR_VOID}
|
|
@cvindex CLOSEDIR_VOID
|
|
@c @fuindex closedir
|
|
@prindex @code{closedir}
|
|
@caindex func_closedir_void
|
|
If the @code{closedir} function does not return a meaningful value,
|
|
define @code{CLOSEDIR_VOID}. Otherwise, callers ought to check its
|
|
return value for an error indicator.
|
|
|
|
Currently this test is implemented by running a test program. When
|
|
cross compiling the pessimistic assumption that @code{closedir} does not
|
|
return a meaningful value is made.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_closedir_void}
|
|
variable.
|
|
|
|
This macro is obsolescent, as @code{closedir} returns a meaningful value
|
|
on current systems. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_ERROR_AT_LINE
|
|
@acindex{FUNC_ERROR_AT_LINE}
|
|
@c @fuindex error_at_line
|
|
@prindex @code{error_at_line}
|
|
@caindex lib_error_at_line
|
|
If the @code{error_at_line} function is not found, require an
|
|
@code{AC_LIBOBJ} replacement of @samp{error}.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_lib_error_at_line}
|
|
variable.
|
|
|
|
The @code{AC_FUNC_ERROR_AT_LINE} macro is obsolescent. New programs
|
|
should use Gnulib's @code{error} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_FNMATCH
|
|
@acindex{FUNC_FNMATCH}
|
|
@c @fuindex fnmatch
|
|
@prindex @code{fnmatch}
|
|
@caindex func_fnmatch_works
|
|
If the @code{fnmatch} function conforms to POSIX, define
|
|
@code{HAVE_FNMATCH}.
|
|
|
|
Unlike the other specific
|
|
@code{AC_FUNC} macros, @code{AC_FUNC_FNMATCH} does not replace a
|
|
broken/missing @code{fnmatch}. This is for historical reasons.
|
|
See @code{AC_REPLACE_FNMATCH} below.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_fnmatch_works}
|
|
variable.
|
|
|
|
This macro is obsolescent. New programs should use Gnulib's
|
|
@code{fnmatch-posix} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_FNMATCH_GNU
|
|
@acindex{FUNC_FNMATCH_GNU}
|
|
@c @fuindex fnmatch
|
|
@prindex @code{fnmatch}
|
|
@caindex func_fnmatch_gnu
|
|
Behave like @code{AC_REPLACE_FNMATCH} (@emph{replace}) but also test
|
|
whether @code{fnmatch} supports GNU extensions. Detect common
|
|
implementation bugs, for example, the bugs in the GNU C
|
|
Library 2.1.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_fnmatch_gnu}
|
|
variable.
|
|
|
|
This macro is obsolescent. New programs should use Gnulib's
|
|
@code{fnmatch-gnu} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_FORK}
|
|
@defmac AC_FUNC_FORK
|
|
@acindex{FUNC_FORK}
|
|
@cvindex HAVE_VFORK_H
|
|
@cvindex HAVE_WORKING_FORK
|
|
@cvindex HAVE_WORKING_VFORK
|
|
@cvindex vfork
|
|
@c @fuindex fork
|
|
@prindex @code{fork}
|
|
@c @fuindex vfork
|
|
@prindex @code{vfork}
|
|
@hdrindex{vfork.h}
|
|
@c @caindex func_fork
|
|
@c @caindex func_fork_works
|
|
This macro checks for the @code{fork} and @code{vfork} functions. If a
|
|
working @code{fork} is found, define @code{HAVE_WORKING_FORK}. This macro
|
|
checks whether @code{fork} is just a stub by trying to run it.
|
|
|
|
If @file{vfork.h} is found, define @code{HAVE_VFORK_H}. If a working
|
|
@code{vfork} is found, define @code{HAVE_WORKING_VFORK}. Otherwise,
|
|
define @code{vfork} to be @code{fork} for backward compatibility with
|
|
previous versions of @command{autoconf}. This macro checks for several known
|
|
errors in implementations of @code{vfork} and considers the system to not
|
|
have a working @code{vfork} if it detects any of them.
|
|
|
|
Since this macro defines @code{vfork} only for backward compatibility with
|
|
previous versions of @command{autoconf} you're encouraged to define it
|
|
yourself in new code:
|
|
@example
|
|
@group
|
|
#ifndef HAVE_WORKING_VFORK
|
|
# define vfork fork
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
The results of this macro are cached in the @code{ac_cv_func_fork_works}
|
|
and @code{ac_cv_func_vfork_works} variables. In order to override the
|
|
test, you also need to set the @code{ac_cv_func_fork} and
|
|
@code{ac_cv_func_vfork} variables.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_FSEEKO}
|
|
@defmac AC_FUNC_FSEEKO
|
|
@acindex{FUNC_FSEEKO}
|
|
@cvindex _LARGEFILE_SOURCE
|
|
@cvindex HAVE_FSEEKO
|
|
@c @fuindex fseeko
|
|
@prindex @code{fseeko}
|
|
@c @fuindex ftello
|
|
@prindex @code{ftello}
|
|
@c @caindex sys_largefile_source
|
|
If the @code{fseeko} and @code{ftello} functions are available, define
|
|
@code{HAVE_FSEEKO}. Define @code{_LARGEFILE_SOURCE} if necessary to
|
|
make the prototype visible.
|
|
|
|
Configure scripts that use @code{AC_FUNC_FSEEKO} should normally also
|
|
use @code{AC_SYS_LARGEFILE} to ensure that @code{off_t} can represent
|
|
all supported file sizes. @xref{AC_SYS_LARGEFILE}.
|
|
|
|
The Gnulib module @code{fseeko} invokes @code{AC_FUNC_FSEEKO}
|
|
and also contains workarounds for other portability problems of
|
|
@code{fseeko}. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_GETGROUPS
|
|
@acindex{FUNC_GETGROUPS}
|
|
@cvindex HAVE_GETGROUPS
|
|
@ovindex GETGROUPS_LIB
|
|
@c @fuindex getgroups
|
|
@prindex @code{getgroups}
|
|
@caindex func_getgroups_works
|
|
Perform all the checks performed by @code{AC_TYPE_GETGROUPS}
|
|
(@pxref{AC_TYPE_GETGROUPS}).
|
|
Then, if the @code{getgroups} function is available
|
|
and known to work correctly, define @code{HAVE_GETGROUPS}.
|
|
Set the output variable @code{GETGROUPS_LIB} to any libraries
|
|
needed to get that function.
|
|
|
|
This macro relies on a list of systems with known, serious bugs in
|
|
@code{getgroups}. If this list mis-identifies your system's
|
|
@code{getgroups} as buggy, or as not buggy, you can override it by
|
|
setting the cache variable @code{ac_cv_func_getgroups_works} in a
|
|
@file{config.site} file (@pxref{Site Defaults}). Please also report the
|
|
error to @email{bug-autoconf@@gnu.org, the Autoconf Bugs mailing list}.
|
|
|
|
The Gnulib module @code{getgroups} provides workarounds for additional,
|
|
less severe portability problems with this function.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_GETLOADAVG}
|
|
@defmac AC_FUNC_GETLOADAVG
|
|
@acindex{FUNC_GETLOADAVG}
|
|
@cvindex SVR4
|
|
@cvindex DGUX
|
|
@cvindex UMAX
|
|
@cvindex UMAX4_3
|
|
@cvindex HAVE_NLIST_H
|
|
@cvindex NLIST_NAME_UNION
|
|
@cvindex GETLOADAVG_PRIVILEGED
|
|
@cvindex NEED_SETGID
|
|
@cvindex C_GETLOADAVG
|
|
@ovindex LIBOBJS
|
|
@ovindex NEED_SETGID
|
|
@ovindex KMEM_GROUP
|
|
@ovindex GETLOADAVG_LIBS
|
|
@c @fuindex getloadavg
|
|
@prindex @code{getloadavg}
|
|
Check how to get the system load averages. To perform its tests
|
|
properly, this macro needs the file @file{getloadavg.c}; therefore, be
|
|
sure to set the @code{AC_LIBOBJ} replacement directory properly (see
|
|
@ref{Generic Functions}, @code{AC_CONFIG_LIBOBJ_DIR}).
|
|
|
|
If the system has the @code{getloadavg} function, define
|
|
@code{HAVE_GETLOADAVG}, and set @code{GETLOADAVG_LIBS} to any libraries
|
|
necessary to get that function. Also add @code{GETLOADAVG_LIBS} to
|
|
@code{LIBS}. Otherwise, require an @code{AC_LIBOBJ} replacement for
|
|
@samp{getloadavg} and possibly define several other C preprocessor
|
|
macros and output variables:
|
|
|
|
@enumerate
|
|
@item
|
|
Define @code{C_GETLOADAVG}.
|
|
|
|
@item
|
|
Define @code{SVR4}, @code{DGUX}, @code{UMAX}, or @code{UMAX4_3} if on
|
|
those systems.
|
|
|
|
@item
|
|
@hdrindex{nlist.h}
|
|
If @file{nlist.h} is found, define @code{HAVE_NLIST_H}.
|
|
|
|
@item
|
|
If @samp{struct nlist} has an @samp{n_un.n_name} member, define
|
|
@code{HAVE_STRUCT_NLIST_N_UN_N_NAME}. The obsolete symbol
|
|
@code{NLIST_NAME_UNION} is still defined, but do not depend upon it.
|
|
|
|
@item
|
|
Programs may need to be installed set-group-ID (or set-user-ID) for
|
|
@code{getloadavg} to work. In this case, define
|
|
@code{GETLOADAVG_PRIVILEGED}, set the output variable @code{NEED_SETGID}
|
|
to @samp{true} (and otherwise to @samp{false}), and set
|
|
@code{KMEM_GROUP} to the name of the group that should own the installed
|
|
program.
|
|
@end enumerate
|
|
|
|
The @code{AC_FUNC_GETLOADAVG} macro is obsolescent. New programs should
|
|
use Gnulib's @code{getloadavg} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_GETMNTENT}
|
|
@defmac AC_FUNC_GETMNTENT
|
|
@acindex{FUNC_GETMNTENT}
|
|
@cvindex HAVE_GETMNTENT
|
|
@c @fuindex getmntent
|
|
@prindex @code{getmntent}
|
|
@caindex search_getmntent
|
|
Check for @code{getmntent} in the standard C library, and then in the
|
|
@file{sun}, @file{seq}, and @file{gen} libraries. Then, if
|
|
@code{getmntent} is available, define @code{HAVE_GETMNTENT} and set
|
|
@code{ac_cv_func_getmntent} to @code{yes}. Otherwise set
|
|
@code{ac_cv_func_getmntent} to @code{no}.
|
|
|
|
The result of this macro can be overridden by setting the cache variable
|
|
@code{ac_cv_search_getmntent}.
|
|
|
|
The @code{AC_FUNC_GETMNTENT} macro is obsolescent. New programs should
|
|
use Gnulib's @code{mountlist} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_GETPGRP
|
|
@acindex{FUNC_GETPGRP}
|
|
@cvindex GETPGRP_VOID
|
|
@c @fuindex getpgid
|
|
@c @fuindex getpgrp
|
|
@prindex @code{getpgid}
|
|
@prindex @code{getpgrp}
|
|
@caindex func_getpgrp_void
|
|
Define @code{GETPGRP_VOID} if it is an error to pass 0 to
|
|
@code{getpgrp}; this is the POSIX behavior. On older BSD
|
|
systems, you must pass 0 to @code{getpgrp}, as it takes an argument and
|
|
behaves like POSIX's @code{getpgid}.
|
|
|
|
@example
|
|
#ifdef GETPGRP_VOID
|
|
pid = getpgrp ();
|
|
#else
|
|
pid = getpgrp (0);
|
|
#endif
|
|
@end example
|
|
|
|
This macro does not check whether
|
|
@code{getpgrp} exists at all; if you need to work in that situation,
|
|
first call @code{AC_CHECK_FUNC} for @code{getpgrp}.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_getpgrp_void}
|
|
variable.
|
|
|
|
This macro is obsolescent, as current systems have a @code{getpgrp}
|
|
whose signature conforms to POSIX. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
|
|
@acindex{FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK}
|
|
@cvindex LSTAT_FOLLOWS_SLASHED_SYMLINK
|
|
@c @fuindex lstat
|
|
@prindex @code{lstat}
|
|
@caindex func_lstat_dereferences_slashed_symlink
|
|
If @file{link} is a symbolic link, then @code{lstat} should treat
|
|
@file{link/} the same as @file{link/.}. However, many older
|
|
@code{lstat} implementations incorrectly ignore trailing slashes.
|
|
|
|
It is safe to assume that if @code{lstat} incorrectly ignores
|
|
trailing slashes, then other symbolic-link-aware functions like
|
|
@code{unlink} also incorrectly ignore trailing slashes.
|
|
|
|
If @code{lstat} behaves properly, define
|
|
@code{LSTAT_FOLLOWS_SLASHED_SYMLINK}, otherwise require an
|
|
@code{AC_LIBOBJ} replacement of @code{lstat}.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_lstat_dereferences_slashed_symlink} variable.
|
|
|
|
The @code{AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} macro is obsolescent.
|
|
New programs should use Gnulib's @code{lstat} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_MALLOC
|
|
@acindex{FUNC_MALLOC}
|
|
@cvindex HAVE_MALLOC
|
|
@cvindex malloc
|
|
@c @fuindex malloc
|
|
@prindex @code{malloc}
|
|
@caindex func_malloc_0_nonnull
|
|
If the @code{malloc} function is compatible with the GNU C
|
|
library @code{malloc} (i.e., @samp{malloc (0)} returns a valid
|
|
pointer), define @code{HAVE_MALLOC} to 1. Otherwise define
|
|
@code{HAVE_MALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
|
|
@samp{malloc}, and define @code{malloc} to @code{rpl_malloc} so that the
|
|
native @code{malloc} is not used in the main project.
|
|
|
|
Typically, the replacement file @file{malloc.c} should look like (note
|
|
the @samp{#undef malloc}):
|
|
|
|
@verbatim
|
|
#include <config.h>
|
|
#undef malloc
|
|
|
|
#include <stdlib.h>
|
|
|
|
/* Allocate an N-byte block of memory from the heap.
|
|
If N is zero, allocate a 1-byte block. */
|
|
|
|
void *
|
|
rpl_malloc (size_t n)
|
|
{
|
|
if (n == 0)
|
|
n = 1;
|
|
return malloc (n);
|
|
}
|
|
@end verbatim
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_malloc_0_nonnull} variable.
|
|
The result might contain spaces, e.g., @code{guessing yes}.
|
|
|
|
If you don't want to maintain a @code{malloc.c} file in your package
|
|
manually, you can instead use the Gnulib module @code{malloc-gnu}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_MBRTOWC
|
|
@acindex{FUNC_MBRTOWC}
|
|
@cvindex HAVE_MBRTOWC
|
|
@c @fuindex mbrtowc
|
|
@prindex @code{mbrtowc}
|
|
@caindex func_mbrtowc
|
|
Define @code{HAVE_MBRTOWC} to 1 if the function @code{mbrtowc} and the
|
|
type @code{mbstate_t} are properly declared.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_mbrtowc}
|
|
variable.
|
|
|
|
The Gnulib module @code{mbrtowc} not only ensures that the
|
|
function is declared, but also works around other portability
|
|
problems of this function.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_MEMCMP
|
|
@acindex{FUNC_MEMCMP}
|
|
@ovindex LIBOBJS
|
|
@c @fuindex memcmp
|
|
@prindex @code{memcmp}
|
|
@caindex func_memcmp_working
|
|
If the @code{memcmp} function is not available or does not work, require an
|
|
@code{AC_LIBOBJ} replacement for @samp{memcmp}.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_memcmp_working} variable.
|
|
|
|
This macro is obsolescent, as current systems have a working
|
|
@code{memcmp}. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_MKTIME
|
|
@acindex{FUNC_MKTIME}
|
|
@ovindex LIBOBJS
|
|
@c @fuindex mktime
|
|
@prindex @code{mktime}
|
|
@caindex func_working_mktime
|
|
If the @code{mktime} function is not available, or does not work
|
|
correctly, require an @code{AC_LIBOBJ} replacement for @samp{mktime}.
|
|
For the purposes of this test, @code{mktime} should conform to the
|
|
POSIX standard and should be the inverse of
|
|
@code{localtime}.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_working_mktime} variable.
|
|
|
|
The @code{AC_FUNC_MKTIME} macro is obsolescent. New programs should
|
|
use Gnulib's @code{mktime} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_MMAP}
|
|
@defmac AC_FUNC_MMAP
|
|
@acindex{FUNC_MMAP}
|
|
@cvindex HAVE_MMAP
|
|
@c @fuindex mmap
|
|
@prindex @code{mmap}
|
|
@caindex func_mmap_fixed_mapped
|
|
If the @code{mmap} function exists and works correctly, define
|
|
@code{HAVE_MMAP}. This checks only private fixed mapping of already-mapped
|
|
memory.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_mmap_fixed_mapped} variable.
|
|
|
|
Note: This macro asks for more than what an average program needs from
|
|
@code{mmap}. In particular, the use of @code{MAP_FIXED} fails on
|
|
HP-UX 11, whereas @code{mmap} otherwise works fine on this platform.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_OBSTACK
|
|
@acindex{FUNC_OBSTACK}
|
|
@cvindex HAVE_OBSTACK
|
|
@cindex obstack
|
|
@caindex func_obstack
|
|
If the obstacks are found, define @code{HAVE_OBSTACK}, else require an
|
|
@code{AC_LIBOBJ} replacement for @samp{obstack}.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_obstack}
|
|
variable.
|
|
|
|
The @code{AC_FUNC_OBSTACK} macro is obsolescent. New programs should use
|
|
Gnulib's @code{obstack} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_REALLOC
|
|
@acindex{FUNC_REALLOC}
|
|
@cvindex HAVE_REALLOC
|
|
@cvindex realloc
|
|
@c @fuindex realloc
|
|
@prindex @code{realloc}
|
|
@caindex func_realloc_0_nonnull
|
|
If a successful call to @samp{realloc (NULL, 0)} returns a
|
|
non-null pointer, define @code{HAVE_REALLOC} to 1. Otherwise define
|
|
@code{HAVE_REALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
|
|
@samp{realloc}, and define @code{realloc} to @code{rpl_realloc} so that
|
|
the native @code{realloc} is not used in the main project. See
|
|
@code{AC_FUNC_MALLOC} for details.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_realloc_0_nonnull} variable.
|
|
The result might contain spaces, e.g., @code{guessing yes}.
|
|
|
|
This macro does not check compatibility with glibc @code{realloc (@var{p}, 0)}
|
|
when @var{p} is non-null, as glibc 1--2.1 behaves differently from glibc
|
|
2.1.1--2.40 (at least), and the C standard says behavior is undefined.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_SELECT_ARGTYPES
|
|
@acindex{FUNC_SELECT_ARGTYPES}
|
|
@cvindex SELECT_TYPE_ARG1
|
|
@cvindex SELECT_TYPE_ARG234
|
|
@cvindex SELECT_TYPE_ARG5
|
|
@c @fuindex select
|
|
@prindex @code{select}
|
|
@c @caindex func_select_args
|
|
Determines the correct type to be passed for each of the
|
|
@code{select} function's arguments, and defines those types
|
|
in @code{SELECT_TYPE_ARG1}, @code{SELECT_TYPE_ARG234}, and
|
|
@code{SELECT_TYPE_ARG5} respectively. @code{SELECT_TYPE_ARG1} defaults
|
|
to @samp{int}, @code{SELECT_TYPE_ARG234} defaults to @samp{int *},
|
|
and @code{SELECT_TYPE_ARG5} defaults to @samp{struct timeval *}.
|
|
|
|
This macro is obsolescent, as current systems have a @code{select} whose
|
|
signature conforms to POSIX. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_SETPGRP
|
|
@acindex{FUNC_SETPGRP}
|
|
@cvindex SETPGRP_VOID
|
|
@c @fuindex setpgrp
|
|
@prindex @code{setpgrp}
|
|
@caindex func_setpgrp_void
|
|
If @code{setpgrp} takes no argument (the POSIX version), define
|
|
@code{SETPGRP_VOID}. Otherwise, it is the BSD version, which takes
|
|
two process IDs as arguments. This macro does not check whether
|
|
@code{setpgrp} exists at all; if you need to work in that situation,
|
|
first call @code{AC_CHECK_FUNC} for @code{setpgrp}. This macro also
|
|
does not check for the Solaris variant of @code{setpgrp}, which returns
|
|
a @code{pid_t} instead of an @code{int}; portable code should only use
|
|
the return value by comparing it against @code{-1} to check for errors.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_setpgrp_void}
|
|
variable.
|
|
|
|
This macro is obsolescent, as all forms of @code{setpgrp} are also
|
|
obsolescent. New programs should use the POSIX function @code{setpgid},
|
|
which takes two process IDs as arguments (like the BSD @code{setpgrp}).
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_STAT
|
|
@defmacx AC_FUNC_LSTAT
|
|
@acindex{FUNC_STAT}
|
|
@acindex{FUNC_LSTAT}
|
|
@cvindex HAVE_STAT_EMPTY_STRING_BUG
|
|
@cvindex HAVE_LSTAT_EMPTY_STRING_BUG
|
|
@c @fuindex stat
|
|
@prindex @code{stat}
|
|
@c @fuindex lstat
|
|
@prindex @code{lstat}
|
|
@caindex func_stat_empty_string_bug
|
|
@caindex func_lstat_empty_string_bug
|
|
Determine whether @code{stat} or @code{lstat} have the bug that it
|
|
succeeds when given the zero-length file name as argument.
|
|
|
|
If it does, then define @code{HAVE_STAT_EMPTY_STRING_BUG} (or
|
|
@code{HAVE_LSTAT_EMPTY_STRING_BUG}) and ask for an @code{AC_LIBOBJ}
|
|
replacement of it.
|
|
|
|
The results of these macros are cached in the
|
|
@code{ac_cv_func_stat_empty_string_bug} and the
|
|
@code{ac_cv_func_lstat_empty_string_bug} variables, respectively.
|
|
|
|
These macros are obsolescent, as no current systems have the bug.
|
|
New programs need not use these macros.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_STRCOLL}
|
|
@defmac AC_FUNC_STRCOLL
|
|
@acindex{FUNC_STRCOLL}
|
|
@cvindex HAVE_STRCOLL
|
|
@c @fuindex strcoll
|
|
@prindex @code{strcoll}
|
|
@caindex func_strcoll_works
|
|
If the @code{strcoll} function exists and works correctly, define
|
|
@code{HAVE_STRCOLL}. This does a bit more than
|
|
@samp{AC_CHECK_FUNCS(strcoll)}, because some systems have incorrect
|
|
definitions of @code{strcoll} that should not be used. But it does
|
|
not check against a known bug of this function on Solaris 10.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_func_strcoll_works}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_STRERROR_R
|
|
@acindex{FUNC_STRERROR_R}
|
|
@cvindex HAVE_STRERROR_R
|
|
@cvindex HAVE_DECL_STRERROR_R
|
|
@cvindex STRERROR_R_CHAR_P
|
|
@c @fuindex strerror_r
|
|
@caindex func_strerror_r_char_p
|
|
@prindex @code{strerror_r}
|
|
If @code{strerror_r} is available, define @code{HAVE_STRERROR_R}, and if
|
|
it is declared, define @code{HAVE_DECL_STRERROR_R}. If it returns a
|
|
@code{char *} message, define @code{STRERROR_R_CHAR_P}; otherwise it
|
|
returns an @code{int} error number. The Thread-Safe Functions option of
|
|
POSIX requires @code{strerror_r} to return @code{int}, but
|
|
many systems (including, for example, version 2.2.4 of the GNU C
|
|
Library) return a @code{char *} value that is not necessarily equal to
|
|
the buffer argument.
|
|
|
|
The result of this macro is cached in the
|
|
@code{ac_cv_func_strerror_r_char_p} variable.
|
|
|
|
The Gnulib module @code{strerror_r} not only ensures that the function
|
|
has the return type specified by POSIX, but also works around other
|
|
portability problems of this function.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_STRFTIME}
|
|
@defmac AC_FUNC_STRFTIME
|
|
@acindex{FUNC_STRFTIME}
|
|
@cvindex HAVE_STRFTIME
|
|
@c @fuindex strftime
|
|
@prindex @code{strftime}
|
|
Check for @code{strftime} in the @file{intl} library.
|
|
Then, if @code{strftime} is available, define @code{HAVE_STRFTIME}.
|
|
|
|
This macro is obsolescent, as no current systems require the @file{intl}
|
|
library for @code{strftime}. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_STRTOD
|
|
@acindex{FUNC_STRTOD}
|
|
@ovindex POW_LIB
|
|
@c @fuindex strtod
|
|
@prindex @code{strtod}
|
|
@caindex func_strtod
|
|
@caindex func_pow
|
|
If the @code{strtod} function does not exist or doesn't work correctly,
|
|
ask for an @code{AC_LIBOBJ} replacement of @samp{strtod}. In this case,
|
|
because @file{strtod.c} is likely to need @samp{pow}, set the output
|
|
variable @code{POW_LIB} to the extra library needed.
|
|
|
|
This macro caches its result in the @code{ac_cv_func_strtod} variable
|
|
and depends upon the result in the @code{ac_cv_func_pow} variable.
|
|
|
|
The @code{AC_FUNC_STRTOD} macro is obsolescent. New programs should
|
|
use Gnulib's @code{strtod} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_STRTOLD
|
|
@acindex{FUNC_STRTOLD}
|
|
@cvindex HAVE_STRTOLD
|
|
@prindex @code{strtold}
|
|
@caindex func_strtold
|
|
If the @code{strtold} function exists and conforms to C99 or later, define
|
|
@code{HAVE_STRTOLD}.
|
|
|
|
This macro caches its result in the @code{ac_cv_func_strtold} variable.
|
|
|
|
The Gnulib module @code{strtold} not only ensures that the
|
|
function exists, but also works around other portability
|
|
problems of this function.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_STRNLEN
|
|
@acindex{FUNC_STRNLEN}
|
|
@cvindex HAVE_STRNLEN
|
|
@c @fuindex strnlen
|
|
@prindex @code{strnlen}
|
|
@caindex func_strnlen_working
|
|
If the @code{strnlen} function is not available, or is buggy (like the one
|
|
from Android 5.0 or AIX 4.3), require an @code{AC_LIBOBJ} replacement for it.
|
|
|
|
This macro caches its result in the @code{ac_cv_func_strnlen_working}
|
|
variable.
|
|
|
|
The @code{AC_FUNC_STRNLEN} macro is obsolescent. New programs should
|
|
use Gnulib's @code{strnlen} module. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_UTIME_NULL}
|
|
@defmac AC_FUNC_UTIME_NULL
|
|
@acindex{FUNC_UTIME_NULL}
|
|
@cvindex HAVE_UTIME_NULL
|
|
@c @fuindex utime
|
|
@prindex @code{utime}
|
|
@caindex func_utime_null
|
|
If @samp{utime (@var{file}, NULL)} sets @var{file}'s timestamp to
|
|
the present, define @code{HAVE_UTIME_NULL}.
|
|
|
|
This macro caches its result in the @code{ac_cv_func_utime_null}
|
|
variable.
|
|
|
|
This macro is obsolescent, as all current systems have a @code{utime}
|
|
that behaves this way. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_VPRINTF}
|
|
@defmac AC_FUNC_VPRINTF
|
|
@acindex{FUNC_VPRINTF}
|
|
@cvindex HAVE_VPRINTF
|
|
@cvindex HAVE_DOPRNT
|
|
@c @fuindex vprintf
|
|
@prindex @code{vprintf}
|
|
@c @fuindex vsprintf
|
|
@prindex @code{vsprintf}
|
|
If @code{vprintf} is found, define @code{HAVE_VPRINTF}. Otherwise, if
|
|
@code{_doprnt} is found, define @code{HAVE_DOPRNT}. (If @code{vprintf}
|
|
is available, you may assume that @code{vfprintf} and @code{vsprintf}
|
|
are also available.)
|
|
|
|
This macro is obsolescent, as all current systems have @code{vprintf}.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_REPLACE_FNMATCH
|
|
@acindex{REPLACE_FNMATCH}
|
|
@c @fuindex fnmatch
|
|
@prindex @code{fnmatch}
|
|
@hdrindex{fnmatch.h}
|
|
@caindex func_fnmatch_works
|
|
If the @code{fnmatch} function does not conform to POSIX (see
|
|
@code{AC_FUNC_FNMATCH}), ask for its @code{AC_LIBOBJ} replacement.
|
|
|
|
The files @file{fnmatch.c}, @file{fnmatch_loop.c}, and @file{fnmatch_.h}
|
|
in the @code{AC_LIBOBJ} replacement directory are assumed to contain a
|
|
copy of the source code of GNU @code{fnmatch}. If necessary,
|
|
this source code is compiled as an @code{AC_LIBOBJ} replacement, and the
|
|
@file{fnmatch_.h} file is linked to @file{fnmatch.h} so that it can be
|
|
included in place of the system @code{<fnmatch.h>}.
|
|
|
|
This macro caches its result in the @code{ac_cv_func_fnmatch_works}
|
|
variable.
|
|
|
|
This macro is obsolescent, as it assumes the use of particular source
|
|
files. New programs should use Gnulib's @code{fnmatch-posix} module,
|
|
which provides this macro along with the source files. @xref{Gnulib}.
|
|
@end defmac
|
|
|
|
|
|
|
|
@node Generic Functions
|
|
@subsection Generic Function Checks
|
|
|
|
These macros are used to find functions not covered by the ``particular''
|
|
test macros. If the functions might be in libraries other than the
|
|
default C library, first call @code{AC_CHECK_LIB} for those libraries.
|
|
If you need to check the behavior of a function as well as find out
|
|
whether it is present, you have to write your own test for
|
|
it (@pxref{Writing Tests}).
|
|
|
|
@anchor{AC_CHECK_FUNC}
|
|
@defmac AC_CHECK_FUNC (@var{function}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{CHECK_FUNC}
|
|
@caindex func_@var{function}
|
|
If C function @var{function} is available, run shell commands
|
|
@var{action-if-found}, otherwise @var{action-if-not-found}. If you just
|
|
want to define a symbol if the function is available, consider using
|
|
@code{AC_CHECK_FUNCS} instead. This macro checks for functions with C
|
|
linkage even when @code{AC_LANG(C++)} has been called, since C is more
|
|
standardized than C++. (@pxref{Language Choice}, for more information
|
|
about selecting the language for checks.)
|
|
|
|
This macro caches its result in the @code{ac_cv_func_@var{function}}
|
|
variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_CHECK_FUNCS}
|
|
@defmac AC_CHECK_FUNCS (@var{function}@dots{}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{CHECK_FUNCS}
|
|
@cvindex HAVE_@var{function}
|
|
For each @var{function} enumerated in the blank-or-newline-separated argument
|
|
list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
|
|
If @var{action-if-found} is given, it is additional shell code to
|
|
execute when one of the functions is found. You can give it a value of
|
|
@samp{break} to break out of the loop on the first match. If
|
|
@var{action-if-not-found} is given, it is executed when one of the
|
|
functions is not found.
|
|
|
|
Results are cached for each @var{function} as in @code{AC_CHECK_FUNC}.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_FUNCS_ONCE (@var{function}@dots{})
|
|
@acindex{CHECK_FUNCS_ONCE}
|
|
@cvindex HAVE_@var{function}
|
|
For each @var{function} enumerated in the blank-or-newline-separated argument
|
|
list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
|
|
This is a once-only variant of @code{AC_CHECK_FUNCS}. It generates the
|
|
checking code at most once, so that @command{configure} is smaller and
|
|
faster; but the checks cannot be conditionalized and are always done once,
|
|
early during the @command{configure} run.
|
|
@end defmac
|
|
|
|
@sp 1
|
|
|
|
Autoconf follows a philosophy that was formed over the years by those
|
|
who have struggled for portability: isolate the portability issues in
|
|
specific files, and then program as if you were in a POSIX
|
|
environment. Some functions may be missing or unfixable, and your
|
|
package must be ready to replace them.
|
|
|
|
Suitable replacements for many such problem functions are available from
|
|
Gnulib (@pxref{Gnulib}).
|
|
|
|
@defmac AC_LIBOBJ (@var{function})
|
|
@acindex{LIBOBJ}
|
|
@ovindex LIBOBJS
|
|
Specify that @samp{@var{function}.c} must be included in the executables
|
|
to replace a missing or broken implementation of @var{function}.
|
|
|
|
@vrindex ac_objext
|
|
Technically, it adds @samp{@var{function}.$ac_objext} to the output
|
|
variable @code{LIBOBJS} if it is not already in, and calls
|
|
@code{AC_LIBSOURCE} for @samp{@var{function}.c}. You should not
|
|
directly change @code{LIBOBJS}, since this is not traceable.
|
|
@end defmac
|
|
|
|
@defmac AC_LIBSOURCE (@var{file})
|
|
@acindex{LIBSOURCE}
|
|
Specify that @var{file} might be needed to compile the project. If you
|
|
need to know what files might be needed by a @file{configure.ac}, you
|
|
should trace @code{AC_LIBSOURCE}. @var{file} must be a literal.
|
|
|
|
This macro is called automatically from @code{AC_LIBOBJ}, but you must
|
|
call it explicitly if you pass a shell variable to @code{AC_LIBOBJ}. In
|
|
that case, since shell variables cannot be traced statically, you must
|
|
pass to @code{AC_LIBSOURCE} any possible files that the shell variable
|
|
might cause @code{AC_LIBOBJ} to need. For example, if you want to pass
|
|
a variable @code{$foo_or_bar} to @code{AC_LIBOBJ} that holds either
|
|
@code{"foo"} or @code{"bar"}, you should do:
|
|
|
|
@example
|
|
AC_LIBSOURCE([foo.c])
|
|
AC_LIBSOURCE([bar.c])
|
|
AC_LIBOBJ([$foo_or_bar])
|
|
@end example
|
|
|
|
@noindent
|
|
There is usually a way to avoid this, however, and you are encouraged to
|
|
simply call @code{AC_LIBOBJ} with literal arguments.
|
|
|
|
Note that this macro replaces the obsolete @code{AC_LIBOBJ_DECL}, with
|
|
slightly different semantics: the old macro took the function name,
|
|
e.g., @code{foo}, as its argument rather than the file name.
|
|
@end defmac
|
|
|
|
@defmac AC_LIBSOURCES (@var{files})
|
|
@acindex{LIBSOURCES}
|
|
Like @code{AC_LIBSOURCE}, but accepts one or more @var{files} in a
|
|
comma-separated M4 list. Thus, the above example might be rewritten:
|
|
|
|
@example
|
|
AC_LIBSOURCES([foo.c, bar.c])
|
|
AC_LIBOBJ([$foo_or_bar])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_CONFIG_LIBOBJ_DIR (@var{directory})
|
|
@acindex{CONFIG_LIBOBJ_DIR}
|
|
Specify that @code{AC_LIBOBJ} replacement files are to be found in
|
|
@var{directory}, a name relative to the top level of the
|
|
source tree. The replacement directory defaults to @file{.}, the top
|
|
level directory, and the most typical value is @file{lib}, corresponding
|
|
to @samp{AC_CONFIG_LIBOBJ_DIR([lib])}.
|
|
|
|
@command{configure} might need to know the replacement directory for the
|
|
following reasons: (i) some checks use the replacement files, (ii) some
|
|
macros bypass broken system headers by installing links to the
|
|
replacement headers (iii) when used in conjunction with Automake,
|
|
within each makefile, @var{directory} is used as a relative path
|
|
from @code{$(top_srcdir)} to each object named in @code{LIBOBJS} and
|
|
@code{LTLIBOBJS}, etc.
|
|
@end defmac
|
|
|
|
@sp 1
|
|
|
|
It is common to merely check for the existence of a function, and ask
|
|
for its @code{AC_LIBOBJ} replacement if missing. The following macro is
|
|
a convenient shorthand.
|
|
|
|
@defmac AC_REPLACE_FUNCS (@var{function}@dots{})
|
|
@acindex{REPLACE_FUNCS}
|
|
@cvindex HAVE_@var{function}
|
|
@ovindex LIBOBJS
|
|
Like @code{AC_CHECK_FUNCS}, but uses @samp{AC_LIBOBJ(@var{function})} as
|
|
@var{action-if-not-found}. You can declare your replacement function by
|
|
enclosing the prototype in @samp{#ifndef HAVE_@var{function}}. If the
|
|
system has the function, it probably declares it in a header file you
|
|
should be including, so you shouldn't redeclare it lest your declaration
|
|
conflict.
|
|
@end defmac
|
|
|
|
@node Header Files
|
|
@section Header Files
|
|
@cindex Header, checking
|
|
|
|
The following macros check for the presence of certain C header files.
|
|
If there is no macro specifically defined to check for a header file you need,
|
|
and you don't need to check for any special properties of
|
|
it, then you can use one of the general header-file check macros.
|
|
|
|
@menu
|
|
* Header Portability:: Collected knowledge on common headers
|
|
* Particular Headers:: Special handling to find certain headers
|
|
* Generic Headers:: How to find other headers
|
|
@end menu
|
|
|
|
@node Header Portability
|
|
@subsection Portability of Headers
|
|
@cindex Portability of headers
|
|
@cindex Header portability
|
|
|
|
This section documents some collected knowledge about common headers,
|
|
and the problems they cause. By definition, this list always requires
|
|
additions. A much more complete list is maintained by the Gnulib
|
|
project (@pxref{Gnulib}), covering @ref{Header File Substitutes, ,
|
|
POSIX Headers, gnulib, Gnulib} and @ref{Glibc Header File
|
|
Substitutes, , Glibc Headers, gnulib, Gnulib}. Please help us keep
|
|
the Gnulib list as complete as possible.
|
|
|
|
When we say that a header ``may require'' some set of other headers, we
|
|
mean that it may be necessary for you to manually include those other
|
|
headers first, or the contents of the header under test will fail to
|
|
compile. When checking for these headers, you must provide the
|
|
potentially-required headers in the @var{includes} argument to
|
|
@code{AC_CHECK_HEADER} or @code{AC_CHECK_HEADERS}, or the check will
|
|
fail spuriously. @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes})
|
|
arranges to include a number of common requirements and should normally
|
|
come first in your @var{includes}. For example, @file{net/if.h} may
|
|
require @file{sys/types.h}, @file{sys/socket.h}, or both, and
|
|
@code{AC_INCLUDES_DEFAULT} handles @file{sys/types.h} but not
|
|
@file{sys/socket.h}, so you should check for it like this:
|
|
|
|
@example
|
|
AC_CHECK_HEADERS([sys/socket.h])
|
|
AC_CHECK_HEADERS([net/if.h], [], [],
|
|
[AC_INCLUDES_DEFAULT[
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
# include <sys/socket.h>
|
|
#endif
|
|
]])
|
|
@end example
|
|
|
|
Note that the example mixes single quoting (for@code{AC_INCLUDES_DEFAULT},
|
|
so that it gets expanded) and double quoting (to ensure that each
|
|
preprocessor @code{#} gets treated as a literal string rather than a
|
|
comment).
|
|
|
|
@table @asis
|
|
|
|
@item @file{limits.h}
|
|
In C99 and later, @file{limits.h} defines @code{LLONG_MIN},
|
|
@code{LLONG_MAX}, and @code{ULLONG_MAX}, but many almost-C99
|
|
environments (e.g., default GCC 4.0.2 + glibc 2.4) do not
|
|
define them.
|
|
|
|
@item @file{memory.h}
|
|
@hdrindex{memory.h}
|
|
This header file is obsolete; use @file{string.h} instead.
|
|
|
|
@item @file{strings.h}
|
|
@hdrindex{strings.h}
|
|
On some systems, this is the only header that declares
|
|
@code{strcasecmp}, @code{strncasecmp}, and @code{ffs}.
|
|
|
|
This header may or may not include @file{string.h} for you. However, on
|
|
all recent systems it is safe to include both @file{string.h} and
|
|
@file{strings.h}, in either order, in the same source file.
|
|
|
|
@item @file{inttypes.h} vs.@: @file{stdint.h}
|
|
@hdrindex{inttypes.h}
|
|
@hdrindex{stdint.h}
|
|
C99 specifies that @file{inttypes.h} includes @file{stdint.h}, so there's
|
|
no need to include @file{stdint.h} separately in a standard environment.
|
|
However, some implementations have @file{stdint.h} but not @file{inttypes.h}
|
|
(e.g. MSVC 2012). Therefore, it is necessary to check for each and include
|
|
each only if available.
|
|
|
|
@item @file{linux/irda.h}
|
|
@hdrindex{linux/irda.h}
|
|
This header may require @file{linux/types.h} and/or @file{sys/socket.h}.
|
|
|
|
@item @file{linux/random.h}
|
|
@hdrindex{linux/random.h}
|
|
This header may require @file{linux/types.h}.
|
|
|
|
@item @file{net/if.h}
|
|
@hdrindex{net/if.h}
|
|
This header may require @file{sys/types.h} and/or @file{sys/socket.h}.
|
|
|
|
@item @file{netinet/if_ether.h}
|
|
@hdrindex{netinet/if_ether.h}
|
|
This header may require some combination of @file{sys/types.h},
|
|
@file{sys/socket.h}, @file{netinet/in.h}, and @file{net/if.h}.
|
|
|
|
@item @file{sys/mount.h}
|
|
@hdrindex{sys/mount.h}
|
|
This header may require @file{sys/params.h}.
|
|
|
|
@item @file{sys/ptem.h}
|
|
@hdrindex{sys/ptem.h}
|
|
This header may require @file{sys/stream.h}.
|
|
|
|
@item @file{sys/socket.h}
|
|
@hdrindex{sys/socket.h}
|
|
This header may require @file{sys/types.h}.
|
|
|
|
@item @file{sys/ucred.h}
|
|
@hdrindex{sys/ucred.h}
|
|
This header may require @file{sys/types.h}.
|
|
|
|
@item @file{X11/extensions/scrnsaver.h}
|
|
@hdrindex{X11/extensions/scrnsaver.h}
|
|
Using XFree86, this header requires @file{X11/Xlib.h}, which is probably
|
|
so required that you might not even consider looking for it.
|
|
|
|
@end table
|
|
|
|
|
|
@node Particular Headers
|
|
@subsection Particular Header Checks
|
|
|
|
These macros check for particular system header files---whether they
|
|
exist, and in some cases whether they declare certain symbols.
|
|
|
|
@defmac AC_CHECK_HEADER_STDBOOL
|
|
@acindex{CHECK_HEADER_STDBOOL}
|
|
@cvindex HAVE__BOOL
|
|
@hdrindex{stdbool.h}
|
|
@caindex header_stdbool_h
|
|
Check whether @file{stdbool.h} exists and conforms to C99 or later,
|
|
and cache the result in the @code{ac_cv_header_stdbool_h} variable.
|
|
If the type @code{_Bool} is defined, define @code{HAVE__BOOL} to 1.
|
|
|
|
This macro is obsolescent, as all current C compilers have @file{stdbool.h},
|
|
a header that is itself obsolescent as of C23.
|
|
|
|
This macro is intended for use by Gnulib (@pxref{Gnulib}) and other
|
|
packages that supply a substitute @file{stdbool.h} on platforms lacking
|
|
a conforming one. The @code{AC_HEADER_STDBOOL} macro is better for code
|
|
that explicitly checks for @file{stdbool.h}.
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_ASSERT
|
|
@acindex{HEADER_ASSERT}
|
|
@cvindex NDEBUG
|
|
@hdrindex{assert.h}
|
|
Check whether to enable assertions in the style of @file{assert.h}.
|
|
Assertions are enabled by default, but the user can override this by
|
|
invoking @command{configure} with the @option{--disable-assert} option.
|
|
@end defmac
|
|
|
|
@anchor{AC_HEADER_DIRENT}
|
|
@defmac AC_HEADER_DIRENT
|
|
@acindex{HEADER_DIRENT}
|
|
@cvindex HAVE_DIRENT_H
|
|
@cvindex HAVE_NDIR_H
|
|
@cvindex HAVE_SYS_DIR_H
|
|
@cvindex HAVE_SYS_NDIR_H
|
|
@hdrindex{dirent.h}
|
|
@hdrindex{sys/ndir.h}
|
|
@hdrindex{sys/dir.h}
|
|
@hdrindex{ndir.h}
|
|
Check for the following header files. For the first one that is
|
|
found and defines @samp{DIR}, define the listed C preprocessor macro:
|
|
|
|
@multitable {@file{sys/ndir.h}} {@code{HAVE_SYS_NDIR_H}}
|
|
@item @file{dirent.h} @tab @code{HAVE_DIRENT_H}
|
|
@item @file{sys/ndir.h} @tab @code{HAVE_SYS_NDIR_H}
|
|
@item @file{sys/dir.h} @tab @code{HAVE_SYS_DIR_H}
|
|
@item @file{ndir.h} @tab @code{HAVE_NDIR_H}
|
|
@end multitable
|
|
|
|
The directory-library declarations in your source code should look
|
|
something like the following:
|
|
|
|
@example
|
|
@group
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_DIRENT_H
|
|
# include <dirent.h>
|
|
# define NAMLEN(dirent) strlen ((dirent)->d_name)
|
|
#else
|
|
# define dirent direct
|
|
# define NAMLEN(dirent) ((dirent)->d_namlen)
|
|
# ifdef HAVE_SYS_NDIR_H
|
|
# include <sys/ndir.h>
|
|
# endif
|
|
# ifdef HAVE_SYS_DIR_H
|
|
# include <sys/dir.h>
|
|
# endif
|
|
# ifdef HAVE_NDIR_H
|
|
# include <ndir.h>
|
|
# endif
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
Using the above declarations, the program would declare variables to be
|
|
of type @code{struct dirent}, not @code{struct direct}, and would access
|
|
the length of a directory entry name by passing a pointer to a
|
|
@code{struct dirent} to the @code{NAMLEN} macro.
|
|
|
|
This macro also checks for the obsolete @file{dir} and @file{x} libraries.
|
|
|
|
This macro is obsolescent, as all current systems with directory
|
|
libraries have @code{<dirent.h>}. New programs need not use this macro.
|
|
|
|
Also see @code{AC_STRUCT_DIRENT_D_INO} and
|
|
@code{AC_STRUCT_DIRENT_D_TYPE} (@pxref{Particular Structures}).
|
|
@end defmac
|
|
|
|
@anchor{AC_HEADER_MAJOR}
|
|
@defmac AC_HEADER_MAJOR
|
|
@acindex{HEADER_MAJOR}
|
|
@cvindex MAJOR_IN_MKDEV
|
|
@cvindex MAJOR_IN_SYSMACROS
|
|
@hdrindex{sys/mkdev.h}
|
|
@hdrindex{sys/sysmacros.h}
|
|
Detect the headers required to use @code{makedev}, @code{major}, and
|
|
@code{minor}. These functions may be defined by @file{sys/mkdev.h},
|
|
@code{sys/sysmacros.h}, or @file{sys/types.h}.
|
|
|
|
@code{AC_HEADER_MAJOR} defines @code{MAJOR_IN_MKDEV} if they are in
|
|
@file{sys/mkdev.h}, or @code{MAJOR_IN_SYSMACROS} if they are in
|
|
@file{sys/sysmacros.h}. If neither macro is defined, they are either in
|
|
@file{sys/types.h} or unavailable.
|
|
|
|
To properly use these functions, your code should contain something
|
|
like:
|
|
|
|
@verbatim
|
|
#include <sys/types.h>
|
|
#ifdef MAJOR_IN_MKDEV
|
|
# include <sys/mkdev.h>
|
|
#elif defined MAJOR_IN_SYSMACROS
|
|
# include <sys/sysmacros.h>
|
|
#endif
|
|
@end verbatim
|
|
|
|
Note: Configure scripts built with Autoconf 2.69 or earlier will not
|
|
detect a problem if @file{sys/types.h} contains definitions of
|
|
@code{major}, @code{minor}, and/or @code{makedev} that trigger compiler
|
|
warnings upon use. This is known to occur with GNU libc 2.25, where
|
|
those definitions are being deprecated to reduce namespace pollution.
|
|
If it is not practical to use Autoconf 2.70 to regenerate the configure
|
|
script of affected software, you can work around the problem by setting
|
|
@samp{ac_cv_header_sys_types_h_makedev=no}, as an argument to
|
|
@command{configure} or as part of a @file{config.site} site default file
|
|
(@pxref{Site Defaults}).
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_RESOLV
|
|
@acindex{HEADER_RESOLV}
|
|
@cvindex HAVE_RESOLV_H
|
|
@hdrindex{resolv.h}
|
|
Checks for header @file{resolv.h}, checking for prerequisites first.
|
|
To properly use @file{resolv.h}, your code should contain something like
|
|
the following:
|
|
|
|
@verbatim
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
# include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
# include <netinet/in.h> /* inet_ functions / structs */
|
|
#endif
|
|
#ifdef HAVE_ARPA_NAMESER_H
|
|
# include <arpa/nameser.h> /* DNS HEADER struct */
|
|
#endif
|
|
#ifdef HAVE_NETDB_H
|
|
# include <netdb.h>
|
|
#endif
|
|
#include <resolv.h>
|
|
@end verbatim
|
|
@end defmac
|
|
|
|
@anchor{AC_HEADER_STAT}
|
|
@defmac AC_HEADER_STAT
|
|
@acindex{HEADER_STAT}
|
|
@cvindex STAT_MACROS_BROKEN
|
|
@hdrindex{sys/stat.h}
|
|
If the macros @code{S_ISDIR}, @code{S_ISREG}, etc.@: defined in
|
|
@file{sys/stat.h} do not work properly (returning false positives),
|
|
define @code{STAT_MACROS_BROKEN}. This is the case on Tektronix UTekV,
|
|
Amdahl UTS and Motorola System V/88.
|
|
|
|
This macro is obsolescent, as no current systems have the bug.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_STDBOOL
|
|
@acindex{HEADER_STDBOOL}
|
|
@cvindex HAVE_STDBOOL_H
|
|
@cvindex HAVE__BOOL
|
|
@hdrindex{stdbool.h}
|
|
@caindex header_stdbool_h
|
|
If @file{stdbool.h} exists and conforms to C99 or later, define
|
|
@code{HAVE_STDBOOL_H} to 1; if the type @code{_Bool} is defined, define
|
|
@code{HAVE__BOOL} to 1.
|
|
|
|
This macro is obsolescent, as all current C compilers have
|
|
@file{stdbool.h}, a header that is itself obsolescent as of C23.
|
|
Nowadays programs that need @code{bool}, @code{true} and @code{false}
|
|
can include @file{stdbool.h} unconditionally, without using
|
|
@code{AC_HEADER_STDBOOL}, and if such a program needs to be portable
|
|
only to C23 or later it need not even include @file{stdbool.h}.
|
|
|
|
This macro caches its result in the @code{ac_cv_header_stdbool_h}
|
|
variable.
|
|
|
|
This macro differs from @code{AC_CHECK_HEADER_STDBOOL} only in that it
|
|
defines @code{HAVE_STDBOOL_H} whereas @code{AC_CHECK_HEADER_STDBOOL}
|
|
does not.
|
|
@end defmac
|
|
|
|
@anchor{AC_HEADER_STDC}
|
|
@defmac AC_HEADER_STDC
|
|
@acindex{HEADER_STDC}
|
|
@cvindex STDC_HEADERS
|
|
@caindex header_stdc
|
|
|
|
This macro is obsolescent. Its sole effect is to make sure that all the
|
|
headers that are included by @code{AC_INCLUDES_DEFAULT} (@pxref{Default
|
|
Includes}), but not part of C89, have been checked for.
|
|
|
|
All hosted environments that are still of interest for portable code
|
|
provide all of the headers specified in C89 (as amended in 1995).
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_SYS_WAIT
|
|
@acindex{HEADER_SYS_WAIT}
|
|
@cvindex HAVE_SYS_WAIT_H
|
|
@hdrindex{sys/wait.h}
|
|
@caindex header_sys_wait_h
|
|
If @file{sys/wait.h} exists and is compatible with POSIX, define
|
|
@code{HAVE_SYS_WAIT_H}. Incompatibility can occur if @file{sys/wait.h}
|
|
does not exist, or if it uses the old BSD @code{union wait} instead
|
|
of @code{int} to store a status value. If @file{sys/wait.h} is not
|
|
POSIX compatible, then instead of including it, define the
|
|
POSIX macros with their usual interpretations. Here is an
|
|
example:
|
|
|
|
@example
|
|
@group
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_SYS_WAIT_H
|
|
# include <sys/wait.h>
|
|
#endif
|
|
#ifndef WEXITSTATUS
|
|
# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
|
|
#endif
|
|
#ifndef WIFEXITED
|
|
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
This macro caches its result in the @code{ac_cv_header_sys_wait_h}
|
|
variable.
|
|
|
|
This macro is obsolescent, as current systems are compatible with POSIX.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@cvindex _POSIX_VERSION
|
|
@hdrindex{unistd.h}
|
|
@code{_POSIX_VERSION} is defined when @file{unistd.h} is included on
|
|
POSIX systems. If there is no @file{unistd.h}, it is definitely
|
|
not a POSIX system. However, some non-POSIX systems do
|
|
have @file{unistd.h}.
|
|
|
|
The way to check whether the system supports POSIX is:
|
|
|
|
@example
|
|
@group
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <sys/types.h>
|
|
# include <unistd.h>
|
|
#endif
|
|
|
|
#ifdef _POSIX_VERSION
|
|
/* Code for POSIX systems. */
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
@defmac AC_HEADER_TIOCGWINSZ
|
|
@acindex{HEADER_TIOCGWINSZ}
|
|
@cvindex GWINSZ_IN_SYS_IOCTL
|
|
@hdrindex{sys/ioctl.h}
|
|
@hdrindex{termios.h}
|
|
@c FIXME: I need clarifications from Jim.
|
|
If the use of @code{TIOCGWINSZ} requires @file{<sys/ioctl.h>}, then
|
|
define @code{GWINSZ_IN_SYS_IOCTL}. Otherwise @code{TIOCGWINSZ} can be
|
|
found in @file{<termios.h>}.
|
|
|
|
Use:
|
|
|
|
@example
|
|
@group
|
|
#ifdef HAVE_TERMIOS_H
|
|
# include <termios.h>
|
|
#endif
|
|
|
|
#ifdef GWINSZ_IN_SYS_IOCTL
|
|
# include <sys/ioctl.h>
|
|
#endif
|
|
@end group
|
|
@end example
|
|
@end defmac
|
|
|
|
@node Generic Headers
|
|
@subsection Generic Header Checks
|
|
|
|
These macros are used to find system header files not covered by the
|
|
``particular'' test macros. If you need to check the contents of a header
|
|
as well as find out whether it is present, you have to write your own
|
|
test for it (@pxref{Writing Tests}).
|
|
|
|
@anchor{AC_CHECK_HEADER}
|
|
@defmac AC_CHECK_HEADER (@var{header-file}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @ovar{includes})
|
|
@acindex{CHECK_HEADER}
|
|
@caindex header_@var{header-file}
|
|
If the system header file @var{header-file} is compilable, execute shell
|
|
commands @var{action-if-found}, otherwise execute
|
|
@var{action-if-not-found}. If you just want to define a symbol if the
|
|
header file is available, consider using @code{AC_CHECK_HEADERS}
|
|
instead.
|
|
|
|
@var{includes} should be the appropriate @dfn{prerequisite} code, i.e.@:
|
|
whatever might be required to appear above
|
|
@samp{#include <@var{header-file}>} for it to compile without error.
|
|
This can be anything, but will normally be additional @samp{#include}
|
|
directives. If @var{includes} is omitted or empty, @file{configure} will
|
|
use the contents of the macro @code{AC_INCLUDES_DEFAULT}.
|
|
@xref{Default Includes}.
|
|
|
|
This macro used to check only for the @emph{presence} of a header, not
|
|
whether its contents were acceptable to the compiler. Some older
|
|
@command{configure} scripts rely on this behavior, so it is still
|
|
available by specifying @samp{-} as @var{includes}. This mechanism is
|
|
deprecated as of Autoconf 2.70; situations where a preprocessor-only
|
|
check is required should use @code{AC_PREPROC_IFELSE}.
|
|
@xref{Running the Preprocessor}.
|
|
|
|
This macro caches its result in the @code{ac_cv_header_@var{header-file}}
|
|
variable, with characters not suitable for a variable name mapped to
|
|
underscores.
|
|
@end defmac
|
|
|
|
@anchor{AC_CHECK_HEADERS}
|
|
@defmac AC_CHECK_HEADERS (@var{header-file}@dots{}, @
|
|
@ovar{action-if-found}, @ovar{action-if-not-found}, @
|
|
@ovar{includes})
|
|
@acindex{CHECK_HEADERS}
|
|
@cvindex HAVE_@var{header}
|
|
@caindex header_@var{header-file}
|
|
For each given system header file @var{header-file} in the
|
|
blank-separated argument list that exists, define
|
|
@code{HAVE_@var{header-file}} (in all capitals). If @var{action-if-found}
|
|
is given, it is additional shell code to execute when one of the header
|
|
files is found. You can give it a value of @samp{break} to break out of
|
|
the loop on the first match. If @var{action-if-not-found} is given, it
|
|
is executed when one of the header files is not found.
|
|
|
|
@var{includes} is interpreted as in @code{AC_CHECK_HEADER}, in order to
|
|
choose the set of preprocessor directives supplied before the header
|
|
under test.
|
|
|
|
This macro caches its result in the @code{ac_cv_header_@var{header-file}}
|
|
variable, with characters not suitable for a variable name mapped to
|
|
underscores.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_HEADERS_ONCE (@var{header-file}@dots{})
|
|
@acindex{CHECK_HEADERS_ONCE}
|
|
@cvindex HAVE_@var{header}
|
|
For each given system header file @var{header-file} in the
|
|
blank-separated argument list that exists, define
|
|
@code{HAVE_@var{header-file}} (in all capitals).
|
|
|
|
If you do not need the full power of @code{AC_CHECK_HEADERS}, this
|
|
variant generates smaller, faster @command{configure} files. All
|
|
headers passed to @code{AC_CHECK_HEADERS_ONCE} are checked for in one
|
|
pass, early during the @command{configure} run. The checks cannot be
|
|
conditionalized, you cannot specify an @var{action-if-found} or
|
|
@var{action-if-not-found}, and @code{AC_INCLUDES_DEFAULT} is always used
|
|
for the prerequisites.
|
|
@end defmac
|
|
|
|
In previous versions of Autoconf, these macros merely checked whether
|
|
the header was accepted by the preprocessor. This was changed because
|
|
the old test was inappropriate for typical uses. Headers are typically
|
|
used to compile, not merely to preprocess, and the old behavior
|
|
sometimes accepted headers that clashed at compile-time
|
|
(@pxref{Present But Cannot Be Compiled}). If for some reason it is
|
|
inappropriate to check whether a header is compilable, you should use
|
|
@code{AC_PREPROC_IFELSE} (@pxref{Running the Preprocessor}) instead of
|
|
these macros.
|
|
|
|
Requiring each header to compile improves the robustness of the test,
|
|
but it also requires you to make sure that the @var{includes} are
|
|
correct. Most system headers nowadays make sure to @code{#include}
|
|
whatever they require, or else have their dependencies satisfied by
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), but
|
|
@pxref{Header Portability}, for known exceptions. In general, if you
|
|
are looking for @file{bar.h}, which requires that @file{foo.h} be
|
|
included first if it exists, you should do something like this:
|
|
|
|
@example
|
|
AC_CHECK_HEADERS([foo.h])
|
|
AC_CHECK_HEADERS([bar.h], [], [],
|
|
[#ifdef HAVE_FOO_H
|
|
# include <foo.h>
|
|
#endif
|
|
])
|
|
@end example
|
|
|
|
@node Declarations
|
|
@section Declarations
|
|
@cindex Declaration, checking
|
|
|
|
The following macros check for the declaration of variables and
|
|
functions. If there is no macro specifically defined to check for a
|
|
symbol you need, then you can use the general macros (@pxref{Generic
|
|
Declarations}) or, for more complex tests, you may use
|
|
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).
|
|
|
|
@menu
|
|
* Particular Declarations:: Macros to check for certain declarations
|
|
* Generic Declarations:: How to find other declarations
|
|
@end menu
|
|
|
|
@node Particular Declarations
|
|
@subsection Particular Declaration Checks
|
|
|
|
There are no specific macros for declarations.
|
|
|
|
@node Generic Declarations
|
|
@subsection Generic Declaration Checks
|
|
|
|
These macros are used to find declarations not covered by the ``particular''
|
|
test macros.
|
|
|
|
@defmac AC_CHECK_DECL (@var{symbol}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_DECL}
|
|
@caindex have_decl_@var{symbol}
|
|
If @var{symbol} (a function, variable, or constant) is not declared in
|
|
@var{includes} and a declaration is needed, run the shell commands
|
|
@var{action-if-not-found}, otherwise @var{action-if-found}.
|
|
@var{includes} is a series of include directives, defaulting to
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
|
|
prior to the declaration under test.
|
|
|
|
This macro actually tests whether @var{symbol} is defined as a macro or
|
|
can be used as an r-value, not whether it is really declared, because it
|
|
is much safer to avoid introducing extra declarations when they are not
|
|
needed. In order to facilitate use of C++ and overloaded function
|
|
declarations, it is possible to specify function argument types in
|
|
parentheses for types which can be zero-initialized:
|
|
|
|
@example
|
|
AC_CHECK_DECL([basename(char *)])
|
|
@end example
|
|
|
|
This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}}
|
|
variable, with characters not suitable for a variable name mapped to
|
|
underscores.
|
|
@end defmac
|
|
|
|
@anchor{AC_CHECK_DECLS}
|
|
@defmac AC_CHECK_DECLS (@var{symbols}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_DECLS}
|
|
@cvindex HAVE_DECL_@var{symbol}
|
|
@caindex have_decl_@var{symbol}
|
|
For each of the @var{symbols} (@emph{comma}-separated list with optional
|
|
function argument types for C++ overloads), define
|
|
@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
|
|
@var{symbol} is declared, otherwise to @samp{0}. If
|
|
@var{action-if-not-found} is given, it is additional shell code to
|
|
execute when one of the function declarations is needed, otherwise
|
|
@var{action-if-found} is executed.
|
|
|
|
@var{includes} is a series of include directives, defaulting to
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
|
|
prior to the declarations under test.
|
|
|
|
This macro uses an M4 list as first argument:
|
|
@example
|
|
AC_CHECK_DECLS([strdup])
|
|
AC_CHECK_DECLS([strlen])
|
|
AC_CHECK_DECLS([malloc, realloc, calloc, free])
|
|
AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
|
|
AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])
|
|
@end example
|
|
|
|
Unlike the other @samp{AC_CHECK_*S} macros, when a @var{symbol} is not
|
|
declared, @code{HAVE_DECL_@var{symbol}} is defined to @samp{0} instead
|
|
of leaving @code{HAVE_DECL_@var{symbol}} undeclared. When you are
|
|
@emph{sure} that the check was performed, use
|
|
@code{HAVE_DECL_@var{symbol}} in @code{#if}:
|
|
|
|
@example
|
|
#if !HAVE_DECL_SYMBOL
|
|
extern char *symbol;
|
|
#endif
|
|
@end example
|
|
|
|
@noindent
|
|
If the test may have not been performed, however, because it is safer
|
|
@emph{not} to declare a symbol than to use a declaration that conflicts
|
|
with the system's one, you should use:
|
|
|
|
@example
|
|
#if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
|
|
void *malloc (size_t *s);
|
|
#endif
|
|
@end example
|
|
|
|
@noindent
|
|
You fall into the second category only in extreme situations: either
|
|
your files may be used without being configured, or they are used during
|
|
the configuration. In most cases the traditional approach is enough.
|
|
|
|
This macro caches its results in @code{ac_cv_have_decl_@var{symbol}}
|
|
variables, with characters not suitable for a variable name mapped to
|
|
underscores.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_DECLS_ONCE (@var{symbols})
|
|
@acindex{CHECK_DECLS_ONCE}
|
|
@cvindex HAVE_DECL_@var{symbol}
|
|
For each of the @var{symbols} (@emph{comma}-separated list), define
|
|
@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
|
|
@var{symbol} is declared in the default include files, otherwise to
|
|
@samp{0}. This is a once-only variant of @code{AC_CHECK_DECLS}. It
|
|
generates the checking code at most once, so that @command{configure} is
|
|
smaller and faster; but the checks cannot be conditionalized and are
|
|
always done once, early during the @command{configure} run.
|
|
@end defmac
|
|
|
|
|
|
@node Structures
|
|
@section Structures
|
|
@cindex Structure, checking
|
|
|
|
The following macros check for the presence of certain members in C
|
|
structures. If there is no macro specifically defined to check for a
|
|
member you need, then you can use the general structure-member macros
|
|
(@pxref{Generic Structures}) or, for more complex tests, you may use
|
|
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).
|
|
|
|
@menu
|
|
* Particular Structures:: Macros to check for certain structure members
|
|
* Generic Structures:: How to find other structure members
|
|
@end menu
|
|
|
|
@node Particular Structures
|
|
@subsection Particular Structure Checks
|
|
|
|
The following macros check for certain structures or structure members.
|
|
|
|
@defmac AC_STRUCT_DIRENT_D_INO
|
|
@acindex{STRUCT_DIRENT_D_INO}
|
|
@cvindex HAVE_STRUCT_DIRENT_D_INO
|
|
@c @caindex header_dirent_dirent_h
|
|
@c @caindex member_struct_dirent_d_ino
|
|
Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
|
|
Headers}). Then, if @code{struct dirent} contains a @code{d_ino}
|
|
member, define @code{HAVE_STRUCT_DIRENT_D_INO}.
|
|
|
|
@code{HAVE_STRUCT_DIRENT_D_INO} indicates only the presence of
|
|
@code{d_ino}, not whether its contents are always reliable.
|
|
Traditionally, a zero @code{d_ino} indicated a deleted directory entry,
|
|
though current systems hide this detail from the user and never return
|
|
zero @code{d_ino} values.
|
|
Many current systems report an incorrect @code{d_ino} for a directory
|
|
entry that is a mount point.
|
|
@end defmac
|
|
|
|
@defmac AC_STRUCT_DIRENT_D_TYPE
|
|
@acindex{STRUCT_DIRENT_D_TYPE}
|
|
@cvindex HAVE_STRUCT_DIRENT_D_TYPE
|
|
@c @caindex header_dirent_dirent_h
|
|
@c @caindex member_struct_dirent_d_type
|
|
Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
|
|
Headers}). Then, if @code{struct dirent} contains a @code{d_type}
|
|
member, define @code{HAVE_STRUCT_DIRENT_D_TYPE}.
|
|
@end defmac
|
|
|
|
@anchor{AC_STRUCT_ST_BLOCKS}
|
|
@defmac AC_STRUCT_ST_BLOCKS
|
|
@acindex{STRUCT_ST_BLOCKS}
|
|
@cvindex HAVE_STRUCT_STAT_ST_BLOCKS
|
|
@cvindex HAVE_ST_BLOCKS
|
|
@ovindex LIBOBJS
|
|
@caindex member_struct_stat_st_blocks
|
|
If @code{struct stat} contains an @code{st_blocks} member, define
|
|
@code{HAVE_STRUCT_STAT_ST_BLOCKS}. Otherwise, require an
|
|
@code{AC_LIBOBJ} replacement of @samp{fileblocks}. The former name,
|
|
@code{HAVE_ST_BLOCKS} is to be avoided, as its support will cease in the
|
|
future.
|
|
|
|
This macro caches its result in the @code{ac_cv_member_struct_stat_st_blocks}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_STRUCT_TM
|
|
@acindex{STRUCT_TM}
|
|
@cvindex TM_IN_SYS_TIME
|
|
@hdrindex{time.h}
|
|
@hdrindex{sys/time.h}
|
|
If @file{time.h} does not define @code{struct tm}, define
|
|
@code{TM_IN_SYS_TIME}, which means that including @file{sys/time.h}
|
|
had better define @code{struct tm}.
|
|
|
|
This macro is obsolescent, as @file{time.h} defines @code{struct tm} in
|
|
current systems. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@anchor{AC_STRUCT_TIMEZONE}
|
|
@defmac AC_STRUCT_TIMEZONE
|
|
@acindex{STRUCT_TIMEZONE}
|
|
@cvindex HAVE_DECL_TZNAME
|
|
@cvindex HAVE_STRUCT_TM_TM_ZONE
|
|
@cvindex HAVE_TM_ZONE
|
|
@cvindex HAVE_TZNAME
|
|
@c @caindex member_struct_tm_tm_zone
|
|
@c @caindex struct_tm
|
|
Figure out how to get the current timezone. If @code{struct tm} has a
|
|
@code{tm_zone} member, define @code{HAVE_STRUCT_TM_TM_ZONE} (and the
|
|
obsoleted @code{HAVE_TM_ZONE}). Otherwise, if the external array
|
|
@code{tzname} is found, define @code{HAVE_TZNAME}; if it is declared,
|
|
define @code{HAVE_DECL_TZNAME}.
|
|
@end defmac
|
|
|
|
@node Generic Structures
|
|
@subsection Generic Structure Checks
|
|
|
|
These macros are used to find structure members not covered by the
|
|
``particular'' test macros.
|
|
|
|
@defmac AC_CHECK_MEMBER (@var{aggregate}.@var{member}, @
|
|
@ovar{action-if-found}, @ovar{action-if-not-found}, @
|
|
@dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_MEMBER}
|
|
@caindex member_@var{aggregate}_@var{member}
|
|
Check whether @var{member} is a member of the aggregate @var{aggregate}.
|
|
If no @var{includes} are specified, the default includes are used
|
|
(@pxref{Default Includes}).
|
|
|
|
@example
|
|
AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
|
|
[AC_MSG_ERROR([we need 'passwd.pw_gecos'])],
|
|
[[#include <pwd.h>]])
|
|
@end example
|
|
|
|
You can use this macro for submembers:
|
|
|
|
@example
|
|
AC_CHECK_MEMBER(struct top.middle.bot)
|
|
@end example
|
|
|
|
This macro caches its result in the
|
|
@code{ac_cv_member_@var{aggregate}_@var{member}} variable, with
|
|
characters not suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
@anchor{AC_CHECK_MEMBERS}
|
|
@defmac AC_CHECK_MEMBERS (@var{members}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_MEMBERS}
|
|
@cvindex HAVE_@var{aggregate}_@var{member}
|
|
Check for the existence of each @samp{@var{aggregate}.@var{member}} of
|
|
@var{members} using the previous macro. When @var{member} belongs to
|
|
@var{aggregate}, define @code{HAVE_@var{aggregate}_@var{member}} (in all
|
|
capitals, with spaces and dots replaced by underscores). If
|
|
@var{action-if-found} is given, it is executed for each of the found
|
|
members. If @var{action-if-not-found} is given, it is executed for each
|
|
of the members that could not be found.
|
|
|
|
@var{includes} is a series of include directives, defaulting to
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
|
|
prior to the members under test.
|
|
|
|
This macro uses M4 lists:
|
|
@example
|
|
AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
|
|
@end example
|
|
@end defmac
|
|
|
|
|
|
@node Types
|
|
@section Types
|
|
@cindex Types
|
|
@cindex C types
|
|
|
|
The following macros check for C types, either builtin or typedefs. If
|
|
there is no macro specifically defined to check for a type you need, and
|
|
you don't need to check for any special properties of it, then you can
|
|
use a general type-check macro.
|
|
|
|
@menu
|
|
* Particular Types:: Special handling to find certain types
|
|
* Generic Types:: How to find other types
|
|
@end menu
|
|
|
|
@node Particular Types
|
|
@subsection Particular Type Checks
|
|
|
|
@hdrindex{sys/types.h}
|
|
@hdrindex{stdlib.h}
|
|
@hdrindex{stdint.h}
|
|
@hdrindex{inttypes.h}
|
|
These macros check for particular C types in @file{sys/types.h},
|
|
@file{stdlib.h}, @file{stdint.h}, @file{inttypes.h} and others, if they
|
|
exist.
|
|
|
|
The Gnulib @code{stdint} module is an alternate way to define many of
|
|
these symbols; it is useful if you prefer your code to assume a
|
|
C99-or-better environment. @xref{Gnulib}.
|
|
|
|
@anchor{AC_TYPE_GETGROUPS}
|
|
@defmac AC_TYPE_GETGROUPS
|
|
@acindex{TYPE_GETGROUPS}
|
|
@cvindex GETGROUPS_T
|
|
@caindex type_getgroups
|
|
Define @code{GETGROUPS_T} to be whichever of @code{gid_t} or @code{int}
|
|
is the base type of the array argument to @code{getgroups}.
|
|
|
|
This macro caches the base type in the @code{ac_cv_type_getgroups}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INT8_T
|
|
@acindex{TYPE_INT8_T}
|
|
@cvindex HAVE_INT8_T
|
|
@cvindex int8_t
|
|
@caindex c_int8_t
|
|
If @file{stdint.h} or @file{inttypes.h} does not define the type
|
|
@code{int8_t}, define @code{int8_t} to a signed
|
|
integer type that is exactly 8 bits wide and that uses two's complement
|
|
representation, if such a type exists.
|
|
If you are worried about porting to hosts that lack such a type, you can
|
|
use the results of this macro as follows:
|
|
|
|
@example
|
|
#if HAVE_STDINT_H
|
|
# include <stdint.h>
|
|
#endif
|
|
#if defined INT8_MAX || defined int8_t
|
|
@emph{code using int8_t}
|
|
#else
|
|
@emph{complicated alternative using >8-bit 'signed char'}
|
|
#endif
|
|
@end example
|
|
|
|
This macro caches the type in the @code{ac_cv_c_int8_t} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INT16_T
|
|
@acindex{TYPE_INT16_T}
|
|
@cvindex HAVE_INT16_T
|
|
@cvindex int16_t
|
|
@caindex c_int16_t
|
|
This is like @code{AC_TYPE_INT8_T}, except for 16-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INT32_T
|
|
@acindex{TYPE_INT32_T}
|
|
@cvindex HAVE_INT32_T
|
|
@cvindex int32_t
|
|
@caindex c_int32_t
|
|
This is like @code{AC_TYPE_INT8_T}, except for 32-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INT64_T
|
|
@acindex{TYPE_INT64_T}
|
|
@cvindex HAVE_INT64_T
|
|
@cvindex int64_t
|
|
@caindex c_int64_t
|
|
This is like @code{AC_TYPE_INT8_T}, except for 64-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INTMAX_T
|
|
@acindex{TYPE_INTMAX_T}
|
|
@cvindex HAVE_INTMAX_T
|
|
@cvindex intmax_t
|
|
@c @caindex type_intmax_t
|
|
If @file{stdint.h} or @file{inttypes.h} defines the type @code{intmax_t},
|
|
define @code{HAVE_INTMAX_T}. Otherwise, define @code{intmax_t} to the
|
|
widest signed integer type.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_INTPTR_T
|
|
@acindex{TYPE_INTPTR_T}
|
|
@cvindex HAVE_INTPTR_T
|
|
@cvindex intptr_t
|
|
@c @caindex type_intptr_t
|
|
If @file{stdint.h} or @file{inttypes.h} defines the type @code{intptr_t},
|
|
define @code{HAVE_INTPTR_T}. Otherwise, define @code{intptr_t} to a
|
|
signed integer type wide enough to hold a pointer, if such a type
|
|
exists.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_LONG_DOUBLE
|
|
@acindex{TYPE_LONG_DOUBLE}
|
|
@cvindex HAVE_LONG_DOUBLE
|
|
@caindex type_long_double
|
|
If the C compiler supports a working @code{long double} type, define
|
|
@code{HAVE_LONG_DOUBLE}. The @code{long double} type might have the
|
|
same range and precision as @code{double}.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_long_double}
|
|
variable.
|
|
|
|
This macro is obsolescent, as current C compilers support @code{long
|
|
double}. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_LONG_DOUBLE_WIDER
|
|
@acindex{TYPE_LONG_DOUBLE_WIDER}
|
|
@cvindex HAVE_LONG_DOUBLE_WIDER
|
|
@caindex type_long_double_wider
|
|
If the C compiler supports a working @code{long double} type with more
|
|
range or precision than the @code{double} type, define
|
|
@code{HAVE_LONG_DOUBLE_WIDER}.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_long_double_wider}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_LONG_LONG_INT
|
|
@acindex{TYPE_LONG_LONG_INT}
|
|
@cvindex HAVE_LONG_LONG_INT
|
|
@caindex type_long_long_int
|
|
If the C compiler supports a working @code{long long int} type, define
|
|
@code{HAVE_LONG_LONG_INT}. However, this test does not test
|
|
@code{long long int} values in preprocessor @code{#if} expressions,
|
|
because too many compilers mishandle such expressions.
|
|
@xref{Preprocessor Arithmetic}.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_long_long_int}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_MBSTATE_T
|
|
@acindex{TYPE_MBSTATE_T}
|
|
@cvindex mbstate_t
|
|
@hdrindex{wchar.h}
|
|
@caindex type_mbstate_t
|
|
Define @code{HAVE_MBSTATE_T} if @code{<wchar.h>} declares the
|
|
@code{mbstate_t} type. Also, define @code{mbstate_t} to be a type if
|
|
@code{<wchar.h>} does not declare it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_mbstate_t}
|
|
variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_MODE_T}
|
|
@defmac AC_TYPE_MODE_T
|
|
@acindex{TYPE_MODE_T}
|
|
@cvindex mode_t
|
|
@caindex type_mode_t
|
|
Define @code{mode_t} to a suitable type, if standard headers do not
|
|
define it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_mode_t} variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_OFF_T}
|
|
@defmac AC_TYPE_OFF_T
|
|
@acindex{TYPE_OFF_T}
|
|
@cvindex off_t
|
|
@caindex type_off_t
|
|
Define @code{off_t} to a suitable type, if standard headers do not
|
|
define it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_off_t} variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_PID_T}
|
|
@defmac AC_TYPE_PID_T
|
|
@acindex{TYPE_PID_T}
|
|
@cvindex pid_t
|
|
@caindex type_pid_t
|
|
Define @code{pid_t} to a suitable type, if standard headers do not
|
|
define it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_pid_t} variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_SIZE_T}
|
|
@defmac AC_TYPE_SIZE_T
|
|
@acindex{TYPE_SIZE_T}
|
|
@cvindex size_t
|
|
@caindex type_size_t
|
|
Define @code{size_t} to a suitable type, if standard headers do not
|
|
define it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_size_t} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_SSIZE_T
|
|
@acindex{TYPE_SSIZE_T}
|
|
@cvindex ssize_t
|
|
@caindex type_ssize_t
|
|
Define @code{ssize_t} to a suitable type, if standard headers do not
|
|
define it.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_ssize_t} variable.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_UID_T}
|
|
@defmac AC_TYPE_UID_T
|
|
@acindex{TYPE_UID_T}
|
|
@cvindex uid_t
|
|
@cvindex gid_t
|
|
@caindex type_uid_t
|
|
Define @code{uid_t} and @code{gid_t} to suitable types, if standard
|
|
headers do not define them.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_uid_t} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINT8_T
|
|
@acindex{TYPE_UINT8_T}
|
|
@cvindex HAVE_UINT8_T
|
|
@cvindex uint8_t
|
|
@caindex c_uint8_t
|
|
If @file{stdint.h} or @file{inttypes.h} does not define the type
|
|
@code{uint8_t}, define @code{uint8_t} to an
|
|
unsigned integer type that is exactly 8 bits wide, if such a type
|
|
exists.
|
|
This is like @code{AC_TYPE_INT8_T}, except for unsigned integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINT16_T
|
|
@acindex{TYPE_UINT16_T}
|
|
@cvindex HAVE_UINT16_T
|
|
@cvindex uint16_t
|
|
@caindex c_uint16_t
|
|
This is like @code{AC_TYPE_UINT8_T}, except for 16-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINT32_T
|
|
@acindex{TYPE_UINT32_T}
|
|
@cvindex HAVE_UINT32_T
|
|
@cvindex uint32_t
|
|
@caindex c_uint32_t
|
|
This is like @code{AC_TYPE_UINT8_T}, except for 32-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINT64_T
|
|
@acindex{TYPE_UINT64_T}
|
|
@cvindex HAVE_UINT64_T
|
|
@cvindex uint64_t
|
|
@caindex c_uint64_t
|
|
This is like @code{AC_TYPE_UINT8_T}, except for 64-bit integers.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINTMAX_T
|
|
@acindex{TYPE_UINTMAX_T}
|
|
@cvindex HAVE_UINTMAX_T
|
|
@cvindex uintmax_t
|
|
@c @caindex type_uintmax_t
|
|
If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintmax_t},
|
|
define @code{HAVE_UINTMAX_T}. Otherwise, define @code{uintmax_t} to the
|
|
widest unsigned integer type.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UINTPTR_T
|
|
@acindex{TYPE_UINTPTR_T}
|
|
@cvindex HAVE_UINTPTR_T
|
|
@cvindex uintptr_t
|
|
@c @caindex type_uintptr_t
|
|
If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintptr_t},
|
|
define @code{HAVE_UINTPTR_T}. Otherwise, define @code{uintptr_t} to an
|
|
unsigned integer type wide enough to hold a pointer, if such a type
|
|
exists.
|
|
@end defmac
|
|
|
|
@defmac AC_TYPE_UNSIGNED_LONG_LONG_INT
|
|
@acindex{TYPE_UNSIGNED_LONG_LONG_INT}
|
|
@cvindex HAVE_UNSIGNED_LONG_LONG_INT
|
|
@caindex type_unsigned_long_long_int
|
|
If the C compiler supports a working @code{unsigned long long int} type,
|
|
define @code{HAVE_UNSIGNED_LONG_LONG_INT}. However, this test does not test
|
|
@code{unsigned long long int} values in preprocessor @code{#if} expressions,
|
|
because too many compilers mishandle such expressions.
|
|
@xref{Preprocessor Arithmetic}.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_unsigned_long_long_int}
|
|
variable.
|
|
@end defmac
|
|
|
|
@node Generic Types
|
|
@subsection Generic Type Checks
|
|
|
|
These macros are used to check for types not covered by the ``particular''
|
|
test macros.
|
|
|
|
@defmac AC_CHECK_TYPE (@var{type}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_TYPE}
|
|
@caindex type_@var{type}
|
|
Check whether @var{type} is defined. It may be a compiler builtin type
|
|
or defined by the @var{includes}. @var{includes} is a series of include
|
|
directives, defaulting to @code{AC_INCLUDES_DEFAULT} (@pxref{Default
|
|
Includes}), which are used prior to the type under test.
|
|
|
|
In C, @var{type} must be a type-name, so that the expression @samp{sizeof
|
|
(@var{type})} is valid (but @samp{sizeof ((@var{type}))} is not). The
|
|
same test is applied when compiling for C++, which means that in C++
|
|
@var{type} should be a type-id and should not be an anonymous
|
|
@samp{struct} or @samp{union}.
|
|
|
|
This macro caches its result in the @code{ac_cv_type_@var{type}}
|
|
variable, with @samp{*} mapped to @samp{p} and other characters not
|
|
suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
|
|
@defmac AC_CHECK_TYPES (@var{types}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_TYPES}
|
|
@cvindex HAVE_@var{type}
|
|
For each @var{type} of the @var{types} that is defined, define
|
|
@code{HAVE_@var{type}} (in all capitals). Each @var{type} must follow
|
|
the rules of @code{AC_CHECK_TYPE}. If no @var{includes} are
|
|
specified, the default includes are used (@pxref{Default Includes}). If
|
|
@var{action-if-found} is given, it is additional shell code to execute
|
|
when one of the types is found. If @var{action-if-not-found} is given,
|
|
it is executed when one of the types is not found.
|
|
|
|
This macro uses M4 lists:
|
|
@example
|
|
AC_CHECK_TYPES([ptrdiff_t])
|
|
AC_CHECK_TYPES([unsigned long long int, uintmax_t])
|
|
AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])
|
|
@end example
|
|
|
|
@end defmac
|
|
|
|
Autoconf, up to 2.13, used to provide to another version of
|
|
@code{AC_CHECK_TYPE}, broken by design. In order to keep backward
|
|
compatibility, a simple heuristic, quite safe but not totally, is
|
|
implemented. In case of doubt, read the documentation of the former
|
|
@code{AC_CHECK_TYPE}, see @ref{Obsolete Macros}.
|
|
|
|
|
|
@node Compilers and Preprocessors
|
|
@section Compilers and Preprocessors
|
|
@cindex Compilers
|
|
@cindex Preprocessors
|
|
|
|
@ovindex EXEEXT
|
|
All the tests for compilers (@code{AC_PROG_CC}, @code{AC_PROG_CXX},
|
|
@code{AC_PROG_F77}) define the output variable @code{EXEEXT} based on
|
|
the output of the compiler, typically to the empty string if
|
|
POSIX and @samp{.exe} if a DOS variant.
|
|
|
|
@ovindex OBJEXT
|
|
They also define the output variable @code{OBJEXT} based on the
|
|
output of the compiler, after @file{.c} files have been excluded, typically
|
|
to @samp{o} if POSIX, @samp{obj} if a DOS variant.
|
|
|
|
If the compiler being used does not produce executables, the tests fail. If
|
|
the executables can't be run, and cross-compilation is not enabled, they
|
|
fail too. @xref{Manual Configuration}, for more on support for cross
|
|
compiling.
|
|
|
|
@menu
|
|
* Specific Compiler Characteristics:: Some portability issues
|
|
* Generic Compiler Characteristics:: Language independent tests and features
|
|
* C Compiler:: Checking its characteristics
|
|
* C++ Compiler:: Likewise
|
|
* Objective C Compiler:: Likewise
|
|
* Objective C++ Compiler:: Likewise
|
|
* Erlang Compiler and Interpreter:: Likewise
|
|
* Fortran Compiler:: Likewise
|
|
* Go Compiler:: Likewise
|
|
@end menu
|
|
|
|
@node Specific Compiler Characteristics
|
|
@subsection Specific Compiler Characteristics
|
|
|
|
Some compilers exhibit different behaviors.
|
|
|
|
@table @asis
|
|
@item Static/Dynamic Expressions
|
|
Autoconf relies on a trick to extract one bit of information from the C
|
|
compiler: using negative array sizes. For instance the following
|
|
excerpt of a C source demonstrates how to test whether @samp{int} objects are 4
|
|
bytes wide:
|
|
|
|
@example
|
|
static int test_array[sizeof (int) == 4 ? 1 : -1];
|
|
@end example
|
|
|
|
@noindent
|
|
To our knowledge, there is a single compiler that does not support this
|
|
trick: the HP C compilers (the real ones, not only the
|
|
``bundled'') on HP-UX 11.00.
|
|
They incorrectly reject the above program with the diagnostic
|
|
``Variable-length arrays cannot have static storage.''
|
|
This bug comes from HP compilers' mishandling of @code{sizeof (int)},
|
|
not from the @code{? 1 : -1}, and
|
|
Autoconf works around this problem by casting @code{sizeof (int)} to
|
|
@code{long int} before comparing it.
|
|
@end table
|
|
|
|
@node Generic Compiler Characteristics
|
|
@subsection Generic Compiler Characteristics
|
|
|
|
@anchor{AC_CHECK_SIZEOF}
|
|
@defmac AC_CHECK_SIZEOF (@var{type-or-expr}, @ovar{unused}, @
|
|
@dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_SIZEOF}
|
|
@cvindex SIZEOF_@var{type-or-expr}
|
|
@caindex sizeof_@var{type-or-expr}
|
|
Define @code{SIZEOF_@var{type-or-expr}} (@pxref{Standard Symbols}) to be
|
|
the size in bytes of @var{type-or-expr}, which may be either a type or
|
|
an expression returning a value that has a size. If the expression
|
|
@samp{sizeof (@var{type-or-expr})} is invalid, the result is 0.
|
|
@var{includes} is a series of include directives, defaulting to
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
|
|
prior to the expression under test.
|
|
|
|
This macro now works even when cross-compiling. The @var{unused}
|
|
argument was used when cross-compiling.
|
|
|
|
For example, the call
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/semantics.at:AC_CHECK_SIZEOF struct.
|
|
AC_CHECK_SIZEOF([int *])
|
|
@end example
|
|
|
|
@noindent
|
|
defines @code{SIZEOF_INT_P} to be 8 on x86-64 systems.
|
|
|
|
This macro caches its result in the @code{ac_cv_sizeof_@var{type-or-expr}}
|
|
variable, with @samp{*} mapped to @samp{p} and other characters not
|
|
suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_ALIGNOF (@var{type}, @dvar{includes, AC_INCLUDES_DEFAULT})
|
|
@acindex{CHECK_ALIGNOF}
|
|
@cvindex ALIGNOF_@var{type}
|
|
@caindex alignof_@var{type-or-expr}
|
|
Define @code{ALIGNOF_@var{type}} (@pxref{Standard Symbols}) to be the
|
|
alignment in bytes of @var{type}. @samp{@var{type} y;} must be valid as
|
|
a structure member declaration. If @samp{type} is unknown, the result
|
|
is 0. If no @var{includes} are specified, the default includes are used
|
|
(@pxref{Default Includes}).
|
|
|
|
This macro caches its result in the @code{ac_cv_alignof_@var{type-or-expr}}
|
|
variable, with @samp{*} mapped to @samp{p} and other characters not
|
|
suitable for a variable name mapped to underscores.
|
|
@end defmac
|
|
|
|
@defmac AC_COMPUTE_INT (@var{var}, @var{expression}, @
|
|
@dvar{includes, AC_INCLUDES_DEFAULT}, @ovar{action-if-fails})
|
|
@acindex{COMPUTE_INT}
|
|
Store into the shell variable @var{var} the value of the integer
|
|
@var{expression}. The
|
|
value should fit in an initializer in a C variable of type @code{signed
|
|
long}. To support cross compilation, it should be possible to evaluate
|
|
the expression at compile-time. If no @var{includes} are specified, the
|
|
default includes are used (@pxref{Default Includes}).
|
|
|
|
Execute @var{action-if-fails} if the value cannot be determined correctly.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_WERROR
|
|
@acindex{LANG_WERROR}
|
|
Normally Autoconf ignores warnings generated by the compiler, linker, and
|
|
preprocessor. If this macro is used, warnings count as fatal
|
|
errors for the current language. This macro is useful when the
|
|
results of configuration are used where warnings are unacceptable; for
|
|
instance, if parts of a program are built with the GCC
|
|
@option{-Werror}
|
|
option. If the whole program is built using @option{-Werror} it is
|
|
often simpler to put @option{-Werror} in the compiler flags (@code{CFLAGS},
|
|
etc.).
|
|
@end defmac
|
|
|
|
@defmac AC_OPENMP
|
|
@acindex{OPENMP}
|
|
@cvindex _OPENMP
|
|
@ovindex OPENMP_CFLAGS
|
|
@ovindex OPENMP_CXXFLAGS
|
|
@ovindex OPENMP_FFLAGS
|
|
@ovindex OPENMP_FCFLAGS
|
|
@caindex prog_c_openmp
|
|
@caindex prog_cxx_openmp
|
|
@caindex prog_f77_openmp
|
|
@caindex prog_fc_openmp
|
|
@uref{https://@/www.openmp.org/, OpenMP} specifies extensions of C, C++,
|
|
and Fortran that simplify optimization of shared memory parallelism,
|
|
which is a common problem on multi-core CPUs.
|
|
|
|
If the current language is C, the macro @code{AC_OPENMP} sets the
|
|
variable @code{OPENMP_CFLAGS} to the C compiler flags needed for
|
|
supporting OpenMP@. @code{OPENMP_CFLAGS} is set to empty if the
|
|
compiler already supports OpenMP, if it has no way to activate OpenMP
|
|
support, or if the user rejects OpenMP support by invoking
|
|
@samp{configure} with the @samp{--disable-openmp} option.
|
|
|
|
@code{OPENMP_CFLAGS} needs to be used when compiling programs, when
|
|
preprocessing program source, and when linking programs. Therefore you
|
|
need to add @code{$(OPENMP_CFLAGS)} to the @code{CFLAGS} of C programs
|
|
that use OpenMP@. If you preprocess OpenMP-specific C code, you also
|
|
need to add @code{$(OPENMP_CFLAGS)} to @code{CPPFLAGS}. The presence of
|
|
OpenMP support is revealed at compile time by the preprocessor macro
|
|
@code{_OPENMP}.
|
|
|
|
Linking a program with @code{OPENMP_CFLAGS} typically adds one more
|
|
shared library to the program's dependencies, so its use is recommended
|
|
only on programs that actually require OpenMP.
|
|
|
|
If the current language is C++, @code{AC_OPENMP} sets the variable
|
|
@code{OPENMP_CXXFLAGS}, suitably for the C++ compiler. The same remarks
|
|
hold as for C.
|
|
|
|
If the current language is Fortran 77 or Fortran, @code{AC_OPENMP} sets
|
|
the variable @code{OPENMP_FFLAGS} or @code{OPENMP_FCFLAGS},
|
|
respectively. Similar remarks as for C hold, except that
|
|
@code{CPPFLAGS} is not used for Fortran, and no preprocessor macro
|
|
signals OpenMP support.
|
|
|
|
For portability, it is best to avoid spaces between @samp{#} and
|
|
@samp{pragma omp}. That is, write @samp{#pragma omp}, not
|
|
@samp{# pragma omp}. The Sun WorkShop 6.2 C compiler chokes on the
|
|
latter.
|
|
|
|
This macro caches its result in the @code{ac_cv_prog_c_openmp},
|
|
@code{ac_cv_prog_cxx_openmp}, @code{ac_cv_prog_f77_openmp}, or
|
|
@code{ac_cv_prog_fc_openmp} variable, depending on the current language.
|
|
|
|
@strong{Caution:} Some of the compiler options that @code{AC_OPENMP}
|
|
tests, mean ``enable OpenMP'' to one compiler, but ``write output to a
|
|
file named @file{mp} or @file{penmp}'' to other compilers. We cannot
|
|
guarantee that the implementation of @code{AC_OPENMP} will not overwrite
|
|
an existing file with either of these names.
|
|
|
|
Therefore, as a defensive measure, a @command{configure} script that
|
|
uses @code{AC_OPENMP} will issue an error and stop (before doing any of
|
|
the operations that might overwrite these files) upon encountering
|
|
either of these files in its working directory.
|
|
@command{autoconf} will also issue an error if it finds either of
|
|
these files in the same directory as a @file{configure.ac} that
|
|
uses @code{AC_OPENMP}.
|
|
|
|
If you have files with either of these names at the top level of your
|
|
source tree, and you need to use @code{AC_OPENMP}, we recommend you
|
|
either change their names or move them into a subdirectory.
|
|
@end defmac
|
|
|
|
@node C Compiler
|
|
@subsection C Compiler Characteristics
|
|
|
|
The following macros provide ways to find and exercise a C Compiler.
|
|
There are a few constructs that ought to be avoided, but do not deserve
|
|
being checked for, since they can easily be worked around.
|
|
|
|
@table @asis
|
|
@item Don't use lines containing solitary backslashes
|
|
They tickle a bug in the HP-UX C compiler (checked on
|
|
HP-UX 10.20,
|
|
11.00, and 11i). When given the following source:
|
|
|
|
@example
|
|
#ifdef __STDC__
|
|
/\
|
|
* A comment with backslash-newlines in it. %@{ %@} *\
|
|
\
|
|
/
|
|
char str[] = "\\
|
|
" A string with backslash-newlines in it %@{ %@} \\
|
|
"";
|
|
char apostrophe = '\\
|
|
\
|
|
'\
|
|
';
|
|
#endif
|
|
@end example
|
|
|
|
@noindent
|
|
the compiler incorrectly fails with the diagnostics ``Non-terminating
|
|
comment at end of file'' and ``Missing @samp{#endif} at end of file.''
|
|
Removing the lines with solitary backslashes solves the problem.
|
|
|
|
@item Don't compile several files at once if output matters to you
|
|
Some compilers, such as HP's, report names of files being
|
|
compiled when given more than one file operand. For instance:
|
|
|
|
@example
|
|
$ @kbd{cc a.c b.c}
|
|
a.c:
|
|
b.c:
|
|
@end example
|
|
|
|
@noindent
|
|
This can cause problems if you observe the output of the compiler to
|
|
detect failures. Invoking @samp{cc -c a.c && cc -c b.c && cc -o c a.o
|
|
b.o} solves the issue.
|
|
|
|
@item Don't rely on correct @code{#line} support
|
|
On Solaris, @command{c89} (at least through Oracle Developer Studio 12.6)
|
|
diagnoses @code{#line} directives whose line
|
|
numbers are greater than 32767. Nothing in POSIX
|
|
makes this invalid. That is why Autoconf stopped issuing
|
|
@code{#line} directives.
|
|
@end table
|
|
|
|
@anchor{AC_PROG_CC}
|
|
@defmac AC_PROG_CC (@ovar{compiler-search-list})
|
|
@acindex{PROG_CC}
|
|
@evindex CC
|
|
@evindex CFLAGS
|
|
@ovindex CC
|
|
@ovindex CFLAGS
|
|
Determine a C compiler to use.
|
|
|
|
If the environment variable @code{CC} is set, its value will be taken as
|
|
the name of the C compiler to use. Otherwise, search for a C compiler
|
|
under a series of likely names, trying @code{gcc} and @code{cc} first.
|
|
Regardless, the output variable @code{CC} is set to the chosen compiler.
|
|
|
|
If the optional first argument to the macro is used, it must be a
|
|
whitespace-separated list of potential names for a C compiler,
|
|
which overrides the built-in list.
|
|
|
|
If no C compiler can be found, @command{configure} will error out.
|
|
|
|
If the selected C compiler is found to be GNU C (regardless of
|
|
its name), the shell variable @code{GCC} will be set to @samp{yes}.
|
|
If the shell variable @code{CFLAGS} was not already set, it is set
|
|
to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems
|
|
where GCC does not accept @option{-g}), or @option{-g} for other
|
|
compilers. @code{CFLAGS} is then made an output variable.
|
|
You can override the default for @code{CFLAGS} by inserting a shell
|
|
default assignment between @code{AC_INIT} and @code{AC_PROG_CC}:
|
|
|
|
@example
|
|
: $@{CFLAGS="@var{options}"@}
|
|
@end example
|
|
|
|
where @var{options} are the appropriate set of options to use by
|
|
default. (It is important to use this construct rather than a normal
|
|
assignment, so that @code{CFLAGS} can still be overridden by the
|
|
person building the package. @xref{Preset Output Variables}.)
|
|
|
|
If necessary, options are added to @code{CC} to enable support for
|
|
ISO Standard C features with extensions, preferring the newest edition
|
|
of the C standard for which detection is supported. Currently the
|
|
newest edition Autoconf knows how to detect support for is C23. After calling
|
|
this macro you can check whether the C compiler has been set to accept
|
|
standard C by inspecting the shell variable @code{ac_prog_cc_stdc}.
|
|
Its value is @samp{c23}, @samp{c11}, @samp{c99}, or @samp{c89}, respectively,
|
|
if the C compiler has been set to use the 2023, 2011, 1999, or 1990 edition of
|
|
the C standard, and @samp{no} if the compiler does not support compiling
|
|
standard C at all.
|
|
(There is no special value for the 2017 edition of the C standard,
|
|
as it is a minor revision that does not introduce new language features.)
|
|
|
|
The tests for standard conformance are not comprehensive. They test the
|
|
value of @code{__STDC_VERSION__}, and a
|
|
representative sample of the language features added in each version of
|
|
the C standard. They do not examine @code{__STDC__}
|
|
because some compilers by default leave it undefined.
|
|
They do not test for variable-length arrays,
|
|
a C99 feature that was made optional in C11;
|
|
if you need to use this feature when available, use @code{AC_C_VARARRAYS}.
|
|
They do not test the C standard library, because the C
|
|
compiler might be generating code for a ``freestanding environment''
|
|
(in which most of the standard library is optional). If you need to know
|
|
whether a particular C standard header exists, use @code{AC_CHECK_HEADER}.
|
|
|
|
None of the options that may be added to @code{CC} by this macro
|
|
enable @emph{strict} conformance to the C standard. In particular,
|
|
system-specific extensions are not disabled. (For example, for GNU C,
|
|
the @option{-std=gnu@var{nn}} options may be used, but not the
|
|
@option{-std=c@var{nn}} options.)
|
|
|
|
Many Autoconf macros use a compiler, and thus call
|
|
@samp{AC_REQUIRE([AC_PROG_CC])} to ensure that the compiler has been
|
|
determined before the body of the outermost @code{AC_DEFUN} macro.
|
|
Although @code{AC_PROG_CC} is safe to directly expand multiple times, it
|
|
performs certain checks (such as the proper value of @env{EXEEXT}) only
|
|
on the first invocation. Therefore, care must be used when invoking
|
|
this macro from within another macro rather than at the top level
|
|
(@pxref{Expanded Before Required}).
|
|
@end defmac
|
|
|
|
@anchor{AC_PROG_CC_C_O}
|
|
@defmac AC_PROG_CC_C_O
|
|
@acindex{PROG_CC_C_O}
|
|
@cvindex NO_MINUS_C_MINUS_O
|
|
@caindex prog_cc_@var{compiler}_c_o
|
|
If the C compiler does not accept the @option{-c} and @option{-o} options
|
|
simultaneously, define @code{NO_MINUS_C_MINUS_O}. This macro actually
|
|
tests both the compiler found by @code{AC_PROG_CC}, and, if different,
|
|
the first @code{cc} in the path. The test fails if one fails. This
|
|
macro was created for GNU Make to choose the default C compilation
|
|
rule.
|
|
|
|
For the compiler @var{compiler}, this macro caches its result in the
|
|
@code{ac_cv_prog_cc_@var{compiler}_c_o} variable.
|
|
@end defmac
|
|
|
|
|
|
@defmac AC_PROG_CPP
|
|
@acindex{PROG_CPP}
|
|
@evindex CPP
|
|
@ovindex CPP
|
|
Set output variable @code{CPP} to a command that runs the
|
|
C preprocessor. If @samp{$CC -E} doesn't work, tries @code{cpp} and
|
|
@file{/lib/cpp}, in that order.
|
|
|
|
It is only portable to run @code{CPP} on files with a @file{.c}
|
|
extension.
|
|
|
|
Some preprocessors don't indicate missing include files by the error
|
|
status. For such preprocessors an internal variable is set that causes
|
|
other macros to check the standard error from the preprocessor and
|
|
consider the test failed if any warnings have been reported.
|
|
For most preprocessors, though, warnings do not cause include-file
|
|
tests to fail unless @code{AC_PROG_CPP_WERROR} is also specified.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CPP_WERROR
|
|
@acindex{PROG_CPP_WERROR}
|
|
@ovindex CPP
|
|
This acts like @code{AC_PROG_CPP}, except it treats warnings from the
|
|
preprocessor as errors even if the preprocessor exit status indicates
|
|
success. This is useful for avoiding headers that generate mandatory
|
|
warnings, such as deprecation notices.
|
|
@end defmac
|
|
|
|
|
|
The following macros check for C compiler or machine architecture
|
|
features. To check for characteristics not listed here, use
|
|
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
|
|
@code{AC_RUN_IFELSE} (@pxref{Runtime}).
|
|
|
|
@defmac AC_C_BACKSLASH_A
|
|
@acindex{C_BACKSLASH_A}
|
|
@cvindex HAVE_C_BACKSLASH_A
|
|
Define @samp{HAVE_C_BACKSLASH_A} to 1 if the C compiler understands
|
|
@samp{\a}.
|
|
|
|
This macro is obsolescent, as current C compilers understand @samp{\a}.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@anchor{AC_C_BIGENDIAN}
|
|
@defmac AC_C_BIGENDIAN (@ovar{action-if-true}, @ovar{action-if-false}, @
|
|
@ovar{action-if-unknown}, @ovar{action-if-universal})
|
|
@acindex{C_BIGENDIAN}
|
|
@cvindex WORDS_BIGENDIAN
|
|
@cindex Endianness
|
|
If words are stored with the most significant byte first (like Motorola
|
|
and SPARC CPUs), execute @var{action-if-true}. If words are stored with
|
|
the least significant byte first (like Intel and VAX CPUs), execute
|
|
@var{action-if-false}.
|
|
|
|
This macro runs a test-case if endianness cannot be determined from the
|
|
system header files. When cross-compiling, the test-case is not run but
|
|
grep'ed for some magic values. @var{action-if-unknown} is executed if
|
|
the latter case fails to determine the byte sex of the host system.
|
|
|
|
In some cases a single run of a compiler can generate code for multiple
|
|
architectures. This can happen, for example, when generating Mac OS X
|
|
universal binary files, which work on both PowerPC and Intel
|
|
architectures. In this case, the different variants might be for
|
|
architectures with differing endianness. If
|
|
@command{configure} detects this, it executes @var{action-if-universal}
|
|
instead of @var{action-if-unknown}.
|
|
|
|
The default for @var{action-if-true} is to define
|
|
@samp{WORDS_BIGENDIAN}. The default for @var{action-if-false} is to do
|
|
nothing. The default for @var{action-if-unknown} is to
|
|
abort configure and tell the installer how to bypass this test.
|
|
And finally, the default for @var{action-if-universal} is to ensure that
|
|
@samp{WORDS_BIGENDIAN} is defined if and only if a universal build is
|
|
detected and the current code is big-endian; this default works only if
|
|
@command{autoheader} is used (@pxref{autoheader Invocation}).
|
|
|
|
If you use this macro without specifying @var{action-if-universal}, you
|
|
should also use @code{AC_CONFIG_HEADERS}; otherwise
|
|
@samp{WORDS_BIGENDIAN} may be set incorrectly for Mac OS X universal
|
|
binary files.
|
|
@end defmac
|
|
|
|
@anchor{AC_C_CONST}
|
|
@defmac AC_C_CONST
|
|
@acindex{C_CONST}
|
|
@cvindex const
|
|
@caindex c_const
|
|
If the C compiler does not fully support the @code{const} keyword,
|
|
define @code{const} to be empty. Some C compilers that do
|
|
not define @code{__STDC__} do support @code{const}; some compilers that
|
|
define @code{__STDC__} do not completely support @code{const}. Programs
|
|
can simply use @code{const} as if every C compiler supported it; for
|
|
those that don't, the makefile or configuration header file
|
|
defines it as empty.
|
|
|
|
Occasionally installers use a C++ compiler to compile C code, typically
|
|
because they lack a C compiler. This causes problems with @code{const},
|
|
because C and C++ treat @code{const} differently. For example:
|
|
|
|
@example
|
|
const int foo;
|
|
@end example
|
|
|
|
@noindent
|
|
is valid in C but not in C++. These differences unfortunately cannot be
|
|
papered over by defining @code{const} to be empty.
|
|
|
|
If @command{autoconf} detects this situation, it leaves @code{const} alone,
|
|
as this generally yields better results in practice. However, using a
|
|
C++ compiler to compile C code is not recommended or supported, and
|
|
installers who run into trouble in this area should get a C compiler
|
|
like GCC to compile their C code.
|
|
|
|
This macro caches its result in the @code{ac_cv_c_const} variable.
|
|
|
|
This macro is obsolescent, as current C compilers support @code{const}.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_C__GENERIC
|
|
@acindex{C__GENERIC}
|
|
@cvindex _Generic
|
|
If the C compiler supports C11-style generic selection using the
|
|
@code{_Generic} keyword, define @code{HAVE_C__GENERIC}.
|
|
@end defmac
|
|
|
|
@defmac AC_C_RESTRICT
|
|
@acindex{C_RESTRICT}
|
|
@cvindex restrict
|
|
@caindex c_restrict
|
|
If the C compiler recognizes a variant spelling for the @code{restrict}
|
|
keyword (@code{__restrict}, @code{__restrict__}, or @code{_Restrict}),
|
|
then define @code{restrict} to that; this is more likely to do the right
|
|
thing with compilers that support language variants where plain
|
|
@code{restrict} is not a keyword. Otherwise, if the C compiler
|
|
recognizes the @code{restrict} keyword, don't do anything.
|
|
Otherwise, define @code{restrict} to be empty.
|
|
Thus, programs may simply use @code{restrict} as if every C compiler
|
|
supported it; for those that do not, the makefile
|
|
or configuration header defines it away.
|
|
|
|
Although support in C++ for the @code{restrict} keyword is not
|
|
required, several C++ compilers do accept the keyword.
|
|
This macro works for them, too.
|
|
|
|
This macro caches @samp{no} in the @code{ac_cv_c_restrict} variable
|
|
if @code{restrict} is not supported, and a supported spelling otherwise.
|
|
@end defmac
|
|
|
|
@defmac AC_C_VOLATILE
|
|
@acindex{C_VOLATILE}
|
|
@cvindex volatile
|
|
If the C compiler does not understand the keyword @code{volatile},
|
|
define @code{volatile} to be empty. Programs can simply use
|
|
@code{volatile} as if every C compiler supported it; for those that do
|
|
not, the makefile or configuration header defines it as
|
|
empty.
|
|
|
|
If the correctness of your program depends on the semantics of
|
|
@code{volatile}, simply defining it to be empty does, in a sense, break
|
|
your code. However, given that the compiler does not support
|
|
@code{volatile}, you are at its mercy anyway. At least your
|
|
program compiles, when it wouldn't before.
|
|
@xref{Volatile Objects}, for more about @code{volatile}.
|
|
|
|
This macro is obsolescent, as current C compilers support @code{volatile}.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@anchor{AC_C_INLINE}
|
|
@defmac AC_C_INLINE
|
|
@acindex{C_INLINE}
|
|
@cvindex inline
|
|
If the C compiler supports the keyword @code{inline}, do nothing.
|
|
Otherwise define @code{inline} to @code{__inline__} or @code{__inline}
|
|
if it accepts one of those, otherwise define @code{inline} to be empty.
|
|
@end defmac
|
|
|
|
@anchor{AC_C_CHAR_UNSIGNED}
|
|
@defmac AC_C_CHAR_UNSIGNED
|
|
@acindex{C_CHAR_UNSIGNED}
|
|
@cvindex __CHAR_UNSIGNED__
|
|
If the C type @code{char} is unsigned, define @code{__CHAR_UNSIGNED__},
|
|
unless the C compiler predefines it.
|
|
|
|
These days, using this macro is not necessary. The same information can
|
|
be determined by this portable alternative, thus avoiding the use of
|
|
preprocessor macros in the namespace reserved for the implementation.
|
|
|
|
@example
|
|
#include <limits.h>
|
|
#if CHAR_MIN == 0
|
|
# define CHAR_UNSIGNED 1
|
|
#endif
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_C_STRINGIZE
|
|
@acindex{C_STRINGIZE}
|
|
@cvindex HAVE_STRINGIZE
|
|
If the C preprocessor supports the stringizing operator, define
|
|
@code{HAVE_STRINGIZE}. The stringizing operator is @samp{#} and is
|
|
found in macros such as this:
|
|
|
|
@example
|
|
#define x(y) #y
|
|
@end example
|
|
|
|
This macro is obsolescent, as current C compilers support the
|
|
stringizing operator. New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_C_FLEXIBLE_ARRAY_MEMBER
|
|
@acindex{C_FLEXIBLE_ARRAY_MEMBER}
|
|
@cvindex FLEXIBLE_ARRAY_MEMBER
|
|
If the C compiler supports flexible array members, define
|
|
@code{FLEXIBLE_ARRAY_MEMBER} to nothing; otherwise define it to 1.
|
|
That way, a declaration like this:
|
|
|
|
@example
|
|
struct s
|
|
@{
|
|
size_t n_vals;
|
|
double val[FLEXIBLE_ARRAY_MEMBER];
|
|
@};
|
|
@end example
|
|
|
|
@noindent
|
|
will let applications use the ``struct hack'' even with compilers that
|
|
do not support flexible array members. To allocate and use such an
|
|
object, you can use code like this:
|
|
|
|
@example
|
|
size_t i;
|
|
size_t n = compute_value_count ();
|
|
struct s *p =
|
|
malloc (offsetof (struct s, val)
|
|
+ n * sizeof (double));
|
|
p->n_vals = n;
|
|
for (i = 0; i < n; i++)
|
|
p->val[i] = compute_value (i);
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_C_VARARRAYS
|
|
@acindex{C_VARARRAYS}
|
|
@cvindex __STDC_NO_VLA__
|
|
@cvindex HAVE_C_VARARRAYS
|
|
If the C compiler does not support variable-length arrays, define the
|
|
macro @code{__STDC_NO_VLA__} to be 1 if it is not already defined. A
|
|
variable-length array is an array of automatic storage duration whose
|
|
length is determined at run time, when the array is declared. For
|
|
backward compatibility this macro also defines @code{HAVE_C_VARARRAYS}
|
|
if the C compiler supports variable-length arrays, but this usage is
|
|
obsolescent and new programs should use @code{__STDC_NO_VLA__}.
|
|
@end defmac
|
|
|
|
@defmac AC_C_TYPEOF
|
|
@acindex{C_TYPEOF}
|
|
@cvindex HAVE_TYPEOF
|
|
@cvindex typeof
|
|
If the C compiler supports GNU C's @code{typeof} syntax either
|
|
directly or
|
|
through a different spelling of the keyword (e.g., @code{__typeof__}),
|
|
define @code{HAVE_TYPEOF}. If the support is available only through a
|
|
different spelling, define @code{typeof} to that spelling.
|
|
@end defmac
|
|
|
|
@defmac AC_C_PROTOTYPES
|
|
@acindex{C_PROTOTYPES}
|
|
@cvindex PROTOTYPES
|
|
@cvindex __PROTOTYPES
|
|
@cvindex PARAMS
|
|
If function prototypes are understood by the compiler (as determined by
|
|
@code{AC_PROG_CC}), define @code{PROTOTYPES} and @code{__PROTOTYPES}.
|
|
Defining @code{__PROTOTYPES} is for the benefit of
|
|
header files that cannot use macros that infringe on user name space.
|
|
|
|
This macro is obsolescent, as current C compilers support prototypes.
|
|
New programs need not use this macro.
|
|
@end defmac
|
|
|
|
@node C++ Compiler
|
|
@subsection C++ Compiler Characteristics
|
|
|
|
|
|
@defmac AC_PROG_CXX (@ovar{compiler-search-list})
|
|
@acindex{PROG_CXX}
|
|
@evindex CXX
|
|
@evindex CXXFLAGS
|
|
@ovindex CXX
|
|
@ovindex CXXFLAGS
|
|
Determine a C++ compiler to use.
|
|
|
|
If either the environment variable @code{CXX} or the environment
|
|
variable @code{CCC} is set, its value will be taken as the name of a
|
|
C++ compiler. If both are set, @code{CXX} is preferred. If neither
|
|
are set, search for a C++ compiler under a series of likely names,
|
|
trying @code{g++} and @code{c++} first. Regardless, the output
|
|
variable @code{CXX} is set to the chosen compiler.
|
|
|
|
If the optional first argument to the macro is used, it must be a
|
|
whitespace-separated list of potential names for a C++ compiler,
|
|
which overrides the built-in list.
|
|
|
|
If no C++ compiler can be found, as a last resort @code{CXX} is set to
|
|
@code{g++} (and subsequent tests will probably fail).
|
|
|
|
If the selected C++ compiler is found to be GNU C++ (regardless of
|
|
its name), the shell variable @code{GXX} will be set to @samp{yes}.
|
|
If the shell variable @code{CXXFLAGS} was not already set, it is set
|
|
to @option{-g -O2} for the GNU C++ compiler (@option{-O2} on systems
|
|
where G++ does not accept @option{-g}), or @option{-g} for other
|
|
compilers. @code{CXXFLAGS} is then made an output variable.
|
|
You can override the default for @code{CXXFLAGS} by inserting a shell
|
|
default assignment between @code{AC_INIT} and @code{AC_PROG_CXX}:
|
|
|
|
@example
|
|
: $@{CXXFLAGS="@var{options}"@}
|
|
@end example
|
|
|
|
where @var{options} are the appropriate set of options to use by
|
|
default. (It is important to use this construct rather than a normal
|
|
assignment, so that @code{CXXFLAGS} can still be overridden by the
|
|
person building the package. @xref{Preset Output Variables}.)
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CXXCPP
|
|
@acindex{PROG_CXXCPP}
|
|
@evindex CXXCPP
|
|
@ovindex CXXCPP
|
|
Set output variable @code{CXXCPP} to a command that runs the C++
|
|
preprocessor. If @samp{$CXX -E} doesn't work, tries @code{cpp} and
|
|
@file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP}
|
|
may or may not set C++-specific predefined macros (such as @code{__cplusplus}).
|
|
|
|
It is portable to run @code{CXXCPP} only on files with a @file{.c},
|
|
@file{.C}, @file{.cc}, or @file{.cpp} extension.
|
|
|
|
Some preprocessors don't indicate missing include files by the error
|
|
status. For such preprocessors an internal variable is set that causes
|
|
other macros to check the standard error from the preprocessor and
|
|
consider the test failed if any warnings have been reported. However,
|
|
it is not known whether such broken preprocessors exist for C++.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CXX_C_O
|
|
@acindex{PROG_CXX_C_O}
|
|
@cvindex CXX_NO_MINUS_C_MINUS_O
|
|
Test whether the C++ compiler accepts the options @option{-c} and
|
|
@option{-o} simultaneously, and define @code{CXX_NO_MINUS_C_MINUS_O},
|
|
if it does not.
|
|
@end defmac
|
|
|
|
|
|
@node Objective C Compiler
|
|
@subsection Objective C Compiler Characteristics
|
|
|
|
|
|
@defmac AC_PROG_OBJC (@ovar{compiler-search-list})
|
|
@acindex{PROG_OBJC}
|
|
@evindex OBJC
|
|
@evindex OBJCFLAGS
|
|
@ovindex OBJC
|
|
@ovindex OBJCFLAGS
|
|
Determine an Objective C compiler to use. If @code{OBJC} is not already
|
|
set in the environment, check for Objective C compilers. Set output
|
|
variable @code{OBJC} to the name of the compiler found.
|
|
|
|
This macro may, however, be invoked with an optional first argument
|
|
which, if specified, must be a blank-separated list of Objective C compilers to
|
|
search for. This just gives the user an opportunity to specify an
|
|
alternative search list for the Objective C compiler. For example, if you
|
|
didn't like the default order, then you could invoke @code{AC_PROG_OBJC}
|
|
like this:
|
|
|
|
@example
|
|
AC_PROG_OBJC([gcc objcc objc])
|
|
@end example
|
|
|
|
If using a compiler that supports GNU Objective C, set shell variable
|
|
@code{GOBJC} to @samp{yes}. If output variable @code{OBJCFLAGS} was not
|
|
already set, set it to @option{-g -O2} for a GNU Objective C
|
|
compiler (@option{-O2} on systems where the compiler does not accept
|
|
@option{-g}), or @option{-g} for other compilers.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_OBJCPP
|
|
@acindex{PROG_OBJCPP}
|
|
@evindex OBJCPP
|
|
@ovindex OBJCPP
|
|
Set output variable @code{OBJCPP} to a command that runs the Objective C
|
|
preprocessor. If @samp{$OBJC -E} doesn't work, tries @code{cpp} and
|
|
@file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP}
|
|
may or may not set Objective-C-specific predefined macros (such as
|
|
@code{__OBJC__}).
|
|
@end defmac
|
|
|
|
|
|
@node Objective C++ Compiler
|
|
@subsection Objective C++ Compiler Characteristics
|
|
|
|
|
|
@defmac AC_PROG_OBJCXX (@ovar{compiler-search-list})
|
|
@acindex{PROG_OBJCXX}
|
|
@evindex OBJCXX
|
|
@evindex OBJCXXFLAGS
|
|
@ovindex OBJCXX
|
|
@ovindex OBJCXXFLAGS
|
|
Determine an Objective C++ compiler to use. If @code{OBJCXX} is not already
|
|
set in the environment, check for Objective C++ compilers. Set output
|
|
variable @code{OBJCXX} to the name of the compiler found.
|
|
|
|
This macro may, however, be invoked with an optional first argument
|
|
which, if specified, must be a blank-separated list of Objective C++ compilers
|
|
to search for. This just gives the user an opportunity to specify an
|
|
alternative search list for the Objective C++ compiler. For example, if you
|
|
didn't like the default order, then you could invoke @code{AC_PROG_OBJCXX}
|
|
like this:
|
|
|
|
@example
|
|
AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])
|
|
@end example
|
|
|
|
If using a compiler that supports GNU Objective C++, set shell variable
|
|
@code{GOBJCXX} to @samp{yes}. If output variable @code{OBJCXXFLAGS} was not
|
|
already set, set it to @option{-g -O2} for a GNU Objective C++
|
|
compiler (@option{-O2} on systems where the compiler does not accept
|
|
@option{-g}), or @option{-g} for other compilers.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_OBJCXXCPP
|
|
@acindex{PROG_OBJCXXCPP}
|
|
@evindex OBJCXXCPP
|
|
@ovindex OBJCXXCPP
|
|
Set output variable @code{OBJCXXCPP} to a command that runs the Objective C++
|
|
preprocessor. If @samp{$OBJCXX -E} doesn't work, tries @code{cpp} and
|
|
@file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP}
|
|
may or may not set Objective-C++-specific predefined macros (such as
|
|
@code{__cplusplus} and @code{__OBJC__}).
|
|
@end defmac
|
|
|
|
|
|
@node Erlang Compiler and Interpreter
|
|
@subsection Erlang Compiler and Interpreter Characteristics
|
|
@cindex Erlang
|
|
|
|
Autoconf defines the following macros for determining paths to the essential
|
|
Erlang/OTP programs:
|
|
|
|
@defmac AC_ERLANG_PATH_ERLC (@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{ERLANG_PATH_ERLC}
|
|
@evindex ERLC
|
|
@evindex ERLCFLAGS
|
|
@ovindex ERLC
|
|
@ovindex ERLCFLAGS
|
|
Determine an Erlang compiler to use. If @code{ERLC} is not already set in the
|
|
environment, check for @command{erlc}. Set output variable @code{ERLC} to the
|
|
complete path of the compiler command found. In addition, if @code{ERLCFLAGS}
|
|
is not set in the environment, set it to an empty value.
|
|
|
|
The two optional arguments have the same meaning as the two last arguments of
|
|
macro @code{AC_PATH_PROG} for looking for the @command{erlc} program. For
|
|
example, to look for @command{erlc} only in the @file{/usr/lib/erlang/bin}
|
|
directory:
|
|
|
|
@example
|
|
AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_NEED_ERLC (@dvar{path, $PATH})
|
|
@acindex{ERLANG_NEED_ERLC}
|
|
A simplified variant of the @code{AC_ERLANG_PATH_ERLC} macro, that prints an
|
|
error message and exits the @command{configure} script if the @command{erlc}
|
|
program is not found.
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_PATH_ERL (@ovar{value-if-not-found}, @dvar{path, $PATH})
|
|
@acindex{ERLANG_PATH_ERL}
|
|
@evindex ERL
|
|
@ovindex ERL
|
|
Determine an Erlang interpreter to use. If @code{ERL} is not already
|
|
set in the
|
|
environment, check for @command{erl}. Set output variable @code{ERL} to the
|
|
complete path of the interpreter command found.
|
|
|
|
The two optional arguments have the same meaning as the two last arguments of
|
|
macro @code{AC_PATH_PROG} for looking for the @command{erl} program. For
|
|
example, to look for @command{erl} only in the @file{/usr/lib/erlang/bin}
|
|
directory:
|
|
|
|
@example
|
|
AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_NEED_ERL (@dvar{path, $PATH})
|
|
@acindex{ERLANG_NEED_ERL}
|
|
A simplified variant of the @code{AC_ERLANG_PATH_ERL} macro, that prints an
|
|
error message and exits the @command{configure} script if the @command{erl}
|
|
program is not found.
|
|
@end defmac
|
|
|
|
|
|
@node Fortran Compiler
|
|
@subsection Fortran Compiler Characteristics
|
|
@cindex Fortran
|
|
@cindex F77
|
|
|
|
The Autoconf Fortran support is divided into two categories: legacy
|
|
Fortran 77 macros (@code{F77}), and modern Fortran macros (@code{FC}).
|
|
The former are intended for traditional Fortran 77 code, and have output
|
|
variables like @code{F77}, @code{FFLAGS}, and @code{FLIBS}. The latter
|
|
are for newer programs that can (or must) compile under the newer
|
|
Fortran standards, and have output variables like @code{FC},
|
|
@code{FCFLAGS}, and @code{FCLIBS}.
|
|
|
|
Except for the macros @code{AC_FC_SRCEXT}, @code{AC_FC_FREEFORM},
|
|
@code{AC_FC_FIXEDFORM}, and @code{AC_FC_LINE_LENGTH} (see below), the
|
|
@code{FC} and @code{F77} macros behave almost identically, and so they
|
|
are documented together in this section.
|
|
|
|
|
|
@defmac AC_PROG_F77 (@ovar{compiler-search-list})
|
|
@acindex{PROG_F77}
|
|
@evindex F77
|
|
@evindex FFLAGS
|
|
@ovindex F77
|
|
@ovindex FFLAGS
|
|
@caindex f77_compiler_gnu
|
|
@caindex prog_f77_g
|
|
Determine a Fortran 77 compiler to use. If @code{F77} is not already
|
|
set in the environment, then check for @code{g77} and @code{f77}, and
|
|
then some other names. Set the output variable @code{F77} to the name
|
|
of the compiler found.
|
|
|
|
This macro may, however, be invoked with an optional first argument
|
|
which, if specified, must be a blank-separated list of Fortran 77
|
|
compilers to search for. This just gives the user an opportunity to
|
|
specify an alternative search list for the Fortran 77 compiler. For
|
|
example, if you didn't like the default order, then you could invoke
|
|
@code{AC_PROG_F77} like this:
|
|
|
|
@example
|
|
AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90])
|
|
@end example
|
|
|
|
If using a compiler that supports GNU Fortran 77,
|
|
set the shell variable @code{G77} to @samp{yes}.
|
|
If the output variable @code{FFLAGS} was not already set in the
|
|
environment, set it to @option{-g -02} for @code{g77} (or @option{-O2}
|
|
where the GNU Fortran 77 compiler does not accept @option{-g}), or
|
|
@option{-g} for other compilers.
|
|
|
|
The result of the GNU test is cached in the
|
|
@code{ac_cv_f77_compiler_gnu} variable, acceptance of @option{-g} in the
|
|
@code{ac_cv_prog_f77_g} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_FC (@ovar{compiler-search-list}, @ovar{dialect})
|
|
@acindex{PROG_FC}
|
|
@evindex FC
|
|
@evindex FCFLAGS
|
|
@ovindex FC
|
|
@ovindex FCFLAGS
|
|
@caindex fc_compiler_gnu
|
|
@caindex prog_fc_g
|
|
Determine a Fortran compiler to use. If @code{FC} is not already set in
|
|
the environment, then @code{dialect} is a hint to indicate what Fortran
|
|
dialect to search for; the default is to search for the newest available
|
|
dialect. Set the output variable @code{FC} to the name of the compiler
|
|
found.
|
|
|
|
By default, newer dialects are preferred over older dialects, but if
|
|
@code{dialect} is specified then older dialects are preferred starting
|
|
with the specified dialect. @code{dialect} can currently be one of
|
|
Fortran 77, Fortran 90, or Fortran 95. However, this is only a hint of
|
|
which compiler @emph{name} to prefer (e.g., @code{f90} or @code{f95}),
|
|
and no attempt is made to guarantee that a particular language standard
|
|
is actually supported. Thus, it is preferable that you avoid the
|
|
@code{dialect} option, and use AC_PROG_FC only for code compatible with
|
|
the latest Fortran standard.
|
|
|
|
This macro may, alternatively, be invoked with an optional first argument
|
|
which, if specified, must be a blank-separated list of Fortran
|
|
compilers to search for, just as in @code{AC_PROG_F77}.
|
|
|
|
If using a compiler that supports GNU Fortran,
|
|
set the shell variable @code{GFC} to @samp{yes}.
|
|
If the output variable @code{FCFLAGS} was not already set in the
|
|
environment, then set it to @option{-g -02} for a GNU Fortran compiler (or
|
|
@option{-O2} where the compiler does not accept @option{-g}), or
|
|
@option{-g} for other compilers.
|
|
|
|
The result of the GNU test is cached in the @code{ac_cv_fc_compiler_gnu}
|
|
variable, acceptance of @option{-g} in the @code{ac_cv_prog_fc_g}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_F77_C_O
|
|
@defmacx AC_PROG_FC_C_O
|
|
@acindex{PROG_F77_C_O}
|
|
@acindex{PROG_FC_C_O}
|
|
@cvindex F77_NO_MINUS_C_MINUS_O
|
|
@cvindex FC_NO_MINUS_C_MINUS_O
|
|
@caindex prog_f77_c_o
|
|
@caindex prog_fc_c_o
|
|
Test whether the Fortran compiler accepts the options @option{-c} and
|
|
@option{-o} simultaneously, and define @code{F77_NO_MINUS_C_MINUS_O} or
|
|
@code{FC_NO_MINUS_C_MINUS_O}, respectively, if it does not.
|
|
|
|
The result of the test is cached in the @code{ac_cv_prog_f77_c_o} or
|
|
@code{ac_cv_prog_fc_c_o} variable, respectively.
|
|
@end defmac
|
|
|
|
The following macros check for Fortran compiler characteristics.
|
|
To check for characteristics not listed here, use
|
|
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
|
|
@code{AC_RUN_IFELSE} (@pxref{Runtime}), making sure to first set the
|
|
current language to Fortran 77 or Fortran via @code{AC_LANG([Fortran 77])}
|
|
or @code{AC_LANG(Fortran)} (@pxref{Language Choice}).
|
|
|
|
|
|
@defmac AC_F77_LIBRARY_LDFLAGS
|
|
@defmacx AC_FC_LIBRARY_LDFLAGS
|
|
@acindex{F77_LIBRARY_LDFLAGS}
|
|
@ovindex FLIBS
|
|
@acindex{FC_LIBRARY_LDFLAGS}
|
|
@ovindex FCLIBS
|
|
@caindex prog_f77_v
|
|
@caindex prog_fc_v
|
|
@caindex f77_libs
|
|
@caindex fc_libs
|
|
Determine the linker flags (e.g., @option{-L} and @option{-l}) for the
|
|
@dfn{Fortran intrinsic and runtime libraries} that are required to
|
|
successfully link a Fortran program or shared library. The output
|
|
variable @code{FLIBS} or @code{FCLIBS} is set to these flags (which
|
|
should be included after @code{LIBS} when linking).
|
|
|
|
This macro is intended to be used in those situations when it is
|
|
necessary to mix, e.g., C++ and Fortran source code in a single
|
|
program or shared library (@pxref{Mixing Fortran 77 With C and C++, , ,
|
|
automake, GNU Automake}).
|
|
|
|
For example, if object files from a C++ and Fortran compiler must be
|
|
linked together, then the C++ compiler/linker must be used for linking
|
|
(since special C++-ish things need to happen at link time like calling
|
|
global constructors, instantiating templates, enabling exception
|
|
support, etc.).
|
|
|
|
However, the Fortran intrinsic and runtime libraries must be linked in
|
|
as well, but the C++ compiler/linker doesn't know by default how to add
|
|
these Fortran 77 libraries. Hence, this macro was created to determine
|
|
these Fortran libraries.
|
|
|
|
The macros @code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
|
|
@code{AC_F77_MAIN} and @code{AC_FC_MAIN} are probably also necessary to
|
|
link C/C++ with Fortran; see below. Further, it is highly recommended
|
|
that you use @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers})
|
|
because the complex defines that the function wrapper macros create
|
|
may not work with C/C++ compiler drivers.
|
|
|
|
These macros internally compute the flag needed to verbose linking
|
|
output and cache it in @code{ac_cv_prog_f77_v} or @code{ac_cv_prog_fc_v}
|
|
variables, respectively. The computed linker flags are cached in
|
|
@code{ac_cv_f77_libs} or @code{ac_cv_fc_libs}, respectively.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_DUMMY_MAIN (@ovar{action-if-found}, @
|
|
@dvar{action-if-not-found, AC_MSG_FAILURE})
|
|
@defmacx AC_FC_DUMMY_MAIN (@ovar{action-if-found}, @
|
|
@dvar{action-if-not-found, AC_MSG_FAILURE})
|
|
@acindex{F77_DUMMY_MAIN}
|
|
@cvindex F77_DUMMY_MAIN
|
|
@acindex{FC_DUMMY_MAIN}
|
|
@cvindex FC_DUMMY_MAIN
|
|
@caindex f77_dummy_main
|
|
@caindex fc_dummy_main
|
|
With many compilers, the Fortran libraries detected by
|
|
@code{AC_F77_LIBRARY_LDFLAGS} or @code{AC_FC_LIBRARY_LDFLAGS} provide
|
|
their own @code{main} entry function that initializes things like
|
|
Fortran I/O, and which then calls a user-provided entry function named
|
|
(say) @code{MAIN__} to run the user's program. The
|
|
@code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
|
|
@code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros figure out how to deal with
|
|
this interaction.
|
|
|
|
When using Fortran for purely numerical functions (no I/O, etc.)@: often
|
|
one prefers to provide one's own @code{main} and skip the Fortran
|
|
library initializations. In this case, however, one may still need to
|
|
provide a dummy @code{MAIN__} routine in order to prevent linking errors
|
|
on some systems. @code{AC_F77_DUMMY_MAIN} or @code{AC_FC_DUMMY_MAIN}
|
|
detects whether any such routine is @emph{required} for linking, and
|
|
what its name is; the shell variable @code{F77_DUMMY_MAIN} or
|
|
@code{FC_DUMMY_MAIN} holds this name, @code{unknown} when no solution
|
|
was found, and @code{none} when no such dummy main is needed.
|
|
|
|
By default, @var{action-if-found} defines @code{F77_DUMMY_MAIN} or
|
|
@code{FC_DUMMY_MAIN} to the name of this routine (e.g., @code{MAIN__})
|
|
@emph{if} it is required. @var{action-if-not-found} defaults to
|
|
exiting with an error.
|
|
|
|
In order to link with Fortran routines, the user's C/C++ program should
|
|
then include the following code to define the dummy main if it is
|
|
needed:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
|
|
#ifdef F77_DUMMY_MAIN
|
|
# ifdef __cplusplus
|
|
extern "C"
|
|
# endif
|
|
int F77_DUMMY_MAIN (void) @{ return 1; @}
|
|
#endif
|
|
@end example
|
|
|
|
(Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
|
|
|
|
Note that this macro is called automatically from @code{AC_F77_WRAPPERS}
|
|
or @code{AC_FC_WRAPPERS}; there is generally no need to call it
|
|
explicitly unless one wants to change the default actions.
|
|
|
|
The result of this macro is cached in the @code{ac_cv_f77_dummy_main} or
|
|
@code{ac_cv_fc_dummy_main} variable, respectively.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_MAIN
|
|
@defmacx AC_FC_MAIN
|
|
@acindex{F77_MAIN}
|
|
@cvindex F77_MAIN
|
|
@acindex{FC_MAIN}
|
|
@cvindex FC_MAIN
|
|
@caindex f77_main
|
|
@caindex fc_main
|
|
As discussed above, many Fortran libraries allow you to provide an entry
|
|
point called (say) @code{MAIN__} instead of the usual @code{main}, which
|
|
is then called by a @code{main} function in the Fortran libraries that
|
|
initializes things like Fortran I/O@. The
|
|
@code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros detect whether it is
|
|
@emph{possible} to utilize such an alternate main function, and defines
|
|
@code{F77_MAIN} and @code{FC_MAIN} to the name of the function. (If no
|
|
alternate main function name is found, @code{F77_MAIN} and @code{FC_MAIN} are
|
|
simply defined to @code{main}.)
|
|
|
|
Thus, when calling Fortran routines from C that perform things like I/O,
|
|
one should use this macro and declare the "main" function like so:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
int F77_MAIN (int argc, char *argv[]);
|
|
@end example
|
|
|
|
(Again, replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
|
|
|
|
The result of this macro is cached in the @code{ac_cv_f77_main} or
|
|
@code{ac_cv_fc_main} variable, respectively.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_WRAPPERS
|
|
@defmacx AC_FC_WRAPPERS
|
|
@acindex{F77_WRAPPERS}
|
|
@cvindex F77_FUNC
|
|
@cvindex F77_FUNC_
|
|
@acindex{FC_WRAPPERS}
|
|
@cvindex FC_FUNC
|
|
@cvindex FC_FUNC_
|
|
@caindex f77_mangling
|
|
@caindex fc_mangling
|
|
Defines C macros @code{F77_FUNC (name, NAME)}, @code{FC_FUNC (name, NAME)},
|
|
@code{F77_FUNC_(name, NAME)}, and @code{FC_FUNC_(name, NAME)} to properly
|
|
mangle the names of C/C++ identifiers, and identifiers with underscores,
|
|
respectively, so that they match the name-mangling scheme used by the
|
|
Fortran compiler.
|
|
|
|
Fortran is case-insensitive, and in order to achieve this the Fortran
|
|
compiler converts all identifiers into a canonical case and format. To
|
|
call a Fortran subroutine from C or to write a C function that is
|
|
callable from Fortran, the C program must explicitly use identifiers in
|
|
the format expected by the Fortran compiler. In order to do this, one
|
|
simply wraps all C identifiers in one of the macros provided by
|
|
@code{AC_F77_WRAPPERS} or @code{AC_FC_WRAPPERS}. For example, suppose
|
|
you have the following Fortran 77 subroutine:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
|
|
subroutine foobar (x, y)
|
|
double precision x, y
|
|
y = 3.14159 * x
|
|
return
|
|
end
|
|
@end example
|
|
|
|
You would then declare its prototype in C or C++ as:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
|
|
#define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
|
|
#ifdef __cplusplus
|
|
extern "C" /* prevent C++ name mangling */
|
|
#endif
|
|
void FOOBAR_F77 (double *x, double *y);
|
|
@end example
|
|
|
|
Note that we pass both the lowercase and uppercase versions of the
|
|
function name to @code{F77_FUNC} so that it can select the right one.
|
|
Note also that all parameters to Fortran 77 routines are passed as
|
|
pointers (@pxref{Mixing Fortran 77 With C and C++, , , automake, GNU
|
|
Automake}).
|
|
|
|
(Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
|
|
|
|
Although Autoconf tries to be intelligent about detecting the
|
|
name-mangling scheme of the Fortran compiler, there may be Fortran
|
|
compilers that it doesn't support yet. In this case, the above code
|
|
generates a compile-time error, but some other behavior
|
|
(e.g., disabling Fortran-related features) can be induced by checking
|
|
whether @code{F77_FUNC} or @code{FC_FUNC} is defined.
|
|
|
|
Now, to call that routine from a C program, we would do something like:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
|
|
@{
|
|
double x = 2.7183, y;
|
|
FOOBAR_F77 (&x, &y);
|
|
@}
|
|
@end example
|
|
|
|
If the Fortran identifier contains an underscore (e.g., @code{foo_bar}),
|
|
you should use @code{F77_FUNC_} or @code{FC_FUNC_} instead of
|
|
@code{F77_FUNC} or @code{FC_FUNC} (with the same arguments). This is
|
|
because some Fortran compilers mangle names differently if they contain
|
|
an underscore.
|
|
|
|
The name mangling scheme is encoded in the @code{ac_cv_f77_mangling} or
|
|
@code{ac_cv_fc_mangling} cache variable, respectively, and also used for
|
|
the @code{AC_F77_FUNC} and @code{AC_FC_FUNC} macros described below.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_FUNC (@var{name}, @ovar{shellvar})
|
|
@defmacx AC_FC_FUNC (@var{name}, @ovar{shellvar})
|
|
@acindex{F77_FUNC}
|
|
@acindex{FC_FUNC}
|
|
Given an identifier @var{name}, set the shell variable @var{shellvar} to
|
|
hold the mangled version @var{name} according to the rules of the
|
|
Fortran linker (see also @code{AC_F77_WRAPPERS} or
|
|
@code{AC_FC_WRAPPERS}). @var{shellvar} is optional; if it is not
|
|
supplied, the shell variable is simply @var{name}. The purpose of
|
|
this macro is to give the caller a way to access the name-mangling
|
|
information other than through the C preprocessor as above, for example,
|
|
to call Fortran routines from some language other than C/C++.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_SRCEXT (@var{ext}, @ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@defmacx AC_FC_PP_SRCEXT (@var{ext}, @ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_SRCEXT}
|
|
@acindex{FC_PP_SRCEXT}
|
|
@caindex fc_srcext_@var{ext}
|
|
@caindex fc_pp_srcext_@var{ext}
|
|
By default, the @code{FC} macros perform their tests using a @file{.f}
|
|
extension for source-code files. Some compilers, however, only enable
|
|
newer language features for appropriately named files, e.g., Fortran 90
|
|
features only for @file{.f90} files, or preprocessing only with
|
|
@file{.F} files or maybe other upper-case extensions. On the other
|
|
hand, some other compilers expect all source files to end in @file{.f}
|
|
and require special flags to support other file name extensions. The
|
|
@code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros deal with these
|
|
issues.
|
|
|
|
The @code{AC_FC_SRCEXT} macro tries to get the @code{FC} compiler to
|
|
accept files ending with the extension @file{.@var{ext}} (i.e.,
|
|
@var{ext} does @emph{not} contain the dot). If any special compiler
|
|
flags are needed for this, it stores them in the output variable
|
|
@code{FCFLAGS_@var{ext}}. This extension and these flags are then used
|
|
for all subsequent @code{FC} tests (until @code{AC_FC_SRCEXT} or
|
|
@code{AC_FC_PP_SRCEXT} is called another time).
|
|
|
|
For example, you would use @code{AC_FC_SRCEXT(f90)} to employ the
|
|
@file{.f90} extension in future tests, and it would set the
|
|
@code{FCFLAGS_f90} output variable with any extra flags that are needed
|
|
to compile such files.
|
|
|
|
Similarly, the @code{AC_FC_PP_SRCEXT} macro tries to get the @code{FC}
|
|
compiler to preprocess and compile files with the extension
|
|
@file{.@var{ext}}. When both @command{fpp} and @command{cpp} style
|
|
preprocessing are provided, the former is preferred, as the latter may
|
|
treat continuation lines, @code{//} tokens, and white space differently
|
|
from what some Fortran dialects expect. Conversely, if you do not want
|
|
files to be preprocessed, use only lower-case characters in the file
|
|
name extension. Like with @code{AC_FC_SRCEXT(f90)}, any needed flags
|
|
are stored in the @code{FCFLAGS_@var{ext}} variable.
|
|
|
|
The @code{FCFLAGS_@var{ext}} flags can @emph{not} be simply absorbed
|
|
into @code{FCFLAGS}, for two reasons based on the limitations of some
|
|
compilers. First, only one @code{FCFLAGS_@var{ext}} can be used at a
|
|
time, so files with different extensions must be compiled separately.
|
|
Second, @code{FCFLAGS_@var{ext}} must appear @emph{immediately} before
|
|
the source-code file name when compiling. So, continuing the example
|
|
above, you might compile a @file{foo.f90} file in your makefile with the
|
|
command:
|
|
|
|
@example
|
|
foo.o: foo.f90
|
|
$(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90'
|
|
@end example
|
|
|
|
If @code{AC_FC_SRCEXT} or @code{AC_FC_PP_SRCEXT} succeeds in compiling
|
|
files with the @var{ext} extension, it calls @var{action-if-success}
|
|
(defaults to nothing). If it fails, and cannot find a way to make the
|
|
@code{FC} compiler accept such files, it calls @var{action-if-failure}
|
|
(defaults to exiting with an error message).
|
|
|
|
The @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros cache their
|
|
results in @code{ac_cv_fc_srcext_@var{ext}} and
|
|
@code{ac_cv_fc_pp_srcext_@var{ext}} variables, respectively.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_PP_DEFINE (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_PP_DEFINE}
|
|
@caindex fc_pp_define
|
|
|
|
Find a flag to specify defines for preprocessed Fortran. Not all
|
|
Fortran compilers use @option{-D}. Substitute @code{FC_DEFINE} with
|
|
the result and call @var{action-if-success} (defaults to nothing) if
|
|
successful, and @var{action-if-failure} (defaults to failing with an
|
|
error message) if not.
|
|
|
|
This macro calls @code{AC_FC_PP_SRCEXT([F])} in order to learn how to
|
|
preprocess a @file{conftest.F} file, but restores a previously used
|
|
Fortran source file extension afterwards again.
|
|
|
|
The result of this test is cached in the @code{ac_cv_fc_pp_define}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_FREEFORM (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_FREEFORM}
|
|
@caindex fc_freeform
|
|
|
|
Try to ensure that the Fortran compiler (@code{$FC}) allows free-format
|
|
source code (as opposed to the older fixed-format style from Fortran
|
|
77). If necessary, it may add some additional flags to @code{FCFLAGS}.
|
|
|
|
This macro is most important if you are using the default @file{.f}
|
|
extension, since many compilers interpret this extension as indicating
|
|
fixed-format source unless an additional flag is supplied. If you
|
|
specify a different extension with @code{AC_FC_SRCEXT}, such as
|
|
@file{.f90}, then @code{AC_FC_FREEFORM} ordinarily succeeds without
|
|
modifying @code{FCFLAGS}. For extensions which the compiler does not
|
|
know about, the flag set by the @code{AC_FC_SRCEXT} macro might let
|
|
the compiler assume Fortran 77 by default, however.
|
|
|
|
If @code{AC_FC_FREEFORM} succeeds in compiling free-form source, it
|
|
calls @var{action-if-success} (defaults to nothing). If it fails, it
|
|
calls @var{action-if-failure} (defaults to exiting with an error
|
|
message).
|
|
|
|
The result of this test, or @samp{none} or @samp{unknown}, is cached in
|
|
the @code{ac_cv_fc_freeform} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_FIXEDFORM (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_FIXEDFORM}
|
|
@caindex fc_fixedform
|
|
|
|
Try to ensure that the Fortran compiler (@code{$FC}) allows the old
|
|
fixed-format source code (as opposed to free-format style). If
|
|
necessary, it may add some additional flags to @code{FCFLAGS}.
|
|
|
|
This macro is needed for some compilers alias names like @command{xlf95}
|
|
which assume free-form source code by default, and in case you want to
|
|
use fixed-form source with an extension like @file{.f90} which many
|
|
compilers interpret as free-form by default. If you specify a different
|
|
extension with @code{AC_FC_SRCEXT}, such as @file{.f}, then
|
|
@code{AC_FC_FIXEDFORM} ordinarily succeeds without modifying
|
|
@code{FCFLAGS}.
|
|
|
|
If @code{AC_FC_FIXEDFORM} succeeds in compiling fixed-form source, it
|
|
calls @var{action-if-success} (defaults to nothing). If it fails, it
|
|
calls @var{action-if-failure} (defaults to exiting with an error
|
|
message).
|
|
|
|
The result of this test, or @samp{none} or @samp{unknown}, is cached in
|
|
the @code{ac_cv_fc_fixedform} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_LINE_LENGTH (@ovar{length}, @ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_LINE_LENGTH}
|
|
@caindex fc_line_length
|
|
|
|
Try to ensure that the Fortran compiler (@code{$FC}) accepts long source
|
|
code lines. The @var{length} argument may be given as 80, 132, or
|
|
unlimited, and defaults to 132. Note that line lengths above 250
|
|
columns are not portable, and some compilers do not accept more than 132
|
|
columns at least for fixed format source. If necessary, it may add some
|
|
additional flags to @code{FCFLAGS}.
|
|
|
|
If @code{AC_FC_LINE_LENGTH} succeeds in compiling fixed-form source, it
|
|
calls @var{action-if-success} (defaults to nothing). If it fails, it
|
|
calls @var{action-if-failure} (defaults to exiting with an error
|
|
message).
|
|
|
|
The result of this test, or @samp{none} or @samp{unknown}, is cached in
|
|
the @code{ac_cv_fc_line_length} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_CHECK_BOUNDS (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_CHECK_BOUNDS}
|
|
@caindex fc_check_bounds
|
|
|
|
The @code{AC_FC_CHECK_BOUNDS} macro tries to enable array bounds checking
|
|
in the Fortran compiler. If successful, the @var{action-if-success}
|
|
is called and any needed flags are added to @code{FCFLAGS}. Otherwise,
|
|
@var{action-if-failure} is called, which defaults to failing with an error
|
|
message. The macro currently requires Fortran 90 or a newer dialect.
|
|
|
|
The result of the macro is cached in the @code{ac_cv_fc_check_bounds}
|
|
variable.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_IMPLICIT_NONE (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@defmacx AC_FC_IMPLICIT_NONE (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{F77_IMPLICIT_NONE}
|
|
@acindex{FC_IMPLICIT_NONE}
|
|
@caindex f77_implicit_none
|
|
@caindex fc_implicit_none
|
|
|
|
Try to disallow implicit declarations in the Fortran compiler. If
|
|
successful, @var{action-if-success} is called and any needed flags
|
|
are added to @code{FFLAGS} or @code{FCFLAGS}, respectively. Otherwise,
|
|
@var{action-if-failure} is called, which defaults to failing with an error
|
|
message.
|
|
|
|
The result of these macros are cached in the
|
|
@code{ac_cv_f77_implicit_none} and @code{ac_cv_fc_implicit_none}
|
|
variables, respectively.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_MODULE_EXTENSION
|
|
@acindex{FC_MODULE_EXTENSION}
|
|
@caindex fc_module_ext
|
|
@ovindex FC_MODEXT
|
|
|
|
Find the Fortran 90 module file name extension. Most Fortran 90
|
|
compilers store module information in files separate from the object
|
|
files. The module files are usually named after the name of the module
|
|
rather than the source file name, with characters possibly turned to
|
|
upper case, plus an extension, often @file{.mod}.
|
|
|
|
Not all compilers use module files at all, or by default. The Cray
|
|
Fortran compiler requires @option{-e m} in order to store and search
|
|
module information in @file{.mod} files rather than in object files.
|
|
Likewise, the Fujitsu Fortran compilers uses the @option{-Am} option to
|
|
indicate how module information is stored.
|
|
|
|
The @code{AC_FC_MODULE_EXTENSION} macro computes the module extension
|
|
without the leading dot, and stores that in the @code{FC_MODEXT}
|
|
variable. If the compiler does not produce module files, or the
|
|
extension cannot be determined, @code{FC_MODEXT} is empty. Typically,
|
|
the result of this macro may be used in cleanup @command{make} rules as
|
|
follows:
|
|
|
|
@example
|
|
clean-modules:
|
|
-test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)
|
|
@end example
|
|
|
|
The extension, or @samp{unknown}, is cached in the
|
|
@code{ac_cv_fc_module_ext} variable.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_MODULE_FLAG (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_MODULE_FLAG}
|
|
@caindex fc_module_flag
|
|
@ovindex FC_MODINC
|
|
@ovindex ac_empty
|
|
|
|
Find the compiler flag to include Fortran 90 module information from
|
|
another directory, and store that in the @code{FC_MODINC} variable.
|
|
Call @var{action-if-success} (defaults to nothing) if successful, and
|
|
set @code{FC_MODINC} to empty and call @var{action-if-failure} (defaults
|
|
to exiting with an error message) if not.
|
|
|
|
Most Fortran 90 compilers provide a way to specify module directories.
|
|
Some have separate flags for the directory to write module files to,
|
|
and directories to search them in, whereas others only allow writing to
|
|
the current directory or to the first directory specified in the include
|
|
path. Further, with some compilers, the module search path and the
|
|
preprocessor search path can only be modified with the same flag. Thus,
|
|
for portability, write module files to the current directory only and
|
|
list that as first directory in the search path.
|
|
|
|
There may be no whitespace between @code{FC_MODINC} and the following
|
|
directory name, but @code{FC_MODINC} may contain trailing white space.
|
|
For example, if you use Automake and would like to search @file{../lib}
|
|
for module files, you can use the following:
|
|
|
|
@example
|
|
AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib
|
|
@end example
|
|
|
|
Inside @command{configure} tests, you can use:
|
|
|
|
@example
|
|
if test -n "$FC_MODINC"; then
|
|
FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
|
|
fi
|
|
@end example
|
|
|
|
The flag is cached in the @code{ac_cv_fc_module_flag} variable.
|
|
The substituted value of @code{FC_MODINC} may refer to the
|
|
@code{ac_empty} dummy placeholder empty variable, to avoid losing
|
|
the significant trailing whitespace in a @file{Makefile}.
|
|
@end defmac
|
|
|
|
@defmac AC_FC_MODULE_OUTPUT_FLAG (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{FC_MODULE_OUTPUT_FLAG}
|
|
@caindex fc_module_output_flag
|
|
@ovindex FC_MODOUT
|
|
|
|
Find the compiler flag to write Fortran 90 module information to
|
|
another directory, and store that in the @code{FC_MODOUT} variable.
|
|
Call @var{action-if-success} (defaults to nothing) if successful, and
|
|
set @code{FC_MODOUT} to empty and call @var{action-if-failure} (defaults
|
|
to exiting with an error message) if not.
|
|
|
|
Not all Fortran 90 compilers write module files, and of those that do,
|
|
not all allow writing to a directory other than the current one, nor
|
|
do all have separate flags for writing and reading; see the description
|
|
of @code{AC_FC_MODULE_FLAG} above. If you need to be able to write to
|
|
another directory, for maximum portability use @code{FC_MODOUT} before
|
|
any @code{FC_MODINC} and include both the current directory and the one
|
|
you write to in the search path:
|
|
|
|
@example
|
|
AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). @dots{}
|
|
@end example
|
|
|
|
The flag is cached in the @code{ac_cv_fc_module_output_flag} variable.
|
|
The substituted value of @code{FC_MODOUT} may refer to the
|
|
@code{ac_empty} dummy placeholder empty variable, to avoid losing
|
|
the significant trailing whitespace in a @file{Makefile}.
|
|
@end defmac
|
|
|
|
@defmac AC_F77_CRAY_POINTERS (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@defmacx AC_FC_CRAY_POINTERS (@ovar{action-if-success}, @
|
|
@dvar{action-if-failure, AC_MSG_FAILURE})
|
|
@acindex{F77_CRAY_POINTERS}
|
|
@acindex{FC_CRAY_POINTERS}
|
|
@caindex fc_cray_pointer
|
|
|
|
Try to ensure that the Fortran compiler (@code{$F77} or @code{$FC})
|
|
accepts Cray pointers. If successful, the @var{action-if-success} is
|
|
called and any needed flags are added to @code{FFLAGS} or
|
|
@code{FCFLAGS}. Otherwise, @var{action-if-failure} is called, which
|
|
defaults to failing with an error message.
|
|
|
|
Cray pointers are a non-standard extension supported by many Fortran
|
|
compilers which allow an integer to be declared as C-like pointer to
|
|
a target variable.
|
|
|
|
The result of this test, or @samp{none} or @samp{unknown}, is cached in
|
|
the @code{ac_cv_f77_cray_ptr} or @code{ac_cv_fc_cray_ptr} variable.
|
|
@end defmac
|
|
|
|
|
|
@node Go Compiler
|
|
@subsection Go Compiler Characteristics
|
|
@cindex Go
|
|
|
|
Autoconf provides basic support for the Go programming language when
|
|
using the @code{gccgo} compiler (there is currently no support for the
|
|
@code{6g} and @code{8g} compilers).
|
|
|
|
@defmac AC_PROG_GO (@ovar{compiler-search-list})
|
|
Find the Go compiler to use. Check whether the environment variable
|
|
@code{GOC} is set; if so, then set output variable @code{GOC} to its
|
|
value.
|
|
|
|
Otherwise, if the macro is invoked without an argument, then search for
|
|
a Go compiler named @code{gccgo}. If it is not found, then as a last
|
|
resort set @code{GOC} to @code{gccgo}.
|
|
|
|
This macro may be invoked with an optional first argument which, if
|
|
specified, must be a blank-separated list of Go compilers to search for.
|
|
|
|
If output variable @code{GOFLAGS} was not already set, set it to
|
|
@option{-g -O2}. If your package does not like this default,
|
|
@code{GOFLAGS} may be set before @code{AC_PROG_GO}.
|
|
@end defmac
|
|
|
|
|
|
@node System Services
|
|
@section System Services
|
|
|
|
The following macros check for operating system services or capabilities.
|
|
|
|
@anchor{AC_PATH_X}
|
|
@defmac AC_PATH_X
|
|
@acindex{PATH_X}
|
|
@evindex XMKMF
|
|
@cindex X Window System
|
|
Try to locate the X Window System include files and libraries. If the
|
|
user gave the command line options @option{--x-includes=@var{dir}} and
|
|
@option{--x-libraries=@var{dir}}, use those directories.
|
|
|
|
If either or both were not given, get the missing values by running
|
|
@code{xmkmf} (or an executable pointed to by the @code{XMKMF}
|
|
environment variable) on a trivial @file{Imakefile} and examining the
|
|
makefile that it produces. Setting @code{XMKMF} to @samp{false}
|
|
disables this method.
|
|
|
|
If this method fails to find the X Window System, @command{configure}
|
|
looks for the files in several directories where they often reside.
|
|
If either method is successful, set the shell variables
|
|
@code{x_includes} and @code{x_libraries} to their locations, unless they
|
|
are in directories the compiler searches by default.
|
|
|
|
If both methods fail, or the user gave the command line option
|
|
@option{--without-x}, set the shell variable @code{no_x} to @samp{yes};
|
|
otherwise set it to the empty string.
|
|
@end defmac
|
|
|
|
@anchor{AC_PATH_XTRA}
|
|
@defmac AC_PATH_XTRA
|
|
@acindex{PATH_XTRA}
|
|
@ovindex X_CFLAGS
|
|
@ovindex X_LIBS
|
|
@ovindex X_EXTRA_LIBS
|
|
@ovindex X_PRE_LIBS
|
|
@cvindex X_DISPLAY_MISSING
|
|
An enhanced version of @code{AC_PATH_X}. It adds the C compiler flags
|
|
that X needs to output variable @code{X_CFLAGS}, and the X linker flags
|
|
to @code{X_LIBS}. Define @code{X_DISPLAY_MISSING} if X is not
|
|
available.
|
|
|
|
This macro also checks for special libraries that some systems need in
|
|
order to compile X programs. It adds any that the system needs to
|
|
output variable @code{X_EXTRA_LIBS}. And it checks for special X11R6
|
|
libraries that need to be linked with before @option{-lX11}, and adds
|
|
any found to the output variable @code{X_PRE_LIBS}.
|
|
|
|
@c This is an incomplete kludge. Make a real way to do it.
|
|
@c If you need to check for other X functions or libraries yourself, then
|
|
@c after calling this macro, add the contents of @code{X_EXTRA_LIBS} to
|
|
@c @code{LIBS} temporarily, like this: (FIXME - add example)
|
|
@end defmac
|
|
|
|
@anchor{AC_SYS_INTERPRETER}
|
|
@defmac AC_SYS_INTERPRETER
|
|
@acindex{SYS_INTERPRETER}
|
|
Check whether the system supports starting scripts with a line of the
|
|
form @samp{#!/bin/sh} to select the interpreter to use for the script.
|
|
After running this macro, shell code in @file{configure.ac} can check
|
|
the shell variable @code{interpval}; it is set to @samp{yes}
|
|
if the system supports @samp{#!}, @samp{no} if not.
|
|
@end defmac
|
|
|
|
@anchor{AC_SYS_LARGEFILE}
|
|
@defmac AC_SYS_LARGEFILE
|
|
@acindex{SYS_LARGEFILE}
|
|
@cvindex _FILE_OFFSET_BITS
|
|
@cvindex _TIME_BITS
|
|
@ovindex CC
|
|
@cindex Large file support
|
|
@cindex LFS
|
|
If the default @code{off_t} type is a 32-bit integer,
|
|
and therefore cannot be used with files 2 GiB or larger,
|
|
make a wider @code{off_t} available if the system supports it.
|
|
Similarly, widen other types related to sizes of files and file systems
|
|
if possible. These types may include @code{blkcnt_t}, @code{dev_t},
|
|
@code{ino_t}, @code{fsblkcnt_t}, @code{fsfilcnt_t}, and @code{rlim_t}.
|
|
|
|
Also, arrange for a @command{configure} option @code{--enable-year2038}
|
|
to request widening the type @code{time_t} as needed to represent file
|
|
wand other timestamps after mid-January 2038. This widening is possible
|
|
only on 32-bit GNU/Linux x86 and ARM systems with glibc 2.34 or later.
|
|
If year-2038 support is requested but @command{configure} fails to find a way
|
|
to widen @code{time_t} and inspection of the system suggests that
|
|
this feature is available somehow, @command{configure} will error out.
|
|
If you want the default to be @code{--enable-year2038}, you can use
|
|
@code{AC_SYS_YEAR2038} or @code{AC_SYS_YEAR2038_RECOMMENDED}
|
|
instead of @code{AC_SYS_LARGEFILE}.
|
|
In other words, older packages that have long used @code{AC_SYS_LARGEFILE}
|
|
can have year-2038 support on 32-bit GNU/Linux x86 and ARM systems either by
|
|
regenerating @file{configure} with current Autoconf and configuring with
|
|
@option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} or
|
|
@code{AC_SYS_YEAR2038_RECOMMENDED} and configuring without
|
|
@option{--disable-year2038}.
|
|
A future version of Autoconf might change the @code{AC_SYS_LARGEFILE}
|
|
default to @code{--enable-year2038}; if and when that happens,
|
|
@code{AC_SYS_LARGEFILE} and @code{AC_SYS_YEAR2038} will become equivalent.
|
|
@xref{AC_SYS_YEAR2038}.
|
|
|
|
Set the shell variable @code{ac_have_largefile} to @samp{yes} or
|
|
@code{no} depending on whether a wide @code{off_t} is available,
|
|
regardless of whether arrangements were necessary.
|
|
Similarly, set the shell variable @code{ac_have_year2038} to @code{yes}
|
|
or @code{no} depending on whether a wide-enough @code{time_t} is available.
|
|
|
|
Define preprocessor macros if necessary to make types wider;
|
|
for example, on GNU/Linux systems the macros @code{_FILE_OFFSET_BITS}
|
|
and @code{_TIME_BITS} can be defined. Some of these macros work only if
|
|
defined before the first system header is included;
|
|
therefore, when using this macro in concert with
|
|
@code{AC_CONFIG_HEADERS}, make sure that @file{config.h} is included
|
|
before any system headers.
|
|
|
|
Large-file support can be disabled by configuring with the
|
|
@option{--disable-largefile} option, and year-2038 support can
|
|
be enabled and disabled via the @option{--enable-year2038} and
|
|
@option{--disable-year2038} options. These options have no effect on
|
|
systems where types are wide enough by default.
|
|
Large-file support is required for year-2038 support: if you configure
|
|
with @option{--disable-largefile} on a platform with 32-bit
|
|
@code{time_t}, then year-2038 support is not available.
|
|
|
|
Disabling large-file or year-2038 support can have surprising effects,
|
|
such as causing functions like @code{readdir} and @code{stat} to fail
|
|
even on a small file because its inode number or timestamp is out of range.
|
|
|
|
Regardless of whether you use this macro, portable programs should not
|
|
assume that any of the types listed above fit into a @code{long int}.
|
|
For example, it is not portable to print an arbitrary @code{off_t} or
|
|
@code{time_t} value @code{X} with @code{printf ("%ld", (long int) X)}.
|
|
|
|
The standard C library functions @code{fseek} and @code{ftell}
|
|
do not use @code{off_t}. If you need to use either of these functions,
|
|
you should use @code{AC_FUNC_FSEEKO} as well as @code{AC_SYS_LARGEFILE},
|
|
and then use their POSIX replacements @code{fseeko} and @code{ftello}.
|
|
@xref{AC_FUNC_FSEEKO}.
|
|
|
|
When using @code{AC_SYS_LARGEFILE} in different packages that are linked
|
|
together and that have interfaces that depend on the width of @code{off_t},
|
|
@code{time_t} or related types, the simplest thing is to configure all
|
|
components the same way. For example, if an application uses
|
|
@code{AC_SYS_LARGEFILE} and is configured with
|
|
@option{--enable-year2038}, libraries it links to with an @code{off_t}-
|
|
or @code{time_t}-dependent interface should be configured equivalently.
|
|
Alternatively, you can modify libraries to support both 32- and 64-bit
|
|
interfaces though this is more work and few libraries other than the C
|
|
library itself are modified in this way.
|
|
|
|
Applications and libraries should be configured compatibly.
|
|
If @code{off_t}, @code{time_t} or related types appear in a library's
|
|
public interface, enabling or disabling the library's large-file or
|
|
year-2038 support may break binary compatibility with applications or
|
|
with other libraries. Similarly, if an application links to a such a
|
|
library, enabling or disabling the application's large-file support may
|
|
break binary compatibility with that library.
|
|
@end defmac
|
|
|
|
@anchor{AC_SYS_LONG_FILE_NAMES}
|
|
@defmac AC_SYS_LONG_FILE_NAMES
|
|
@acindex{SYS_LONG_FILE_NAMES}
|
|
@cvindex HAVE_LONG_FILE_NAMES
|
|
If the system supports file names longer than 14 characters, define
|
|
@code{HAVE_LONG_FILE_NAMES}.
|
|
@end defmac
|
|
|
|
@defmac AC_SYS_POSIX_TERMIOS
|
|
@acindex{SYS_POSIX_TERMIOS}
|
|
@cindex POSIX termios headers
|
|
@cindex termios POSIX headers
|
|
@caindex sys_posix_termios
|
|
Check to see if the POSIX termios headers and functions are available on the
|
|
system. If so, set the shell variable @code{ac_cv_sys_posix_termios} to
|
|
@samp{yes}. If not, set the variable to @samp{no}.
|
|
@end defmac
|
|
|
|
@anchor{AC_SYS_YEAR2038}
|
|
@defmac AC_SYS_YEAR2038
|
|
@acindex{SYS_YEAR2038}
|
|
@cindex Year 2038
|
|
This is like @code{AC_SYS_LARGEFILE} except it defaults to enabling
|
|
instead of disabling year-2038 support. Year-2038 support for
|
|
applications and libraries should be configured compatibly.
|
|
@xref{AC_SYS_LARGEFILE}.
|
|
@end defmac
|
|
|
|
@defmac AC_SYS_YEAR2038_RECOMMENDED
|
|
@acindex{SYS_YEAR2038_RECOMMENDED}
|
|
This macro has the same effect as @code{AC_SYS_YEAR2038},
|
|
but also declares that the program being configured
|
|
should support timestamps after mid-January 2038.
|
|
If a large @code{time_t} is unavailable, @command{configure} will error
|
|
out unless the @option{--disable-year2038} option is specified.
|
|
|
|
Year-2038 support for applications and libraries should be configured
|
|
compatibly. @xref{AC_SYS_YEAR2038}.
|
|
@end defmac
|
|
|
|
@node C and POSIX Variants
|
|
@section C and POSIX Variants
|
|
|
|
The following macro makes it possible to use C language and library
|
|
extensions defined by the C standards committee, features of POSIX that
|
|
are extensions to C, and platform extensions not defined by POSIX.
|
|
|
|
@anchor{AC_USE_SYSTEM_EXTENSIONS}
|
|
@defmac AC_USE_SYSTEM_EXTENSIONS
|
|
@acindex{USE_SYSTEM_EXTENSIONS}
|
|
If possible, enable extensions to C or POSIX on hosts that normally
|
|
disable the extensions, typically due to standards-conformance namespace
|
|
issues. This should be called before any macros that run the C
|
|
compiler. Also, when using this macro in concert with
|
|
@code{AC_CONFIG_HEADERS}, be sure that @file{config.h} is included
|
|
before any system header.
|
|
|
|
Define the following preprocessor macros unconditionally:
|
|
|
|
@table @code
|
|
@item _ALL_SOURCE
|
|
@cvindex _ALL_SOURCE
|
|
Enable extensions on AIX and z/OS.
|
|
@item _DARWIN_C_SOURCE
|
|
@cvindex _DARWIN_C_SOURCE
|
|
Enable extensions on macOS.
|
|
@item _GNU_SOURCE
|
|
@cvindex _GNU_SOURCE
|
|
Enable extensions on GNU systems.
|
|
@item _NETBSD_SOURCE
|
|
@cvindex _NETBSD_SOURCE
|
|
Enable general extensions on NetBSD.
|
|
Enable NetBSD compatibility extensions on Minix.
|
|
@item _OPENBSD_SOURCE
|
|
@cvindex _OPENBSD_SOURCE
|
|
Enable OpenBSD compatibility extensions on NetBSD.
|
|
Oddly enough, this does nothing on OpenBSD.
|
|
@item _POSIX_PTHREAD_SEMANTICS
|
|
@cvindex _POSIX_PTHREAD_SEMANTICS
|
|
Enable POSIX-compatible threading on Solaris.
|
|
@item __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
|
Enable extensions specified by ISO/IEC TS 18661-5:2014.
|
|
@item __STDC_WANT_IEC_60559_BFP_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_BFP_EXT__
|
|
Enable extensions specified by ISO/IEC TS 18661-1:2014.
|
|
@item __STDC_WANT_IEC_60559_DFP_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_DFP_EXT__
|
|
Enable extensions specified by ISO/IEC TS 18661-2:2015.
|
|
@item __STDC_WANT_IEC_60559_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_EXT__
|
|
Enable extensions specified by C23 Annex F.
|
|
@item __STDC_WANT_IEC_60559_FUNCS_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_FUNCS_EXT__
|
|
Enable extensions specified by ISO/IEC TS 18661-4:2015.
|
|
@item __STDC_WANT_IEC_60559_TYPES_EXT__
|
|
@cvindex __STDC_WANT_IEC_60559_TYPES_EXT__
|
|
Enable extensions specified by C23 Annex H and by ISO/IEC TS 18661-3:2015.
|
|
@item __STDC_WANT_LIB_EXT2__
|
|
@cvindex __STDC_WANT_LIB_EXT2__
|
|
Enable extensions specified by ISO/IEC TR 24731-2:2010.
|
|
@item __STDC_WANT_MATH_SPEC_FUNCS__
|
|
@cvindex __STDC_WANT_MATH_SPEC_FUNCS__
|
|
Enable extensions specified by ISO/IEC 24747:2009.
|
|
@item _TANDEM_SOURCE
|
|
@cvindex _TANDEM_SOURCE
|
|
Enable extensions on HP NonStop systems.
|
|
@end table
|
|
|
|
The following preprocessor macros are defined only when necessary;
|
|
they enable access to extensions on some operating systems but
|
|
@emph{disable} extensions on other operating systems.
|
|
|
|
@table @code
|
|
@item __EXTENSIONS__
|
|
@cvindex __EXTENSIONS__
|
|
Enable general extensions on Solaris. This macro is defined only if
|
|
the headers included by @code{AC_INCLUDES_DEFAULT}
|
|
(@pxref{Default Includes}) work correctly with it defined.
|
|
|
|
@item _MINIX
|
|
@itemx _POSIX_SOURCE
|
|
@itemx _POSIX_1_SOURCE
|
|
@cvindex _MINIX
|
|
@cvindex _POSIX_SOURCE
|
|
@cvindex _POSIX_1_SOURCE
|
|
Defined only on MINIX. @code{_POSIX_SOURCE} and @code{_POSIX_1_SOURCE}
|
|
are needed to enable a number of POSIX features on this OS.
|
|
@code{_MINIX} does not affect the system headers' behavior;
|
|
future versions of Autoconf may stop defining it.
|
|
Programs that need to recognize Minix should use @code{AC_CANONICAL_HOST}.
|
|
|
|
@item _XOPEN_SOURCE
|
|
@cvindex _XOPEN_SOURCE
|
|
Defined (with value 500) only if needed to make @file{wchar.h} declare
|
|
@code{mbstate_t}. This is known to be necessary on some versions of HP-UX.
|
|
@end table
|
|
|
|
@cvindex __STDC_WANT_DEC_FP__
|
|
The C preprocessor macro @code{__STDC_WANT_DEC_FP__} is not defined.
|
|
ISO/IEC TR 24732:2009 was superseded by ISO/IEC TS 18661-2:2015.
|
|
|
|
@cvindex __STDC_WANT_LIB_EXT1__
|
|
The C preprocessor macro @code{__STDC_WANT_LIB_EXT1__} is not defined,
|
|
as the C standard's Annex K is problematic. See: O'Donell C, Sebor M.
|
|
@uref{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm, Field
|
|
Experience With Annex K---Bounds Checking Interfaces}.
|
|
|
|
The Autoconf macro @code{AC_USE_SYSTEM_EXTENSIONS} was introduced in
|
|
Autoconf 2.60.
|
|
@end defmac
|
|
|
|
|
|
@node Erlang Libraries
|
|
@section Erlang Libraries
|
|
@cindex Erlang, Library, checking
|
|
|
|
The following macros check for an installation of Erlang/OTP, and for the
|
|
presence of certain Erlang libraries. All those macros require the
|
|
configuration of an Erlang interpreter and an Erlang compiler
|
|
(@pxref{Erlang Compiler and Interpreter}).
|
|
|
|
@defmac AC_ERLANG_SUBST_ERTS_VER
|
|
@acindex{ERLANG_SUBST_ERTS_VER}
|
|
@ovindex ERLANG_ERTS_VER
|
|
Set the output variable @code{ERLANG_ERTS_VER} to the version of the
|
|
Erlang runtime system (as returned by Erlang's
|
|
@code{erlang:system_info(version)} function). The result of this test
|
|
is cached if caching is enabled when running @command{configure}. The
|
|
@code{ERLANG_ERTS_VER} variable is not intended to be used for testing
|
|
for features of specific ERTS versions, but to be used for substituting
|
|
the ERTS version in Erlang/OTP release resource files (@code{.rel}
|
|
files), as shown below.
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_SUBST_ROOT_DIR
|
|
@acindex{ERLANG_SUBST_ROOT_DIR}
|
|
@ovindex ERLANG_ROOT_DIR
|
|
Set the output variable @code{ERLANG_ROOT_DIR} to the path to the base
|
|
directory in which Erlang/OTP is installed (as returned by Erlang's
|
|
@code{code:root_dir/0} function). The result of this test is cached if
|
|
caching is enabled when running @command{configure}.
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_SUBST_LIB_DIR
|
|
@acindex{ERLANG_SUBST_LIB_DIR}
|
|
@ovindex ERLANG_LIB_DIR
|
|
Set the output variable @code{ERLANG_LIB_DIR} to the path of the library
|
|
directory of Erlang/OTP (as returned by Erlang's
|
|
@code{code:lib_dir/0} function), which subdirectories each contain an installed
|
|
Erlang/OTP library. The result of this test is cached if caching is enabled
|
|
when running @command{configure}.
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_CHECK_LIB (@var{library}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{ERLANG_CHECK_LIB}
|
|
@ovindex ERLANG_LIB_DIR_@var{library}
|
|
@ovindex ERLANG_LIB_VER_@var{library}
|
|
Test whether the Erlang/OTP library @var{library} is installed by
|
|
calling Erlang's @code{code:lib_dir/1} function. The result of this
|
|
test is cached if caching is enabled when running @command{configure}.
|
|
@var{action-if-found} is a list of shell commands to run if the library
|
|
is installed; @var{action-if-not-found} is a list of shell commands to
|
|
run if it is not. Additionally, if the library is installed, the output
|
|
variable @samp{ERLANG_LIB_DIR_@var{library}} is set to the path to the
|
|
library installation directory, and the output variable
|
|
@samp{ERLANG_LIB_VER_@var{library}} is set to the version number that is
|
|
part of the subdirectory name, if it is in the standard form
|
|
(@code{@var{library}-@var{version}}). If the directory name does not
|
|
have a version part, @samp{ERLANG_LIB_VER_@var{library}} is set to the
|
|
empty string. If the library is not installed,
|
|
@samp{ERLANG_LIB_DIR_@var{library}} and
|
|
@samp{ERLANG_LIB_VER_@var{library}} are set to @code{"not found"}. For
|
|
example, to check if library @code{stdlib} is installed:
|
|
|
|
@example
|
|
AC_ERLANG_CHECK_LIB([stdlib],
|
|
[AS_ECHO(["stdlib version \"$ERLANG_LIB_VER_stdlib\""])
|
|
AS_ECHO(["is installed in \"$ERLANG_LIB_DIR_stdlib\""])],
|
|
[AC_MSG_ERROR([stdlib was not found!])])
|
|
@end example
|
|
|
|
The @samp{ERLANG_LIB_VER_@var{library}} variables (set by
|
|
@code{AC_ERLANG_CHECK_LIB}) and the @code{ERLANG_ERTS_VER} variable (set
|
|
by @code{AC_ERLANG_SUBST_ERTS_VER}) are not intended to be used for
|
|
testing for features of specific versions of libraries or of the Erlang
|
|
runtime system. Those variables are intended to be substituted in
|
|
Erlang release resource files (@code{.rel} files). For instance, to
|
|
generate a @file{example.rel} file for an application depending on the
|
|
@code{stdlib} library, @file{configure.ac} could contain:
|
|
|
|
@example
|
|
AC_ERLANG_SUBST_ERTS_VER
|
|
AC_ERLANG_CHECK_LIB([stdlib],
|
|
[],
|
|
[AC_MSG_ERROR([stdlib was not found!])])
|
|
AC_CONFIG_FILES([example.rel])
|
|
@end example
|
|
|
|
@noindent
|
|
The @file{example.rel.in} file used to generate @file{example.rel}
|
|
should contain:
|
|
|
|
@example
|
|
@{release,
|
|
@{"@@PACKAGE@@", "@@VERSION@@"@},
|
|
@{erts, "@@ERLANG_ERTS_VER@@"@},
|
|
[@{stdlib, "@@ERLANG_LIB_VER_stdlib@@"@},
|
|
@{@@PACKAGE@@, "@@VERSION@@"@}]@}.
|
|
@end example
|
|
@end defmac
|
|
|
|
In addition to the above macros, which test installed Erlang libraries, the
|
|
following macros determine the paths to the directories into which newly built
|
|
Erlang libraries are to be installed:
|
|
|
|
@defmac AC_ERLANG_SUBST_INSTALL_LIB_DIR
|
|
@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
|
|
@ovindex ERLANG_INSTALL_LIB_DIR
|
|
|
|
Set the @code{ERLANG_INSTALL_LIB_DIR} output variable to the directory into
|
|
which every built Erlang library should be installed in a separate
|
|
subdirectory.
|
|
If this variable is not set in the environment when @command{configure} runs,
|
|
its default value is @code{$@{libdir@}/erlang/lib}.
|
|
@end defmac
|
|
|
|
@defmac AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (@var{library}, @var{version})
|
|
@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
|
|
@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}
|
|
|
|
Set the @samp{ERLANG_INSTALL_LIB_DIR_@var{library}} output variable to the
|
|
directory into which the built Erlang library @var{library} version
|
|
@var{version} should be installed. If this variable is not set in the
|
|
environment when @command{configure} runs, its default value is
|
|
@samp{$ERLANG_INSTALL_LIB_DIR/@var{library}-@var{version}}, the value of the
|
|
@code{ERLANG_INSTALL_LIB_DIR} variable being set by the
|
|
@code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} macro.
|
|
@end defmac
|
|
|
|
|
|
|
|
|
|
|
|
@c ========================================================= Writing Tests
|
|
|
|
@node Writing Tests
|
|
@chapter Writing Tests
|
|
|
|
If the existing feature tests don't do something you need, you have to
|
|
write new ones. These macros are the building blocks. They provide
|
|
ways for other macros to check whether various kinds of features are
|
|
available and report the results.
|
|
|
|
This chapter contains some suggestions and some of the reasons why the
|
|
existing tests are written the way they are. You can also learn a lot
|
|
about how to write Autoconf tests by looking at the existing ones. If
|
|
something goes wrong in one or more of the Autoconf tests, this
|
|
information can help you understand the assumptions behind them, which
|
|
might help you figure out how to best solve the problem.
|
|
|
|
These macros check the output of the compiler system of the current
|
|
language (@pxref{Language Choice}). They do not cache the results of
|
|
their tests for future use (@pxref{Caching Results}), because they don't
|
|
know enough about the information they are checking for to generate a
|
|
cache variable name. They also do not print any messages, for the same
|
|
reason. The checks for particular kinds of features call these macros
|
|
and do cache their results and print messages about what they're
|
|
checking for.
|
|
|
|
When you write a feature test that could be applicable to more than one
|
|
software package, the best thing to do is encapsulate it in a new macro.
|
|
@xref{Writing Autoconf Macros}, for how to do that.
|
|
|
|
@menu
|
|
* Language Choice:: Selecting which language to use for testing
|
|
* Writing Test Programs:: Forging source files for compilers
|
|
* Running the Preprocessor:: Detecting preprocessor symbols
|
|
* Running the Compiler:: Detecting language or header features
|
|
* Running the Linker:: Detecting library features
|
|
* Runtime:: Testing for runtime features
|
|
* Multiple Cases:: Tests for several possible values
|
|
@end menu
|
|
|
|
@node Language Choice
|
|
@section Language Choice
|
|
@cindex Language
|
|
|
|
Autoconf-generated @command{configure} scripts check for the C compiler and
|
|
its features by default. Packages that use other programming languages
|
|
(maybe more than one, e.g., C and C++) need to test features of the
|
|
compilers for the respective languages. The following macros determine
|
|
which programming language is used in the subsequent tests in
|
|
@file{configure.ac}.
|
|
|
|
@anchor{AC_LANG}
|
|
@defmac AC_LANG (@var{language})
|
|
@acindex{LANG}
|
|
Do compilation tests using the compiler, preprocessor, and file
|
|
extensions for the specified @var{language}.
|
|
|
|
Supported languages are:
|
|
|
|
@table @samp
|
|
@item C
|
|
Do compilation tests using @code{CC} and @code{CPP} and use extension
|
|
@file{.c} for test programs. Use compilation flags: @code{CPPFLAGS} with
|
|
@code{CPP}, and both @code{CPPFLAGS} and @code{CFLAGS} with @code{CC}.
|
|
|
|
@item C++
|
|
Do compilation tests using @code{CXX} and @code{CXXCPP} and use
|
|
extension @file{.C} for test programs. Use compilation flags:
|
|
@code{CPPFLAGS} with @code{CXXCPP}, and both @code{CPPFLAGS} and
|
|
@code{CXXFLAGS} with @code{CXX}.
|
|
|
|
@item Fortran 77
|
|
Do compilation tests using @code{F77} and use extension @file{.f} for
|
|
test programs. Use compilation flags: @code{FFLAGS}.
|
|
|
|
@item Fortran
|
|
Do compilation tests using @code{FC} and use extension @file{.f} (or
|
|
whatever has been set by @code{AC_FC_SRCEXT}) for test programs. Use
|
|
compilation flags: @code{FCFLAGS}.
|
|
|
|
@item Erlang
|
|
@ovindex ERLC
|
|
@ovindex ERL
|
|
@ovindex ERLCFLAGS
|
|
Compile and execute tests using @code{ERLC} and @code{ERL} and use extension
|
|
@file{.erl} for test Erlang modules. Use compilation flags: @code{ERLCFLAGS}.
|
|
|
|
@item Objective C
|
|
Do compilation tests using @code{OBJC} and @code{OBJCPP} and use
|
|
extension @file{.m} for test programs. Use compilation flags:
|
|
@code{CPPFLAGS} with @code{OBJCPP}, and both @code{CPPFLAGS} and
|
|
@code{OBJCFLAGS} with @code{OBJC}.
|
|
|
|
@item Objective C++
|
|
Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use
|
|
extension @file{.mm} for test programs. Use compilation flags:
|
|
@code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and
|
|
@code{OBJCXXFLAGS} with @code{OBJCXX}.
|
|
|
|
@item Go
|
|
Do compilation tests using @code{GOC} and use extension @file{.go} for
|
|
test programs. Use compilation flags @code{GOFLAGS}.
|
|
@end table
|
|
@end defmac
|
|
|
|
@anchor{AC_LANG_PUSH}
|
|
@defmac AC_LANG_PUSH (@var{language})
|
|
@acindex{LANG_PUSH}
|
|
Remember the current language (as set by @code{AC_LANG}) on a stack, and
|
|
then select the @var{language}. Use this macro and @code{AC_LANG_POP}
|
|
in macros that need to temporarily switch to a particular language.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_POP (@ovar{language})
|
|
@acindex{LANG_POP}
|
|
Select the language that is saved on the top of the stack, as set by
|
|
@code{AC_LANG_PUSH}, and remove it from the stack.
|
|
|
|
If given, @var{language} specifies the language we just @emph{quit}. It
|
|
is a good idea to specify it when it's known (which should be the
|
|
case@dots{}), since Autoconf detects inconsistencies.
|
|
|
|
@example
|
|
AC_LANG_PUSH([Fortran 77])
|
|
# Perform some tests on Fortran 77.
|
|
# @dots{}
|
|
AC_LANG_POP([Fortran 77])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_ASSERT (@var{language})
|
|
@acindex{LANG_ASSERT}
|
|
Check statically that the current language is @var{language}.
|
|
You should use this in your language specific macros
|
|
to avoid that they be called with an inappropriate language.
|
|
|
|
This macro runs only at @command{autoconf} time, and incurs no cost at
|
|
@command{configure} time. Sadly enough and because Autoconf is a two
|
|
layer language @footnote{Because M4 is not aware of Sh code,
|
|
especially conditionals, some optimizations that look nice statically
|
|
may produce incorrect results at runtime.}, the macros
|
|
@code{AC_LANG_PUSH} and @code{AC_LANG_POP} cannot be ``optimizing'',
|
|
therefore as much as possible you ought to avoid using them to wrap
|
|
your code, rather, require from the user to run the macro with a
|
|
correct current language, and check it with @code{AC_LANG_ASSERT}.
|
|
And anyway, that may help the user understand she is running a Fortran
|
|
macro while expecting a result about her Fortran 77 compiler@enddots{}
|
|
@end defmac
|
|
|
|
|
|
@defmac AC_REQUIRE_CPP
|
|
@acindex{REQUIRE_CPP}
|
|
Ensure that whichever preprocessor would currently be used for tests has
|
|
been found. Calls @code{AC_REQUIRE} (@pxref{Prerequisite Macros}) with an
|
|
argument of either @code{AC_PROG_CPP} or @code{AC_PROG_CXXCPP},
|
|
depending on which language is current.
|
|
@end defmac
|
|
|
|
|
|
@node Writing Test Programs
|
|
@section Writing Test Programs
|
|
|
|
Autoconf tests follow a common scheme: feed some program with some
|
|
input, and most of the time, feed a compiler with some source file.
|
|
This section is dedicated to these source samples.
|
|
|
|
@menu
|
|
* Guidelines:: General rules for writing test programs
|
|
* Test Functions:: Avoiding pitfalls in test programs
|
|
* Generating Sources:: Source program boilerplate
|
|
@end menu
|
|
|
|
@node Guidelines
|
|
@subsection Guidelines for Test Programs
|
|
|
|
The most important rule to follow when writing testing samples is:
|
|
|
|
@center @emph{Look for realism.}
|
|
|
|
This motto means that testing samples must be written with the same
|
|
strictness as real programs are written. In particular, you should
|
|
avoid ``shortcuts'' and simplifications.
|
|
|
|
Don't just play with the preprocessor if you want to prepare a
|
|
compilation. For instance, using @command{cpp} to check whether a header is
|
|
functional might let your @command{configure} accept a header which
|
|
causes some @emph{compiler} error. Do not hesitate to check a header with
|
|
other headers included before, especially required headers.
|
|
|
|
Make sure the symbols you use are properly defined, i.e., refrain from
|
|
simply declaring a function yourself instead of including the proper
|
|
header.
|
|
|
|
Test programs should not write to standard output. They
|
|
should exit with status 0 if the test succeeds, and with status 1
|
|
otherwise, so that success
|
|
can be distinguished easily from a core dump or other failure;
|
|
segmentation violations and other failures produce a nonzero exit
|
|
status. Unless you arrange for @code{exit} to be declared, test
|
|
programs should @code{return}, not @code{exit}, from @code{main},
|
|
because on many systems @code{exit} is not declared by default.
|
|
|
|
Test programs can use @code{#if} or @code{#ifdef} to check the values of
|
|
preprocessor macros defined by tests that have already run. For
|
|
example, if you call @code{AC_HEADER_STDBOOL}, then later on in
|
|
@file{configure.ac} you can have a test program that includes
|
|
@file{stdbool.h} conditionally:
|
|
|
|
@example
|
|
@group
|
|
#ifdef HAVE_STDBOOL_H
|
|
# include <stdbool.h>
|
|
#endif
|
|
@end group
|
|
@end example
|
|
|
|
Both @code{#if HAVE_STDBOOL_H} and @code{#ifdef HAVE_STDBOOL_H} will
|
|
work with any standard C compiler. Some developers prefer @code{#if}
|
|
because it is easier to read, while others prefer @code{#ifdef} because
|
|
it avoids diagnostics with picky compilers like GCC with the
|
|
@option{-Wundef} option.
|
|
|
|
If a test program needs to use or create a data file, give it a name
|
|
that starts with @file{conftest}, such as @file{conftest.data}. The
|
|
@command{configure} script cleans up by running @samp{rm -f -r conftest*}
|
|
after running test programs and if the script is interrupted.
|
|
|
|
@node Test Functions
|
|
@subsection Test Functions
|
|
|
|
Functions in test code should use function prototypes, introduced in C89
|
|
and required in C23.
|
|
|
|
Functions that test programs declare should also be conditionalized for
|
|
C++, which requires @samp{extern "C"} prototypes. Make sure to not
|
|
include any header files containing clashing prototypes.
|
|
|
|
@example
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
void *valloc (size_t);
|
|
@end example
|
|
|
|
If a test program calls a function with invalid parameters (just to see
|
|
whether it exists), organize the program to ensure that it never invokes
|
|
that function. You can do this by calling it in another function that is
|
|
never invoked. You can't do it by putting it after a call to
|
|
@code{exit}, because GCC version 2 knows that @code{exit}
|
|
never returns
|
|
and optimizes out any code that follows it in the same block.
|
|
|
|
If you include any header files, be sure to call the functions
|
|
relevant to them with the correct number of arguments, even if they are
|
|
just 0, to avoid compilation errors due to prototypes. GCC
|
|
version 2
|
|
has internal prototypes for several functions that it automatically
|
|
inlines; for example, @code{memcpy}. To avoid errors when checking for
|
|
them, either pass them the correct number of arguments or redeclare them
|
|
with a different return type (such as @code{char}).
|
|
|
|
|
|
@node Generating Sources
|
|
@subsection Generating Sources
|
|
|
|
Autoconf provides a set of macros that can be used to generate test
|
|
source files. They are written to be language generic, i.e., they
|
|
actually depend on the current language (@pxref{Language Choice}) to
|
|
``format'' the output properly.
|
|
|
|
|
|
@defmac AC_LANG_CONFTEST (@var{source})
|
|
@acindex{LANG_CONFTEST}
|
|
Save the @var{source} text in the current test source file:
|
|
@file{conftest.@var{extension}} where the @var{extension} depends on the
|
|
current language. As of Autoconf 2.63b, the source file also contains
|
|
the results of all of the @code{AC_DEFINE} performed so far.
|
|
|
|
Note that the @var{source} is evaluated exactly once, like regular
|
|
Autoconf macro arguments, and therefore (i) you may pass a macro
|
|
invocation, (ii) if not, be sure to double quote if needed.
|
|
|
|
The @var{source} text is expanded as an unquoted here-document, so
|
|
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
|
|
@xref{Here-Documents}.
|
|
|
|
This macro issues a warning during @command{autoconf} processing if
|
|
@var{source} does not include an expansion of the macro
|
|
@code{AC_LANG_DEFINES_PROVIDED} (note that both @code{AC_LANG_SOURCE} and
|
|
@code{AC_LANG_PROGRAM} call this macro, and thus avoid the warning).
|
|
|
|
This macro is seldom called directly, but is used under the hood by more
|
|
common macros such as @code{AC_COMPILE_IFELSE} and @code{AC_RUN_IFELSE}.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_DEFINES_PROVIDED
|
|
@acindex{LANG_DEFINES_PROVIDED}
|
|
This macro is called as a witness that the file
|
|
@file{conftest.@var{extension}} appropriate for the current language is
|
|
complete, including all previously determined results from
|
|
@code{AC_DEFINE}. This macro is seldom called directly, but exists if
|
|
you have a compelling reason to write a conftest file without using
|
|
@code{AC_LANG_SOURCE}, yet still want to avoid a syntax warning from
|
|
@code{AC_LANG_CONFTEST}.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_SOURCE (@var{source})
|
|
@acindex{LANG_SOURCE}
|
|
Expands into the @var{source}, with the definition of
|
|
all the @code{AC_DEFINE} performed so far. This macro includes an
|
|
expansion of @code{AC_LANG_DEFINES_PROVIDED}.
|
|
|
|
In many cases, you may find it more convenient to use the wrapper
|
|
@code{AC_LANG_PROGRAM}.
|
|
@end defmac
|
|
|
|
For instance, executing (observe the double quotation!):
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
|
|
AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
|
|
[https://www.example.org/])
|
|
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
|
|
[Greetings string.])
|
|
AC_LANG([C])
|
|
AC_LANG_CONFTEST(
|
|
[AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
|
|
gcc -E -dD conftest.c
|
|
@end example
|
|
|
|
@noindent
|
|
on a system with @command{gcc} installed, results in:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
|
|
@dots{}
|
|
@asis{#} 1 "conftest.c"
|
|
|
|
#define PACKAGE_NAME "Hello"
|
|
#define PACKAGE_TARNAME "hello"
|
|
#define PACKAGE_VERSION "1.0"
|
|
#define PACKAGE_STRING "Hello 1.0"
|
|
#define PACKAGE_BUGREPORT "bug-hello@@example.org"
|
|
#define PACKAGE_URL "https://www.example.org/"
|
|
#define HELLO_WORLD "Hello, World\n"
|
|
|
|
const char hw[] = "Hello, World\n";
|
|
@end example
|
|
|
|
When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE}
|
|
definitions are not automatically translated into constants in the
|
|
source code by this macro.
|
|
|
|
@defmac AC_LANG_PROGRAM (@var{prologue}, @var{body})
|
|
@acindex{LANG_PROGRAM}
|
|
Expands into a source file which consists of the @var{prologue}, and
|
|
then @var{body} as body of the main function (e.g., @code{main} in
|
|
C). Since it uses @code{AC_LANG_SOURCE}, the features of the latter are
|
|
available.
|
|
@end defmac
|
|
|
|
For instance:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
|
|
AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
|
|
[https://www.example.org/])
|
|
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
|
|
[Greetings string.])
|
|
AC_LANG_CONFTEST(
|
|
[AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
|
|
[[fputs (hw, stdout);]])])
|
|
gcc -E -dD conftest.c
|
|
@end example
|
|
|
|
@noindent
|
|
on a system with @command{gcc} installed, results in:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
|
|
@dots{}
|
|
@asis{#} 1 "conftest.c"
|
|
|
|
#define PACKAGE_NAME "Hello"
|
|
#define PACKAGE_TARNAME "hello"
|
|
#define PACKAGE_VERSION "1.0"
|
|
#define PACKAGE_STRING "Hello 1.0"
|
|
#define PACKAGE_BUGREPORT "bug-hello@@example.org"
|
|
#define PACKAGE_URL "https://www.example.org/"
|
|
#define HELLO_WORLD "Hello, World\n"
|
|
|
|
const char hw[] = "Hello, World\n";
|
|
int
|
|
main (void)
|
|
@{
|
|
fputs (hw, stdout);
|
|
;
|
|
return 0;
|
|
@}
|
|
@end example
|
|
|
|
In Erlang tests, the created source file is that of an Erlang module called
|
|
@code{conftest} (@file{conftest.erl}). This module defines and exports
|
|
at least
|
|
one @code{start/0} function, which is called to perform the test. The
|
|
@var{prologue} is optional code that is inserted between the module header and
|
|
the @code{start/0} function definition. @var{body} is the body of the
|
|
@code{start/0} function without the final period (@pxref{Runtime}, about
|
|
constraints on this function's behavior).
|
|
|
|
For instance:
|
|
|
|
@example
|
|
AC_INIT([Hello], [1.0], [bug-hello@@example.org])
|
|
AC_LANG(Erlang)
|
|
AC_LANG_CONFTEST(
|
|
[AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]],
|
|
[[io:format("~s~n", [?HELLO_WORLD])]])])
|
|
cat conftest.erl
|
|
@end example
|
|
|
|
@noindent
|
|
results in:
|
|
|
|
@example
|
|
-module(conftest).
|
|
-export([start/0]).
|
|
-define(HELLO_WORLD, "Hello, world!").
|
|
start() ->
|
|
io:format("~s~n", [?HELLO_WORLD])
|
|
.
|
|
@end example
|
|
|
|
@defmac AC_LANG_CALL (@var{prologue}, @var{function})
|
|
@acindex{LANG_CALL}
|
|
Expands into a source file which consists of the @var{prologue}, and
|
|
then a call to the @var{function} as body of the main function (e.g.,
|
|
@code{main} in C). Since it uses @code{AC_LANG_PROGRAM}, the feature
|
|
of the latter are available.
|
|
|
|
This function will probably be replaced in the future by a version
|
|
which would enable specifying the arguments. The use of this macro is
|
|
not encouraged, as it violates strongly the typing system.
|
|
|
|
This macro cannot be used for Erlang tests.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_FUNC_LINK_TRY (@var{function})
|
|
@acindex{LANG_FUNC_LINK_TRY}
|
|
Expands into a source file which uses the @var{function} in the body of
|
|
the main function (e.g., @code{main} in C). Since it uses
|
|
@code{AC_LANG_PROGRAM}, the features of the latter are available.
|
|
|
|
As @code{AC_LANG_CALL}, this macro is documented only for completeness.
|
|
It is considered to be severely broken, and in the future will be
|
|
removed in favor of actual function calls (with properly typed
|
|
arguments).
|
|
|
|
This macro cannot be used for Erlang tests.
|
|
@end defmac
|
|
|
|
@node Running the Preprocessor
|
|
@section Running the Preprocessor
|
|
|
|
Sometimes one might need to run the preprocessor on some source file.
|
|
@emph{Usually it is a bad idea}, as you typically need to @emph{compile}
|
|
your project, not merely run the preprocessor on it; therefore you
|
|
certainly want to run the compiler, not the preprocessor. Resist the
|
|
temptation of following the easiest path.
|
|
|
|
Nevertheless, if you need to run the preprocessor, then use
|
|
@code{AC_PREPROC_IFELSE}.
|
|
|
|
The macros described in this section cannot be used for tests in Erlang,
|
|
Fortran, or Go, since those languages require no preprocessor.
|
|
|
|
@anchor{AC_PREPROC_IFELSE}
|
|
@defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @
|
|
@ovar{action-if-false})
|
|
@acindex{PREPROC_IFELSE}
|
|
Run the preprocessor of the current language (@pxref{Language Choice})
|
|
on the @var{input}, run the shell commands @var{action-if-true} on
|
|
success, @var{action-if-false} otherwise.
|
|
|
|
If @var{input} is nonempty use the equivalent of
|
|
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
|
|
file; otherwise reuse the already-existing test source file.
|
|
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
|
|
The @var{input} text is expanded as an unquoted here-document, so
|
|
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
|
|
@xref{Here-Documents}.
|
|
|
|
This macro uses @code{CPPFLAGS}, but not @code{CFLAGS}, because
|
|
@option{-g}, @option{-O}, etc.@: are not valid options to many C
|
|
preprocessors.
|
|
|
|
It is customary to report unexpected failures with
|
|
@code{AC_MSG_FAILURE}. If needed, @var{action-if-true} can further access
|
|
the preprocessed output in the file @file{conftest.i}.
|
|
@end defmac
|
|
|
|
For instance:
|
|
|
|
@example
|
|
AC_INIT([Hello], [1.0], [bug-hello@@example.org])
|
|
AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
|
|
[Greetings string.])
|
|
AC_PREPROC_IFELSE(
|
|
[AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
|
|
[[fputs (hw, stdout);]])],
|
|
[AC_MSG_RESULT([OK])],
|
|
[AC_MSG_FAILURE([unexpected preprocessor failure])])
|
|
@end example
|
|
|
|
@noindent
|
|
might result in:
|
|
|
|
@example
|
|
checking for gcc... gcc
|
|
checking whether the C compiler works... yes
|
|
checking for C compiler default output file name... a.out
|
|
checking for suffix of executables...
|
|
checking whether we are cross compiling... no
|
|
checking for suffix of object files... o
|
|
checking whether the compiler supports GNU C... yes
|
|
checking whether gcc accepts -g... yes
|
|
checking for gcc option to enable C23 features... -std=gnu23
|
|
checking how to run the C preprocessor... gcc -std=gnu23 -E
|
|
OK
|
|
@end example
|
|
|
|
@sp 1
|
|
|
|
The macro @code{AC_TRY_CPP} (@pxref{Obsolete Macros}) used to play the
|
|
role of @code{AC_PREPROC_IFELSE}, but double quotes its argument, making
|
|
it impossible to use it to elaborate sources. You are encouraged to
|
|
get rid of your old use of the macro @code{AC_TRY_CPP} in favor of
|
|
@code{AC_PREPROC_IFELSE}, but, in the first place, are you sure you need
|
|
to run the @emph{preprocessor} and not the compiler?
|
|
|
|
@anchor{AC_EGREP_HEADER}
|
|
@defmac AC_EGREP_HEADER (@var{pattern}, @var{header-file}, @
|
|
@var{action-if-found}, @ovar{action-if-not-found})
|
|
@acindex{EGREP_HEADER}
|
|
@var{pattern}, after being expanded as if in a double-quoted shell string,
|
|
is an extended regular expression.
|
|
If the output of running the preprocessor on the system header file
|
|
@var{header-file} contains a line matching
|
|
@var{pattern}, execute shell commands @var{action-if-found}, otherwise
|
|
execute @var{action-if-not-found}.
|
|
|
|
See below for some problems involving this macro.
|
|
@end defmac
|
|
|
|
@anchor{AC_EGREP_CPP}
|
|
@defmac AC_EGREP_CPP (@var{pattern}, @var{program}, @
|
|
@ovar{action-if-found}, @ovar{action-if-not-found})
|
|
@acindex{EGREP_CPP}
|
|
@var{pattern}, after being expanded as if in a double-quoted shell string,
|
|
is an extended regular expression.
|
|
@var{program} is the text of a C or C++ program, which is expanded as an
|
|
unquoted here-document (@pxref{Here-Documents}). If the
|
|
output of running the preprocessor on @var{program} contains a line
|
|
matching @var{pattern}, execute shell commands
|
|
@var{action-if-found}, otherwise execute @var{action-if-not-found}.
|
|
|
|
See below for some problems involving this macro.
|
|
@end defmac
|
|
|
|
@code{AC_EGREP_CPP} and @code{AC_EGREP_HEADER} should be used with care,
|
|
as preprocessors can insert line breaks between output tokens. For
|
|
example, the preprocessor might transform this:
|
|
|
|
@example
|
|
#define MAJOR 2
|
|
#define MINOR 23
|
|
Version MAJOR . MINOR
|
|
@end example
|
|
|
|
@noindent
|
|
into this:
|
|
|
|
@example
|
|
Version
|
|
2
|
|
.
|
|
23
|
|
@end example
|
|
|
|
@noindent
|
|
Because preprocessors are allowed to insert white space, change escapes
|
|
in string constants, insert backlash-newline pairs, or do any of a number
|
|
of things that do not change the meaning of the preprocessed program, it
|
|
is better to rely on @code{AC_PREPROC_IFELSE} than to resort to
|
|
@code{AC_EGREP_CPP} or @code{AC_EGREP_HEADER}.
|
|
|
|
For more information about what can appear in portable extended regular
|
|
expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}.
|
|
|
|
@node Running the Compiler
|
|
@section Running the Compiler
|
|
|
|
To check for a syntax feature of the current language's (@pxref{Language
|
|
Choice}) compiler, such as whether it recognizes a certain keyword, or
|
|
simply to try some library feature, use @code{AC_COMPILE_IFELSE} to try
|
|
to compile a small program that uses that feature.
|
|
|
|
@defmac AC_COMPILE_IFELSE (@var{input}, @ovar{action-if-true}, @
|
|
@ovar{action-if-false})
|
|
@acindex{COMPILE_IFELSE}
|
|
Run the compiler and compilation flags of the current language
|
|
(@pxref{Language Choice}) on the @var{input}, run the shell commands
|
|
@var{action-if-true} on success, @var{action-if-false} otherwise.
|
|
|
|
If @var{input} is nonempty use the equivalent of
|
|
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
|
|
file; otherwise reuse the already-existing test source file.
|
|
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
|
|
The @var{input} text is expanded as an unquoted here-document, so
|
|
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
|
|
@xref{Here-Documents}.
|
|
|
|
It is customary to report unexpected failures with
|
|
@code{AC_MSG_FAILURE}. This macro does not try to link; use
|
|
@code{AC_LINK_IFELSE} if you need to do that (@pxref{Running the
|
|
Linker}). If needed, @var{action-if-true} can further access the
|
|
just-compiled object file @file{conftest.$OBJEXT}.
|
|
|
|
This macro uses @code{AC_REQUIRE} for the compiler associated with the
|
|
current language, which means that if the compiler has not yet been
|
|
determined, the compiler determination will be made prior to the body of
|
|
the outermost @code{AC_DEFUN} macro that triggered this macro to
|
|
expand (@pxref{Expanded Before Required}).
|
|
@end defmac
|
|
|
|
@ovindex ERL
|
|
For tests in Erlang, the @var{input} must be the source code of a module named
|
|
@code{conftest}. @code{AC_COMPILE_IFELSE} generates a @file{conftest.beam}
|
|
file that can be interpreted by the Erlang virtual machine (@code{ERL}). It is
|
|
recommended to use @code{AC_LANG_PROGRAM} to specify the test program,
|
|
to ensure that the Erlang module has the right name.
|
|
|
|
@node Running the Linker
|
|
@section Running the Linker
|
|
|
|
To check for a library, a function, or a global variable, Autoconf
|
|
@command{configure} scripts try to compile and link a small program that
|
|
uses it. This is unlike Metaconfig, which by default uses @code{nm} or
|
|
@code{ar} on the C library to try to figure out which functions are
|
|
available. Trying to link with the function is usually a more reliable
|
|
approach because it avoids dealing with the variations in the options
|
|
and output formats of @code{nm} and @code{ar} and in the location of the
|
|
standard libraries. It also allows configuring for cross-compilation or
|
|
checking a function's runtime behavior if needed. On the other hand,
|
|
it can be slower than scanning the libraries once, but accuracy is more
|
|
important than speed.
|
|
|
|
@code{AC_LINK_IFELSE} is used to compile test programs to test for
|
|
functions and global variables. It is also used by @code{AC_CHECK_LIB}
|
|
to check for libraries (@pxref{Libraries}), by adding the library being
|
|
checked for to @code{LIBS} temporarily and trying to link a small
|
|
program.
|
|
|
|
@anchor{AC_LINK_IFELSE}
|
|
@defmac AC_LINK_IFELSE (@var{input}, @ovar{action-if-true}, @
|
|
@ovar{action-if-false})
|
|
@acindex{LINK_IFELSE}
|
|
Run the compiler (and compilation flags) and the linker of the current
|
|
language (@pxref{Language Choice}) on the @var{input}, run the shell
|
|
commands @var{action-if-true} on success, @var{action-if-false}
|
|
otherwise. If needed, @var{action-if-true} can further access the
|
|
just-linked program file @file{conftest$EXEEXT}.
|
|
|
|
If @var{input} is nonempty use the equivalent of
|
|
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
|
|
file; otherwise reuse the already-existing test source file.
|
|
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
|
|
The @var{input} text is expanded as an unquoted here-document, so
|
|
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
|
|
@xref{Here-Documents}.
|
|
|
|
@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
|
|
current compilation flags.
|
|
|
|
It is customary to report unexpected failures with
|
|
@code{AC_MSG_FAILURE}. This macro does not try to execute the program;
|
|
use @code{AC_RUN_IFELSE} if you need to do that (@pxref{Runtime}).
|
|
@end defmac
|
|
|
|
The @code{AC_LINK_IFELSE} macro cannot be used for Erlang tests, since Erlang
|
|
programs are interpreted and do not require linking.
|
|
|
|
|
|
|
|
@node Runtime
|
|
@section Checking Runtime Behavior
|
|
|
|
Sometimes you need to find out how a system performs at runtime, such
|
|
as whether a given function has a certain capability or bug. If you
|
|
can, make such checks when your program runs instead of when it is
|
|
configured. You can check for things like the machine's endianness when
|
|
your program initializes itself.
|
|
|
|
If you really need to test for a runtime behavior while configuring,
|
|
you can write a test program to determine the result, and compile and
|
|
run it using @code{AC_RUN_IFELSE}. Avoid running test programs if
|
|
possible, because this prevents people from configuring your package for
|
|
cross-compiling.
|
|
|
|
@anchor{AC_RUN_IFELSE}
|
|
@defmac AC_RUN_IFELSE (@var{input}, @ovar{action-if-true}, @
|
|
@ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
|
|
@acindex{RUN_IFELSE}
|
|
Run the compiler (and compilation flags) and the linker of the current
|
|
language (@pxref{Language Choice}) on the @var{input}, then execute the
|
|
resulting program. If the program returns an exit
|
|
status of 0 when executed, run shell commands @var{action-if-true}.
|
|
Otherwise, run shell commands @var{action-if-false}.
|
|
|
|
If @var{input} is nonempty use the equivalent of
|
|
@code{AC_LANG_CONFTEST(@var{input})} to generate the current test source
|
|
file; otherwise reuse the already-existing test source file.
|
|
The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
|
|
The @var{input} text is expanded as an unquoted here-document, so
|
|
@samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped.
|
|
@xref{Here-Documents}.
|
|
|
|
@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
|
|
compilation flags of the current language (@pxref{Language Choice}).
|
|
Additionally, @var{action-if-true} can run @command{./conftest$EXEEXT}
|
|
for further testing.
|
|
|
|
In the @var{action-if-false} section, the failing exit status is
|
|
available in the shell variable @samp{$?}. This exit status might be
|
|
that of a failed compilation, or it might be that of a failed program
|
|
execution.
|
|
|
|
If cross-compilation mode is enabled (this is the case if either the
|
|
compiler being used does not produce executables that run on the system
|
|
where @command{configure} is being run, or if the options @code{--build}
|
|
and @code{--host} were both specified and their values are different),
|
|
then the test program is
|
|
not run. If the optional shell commands @var{action-if-cross-compiling}
|
|
are given, those commands are run instead; typically these commands
|
|
provide pessimistic defaults that allow cross-compilation to work even
|
|
if the guess was wrong. If the fourth argument is empty or omitted, but
|
|
cross-compilation is detected, then @command{configure} prints an error
|
|
message and exits. If you want your package to be useful in a
|
|
cross-compilation scenario, you @emph{should} provide a non-empty
|
|
@var{action-if-cross-compiling} clause, as well as wrap the
|
|
@code{AC_RUN_IFELSE} compilation inside an @code{AC_CACHE_CHECK}
|
|
(@pxref{Caching Results}) which allows the user to override the
|
|
pessimistic default if needed.
|
|
|
|
It is customary to report unexpected failures with
|
|
@code{AC_MSG_FAILURE}.
|
|
@end defmac
|
|
|
|
@command{autoconf} prints a warning message when creating
|
|
@command{configure} each time it encounters a call to
|
|
@code{AC_RUN_IFELSE} with no @var{action-if-cross-compiling} argument
|
|
given. If you are not concerned about users configuring your package
|
|
for cross-compilation, you may ignore the warning. A few of the macros
|
|
distributed with Autoconf produce this warning message; but if this is a
|
|
problem for you, please report it as a bug, along with an appropriate
|
|
pessimistic guess to use instead.
|
|
|
|
To configure for cross-compiling you can also choose a value for those
|
|
parameters based on the canonical system name (@pxref{Manual
|
|
Configuration}). Alternatively, set up a test results cache file with
|
|
the correct values for the host system (@pxref{Caching Results}).
|
|
|
|
@ovindex cross_compiling
|
|
To provide a default for calls of @code{AC_RUN_IFELSE} that are embedded
|
|
in other macros, including a few of the ones that come with Autoconf,
|
|
you can test whether the shell variable @code{cross_compiling} is set to
|
|
@samp{yes}, and then use an alternate method to get the results instead
|
|
of calling the macros.
|
|
|
|
It is also permissible to temporarily assign to @code{cross_compiling}
|
|
in order to force tests to behave as though they are in a
|
|
cross-compilation environment, particularly since this provides a way to
|
|
test your @var{action-if-cross-compiling} even when you are not using a
|
|
cross-compiler.
|
|
|
|
@example
|
|
# We temporarily set cross-compile mode to force AC_COMPUTE_INT
|
|
# to use the slow link-only method
|
|
save_cross_compiling=$cross_compiling
|
|
cross_compiling=yes
|
|
AC_COMPUTE_INT([@dots{}])
|
|
cross_compiling=$save_cross_compiling
|
|
@end example
|
|
|
|
A C or C++ runtime test should be portable.
|
|
@xref{Portable C and C++}.
|
|
|
|
Erlang tests must exit themselves the Erlang VM by calling the @code{halt/1}
|
|
function: the given status code is used to determine the success of the test
|
|
(status is @code{0}) or its failure (status is different than @code{0}), as
|
|
explained above. It must be noted that data output through the standard output
|
|
(e.g., using @code{io:format/2}) may be truncated when halting the VM.
|
|
Therefore, if a test must output configuration information, it is recommended
|
|
to create and to output data into the temporary file named @file{conftest.out},
|
|
using the functions of module @code{file}. The @code{conftest.out} file is
|
|
automatically deleted by the @code{AC_RUN_IFELSE} macro. For instance, a
|
|
simplified implementation of Autoconf's @code{AC_ERLANG_SUBST_LIB_DIR}
|
|
macro is:
|
|
|
|
@example
|
|
AC_INIT([LibdirTest], [1.0], [bug-libdirtest@@example.org])
|
|
AC_ERLANG_NEED_ERL
|
|
AC_LANG(Erlang)
|
|
AC_RUN_IFELSE(
|
|
[AC_LANG_PROGRAM([], [dnl
|
|
file:write_file("conftest.out", code:lib_dir()),
|
|
halt(0)])],
|
|
[AS_ECHO(["code:lib_dir() returned: `cat conftest.out`"])],
|
|
[AC_MSG_FAILURE([test Erlang program execution failed])])
|
|
@end example
|
|
|
|
|
|
@node Multiple Cases
|
|
@section Multiple Cases
|
|
|
|
Some operations are accomplished in several possible ways, depending on
|
|
the OS variant. Checking for them essentially requires a ``case
|
|
statement''. Autoconf does not directly provide one; however, it is
|
|
easy to simulate by using a shell variable to keep track of whether a
|
|
way to perform the operation has been found yet.
|
|
|
|
Here is an example that uses the shell variable @code{fstype} to keep
|
|
track of whether the remaining cases need to be checked. Note that
|
|
since the value of @code{fstype} is under our control, we don't have to
|
|
use the longer @samp{test "x$fstype" = xno}.
|
|
|
|
@example
|
|
@group
|
|
AC_MSG_CHECKING([how to get file system type])
|
|
fstype=no
|
|
# The order of these tests is important.
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h>
|
|
#include <sys/fstyp.h>
|
|
]])],
|
|
[AC_DEFINE([FSTYPE_STATVFS], [1],
|
|
[Define if statvfs exists.])
|
|
fstype=SVR4])
|
|
AS_IF([test $fstype = no],
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
|
|
#include <sys/fstyp.h>
|
|
]])],
|
|
[AC_DEFINE([FSTYPE_USG_STATFS], [1],
|
|
[Define if USG statfs.])
|
|
fstype=SVR3])])
|
|
AS_IF([test $fstype = no],
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
|
|
#include <sys/vmount.h>
|
|
]])],
|
|
[AC_DEFINE([FSTYPE_AIX_STATFS], [1],
|
|
[Define if AIX statfs.])
|
|
fstype=AIX])])
|
|
# (more cases omitted here)
|
|
AC_MSG_RESULT([$fstype])
|
|
@end group
|
|
@end example
|
|
|
|
@c ====================================================== Results of Tests.
|
|
|
|
@node Results
|
|
@chapter Results of Tests
|
|
|
|
Once @command{configure} has determined whether a feature exists, what can
|
|
it do to record that information? There are four sorts of things it can
|
|
do: define a C preprocessor symbol, set a variable in the output files,
|
|
save the result in a cache file for future @command{configure} runs, and
|
|
print a message letting the user know the result of the test.
|
|
|
|
@menu
|
|
* Defining Symbols:: Defining C preprocessor symbols
|
|
* Setting Output Variables:: Replacing variables in output files
|
|
* Special Chars in Variables:: Characters to beware of in variables
|
|
* Caching Results:: Speeding up subsequent @command{configure} runs
|
|
* Printing Messages:: Notifying @command{configure} users
|
|
@end menu
|
|
|
|
@node Defining Symbols
|
|
@section Defining C Preprocessor Symbols
|
|
|
|
A common action to take in response to a feature test is to define a C
|
|
preprocessor symbol indicating the results of the test. That is done by
|
|
calling @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}.
|
|
|
|
By default, @code{AC_OUTPUT} places the symbols defined by these macros
|
|
into the output variable @code{DEFS}, which contains an option
|
|
@option{-D@var{symbol}=@var{value}} for each symbol defined. Unlike in
|
|
Autoconf version 1, there is no variable @code{DEFS} defined while
|
|
@command{configure} is running. To check whether Autoconf macros have
|
|
already defined a certain C preprocessor symbol, test the value of the
|
|
appropriate cache variable, as in this example:
|
|
|
|
@example
|
|
AC_CHECK_FUNC([vprintf],
|
|
[AC_DEFINE([HAVE_VPRINTF], [1],
|
|
[Define if vprintf exists.])])
|
|
AS_IF([test "x$ac_cv_func_vprintf" != xyes],
|
|
[AC_CHECK_FUNC([_doprnt],
|
|
[AC_DEFINE([HAVE_DOPRNT], [1],
|
|
[Define if _doprnt exists.])])])
|
|
@end example
|
|
|
|
If @code{AC_CONFIG_HEADERS} has been called, then instead of creating
|
|
@code{DEFS}, @code{AC_OUTPUT} creates a header file by substituting the
|
|
correct values into @code{#define} statements in a template file.
|
|
@xref{Configuration Headers}, for more information about this kind of
|
|
output.
|
|
|
|
@defmac AC_DEFINE (@var{variable}, @var{value}, @ovar{description})
|
|
@defmacx AC_DEFINE (@var{variable})
|
|
@cvindex @var{variable}
|
|
@acindex{DEFINE}
|
|
Define @var{variable} to @var{value} (verbatim), by defining a C
|
|
preprocessor macro for @var{variable}. @var{variable} should be a C
|
|
identifier, optionally suffixed by a parenthesized argument list to
|
|
define a C preprocessor macro with arguments. The macro argument list,
|
|
if present, should be a comma-separated list of C identifiers, possibly
|
|
terminated by an ellipsis @samp{...} if C99-or-later syntax is employed.
|
|
@var{variable} should not contain comments, white space, trigraphs,
|
|
backslash-newlines, universal character names, or non-ASCII
|
|
characters.
|
|
|
|
@var{value} may contain backslash-escaped newlines, which will be
|
|
preserved if you use @code{AC_CONFIG_HEADERS} but flattened if passed
|
|
via @code{@@DEFS@@} (with no effect on the compilation, since the
|
|
preprocessor sees only one line in the first place). @var{value} should
|
|
not contain raw newlines. If you are not using
|
|
@code{AC_CONFIG_HEADERS}, @var{value} should not contain any @samp{#}
|
|
characters, as @command{make} tends to eat them. To use a shell
|
|
variable, use @code{AC_DEFINE_UNQUOTED} instead.
|
|
|
|
@var{description} is only useful if you are using
|
|
@code{AC_CONFIG_HEADERS}. In this case, @var{description} is put into
|
|
the generated @file{config.h.in} as the comment before the macro define.
|
|
The following example defines the C preprocessor variable
|
|
@code{EQUATION} to be the string constant @samp{"$a > $b"}:
|
|
|
|
@example
|
|
AC_DEFINE([EQUATION], ["$a > $b"],
|
|
[Equation string.])
|
|
@end example
|
|
|
|
If neither @var{value} nor @var{description} are given, then
|
|
@var{value} defaults to 1 instead of to the empty string. This is for
|
|
backwards compatibility with older versions of Autoconf, but this usage
|
|
is obsolescent and may be withdrawn in future versions of Autoconf.
|
|
|
|
If the @var{variable} is a literal string, it is passed to
|
|
@code{m4_pattern_allow} (@pxref{Forbidden Patterns}).
|
|
|
|
If multiple @code{AC_DEFINE} statements are executed for the same
|
|
@var{variable} name (not counting any parenthesized argument list),
|
|
the last one wins.
|
|
@end defmac
|
|
|
|
@defmac AC_DEFINE_UNQUOTED (@var{variable}, @var{value}, @ovar{description})
|
|
@defmacx AC_DEFINE_UNQUOTED (@var{variable})
|
|
@acindex{DEFINE_UNQUOTED}
|
|
@cvindex @var{variable}
|
|
Like @code{AC_DEFINE}, but three shell expansions are
|
|
performed---once---on @var{variable} and @var{value}: variable expansion
|
|
(@samp{$}), command substitution (@samp{`}), and backslash escaping
|
|
(@samp{\}), as if in an unquoted here-document. Single and double quote
|
|
characters in the value have no
|
|
special meaning. Use this macro instead of @code{AC_DEFINE} when
|
|
@var{variable} or @var{value} is a shell variable. Examples:
|
|
|
|
@example
|
|
AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"],
|
|
[Configuration machine file.])
|
|
AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
|
|
[getgroups return type.])
|
|
AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1],
|
|
[Translated header name.])
|
|
@end example
|
|
@end defmac
|
|
|
|
Due to a syntactical oddity of the Bourne shell, do not use
|
|
semicolons to separate @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}
|
|
calls from other macro calls or shell code; that can cause syntax errors
|
|
in the resulting @command{configure} script. Use either blanks or
|
|
newlines. That is, do this:
|
|
|
|
@example
|
|
AC_CHECK_HEADER([elf.h],
|
|
[AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
|
|
@end example
|
|
|
|
@noindent
|
|
or this:
|
|
|
|
@example
|
|
AC_CHECK_HEADER([elf.h],
|
|
[AC_DEFINE([SVR4], [1], [System V Release 4])
|
|
LIBS="-lelf $LIBS"])
|
|
@end example
|
|
|
|
@noindent
|
|
instead of this:
|
|
|
|
@example
|
|
AC_CHECK_HEADER([elf.h],
|
|
[AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
|
|
@end example
|
|
|
|
@node Setting Output Variables
|
|
@section Setting Output Variables
|
|
@cindex Output variables
|
|
|
|
Another way to record the results of tests is to set @dfn{output
|
|
variables}, which are shell variables whose values are substituted into
|
|
files that @command{configure} outputs. The two macros below create new
|
|
output variables. @xref{Preset Output Variables}, for a list of output
|
|
variables that are always available.
|
|
|
|
@defmac AC_SUBST (@var{variable}, @ovar{value})
|
|
@acindex{SUBST}
|
|
Create an output variable from a shell variable. Make @code{AC_OUTPUT}
|
|
substitute the variable @var{variable} into output files (typically one
|
|
or more makefiles). This means that @code{AC_OUTPUT}
|
|
replaces instances of @samp{@@@var{variable}@@} in input files with the
|
|
value that the shell variable @var{variable} has when @code{AC_OUTPUT}
|
|
is called. The value can contain any non-@code{NUL} character, including
|
|
newline. If you are using Automake 1.11 or newer, for newlines in values
|
|
you might want to consider using @code{AM_SUBST_NOTMAKE} to prevent
|
|
@command{automake} from adding a line @code{@var{variable} =
|
|
@@@var{variable}@@} to the @file{Makefile.in} files (@pxref{Optional, ,
|
|
Automake, automake, Other things Automake recognizes}).
|
|
|
|
Variable occurrences should not overlap: e.g., an input file should
|
|
not contain @samp{@@@var{var1}@@@var{var2}@@} if @var{var1} and @var{var2}
|
|
are variable names.
|
|
The substituted value is not rescanned for more output variables;
|
|
occurrences of @samp{@@@var{variable}@@} in the value are inserted
|
|
literally into the output file. (The algorithm uses the special marker
|
|
@code{|#_!!_#|} internally, so neither the substituted value nor the
|
|
output file may contain @code{|#_!!_#|}.)
|
|
|
|
If @var{value} is given, in addition assign it to @var{variable}.
|
|
|
|
The string @var{variable} is passed to @code{m4_pattern_allow}
|
|
(@pxref{Forbidden Patterns}). @var{variable} is not further expanded,
|
|
even if there is another macro by the same name.
|
|
@end defmac
|
|
|
|
@defmac AC_SUBST_FILE (@var{variable})
|
|
@acindex{SUBST_FILE}
|
|
Another way to create an output variable from a shell variable. Make
|
|
@code{AC_OUTPUT} insert (without substitutions) the contents of the file
|
|
named by shell variable @var{variable} into output files. This means
|
|
that @code{AC_OUTPUT} replaces instances of
|
|
@samp{@@@var{variable}@@} in output files (such as @file{Makefile.in})
|
|
with the contents of the file that the shell variable @var{variable}
|
|
names when @code{AC_OUTPUT} is called. Set the variable to
|
|
@file{/dev/null} for cases that do not have a file to insert.
|
|
This substitution occurs only when the @samp{@@@var{variable}@@} is on a
|
|
line by itself, optionally surrounded by spaces and tabs. The
|
|
substitution replaces the whole line, including the spaces, tabs, and
|
|
the terminating newline.
|
|
|
|
This macro is useful for inserting makefile fragments containing
|
|
special dependencies or other @command{make} directives for particular host
|
|
or target types into makefiles. For example, @file{configure.ac}
|
|
could contain:
|
|
|
|
@example
|
|
AC_SUBST_FILE([host_frag])
|
|
host_frag=$srcdir/conf/sun4.mh
|
|
@end example
|
|
|
|
@noindent
|
|
and then a @file{Makefile.in} could contain:
|
|
|
|
@example
|
|
@@host_frag@@
|
|
@end example
|
|
|
|
The string @var{variable} is passed to @code{m4_pattern_allow}
|
|
(@pxref{Forbidden Patterns}).
|
|
@end defmac
|
|
|
|
@cindex Precious Variable
|
|
@cindex Variable, Precious
|
|
Running @command{configure} in varying environments can be extremely
|
|
dangerous. If for instance the user runs @samp{CC=bizarre-cc
|
|
./configure}, then the cache, @file{config.h}, and many other output
|
|
files depend upon @command{bizarre-cc} being the C compiler. If
|
|
for some reason the user runs @command{./configure} again, or if it is
|
|
run via @samp{./config.status --recheck}, (@xref{Automatic Remaking},
|
|
and @pxref{config.status Invocation}), then the configuration can be
|
|
inconsistent, composed of results depending upon two different
|
|
compilers.
|
|
|
|
Environment variables that affect this situation, such as @samp{CC}
|
|
above, are called @dfn{precious variables}, and can be declared as such
|
|
by @code{AC_ARG_VAR}.
|
|
|
|
@defmac AC_ARG_VAR (@var{variable}, @var{description})
|
|
@acindex{ARG_VAR}
|
|
Declare @var{variable} is a precious variable, and include its
|
|
@var{description} in the variable section of @samp{./configure --help}.
|
|
|
|
Being precious means that
|
|
@itemize @minus
|
|
@item
|
|
@var{variable} is substituted via @code{AC_SUBST}.
|
|
|
|
@item
|
|
The value of @var{variable} when @command{configure} was launched is
|
|
saved in the cache, including if it was not specified on the command
|
|
line but via the environment. Indeed, while @command{configure} can
|
|
notice the definition of @code{CC} in @samp{./configure CC=bizarre-cc},
|
|
it is impossible to notice it in @samp{CC=bizarre-cc ./configure},
|
|
which, unfortunately, is what most users do.
|
|
|
|
We emphasize that it is the @emph{initial} value of @var{variable} which
|
|
is saved, not that found during the execution of @command{configure}.
|
|
Indeed, specifying @samp{./configure FOO=foo} and letting
|
|
@samp{./configure} guess that @code{FOO} is @code{foo} can be two
|
|
different things.
|
|
|
|
@item
|
|
@var{variable} is checked for consistency between two
|
|
@command{configure} runs. For instance:
|
|
|
|
@example
|
|
$ @kbd{./configure --silent --config-cache}
|
|
$ @kbd{CC=cc ./configure --silent --config-cache}
|
|
configure: error: 'CC' was not set in the previous run
|
|
configure: error: changes in the environment can compromise \
|
|
the build
|
|
configure: error: run 'make distclean' and/or \
|
|
'rm config.cache' and start over
|
|
@end example
|
|
|
|
@noindent
|
|
and similarly if the variable is unset, or if its content is changed.
|
|
If the content has white space changes only, then the error is degraded
|
|
to a warning only, but the old value is reused.
|
|
|
|
@item
|
|
@var{variable} is kept during automatic reconfiguration
|
|
(@pxref{config.status Invocation}) as if it had been passed as a command
|
|
line argument, including when no cache is used:
|
|
|
|
@example
|
|
$ @kbd{CC=/usr/bin/cc ./configure var=raboof --silent}
|
|
$ @kbd{./config.status --recheck}
|
|
running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
|
|
CC=/usr/bin/cc --no-create --no-recursion
|
|
@end example
|
|
@end itemize
|
|
@end defmac
|
|
|
|
@node Special Chars in Variables
|
|
@section Special Characters in Output Variables
|
|
@cindex Output variables, special characters in
|
|
|
|
Many output variables are intended to be evaluated both by
|
|
@command{make} and by the shell. Some characters are expanded
|
|
differently in these two contexts, so to avoid confusion these
|
|
variables' values should not contain any of the following characters:
|
|
|
|
@example
|
|
" # $ & ' ( ) * ; < > ? [ \ ^ ` |
|
|
@end example
|
|
|
|
Also, these variables' values should neither contain newlines, nor start
|
|
with @samp{~}, nor contain white space or @samp{:} immediately followed
|
|
by @samp{~}. The values can contain nonempty sequences of white space
|
|
characters like tabs and spaces, but each such sequence might
|
|
arbitrarily be replaced by a single space during substitution.
|
|
|
|
These restrictions apply both to the values that @command{configure}
|
|
computes, and to the values set directly by the user. For example, the
|
|
following invocations of @command{configure} are problematic, since they
|
|
attempt to use special characters within @code{CPPFLAGS} and white space
|
|
within @code{$(srcdir)}:
|
|
|
|
@example
|
|
CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'
|
|
|
|
'../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'
|
|
@end example
|
|
|
|
@node Caching Results
|
|
@section Caching Results
|
|
@cindex Cache
|
|
|
|
To avoid checking for the same features repeatedly in various
|
|
@command{configure} scripts (or in repeated runs of one script),
|
|
@command{configure} can optionally save the results of many checks in a
|
|
@dfn{cache file} (@pxref{Cache Files}). If a @command{configure} script
|
|
runs with caching enabled and finds a cache file, it reads the results
|
|
of previous runs from the cache and avoids rerunning those checks. As a
|
|
result, @command{configure} can then run much faster than if it had to
|
|
perform all of the checks every time.
|
|
|
|
@defmac AC_CACHE_VAL (@var{cache-id}, @var{commands-to-set-it})
|
|
@acindex{CACHE_VAL}
|
|
Ensure that the results of the check identified by @var{cache-id} are
|
|
available. If the results of the check were in the cache file that was
|
|
read, and @command{configure} was not given the @option{--quiet} or
|
|
@option{--silent} option, print a message saying that the result was
|
|
cached; otherwise, run the shell commands @var{commands-to-set-it}. If
|
|
the shell commands are run to determine the value, the value is
|
|
saved in the cache file just before @command{configure} creates its output
|
|
files. @xref{Cache Variable Names}, for how to choose the name of the
|
|
@var{cache-id} variable.
|
|
|
|
The @var{commands-to-set-it} @emph{must have no side effects} except for
|
|
setting the variable @var{cache-id}, see below.
|
|
@end defmac
|
|
|
|
@defmac AC_CACHE_CHECK (@var{message}, @var{cache-id}, @
|
|
@var{commands-to-set-it})
|
|
@acindex{CACHE_CHECK}
|
|
A wrapper for @code{AC_CACHE_VAL} that takes care of printing the
|
|
messages. This macro provides a convenient shorthand for the most
|
|
common way to use these macros. It calls @code{AC_MSG_CHECKING} for
|
|
@var{message}, then @code{AC_CACHE_VAL} with the @var{cache-id} and
|
|
@var{commands} arguments, and @code{AC_MSG_RESULT} with @var{cache-id}.
|
|
|
|
The @var{commands-to-set-it} @emph{must have no side effects} except for
|
|
setting the variable @var{cache-id}, see below.
|
|
@end defmac
|
|
|
|
It is common to find buggy macros using @code{AC_CACHE_VAL} or
|
|
@code{AC_CACHE_CHECK}, because people are tempted to call
|
|
@code{AC_DEFINE} in the @var{commands-to-set-it}. Instead, the code that
|
|
@emph{follows} the call to @code{AC_CACHE_VAL} should call
|
|
@code{AC_DEFINE}, by examining the value of the cache variable. For
|
|
instance, the following macro is broken:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
|
|
@group
|
|
AC_DEFUN([AC_SHELL_TRUE],
|
|
[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
|
|
[my_cv_shell_true_works=no
|
|
(true) 2>/dev/null && my_cv_shell_true_works=yes
|
|
if test "x$my_cv_shell_true_works" = xyes; then
|
|
AC_DEFINE([TRUE_WORKS], [1],
|
|
[Define if 'true(1)' works properly.])
|
|
fi])
|
|
])
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
This fails if the cache is enabled: the second time this macro is run,
|
|
@code{TRUE_WORKS} @emph{will not be defined}. The proper implementation
|
|
is:
|
|
|
|
@example
|
|
@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
|
|
@group
|
|
AC_DEFUN([AC_SHELL_TRUE],
|
|
[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
|
|
[my_cv_shell_true_works=no
|
|
(true) 2>/dev/null && my_cv_shell_true_works=yes])
|
|
if test "x$my_cv_shell_true_works" = xyes; then
|
|
AC_DEFINE([TRUE_WORKS], [1],
|
|
[Define if 'true(1)' works properly.])
|
|
fi
|
|
])
|
|
@end group
|
|
@end example
|
|
|
|
Also, @var{commands-to-set-it} should not print any messages, for
|
|
example with @code{AC_MSG_CHECKING}; do that before calling
|
|
@code{AC_CACHE_VAL}, so the messages are printed regardless of whether
|
|
the results of the check are retrieved from the cache or determined by
|
|
running the shell commands.
|
|
|
|
@menu
|
|
* Cache Variable Names:: Shell variables used in caches
|
|
* Cache Files:: Files @command{configure} uses for caching
|
|
* Cache Checkpointing:: Loading and saving the cache file
|
|
@end menu
|
|
|
|
@node Cache Variable Names
|
|
@subsection Cache Variable Names
|
|
@cindex Cache variable
|
|
|
|
The names of cache variables should have the following format:
|
|
|
|
@example
|
|
@var{package-prefix}_cv_@var{value-type}_@var{specific-value}_@ovar{additional-options}
|
|
@end example
|
|
|
|
@noindent
|
|
for example, @samp{ac_cv_header_stat_broken} or
|
|
@samp{ac_cv_prog_gcc_traditional}. The parts of the variable name are:
|
|
|
|
@table @asis
|
|
@item @var{package-prefix}
|
|
An abbreviation for your package or organization; the same prefix you
|
|
begin local Autoconf macros with, except lowercase by convention.
|
|
For cache values used by the distributed Autoconf macros, this value is
|
|
@samp{ac}.
|
|
|
|
@item @code{_cv_}
|
|
Indicates that this shell variable is a cache value. This string
|
|
@emph{must} be present in the variable name, including the leading
|
|
underscore.
|
|
|
|
@item @var{value-type}
|
|
A convention for classifying cache values, to produce a rational naming
|
|
system. The values used in Autoconf are listed in @ref{Macro Names}.
|
|
|
|
@item @var{specific-value}
|
|
Which member of the class of cache values this test applies to.
|
|
For example, which function (@samp{alloca}), program (@samp{gcc}), or
|
|
output variable (@samp{INSTALL}).
|
|
|
|
@item @var{additional-options}
|
|
Any particular behavior of the specific member that this test applies to.
|
|
For example, @samp{broken} or @samp{set}. This part of the name may
|
|
be omitted if it does not apply.
|
|
@end table
|
|
|
|
The values assigned to cache variables may not contain newlines.
|
|
Usually, their values are Boolean (@samp{yes} or @samp{no}) or the
|
|
names of files or functions; so this is not an important restriction.
|
|
@ref{Cache Variable Index} for an index of cache variables with
|
|
documented semantics.
|
|
|
|
|
|
@node Cache Files
|
|
@subsection Cache Files
|
|
|
|
A cache file is a shell script that caches the results of configure
|
|
tests run on one system so they can be shared between configure scripts
|
|
and configure runs. It is not useful on other systems. If its contents
|
|
are invalid for some reason, the user may delete or edit it, or override
|
|
documented cache variables on the @command{configure} command line.
|
|
|
|
By default, @command{configure} uses no cache file,
|
|
to avoid problems caused by accidental
|
|
use of stale cache files.
|
|
|
|
To enable caching, @command{configure} accepts @option{--config-cache} (or
|
|
@option{-C}) to cache results in the file @file{config.cache}.
|
|
Alternatively, @option{--cache-file=@var{file}} specifies that
|
|
@var{file} be the cache file. The cache file is created if it does not
|
|
exist already. When @command{configure} calls @command{configure} scripts in
|
|
subdirectories, it uses the @option{--cache-file} argument so that they
|
|
share the same cache. @xref{Subdirectories}, for information on
|
|
configuring subdirectories with the @code{AC_CONFIG_SUBDIRS} macro.
|
|
|
|
@file{config.status} only pays attention to the cache file if it is
|
|
given the @option{--recheck} option, which makes it rerun
|
|
@command{configure}.
|
|
|
|
It is wrong to try to distribute cache files for particular system types.
|
|
There is too much room for error in doing that, and too much
|
|
administrative overhead in maintaining them. For any features that
|
|
can't be guessed automatically, use the standard method of the canonical
|
|
system type and linking files (@pxref{Manual Configuration}).
|
|
|
|
The site initialization script can specify a site-wide cache file to
|
|
use, instead of the usual per-program cache. In this case, the cache
|
|
file gradually accumulates information whenever someone runs a new
|
|
@command{configure} script. (Running @command{configure} merges the new cache
|
|
results with the existing cache file.) This may cause problems,
|
|
however, if the system configuration (e.g., the installed libraries or
|
|
compilers) changes and the stale cache file is not deleted.
|
|
|
|
If @command{configure} is interrupted at the right time when it updates
|
|
a cache file outside of the build directory where the @command{configure}
|
|
script is run, it may leave behind a temporary file named after the
|
|
cache file with digits following it. You may safely delete such a file.
|
|
|
|
|
|
@node Cache Checkpointing
|
|
@subsection Cache Checkpointing
|
|
|
|
If your configure script, or a macro called from @file{configure.ac}, happens
|
|
to abort the configure process, it may be useful to checkpoint the cache
|
|
a few times at key points using @code{AC_CACHE_SAVE}. Doing so
|
|
reduces the amount of time it takes to rerun the configure script with
|
|
(hopefully) the error that caused the previous abort corrected.
|
|
|
|
@c FIXME: Do we really want to document this guy?
|
|
@defmac AC_CACHE_LOAD
|
|
@acindex{CACHE_LOAD}
|
|
Loads values from existing cache file, or creates a new cache file if a
|
|
cache file is not found. Called automatically from @code{AC_INIT}.
|
|
@end defmac
|
|
|
|
@defmac AC_CACHE_SAVE
|
|
@acindex{CACHE_SAVE}
|
|
Flushes all cached values to the cache file. Called automatically from
|
|
@code{AC_OUTPUT}, but it can be quite useful to call
|
|
@code{AC_CACHE_SAVE} at key points in @file{configure.ac}.
|
|
@end defmac
|
|
|
|
For instance:
|
|
|
|
@example
|
|
@r{ @dots{} AC_INIT, etc. @dots{}}
|
|
@group
|
|
# Checks for programs.
|
|
AC_PROG_CC
|
|
AC_PROG_AWK
|
|
@r{ @dots{} more program checks @dots{}}
|
|
AC_CACHE_SAVE
|
|
@end group
|
|
|
|
@group
|
|
# Checks for libraries.
|
|
AC_CHECK_LIB([nsl], [gethostbyname])
|
|
AC_CHECK_LIB([socket], [connect])
|
|
@r{ @dots{} more lib checks @dots{}}
|
|
AC_CACHE_SAVE
|
|
@end group
|
|
|
|
@group
|
|
# Might abort@dots{}
|
|
AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])])
|
|
AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])])
|
|
@end group
|
|
@r{ @dots{} AC_OUTPUT, etc. @dots{}}
|
|
@end example
|
|
|
|
@node Printing Messages
|
|
@section Printing Messages
|
|
@cindex Messages, from @command{configure}
|
|
|
|
@command{configure} scripts need to give users running them several kinds
|
|
of information. The following macros print messages in ways appropriate
|
|
for each kind. The arguments to all of them get enclosed in shell
|
|
double quotes, so the shell performs variable and back-quote
|
|
substitution on them.
|
|
|
|
These macros are all wrappers around the @command{printf} shell command.
|
|
They direct output to the appropriate file descriptor (@pxref{File
|
|
Descriptor Macros}).
|
|
@command{configure} scripts should rarely need to run @command{printf} directly
|
|
to print messages for the user. Using these macros makes it easy to
|
|
change how and when each kind of message is printed; such changes need
|
|
only be made to the macro definitions and all the callers change
|
|
automatically.
|
|
|
|
To diagnose static issues, i.e., when @command{autoconf} is run, see
|
|
@ref{Diagnostic Macros}.
|
|
|
|
@defmac AC_MSG_CHECKING (@var{feature-description})
|
|
@acindex{MSG_CHECKING}
|
|
Notify the user that @command{configure} is checking for a particular
|
|
feature. This macro prints a message that starts with @samp{checking }
|
|
and ends with @samp{...} and no newline. It must be followed by a call
|
|
to @code{AC_MSG_RESULT} to print the result of the check and the
|
|
newline. The @var{feature-description} should be something like
|
|
@samp{whether the Fortran compiler accepts C++ comments} or @samp{for
|
|
_Alignof}.
|
|
|
|
This macro prints nothing if @command{configure} is run with the
|
|
@option{--quiet} or @option{--silent} option.
|
|
@end defmac
|
|
|
|
@anchor{AC_MSG_RESULT}
|
|
@defmac AC_MSG_RESULT (@var{result-description})
|
|
@acindex{MSG_RESULT}
|
|
Notify the user of the results of a check. @var{result-description} is
|
|
almost always the value of the cache variable for the check, typically
|
|
@samp{yes}, @samp{no}, or a file name. This macro should follow a call
|
|
to @code{AC_MSG_CHECKING}, and the @var{result-description} should be
|
|
the completion of the message printed by the call to
|
|
@code{AC_MSG_CHECKING}.
|
|
|
|
This macro prints nothing if @command{configure} is run with the
|
|
@option{--quiet} or @option{--silent} option.
|
|
@end defmac
|
|
|
|
@anchor{AC_MSG_NOTICE}
|
|
@defmac AC_MSG_NOTICE (@var{message})
|
|
@acindex{MSG_NOTICE}
|
|
Deliver the @var{message} to the user. It is useful mainly to print a
|
|
general description of the overall purpose of a group of feature checks,
|
|
e.g.,
|
|
|
|
@example
|
|
AC_MSG_NOTICE([checking if stack overflow is detectable])
|
|
@end example
|
|
|
|
This macro prints nothing if @command{configure} is run with the
|
|
@option{--quiet} or @option{--silent} option.
|
|
@end defmac
|
|
|
|
@anchor{AC_MSG_ERROR}
|
|
@defmac AC_MSG_ERROR (@var{error-description}, @dvar{exit-status, $?/1})
|
|
@acindex{MSG_ERROR}
|
|
Notify the user of an error that prevents @command{configure} from
|
|
completing. This macro prints an error message to the standard error
|
|
output and exits @command{configure} with @var{exit-status} (@samp{$?}
|
|
by default, except that @samp{0} is converted to @samp{1}).
|
|
@var{error-description} should be something like @samp{invalid value
|
|
$HOME for \$HOME}.
|
|
|
|
The @var{error-description} should start with a lower-case letter, and
|
|
``cannot'' is preferred to ``can't''.
|
|
@end defmac
|
|
|
|
@defmac AC_MSG_FAILURE (@var{error-description}, @ovar{exit-status})
|
|
@acindex{MSG_FAILURE}
|
|
This @code{AC_MSG_ERROR} wrapper notifies the user of an error that
|
|
prevents @command{configure} from completing @emph{and} that additional
|
|
details are provided in @file{config.log}. This is typically used when
|
|
abnormal results are found during a compilation.
|
|
@end defmac
|
|
|
|
@anchor{AC_MSG_WARN}
|
|
@defmac AC_MSG_WARN (@var{problem-description})
|
|
@acindex{MSG_WARN}
|
|
Notify the @command{configure} user of a possible problem. This macro
|
|
prints the message to the standard error output; @command{configure}
|
|
continues running afterward, so macros that call @code{AC_MSG_WARN} should
|
|
provide a default (back-up) behavior for the situations they warn about.
|
|
@var{problem-description} should be something like @samp{ln -s seems to
|
|
make hard links}.
|
|
@end defmac
|
|
|
|
|
|
|
|
@c ====================================================== Programming in M4.
|
|
|
|
@node Programming in M4
|
|
@chapter Programming in M4
|
|
@cindex M4
|
|
|
|
Autoconf is written on top of two layers: @dfn{M4sugar}, which provides
|
|
convenient macros for pure M4 programming, and @dfn{M4sh}, which
|
|
provides macros dedicated to shell script generation.
|
|
|
|
As of this version of Autoconf, these two layers still contain
|
|
experimental macros, whose interface might change in the future. As a
|
|
matter of fact, @emph{anything that is not documented must not be used}.
|
|
|
|
@menu
|
|
* M4 Quotation:: Protecting macros from unwanted expansion
|
|
* Using autom4te:: The Autoconf executables backbone
|
|
* Programming in M4sugar:: Convenient pure M4 macros
|
|
* Debugging via autom4te:: Figuring out what M4 was doing
|
|
@end menu
|
|
|
|
@node M4 Quotation
|
|
@section M4 Quotation
|
|
@cindex M4 quotation
|
|
@cindex quotation
|
|
|
|
The most common problem with existing macros is an improper quotation.
|
|
This section, which users of Autoconf can skip, but which macro writers
|
|
@emph{must} read, first justifies the quotation scheme that was chosen
|
|
for Autoconf and then ends with a rule of thumb. Understanding the
|
|
former helps one to follow the latter.
|
|
|
|
@menu
|
|
* Active Characters:: Characters that change the behavior of M4
|
|
* One Macro Call:: Quotation and one macro call
|
|
* Quoting and Parameters:: M4 vs. shell parameters
|
|
* Quotation and Nested Macros:: Macros calling macros
|
|
* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
|
|
* Quadrigraphs:: Another way to escape special characters
|
|
* Balancing Parentheses:: Dealing with unbalanced parentheses
|
|
* Quotation Rule Of Thumb:: One parenthesis, one quote
|
|
@end menu
|
|
|
|
@node Active Characters
|
|
@subsection Active Characters
|
|
|
|
To fully understand where proper quotation is important, you first need
|
|
to know what the special characters are in Autoconf: @samp{#} introduces
|
|
a comment inside which no macro expansion is performed, @samp{,}
|
|
separates arguments, @samp{[} and @samp{]} are the quotes
|
|
themselves@footnote{By itself, M4 uses @samp{`} and @samp{'}; it is the
|
|
M4sugar layer that sets up the preferred quotes of @samp{[} and @samp{]}.},
|
|
@samp{(} and @samp{)} (which M4 tries to match by pairs), and finally
|
|
@samp{$} inside a macro definition.
|
|
|
|
In order to understand the delicate case of macro calls, we first have
|
|
to present some obvious failures. Below they are ``obvious-ified'',
|
|
but when you find them in real life, they are usually in disguise.
|
|
|
|
Comments, introduced by a hash and running up to the newline, are opaque
|
|
tokens to the top level: active characters are turned off, and there is
|
|
no macro expansion:
|
|
|
|
@example
|
|
# define([def], ine)
|
|
@result{}# define([def], ine)
|
|
@end example
|
|
|
|
Each time there can be a macro expansion, there is a quotation
|
|
expansion, i.e., one level of quotes is stripped:
|
|
|
|
@example
|
|
int tab[10];
|
|
@result{}int tab10;
|
|
[int tab[10];]
|
|
@result{}int tab[10];
|
|
@end example
|
|
|
|
Without this in mind, the reader might try hopelessly to use her macro
|
|
@code{array}:
|
|
|
|
@example
|
|
define([array], [int tab[10];])
|
|
array
|
|
@result{}int tab10;
|
|
[array]
|
|
@result{}array
|
|
@end example
|
|
|
|
@noindent
|
|
How can you correctly output the intended results@footnote{Using
|
|
@code{defn}.}?
|
|
|
|
|
|
@node One Macro Call
|
|
@subsection One Macro Call
|
|
|
|
Let's proceed on the interaction between active characters and macros
|
|
with this small macro, which just returns its first argument:
|
|
|
|
@example
|
|
define([car], [$1])
|
|
@end example
|
|
|
|
@noindent
|
|
The two pairs of quotes above are not part of the arguments of
|
|
@code{define}; rather, they are understood by the top level when it
|
|
tries to find the arguments of @code{define}. Therefore, assuming
|
|
@code{car} is not already defined, it is equivalent to write:
|
|
|
|
@example
|
|
define(car, $1)
|
|
@end example
|
|
|
|
@noindent
|
|
But, while it is acceptable for a @file{configure.ac} to avoid unnecessary
|
|
quotes, it is bad practice for Autoconf macros which must both be more
|
|
robust and also advocate perfect style.
|
|
|
|
At the top level, there are only two possibilities: either you
|
|
quote or you don't:
|
|
|
|
@example
|
|
car(foo, bar, baz)
|
|
@result{}foo
|
|
[car(foo, bar, baz)]
|
|
@result{}car(foo, bar, baz)
|
|
@end example
|
|
|
|
Let's pay attention to the special characters:
|
|
|
|
@example
|
|
car(#)
|
|
@error{}EOF in argument list
|
|
@end example
|
|
|
|
The closing parenthesis is hidden in the comment; with a hypothetical
|
|
quoting, the top level understood it this way:
|
|
|
|
@example
|
|
car([#)]
|
|
@end example
|
|
|
|
@noindent
|
|
Proper quotation, of course, fixes the problem:
|
|
|
|
@example
|
|
car([#])
|
|
@result{}#
|
|
@end example
|
|
|
|
Here are more examples:
|
|
|
|
@example
|
|
car(foo, bar)
|
|
@result{}foo
|
|
car([foo, bar])
|
|
@result{}foo, bar
|
|
car((foo, bar))
|
|
@result{}(foo, bar)
|
|
car([(foo], [bar)])
|
|
@result{}(foo
|
|
define([a], [b])
|
|
@result{}
|
|
car(a)
|
|
@result{}b
|
|
car([a])
|
|
@result{}b
|
|
car([[a]])
|
|
@result{}a
|
|
car([[[a]]])
|
|
@result{}[a]
|
|
@end example
|
|
|
|
@node Quoting and Parameters
|
|
@subsection Quoting and Parameters
|
|
|
|
When M4 encounters @samp{$} within a macro definition, followed
|
|
immediately by a character it recognizes (@samp{0}@dots{}@samp{9},
|
|
@samp{#}, @samp{@@}, or @samp{*}), it will perform M4 parameter
|
|
expansion. This happens regardless of how many layers of quotes the
|
|
parameter expansion is nested within, or even if it occurs in text that
|
|
will be rescanned as a comment.
|
|
|
|
@example
|
|
define([none], [$1])
|
|
@result{}
|
|
define([one], [[$1]])
|
|
@result{}
|
|
define([two], [[[$1]]])
|
|
@result{}
|
|
define([comment], [# $1])
|
|
@result{}
|
|
define([active], [ACTIVE])
|
|
@result{}
|
|
none([active])
|
|
@result{}ACTIVE
|
|
one([active])
|
|
@result{}active
|
|
two([active])
|
|
@result{}[active]
|
|
comment([active])
|
|
@result{}# active
|
|
@end example
|
|
|
|
On the other hand, since autoconf generates shell code, you often want
|
|
to output shell variable expansion, rather than performing M4 parameter
|
|
expansion. To do this, you must use M4 quoting to separate the @samp{$}
|
|
from the next character in the definition of your macro. If the macro
|
|
definition occurs in single-quoted text, then insert another level of
|
|
quoting; if the usage is already inside a double-quoted string, then
|
|
split it into concatenated strings.
|
|
|
|
@example
|
|
define([foo], [a single-quoted $[]1 definition])
|
|
@result{}
|
|
define([bar], [[a double-quoted $][1 definition]])
|
|
@result{}
|
|
foo
|
|
@result{}a single-quoted $1 definition
|
|
bar
|
|
@result{}a double-quoted $1 definition
|
|
@end example
|
|
|
|
POSIX states that M4 implementations are free to provide implementation
|
|
extensions when @samp{$@{} is encountered in a macro definition.
|
|
Autoconf reserves the longer sequence @samp{$@{@{} for use with planned
|
|
extensions that will be available in the future GNU M4 2.0,
|
|
but guarantees that all other instances of @samp{$@{} will be output
|
|
literally. Therefore, this idiom can also be used to output shell code
|
|
parameter references:
|
|
|
|
@example
|
|
define([first], [$@{1@}])first
|
|
@result{}$@{1@}
|
|
@end example
|
|
|
|
POSIX also states that @samp{$11} should expand to the first parameter
|
|
concatenated with a literal @samp{1}, although some versions of
|
|
GNU M4 expand the eleventh parameter instead. For
|
|
portability, you should only use single-digit M4 parameter expansion.
|
|
|
|
With this in mind, we can explore the cases where macros invoke
|
|
macros@enddots{}
|
|
|
|
@node Quotation and Nested Macros
|
|
@subsection Quotation and Nested Macros
|
|
|
|
The examples below use the following macros:
|
|
|
|
@example
|
|
define([car], [$1])
|
|
define([active], [ACT, IVE])
|
|
define([array], [int tab[10]])
|
|
@end example
|
|
|
|
Each additional embedded macro call introduces other possible
|
|
interesting quotations:
|
|
|
|
@example
|
|
car(active)
|
|
@result{}ACT
|
|
car([active])
|
|
@result{}ACT, IVE
|
|
car([[active]])
|
|
@result{}active
|
|
@end example
|
|
|
|
In the first case, the top level looks for the arguments of @code{car},
|
|
and finds @samp{active}. Because M4 evaluates its arguments
|
|
before applying the macro, @samp{active} is expanded, which results in:
|
|
|
|
@example
|
|
car(ACT, IVE)
|
|
@result{}ACT
|
|
@end example
|
|
|
|
@noindent
|
|
In the second case, the top level gives @samp{active} as first and only
|
|
argument of @code{car}, which results in:
|
|
|
|
@example
|
|
active
|
|
@result{}ACT, IVE
|
|
@end example
|
|
|
|
@noindent
|
|
i.e., the argument is evaluated @emph{after} the macro that invokes it.
|
|
In the third case, @code{car} receives @samp{[active]}, which results in:
|
|
|
|
@example
|
|
[active]
|
|
@result{}active
|
|
@end example
|
|
|
|
@noindent
|
|
exactly as we already saw above.
|
|
|
|
The example above, applied to a more realistic example, gives:
|
|
|
|
@example
|
|
car(int tab[10];)
|
|
@result{}int tab10;
|
|
car([int tab[10];])
|
|
@result{}int tab10;
|
|
car([[int tab[10];]])
|
|
@result{}int tab[10];
|
|
@end example
|
|
|
|
@noindent
|
|
Huh? The first case is easily understood, but why is the second wrong,
|
|
and the third right? To understand that, you must know that after
|
|
M4 expands a macro, the resulting text is immediately subjected
|
|
to macro expansion and quote removal. This means that the quote removal
|
|
occurs twice---first before the argument is passed to the @code{car}
|
|
macro, and second after the @code{car} macro expands to the first
|
|
argument.
|
|
|
|
As the author of the Autoconf macro @code{car}, you then consider it to
|
|
be incorrect that your users have to double-quote the arguments of
|
|
@code{car}, so you ``fix'' your macro. Let's call it @code{qar} for
|
|
quoted car:
|
|
|
|
@example
|
|
define([qar], [[$1]])
|
|
@end example
|
|
|
|
@noindent
|
|
and check that @code{qar} is properly fixed:
|
|
|
|
@example
|
|
qar([int tab[10];])
|
|
@result{}int tab[10];
|
|
@end example
|
|
|
|
@noindent
|
|
Ahhh! That's much better.
|
|
|
|
But note what you've done: now that the result of @code{qar} is always
|
|
a literal string, the only time a user can use nested macros is if she
|
|
relies on an @emph{unquoted} macro call:
|
|
|
|
@example
|
|
qar(active)
|
|
@result{}ACT
|
|
qar([active])
|
|
@result{}active
|
|
@end example
|
|
|
|
@noindent
|
|
leaving no way for her to reproduce what she used to do with @code{car}:
|
|
|
|
@example
|
|
car([active])
|
|
@result{}ACT, IVE
|
|
@end example
|
|
|
|
@noindent
|
|
Worse yet: she wants to use a macro that produces a set of @code{cpp}
|
|
macros:
|
|
|
|
@example
|
|
define([my_includes], [#include <stdio.h>])
|
|
car([my_includes])
|
|
@result{}#include <stdio.h>
|
|
qar(my_includes)
|
|
@error{}EOF in argument list
|
|
@end example
|
|
|
|
This macro, @code{qar}, because it double quotes its arguments, forces
|
|
its users to leave their macro calls unquoted, which is dangerous.
|
|
Commas and other active symbols are interpreted by M4 before
|
|
they are given to the macro, often not in the way the users expect.
|
|
Also, because @code{qar} behaves differently from the other macros,
|
|
it's an exception that should be avoided in Autoconf.
|
|
|
|
@node Changequote is Evil
|
|
@subsection @code{changequote} is Evil
|
|
@cindex @code{changequote}
|
|
|
|
The temptation is often high to bypass proper quotation, in particular
|
|
when it's late at night. Then, many experienced Autoconf hackers
|
|
finally surrender to the dark side of the force and use the ultimate
|
|
weapon: @code{changequote}.
|
|
|
|
The M4 builtin @code{changequote} belongs to a set of primitives that
|
|
allow one to adjust the syntax of the language to adjust it to one's
|
|
needs. For instance, by default M4 uses @samp{`} and @samp{'} as
|
|
quotes, but in the context of shell programming (and actually of most
|
|
programming languages), that's about the worst choice one can make:
|
|
because of strings and back-quoted expressions in shell code (such as
|
|
@samp{'this'} and @samp{`that`}), and because of literal characters in usual
|
|
programming languages (as in @samp{'0'}), there are many unbalanced
|
|
@samp{`} and @samp{'}. Proper M4 quotation then becomes a nightmare, if
|
|
not impossible. In order to make M4 useful in such a context, its
|
|
designers have equipped it with @code{changequote}, which makes it
|
|
possible to choose another pair of quotes. M4sugar, M4sh, Autoconf, and
|
|
Autotest all have chosen to use @samp{[} and @samp{]}. Not especially
|
|
because they are unlikely characters, but @emph{because they are
|
|
characters unlikely to be unbalanced}.
|
|
|
|
There are other magic primitives, such as @code{changecom} to specify
|
|
what syntactic forms are comments (it is common to see
|
|
@samp{changecom(<!--, -->)} when M4 is used to produce HTML pages),
|
|
@code{changeword} and @code{changesyntax} to change other syntactic
|
|
details (such as the character to denote the @var{n}th argument, @samp{$} by
|
|
default, the parentheses around arguments, etc.).
|
|
|
|
These primitives are really meant to make M4 more useful for specific
|
|
domains: they should be considered like command line options:
|
|
@option{--quotes}, @option{--comments}, @option{--words}, and
|
|
@option{--syntax}. Nevertheless, they are implemented as M4 builtins, as
|
|
it makes M4 libraries self contained (no need for additional options).
|
|
|
|
There lies the problem@enddots{}
|
|
|
|
@sp 1
|
|
|
|
The problem is that it is then tempting to use them in the middle of an
|
|
M4 script, as opposed to its initialization. This, if not carefully
|
|
thought out, can lead to disastrous effects: @emph{you are changing the
|
|
language in the middle of the execution}. Changing and restoring the
|
|
syntax is often not enough: if you happened to invoke macros in between,
|
|
these macros are lost, as the current syntax is probably not
|
|
the one they were implemented with.
|
|
|
|
@c FIXME: I've been looking for a short, real case example, but I
|
|
@c lost them all :(
|
|
|
|
|
|
@node Quadrigraphs
|
|
@subsection Quadrigraphs
|
|
@cindex quadrigraphs
|
|
@cindex @samp{@@S|@@}
|
|
@cindex @samp{@@&t@@}
|
|
@c Info cannot handle ':' in index entries.
|
|
@ifnotinfo
|
|
@cindex @samp{@@<:@@}
|
|
@cindex @samp{@@:>@@}
|
|
@cindex @samp{@@%:@@}
|
|
@cindex @samp{@@@{:@@}
|
|
@cindex @samp{@@:@}@@}
|
|
@end ifnotinfo
|
|
|
|
When writing an Autoconf macro you may occasionally need to generate
|
|
special characters that are difficult to express with the standard
|
|
Autoconf quoting rules. For example, you may need to output the regular
|
|
expression @samp{[^[]}, which matches any character other than @samp{[}.
|
|
This expression contains unbalanced brackets so it cannot be put easily
|
|
into an M4 macro.
|
|
|
|
Additionally, there are a few m4sugar macros (such as @code{m4_split}
|
|
and @code{m4_expand}) which internally use special markers in addition
|
|
to the regular quoting characters. If the arguments to these macros
|
|
contain the literal strings @samp{-=<@{(} or @samp{)@}>=-}, the macros
|
|
might behave incorrectly.
|
|
|
|
You can work around these problems by using one of the following
|
|
@dfn{quadrigraphs}:
|
|
|
|
@table @samp
|
|
@item @@<:@@
|
|
@samp{[}
|
|
@item @@:>@@
|
|
@samp{]}
|
|
@item @@S|@@
|
|
@samp{$}
|
|
@item @@%:@@
|
|
@samp{#}
|
|
@item @@@{:@@
|
|
@samp{(}
|
|
@item @@:@}@@
|
|
@samp{)}
|
|
@item @@&t@@
|
|
Expands to nothing.
|
|
@end table
|
|
|
|
Quadrigraphs are replaced at a late stage of the translation process,
|
|
after @command{m4} is run, so they do not get in the way of M4 quoting.
|
|
For example, the string @samp{^@@<:@@}, independently of its quotation,
|
|
appears as @samp{^[} in the output.
|
|
|
|
The empty quadrigraph can be used:
|
|
|
|
@itemize @minus
|
|
@item to mark trailing spaces explicitly
|
|
|
|
Trailing spaces are smashed by @command{autom4te}. This is a feature.
|
|
|
|
@item to produce quadrigraphs and other strings reserved by m4sugar
|
|
|
|
For instance @samp{@@<@@&t@@:@@} produces @samp{@@<:@@}. For a more
|
|
contrived example:
|
|
|
|
@example
|
|
m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
|
|
m4_split([a )@}>=- b -=<@{( c])
|
|
@result{}[a], [], [B], [], [c]
|
|
m4_split([a )@}@@&t@@>=- b -=<@@&t@@@{( c])
|
|
@result{}[a], [)@}>=-], [b], [-=<@{(], [c]
|
|
@end example
|
|
|
|
@item to escape @emph{occurrences} of forbidden patterns
|
|
|
|
For instance you might want to mention @code{AC_FOO} in a comment, while
|
|
still being sure that @command{autom4te} still catches unexpanded
|
|
@samp{AC_*}. Then write @samp{AC@@&t@@_FOO}.
|
|
@end itemize
|
|
|
|
The name @samp{@@&t@@} was suggested by Paul Eggert:
|
|
|
|
@quotation
|
|
I should give some credit to the @samp{@@&t@@} pun. The @samp{&} is my
|
|
own invention, but the @samp{t} came from the source code of the
|
|
ALGOL68C compiler, written by Steve Bourne (of Bourne shell fame),
|
|
and which used @samp{mt} to denote the empty string. In C, it would
|
|
have looked like something like:
|
|
|
|
@example
|
|
char const mt[] = "";
|
|
@end example
|
|
|
|
@noindent
|
|
but of course the source code was written in Algol 68.
|
|
|
|
I don't know where he got @samp{mt} from: it could have been his own
|
|
invention, and I suppose it could have been a common pun around the
|
|
Cambridge University computer lab at the time.
|
|
@end quotation
|
|
|
|
|
|
@node Balancing Parentheses
|
|
@subsection Dealing with unbalanced parentheses
|
|
@cindex balancing parentheses
|
|
@cindex parentheses, balancing
|
|
@cindex unbalanced parentheses, managing
|
|
|
|
One of the pitfalls of portable shell programming is that
|
|
if you intend your script to run with obsolescent shells,
|
|
@command{case} statements require unbalanced parentheses.
|
|
@xref{case, , Limitations of Shell Builtins}.
|
|
With syntax highlighting
|
|
editors, the presence of unbalanced @samp{)} can interfere with editors
|
|
that perform syntax highlighting of macro contents based on finding the
|
|
matching @samp{(}. Another concern is how much editing must be done
|
|
when transferring code snippets between shell scripts and macro
|
|
definitions. But most importantly, the presence of unbalanced
|
|
parentheses can introduce expansion bugs.
|
|
|
|
For an example, here is an underquoted attempt to use the macro
|
|
@code{my_case}, which happens to expand to a portable @command{case}
|
|
statement:
|
|
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[case $file_name in
|
|
*.c) file_type='C source code';;
|
|
esac])
|
|
AS_IF(:, my_case)
|
|
@end example
|
|
|
|
@noindent
|
|
In the above example, the @code{AS_IF} call under-quotes its arguments.
|
|
As a result, the unbalanced @samp{)} generated by the premature
|
|
expansion of @code{my_case} results in expanding @code{AS_IF} with a
|
|
truncated parameter, and the expansion is syntactically invalid:
|
|
|
|
@example
|
|
if :
|
|
then :
|
|
case $file_name in
|
|
*.c
|
|
fi file_type='C source code';;
|
|
esac)
|
|
@end example
|
|
|
|
If nothing else, this should emphasize the importance of the quoting
|
|
arguments to macro calls. On the other hand, there are several
|
|
variations for defining @code{my_case} to be more robust, even when used
|
|
without proper quoting, each with some benefits and some drawbacks.
|
|
|
|
@itemize @w{}
|
|
@item Use left parenthesis before pattern
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[case $file_name in
|
|
(*.c) file_type='C source code';;
|
|
esac])
|
|
@end example
|
|
@noindent
|
|
This is simple and provides balanced parentheses. Although this is not
|
|
portable to obsolescent shells (notably Solaris 10 @command{/bin/sh}),
|
|
platforms with these shells invariably have a more-modern shell
|
|
available somewhere so this approach typically suffices nowadays.
|
|
|
|
@item Creative literal shell comment
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[case $file_name in #(
|
|
*.c) file_type='C source code';;
|
|
esac])
|
|
@end example
|
|
@noindent
|
|
This version provides balanced parentheses to several editors, and can
|
|
be copied and pasted into a terminal as is. Unfortunately, it is still
|
|
unbalanced as an Autoconf argument, since @samp{#(} is an M4 comment
|
|
that masks the normal properties of @samp{(}.
|
|
|
|
@item Quadrigraph shell comment
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[case $file_name in @@%:@@(
|
|
*.c) file_type='C source code';;
|
|
esac])
|
|
@end example
|
|
@noindent
|
|
This version provides balanced parentheses to even more editors, and can
|
|
be used as a balanced Autoconf argument. Unfortunately, it requires
|
|
some editing before it can be copied and pasted into a terminal, and the
|
|
use of the quadrigraph @samp{@@%:@@} for @samp{#} reduces readability.
|
|
|
|
@item Quoting just the parenthesis
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[case $file_name in
|
|
*.c[)] file_type='C source code';;
|
|
esac])
|
|
@end example
|
|
@noindent
|
|
This version quotes the @samp{)}, so that it can be used as a balanced
|
|
Autoconf argument. As written, this is not balanced to an editor, but
|
|
it can be coupled with @samp{[#(]} to meet that need, too. However, it
|
|
still requires some edits before it can be copied and pasted into a
|
|
terminal.
|
|
|
|
@item Double-quoting the entire statement
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[[case $file_name in #(
|
|
*.c) file_type='C source code';;
|
|
esac]])
|
|
@end example
|
|
@noindent
|
|
Since the entire macro is double-quoted, there is no problem with using
|
|
this as an Autoconf argument; and since the double-quoting is over the
|
|
entire statement, this code can be easily copied and pasted into a
|
|
terminal. However, the double quoting prevents the expansion of any
|
|
macros inside the case statement, which may cause its own set of
|
|
problems.
|
|
|
|
@item Using @code{AS_CASE}
|
|
@example
|
|
AC_DEFUN([my_case],
|
|
[AS_CASE([$file_name],
|
|
[*.c], [file_type='C source code'])])
|
|
@end example
|
|
@noindent
|
|
This version avoids the balancing issue altogether, by relying on
|
|
@code{AS_CASE} (@pxref{Common Shell Constructs}); it also allows for the
|
|
expansion of @code{AC_REQUIRE} to occur prior to the entire case
|
|
statement, rather than within a branch of the case statement that might
|
|
not be taken. However, the abstraction comes with a penalty that it is
|
|
no longer a quick copy, paste, and edit to get back to shell code.
|
|
@end itemize
|
|
|
|
|
|
@node Quotation Rule Of Thumb
|
|
@subsection Quotation Rule Of Thumb
|
|
|
|
To conclude, the quotation rule of thumb is:
|
|
|
|
@center @emph{One pair of quotes per pair of parentheses.}
|
|
|
|
Never over-quote, never under-quote, in particular in the definition of
|
|
macros. In the few places where the macros need to use brackets
|
|
(usually in C program text or regular expressions), properly quote
|
|
@emph{the arguments}!
|
|
|
|
It is common to read Autoconf programs with snippets like:
|
|
|
|
@example
|
|
AC_TRY_LINK(
|
|
changequote(<<, >>)dnl
|
|
<<#include <time.h>
|
|
#ifndef tzname /* For SGI. */
|
|
extern char *tzname[]; /* RS6000 and others reject char **tzname. */
|
|
#endif>>,
|
|
changequote([, ])dnl
|
|
[atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
|
|
@end example
|
|
|
|
@noindent
|
|
which is incredibly useless since @code{AC_TRY_LINK} is @emph{already}
|
|
double quoting, so you just need:
|
|
|
|
@example
|
|
AC_TRY_LINK(
|
|
[#include <time.h>
|
|
#ifndef tzname /* For SGI. */
|
|
extern char *tzname[]; /* RS6000 and others reject char **tzname. */
|
|
#endif],
|
|
[atoi (*tzname);],
|
|
[ac_cv_var_tzname=yes],
|
|
[ac_cv_var_tzname=no])
|
|
@end example
|
|
|
|
@noindent
|
|
The M4-fluent reader might note that these two examples are rigorously
|
|
equivalent, since M4 swallows both the @samp{changequote(<<, >>)}
|
|
and @samp{<<} @samp{>>} when it @dfn{collects} the arguments: these
|
|
quotes are not part of the arguments!
|
|
|
|
Simplified, the example above is just doing this:
|
|
|
|
@example
|
|
changequote(<<, >>)dnl
|
|
<<[]>>
|
|
changequote([, ])dnl
|
|
@end example
|
|
|
|
@noindent
|
|
instead of simply:
|
|
|
|
@example
|
|
[[]]
|
|
@end example
|
|
|
|
With macros that do not double quote their arguments (which is the
|
|
rule), double-quote the (risky) literals:
|
|
|
|
@example
|
|
AC_LINK_IFELSE([AC_LANG_PROGRAM(
|
|
[[#include <time.h>
|
|
#ifndef tzname /* For SGI. */
|
|
extern char *tzname[]; /* RS6000 and others reject char **tzname. */
|
|
#endif]],
|
|
[atoi (*tzname);])],
|
|
[ac_cv_var_tzname=yes],
|
|
[ac_cv_var_tzname=no])
|
|
@end example
|
|
|
|
Please note that the macro @code{AC_TRY_LINK} is obsolete, so you really
|
|
should be using @code{AC_LINK_IFELSE} instead.
|
|
|
|
@xref{Quadrigraphs}, for what to do if you run into a hopeless case
|
|
where quoting does not suffice.
|
|
|
|
When you create a @command{configure} script using newly written macros,
|
|
examine it carefully to check whether you need to add more quotes in
|
|
your macros. If one or more words have disappeared in the M4
|
|
output, you need more quotes. When in doubt, quote.
|
|
|
|
However, it's also possible to put on too many layers of quotes. If
|
|
this happens, the resulting @command{configure} script may contain
|
|
unexpanded macros. The @command{autoconf} program checks for this problem
|
|
by looking for the string @samp{AC_} in @file{configure}. However, this
|
|
heuristic does not work in general: for example, it does not catch
|
|
overquoting in @code{AC_DEFINE} descriptions.
|
|
|
|
|
|
@c ---------------------------------------- Using autom4te
|
|
|
|
@node Using autom4te
|
|
@section Using @command{autom4te}
|
|
|
|
The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition
|
|
to Autoconf per se, heavily rely on M4. All these different uses
|
|
revealed common needs factored into a layer over M4:
|
|
@command{autom4te}@footnote{
|
|
@c
|
|
Yet another great name from Lars J. Aas.
|
|
@c
|
|
}.
|
|
|
|
@command{autom4te} is a preprocessor that is like @command{m4}.
|
|
It supports M4 extensions designed for use in tools like Autoconf.
|
|
|
|
@menu
|
|
* autom4te Invocation:: A GNU M4 wrapper
|
|
* Customizing autom4te:: Customizing the Autoconf package
|
|
@end menu
|
|
|
|
@node autom4te Invocation
|
|
@subsection Invoking @command{autom4te}
|
|
|
|
The command line arguments are modeled after M4's:
|
|
|
|
@example
|
|
autom4te @var{options} @var{files}
|
|
@end example
|
|
|
|
@noindent
|
|
@evindex M4
|
|
where the @var{files} are directly passed to @command{m4}. By default,
|
|
GNU M4 is found during configuration, but the environment
|
|
variable
|
|
@env{M4} can be set to tell @command{autom4te} where to look. In addition
|
|
to the regular expansion, it handles the replacement of the quadrigraphs
|
|
(@pxref{Quadrigraphs}), and of @samp{__oline__}, the current line in the
|
|
output. It supports an extended syntax for the @var{files}:
|
|
|
|
@table @file
|
|
@item @var{file}.m4f
|
|
This file is an M4 frozen file. Note that @emph{all the previous files
|
|
are ignored}. See the @option{--melt} option for the rationale.
|
|
|
|
@item @var{file}?
|
|
If found in the library path, the @var{file} is included for expansion,
|
|
otherwise it is ignored instead of triggering a failure.
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
Of course, it supports the Autoconf common subset of options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Report processing steps.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files and be even more verbose.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Also look for input files in @var{dir}. Multiple invocations
|
|
accumulate.
|
|
|
|
@item --output=@var{file}
|
|
@itemx -o @var{file}
|
|
Save output (script or trace) to @var{file}. The file @option{-} stands
|
|
for the standard output.
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
As an extension of @command{m4}, it includes the following options:
|
|
|
|
@table @option
|
|
|
|
@item --warnings=@var{category}[,@var{category}...]
|
|
@itemx -W@var{category}[,@var{category}...]
|
|
@evindex WARNINGS
|
|
Enable or disable warnings related to each @var{category}.
|
|
@xref{m4_warn}, for a comprehensive list of categories.
|
|
Special values include:
|
|
|
|
@table @samp
|
|
@item all
|
|
Enable all categories of warnings.
|
|
|
|
@item none
|
|
Disable all categories of warnings.
|
|
|
|
@item error
|
|
Treat all warnings as errors.
|
|
|
|
@item no-@var{category}
|
|
Disable warnings falling into @var{category}.
|
|
@end table
|
|
|
|
The environment variable @env{WARNINGS} may also be set to a
|
|
comma-separated list of warning categories to enable or disable.
|
|
It is interpreted exactly the same way as the argument of
|
|
@option{--warnings}, but unknown categories are silently ignored.
|
|
The command line takes precedence; for instance, if @env{WARNINGS}
|
|
is set to @code{obsolete}, but @option{-Wnone} is given on the
|
|
command line, no warnings will be issued.
|
|
|
|
Some categories of warnings are on by default.
|
|
Again, for details see @ref{m4_warn}.
|
|
|
|
@item --melt
|
|
@itemx -M
|
|
Do not use frozen files. Any argument @code{@var{file}.m4f} is
|
|
replaced by @code{@var{file}.m4}. This helps tracing the macros which
|
|
are executed only when the files are frozen, typically
|
|
@code{m4_define}. For instance, running:
|
|
|
|
@example
|
|
autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
|
|
@end example
|
|
|
|
@noindent
|
|
is roughly equivalent to running:
|
|
|
|
@example
|
|
m4 1.m4 2.m4 3.m4 4.m4 input.m4
|
|
@end example
|
|
|
|
@noindent
|
|
while
|
|
|
|
@example
|
|
autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
|
|
@end example
|
|
|
|
@noindent
|
|
is equivalent to:
|
|
|
|
@example
|
|
m4 --reload-state=4.m4f input.m4
|
|
@end example
|
|
|
|
@item --freeze
|
|
@itemx -F
|
|
Produce a frozen state file. @command{autom4te} freezing is stricter
|
|
than M4's: it must produce no warnings, and no output other than empty
|
|
lines (a line with white space is @emph{not} empty) and comments
|
|
(starting with @samp{#}). Unlike @command{m4}'s similarly-named option,
|
|
this option takes no argument:
|
|
|
|
@example
|
|
autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
|
|
@end example
|
|
|
|
@noindent
|
|
corresponds to
|
|
|
|
@example
|
|
m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
|
|
@end example
|
|
|
|
@item --mode=@var{octal-mode}
|
|
@itemx -m @var{octal-mode}
|
|
Set the mode of the non-traces output to @var{octal-mode}; by default
|
|
@samp{0666}.
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
@cindex @file{autom4te.cache}
|
|
As another additional feature over @command{m4}, @command{autom4te}
|
|
caches its results. GNU M4 is able to produce a regular
|
|
output and traces at the same time. Traces are heavily used in the
|
|
GNU Build System: @command{autoheader} uses them to build
|
|
@file{config.h.in}, @command{autoreconf} to determine what
|
|
GNU Build System components are used, @command{automake} to
|
|
``parse'' @file{configure.ac} etc. To avoid recomputation,
|
|
traces are cached while performing regular expansion,
|
|
and conversely. This cache is (actually, the caches are) stored in
|
|
the directory @file{autom4te.cache}. @emph{It can safely be removed}
|
|
at any moment (especially if for some reason @command{autom4te}
|
|
considers it trashed).
|
|
|
|
@table @option
|
|
@item --cache=@var{directory}
|
|
@itemx -C @var{directory}
|
|
Specify the name of the directory where the result should be cached.
|
|
Passing an empty value disables caching. Be sure to pass a relative
|
|
file name, as for the time being, global caches are not supported.
|
|
|
|
@item --no-cache
|
|
Don't cache the results.
|
|
|
|
@item --force
|
|
@itemx -f
|
|
If a cache is used, consider it obsolete (but update it anyway).
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
Because traces are so important to the GNU Build System,
|
|
@command{autom4te} provides high level tracing features as compared to
|
|
M4, and helps exploiting the cache:
|
|
|
|
@table @option
|
|
@item --trace=@var{macro}[:@var{format}]
|
|
@itemx -t @var{macro}[:@var{format}]
|
|
Trace the invocations of @var{macro} according to the @var{format}.
|
|
Multiple @option{--trace} arguments can be used to list several macros.
|
|
Multiple @option{--trace} arguments for a single macro are not
|
|
cumulative; instead, you should just make @var{format} as long as
|
|
needed.
|
|
|
|
The @var{format} is a regular string, with newlines if desired, and
|
|
several special escape codes. It defaults to @samp{$f:$l:$n:$%}. It can
|
|
use the following special escapes:
|
|
|
|
@table @samp
|
|
@item $$
|
|
@c $$ restore font-lock
|
|
The character @samp{$}.
|
|
|
|
@item $f
|
|
The file name from which @var{macro} is called.
|
|
|
|
@item $l
|
|
The line number from which @var{macro} is called.
|
|
|
|
@item $d
|
|
The depth of the @var{macro} call. This is an M4 technical detail that
|
|
you probably don't want to know about.
|
|
|
|
@item $n
|
|
The name of the @var{macro}.
|
|
|
|
@item $@var{num}
|
|
The @var{num}th argument of the call to @var{macro}.
|
|
|
|
@item $@@
|
|
@itemx $@var{sep}@@
|
|
@itemx $@{@var{separator}@}@@
|
|
All the arguments passed to @var{macro}, separated by the character
|
|
@var{sep} or the string @var{separator} (@samp{,} by default). Each
|
|
argument is quoted, i.e., enclosed in a pair of square brackets.
|
|
|
|
@item $*
|
|
@itemx $@var{sep}*
|
|
@itemx $@{@var{separator}@}*
|
|
As above, but the arguments are not quoted.
|
|
|
|
@item $%
|
|
@itemx $@var{sep}%
|
|
@itemx $@{@var{separator}@}%
|
|
As above, but the arguments are not quoted, all new line characters in
|
|
the arguments are smashed, and the default separator is @samp{:}.
|
|
|
|
The escape @samp{$%} produces single-line trace outputs (unless you put
|
|
newlines in the @samp{separator}), while @samp{$@@} and @samp{$*} do
|
|
not.
|
|
@end table
|
|
|
|
@xref{autoconf Invocation}, for examples of trace uses.
|
|
|
|
@item --preselect=@var{macro}
|
|
@itemx -p @var{macro}
|
|
Cache the traces of @var{macro}, but do not enable traces. This is
|
|
especially important to save CPU cycles in the future. For instance,
|
|
when invoked, @command{autoconf} pre-selects all the macros that
|
|
@command{autoheader}, @command{automake}, @command{autoreconf}, etc.,
|
|
trace, so that running @command{m4} is not needed to trace them: the
|
|
cache suffices. This results in a huge speed-up.
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
@cindex Autom4te Library
|
|
Finally, @command{autom4te} introduces the concept of @dfn{Autom4te
|
|
libraries}. They consists in a powerful yet extremely simple feature:
|
|
sets of combined command line arguments:
|
|
|
|
@table @option
|
|
@item --language=@var{language}
|
|
@itemx -l @var{language}
|
|
Use the @var{language} Autom4te library. Current languages include:
|
|
|
|
@table @code
|
|
@item M4sugar
|
|
create M4sugar output.
|
|
|
|
@item M4sh
|
|
create M4sh executable shell scripts.
|
|
|
|
@item Autotest
|
|
create Autotest executable test suites.
|
|
|
|
@item Autoconf-without-aclocal-m4
|
|
create Autoconf executable configure scripts without
|
|
reading @file{aclocal.m4}.
|
|
|
|
@item Autoconf
|
|
create Autoconf executable configure scripts. This language inherits
|
|
all the characteristics of @code{Autoconf-without-aclocal-m4} and
|
|
additionally reads @file{aclocal.m4}.
|
|
@end table
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend directory @var{dir} to the search path. This is used to include
|
|
the language-specific files before any third-party macros.
|
|
|
|
@end table
|
|
|
|
@cindex @file{autom4te.cfg}
|
|
As an example, if Autoconf is installed in its default location,
|
|
@file{/usr/local}, the command @samp{autom4te -l m4sugar foo.m4} is
|
|
strictly equivalent to the command:
|
|
|
|
@example
|
|
autom4te --prepend-include /usr/local/share/autoconf \
|
|
m4sugar/m4sugar.m4f foo.m4
|
|
@end example
|
|
|
|
@noindent
|
|
Recursive expansion applies here: the command @samp{autom4te -l m4sh foo.m4}
|
|
is the same as @samp{autom4te --language M4sugar m4sugar/m4sh.m4f
|
|
foo.m4}, i.e.:
|
|
|
|
@example
|
|
autom4te --prepend-include /usr/local/share/autoconf \
|
|
m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4
|
|
@end example
|
|
|
|
@noindent
|
|
The definition of the languages is stored in @file{autom4te.cfg}.
|
|
|
|
@node Customizing autom4te
|
|
@subsection Customizing @command{autom4te}
|
|
|
|
One can customize @command{autom4te} via @file{~/.autom4te.cfg} (i.e.,
|
|
as found in the user home directory), and @file{./.autom4te.cfg} (i.e.,
|
|
as found in the directory from which @command{autom4te} is run). The
|
|
order is first reading @file{autom4te.cfg}, then @file{~/.autom4te.cfg},
|
|
then @file{./.autom4te.cfg}, and finally the command line arguments.
|
|
|
|
In these text files, comments are introduced with @code{#}, and empty
|
|
lines are ignored. Customization is performed on a per-language basis,
|
|
wrapped in between a @samp{begin-language: "@var{language}"},
|
|
@samp{end-language: "@var{language}"} pair.
|
|
|
|
Customizing a language stands for appending options (@pxref{autom4te
|
|
Invocation}) to the current definition of the language. Options, and
|
|
more generally arguments, are introduced by @samp{args:
|
|
@var{arguments}}. You may use the traditional shell syntax to quote the
|
|
@var{arguments}.
|
|
|
|
As an example, to disable Autoconf caches (@file{autom4te.cache})
|
|
globally, include the following lines in @file{~/.autom4te.cfg}:
|
|
|
|
@verbatim
|
|
## ------------------ ##
|
|
## User Preferences. ##
|
|
## ------------------ ##
|
|
|
|
begin-language: "Autoconf-without-aclocal-m4"
|
|
args: --no-cache
|
|
end-language: "Autoconf-without-aclocal-m4"
|
|
@end verbatim
|
|
|
|
|
|
@node Programming in M4sugar
|
|
@section Programming in M4sugar
|
|
|
|
@cindex M4sugar
|
|
M4 by itself provides only a small, but sufficient, set of all-purpose
|
|
macros. M4sugar introduces additional generic macros. Its name was
|
|
coined by Lars J. Aas: ``Readability And Greater Understanding Stands 4
|
|
M4sugar''.
|
|
|
|
M4sugar reserves the macro namespace @samp{^_m4_} for internal use, and
|
|
the macro namespace @samp{^m4_} for M4sugar macros. You should not
|
|
define your own macros into these namespaces.
|
|
|
|
@menu
|
|
* Redefined M4 Macros:: M4 builtins changed in M4sugar
|
|
* Diagnostic Macros:: Diagnostic messages from M4sugar
|
|
* Diversion support:: Diversions in M4sugar
|
|
* Conditional constructs:: Conditions in M4
|
|
* Looping constructs:: Iteration in M4
|
|
* Evaluation Macros:: More quotation and evaluation control
|
|
* Text processing Macros:: String manipulation in M4
|
|
* Number processing Macros:: Arithmetic computation in M4
|
|
* Set manipulation Macros:: Set manipulation in M4
|
|
* Forbidden Patterns:: Catching unexpanded macros
|
|
@end menu
|
|
|
|
@node Redefined M4 Macros
|
|
@subsection Redefined M4 Macros
|
|
|
|
@msindex{builtin}
|
|
@msindex{changecom}
|
|
@msindex{changequote}
|
|
@msindex{debugfile}
|
|
@msindex{debugmode}
|
|
@msindex{decr}
|
|
@msindex{define}
|
|
@msindex{divnum}
|
|
@msindex{errprint}
|
|
@msindex{esyscmd}
|
|
@msindex{eval}
|
|
@msindex{format}
|
|
@msindex{ifdef}
|
|
@msindex{incr}
|
|
@msindex{index}
|
|
@msindex{indir}
|
|
@msindex{len}
|
|
@msindex{pushdef}
|
|
@msindex{shift}
|
|
@msindex{substr}
|
|
@msindex{syscmd}
|
|
@msindex{sysval}
|
|
@msindex{traceoff}
|
|
@msindex{traceon}
|
|
@msindex{translit}
|
|
With a few exceptions, all the M4 native macros are moved in the
|
|
@samp{m4_} pseudo-namespace, e.g., M4sugar renames @code{define} as
|
|
@code{m4_define} etc.
|
|
|
|
The list of macros unchanged from M4, except for their name, is:
|
|
@itemize @minus
|
|
@item m4_builtin
|
|
@item m4_changecom
|
|
@item m4_changequote
|
|
@item m4_debugfile
|
|
@item m4_debugmode
|
|
@item m4_decr
|
|
@item m4_define
|
|
@item m4_divnum
|
|
@item m4_errprint
|
|
@item m4_esyscmd
|
|
@item m4_eval
|
|
@item m4_format
|
|
@item m4_ifdef
|
|
@item m4_incr
|
|
@item m4_index
|
|
@item m4_indir
|
|
@item m4_len
|
|
@item m4_pushdef
|
|
@item m4_shift
|
|
@item m4_substr
|
|
@item m4_syscmd
|
|
@item m4_sysval
|
|
@item m4_traceoff
|
|
@item m4_traceon
|
|
@item m4_translit
|
|
@end itemize
|
|
|
|
Some M4 macros are redefined, and are slightly incompatible with their
|
|
native equivalent.
|
|
|
|
@defmac __file__
|
|
@defmacx __line__
|
|
@MSindex __file__
|
|
@MSindex __line__
|
|
All M4 macros starting with @samp{__} retain their original name: for
|
|
example, no @code{m4__file__} is defined.
|
|
@end defmac
|
|
|
|
@defmac __oline__
|
|
@MSindex __oline__
|
|
This is not technically a macro, but a feature of Autom4te. The
|
|
sequence @code{__oline__} can be used similarly to the other m4sugar
|
|
location macros, but rather than expanding to the location of the input
|
|
file, it is translated to the line number where it appears in the output
|
|
file after all other M4 expansions.
|
|
@end defmac
|
|
|
|
@defmac dnl
|
|
@MSindex dnl
|
|
This macro kept its original name: no @code{m4_dnl} is defined.
|
|
@end defmac
|
|
|
|
@defmac m4_bpatsubst (@var{string}, @var{regexp}, @ovar{replacement})
|
|
@msindex{bpatsubst}
|
|
This macro corresponds to @code{patsubst}. The name @code{m4_patsubst}
|
|
is kept for future versions of M4sugar, once GNU M4 2.0 is
|
|
released and supports extended regular expression syntax.
|
|
@end defmac
|
|
|
|
@defmac m4_bregexp (@var{string}, @var{regexp}, @ovar{replacement})
|
|
@msindex{bregexp}
|
|
This macro corresponds to @code{regexp}. The name @code{m4_regexp}
|
|
is kept for future versions of M4sugar, once GNU M4 2.0 is
|
|
released and supports extended regular expression syntax.
|
|
@end defmac
|
|
|
|
@defmac m4_copy (@var{source}, @var{dest})
|
|
@defmacx m4_copy_force (@var{source}, @var{dest})
|
|
@defmacx m4_rename (@var{source}, @var{dest})
|
|
@defmacx m4_rename_force (@var{source}, @var{dest})
|
|
@msindex{copy}
|
|
@msindex{copy_force}
|
|
@msindex{rename}
|
|
@msindex{rename_force}
|
|
These macros aren't directly builtins, but are closely related to
|
|
@code{m4_pushdef} and @code{m4_defn}. @code{m4_copy} and
|
|
@code{m4_rename} ensure that @var{dest} is undefined, while
|
|
@code{m4_copy_force} and @code{m4_rename_force} overwrite any existing
|
|
definition. All four macros then proceed to copy the entire pushdef
|
|
stack of definitions of @var{source} over to @var{dest}. @code{m4_copy}
|
|
and @code{m4_copy_force} preserve the source (including in the special
|
|
case where @var{source} is undefined), while @code{m4_rename} and
|
|
@code{m4_rename_force} undefine the original macro name (making it an
|
|
error to rename an undefined @var{source}).
|
|
|
|
Note that attempting to invoke a renamed macro might not work, since the
|
|
macro may have a dependence on helper macros accessed via composition of
|
|
@samp{$0} but that were not also renamed; likewise, other macros may
|
|
have a hard-coded dependence on @var{source} and could break if
|
|
@var{source} has been deleted. On the other hand, it is always safe to
|
|
rename a macro to temporarily move it out of the way, then rename it
|
|
back later to restore original semantics.
|
|
@end defmac
|
|
|
|
@defmac m4_defn (@var{macro}@dots{})
|
|
@msindex{defn}
|
|
This macro fails if @var{macro} is not defined, even when using older
|
|
versions of M4 that did not warn. See @code{m4_undefine}.
|
|
Unfortunately, in order to support these older versions of M4, there are
|
|
some situations involving unbalanced quotes where concatenating multiple
|
|
macros together will work in newer M4 but not in m4sugar; use
|
|
quadrigraphs to work around this.
|
|
@end defmac
|
|
|
|
@defmac m4_divert (@var{diversion})
|
|
@msindex{divert}
|
|
M4sugar relies heavily on diversions, so rather than behaving as a
|
|
primitive, @code{m4_divert} behaves like:
|
|
@example
|
|
m4_divert_pop()m4_divert_push([@var{diversion}])
|
|
@end example
|
|
@noindent
|
|
@xref{Diversion support}, for more details about the use of the
|
|
diversion stack. In particular, this implies that @var{diversion}
|
|
should be a named diversion rather than a raw number. But be aware that
|
|
it is seldom necessary to explicitly change the diversion stack, and
|
|
that when done incorrectly, it can lead to syntactically invalid
|
|
scripts.
|
|
@end defmac
|
|
|
|
@defmac m4_dumpdef (@var{name}@dots{})
|
|
@defmacx m4_dumpdefs (@var{name}@dots{})
|
|
@msindex{dumpdef}
|
|
@msindex{dumpdefs}
|
|
@code{m4_dumpdef} is like the M4 builtin, except that this version
|
|
requires at least one argument, output always goes to standard error
|
|
rather than the current debug file, no sorting is done on multiple
|
|
arguments, and an error is issued if any
|
|
@var{name} is undefined. @code{m4_dumpdefs} is a convenience macro that
|
|
calls @code{m4_dumpdef} for all of the
|
|
@code{m4_pushdef} stack of definitions, starting with the current, and
|
|
silently does nothing if @var{name} is undefined.
|
|
|
|
Unfortunately, due to a limitation in M4 1.4.x, any macro defined as a
|
|
builtin is output as the empty string. This behavior is rectified by
|
|
using M4 1.6 or newer. However, this behavior difference means that
|
|
@code{m4_dumpdef} should only be used while developing m4sugar macros,
|
|
and never in the final published form of a macro.
|
|
@end defmac
|
|
|
|
@defmac m4_esyscmd_s (@var{command})
|
|
@msindex{esyscmd_s}
|
|
Like @code{m4_esyscmd}, this macro expands to the result of running
|
|
@var{command} in a shell. The difference is that any trailing newlines
|
|
are removed, so that the output behaves more like shell command
|
|
substitution.
|
|
@end defmac
|
|
|
|
@defmac m4_exit (@var{exit-status})
|
|
@msindex{exit}
|
|
This macro corresponds to @code{m4exit}.
|
|
@end defmac
|
|
|
|
@defmac m4_if (@var{comment})
|
|
@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal}, @ovar{not-equal})
|
|
@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal-1}, @
|
|
@var{string-3}, @var{string-4}, @var{equal-2}, @dots{}, @ovar{not-equal})
|
|
@msindex{if}
|
|
This macro corresponds to @code{ifelse}. @var{string-1} and
|
|
@var{string-2} are compared literally, so usually one of the two
|
|
arguments is passed unquoted. @xref{Conditional constructs}, for more
|
|
conditional idioms.
|
|
@end defmac
|
|
|
|
@defmac m4_include (@var{file})
|
|
@defmacx m4_sinclude (@var{file})
|
|
@msindex{include}
|
|
@msindex{sinclude}
|
|
Like the M4 builtins, but warn against multiple inclusions of @var{file}.
|
|
@end defmac
|
|
|
|
@defmac m4_mkstemp (@var{template})
|
|
@defmacx m4_maketemp (@var{template})
|
|
@msindex{maketemp}
|
|
@msindex{mkstemp}
|
|
POSIX requires @code{maketemp} to replace the trailing @samp{X}
|
|
characters in @var{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
|
|
@code{mkstemp} that always creates a uniquely named file, but not all
|
|
versions of GNU M4 support the new macro. In M4sugar,
|
|
@code{m4_maketemp} and @code{m4_mkstemp} are synonyms for each other,
|
|
and both have the secure semantics regardless of which macro the
|
|
underlying M4 provides.
|
|
@end defmac
|
|
|
|
@defmac m4_popdef (@var{macro}@dots{})
|
|
@msindex{popdef}
|
|
This macro fails if @var{macro} is not defined, even when using older
|
|
versions of M4 that did not warn. See @code{m4_undefine}.
|
|
@end defmac
|
|
|
|
@defmac m4_undefine (@var{macro}@dots{})
|
|
@msindex{undefine}
|
|
This macro fails if @var{macro} is not defined, even when using older
|
|
versions of M4 that did not warn. Use
|
|
|
|
@example
|
|
m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])])
|
|
@end example
|
|
|
|
@noindent
|
|
if you are not sure whether @var{macro} is defined.
|
|
@end defmac
|
|
|
|
@defmac m4_undivert (@var{diversion}@dots{})
|
|
@msindex{undivert}
|
|
Unlike the M4 builtin, at least one @var{diversion} must be specified.
|
|
Also, since the M4sugar diversion stack prefers named
|
|
diversions, the use of @code{m4_undivert} to include files is risky.
|
|
@xref{Diversion support}, for more details about the use of the
|
|
diversion stack. But be aware that it is seldom necessary to explicitly
|
|
change the diversion stack, and that when done incorrectly, it can lead
|
|
to syntactically invalid scripts.
|
|
@end defmac
|
|
|
|
@defmac m4_wrap (@var{text})
|
|
@defmacx m4_wrap_lifo (@var{text})
|
|
@msindex{wrap}
|
|
@msindex{wrap_lifo}
|
|
These macros correspond to @code{m4wrap}. POSIX requires arguments of
|
|
multiple wrap calls to be reprocessed at EOF in the same order
|
|
as the original calls (first-in, first-out). GNU M4 versions
|
|
through 1.4.10, however, reprocess them in reverse order (last-in,
|
|
first-out). Both orders are useful, therefore, you can rely on
|
|
@code{m4_wrap} to provide FIFO semantics and @code{m4_wrap_lifo} for
|
|
LIFO semantics, regardless of the underlying GNU M4 version.
|
|
|
|
Unlike the GNU M4 builtin, these macros only recognize one
|
|
argument, and avoid token pasting between consecutive invocations. On
|
|
the other hand, nested calls to @code{m4_wrap} from within wrapped text
|
|
work just as in the builtin.
|
|
@end defmac
|
|
|
|
|
|
@node Diagnostic Macros
|
|
@subsection Diagnostic messages from M4sugar
|
|
@cindex Messages, from @command{M4sugar}
|
|
|
|
When macros statically diagnose abnormal situations, benign or fatal,
|
|
they should report them using these macros. For issuing dynamic issues,
|
|
i.e., when @command{configure} is run, see @ref{Printing Messages}.
|
|
|
|
@defmac m4_assert (@var{expression}, @dvar{exit-status, 1})
|
|
@msindex{assert}
|
|
Assert that the arithmetic @var{expression} evaluates to non-zero.
|
|
Otherwise, issue a fatal error, and exit @command{autom4te} with
|
|
@var{exit-status}.
|
|
@end defmac
|
|
|
|
@defmac m4_errprintn (@var{message})
|
|
@msindex{errprintn}
|
|
Similar to the builtin @code{m4_errprint}, except that a newline is
|
|
guaranteed after @var{message}.
|
|
@end defmac
|
|
|
|
@anchor{m4_fatal}
|
|
@defmac m4_fatal (@var{message})
|
|
@msindex{fatal}
|
|
Report a severe error @var{message} prefixed with the current location,
|
|
and have @command{autom4te} die.
|
|
@end defmac
|
|
|
|
@defmac m4_location
|
|
@msindex{location}
|
|
Useful as a prefix in a message line. Short for:
|
|
@example
|
|
__file__:__line__
|
|
@end example
|
|
@end defmac
|
|
|
|
@anchor{m4_warn}
|
|
@defmac m4_warn (@var{category}, @var{message})
|
|
@msindex{warn}
|
|
Report @var{message} as a warning (or as an error if requested by the
|
|
user) if warnings of the @var{category} are turned on. If the message
|
|
is emitted, it is prefixed with the current location, and followed by a
|
|
call trace of all macros defined via @code{AC_DEFUN} used to get to the
|
|
current expansion.
|
|
|
|
The @var{category} must be one of:
|
|
|
|
@table @samp
|
|
@item cross
|
|
Warnings about constructs that may interfere with cross-compilation,
|
|
such as using @code{AC_RUN_IFELSE} without a default.
|
|
|
|
@item gnu
|
|
Warnings related to the GNU Coding Standards
|
|
(@pxref{Top,,, standards, The GNU Coding Standards}).
|
|
On by default.
|
|
|
|
@item obsolete
|
|
Warnings about obsolete features. On by default.
|
|
|
|
@item override
|
|
Warnings about redefinitions of Autoconf internals.
|
|
|
|
@item portability
|
|
Warnings about non-portable constructs.
|
|
|
|
@item portability-recursive
|
|
Warnings about recursive Make variable expansions (@code{$(foo$(x))}).
|
|
|
|
@item extra-portability
|
|
Extra warnings about non-portable constructs, covering rarely-used
|
|
tools.
|
|
|
|
@item syntax
|
|
Warnings about questionable syntactic constructs, incorrectly ordered
|
|
macro calls, typos, etc. On by default.
|
|
|
|
@item unsupported
|
|
Warnings about unsupported features. On by default.
|
|
@end table
|
|
|
|
@strong{Hacking Note:} The set of categories is defined by code in
|
|
@command{autom4te}, not by M4sugar itself. Additions should be
|
|
coordinated with Automake, so that both sets of tools accept the same
|
|
options.
|
|
@end defmac
|
|
|
|
@node Diversion support
|
|
@subsection Diversion support
|
|
|
|
M4sugar makes heavy use of diversions under the hood, because it is
|
|
often the case that
|
|
text that must appear early in the output is not discovered until late
|
|
in the input. Additionally, some of the topological sorting algorithms
|
|
used in resolving macro dependencies use diversions. However, most
|
|
macros should not need to change diversions directly, but rather rely on
|
|
higher-level M4sugar macros to manage diversions transparently. If you
|
|
change diversions improperly, you risk generating a syntactically
|
|
invalid script, because an incorrect diversion will violate assumptions
|
|
made by many macros about whether prerequisite text has been previously
|
|
output. In short, if you manually change the diversion, you should not
|
|
expect any macros provided by the Autoconf package to work until you
|
|
have restored the diversion stack back to its original state.
|
|
|
|
In the rare case that it is necessary to write a macro that explicitly
|
|
outputs text to a different diversion, it is important to be aware of an
|
|
M4 limitation regarding diversions: text only goes to a diversion if it
|
|
is not part of argument collection. Therefore, any macro that changes
|
|
the current diversion cannot be used as an unquoted argument to another
|
|
macro, but must be expanded at the top level. The macro
|
|
@code{m4_expand} will diagnose any attempt to change diversions, since
|
|
it is generally useful only as an argument to another macro. The
|
|
following example shows what happens when diversion manipulation is
|
|
attempted within macro arguments:
|
|
|
|
@example
|
|
m4_do([normal text]
|
|
m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
|
|
[m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
|
|
@result{}normal text
|
|
@result{}unwanted
|
|
@end example
|
|
|
|
@noindent
|
|
Notice that the unquoted text @code{unwanted} is output, even though it
|
|
was processed while the current diversion was @code{KILL}, because it
|
|
was collected as part of the argument to @code{m4_do}. However, the
|
|
text @code{discarded} disappeared as desired, because the diversion
|
|
changes were single-quoted, and were not expanded until the top-level
|
|
rescan of the output of @code{m4_do}.
|
|
|
|
To make diversion management easier, M4sugar uses the concept of named
|
|
diversions. Rather than using diversion numbers directly, it is nicer
|
|
to associate a name with each diversion. The diversion number associated
|
|
with a particular diversion name is an implementation detail, and a
|
|
syntax warning is issued if a diversion number is used instead of a
|
|
name. In general, you should not output text
|
|
to a named diversion until after calling the appropriate initialization
|
|
routine for your language (@code{m4_init}, @code{AS_INIT},
|
|
@code{AT_INIT}, @dots{}), although there are some exceptions documented
|
|
below.
|
|
|
|
M4sugar defines two named diversions.
|
|
@table @code
|
|
@item KILL
|
|
Text written to this diversion is discarded. This is the default
|
|
diversion once M4sugar is initialized.
|
|
@item GROW
|
|
This diversion is used behind the scenes by topological sorting macros,
|
|
such as @code{AC_REQUIRE}.
|
|
@end table
|
|
|
|
M4sh adds several more named diversions.
|
|
@table @code
|
|
@item BINSH
|
|
This diversion is reserved for the @samp{#!} interpreter line.
|
|
@item HEADER-REVISION
|
|
This diversion holds text from @code{AC_REVISION}.
|
|
@item HEADER-COMMENT
|
|
This diversion holds comments about the purpose of a file.
|
|
@item HEADER-COPYRIGHT
|
|
This diversion is managed by @code{AC_COPYRIGHT}.
|
|
@item M4SH-SANITIZE
|
|
This diversion contains M4sh sanitization code, used to ensure M4sh is
|
|
executing in a reasonable shell environment.
|
|
@item M4SH-INIT
|
|
This diversion contains M4sh initialization code, initializing variables
|
|
that are required by other M4sh macros.
|
|
@item BODY
|
|
This diversion contains the body of the shell code, and is the default
|
|
diversion once M4sh is initialized.
|
|
@end table
|
|
|
|
Autotest inherits diversions from M4sh, and changes the default
|
|
diversion from @code{BODY} back to @code{KILL}. It also adds several
|
|
more named diversions, with the following subset designed for developer
|
|
use.
|
|
@table @code
|
|
@item PREPARE_TESTS
|
|
This diversion contains initialization sequences which are executed
|
|
after @file{atconfig} and @file{atlocal}, and after all command line
|
|
arguments have been parsed, but prior to running any tests. It can be
|
|
used to set up state that is required across all tests. This diversion
|
|
will work even before @code{AT_INIT}.
|
|
@end table
|
|
|
|
Autoconf inherits diversions from M4sh, and adds the following named
|
|
diversions which developers can utilize.
|
|
@table @code
|
|
@item DEFAULTS
|
|
This diversion contains shell variable assignments to set defaults that
|
|
must be in place before arguments are parsed. This diversion is placed
|
|
early enough in @file{configure} that it is unsafe to expand any
|
|
autoconf macros into this diversion.
|
|
@item HELP_ENABLE
|
|
If @code{AC_PRESERVE_HELP_ORDER} was used, then text placed in this
|
|
diversion will be included as part of a quoted here-doc providing all of
|
|
the @option{--help} output of @file{configure} related to options
|
|
created by @code{AC_ARG_WITH} and @code{AC_ARG_ENABLE}.
|
|
@item INIT_PREPARE
|
|
This diversion occurs after all command line options have been parsed,
|
|
but prior to the main body of the @file{configure} script. This
|
|
diversion is the last chance to insert shell code such as variable
|
|
assignments or shell function declarations that will used by the
|
|
expansion of other macros.
|
|
@end table
|
|
|
|
For now, the remaining named diversions of Autoconf, Autoheader, and
|
|
Autotest are not documented. In other words,
|
|
intentionally outputting text into an undocumented diversion is subject
|
|
to breakage in a future release of Autoconf.
|
|
|
|
@defmac m4_cleardivert (@var{diversion}@dots{})
|
|
@msindex{cleardivert}
|
|
Permanently discard any text that has been diverted into
|
|
@var{diversion}.
|
|
@end defmac
|
|
|
|
@defmac m4_divert_once (@var{diversion}, @ovar{content})
|
|
@msindex{divert_once}
|
|
Similar to @code{m4_divert_text}, except that @var{content} is only
|
|
output to @var{diversion} if this is the first time that
|
|
@code{m4_divert_once} has been called with its particular arguments.
|
|
@end defmac
|
|
|
|
@defmac m4_divert_pop (@ovar{diversion})
|
|
@msindex{divert_pop}
|
|
If provided, check that the current diversion is indeed @var{diversion}.
|
|
Then change to the diversion located earlier on the stack, giving an
|
|
error if an attempt is made to pop beyond the initial m4sugar diversion
|
|
of @code{KILL}.
|
|
@end defmac
|
|
|
|
@defmac m4_divert_push (@var{diversion})
|
|
@msindex{divert_push}
|
|
Remember the former diversion on the diversion stack, and output
|
|
subsequent text into @var{diversion}. M4sugar maintains a diversion
|
|
stack, and issues an error if there is not a matching pop for every
|
|
push.
|
|
@end defmac
|
|
|
|
@anchor{m4_divert_text}
|
|
@defmac m4_divert_text (@var{diversion}, @ovar{content})
|
|
@msindex{divert_text}
|
|
Output @var{content} and a newline into @var{diversion}, without
|
|
affecting the current diversion. Shorthand for:
|
|
@example
|
|
m4_divert_push([@var{diversion}])@var{content}
|
|
m4_divert_pop([@var{diversion}])dnl
|
|
@end example
|
|
|
|
One use of @code{m4_divert_text} is to develop two related macros, where
|
|
macro @samp{MY_A} does the work, but adjusts what work is performed
|
|
based on whether the optional macro @samp{MY_B} has also been expanded.
|
|
Of course, it is possible to use @code{AC_BEFORE} within @code{MY_A} to
|
|
require that @samp{MY_B} occurs first, if it occurs at all. But this
|
|
imposes an ordering restriction on the user; it would be nicer if macros
|
|
@samp{MY_A} and @samp{MY_B} can be invoked in either order. The trick
|
|
is to let @samp{MY_B} leave a breadcrumb in an early diversion, which
|
|
@samp{MY_A} can then use to determine whether @samp{MY_B} has been
|
|
expanded.
|
|
|
|
@example
|
|
AC_DEFUN([MY_A],
|
|
[# various actions
|
|
if test -n "$b_was_used"; then
|
|
# extra action
|
|
fi])
|
|
AC_DEFUN([MY_B],
|
|
[AC_REQUIRE([MY_A])dnl
|
|
m4_divert_text([INIT_PREPARE], [b_was_used=true])])
|
|
@end example
|
|
|
|
@end defmac
|
|
|
|
@defmac m4_init
|
|
@msindex{init}
|
|
Initialize the M4sugar environment, setting up the default named
|
|
diversion to be @code{KILL}.
|
|
@end defmac
|
|
|
|
@node Conditional constructs
|
|
@subsection Conditional constructs
|
|
|
|
The following macros provide additional conditional constructs as
|
|
convenience wrappers around @code{m4_if}.
|
|
|
|
@defmac m4_bmatch (@var{string}, @var{regex-1}, @var{value-1}, @
|
|
@ovar{regex-2}, @ovar{value-2}, @dots{}, @ovar{default})
|
|
@msindex{bmatch}
|
|
The string @var{string} is repeatedly compared against a series of
|
|
@var{regex} arguments; if a match is found, the expansion is the
|
|
corresponding @var{value}, otherwise, the macro moves on to the next
|
|
@var{regex}. If no @var{regex} match, then the result is the optional
|
|
@var{default}, or nothing.
|
|
@end defmac
|
|
|
|
@defmac m4_bpatsubsts (@var{string}, @var{regex-1}, @var{subst-1}, @
|
|
@ovar{regex-2}, @ovar{subst-2}, @dots{})
|
|
@msindex{bpatsubsts}
|
|
The string @var{string} is altered by @var{regex-1} and @var{subst-1},
|
|
as if by:
|
|
@example
|
|
m4_bpatsubst([[@var{string}]], [@var{regex}], [@var{subst}])
|
|
@end example
|
|
|
|
@noindent
|
|
The result of the substitution is then passed through the next set of
|
|
@var{regex} and @var{subst}, and so forth. An empty @var{subst} implies
|
|
deletion of any matched portions in the current string. Note that this
|
|
macro over-quotes @var{string}; this behavior is intentional, so that
|
|
the result of each step of the recursion remains as a quoted string.
|
|
However, it means that anchors (@samp{^} and @samp{$} in the @var{regex}
|
|
will line up with the extra quotations, and not the characters of the
|
|
original string. The overquoting is removed after the final
|
|
substitution.
|
|
@end defmac
|
|
|
|
@defmac m4_case (@var{string}, @var{value-1}, @var{if-value-1}, @
|
|
@ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
|
|
@msindex{case}
|
|
Test @var{string} against multiple @var{value} possibilities, resulting
|
|
in the first @var{if-value} for a match, or in the optional
|
|
@var{default}. This is shorthand for:
|
|
@example
|
|
m4_if([@var{string}], [@var{value-1}], [@var{if-value-1}],
|
|
[@var{string}], [@var{value-2}], [@var{if-value-2}], @dots{},
|
|
[@var{default}])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_cond (@var{test-1}, @var{value-1}, @var{if-value-1}, @
|
|
@ovar{test-2}, @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
|
|
@msindex{cond}
|
|
This macro was introduced in Autoconf 2.62. Similar to @code{m4_if},
|
|
except that each @var{test} is expanded only when it is encountered.
|
|
This is useful for short-circuiting expensive tests; while @code{m4_if}
|
|
requires all its strings to be expanded up front before doing
|
|
comparisons, @code{m4_cond} only expands a @var{test} when all earlier
|
|
tests have failed.
|
|
|
|
For an example, these two sequences give the same result, but in the
|
|
case where @samp{$1} does not contain a backslash, the @code{m4_cond}
|
|
version only expands @code{m4_index} once, instead of five times, for
|
|
faster computation if this is a common case for @samp{$1}. Notice that
|
|
every third argument is unquoted for @code{m4_if}, and quoted for
|
|
@code{m4_cond}:
|
|
|
|
@example
|
|
m4_if(m4_index([$1], [\]), [-1], [$2],
|
|
m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
|
|
m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
|
|
m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
|
|
m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
|
|
[$2])
|
|
m4_cond([m4_index([$1], [\])], [-1], [$2],
|
|
[m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
|
|
[m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
|
|
[m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
|
|
[m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
|
|
[$2])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_default (@var{expr-1}, @var{expr-2})
|
|
@defmacx m4_default_quoted (@var{expr-1}, @var{expr-2})
|
|
@defmacx m4_default_nblank (@var{expr-1}, @ovar{expr-2})
|
|
@defmacx m4_default_nblank_quoted (@var{expr-1}, @ovar{expr-2})
|
|
@msindex{default}
|
|
@msindex{default_quoted}
|
|
@msindex{default_nblank}
|
|
@msindex{default_nblank_quoted}
|
|
If @var{expr-1} contains text, use it. Otherwise, select @var{expr-2}.
|
|
@code{m4_default} expands the result, while @code{m4_default_quoted}
|
|
does not. Useful for providing a fixed default if the expression that
|
|
results in @var{expr-1} would otherwise be empty. The difference
|
|
between @code{m4_default} and @code{m4_default_nblank} is whether an
|
|
argument consisting of just blanks (space, tab, newline) is
|
|
significant. When using the expanding versions, note that an argument
|
|
may contain text but still expand to an empty string.
|
|
|
|
@example
|
|
m4_define([active], [ACTIVE])dnl
|
|
m4_define([empty], [])dnl
|
|
m4_define([demo1], [m4_default([$1], [$2])])dnl
|
|
m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
|
|
m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
|
|
m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
|
|
demo1([active], [default])
|
|
@result{}ACTIVE
|
|
demo1([], [active])
|
|
@result{}ACTIVE
|
|
demo1([empty], [text])
|
|
@result{}
|
|
-demo1([ ], [active])-
|
|
@result{}- -
|
|
demo2([active], [default])
|
|
@result{}active
|
|
demo2([], [active])
|
|
@result{}active
|
|
demo2([empty], [text])
|
|
@result{}empty
|
|
-demo2([ ], [active])-
|
|
@result{}- -
|
|
demo3([active], [default])
|
|
@result{}ACTIVE
|
|
demo3([], [active])
|
|
@result{}ACTIVE
|
|
demo3([empty], [text])
|
|
@result{}
|
|
-demo3([ ], [active])-
|
|
@result{}-ACTIVE-
|
|
demo4([active], [default])
|
|
@result{}active
|
|
demo4([], [active])
|
|
@result{}active
|
|
demo4([empty], [text])
|
|
@result{}empty
|
|
-demo4([ ], [active])-
|
|
@result{}-active-
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_define_default (@var{macro}, @ovar{default-definition})
|
|
@msindex{define_default}
|
|
If @var{macro} does not already have a definition, then define it to
|
|
@var{default-definition}.
|
|
@end defmac
|
|
|
|
@defmac m4_ifblank (@var{cond}, @ovar{if-blank}, @ovar{if-text})
|
|
@defmacx m4_ifnblank (@var{cond}, @ovar{if-text}, @ovar{if-blank})
|
|
@msindex{ifblank}
|
|
@msindex{ifnblank}
|
|
If @var{cond} is empty or consists only of blanks (space, tab, newline),
|
|
then expand @var{if-blank}; otherwise, expand @var{if-text}. Two
|
|
variants exist, in order to make it easier to select the correct logical
|
|
sense when using only two parameters. Note that this is more efficient
|
|
than the equivalent behavior of:
|
|
@example
|
|
m4_ifval(m4_normalize([@var{cond}]), @var{if-text}, @var{if-blank})
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_ifndef (@var{macro}, @var{if-not-defined}, @ovar{if-defined})
|
|
@msindex{ifndef}
|
|
This is shorthand for:
|
|
@example
|
|
m4_ifdef([@var{macro}], [@var{if-defined}], [@var{if-not-defined}])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_ifset (@var{macro}, @ovar{if-true}, @ovar{if-false})
|
|
@msindex{ifset}
|
|
If @var{macro} is undefined, or is defined as the empty string, expand
|
|
to @var{if-false}. Otherwise, expands to @var{if-true}. Similar to:
|
|
@example
|
|
m4_ifval(m4_defn([@var{macro}]), [@var{if-true}], [@var{if-false}])
|
|
@end example
|
|
@noindent
|
|
except that it is not an error if @var{macro} is undefined.
|
|
@end defmac
|
|
|
|
@defmac m4_ifval (@var{cond}, @ovar{if-true}, @ovar{if-false})
|
|
@msindex{ifval}
|
|
Expands to @var{if-true} if @var{cond} is not empty, otherwise to
|
|
@var{if-false}. This is shorthand for:
|
|
@example
|
|
m4_if([@var{cond}], [], [@var{if-false}], [@var{if-true}])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_ifvaln (@var{cond}, @ovar{if-true}, @ovar{if-false})
|
|
@msindex{ifvaln}
|
|
Similar to @code{m4_ifval}, except guarantee that a newline is present
|
|
after any non-empty expansion. Often followed by @code{dnl}.
|
|
@end defmac
|
|
|
|
@defmac m4_n (@var{text})
|
|
@msindex{n}
|
|
Expand to @var{text}, and add a newline if @var{text} is not empty.
|
|
Often followed by @code{dnl}.
|
|
@end defmac
|
|
|
|
|
|
@node Looping constructs
|
|
@subsection Looping constructs
|
|
|
|
The following macros are useful in implementing recursive algorithms in
|
|
M4, including loop operations. An M4 list is formed by quoting a list
|
|
of quoted elements; generally the lists are comma-separated, although
|
|
@code{m4_foreach_w} is whitespace-separated. For example, the list
|
|
@samp{[[a], [b,c]]} contains two elements: @samp{[a]} and @samp{[b,c]}.
|
|
It is common to see lists with unquoted elements when those elements are
|
|
not likely to be macro names, as in @samp{[fputc_unlocked,
|
|
fgetc_unlocked]}.
|
|
|
|
Although not generally recommended, it is possible for quoted lists to
|
|
have side effects; all side effects are expanded only once, and prior to
|
|
visiting any list element. On the other hand, the fact that unquoted
|
|
macros are expanded exactly once means that macros without side effects
|
|
can be used to generate lists. For example,
|
|
|
|
@example
|
|
m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
|
|
@error{}hi
|
|
@result{}123
|
|
m4_define([list], [[1], [2], [3]])
|
|
@result{}
|
|
m4_foreach([i], [list], [i])
|
|
@result{}123
|
|
@end example
|
|
|
|
@defmac m4_argn (@var{n}, @ovar{arg}@dots{})
|
|
@msindex{argn}
|
|
Extracts argument @var{n} (larger than 0) from the remaining arguments.
|
|
If there are too few arguments, the empty string is used. For any
|
|
@var{n} besides 1, this is more efficient than the similar
|
|
@samp{m4_car(m4_shiftn([@var{n}], [], [@var{arg}@dots{}]))}.
|
|
@end defmac
|
|
|
|
@defmac m4_car (@var{arg}@dots{})
|
|
@msindex{car}
|
|
Expands to the quoted first @var{arg}. Can be used with @code{m4_cdr}
|
|
to recursively iterate
|
|
through a list. Generally, when using quoted lists of quoted elements,
|
|
@code{m4_car} should be called without any extra quotes.
|
|
@end defmac
|
|
|
|
@defmac m4_cdr (@var{arg}@dots{})
|
|
@msindex{cdr}
|
|
Expands to a quoted list of all but the first @var{arg}, or the empty
|
|
string if there was only one argument. Generally, when using quoted
|
|
lists of quoted elements, @code{m4_cdr} should be called without any
|
|
extra quotes.
|
|
|
|
For example, this is a simple implementation of @code{m4_map}; note how
|
|
each iteration checks for the end of recursion, then merely applies the
|
|
first argument to the first element of the list, then repeats with the
|
|
rest of the list. (The actual implementation in M4sugar is a bit more
|
|
involved, to gain some speed and share code with @code{m4_map_sep}, and
|
|
also to avoid expanding side effects in @samp{$2} twice).
|
|
@example
|
|
m4_define([m4_map], [m4_ifval([$2],
|
|
[m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl
|
|
m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]])
|
|
@result{} 1 2 a
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_for (@var{var}, @var{first}, @var{last}, @ovar{step}, @
|
|
@var{expression})
|
|
@msindex{for}
|
|
Loop over the numeric values between @var{first} and @var{last}
|
|
including bounds by increments of @var{step}. For each iteration,
|
|
expand @var{expression} with the numeric value assigned to @var{var}.
|
|
If @var{step} is omitted, it defaults to @samp{1} or @samp{-1} depending
|
|
on the order of the limits. If given, @var{step} has to match this
|
|
order. The number of iterations is determined independently from
|
|
definition of @var{var}; iteration cannot be short-circuited or
|
|
lengthened by modifying @var{var} from within @var{expression}.
|
|
@end defmac
|
|
|
|
@defmac m4_foreach (@var{var}, @var{list}, @var{expression})
|
|
@msindex{foreach}
|
|
Loop over the comma-separated M4 list @var{list}, assigning each value
|
|
to @var{var}, and expand @var{expression}. The following example
|
|
outputs two lines:
|
|
|
|
@example
|
|
m4_foreach([myvar], [[foo], [bar, baz]],
|
|
[echo myvar
|
|
])dnl
|
|
@result{}echo foo
|
|
@result{}echo bar, baz
|
|
@end example
|
|
|
|
Note that for some forms of @var{expression}, it may be faster to use
|
|
@code{m4_map_args}.
|
|
@end defmac
|
|
|
|
@anchor{m4_foreach_w}
|
|
@defmac m4_foreach_w (@var{var}, @var{list}, @var{expression})
|
|
@msindex{foreach_w}
|
|
Loop over the white-space-separated list @var{list}, assigning each value
|
|
to @var{var}, and expand @var{expression}. If @var{var} is only
|
|
referenced once in @var{expression}, it is more efficient to use
|
|
@code{m4_map_args_w}.
|
|
|
|
The deprecated macro @code{AC_FOREACH} is an alias of
|
|
@code{m4_foreach_w}.
|
|
@end defmac
|
|
|
|
@defmac m4_map (@var{macro}, @var{list})
|
|
@defmacx m4_mapall (@var{macro}, @var{list})
|
|
@defmacx m4_map_sep (@var{macro}, @var{separator}, @var{list})
|
|
@defmacx m4_mapall_sep (@var{macro}, @var{separator}, @var{list})
|
|
@msindex{map}
|
|
@msindex{mapall}
|
|
@msindex{map_sep}
|
|
@msindex{mapall_sep}
|
|
Loop over the comma separated quoted list of argument descriptions in
|
|
@var{list}, and invoke @var{macro} with the arguments. An argument
|
|
description is in turn a comma-separated quoted list of quoted elements,
|
|
suitable for @code{m4_apply}. The macros @code{m4_map} and
|
|
@code{m4_map_sep} ignore empty argument descriptions, while
|
|
@code{m4_mapall} and @code{m4_mapall_sep} invoke @var{macro} with no
|
|
arguments. The macros @code{m4_map_sep} and @code{m4_mapall_sep}
|
|
additionally expand @var{separator} between invocations of @var{macro}.
|
|
|
|
Note that @var{separator} is expanded, unlike in @code{m4_join}. When
|
|
separating output with commas, this means that the map result can be
|
|
used as a series of arguments, by using a single-quoted comma as
|
|
@var{separator}, or as a single string, by using a double-quoted comma.
|
|
|
|
@example
|
|
m4_map([m4_count], [])
|
|
@result{}
|
|
m4_map([ m4_count], [[],
|
|
[[1]],
|
|
[[1], [2]]])
|
|
@result{} 1 2
|
|
m4_mapall([ m4_count], [[],
|
|
[[1]],
|
|
[[1], [2]]])
|
|
@result{} 0 1 2
|
|
m4_map_sep([m4_eval], [,], [[[1+2]],
|
|
[[10], [16]]])
|
|
@result{}3,a
|
|
m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
|
|
@result{}a,b
|
|
m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
|
|
@result{}2
|
|
m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
|
|
@result{}a,b
|
|
m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
|
|
@result{}1
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_map_args (@var{macro}, @var{arg}@dots{})
|
|
@msindex{map_args}
|
|
Repeatedly invoke @var{macro} with each successive @var{arg} as its only
|
|
argument. In the following example, three solutions are presented with
|
|
the same expansion; the solution using @code{m4_map_args} is the most
|
|
efficient.
|
|
@example
|
|
m4_define([active], [ACTIVE])dnl
|
|
m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
|
|
@result{} plain active
|
|
m4_map([ m4_echo], [[[plain]], [[active]]])
|
|
@result{} plain active
|
|
m4_map_args([ m4_echo], [plain], [active])
|
|
@result{} plain active
|
|
@end example
|
|
|
|
In cases where it is useful to operate on additional parameters besides
|
|
the list elements, the macro @code{m4_curry} can be used in @var{macro}
|
|
to supply the argument currying necessary to generate the desired
|
|
argument list. In the following example, @code{list_add_n} is more
|
|
efficient than @code{list_add_x}. On the other hand, using
|
|
@code{m4_map_args_sep} can be even more efficient.
|
|
|
|
@example
|
|
m4_define([list], [[1], [2], [3]])dnl
|
|
m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
|
|
dnl list_add_n(N, ARG...)
|
|
dnl Output a list consisting of each ARG added to N
|
|
m4_define([list_add_n],
|
|
[m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@@)))])dnl
|
|
list_add_n([1], list)
|
|
@result{}2,3,4
|
|
list_add_n([2], list)
|
|
@result{}3,4,5
|
|
m4_define([list_add_x],
|
|
[m4_shift(m4_foreach([var], m4_dquote(m4_shift($@@)),
|
|
[,add([$1],m4_defn([var]))]))])dnl
|
|
list_add_x([1], list)
|
|
@result{}2,3,4
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_map_args_pair (@var{macro}, @dvarv{macro-end, macro}, @
|
|
@var{arg}@dots{})
|
|
@msindex{map_args_pair}
|
|
For every pair of arguments @var{arg}, invoke @var{macro} with two
|
|
arguments. If there is an odd number of arguments, invoke
|
|
@var{macro-end}, which defaults to @var{macro}, with the remaining
|
|
argument.
|
|
|
|
@example
|
|
m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
|
|
@result{}, 2, 1, 3
|
|
m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
|
|
@result{}, 2, 1, [3]
|
|
m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
|
|
@result{}, 2, 1, 4, 3
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_map_args_sep (@ovar{pre}, @ovar{post}, @ovar{sep}, @var{arg}@dots{})
|
|
@msindex{map_args_sep}
|
|
Expand the sequence @code{@var{pre}[@var{arg}]@var{post}} for each
|
|
argument, additionally expanding @var{sep} between arguments. One
|
|
common use of this macro is constructing a macro call, where the opening
|
|
and closing parentheses are split between @var{pre} and @var{post}; in
|
|
particular, @code{m4_map_args([@var{macro}], [@var{arg}])} is equivalent
|
|
to @code{m4_map_args_sep([@var{macro}(], [)], [], [@var{arg}])}. This
|
|
macro provides the most efficient means for iterating over an arbitrary
|
|
list of arguments, particularly when repeatedly constructing a macro
|
|
call with more arguments than @var{arg}.
|
|
@end defmac
|
|
|
|
@defmac m4_map_args_w (@var{string}, @ovar{pre}, @ovar{post}, @ovar{sep})
|
|
@msindex{map_args_w}
|
|
Expand the sequence @code{@var{pre}[word]@var{post}} for each word in
|
|
the whitespace-separated @var{string}, additionally expanding @var{sep}
|
|
between words. This macro provides the most efficient means for
|
|
iterating over a whitespace-separated string. In particular,
|
|
@code{m4_map_args_w([@var{string}], [@var{action}(], [)])} is more
|
|
efficient than @code{m4_foreach_w([var], [@var{string}],
|
|
[@var{action}(m4_defn([var]))])}.
|
|
@end defmac
|
|
|
|
@defmac m4_shiftn (@var{count}, @dots{})
|
|
@defmacx m4_shift2 (@dots{})
|
|
@defmacx m4_shift3 (@dots{})
|
|
@msindex{shift2}
|
|
@msindex{shift3}
|
|
@msindex{shiftn}
|
|
@code{m4_shiftn} performs @var{count} iterations of @code{m4_shift},
|
|
along with validation that enough arguments were passed in to match the
|
|
shift count, and that the count is positive. @code{m4_shift2} and
|
|
@code{m4_shift3} are specializations
|
|
of @code{m4_shiftn}, introduced in Autoconf 2.62, and are more efficient
|
|
for two and three shifts, respectively.
|
|
@end defmac
|
|
|
|
@defmac m4_stack_foreach (@var{macro}, @var{action})
|
|
@defmacx m4_stack_foreach_lifo (@var{macro}, @var{action})
|
|
@msindex{stack_foreach}
|
|
@msindex{stack_foreach_lifo}
|
|
For each of the @code{m4_pushdef} definitions of @var{macro}, expand
|
|
@var{action} with the single argument of a definition of @var{macro}.
|
|
@code{m4_stack_foreach} starts with the oldest definition, while
|
|
@code{m4_stack_foreach_lifo} starts with the current definition.
|
|
@var{action} should not push or pop definitions of @var{macro}, nor is
|
|
there any guarantee that the current definition of @var{macro} matches
|
|
the argument that was passed to @var{action}. The macro @code{m4_curry}
|
|
can be used if @var{action} needs more than one argument, although in
|
|
that case it is more efficient to use @var{m4_stack_foreach_sep}.
|
|
|
|
Due to technical limitations, there are a few low-level m4sugar
|
|
functions, such as @code{m4_pushdef}, that cannot be used as the
|
|
@var{macro} argument.
|
|
|
|
@example
|
|
m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
|
|
m4_stack_foreach([a], [ m4_incr])
|
|
@result{} 2 3
|
|
m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
|
|
@result{} cd bcd
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_stack_foreach_sep (@var{macro}, @ovar{pre}, @ovar{post}, @ovar{sep})
|
|
@defmacx m4_stack_foreach_sep_lifo (@var{macro}, @ovar{pre}, @ovar{post}, @
|
|
@ovar{sep})
|
|
@msindex{stack_foreach_sep}
|
|
@msindex{stack_foreach_sep_lifo}
|
|
Expand the sequence @code{@var{pre}[definition]@var{post}} for each
|
|
@code{m4_pushdef} definition of @var{macro}, additionally expanding
|
|
@var{sep} between definitions. @code{m4_stack_foreach_sep} visits the
|
|
oldest definition first, while @code{m4_stack_foreach_sep_lifo} visits
|
|
the current definition first. This macro provides the most efficient
|
|
means for iterating over a pushdef stack. In particular,
|
|
@code{m4_stack_foreach([@var{macro}], [@var{action}])} is short for
|
|
@code{m4_stack_foreach_sep([@var{macro}], [@var{action}(], [)])}.
|
|
@end defmac
|
|
|
|
@node Evaluation Macros
|
|
@subsection Evaluation Macros
|
|
|
|
The following macros give some control over the order of the evaluation
|
|
by adding or removing levels of quotes.
|
|
|
|
@defmac m4_apply (@var{macro}, @var{list})
|
|
@msindex{apply}
|
|
Apply the elements of the quoted, comma-separated @var{list} as the
|
|
arguments to @var{macro}. If @var{list} is empty, invoke @var{macro}
|
|
without arguments. Note the difference between @code{m4_indir}, which
|
|
expects its first argument to be a macro name but can use names that are
|
|
otherwise invalid, and @code{m4_apply}, where @var{macro} can contain
|
|
other text, but must end in a valid macro name.
|
|
@example
|
|
m4_apply([m4_count], [])
|
|
@result{}0
|
|
m4_apply([m4_count], [[]])
|
|
@result{}1
|
|
m4_apply([m4_count], [[1], [2]])
|
|
@result{}2
|
|
m4_apply([m4_join], [[|], [1], [2]])
|
|
@result{}1|2
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_count (@var{arg}, @dots{})
|
|
@msindex{count}
|
|
This macro returns the number of arguments it was passed.
|
|
@end defmac
|
|
|
|
@defmac m4_curry (@var{macro}, @var{arg}@dots{})
|
|
@msindex{curry}
|
|
This macro performs argument currying. The expansion of this macro is
|
|
another macro name that expects exactly one argument; that argument is
|
|
then appended to the @var{arg} list, and then @var{macro} is expanded
|
|
with the resulting argument list.
|
|
|
|
@example
|
|
m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
|
|
@result{}3, 2, 1
|
|
@end example
|
|
|
|
Unfortunately, due to a limitation in M4 1.4.x, it is not possible to
|
|
pass the definition of a builtin macro as the argument to the output of
|
|
@code{m4_curry}; the empty string is used instead of the builtin token.
|
|
This behavior is rectified by using M4 1.6 or newer.
|
|
@end defmac
|
|
|
|
@defmac m4_do (@var{arg}, @dots{})
|
|
@msindex{do}
|
|
This macro loops over its arguments and expands each @var{arg} in
|
|
sequence. Its main use is for readability; it allows the use of
|
|
indentation and fewer @code{dnl} to result in the same expansion. This
|
|
macro guarantees that no expansion will be concatenated with subsequent
|
|
text; to achieve full concatenation, use @code{m4_unquote(m4_join([],
|
|
@var{arg@dots{}}))}.
|
|
|
|
@example
|
|
m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
|
|
m4_do([a],[b])c
|
|
@result{}abc
|
|
m4_unquote(m4_join([],[a],[b]))c
|
|
@result{}3
|
|
m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl
|
|
m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl
|
|
m4_do([a],[b])c
|
|
@result{}ABC
|
|
m4_unquote(m4_join([],[a],[b]))c
|
|
@result{}3
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_dquote (@var{arg}, @dots{})
|
|
@msindex{dquote}
|
|
Return the arguments as a quoted list of quoted arguments.
|
|
Conveniently, if there is just one @var{arg}, this effectively adds a
|
|
level of quoting.
|
|
@end defmac
|
|
|
|
@defmac m4_dquote_elt (@var{arg}, @dots{})
|
|
@msindex{dquote_elt}
|
|
Return the arguments as a series of double-quoted arguments. Whereas
|
|
@code{m4_dquote} returns a single argument, @code{m4_dquote_elt} returns
|
|
as many arguments as it was passed.
|
|
@end defmac
|
|
|
|
@defmac m4_echo (@var{arg}, @dots{})
|
|
@msindex{echo}
|
|
Return the arguments, with the same level of quoting. Other than
|
|
discarding whitespace after unquoted commas, this macro is a no-op.
|
|
@end defmac
|
|
|
|
@defmac m4_expand (@var{arg})
|
|
@msindex{expand}
|
|
Return the expansion of @var{arg} as a quoted string. Whereas
|
|
@code{m4_quote} is designed to collect expanded text into a single
|
|
argument, @code{m4_expand} is designed to perform one level of expansion
|
|
on quoted text. One distinction is in the treatment of whitespace
|
|
following a comma in the original @var{arg}. Any time multiple
|
|
arguments are collected into one with @code{m4_quote}, the M4 argument
|
|
collection rules discard the whitespace. However, with @code{m4_expand},
|
|
whitespace is preserved, even after the expansion of macros contained in
|
|
@var{arg}. Additionally, @code{m4_expand} is able to expand text that
|
|
would involve an unterminated comment, whereas expanding that same text
|
|
as the argument to @code{m4_quote} runs into difficulty in finding the
|
|
end of the argument. Since manipulating diversions during argument
|
|
collection is inherently unsafe, @code{m4_expand} issues an error if
|
|
@var{arg} attempts to change the current diversion (@pxref{Diversion
|
|
support}).
|
|
|
|
@example
|
|
m4_define([active], [ACT, IVE])dnl
|
|
m4_define([active2], [[ACT, IVE]])dnl
|
|
m4_quote(active, active)
|
|
@result{}ACT,IVE,ACT,IVE
|
|
m4_expand([active, active])
|
|
@result{}ACT, IVE, ACT, IVE
|
|
m4_quote(active2, active2)
|
|
@result{}ACT, IVE,ACT, IVE
|
|
m4_expand([active2, active2])
|
|
@result{}ACT, IVE, ACT, IVE
|
|
m4_expand([# m4_echo])
|
|
@result{}# m4_echo
|
|
m4_quote(# m4_echo)
|
|
)
|
|
@result{}# m4_echo)
|
|
@result{}
|
|
@end example
|
|
|
|
Note that @code{m4_expand} cannot handle an @var{arg} that expands to
|
|
literal unbalanced quotes, but that quadrigraphs can be used when
|
|
unbalanced output is necessary. Likewise, unbalanced parentheses should
|
|
be supplied with double quoting or a quadrigraph.
|
|
|
|
@example
|
|
m4_define([pattern], [[!@@<:@@]])dnl
|
|
m4_define([bar], [BAR])dnl
|
|
m4_expand([case $foo in
|
|
m4_defn([pattern])@@:@}@@ bar ;;
|
|
*[)] blah ;;
|
|
esac])
|
|
@result{}case $foo in
|
|
@result{} [![]) BAR ;;
|
|
@result{} *) blah ;;
|
|
@result{}esac
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_ignore (@dots{})
|
|
@msindex{ignore}
|
|
This macro was introduced in Autoconf 2.62. Expands to nothing,
|
|
ignoring all of its arguments. By itself, this isn't very useful.
|
|
However, it can be used to conditionally ignore an arbitrary number of
|
|
arguments, by deciding which macro name to apply to a list of arguments.
|
|
@example
|
|
dnl foo outputs a message only if [debug] is defined.
|
|
m4_define([foo],
|
|
[m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])
|
|
@end example
|
|
|
|
Note that for earlier versions of Autoconf, the macro @code{__gnu__} can
|
|
serve the same purpose, although it is less readable.
|
|
@end defmac
|
|
|
|
@defmac m4_make_list (@var{arg}, @dots{})
|
|
@msindex{make_list}
|
|
This macro exists to aid debugging of M4sugar algorithms. Its net
|
|
effect is similar to @code{m4_dquote}---it produces a quoted list of
|
|
quoted arguments, for each @var{arg}. The difference is that this
|
|
version uses a comma-newline separator instead of just comma, to improve
|
|
readability of the list; with the result that it is less efficient than
|
|
@code{m4_dquote}.
|
|
@example
|
|
m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
|
|
m4_dquote(zero, [one], [[two]])
|
|
@result{}[0],[one],[[two]]
|
|
m4_make_list(zero, [one], [[two]])
|
|
@result{}[0],
|
|
@result{}[one],
|
|
@result{}[[two]]
|
|
m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
|
|
@result{} 0 1 two
|
|
m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
|
|
@result{} 0 1 two
|
|
@end example
|
|
@end defmac
|
|
|
|
@c m4_noquote is too dangerous to document - it invokes macros that
|
|
@c probably rely on @samp{[]} nested quoting for proper operation. The
|
|
@c user should generally prefer m4_unquote instead.
|
|
|
|
@defmac m4_quote (@var{arg}, @dots{})
|
|
@msindex{quote}
|
|
Return the arguments as a single entity, i.e., wrap them into a pair of
|
|
quotes. This effectively collapses multiple arguments into one,
|
|
although it loses whitespace after unquoted commas in the process.
|
|
@end defmac
|
|
|
|
@defmac m4_reverse (@var{arg}, @dots{})
|
|
@msindex{reverse}
|
|
Outputs each argument with the same level of quoting, but in reverse
|
|
order, and with space following each comma for readability.
|
|
|
|
@example
|
|
m4_define([active], [ACT,IVE])
|
|
@result{}
|
|
m4_reverse(active, [active])
|
|
@result{}active, IVE, ACT
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_unquote (@var{arg}, @dots{})
|
|
@msindex{unquote}
|
|
This macro was introduced in Autoconf 2.62. Expand each argument,
|
|
separated by commas. For a single @var{arg}, this effectively removes a
|
|
layer of quoting, and @code{m4_unquote([@var{arg}])} is more efficient
|
|
than the equivalent @code{m4_do([@var{arg}])}. For multiple arguments,
|
|
this results in an unquoted list of expansions. This is commonly used
|
|
with @code{m4_split}, in order to convert a single quoted list into a
|
|
series of quoted elements.
|
|
@end defmac
|
|
|
|
The following example aims at emphasizing the difference between several
|
|
scenarios: not using these macros, using @code{m4_defn}, using
|
|
@code{m4_quote}, using @code{m4_dquote}, and using @code{m4_expand}.
|
|
|
|
@example
|
|
$ @kbd{cat example.m4}
|
|
dnl Overquote, so that quotes are visible.
|
|
m4_define([show], [$[]1 = [$1], $[]@@ = [$@@]])
|
|
m4_define([a], [A])
|
|
m4_define([mkargs], [1, 2[,] 3])
|
|
m4_define([arg1], [[$1]])
|
|
m4_divert([0])dnl
|
|
show(a, b)
|
|
show([a, b])
|
|
show(m4_quote(a, b))
|
|
show(m4_dquote(a, b))
|
|
show(m4_expand([a, b]))
|
|
|
|
arg1(mkargs)
|
|
arg1([mkargs])
|
|
arg1(m4_defn([mkargs]))
|
|
arg1(m4_quote(mkargs))
|
|
arg1(m4_dquote(mkargs))
|
|
arg1(m4_expand([mkargs]))
|
|
$ @kbd{autom4te -l m4sugar example.m4}
|
|
$1 = A, $@@ = [A],[b]
|
|
$1 = a, b, $@@ = [a, b]
|
|
$1 = A,b, $@@ = [A,b]
|
|
$1 = [A],[b], $@@ = [[A],[b]]
|
|
$1 = A, b, $@@ = [A, b]
|
|
|
|
1
|
|
mkargs
|
|
1, 2[,] 3
|
|
1,2, 3
|
|
[1],[2, 3]
|
|
1, 2, 3
|
|
@end example
|
|
|
|
|
|
@node Text processing Macros
|
|
@subsection String manipulation in M4
|
|
|
|
The following macros may be used to manipulate strings in M4. Many of
|
|
the macros in this section intentionally result in quoted strings as
|
|
output, rather than subjecting the arguments to further expansions. As
|
|
a result, if you are manipulating text that contains active M4
|
|
characters, the arguments are passed with single quoting rather than
|
|
double.
|
|
|
|
@defmac m4_append (@var{macro-name}, @var{string}, @ovar{separator})
|
|
@defmacx m4_append_uniq (@var{macro-name}, @var{string}, @ovar{separator} @
|
|
@ovar{if-uniq}, @ovar{if-duplicate})
|
|
@msindex{append}
|
|
@msindex{append_uniq}
|
|
Redefine @var{macro-name} to its former contents with @var{separator}
|
|
and @var{string} added at the end. If @var{macro-name} was undefined
|
|
before (but not if it was defined but empty), then no @var{separator} is
|
|
added. As of Autoconf 2.62, neither @var{string} nor @var{separator}
|
|
are expanded during this macro; instead, they are expanded when
|
|
@var{macro-name} is invoked.
|
|
|
|
@code{m4_append} can be used to grow strings, and @code{m4_append_uniq}
|
|
to grow strings without duplicating substrings. Additionally,
|
|
@code{m4_append_uniq} takes two optional parameters as of Autoconf 2.62;
|
|
@var{if-uniq} is expanded if @var{string} was appended, and
|
|
@var{if-duplicate} is expanded if @var{string} was already present.
|
|
Also, @code{m4_append_uniq} warns if @var{separator} is not empty, but
|
|
occurs within @var{string}, since that can lead to duplicates.
|
|
|
|
Note that @code{m4_append} can scale linearly in the length of the final
|
|
string, depending on the quality of the underlying M4 implementation,
|
|
while @code{m4_append_uniq} has an inherent quadratic scaling factor.
|
|
If an algorithm can tolerate duplicates in the final string, use the
|
|
former for speed. If duplicates must be avoided, consider using
|
|
@code{m4_set_add} instead (@pxref{Set manipulation Macros}).
|
|
|
|
@example
|
|
m4_define([active], [ACTIVE])dnl
|
|
m4_append([sentence], [This is an])dnl
|
|
m4_append([sentence], [ active ])dnl
|
|
m4_append([sentence], [symbol.])dnl
|
|
sentence
|
|
@result{}This is an ACTIVE symbol.
|
|
m4_undefine([active])dnl
|
|
@result{}This is an active symbol.
|
|
m4_append_uniq([list], [one], [, ], [new], [existing])
|
|
@result{}new
|
|
m4_append_uniq([list], [one], [, ], [new], [existing])
|
|
@result{}existing
|
|
m4_append_uniq([list], [two], [, ], [new], [existing])
|
|
@result{}new
|
|
m4_append_uniq([list], [three], [, ], [new], [existing])
|
|
@result{}new
|
|
m4_append_uniq([list], [two], [, ], [new], [existing])
|
|
@result{}existing
|
|
list
|
|
@result{}one, two, three
|
|
m4_dquote(list)
|
|
@result{}[one],[two],[three]
|
|
m4_append([list2], [one], [[, ]])dnl
|
|
m4_append_uniq([list2], [two], [[, ]])dnl
|
|
m4_append([list2], [three], [[, ]])dnl
|
|
list2
|
|
@result{}one, two, three
|
|
m4_dquote(list2)
|
|
@result{}[one, two, three]
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_append_uniq_w (@var{macro-name}, @var{strings})
|
|
@msindex{append_uniq_w}
|
|
This macro was introduced in Autoconf 2.62. It is similar to
|
|
@code{m4_append_uniq}, but treats @var{strings} as a whitespace
|
|
separated list of words to append, and only appends unique words.
|
|
@var{macro-name} is updated with a single space between new words.
|
|
@example
|
|
m4_append_uniq_w([numbers], [1 1 2])dnl
|
|
m4_append_uniq_w([numbers], [ 2 3 ])dnl
|
|
numbers
|
|
@result{}1 2 3
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_chomp (@var{string})
|
|
@defmacx m4_chomp_all (@var{string})
|
|
@msindex{chomp}
|
|
@msindex{chomp_all}
|
|
Output @var{string} in quotes, but without a trailing newline. The
|
|
macro @code{m4_chomp} is slightly faster, and removes at most one
|
|
newline; the macro @code{m4_chomp_all} removes all consecutive trailing
|
|
newlines. Unlike @code{m4_flatten}, embedded newlines are left intact,
|
|
and backslash does not influence the result.
|
|
@end defmac
|
|
|
|
@defmac m4_combine (@ovar{separator}, @var{prefix-list}, @ovar{infix}, @
|
|
@var{suffix-1}, @ovar{suffix-2}, @dots{})
|
|
@msindex{combine}
|
|
This macro produces a quoted string containing the pairwise combination
|
|
of every element of the quoted, comma-separated @var{prefix-list}, and
|
|
every element from the @var{suffix} arguments. Each pairwise
|
|
combination is joined with @var{infix} in the middle, and successive
|
|
pairs are joined by @var{separator}. No expansion occurs on any of the
|
|
arguments. No output occurs if either the @var{prefix} or @var{suffix}
|
|
list is empty, but the lists can contain empty elements.
|
|
@example
|
|
m4_define([a], [oops])dnl
|
|
m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
|
|
@result{}a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
|
|
m4_combine([, ], [[a], [b]], [-])
|
|
@result{}
|
|
m4_combine([, ], [[a], [b]], [-], [])
|
|
@result{}a-, b-
|
|
m4_combine([, ], [], [-], [1], [2])
|
|
@result{}
|
|
m4_combine([, ], [[]], [-], [1], [2])
|
|
@result{}-1, -2
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_escape (@var{string})
|
|
@msindex{escape}
|
|
Convert all instances of @samp{[}, @samp{]}, @samp{#}, and @samp{$}
|
|
within @var{string} into their respective quadrigraphs. The result is
|
|
still a quoted string.
|
|
@end defmac
|
|
|
|
@defmac m4_flatten (@var{string})
|
|
@msindex{flatten}
|
|
Flatten @var{string} into a single line. Delete all backslash-newline
|
|
pairs, and replace all remaining newlines with a space. The result is
|
|
still a quoted string.
|
|
@end defmac
|
|
|
|
@defmac m4_join (@ovar{separator}, @var{args}@dots{})
|
|
@defmacx m4_joinall (@ovar{separator}, @var{args}@dots{})
|
|
@msindex{join}
|
|
@msindex{joinall}
|
|
Concatenate each @var{arg}, separated by @var{separator}.
|
|
@code{joinall} uses every argument, while @code{join} omits empty
|
|
arguments so that there are no back-to-back separators in the output.
|
|
The result is a quoted string.
|
|
@example
|
|
m4_define([active], [ACTIVE])dnl
|
|
m4_join([|], [one], [], [active], [two])
|
|
@result{}one|active|two
|
|
m4_joinall([|], [one], [], [active], [two])
|
|
@result{}one||active|two
|
|
@end example
|
|
|
|
Note that if all you intend to do is join @var{args} with commas between
|
|
them, to form a quoted list suitable for @code{m4_foreach}, it is more
|
|
efficient to use @code{m4_dquote}.
|
|
@end defmac
|
|
|
|
@defmac m4_newline (@ovar{text})
|
|
@msindex{newline}
|
|
This macro was introduced in Autoconf 2.62, and expands to a newline,
|
|
followed by any @var{text}.
|
|
It is primarily useful for maintaining macro formatting, and ensuring
|
|
that M4 does not discard leading whitespace during argument collection.
|
|
@end defmac
|
|
|
|
@defmac m4_normalize (@var{string})
|
|
@msindex{normalize}
|
|
Remove leading and trailing spaces and tabs, sequences of
|
|
backslash-then-newline, and replace multiple spaces, tabs, and newlines
|
|
with a single space. This is a combination of @code{m4_flatten} and
|
|
@code{m4_strip}. To determine if @var{string} consists only of bytes
|
|
that would be removed by @code{m4_normalize}, you can use
|
|
@code{m4_ifblank}.
|
|
@end defmac
|
|
|
|
@defmac m4_re_escape (@var{string})
|
|
@msindex{re_escape}
|
|
Backslash-escape all characters in @var{string} that are active in
|
|
regexps.
|
|
@end defmac
|
|
|
|
@c We cannot use @dvar because the macro expansion mistreats backslashes.
|
|
@defmac m4_split (@var{string}, @r{[}@var{regexp} = @samp{[\t ]+}@r{]})
|
|
@msindex{split}
|
|
Split @var{string} into an M4 list of elements quoted by @samp{[} and
|
|
@samp{]}, while keeping white space at the beginning and at the end.
|
|
If @var{regexp} is given, use it instead of @samp{[\t ]+} for splitting.
|
|
If @var{string} is empty, the result is an empty list.
|
|
@end defmac
|
|
|
|
@defmac m4_strip (@var{string})
|
|
@msindex{strip}
|
|
Strip whitespace from @var{string}. Sequences of spaces and tabs are
|
|
reduced to a single space, then leading and trailing spaces are removed.
|
|
The result is still a quoted string. Note that this does not interfere
|
|
with newlines; if you want newlines stripped as well, consider
|
|
@code{m4_flatten}, or do it all at once with @code{m4_normalize}. To
|
|
quickly test if @var{string} has only whitespace, use @code{m4_ifblank}.
|
|
@end defmac
|
|
|
|
@defmac m4_text_box (@var{message}, @dvar{frame, -})
|
|
@msindex{text_box}
|
|
Add a text box around @var{message}, using @var{frame} as the border
|
|
character above and below the message. The @var{frame} argument must be
|
|
a single byte, and does not support quadrigraphs.
|
|
The frame correctly accounts for
|
|
the subsequent expansion of @var{message}. For example:
|
|
@example
|
|
m4_define([macro], [abc])dnl
|
|
m4_text_box([macro])
|
|
@result{}## --- ##
|
|
@result{}## abc ##
|
|
@result{}## --- ##
|
|
@end example
|
|
|
|
The @var{message} must contain balanced quotes and parentheses, although
|
|
quadrigraphs can be used to work around this.
|
|
@end defmac
|
|
|
|
@defmac m4_text_wrap (@var{string}, @ovar{prefix}, @
|
|
@dvarv{prefix1, prefix}, @dvar{width, 79})
|
|
@msindex{text_wrap}
|
|
Break @var{string} into a series of whitespace-separated words, then
|
|
output those words separated by spaces, and wrapping lines any time the
|
|
output would exceed @var{width} columns. If given, @var{prefix1} begins
|
|
the first line, and @var{prefix} begins all wrapped lines. If
|
|
@var{prefix1} is longer than @var{prefix}, then the first line consists
|
|
of just @var{prefix1}. If @var{prefix} is longer than @var{prefix1},
|
|
padding is inserted so that the first word of @var{string} begins at the
|
|
same indentation as all wrapped lines. Note that using literal tab
|
|
characters in any of the arguments will interfere with the calculation
|
|
of width. No expansions occur on @var{prefix}, @var{prefix1}, or the
|
|
words of @var{string}, although quadrigraphs are recognized.
|
|
|
|
For some examples:
|
|
@example
|
|
m4_text_wrap([Short string */], [ ], [/* ], [20])
|
|
@result{}/* Short string */
|
|
m4_text_wrap([Much longer string */], [ ], [/* ], [20])
|
|
@result{}/* Much longer
|
|
@result{} string */
|
|
m4_text_wrap([Short doc.], [ ], [ --short ], [30])
|
|
@result{} --short Short doc.
|
|
m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30])
|
|
@result{} --too-wide
|
|
@result{} Short doc.
|
|
m4_text_wrap([Super long documentation.], [ ],
|
|
[ --too-wide ], 30)
|
|
@result{} --too-wide
|
|
@result{} Super long
|
|
@result{} documentation.
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_tolower (@var{string})
|
|
@defmacx m4_toupper (@var{string})
|
|
@msindex{tolower}
|
|
@msindex{toupper}
|
|
Return @var{string} with letters converted to upper or lower case,
|
|
respectively.
|
|
@end defmac
|
|
|
|
@node Number processing Macros
|
|
@subsection Arithmetic computation in M4
|
|
|
|
The following macros facilitate integer arithmetic operations.
|
|
|
|
Where a parameter is documented as taking an arithmetic expression, you
|
|
can use anything that can be parsed by @code{m4_eval}.
|
|
Any other numeric parameter should consist of an optional sign followed
|
|
by one or more decimal digits; it is treated as a decimal integer.
|
|
|
|
Macros that expand to a number do so as either @samp{0}, or an optional
|
|
@samp{-} followed by a nonzero decimal digit followed by zero or more
|
|
decimal digits.
|
|
|
|
Due to @command{m4} limitations, arithmetic expressions and numeric
|
|
parameters should use only numbers that fit into a 32-bit signed
|
|
integer.
|
|
|
|
@defmac m4_cmp (@var{expr-1}, @var{expr-2})
|
|
@msindex{cmp}
|
|
Compare the arithmetic expressions @var{expr-1} and @var{expr-2}, and
|
|
expand to @samp{-1} if @var{expr-1} is smaller, @samp{0} if they are
|
|
equal, and @samp{1} if @var{expr-1} is larger.
|
|
@end defmac
|
|
|
|
@defmac m4_list_cmp (@var{list-1}, @var{list-2})
|
|
@msindex{list_cmp}
|
|
Compare the two M4 lists consisting of comma-separated arithmetic
|
|
expressions, left to right. Expand to @samp{-1} for the first element
|
|
pairing where the value from @var{list-1} is smaller, @samp{1} where the
|
|
value from @var{list-2} is smaller, or @samp{0} if both lists have the
|
|
same values. If one list is shorter than the other, the remaining
|
|
elements of the longer list are compared against zero.
|
|
@example
|
|
m4_list_cmp([1, 0], [1])
|
|
@result{}0
|
|
m4_list_cmp([1, [1 * 0]], [1, 0])
|
|
@result{}0
|
|
m4_list_cmp([1, 2], [1, 0])
|
|
@result{}1
|
|
m4_list_cmp([1, [1+1], 3],[1, 2])
|
|
@result{}1
|
|
m4_list_cmp([1, 2, -3], [1, 2])
|
|
@result{}-1
|
|
m4_list_cmp([1, 0], [1, 2])
|
|
@result{}-1
|
|
m4_list_cmp([1], [1, 2])
|
|
@result{}-1
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_max (@var{arg}, @dots{})
|
|
@msindex{max}
|
|
This macro was introduced in Autoconf 2.62. Expand to the value
|
|
of the maximum arithmetic expression among all the arguments.
|
|
@end defmac
|
|
|
|
@defmac m4_min (@var{arg}, @dots{})
|
|
@msindex{min}
|
|
This macro was introduced in Autoconf 2.62. Expand to the value
|
|
of the minimum arithmetic expression among all the arguments.
|
|
@end defmac
|
|
|
|
@defmac m4_sign (@var{expr})
|
|
@msindex{sign}
|
|
Expand to @samp{-1} if the arithmetic expression @var{expr} is negative,
|
|
@samp{1} if it is positive, and @samp{0} if it is zero.
|
|
@end defmac
|
|
|
|
@anchor{m4_version_compare}
|
|
@defmac m4_version_compare (@var{version-1}, @var{version-2})
|
|
@msindex{version_compare}
|
|
This macro was introduced in Autoconf 2.53, but had a number of
|
|
usability limitations that were not lifted until Autoconf 2.62. Compare
|
|
the version strings @var{version-1} and @var{version-2}, and expand to
|
|
@samp{-1} if @var{version-1} is smaller, @samp{0} if they are the same,
|
|
or @samp{1} @var{version-2} is smaller. Version strings must be a list
|
|
of elements separated by @samp{.}, @samp{,} or @samp{-}, where each
|
|
element is a number along with optional case-insensitive letters
|
|
designating beta releases. The comparison stops at the leftmost element
|
|
that contains a difference, although a 0 element compares equal to a
|
|
missing element.
|
|
|
|
It is permissible to include commit identifiers in @var{version}, such
|
|
as an abbreviated SHA1 of the commit, provided there is still a
|
|
monotonically increasing prefix to allow for accurate version-based
|
|
comparisons. For example, this paragraph was written when the
|
|
development snapshot of autoconf claimed to be at version
|
|
@samp{2.61a-248-dc51}, or 248 commits after the 2.61a release, with an
|
|
abbreviated commit identification of @samp{dc51}.
|
|
|
|
@example
|
|
m4_version_compare([1.1], [2.0])
|
|
@result{}-1
|
|
m4_version_compare([2.0b], [2.0a])
|
|
@result{}1
|
|
m4_version_compare([1.1.1], [1.1.1a])
|
|
@result{}-1
|
|
m4_version_compare([1.2], [1.1.1a])
|
|
@result{}1
|
|
m4_version_compare([1.0], [1])
|
|
@result{}0
|
|
m4_version_compare([1.1pre], [1.1PRE])
|
|
@result{}0
|
|
m4_version_compare([1.1a], [1,10])
|
|
@result{}-1
|
|
m4_version_compare([2.61a], [2.61a-248-dc51])
|
|
@result{}-1
|
|
m4_version_compare([2.61b], [2.61a-248-dc51])
|
|
@result{}1
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_version_prereq (@var{version}, @ovar{if-new-enough}, @
|
|
@dvar{if-old, m4_fatal})
|
|
@msindex{version_prereq}
|
|
Compares @var{version} against the version of Autoconf currently
|
|
running. If the running version is at @var{version} or newer, expand
|
|
@var{if-new-enough}, but if @var{version} is larger than the version
|
|
currently executing, expand @var{if-old}, which defaults to printing an
|
|
error message and exiting m4sugar with status 63. When given only one
|
|
argument, this behaves like @code{AC_PREREQ} (@pxref{Versioning}).
|
|
Remember that the autoconf philosophy favors feature checks over version
|
|
checks.
|
|
@end defmac
|
|
|
|
@node Set manipulation Macros
|
|
@subsection Set manipulation in M4
|
|
@cindex Set manipulation
|
|
@cindex Data structure, set
|
|
@cindex Unordered set manipulation
|
|
|
|
Sometimes, it is necessary to track a set of data, where the order does
|
|
not matter and where there are no duplicates in the set. The following
|
|
macros facilitate set manipulations. Each set is an opaque object,
|
|
which can only be accessed via these basic operations. The underlying
|
|
implementation guarantees linear scaling for set creation, which is more
|
|
efficient than using the quadratic @code{m4_append_uniq}. Both set
|
|
names and values can be arbitrary strings, except for unbalanced quotes.
|
|
This implementation ties up memory for removed elements until the next
|
|
operation that must traverse all the elements of a set; and although
|
|
that may slow down some operations until the memory for removed elements
|
|
is pruned, it still guarantees linear performance.
|
|
|
|
@defmac m4_set_add (@var{set}, @var{value}, @ovar{if-uniq}, @ovar{if-dup})
|
|
@msindex{set_add}
|
|
Adds the string @var{value} as a member of set @var{set}. Expand
|
|
@var{if-uniq} if the element was added, or @var{if-dup} if it was
|
|
previously in the set. Operates in amortized constant time, so that set
|
|
creation scales linearly.
|
|
@end defmac
|
|
|
|
@defmac m4_set_add_all (@var{set}, @var{value}@dots{})
|
|
@msindex{set_add_all}
|
|
Adds each @var{value} to the set @var{set}. This is slightly more
|
|
efficient than repeatedly invoking @code{m4_set_add}.
|
|
@end defmac
|
|
|
|
@defmac m4_set_contains (@var{set}, @var{value}, @ovar{if-present}, @
|
|
@ovar{if-absent})
|
|
@msindex{set_contains}
|
|
Expands @var{if-present} if the string @var{value} is a member of
|
|
@var{set}, otherwise @var{if-absent}.
|
|
|
|
@example
|
|
m4_set_contains([a], [1], [yes], [no])
|
|
@result{}no
|
|
m4_set_add([a], [1], [added], [dup])
|
|
@result{}added
|
|
m4_set_add([a], [1], [added], [dup])
|
|
@result{}dup
|
|
m4_set_contains([a], [1], [yes], [no])
|
|
@result{}yes
|
|
m4_set_remove([a], [1], [removed], [missing])
|
|
@result{}removed
|
|
m4_set_contains([a], [1], [yes], [no])
|
|
@result{}no
|
|
m4_set_remove([a], [1], [removed], [missing])
|
|
@result{}missing
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_set_contents (@var{set}, @ovar{sep})
|
|
@defmacx m4_set_dump (@var{set}, @ovar{sep})
|
|
@msindex{set_contents}
|
|
@msindex{set_dump}
|
|
Expands to a single string consisting of all the members of the set
|
|
@var{set}, each separated by @var{sep}, which is not expanded.
|
|
@code{m4_set_contents} leaves the elements in @var{set} but reclaims any
|
|
memory occupied by removed elements, while @code{m4_set_dump} is a
|
|
faster one-shot action that also deletes the set. No provision is made
|
|
for disambiguating members that contain a non-empty @var{sep} as a
|
|
substring; use @code{m4_set_empty} to distinguish between an empty set
|
|
and the set containing only the empty string. The order of the output
|
|
is unspecified; in the current implementation, part of the speed of
|
|
@code{m4_set_dump} results from using a different output order than
|
|
@code{m4_set_contents}. These macros scale linearly in the size of the
|
|
set before memory pruning, and @code{m4_set_contents([@var{set}],
|
|
[@var{sep}])} is faster than
|
|
@code{m4_joinall([@var{sep}]m4_set_listc([@var{set}]))}.
|
|
|
|
@example
|
|
m4_set_add_all([a], [1], [2], [3])
|
|
@result{}
|
|
m4_set_contents([a], [-])
|
|
@result{}1-2-3
|
|
m4_joinall([-]m4_set_listc([a]))
|
|
@result{}1-2-3
|
|
m4_set_dump([a], [-])
|
|
@result{}3-2-1
|
|
m4_set_contents([a])
|
|
@result{}
|
|
m4_set_add([a], [])
|
|
@result{}
|
|
m4_set_contents([a], [-])
|
|
@result{}
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_set_delete (@var{set})
|
|
@msindex{set_delete}
|
|
Delete all elements and memory associated with @var{set}. This is
|
|
linear in the set size, and faster than removing one element at a time.
|
|
@end defmac
|
|
|
|
@defmac m4_set_difference (@var{seta}, @var{setb})
|
|
@defmacx m4_set_intersection (@var{seta}, @var{setb})
|
|
@defmacx m4_set_union (@var{seta}, @var{setb})
|
|
@msindex{set_difference}
|
|
@msindex{set_intersection}
|
|
@msindex{set_union}
|
|
Compute the relation between @var{seta} and @var{setb}, and output the
|
|
result as a list of quoted arguments without duplicates and with a
|
|
leading comma. Set difference selects the elements in @var{seta} but
|
|
not @var{setb}, intersection selects only elements in both sets, and
|
|
union selects elements in either set. These actions are linear in the
|
|
sum of the set sizes. The leading comma is necessary to distinguish
|
|
between no elements and the empty string as the only element.
|
|
|
|
@example
|
|
m4_set_add_all([a], [1], [2], [3])
|
|
@result{}
|
|
m4_set_add_all([b], [3], [], [4])
|
|
@result{}
|
|
m4_set_difference([a], [b])
|
|
@result{},1,2
|
|
m4_set_difference([b], [a])
|
|
@result{},,4
|
|
m4_set_intersection([a], [b])
|
|
@result{},3
|
|
m4_set_union([a], [b])
|
|
@result{},1,2,3,,4
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_set_empty (@var{set}, @ovar{if-empty}, @ovar{if-elements})
|
|
@msindex{set_empty}
|
|
Expand @var{if-empty} if the set @var{set} has no elements, otherwise
|
|
expand @var{if-elements}. This macro operates in constant time. Using
|
|
this macro can help disambiguate output from @code{m4_set_contents} or
|
|
@code{m4_set_list}.
|
|
@end defmac
|
|
|
|
@defmac m4_set_foreach (@var{set}, @var{variable}, @var{action})
|
|
@msindex{set_foreach}
|
|
For each element in the set @var{set}, expand @var{action} with the
|
|
macro @var{variable} defined as the set element. Behavior is
|
|
unspecified if @var{action} recursively lists the contents of @var{set}
|
|
(although listing other sets is acceptable), or if it modifies the set
|
|
in any way other than removing the element currently contained in
|
|
@var{variable}. This macro is faster than the corresponding
|
|
@code{m4_foreach([@var{variable}],
|
|
m4_indir([m4_dquote]m4_set_listc([@var{set}])), [@var{action}])},
|
|
although @code{m4_set_map} might be faster still.
|
|
|
|
@example
|
|
m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
|
|
@result{}
|
|
m4_set_contents([a])
|
|
@result{}12345
|
|
m4_set_foreach([a], [i],
|
|
[m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
|
|
@result{}24
|
|
m4_set_contents([a])
|
|
@result{}135
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_set_list (@var{set})
|
|
@defmacx m4_set_listc (@var{set})
|
|
@msindex{set_list}
|
|
@msindex{set_listc}
|
|
Produce a list of arguments, where each argument is a quoted element
|
|
from the set @var{set}. The variant @code{m4_set_listc} is unambiguous,
|
|
by adding a leading comma if there are any set elements, whereas the
|
|
variant @code{m4_set_list} cannot distinguish between an empty set and a
|
|
set containing only the empty string. These can be directly used in
|
|
macros that take multiple arguments, such as @code{m4_join} or
|
|
@code{m4_set_add_all}, or wrapped by @code{m4_dquote} for macros that
|
|
take a quoted list, such as @code{m4_map} or @code{m4_foreach}. Any
|
|
memory occupied by removed elements is reclaimed during these macros.
|
|
|
|
@example
|
|
m4_set_add_all([a], [1], [2], [3])
|
|
@result{}
|
|
m4_set_list([a])
|
|
@result{}1,2,3
|
|
m4_set_list([b])
|
|
@result{}
|
|
m4_set_listc([b])
|
|
@result{}
|
|
m4_count(m4_set_list([b]))
|
|
@result{}1
|
|
m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
|
|
@result{}0
|
|
m4_set_add([b], [])
|
|
@result{}
|
|
m4_set_list([b])
|
|
@result{}
|
|
m4_set_listc([b])
|
|
@result{},
|
|
m4_count(m4_set_list([b]))
|
|
@result{}1
|
|
m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
|
|
@result{}1
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac m4_set_map (@var{set}, @var{action})
|
|
@msindex{set_map}
|
|
For each element in the set @var{set}, expand @var{action} with a single
|
|
argument of the set element. Behavior is unspecified if @var{action}
|
|
recursively lists the contents of @var{set} (although listing other sets
|
|
is acceptable), or if it modifies the set in any way other than removing
|
|
the element passed as an argument. This macro is faster than either
|
|
corresponding counterpart of
|
|
@code{m4_map_args([@var{action}]m4_set_listc([@var{set}]))} or
|
|
@code{m4_set_foreach([@var{set}], [var],
|
|
[@var{action}(m4_defn([var]))])}. It is possible to use @code{m4_curry}
|
|
if more than one argument is needed for @var{action}, although it is
|
|
more efficient to use @code{m4_set_map_sep} in that case.
|
|
@end defmac
|
|
|
|
@defmac m4_set_map_sep (@var{set}, @ovar{pre}, @ovar{post}, @ovar{sep})
|
|
@msindex{set_map_sep}
|
|
For each element in the set @var{set}, expand
|
|
@code{@var{pre}[element]@var{post}}, additionally expanding @var{sep}
|
|
between elements. Behavior is unspecified if the expansion recursively
|
|
lists the contents of @var{set} (although listing other sets
|
|
is acceptable), or if it modifies the set in any way other than removing
|
|
the element visited by the expansion. This macro provides the most
|
|
efficient means for non-destructively visiting the elements of a set; in
|
|
particular, @code{m4_set_map([@var{set}], [@var{action}])} is equivalent
|
|
to @code{m4_set_map_sep([@var{set}], [@var{action}(], [)])}.
|
|
@end defmac
|
|
|
|
@defmac m4_set_remove (@var{set}, @var{value}, @ovar{if-present}, @
|
|
@ovar{if-absent})
|
|
@msindex{set_remove}
|
|
If @var{value} is an element in the set @var{set}, then remove it and
|
|
expand @var{if-present}. Otherwise expand @var{if-absent}. This macro
|
|
operates in constant time so that multiple removals will scale linearly
|
|
rather than quadratically; but when used outside of
|
|
@code{m4_set_foreach} or @code{m4_set_map}, it leaves memory occupied
|
|
until the set is later
|
|
compacted by @code{m4_set_contents} or @code{m4_set_list}. Several
|
|
other set operations are then less efficient between the time of element
|
|
removal and subsequent memory compaction, but still maintain their
|
|
guaranteed scaling performance.
|
|
@end defmac
|
|
|
|
@defmac m4_set_size (@var{set})
|
|
@msindex{set_size}
|
|
Expand to the size of the set @var{set}. This implementation operates
|
|
in constant time, and is thus more efficient than
|
|
@code{m4_eval(m4_count(m4_set_listc([set])) - 1)}.
|
|
@end defmac
|
|
|
|
|
|
@node Forbidden Patterns
|
|
@subsection Forbidden Patterns
|
|
@cindex Forbidden patterns
|
|
@cindex Patterns, forbidden
|
|
|
|
M4sugar provides a means to define suspicious patterns, patterns
|
|
describing tokens which should not be found in the output. For
|
|
instance, if an Autoconf @file{configure} script includes tokens such as
|
|
@samp{AC_DEFINE}, or @samp{dnl}, then most probably something went
|
|
wrong (typically a macro was not evaluated because of overquotation).
|
|
|
|
M4sugar forbids all the tokens matching @samp{^_?m4_} and @samp{^dnl$}.
|
|
Additional layers, such as M4sh and Autoconf, add additional forbidden
|
|
patterns to the list.
|
|
|
|
@defmac m4_pattern_forbid (@var{pattern})
|
|
@msindex{pattern_forbid}
|
|
Declare that no token matching @var{pattern} must be found in the
|
|
output. The output file is (temporarily) split into one word per line
|
|
as part of the @command{autom4te} post-processing, with each line (and
|
|
therefore word) then being checked against the Perl regular expression
|
|
@var{pattern}. If the regular expression matches, and
|
|
@code{m4_pattern_allow} does not also match, then an error is raised.
|
|
|
|
Comments are not checked; this can be a problem if, for instance, you
|
|
have some macro left unexpanded after an @samp{#include}. No consensus
|
|
is currently found in the Autoconf community, as some people consider it
|
|
should be valid to name macros in comments (which doesn't make sense to
|
|
the authors of this documentation: input, such as macros, should be
|
|
documented by @samp{dnl} comments; reserving @samp{#}-comments to
|
|
document the output).
|
|
|
|
As an example, if you define your own macros that begin with @samp{M_}
|
|
and are composed from capital letters and underscores, the specification
|
|
of @code{m4_pattern_forbid([^M_[A-Z_]+])} will ensure all your macros
|
|
are expanded when not used in comments.
|
|
|
|
As an example of a common use of this macro, consider what happens in
|
|
packages that want to use the @command{pkg-config} script via the
|
|
third-party @code{PKG_CHECK_MODULES} macro. By default, if a developer
|
|
checks out the development tree but has not yet installed the pkg-config
|
|
macros locally, they can manage to successfully run @command{autoconf}
|
|
on the package, but the resulting @file{configure} file will likely
|
|
result in a confusing shell message about a syntax error on the line
|
|
mentioning the unexpanded @code{PKG_CHECK_MODULES} macro. On the other hand,
|
|
if @file{configure.ac} includes @code{m4_pattern_forbid([^PKG_])}, the
|
|
missing pkg-config macros will be detected immediately without allowing
|
|
@command{autoconf} to succeed.
|
|
@end defmac
|
|
|
|
Of course, you might encounter exceptions to these generic rules, for
|
|
instance you might have to refer to @samp{$m4_flags}.
|
|
|
|
@defmac m4_pattern_allow (@var{pattern})
|
|
@msindex{pattern_allow}
|
|
Any token matching @var{pattern} is allowed, including if it matches an
|
|
@code{m4_pattern_forbid} pattern.
|
|
|
|
For example, Gnulib uses @code{m4_pattern_forbid([^gl_])} to reserve the
|
|
@code{gl_} namespace for itself, but also uses
|
|
@code{m4_pattern_allow([^gl_ES$])} to avoid a false negative on the
|
|
valid locale name.
|
|
@end defmac
|
|
|
|
@node Debugging via autom4te
|
|
@section Debugging via autom4te
|
|
@cindex debugging tips
|
|
@cindex autom4te debugging tips
|
|
@cindex m4sugar debugging tips
|
|
At times, it is desirable to see what was happening inside m4, to see
|
|
why output was not matching expectations. However, post-processing done
|
|
by @command{autom4te} means that directly using the m4 builtin
|
|
@code{m4_traceon} is likely to interfere with operation. Also, frequent
|
|
diversion changes and the concept of forbidden tokens make it difficult
|
|
to use @code{m4_defn} to generate inline comments in the final output.
|
|
|
|
There are a couple of tools to help with this. One is the use of the
|
|
@option{--trace} option provided by @command{autom4te} (as well as each
|
|
of the programs that wrap @command{autom4te}, such as
|
|
@command{autoconf}), in order to inspect when a macro is called and with
|
|
which arguments. For example, when this paragraph was written, the
|
|
autoconf version could be found by:
|
|
|
|
@example
|
|
$ @kbd{autoconf --trace=AC_INIT}
|
|
configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@@gnu.org
|
|
$ @kbd{autoconf --trace='AC_INIT:version is $2'}
|
|
version is 2.63b.95-3963
|
|
@end example
|
|
|
|
Another trick is to print out the expansion of various m4 expressions to
|
|
standard error or to an independent file, with no further m4 expansion,
|
|
and without interfering with diversion changes or the post-processing
|
|
done to standard output. @code{m4_errprintn} shows a given expression
|
|
on standard error. For example, if you want to see the expansion of an
|
|
autoconf primitive or of one of your autoconf macros, you can do it like
|
|
this:
|
|
|
|
@example
|
|
$ @kbd{cat <<\EOF > configure.ac}
|
|
AC_INIT
|
|
m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
|
|
m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
|
|
AC_OUTPUT
|
|
EOF
|
|
$ @kbd{autoconf}
|
|
@error{}The definition of AC_DEFINE_UNQUOTED:
|
|
@error{}_AC_DEFINE_Q([], $@@)
|
|
@end example
|
|
|
|
@node Programming in M4sh
|
|
@chapter Programming in M4sh
|
|
|
|
M4sh, pronounced ``mash'', is aiming at producing portable Bourne shell
|
|
scripts. This name was coined by Lars J. Aas, who notes that,
|
|
according to the Webster's Revised Unabridged Dictionary (1913):
|
|
|
|
@quotation
|
|
Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische, mash,
|
|
wash, and prob.@: to AS. miscian to mix. See ``Mix''.]
|
|
|
|
@enumerate 1
|
|
@item
|
|
A mass of mixed ingredients reduced to a soft pulpy state by beating or
|
|
pressure@enddots{}
|
|
|
|
@item
|
|
A mixture of meal or bran and water fed to animals.
|
|
|
|
@item
|
|
A mess; trouble. [Obs.] --Beau.@: & Fl.
|
|
@end enumerate
|
|
@end quotation
|
|
|
|
M4sh reserves the M4 macro namespace @samp{^_AS_} for internal use, and
|
|
the namespace @samp{^AS_} for M4sh macros. It also reserves the shell
|
|
and environment variable namespace @samp{^as_}, and the here-document
|
|
delimiter namespace @samp{^_AS[A-Z]} in the output file. You should not
|
|
define your own macros or output shell code that conflicts with these
|
|
namespaces.
|
|
|
|
@menu
|
|
* Common Shell Constructs:: Portability layer for common shell constructs
|
|
* Polymorphic Variables:: Support for indirect variable names
|
|
* Initialization Macros:: Macros to establish a sane shell environment
|
|
* File Descriptor Macros:: File descriptor macros for input and output
|
|
@end menu
|
|
|
|
@node Common Shell Constructs
|
|
@section Common Shell Constructs
|
|
|
|
M4sh provides portable alternatives for some common shell constructs
|
|
that unfortunately are not portable in practice.
|
|
|
|
@c Deprecated, to be replaced by a better API
|
|
@ignore
|
|
@defmac AS_BASENAME (@var{file-name})
|
|
@asindex{BASENAME}
|
|
Output the non-directory portion of @var{file-name}. For example,
|
|
if @code{$file} is @samp{/one/two/three}, the command
|
|
@code{base=`AS_BASENAME(["$file"])`} sets @code{base} to @samp{three}.
|
|
@end defmac
|
|
@end ignore
|
|
|
|
@defmac AS_BOX (@var{text}, @dvar{char, -})
|
|
@asindex{BOX}
|
|
Expand into shell code that will output @var{text} surrounded by a box
|
|
with @var{char} in the top and bottom border. @var{text} should not
|
|
contain a newline, but may contain shell expansions valid for unquoted
|
|
here-documents. @var{char} defaults to @samp{-}, but can be any
|
|
character except @samp{/}, @samp{'}, @samp{"}, @samp{\},
|
|
@samp{&}, or @samp{`}. This is useful for outputting a comment box into
|
|
log files to separate distinct phases of script operation.
|
|
@end defmac
|
|
|
|
@defmac AS_CASE (@var{word}, @ovar{pattern1}, @ovar{if-matched1}, @
|
|
@dots{}, @ovar{default})
|
|
@asindex{CASE}
|
|
Expand into a shell @samp{case} statement, where @var{word} is matched
|
|
against one or more patterns. @var{if-matched} is run if the
|
|
corresponding pattern matched @var{word}, else @var{default} is run.
|
|
@xref{Prerequisite Macros} for why
|
|
this macro should be used instead of plain @samp{case} in code
|
|
outside of an @code{AC_DEFUN} macro, when the contents of the
|
|
@samp{case} use @code{AC_REQUIRE} directly or indirectly.
|
|
@xref{case, , Limitations of Shell Builtins},
|
|
for how this macro avoids some portability issues.
|
|
@xref{Balancing Parentheses}
|
|
for how this macro lets you write code with balanced parentheses
|
|
even if your code must run on obsolescent shells.
|
|
@end defmac
|
|
|
|
@c Deprecated, to be replaced by a better API
|
|
@defmac AS_DIRNAME (@var{file-name})
|
|
@asindex{DIRNAME}
|
|
Output the directory portion of @var{file-name}. For example,
|
|
if @code{$file} is @samp{/one/two/three}, the command
|
|
@code{dir=`AS_DIRNAME(["$file"])`} sets @code{dir} to @samp{/one/two}.
|
|
|
|
@code{AS_DIRNAME} was designed long ago when
|
|
the @command{dirname} command was not universally supported.
|
|
Nowadays one can safely use @code{dir=`dirname -- "$file"`} instead.
|
|
This interface may be improved in the future to avoid forks and losing
|
|
trailing newlines.
|
|
@end defmac
|
|
|
|
@defmac AS_ECHO (@var{word})
|
|
@asindex{ECHO}
|
|
Emit @var{word} to the standard output, followed by a newline.
|
|
The @var{word} must be a single shell word (typically a quoted string).
|
|
Output the shell expansion of @var{word} as-is,
|
|
even if it starts with @samp{-} or contains @samp{\}.
|
|
Redirections can be placed outside the macro invocation.
|
|
|
|
If the shell variable @var{foo} could contain @samp{\} or leading @samp{-}.
|
|
@code{AS_ECHO(["$foo"])} is more portable than @command{echo "$foo"}.
|
|
@xref{echo, , Limitations of Shell Builtins}.
|
|
|
|
Also, @code{AS_ECHO(["$foo"])} is often easier to read than the
|
|
@samp{printf '%s\n' "$foo"} that it stands for.
|
|
However, because it employs @samp{'} characters,
|
|
in contexts where @samp{'} is not allowed
|
|
it is better to use @command{printf} directly.
|
|
For example, @samp{`eval 'foo=$@{'AS_ESCAPE([[$1]], [`\])'@};printf
|
|
"%s\\n" "$foo")'`} would not work if @command{printf} were replaced
|
|
with @code{AS_ECHO}.
|
|
|
|
@end defmac
|
|
|
|
@defmac AS_ECHO_N (@var{word})
|
|
@asindex{ECHO_N}
|
|
Act like @code{AS_ECHO(@var{word})}, except do not output a following newline.
|
|
@end defmac
|
|
|
|
@c We cannot use @dvar because the macro expansion mistreats backslashes.
|
|
@defmac AS_ESCAPE (@var{string}, @r{[}@var{chars} = @samp{`\"$}@r{]})
|
|
@asindex{ESCAPE}
|
|
Expands to @var{string}, with any characters in @var{chars} escaped with
|
|
a backslash (@samp{\}). @var{chars} should be at most four bytes long,
|
|
and only contain characters from the set @samp{`\"$}; however,
|
|
characters may be safely listed more than once in @var{chars} for the
|
|
sake of syntax highlighting editors. The current implementation expands
|
|
@var{string} after adding escapes; if @var{string} contains macro calls
|
|
that in turn expand to text needing shell quoting, you can use
|
|
@code{AS_ESCAPE(m4_dquote(m4_expand([string])))}.
|
|
|
|
The default for @var{chars} (@samp{\"$`}) is the set of characters
|
|
needing escapes when @var{string} will be used literally within double
|
|
quotes. One common variant is the set of characters to protect when
|
|
@var{string} will be used literally within back-ticks or an unquoted
|
|
here-document (@samp{\$`}). Another common variant is @samp{""}, which can
|
|
be used to form a double-quoted string containing the same expansions
|
|
that would have occurred if @var{string} were expanded in an unquoted
|
|
here-document; however, when using this variant, care must be taken that
|
|
@var{string} does not use double quotes within complex variable
|
|
expansions (such as @samp{$@{foo-`echo "hi"`@}}) that would be broken
|
|
with improper escapes.
|
|
|
|
This macro is often used with @code{AS_ECHO}. For an example, observe
|
|
the output generated by the shell code generated from this snippet:
|
|
|
|
@example
|
|
foo=bar
|
|
AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
|
|
@result{}"$foo" = "bar"
|
|
m4_define([macro], [a, [\b]])
|
|
AS_ECHO(["AS_ESCAPE([[macro]])"])
|
|
@result{}macro
|
|
AS_ECHO(["AS_ESCAPE([macro])"])
|
|
@result{}a, b
|
|
AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
|
|
@result{}a, \b
|
|
@end example
|
|
|
|
@comment Should we add AS_ESCAPE_SINGLE? If we do, we can optimize in
|
|
@comment the case of @var{string} that does not contain '.
|
|
To escape a string that will be placed within single quotes, use:
|
|
|
|
@example
|
|
m4_bpatsubst([[@var{string}]], ['], ['\\''])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AS_EXECUTABLE_P (@var{file})
|
|
@asindex{EXECUTABLE_P}
|
|
Emit code to probe whether @var{file} is a regular file with executable
|
|
permissions (and not a directory with search permissions). The caller
|
|
is responsible for quoting @var{file}.
|
|
@end defmac
|
|
|
|
@defmac AS_EXIT (@dvar{status, $?})
|
|
@asindex{EXIT}
|
|
Emit code to exit the shell with @var{status}, defaulting to @samp{$?}.
|
|
This macro
|
|
works around shells that see the exit status of the command prior to
|
|
@code{exit} inside a @samp{trap 0} handler (@pxref{trap, , Limitations
|
|
of Shell Builtins}).
|
|
@end defmac
|
|
|
|
@defmac AS_IF (@var{test1}, @ovar{run-if-true1}, @dots{}, @ovar{run-if-false})
|
|
@asindex{IF}
|
|
Run shell code @var{test1}. If @var{test1} exits with a zero status then
|
|
run shell code @var{run-if-true1}, else examine further tests. If no test
|
|
exits with a zero status, run shell code @var{run-if-false}, with
|
|
simplifications if either @var{run-if-true1} or @var{run-if-false}
|
|
is empty. For example,
|
|
|
|
@example
|
|
AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
|
|
[test "x$foo" != xno], [HANDLE_FOO([maybe])],
|
|
[echo foo not specified])
|
|
@end example
|
|
|
|
@noindent
|
|
ensures any required macros of @code{HANDLE_FOO}
|
|
are expanded before the first test.
|
|
|
|
This macro should be used instead of plain @samp{if} in code
|
|
outside of an @code{AC_DEFUN} macro, when the contents of the @samp{if}
|
|
use @code{AC_REQUIRE} directly or indirectly (@pxref{Prerequisite Macros}).
|
|
@end defmac
|
|
|
|
@defmac AS_MKDIR_P (@var{file-name})
|
|
@asindex{MKDIR_P}
|
|
Make the directory @var{file-name}, including intervening directories
|
|
as necessary. This is equivalent to @samp{mkdir -p -- @var{file-name}}.
|
|
If creation of @var{file-name} fails, exit the script.
|
|
|
|
Also see the @code{AC_PROG_MKDIR_P} macro (@pxref{Particular Programs}).
|
|
@end defmac
|
|
|
|
@defmac AS_SET_STATUS (@var{status})
|
|
@asindex{SET_STATUS}
|
|
Emit shell code to set the value of @samp{$?} to @var{status}, as
|
|
efficiently as possible. However, this is not guaranteed to abort a
|
|
shell running with @code{set -e} (@pxref{set, , Limitations of Shell
|
|
Builtins}). This should also be used at the end of a complex shell
|
|
function instead of @samp{return} (@pxref{Shell Functions}) to avoid
|
|
a DJGPP shell bug.
|
|
@end defmac
|
|
|
|
@defmac AS_TR_CPP (@var{expression})
|
|
@asindex{TR_CPP}
|
|
Transform @var{expression} into a valid right-hand side for a C @code{#define}.
|
|
For example:
|
|
|
|
@example
|
|
# This outputs "#define HAVE_CHAR_P 1".
|
|
# Notice the m4 quoting around #, to prevent an m4 comment
|
|
type="char *"
|
|
echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AS_TR_SH (@var{expression})
|
|
@asindex{TR_SH}
|
|
Transform @var{expression} into shell code that generates a valid shell
|
|
variable name. The result is literal when possible at m4 time, but must
|
|
be used with @code{eval} if @var{expression} causes shell indirections.
|
|
For example:
|
|
|
|
@example
|
|
# This outputs "Have it!".
|
|
header="sys/some file.h"
|
|
eval AS_TR_SH([HAVE_$header])=yes
|
|
if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AS_SET_CATFILE (@var{var}, @var{dir}, @var{file})
|
|
@asindex{SET_CATFILE}
|
|
Set the polymorphic shell variable @var{var} to @var{dir}/@var{file},
|
|
but optimizing the common cases (@var{dir} or @var{file} is @samp{.},
|
|
@var{file} is absolute, etc.).
|
|
@end defmac
|
|
|
|
@defmac AS_UNSET (@var{var})
|
|
@asindex{UNSET}
|
|
Unsets the shell variable @var{var}, working around bugs in older
|
|
shells (@pxref{unset, , Limitations of Shell
|
|
Builtins}). @var{var} can be a literal or indirect variable name.
|
|
@end defmac
|
|
|
|
@defmac AS_VERSION_COMPARE (@var{version-1}, @var{version-2}, @
|
|
@ovar{action-if-less}, @ovar{action-if-equal}, @ovar{action-if-greater})
|
|
@asindex{VERSION_COMPARE}
|
|
Compare two strings @var{version-1} and @var{version-2}, possibly
|
|
containing shell variables, as version strings, and expand
|
|
@var{action-if-less}, @var{action-if-equal}, or @var{action-if-greater}
|
|
depending upon the result.
|
|
The algorithm to compare is similar to the one used by strverscmp in
|
|
glibc (@pxref{String/Array Comparison, , String/Array Comparison, libc,
|
|
The GNU C Library}).
|
|
@end defmac
|
|
|
|
@node Polymorphic Variables
|
|
@section Support for indirect variable names
|
|
@cindex variable name indirection
|
|
@cindex polymorphic variable name
|
|
@cindex indirection, variable name
|
|
|
|
Often, it is convenient to write a macro that will emit shell code
|
|
operating on a shell variable. The simplest case is when the variable
|
|
name is known. But a more powerful idiom is writing shell code that can
|
|
work through an indirection, where another variable or command
|
|
substitution produces the name of the variable to actually manipulate.
|
|
M4sh supports the notion of polymorphic shell variables, making it easy
|
|
to write a macro that can deal with either literal or indirect variable
|
|
names and output shell code appropriate for both use cases. Behavior is
|
|
undefined if expansion of an indirect variable does not result in a
|
|
literal variable name.
|
|
|
|
@defmac AS_LITERAL_IF (@var{expression}, @ovar{if-literal}, @ovar{if-not}, @
|
|
@dvarv{if-simple-ref, if-not})
|
|
@defmacx AS_LITERAL_WORD_IF (@var{expression}, @ovar{if-literal}, @
|
|
@ovar{if-not}, @dvarv{if-simple-ref, if-not})
|
|
@asindex{LITERAL_IF}
|
|
@asindex{LITERAL_WORD_IF}
|
|
If the expansion of @var{expression} is definitely a shell literal,
|
|
expand @var{if-literal}. If the expansion of @var{expression} looks
|
|
like it might contain shell indirections (such as @code{$var} or
|
|
@code{`expr`}), then @var{if-not} is expanded. Sometimes, it is
|
|
possible to output optimized code if @var{expression} consists only of
|
|
shell variable expansions (such as @code{$@{var@}}), in which case
|
|
@var{if-simple-ref} can be provided; but defaulting to @var{if-not}
|
|
should always be safe. @code{AS_LITERAL_WORD_IF} only expands
|
|
@var{if-literal} if @var{expression} looks like a single shell word,
|
|
containing no whitespace; while @code{AS_LITERAL_IF} allows whitespace
|
|
in @var{expression}.
|
|
|
|
In order to reduce the time spent recognizing whether an
|
|
@var{expression} qualifies as a literal or a simple indirection, the
|
|
implementation is somewhat conservative: @var{expression} must be a
|
|
single shell word (possibly after stripping whitespace), consisting only
|
|
of bytes that would have the same meaning whether unquoted or enclosed
|
|
in double quotes (for example, @samp{a.b} results in @var{if-literal},
|
|
even though it is not a valid shell variable name; while both @samp{'a'}
|
|
and @samp{[$]} result in @var{if-not}, because they behave differently
|
|
than @samp{"'a'"} and @samp{"[$]"}). This macro can be used in contexts
|
|
for recognizing portable file names (such as in the implementation of
|
|
@code{AC_LIBSOURCE}), or coupled with some transliterations for forming
|
|
valid variable names (such as in the implementation of @code{AS_TR_SH},
|
|
which uses an additional @code{m4_translit} to convert @samp{.} to
|
|
@samp{_}).
|
|
|
|
This example shows how to read the contents of the shell variable
|
|
@code{bar}, exercising all three arguments to @code{AS_LITERAL_IF}. It
|
|
results in a script that will output the line @samp{hello} three times.
|
|
|
|
@example
|
|
AC_DEFUN([MY_ACTION],
|
|
[AS_LITERAL_IF([$1],
|
|
[AS_ECHO(["$$1"])],
|
|
@c $$
|
|
[AS_VAR_COPY([var], [$1])
|
|
AS_ECHO(["$var"])],
|
|
[AS_ECHO(["$'"$1"\"])])])
|
|
foo=bar bar=hello
|
|
MY_ACTION([bar])
|
|
MY_ACTION([`echo bar`])
|
|
MY_ACTION([$foo])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_APPEND (@var{var}, @var{text})
|
|
@asindex{VAR_APPEND}
|
|
Emit shell code to append the shell expansion of @var{text} to the end
|
|
of the current contents of the polymorphic shell variable @var{var},
|
|
taking advantage of shells that provide the @samp{+=} extension for more
|
|
efficient scaling.
|
|
|
|
For situations where the final contents of @var{var} are relatively
|
|
short (less than 256 bytes), it is more efficient to use the simpler
|
|
code sequence of @code{@var{var}=$@{@var{var}@}@var{text}} (or its
|
|
polymorphic equivalent of @code{AS_VAR_COPY([t], [@var{var}])} and
|
|
@code{AS_VAR_SET([@var{var}], ["$t"@var{text}])}). But in the case
|
|
when the script will be repeatedly appending text into @code{var},
|
|
issues of scaling start to become apparent. A naive implementation
|
|
requires execution time linear to the length of the current contents of
|
|
@var{var} as well as the length of @var{text} for a single append, for
|
|
an overall quadratic scaling with multiple appends. This macro takes
|
|
advantage of shells which provide the extension
|
|
@code{@var{var}+=@var{text}}, which can provide amortized constant time
|
|
for a single append, for an overall linear scaling with multiple
|
|
appends. Note that unlike @code{AS_VAR_SET}, this macro requires that
|
|
@var{text} be quoted properly to avoid field splitting and file name
|
|
expansion.
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_ARITH (@var{var}, @var{expression})
|
|
@asindex{VAR_ARITH}
|
|
Emit shell code to compute the arithmetic expansion of @var{expression},
|
|
assigning the result as the contents of the polymorphic shell variable
|
|
@var{var}. The code takes advantage of shells that provide @samp{$(())}
|
|
for fewer forks, but uses @command{expr} as a fallback. Therefore, the
|
|
syntax for a valid @var{expression} is rather limited: all operators
|
|
must occur as separate shell arguments and with proper quoting;
|
|
the only operators supported are @samp{*}, @samp{/}, @samp{%}, binary
|
|
@samp{+}, binary @samp{-}, @samp{>}, @samp{>=}, @samp{<}, @samp{<=},
|
|
@samp{!=}, @samp{&}, and @samp{|};
|
|
all variables containing numbers must be expanded prior to the computation;
|
|
the first shell argument must not start with @samp{-};
|
|
and each number must be an optional @samp{-} followed by one or more
|
|
decimal digits, where the first digit is nonzero if there is more than
|
|
one digit. In the following example, this snippet
|
|
will print @samp{(2+3)*4 == 20}.
|
|
|
|
@example
|
|
bar=3
|
|
AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
|
|
echo "(2+$bar)*4 == $foo"
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_COPY (@var{dest}, @var{source})
|
|
@asindex{VAR_COPY}
|
|
Emit shell code to assign the contents of the polymorphic shell variable
|
|
@var{source} to the polymorphic shell variable @var{dest}. For example,
|
|
executing this M4sh snippet will output @samp{bar hi}:
|
|
|
|
@example
|
|
foo=bar bar=hi
|
|
AS_VAR_COPY([a], [foo])
|
|
AS_VAR_COPY([b], [$foo])
|
|
echo "$a $b"
|
|
@end example
|
|
|
|
When it is necessary to access the contents of an indirect variable
|
|
inside a shell double-quoted context, the recommended idiom is to first
|
|
copy the contents into a temporary literal shell variable.
|
|
|
|
@smallexample
|
|
for header in stdint_h inttypes_h ; do
|
|
AS_VAR_COPY([var], [ac_cv_header_$header])
|
|
AS_ECHO(["$header detected: $var"])
|
|
done
|
|
@end smallexample
|
|
@end defmac
|
|
|
|
@comment AS_VAR_GET is intentionally undocumented; it can't handle
|
|
@comment trailing newlines uniformly, and forks too much.
|
|
|
|
@defmac AS_VAR_IF (@var{var}, @ovar{word}, @ovar{if-equal}, @
|
|
@ovar{if-not-equal})
|
|
@asindex{VAR_IF}
|
|
Output a shell conditional statement. If the contents of the
|
|
polymorphic shell variable @var{var} match the string @var{word},
|
|
execute @var{if-equal}; otherwise execute @var{if-not-equal}. @var{word}
|
|
must be a single shell word (typically a quoted string). Avoids
|
|
shell bugs if an interrupt signal arrives while a command substitution
|
|
in @var{var} is being expanded.
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_PUSHDEF (@var{m4-name}, @var{value})
|
|
@defmacx AS_VAR_POPDEF (@var{m4-name})
|
|
@asindex{VAR_PUSHDEF}
|
|
@asindex{VAR_POPDEF}
|
|
@cindex composing variable names
|
|
@cindex variable names, composing
|
|
A common M4sh idiom involves composing shell variable names from an m4
|
|
argument (for example, writing a macro that uses a cache variable).
|
|
@var{value} can be an arbitrary string, which will be transliterated
|
|
into a valid shell name by @code{AS_TR_SH}. In order to access the
|
|
composed variable name based on @var{value}, it is easier to declare a
|
|
temporary m4 macro @var{m4-name} with @code{AS_VAR_PUSHDEF}, then use
|
|
that macro as the argument to subsequent @code{AS_VAR} macros as a
|
|
polymorphic variable name, and finally free the temporary macro with
|
|
@code{AS_VAR_POPDEF}. These macros are often followed with @code{dnl},
|
|
to avoid excess newlines in the output.
|
|
|
|
Here is an involved example, that shows the power of writing macros that
|
|
can handle composed shell variable names:
|
|
|
|
@example
|
|
m4_define([MY_CHECK_HEADER],
|
|
[AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl
|
|
AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl
|
|
AS_VAR_POPDEF([my_Header])dnl
|
|
])
|
|
MY_CHECK_HEADER([stdint.h])
|
|
for header in inttypes.h stdlib.h ; do
|
|
MY_CHECK_HEADER([$header])
|
|
done
|
|
@end example
|
|
|
|
@noindent
|
|
In the above example, @code{MY_CHECK_HEADER} can operate on polymorphic
|
|
variable names. In the first invocation, the m4 argument is
|
|
@code{stdint.h}, which transliterates into a literal @code{stdint_h}.
|
|
As a result, the temporary macro @code{my_Header} expands to the literal
|
|
shell name @samp{ac_cv_header_stdint_h}. In the second invocation, the
|
|
m4 argument to @code{MY_CHECK_HEADER} is @code{$header}, and the
|
|
temporary macro @code{my_Header} expands to the indirect shell name
|
|
@samp{$as_my_Header}. During the shell execution of the for loop, when
|
|
@samp{$header} contains @samp{inttypes.h}, then @samp{$as_my_Header}
|
|
contains @samp{ac_cv_header_inttypes_h}. If this script is then run on a
|
|
platform where all three headers have been previously detected, the
|
|
output of the script will include:
|
|
|
|
@smallexample
|
|
header stdint.h detected
|
|
header inttypes.h detected
|
|
header stdlib.h detected
|
|
@end smallexample
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_SET (@var{var}, @ovar{value})
|
|
@asindex{VAR_SET}
|
|
Emit shell code to assign the contents of the polymorphic shell variable
|
|
@var{var} to the shell expansion of @var{value}. @var{value} is not
|
|
subject to field splitting or file name expansion, so if command
|
|
substitution is used, it may be done with @samp{`""`} rather than using
|
|
an intermediate variable (@pxref{Shell Substitutions}). However,
|
|
@var{value} does undergo rescanning for additional macro names; behavior
|
|
is unspecified if late expansion results in any shell meta-characters.
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_SET_IF (@var{var}, @ovar{if-set}, @ovar{if-undef})
|
|
@asindex{VAR_SET_IF}
|
|
Emit a shell conditional statement, which executes @var{if-set} if the
|
|
polymorphic shell variable @code{var} is set to any value, and
|
|
@var{if-undef} otherwise.
|
|
@end defmac
|
|
|
|
@defmac AS_VAR_TEST_SET (@var{var})
|
|
@asindex{VAR_TEST_SET}
|
|
Emit a shell statement that results in a successful exit status only if
|
|
the polymorphic shell variable @code{var} is set.
|
|
@end defmac
|
|
|
|
@node Initialization Macros
|
|
@section Initialization Macros
|
|
|
|
@defmac AS_BOURNE_COMPATIBLE
|
|
@asindex{BOURNE_COMPATIBLE}
|
|
Set up the shell to be more compatible with the Bourne shell as
|
|
standardized by POSIX, if possible. This may involve setting
|
|
environment variables, or setting options, or similar
|
|
implementation-specific actions. This macro is deprecated, since
|
|
@code{AS_INIT} already invokes it.
|
|
@end defmac
|
|
|
|
@defmac AS_INIT
|
|
@asindex{INIT}
|
|
@evindex LC_ALL
|
|
@evindex SHELL
|
|
Initialize the M4sh environment. This macro calls @code{m4_init}, then
|
|
outputs the @code{#! /bin/sh} line, a notice about where the output was
|
|
generated from, and code to sanitize the environment for the rest of the
|
|
script. Among other initializations, this sets @env{SHELL} to the shell
|
|
chosen to run the script (@pxref{CONFIG_SHELL}), and @env{LC_ALL} to
|
|
ensure the C locale. Finally, it changes the current diversion to
|
|
@code{BODY}. @code{AS_INIT} is called automatically by @code{AC_INIT}
|
|
and @code{AT_INIT}, so shell code in @file{configure},
|
|
@file{config.status}, and @file{testsuite} all benefit from a sanitized
|
|
shell environment.
|
|
@end defmac
|
|
|
|
@defmac AS_INIT_GENERATED (@var{file}, @ovar{comment})
|
|
@asindex{INIT_GENERATED}
|
|
Emit shell code to start the creation of a subsidiary shell script in
|
|
@var{file}, including changing @var{file} to be executable. This macro
|
|
populates the child script with information learned from the parent
|
|
(thus, the emitted code is equivalent in effect, but more efficient,
|
|
than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and
|
|
@code{AS_SHELL_SANITIZE}). If present, @var{comment} is output near the
|
|
beginning of the child, prior to the shell initialization code, and is
|
|
subject to parameter expansion, command substitution, and backslash
|
|
quote removal. The
|
|
parent script should check the exit status after this macro, in case
|
|
@var{file} could not be properly created (for example, if the disk was
|
|
full). If successfully created, the parent script can then proceed to
|
|
append additional M4sh constructs into the child script.
|
|
|
|
Note that the child script starts life without a log file open, so if
|
|
the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you
|
|
must temporarily disable any attempts to use the log file until after
|
|
emitting code to open a log within the child. On the other hand, if the
|
|
parent script has @code{AS_MESSAGE_FD} redirected somewhere besides
|
|
@samp{1}, then the child script already has code that copies stdout to
|
|
that descriptor. Currently, the suggested
|
|
idiom for writing a M4sh shell script from within another script is:
|
|
|
|
@example
|
|
AS_INIT_GENERATED([@var{file}], [[# My child script.
|
|
]]) || @{ AS_ECHO(["Failed to create child script"]); AS_EXIT; @}
|
|
m4_pushdef([AS_MESSAGE_LOG_FD])dnl
|
|
cat >> "@var{file}" <<\__EOF__
|
|
# Code to initialize AS_MESSAGE_LOG_FD
|
|
m4_popdef([AS_MESSAGE_LOG_FD])dnl
|
|
# Additional code
|
|
__EOF__
|
|
@end example
|
|
|
|
This, however, may change in the future as the M4sh interface is
|
|
stabilized further.
|
|
|
|
Also, be aware that use of @env{LINENO} within the child script may
|
|
report line numbers relative to their location in the parent script,
|
|
even when using @code{AS_LINENO_PREPARE}, if the parent script was
|
|
unable to locate a shell with working @env{LINENO} support.
|
|
@end defmac
|
|
|
|
@defmac AS_LINENO_PREPARE
|
|
@asindex{LINENO_PREPARE}
|
|
@evindex LINENO
|
|
Find a shell that supports the special variable @env{LINENO}, which
|
|
contains the number of the currently executing line. This macro is
|
|
automatically invoked by @code{AC_INIT} in configure scripts.
|
|
@end defmac
|
|
|
|
@defmac AS_ME_PREPARE
|
|
@asindex{ME_PREPARE}
|
|
Set up variable @env{as_me} to be the basename of the currently executing
|
|
script. This macro is automatically invoked by @code{AC_INIT} in
|
|
configure scripts.
|
|
@end defmac
|
|
|
|
@defmac AS_TMPDIR (@var{prefix}, @dvar{dir, $@{TMPDIR:=/tmp@}})
|
|
@asindex{TMPDIR}
|
|
@evindex TMPDIR
|
|
@ovindex tmp
|
|
Create, as safely as possible, a temporary sub-directory within
|
|
@var{dir} with a name starting with @var{prefix}. @var{prefix} should
|
|
be 2--4 characters, to make it slightly easier to identify the owner of
|
|
the directory. If @var{dir} is omitted, then the value of @env{TMPDIR}
|
|
will be used (defaulting to @samp{/tmp}). On success, the name of the
|
|
newly created directory is stored in the shell variable @code{tmp}. On
|
|
error, the script is aborted.
|
|
|
|
Typically, this macro is coupled with some exit traps to delete the created
|
|
directory and its contents on exit or interrupt. However, there is a
|
|
slight window between when the directory is created and when the name is
|
|
actually known to the shell, so an interrupt at the right moment might
|
|
leave the temporary directory behind. Hence it is important to use a
|
|
@var{prefix} that makes it easier to determine if a leftover temporary
|
|
directory from an interrupted script is safe to delete.
|
|
|
|
If you set @code{TMPDIR=$tmp} after invoking this macro, you should
|
|
reset @code{TMPDIR} before deleting the created directory, to avoid
|
|
breaking commands that rely on @code{$TMPDIR}.
|
|
|
|
The use of the output variable @samp{$tmp} rather than something in the
|
|
@samp{as_} namespace is historical; it has the unfortunate consequence
|
|
that reusing this otherwise common name for any other purpose inside
|
|
your script has the potential to break any cleanup traps designed to
|
|
remove the temporary directory.
|
|
@end defmac
|
|
|
|
@defmac AS_SHELL_SANITIZE
|
|
@asindex{SHELL_SANITIZE}
|
|
Initialize the shell suitably for @command{configure} scripts. This has
|
|
the effect of @code{AS_BOURNE_COMPATIBLE}, and sets some other
|
|
environment variables for predictable results from configuration tests.
|
|
For example, it sets @env{LC_ALL} to change to the default C locale.
|
|
@xref{Special Shell Variables}. This macro is deprecated, since
|
|
@code{AS_INIT} already invokes it.
|
|
@end defmac
|
|
|
|
|
|
@node File Descriptor Macros
|
|
@section File Descriptor Macros
|
|
@cindex input
|
|
@cindex standard input
|
|
@cindex file descriptors
|
|
@cindex descriptors
|
|
@cindex low-level output
|
|
@cindex output, low-level
|
|
|
|
The following macros define file descriptors used to output messages
|
|
(or input values) from @file{configure} scripts.
|
|
For example:
|
|
|
|
@example
|
|
AS_ECHO(["$wombats found"]) >&AS_MESSAGE_LOG_FD
|
|
AS_ECHO_N(['Enter desired kangaroo count: ']) >&AS_MESSAGE_FD
|
|
read kangaroos <&AS_ORIGINAL_STDIN_FD
|
|
@end example
|
|
|
|
@noindent
|
|
However doing so is seldom needed, because Autoconf provides higher
|
|
level macros as described below.
|
|
|
|
@defmac AS_MESSAGE_FD
|
|
@asindex{MESSAGE_FD}
|
|
The file descriptor for @samp{checking for...} messages and results.
|
|
By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh
|
|
clients. However, @code{AC_INIT} shuffles things around to another file
|
|
descriptor, in order to allow the @option{-q} option of
|
|
@command{configure} to choose whether messages should go to the script's
|
|
standard output or be discarded.
|
|
|
|
If you want to display some messages, consider using one of the printing
|
|
macros (@pxref{Printing Messages}) instead. Copies of messages output
|
|
via these macros are also recorded in @file{config.log}.
|
|
@end defmac
|
|
|
|
@anchor{AS_MESSAGE_LOG_FD}
|
|
@defmac AS_MESSAGE_LOG_FD
|
|
@asindex{MESSAGE_LOG_FD}
|
|
This must either be empty, or expand to a file descriptor for log
|
|
messages. By default, @code{AS_INIT} sets this macro to the empty
|
|
string for standalone M4sh clients, thus disabling logging. However,
|
|
@code{AC_INIT} shuffles things around so that both @command{configure}
|
|
and @command{config.status} use @file{config.log} for log messages.
|
|
Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the
|
|
Compiler}), redirect all output to this descriptor. You may want to do
|
|
so if you develop such a low-level macro.
|
|
@end defmac
|
|
|
|
@defmac AS_ORIGINAL_STDIN_FD
|
|
@asindex{ORIGINAL_STDIN_FD}
|
|
This must expand to a file descriptor for the original standard input.
|
|
By default, @code{AS_INIT} sets this macro to @samp{0} for standalone
|
|
M4sh clients. However, @code{AC_INIT} shuffles things around for
|
|
safety.
|
|
|
|
When @command{configure} runs, it may accidentally execute an
|
|
interactive command that has the same name as the non-interactive meant
|
|
to be used or checked. If the standard input was the terminal, such
|
|
interactive programs would cause @command{configure} to stop, pending
|
|
some user input. Therefore @command{configure} redirects its standard
|
|
input from @file{/dev/null} during its initialization. This is not
|
|
normally a problem, since @command{configure} normally does not need
|
|
user input.
|
|
|
|
In the extreme case where your @file{configure} script really needs to
|
|
obtain some values from the original standard input, you can read them
|
|
explicitly from @code{AS_ORIGINAL_STDIN_FD}.
|
|
@end defmac
|
|
|
|
|
|
@c =================================================== Writing Autoconf Macros.
|
|
|
|
@node Writing Autoconf Macros
|
|
@chapter Writing Autoconf Macros
|
|
|
|
When you write a feature test that could be applicable to more than one
|
|
software package, the best thing to do is encapsulate it in a new macro.
|
|
Here are some instructions and guidelines for writing Autoconf macros.
|
|
You should also familiarize yourself with M4sugar (@pxref{Programming in M4})
|
|
and M4sh (@pxref{Programming in M4sh}).
|
|
|
|
@menu
|
|
* Macro Definitions:: Basic format of an Autoconf macro
|
|
* Macro Names:: What to call your new macros
|
|
* Dependencies Between Macros:: What to do when macros depend on other macros
|
|
* Obsoleting Macros:: Warning about old ways of doing things
|
|
* Coding Style:: Writing Autoconf macros à la Autoconf
|
|
@end menu
|
|
|
|
@node Macro Definitions
|
|
@section Macro Definitions
|
|
|
|
@defmac AC_DEFUN (@var{name}, @ovar{body})
|
|
@acindex{DEFUN}
|
|
Autoconf macros are defined using the @code{AC_DEFUN} macro, which is
|
|
similar to the M4 builtin @code{m4_define} macro; this creates a macro
|
|
named @var{name} and with @var{body} as its expansion. In addition to
|
|
defining a macro, @code{AC_DEFUN} adds to it some code that is used to
|
|
constrain the order in which macros are called, while avoiding redundant
|
|
output (@pxref{Prerequisite Macros}).
|
|
@end defmac
|
|
|
|
An Autoconf macro definition looks like this:
|
|
|
|
@example
|
|
AC_DEFUN(@var{macro-name}, @var{macro-body})
|
|
@end example
|
|
|
|
You can refer to any arguments passed to the macro as @samp{$1},
|
|
@samp{$2}, etc. @xref{Definitions, , How to define new macros, m4,
|
|
GNU M4}, for more complete information on writing M4 macros.
|
|
|
|
Most macros fall in one of two general categories. The first category
|
|
includes macros which take arguments, in order to generate output
|
|
parameterized by those arguments. Macros in this category are designed
|
|
to be directly expanded, often multiple times, and should not be used as
|
|
the argument to @code{AC_REQUIRE}. The other category includes macros
|
|
which are shorthand for a fixed block of text, and therefore do not take
|
|
arguments. For this category of macros, directly expanding the macro
|
|
multiple times results in redundant output, so it is more common to use
|
|
the macro as the argument to @code{AC_REQUIRE}, or to declare the macro
|
|
with @code{AC_DEFUN_ONCE} (@pxref{One-Shot Macros}).
|
|
|
|
Be sure to properly quote both the @var{macro-body} @emph{and} the
|
|
@var{macro-name} to avoid any problems if the macro happens to have
|
|
been previously defined.
|
|
|
|
Each macro should have a header comment that gives its prototype, and a
|
|
brief description. When arguments have default values, display them in
|
|
the prototype. For example:
|
|
|
|
@example
|
|
# AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
|
|
# --------------------------------------
|
|
m4_define([AC_MSG_ERROR],
|
|
[@{ AS_MESSAGE([error: $1], [2])
|
|
exit m4_default([$2], [1]); @}])
|
|
@end example
|
|
|
|
Comments about the macro should be left in the header comment. Most
|
|
other comments make their way into @file{configure}, so just keep
|
|
using @samp{#} to introduce comments.
|
|
|
|
@cindex @code{dnl}
|
|
If you have some special comments about pure M4 code, comments
|
|
that make no sense in @file{configure} and in the header comment, then
|
|
use the builtin @code{dnl}: it causes M4 to discard the text
|
|
through the next newline.
|
|
|
|
Keep in mind that @code{dnl} is rarely needed to introduce comments;
|
|
@code{dnl} is more useful to get rid of the newlines following macros
|
|
that produce no output, such as @code{AC_REQUIRE}.
|
|
|
|
Public third-party macros need to use @code{AC_DEFUN}, and not
|
|
@code{m4_define}, in order to be found by @command{aclocal}
|
|
(@pxref{Extending aclocal,,, automake, GNU Automake}).
|
|
Additionally, if it is ever determined that a macro should be made
|
|
obsolete, it is easy to convert from @code{AC_DEFUN} to @code{AU_DEFUN}
|
|
in order to have @command{autoupdate} assist the user in choosing a
|
|
better alternative, but there is no corresponding way to make
|
|
@code{m4_define} issue an upgrade notice (@pxref{AU_DEFUN}).
|
|
|
|
There is another subtle, but important, difference between using
|
|
@code{m4_define} and @code{AC_DEFUN}: only the former is unaffected by
|
|
@code{AC_REQUIRE}. When writing a file, it is always safe to replace a
|
|
block of text with a @code{m4_define} macro that will expand to the same
|
|
text. But replacing a block of text with an @code{AC_DEFUN} macro with
|
|
the same content does not necessarily give the same results, because it
|
|
changes the location where any embedded but unsatisfied
|
|
@code{AC_REQUIRE} invocations within the block will be expanded. For an
|
|
example of this, see @ref{Expanded Before Required}.
|
|
|
|
@node Macro Names
|
|
@section Macro Names
|
|
|
|
All of the public Autoconf macros have all-uppercase names in the
|
|
namespace @samp{^AC_} to prevent them from accidentally conflicting with
|
|
other text; Autoconf also reserves the namespace @samp{^_AC_} for
|
|
internal macros. All shell variables that they use for internal
|
|
purposes have mostly-lowercase names starting with @samp{ac_}. Autoconf
|
|
also uses here-document delimiters in the namespace @samp{^_AC[A-Z]}. During
|
|
@command{configure}, files produced by Autoconf make heavy use of the
|
|
file system namespace @samp{^conf}.
|
|
|
|
Since Autoconf is built on top of M4sugar (@pxref{Programming in
|
|
M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
|
|
of those namespaces (@samp{^_?\(m4\|AS\)_}). And since
|
|
@file{configure.ac} is also designed to be scanned by Autoheader,
|
|
Autoscan, Autoupdate, and Automake, you should be aware of the
|
|
@samp{^_?A[HNUM]_} namespaces. In general, you @emph{should not use}
|
|
the namespace of a package that does not own the macro or shell code you
|
|
are writing.
|
|
|
|
To ensure that your macros don't conflict with present or future
|
|
Autoconf macros, you should prefix your own macro names and any shell
|
|
variables they use with some other sequence. Possibilities include your
|
|
initials, or an abbreviation for the name of your organization or
|
|
software package. Historically, people have not always followed the
|
|
rule of using a namespace appropriate for their package, and this has
|
|
made it difficult for determining the origin of a macro (and where to
|
|
report bugs about that macro), as well as difficult for the true
|
|
namespace owner to add new macros without interference from pre-existing
|
|
uses of third-party macros. Perhaps the best example of this confusion
|
|
is the @code{AM_GNU_GETTEXT} macro, which belongs, not to Automake, but
|
|
to Gettext.
|
|
|
|
Most of the Autoconf macros' names follow a structured naming convention
|
|
that indicates the kind of feature check by the name. The macro names
|
|
consist of several words, separated by underscores, going from most
|
|
general to most specific. The names of their cache variables use the
|
|
same convention (@pxref{Cache Variable Names}, for more information on
|
|
them).
|
|
|
|
The first word of the name after the namespace initials (such as
|
|
@samp{AC_}) usually tells the category
|
|
of the feature being tested. Here are the categories used in Autoconf for
|
|
specific test macros, the kind of macro that you are more likely to
|
|
write. They are also used for cache variables, in all-lowercase. Use
|
|
them where applicable; where they're not, invent your own categories.
|
|
|
|
@table @code
|
|
@item C
|
|
C language builtin features.
|
|
@item DECL
|
|
Declarations of C variables in header files.
|
|
@item FUNC
|
|
Functions in libraries.
|
|
@item GROUP
|
|
POSIX group owners of files.
|
|
@item HEADER
|
|
Header files.
|
|
@item LIB
|
|
C libraries.
|
|
@item PROG
|
|
The base names of programs.
|
|
@item MEMBER
|
|
Members of aggregates.
|
|
@item SYS
|
|
Operating system features.
|
|
@item TYPE
|
|
C builtin or declared types.
|
|
@item VAR
|
|
C variables in libraries.
|
|
@end table
|
|
|
|
After the category comes the name of the particular feature being
|
|
tested. Any further words in the macro name indicate particular aspects
|
|
of the feature. For example, @code{AC_PROG_MAKE_SET} checks whether
|
|
@command{make} sets a variable to its own name.
|
|
|
|
An internal macro should have a name that starts with an underscore;
|
|
Autoconf internals should therefore start with @samp{_AC_}.
|
|
Additionally, a macro that is an internal subroutine of another macro
|
|
should have a name that starts with an underscore and the name of that
|
|
other macro, followed by one or more words saying what the internal
|
|
macro does. For example, @code{AC_PATH_X} has internal macros
|
|
@code{_AC_PATH_X_XMKMF} and @code{_AC_PATH_X_DIRECT}.
|
|
|
|
@node Dependencies Between Macros
|
|
@section Dependencies Between Macros
|
|
@cindex Dependencies between macros
|
|
|
|
Some Autoconf macros depend on other macros having been called first in
|
|
order to work correctly. Autoconf provides a way to ensure that certain
|
|
macros are called if needed and a way to warn the user if macros are
|
|
called in an order that might cause incorrect operation.
|
|
|
|
@menu
|
|
* Prerequisite Macros:: Ensuring required information
|
|
* Suggested Ordering:: Warning about possible ordering problems
|
|
* One-Shot Macros:: Ensuring a macro is called only once
|
|
@end menu
|
|
|
|
@node Prerequisite Macros
|
|
@subsection Prerequisite Macros
|
|
@cindex Prerequisite macros
|
|
@cindex Macros, prerequisites
|
|
|
|
A macro that you write might need to use values that have previously
|
|
been computed by other macros. For example, @code{AC_DECL_YYTEXT}
|
|
examines the output of @code{flex} or @code{lex}, so it depends on
|
|
@code{AC_PROG_LEX} having been called first to set the shell variable
|
|
@code{LEX}.
|
|
|
|
Rather than forcing the user of the macros to keep track of the
|
|
dependencies between them, you can use the @code{AC_REQUIRE} macro to do
|
|
it automatically. @code{AC_REQUIRE} can ensure that a macro is only
|
|
called if it is needed, and only called once.
|
|
|
|
@defmac AC_REQUIRE (@var{macro-name})
|
|
@acindex{REQUIRE}
|
|
If the M4 macro @var{macro-name} has not already been called, call it
|
|
(without any arguments). Make sure to quote @var{macro-name} with
|
|
square brackets. @var{macro-name} must have been defined using
|
|
@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
|
|
that it has been called.
|
|
|
|
@code{AC_REQUIRE} must be used inside a macro defined by @code{AC_DEFUN}; it
|
|
must not be called from the top level. Also, it does not make sense to
|
|
require a macro that takes parameters.
|
|
@end defmac
|
|
|
|
@code{AC_REQUIRE} is often misunderstood. It really implements
|
|
dependencies between macros in the sense that if one macro depends upon
|
|
another, the latter is expanded @emph{before} the body of the
|
|
former. To be more precise, the required macro is expanded before
|
|
the outermost defined macro in the current expansion stack.
|
|
In particular, @samp{AC_REQUIRE([FOO])} is not replaced with the body of
|
|
@code{FOO}. For instance, this definition of macros:
|
|
|
|
@example
|
|
@group
|
|
AC_DEFUN([TRAVOLTA],
|
|
[test "$body_temperature_in_Celsius" -gt 38 &&
|
|
dance_floor=occupied])
|
|
AC_DEFUN([NEWTON_JOHN],
|
|
[test "x$hair_style" = xcurly &&
|
|
dance_floor=occupied])
|
|
@end group
|
|
|
|
@group
|
|
AC_DEFUN([RESERVE_DANCE_FLOOR],
|
|
[if test "x`date +%A`" = xSaturday; then
|
|
AC_REQUIRE([TRAVOLTA])
|
|
AC_REQUIRE([NEWTON_JOHN])
|
|
fi])
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
with this @file{configure.ac}
|
|
|
|
@example
|
|
AC_INIT([Dance Manager], [1.0], [bug-dance@@example.org])
|
|
RESERVE_DANCE_FLOOR
|
|
if test "x$dance_floor" = xoccupied; then
|
|
AC_MSG_ERROR([cannot pick up here, let's move])
|
|
fi
|
|
@end example
|
|
|
|
@noindent
|
|
does not leave you with a better chance to meet a kindred soul on
|
|
days other than Saturday, since the call to @code{RESERVE_DANCE_FLOOR}
|
|
expands to:
|
|
|
|
@example
|
|
@group
|
|
test "$body_temperature_in_Celsius" -gt 38 &&
|
|
dance_floor=occupied
|
|
test "x$hair_style" = xcurly &&
|
|
dance_floor=occupied
|
|
if test "x`date +%A`" = xSaturday; then
|
|
|
|
|
|
fi
|
|
@end group
|
|
@end example
|
|
|
|
This behavior was chosen on purpose: (i) it prevents messages in
|
|
required macros from interrupting the messages in the requiring macros;
|
|
(ii) it avoids bad surprises when shell conditionals are used, as in:
|
|
|
|
@example
|
|
@group
|
|
if @dots{}; then
|
|
AC_REQUIRE([SOME_CHECK])
|
|
fi
|
|
@dots{}
|
|
SOME_CHECK
|
|
@end group
|
|
@end example
|
|
|
|
However, this implementation can lead to another class of problems.
|
|
Consider the case where an outer macro first expands, then indirectly
|
|
requires, an inner macro:
|
|
|
|
@example
|
|
AC_DEFUN([TESTA], [[echo in A
|
|
if test -n "$SEEN_A" ; then echo duplicate ; fi
|
|
SEEN_A=:]])
|
|
AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
|
|
if test -z "$SEEN_A" ; then echo bug ; fi]])
|
|
AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
|
|
AC_DEFUN([OUTER], [[echo in OUTER]
|
|
TESTA
|
|
TESTC])
|
|
OUTER
|
|
@end example
|
|
|
|
@noindent
|
|
Prior to Autoconf 2.64, the implementation of @code{AC_REQUIRE}
|
|
recognized that @code{TESTB} needed to be hoisted prior to the expansion
|
|
of @code{OUTER}, but because @code{TESTA} had already been directly
|
|
expanded, it failed to hoist @code{TESTA}. Therefore, the expansion of
|
|
@code{TESTB} occurs prior to its prerequisites, leading to the following
|
|
output:
|
|
|
|
@example
|
|
in B
|
|
bug
|
|
in OUTER
|
|
in A
|
|
in C
|
|
@end example
|
|
|
|
@noindent
|
|
Newer Autoconf is smart enough to recognize this situation, and hoists
|
|
@code{TESTA} even though it has already been expanded, but issues a
|
|
syntax warning in the process. This is because the hoisted expansion of
|
|
@code{TESTA} defeats the purpose of using @code{AC_REQUIRE} to avoid
|
|
redundant code, and causes its own set of problems if the hoisted macro
|
|
is not idempotent:
|
|
|
|
@example
|
|
in A
|
|
in B
|
|
in OUTER
|
|
in A
|
|
duplicate
|
|
in C
|
|
@end example
|
|
|
|
The bug is not in Autoconf, but in the macro definitions. If you ever
|
|
pass a particular macro name to @code{AC_REQUIRE}, then you are implying
|
|
that the macro only needs to be expanded once. But to enforce this,
|
|
either the macro must be declared with @code{AC_DEFUN_ONCE} (although
|
|
this only helps in Autoconf 2.64 or newer), or all
|
|
uses of that macro should be through @code{AC_REQUIRE}; directly
|
|
expanding the macro defeats the point of using @code{AC_REQUIRE} to
|
|
eliminate redundant expansion. In the example, this rule of thumb was
|
|
violated because @code{TESTB} requires @code{TESTA} while @code{OUTER}
|
|
directly expands it. One way of fixing the bug is to factor
|
|
@code{TESTA} into two macros, the portion designed for direct and
|
|
repeated use (here, named @code{TESTA}), and the portion designed for
|
|
one-shot output and used only inside @code{AC_REQUIRE} (here, named
|
|
@code{TESTA_PREREQ}). Then, by fixing all clients to use the correct
|
|
calling convention according to their needs:
|
|
|
|
@example
|
|
AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]])
|
|
AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ
|
|
if test -n "$SEEN_A" ; then echo duplicate ; fi
|
|
SEEN_A=:]])
|
|
AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B
|
|
if test -z "$SEEN_A" ; then echo bug ; fi]])
|
|
AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
|
|
AC_DEFUN([OUTER], [[echo in OUTER]
|
|
TESTA
|
|
TESTC])
|
|
OUTER
|
|
@end example
|
|
|
|
@noindent
|
|
the resulting output will then obey all dependency rules and avoid any
|
|
syntax warnings, whether the script is built with old or new Autoconf
|
|
versions:
|
|
|
|
@example
|
|
in A_PREREQ
|
|
in B
|
|
in OUTER
|
|
in A
|
|
in C
|
|
@end example
|
|
|
|
You can use the helper macros @code{AS_IF} and @code{AS_CASE} in
|
|
top-level code to enforce expansion of required macros outside of shell
|
|
conditional constructs; these helpers are not needed in the bodies of
|
|
macros defined by @code{AC_DEFUN}.
|
|
You are furthermore encouraged, although not required, to
|
|
put all @code{AC_REQUIRE} calls
|
|
at the beginning of a macro. You can use @code{dnl} to avoid the empty
|
|
lines they leave.
|
|
|
|
Autoconf will normally warn if an @code{AC_REQUIRE} call refers to a
|
|
macro that has not been defined. However, the @command{aclocal} tool
|
|
relies on parsing an incomplete set of input files to trace which macros
|
|
have been required, in order to then pull in additional files that
|
|
provide those macros; for this particular use case, pre-defining the
|
|
macro @code{m4_require_silent_probe} will avoid the warnings.
|
|
|
|
@node Suggested Ordering
|
|
@subsection Suggested Ordering
|
|
@cindex Macros, ordering
|
|
@cindex Ordering macros
|
|
|
|
Some macros should be run before another macro if both are called, but
|
|
neither @emph{requires} that the other be called. For example, a macro
|
|
that changes the behavior of the C compiler should be called before any
|
|
macros that run the C compiler. Many of these dependencies are noted in
|
|
the documentation.
|
|
|
|
Autoconf provides the @code{AC_BEFORE} macro to warn users when macros
|
|
with this kind of dependency appear out of order in a
|
|
@file{configure.ac} file. The warning occurs when creating
|
|
@command{configure} from @file{configure.ac}, not when running
|
|
@command{configure}.
|
|
|
|
For example, @code{AC_PROG_CPP} checks whether the C compiler
|
|
can run the C preprocessor when given the @option{-E} option. It should
|
|
therefore be called after any macros that change which C compiler is
|
|
being used, such as @code{AC_PROG_CC}. So @code{AC_PROG_CC} contains:
|
|
|
|
@example
|
|
AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
|
@end example
|
|
|
|
@noindent
|
|
This warns the user if a call to @code{AC_PROG_CPP} has already occurred
|
|
when @code{AC_PROG_CC} is called.
|
|
|
|
@defmac AC_BEFORE (@var{this-macro-name}, @var{called-macro-name})
|
|
@acindex{BEFORE}
|
|
Make M4 print a warning message to the standard error output if
|
|
@var{called-macro-name} has already been called. @var{this-macro-name}
|
|
should be the name of the macro that is calling @code{AC_BEFORE}. The
|
|
macro @var{called-macro-name} must have been defined using
|
|
@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
|
|
that it has been called.
|
|
@end defmac
|
|
|
|
@node One-Shot Macros
|
|
@subsection One-Shot Macros
|
|
@cindex One-shot macros
|
|
@cindex Macros, called once
|
|
|
|
Some macros should be called only once, either because calling them
|
|
multiple time is unsafe, or because it is bad style. For instance
|
|
Autoconf ensures that @code{AC_CANONICAL_BUILD} and cousins
|
|
(@pxref{Canonicalizing}) are evaluated only once, because it makes no
|
|
sense to run these expensive checks more than once. Such one-shot
|
|
macros can be defined using @code{AC_DEFUN_ONCE}.
|
|
|
|
@defmac AC_DEFUN_ONCE (@var{macro-name}, @var{macro-body})
|
|
@acindex{DEFUN_ONCE}
|
|
Declare macro @var{macro-name} like @code{AC_DEFUN} would (@pxref{Macro
|
|
Definitions}), but add additional logic that guarantees that only the
|
|
first use of the macro (whether by direct expansion or
|
|
@code{AC_REQUIRE}) causes an expansion of @var{macro-body}; the
|
|
expansion will occur before the start of any enclosing macro defined by
|
|
@code{AC_DEFUN}. Subsequent expansions are silently ignored.
|
|
Generally, it does not make sense for @var{macro-body} to use parameters
|
|
such as @code{$1}.
|
|
@end defmac
|
|
|
|
Prior to Autoconf 2.64, a macro defined by @code{AC_DEFUN_ONCE} would
|
|
emit a warning if it was directly expanded a second time, so for
|
|
portability, it is better to use @code{AC_REQUIRE} than direct
|
|
invocation of @var{macro-name} inside a macro defined by @code{AC_DEFUN}
|
|
(@pxref{Prerequisite Macros}).
|
|
|
|
@node Obsoleting Macros
|
|
@section Obsoleting Macros
|
|
@cindex Obsoleting macros
|
|
@cindex Macros, obsoleting
|
|
|
|
Configuration and portability technology has evolved over the years.
|
|
Often better ways of solving a particular problem are developed, or
|
|
ad-hoc approaches are systematized. This process has occurred in many
|
|
parts of Autoconf. One result is that some of the macros are now
|
|
considered @dfn{obsolete}; they still work, but are no longer considered
|
|
the best thing to do, hence they should be replaced with more modern
|
|
macros. Ideally, @command{autoupdate} should replace the old macro calls
|
|
with their modern implementation.
|
|
|
|
Autoconf provides a simple means to obsolete a macro.
|
|
|
|
@anchor{AU_DEFUN}
|
|
@defmac AU_DEFUN (@var{old-macro}, @var{implementation}, @ovar{message}, @ovar{silent})
|
|
@auindex{DEFUN}
|
|
Define @var{old-macro} as @var{implementation}, just like
|
|
@code{AC_DEFUN}, but also declare @var{old-macro} to be obsolete.
|
|
When @command{autoupdate} is run, occurrences of @var{old-macro} will
|
|
be replaced by the text of @var{implementation} in the updated
|
|
@file{configure.ac} file.
|
|
|
|
If a simple textual replacement is not enough to finish the job of
|
|
updating a @file{configure.ac} to modern style, provide instructions for
|
|
whatever additional manual work is required as @var{message}. These
|
|
instructions will be printed by @command{autoupdate}, and embedded in the
|
|
updated @file{configure.ac} file, next to the text of @var{implementation}.
|
|
|
|
Normally, @command{autoconf} will also issue a warning (in the
|
|
``obsolete'' category) when it expands @var{old-macro}. This warning
|
|
does not include @var{message}; it only advises the maintainer to run
|
|
@command{autoupdate}. If it is inappropriate to issue this warning, set
|
|
the @var{silent} argument to the word @code{silent}. One might want to
|
|
use a silent @code{AU_DEFUN} when @var{old-macro} is used in a
|
|
widely-distributed third-party macro. If that macro's maintainers are
|
|
aware of the need to update their code, it's unnecessary to nag all
|
|
of the transitive users of @var{old-macro} as well. This capability
|
|
was added to @code{AU_DEFUN} in Autoconf 2.70; older versions of
|
|
autoconf will ignore the @var{silent} argument and issue the warning
|
|
anyway.
|
|
|
|
@strong{Caution:} If @var{implementation} contains M4 or M4sugar macros,
|
|
they will be evaluated when @command{autoupdate} is run, not emitted
|
|
verbatim like the rest of @var{implementation}. This cannot be avoided
|
|
with extra quotation, because then @var{old-macro} will not work when
|
|
it is called normally. See the definition of @code{AC_FOREACH} in
|
|
@file{general.m4} for a workaround.
|
|
@end defmac
|
|
|
|
@defmac AU_ALIAS (@var{old-name}, @var{new-name}, @ovar{silent})
|
|
@auindex{ALIAS}
|
|
A shorthand version of @code{AU_DEFUN}, to be used when a macro has
|
|
simply been renamed. @command{autoupdate} will replace calls to
|
|
@var{old-name} with calls to @var{new-name}, keeping any arguments
|
|
intact. No instructions for additional manual work will be printed.
|
|
|
|
The @var{silent} argument works the same as the @var{silent} argument
|
|
to @code{AU_DEFUN}. It was added to @code{AU_ALIAS} in Autoconf 2.70.
|
|
|
|
@strong{Caution:} @code{AU_ALIAS} cannot be used when @var{new-name} is
|
|
an M4 or M4sugar macro. See above.
|
|
@end defmac
|
|
|
|
@node Coding Style
|
|
@section Coding Style
|
|
@cindex Coding style
|
|
|
|
The Autoconf macros follow a strict coding style. You are encouraged to
|
|
follow this style, especially if you intend to distribute your macro,
|
|
either by contributing it to Autoconf itself or the
|
|
@uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
|
|
Archive}, or by other means.
|
|
|
|
The first requirement is to pay great attention to the quotation. For
|
|
more details, see @ref{Autoconf Language}, and @ref{M4 Quotation}.
|
|
|
|
Do not try to invent new interfaces. It is likely that there is a macro
|
|
in Autoconf that resembles the macro you are defining: try to stick to
|
|
this existing interface (order of arguments, default values, etc.). We
|
|
@emph{are} conscious that some of these interfaces are not perfect;
|
|
nevertheless, when harmless, homogeneity should be preferred over
|
|
creativity.
|
|
|
|
Be careful about clashes both between M4 symbols and between shell
|
|
variables.
|
|
|
|
If you stick to the suggested M4 naming scheme (@pxref{Macro Names}),
|
|
you are unlikely to generate conflicts. Nevertheless, when you need to
|
|
set a special value, @emph{avoid using a regular macro name}; rather,
|
|
use an ``impossible'' name. For instance, up to version 2.13, the macro
|
|
@code{AC_SUBST} used to remember what @var{symbol} macros were already defined
|
|
by setting @code{AC_SUBST_@var{symbol}}, which is a regular macro name.
|
|
But since there is a macro named @code{AC_SUBST_FILE}, it was just
|
|
impossible to @samp{AC_SUBST(FILE)}! In this case,
|
|
@code{AC_SUBST(@var{symbol})} or @code{_AC_SUBST(@var{symbol})} should
|
|
have been used (yes, with the parentheses).
|
|
@c or better yet, high-level macros such as @code{m4_expand_once}
|
|
|
|
No Autoconf macro should ever enter the user-variable name space; i.e.,
|
|
except for the variables that are the actual result of running the
|
|
macro, all shell variables should start with @code{ac_}. In
|
|
addition, small macros or any macro that is likely to be embedded in
|
|
other macros should be careful not to use obvious names.
|
|
|
|
@cindex @code{dnl}
|
|
Do not use @code{dnl} to introduce comments: most of the comments you
|
|
are likely to write are either header comments which are not output
|
|
anyway, or comments that should make their way into @file{configure}.
|
|
There are exceptional cases where you do want to comment special M4
|
|
constructs, in which case @code{dnl} is right, but keep in mind that it
|
|
is unlikely.
|
|
|
|
M4 ignores the leading blanks and newlines before each argument.
|
|
Use this feature to
|
|
indent in such a way that arguments are (more or less) aligned with the
|
|
opening parenthesis of the macro being called. For instance, instead of
|
|
|
|
@example
|
|
AC_CACHE_CHECK(for EMX OS/2 environment,
|
|
ac_cv_emxos2,
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
|
|
[ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
|
|
@end example
|
|
|
|
@noindent
|
|
write
|
|
|
|
@example
|
|
AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
|
|
[ac_cv_emxos2=yes],
|
|
[ac_cv_emxos2=no])])
|
|
@end example
|
|
|
|
@noindent
|
|
or even
|
|
|
|
@example
|
|
AC_CACHE_CHECK([for EMX OS/2 environment],
|
|
[ac_cv_emxos2],
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
|
|
[return __EMX__;])],
|
|
[ac_cv_emxos2=yes],
|
|
[ac_cv_emxos2=no])])
|
|
@end example
|
|
|
|
When using @code{AC_RUN_IFELSE} or any macro that cannot work when
|
|
cross-compiling, provide a pessimistic value (typically @samp{no}).
|
|
|
|
Feel free to use various tricks to prevent auxiliary tools, such as
|
|
syntax-highlighting editors, from behaving improperly. For instance,
|
|
instead of:
|
|
|
|
@example
|
|
m4_bpatsubst([$1], [$"])
|
|
@end example
|
|
|
|
@noindent
|
|
use
|
|
|
|
@example
|
|
m4_bpatsubst([$1], [$""])
|
|
@end example
|
|
|
|
@noindent
|
|
so that Emacsen do not open an endless ``string'' at the first quote.
|
|
For the same reasons, avoid:
|
|
|
|
@example
|
|
test $[#] != 0
|
|
@end example
|
|
|
|
@noindent
|
|
and use:
|
|
|
|
@example
|
|
test $[@@%:@@] != 0
|
|
@end example
|
|
|
|
@noindent
|
|
Otherwise, the closing bracket would be hidden inside a @samp{#}-comment,
|
|
breaking the bracket-matching highlighting from Emacsen. Note the
|
|
preferred style to escape from M4: @samp{$[1]}, @samp{$[@@]}, etc. Do
|
|
not escape when it is unnecessary. Common examples of useless quotation
|
|
are @samp{[$]$1} (write @samp{$$1}), @samp{[$]var} (use @samp{$var}),
|
|
etc.
|
|
|
|
When using @command{sed}, don't use @option{-e} except for indenting
|
|
purposes. With the @code{s} and @code{y} commands, the preferred
|
|
separator is @samp{/} unless @samp{/} itself might appear in the pattern
|
|
or replacement, in which case you should use @samp{|}, or optionally
|
|
@samp{,} if you know the pattern and replacement cannot contain a file
|
|
name. If none of these characters will do, choose a printable character
|
|
that cannot appear in the pattern or replacement. Characters from the
|
|
set @samp{"#$&'()*;<=>?`|~} are good choices if the pattern or
|
|
replacement might contain a file name, since they have special meaning
|
|
to the shell and are less likely to occur in file names.
|
|
|
|
@xref{Macro Definitions}, for details on how to define a macro. If a
|
|
macro doesn't use @code{AC_REQUIRE}, is expected to never be the object
|
|
of an @code{AC_REQUIRE} directive, and macros required by other macros
|
|
inside arguments do not need to be expanded before this macro, then
|
|
use @code{m4_define}. In case of doubt, use @code{AC_DEFUN}.
|
|
Also take into account that public third-party macros need to use
|
|
@code{AC_DEFUN} in order to be found by @command{aclocal}
|
|
(@pxref{Extending aclocal,,, automake, GNU Automake}).
|
|
All the @code{AC_REQUIRE} statements should be at the beginning of the
|
|
macro, and each statement should be followed by @code{dnl}.
|
|
|
|
You should not rely on the number of arguments: instead of checking
|
|
whether an argument is missing, test that it is not empty. It provides
|
|
both a simpler and a more predictable interface to the user, and saves
|
|
room for further arguments.
|
|
|
|
Unless the macro is short, try to leave the closing @samp{])} at the
|
|
beginning of a line, followed by a comment that repeats the name of the
|
|
macro being defined. This introduces an additional newline in
|
|
@command{configure}; normally, that is not a problem, but if you want to
|
|
remove it you can use @samp{[]dnl} on the last line. You can similarly
|
|
use @samp{[]dnl} after a macro call to remove its newline. @samp{[]dnl}
|
|
is recommended instead of @samp{dnl} to ensure that M4 does not
|
|
interpret the @samp{dnl} as being attached to the preceding text or
|
|
macro output. For example, instead of:
|
|
|
|
@example
|
|
AC_DEFUN([AC_PATH_X],
|
|
[AC_MSG_CHECKING([for X])
|
|
AC_REQUIRE_CPP()
|
|
@r{# @dots{}omitted@dots{}}
|
|
AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
|
|
fi])
|
|
@end example
|
|
|
|
@noindent
|
|
you would write:
|
|
|
|
@example
|
|
AC_DEFUN([AC_PATH_X],
|
|
[AC_REQUIRE_CPP()[]dnl
|
|
AC_MSG_CHECKING([for X])
|
|
@r{# @dots{}omitted@dots{}}
|
|
AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
|
|
fi[]dnl
|
|
])# AC_PATH_X
|
|
@end example
|
|
|
|
If the macro is long, try to split it into logical chunks. Typically,
|
|
macros that check for a bug in a function and prepare its
|
|
@code{AC_LIBOBJ} replacement should have an auxiliary macro to perform
|
|
this setup. Do not hesitate to introduce auxiliary macros to factor
|
|
your code.
|
|
|
|
In order to highlight the recommended coding style, here is a macro
|
|
written the old way:
|
|
|
|
@example
|
|
dnl Check for EMX on OS/2.
|
|
dnl _AC_EMXOS2
|
|
AC_DEFUN(_AC_EMXOS2,
|
|
[AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
|
|
ac_cv_emxos2=yes, ac_cv_emxos2=no)])
|
|
test "x$ac_cv_emxos2" = xyes && EMXOS2=yes])
|
|
@end example
|
|
|
|
@noindent
|
|
and the new way:
|
|
|
|
@example
|
|
# _AC_EMXOS2
|
|
# ----------
|
|
# Check for EMX on OS/2.
|
|
m4_define([_AC_EMXOS2],
|
|
[AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
|
|
[ac_cv_emxos2=yes],
|
|
[ac_cv_emxos2=no])])
|
|
test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl
|
|
])# _AC_EMXOS2
|
|
@end example
|
|
|
|
|
|
|
|
|
|
@c ============================================= Portable Shell Programming
|
|
|
|
@node Portable Shell
|
|
@chapter Portable Shell Programming
|
|
@cindex Portable shell programming
|
|
|
|
When writing your own checks, there are some shell-script programming
|
|
techniques you should avoid in order to make your code portable. The
|
|
Bourne shell and upward-compatible shells like the Korn shell and Bash
|
|
have evolved over the years, and many features added to the original
|
|
System7 shell are now supported on all interesting porting targets.
|
|
However, the following discussion between Russ Allbery and Robert Lipe
|
|
is worth reading:
|
|
|
|
@noindent
|
|
Russ Allbery:
|
|
|
|
@quotation
|
|
The GNU assumption that @command{/bin/sh} is the one and only shell
|
|
leads to a permanent deadlock. Vendors don't want to break users'
|
|
existing shell scripts, and there are some corner cases in the Bourne
|
|
shell that are not completely compatible with a POSIX shell. Thus,
|
|
vendors who have taken this route will @emph{never} (OK@dots{}``never say
|
|
never'') replace the Bourne shell (as @command{/bin/sh}) with a
|
|
POSIX shell.
|
|
@end quotation
|
|
|
|
@noindent
|
|
Robert Lipe:
|
|
|
|
@quotation
|
|
This is exactly the problem. While most (at least most System V's) do
|
|
have a Bourne shell that accepts shell functions most vendor
|
|
@command{/bin/sh} programs are not the POSIX shell.
|
|
|
|
So while most modern systems do have a shell @emph{somewhere} that meets the
|
|
POSIX standard, the challenge is to find it.
|
|
@end quotation
|
|
|
|
For this reason, part of the job of M4sh (@pxref{Programming in M4sh})
|
|
is to find such a shell. But to prevent trouble, if you're not using
|
|
M4sh you should not take advantage of features that were added after Unix
|
|
version 7, circa 1977 (@pxref{Systemology}); you should not use aliases,
|
|
negated character classes, or even @command{unset}. @code{#} comments,
|
|
while not in Unix version 7, were retrofitted in the original Bourne
|
|
shell and can be assumed to be part of the least common denominator.
|
|
|
|
On the other hand, if you're using M4sh you can assume that the shell
|
|
has the features that were added in SVR2 (circa 1984), including shell
|
|
functions,
|
|
@command{return}, @command{unset}, and I/O redirection for builtins. For
|
|
more information, refer to @uref{https://@/www.in-ulm.de/@/~mascheck/@/bourne/}.
|
|
However, some pitfalls have to be avoided for portable use of these
|
|
constructs; these will be documented in the rest of this chapter.
|
|
See in particular @ref{Shell Functions} and @ref{Limitations of
|
|
Builtins, , Limitations of Shell Builtins}.
|
|
|
|
The set of external programs you should run in a @command{configure} script
|
|
is fairly small. @xref{Utilities in Makefiles, , Utilities in
|
|
Makefiles, standards, The GNU Coding Standards}, for the list. This
|
|
restriction allows users to start out with a fairly small set of
|
|
programs and build the rest, avoiding too many interdependencies between
|
|
packages.
|
|
|
|
Some of these external utilities have a portable subset of features; see
|
|
@ref{Limitations of Usual Tools}.
|
|
|
|
There are other sources of documentation about shells. The
|
|
specification for the POSIX
|
|
@uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/V3_chap02.html,
|
|
Shell Command Language}, though more generous than the restrictive shell
|
|
subset described above, is fairly portable nowadays. Also please see
|
|
@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/, the Shell FAQs}.
|
|
|
|
@menu
|
|
* Systemology:: A zoology of operating systems
|
|
* Shellology:: A zoology of shells
|
|
* Invoking the Shell:: Invoking the shell as a command
|
|
* Here-Documents:: Quirks and tricks
|
|
* File Descriptors:: FDs and redirections
|
|
* Signal Handling:: Shells, signals, and headaches
|
|
* File System Conventions:: File names
|
|
* Shell Pattern Matching:: Pattern matching
|
|
* Shell Substitutions:: Variable and command expansions
|
|
* Assignments:: Varying side effects of assignments
|
|
* Parentheses:: Parentheses in shell scripts
|
|
* Special Shell Variables:: Variables you should not change
|
|
* Shell Functions:: What to look out for if you use them
|
|
* Limitations of Builtins:: Portable use of not so portable /bin/sh
|
|
* Limitations of Usual Tools:: Portable use of portable tools
|
|
@end menu
|
|
|
|
|
|
@node Systemology
|
|
@section Systemology
|
|
@cindex Systemology
|
|
|
|
This section aims at presenting some systems and pointers to
|
|
documentation. It may help you addressing particular problems reported
|
|
by users.
|
|
|
|
@uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX-conforming
|
|
systems} are derived from the
|
|
@uref{https://@/en.wikipedia.org/@/wiki/@/Unix, Unix operating system}.
|
|
|
|
The @uref{https://@/bhami.com/@/rosetta.html, Rosetta Stone for Unix}
|
|
contains a table correlating the features of various POSIX-conforming
|
|
systems. @uref{https://@/www.levenez.com/@/unix/, Unix History} is a
|
|
simplified diagram of how many Unix systems were derived from each
|
|
other.
|
|
|
|
@uref{https://@/heirloom.sourceforge.net/, The Heirloom Project}
|
|
provides some variants of traditional implementations of Unix utilities.
|
|
|
|
@table @asis
|
|
@item Darwin
|
|
@cindex Darwin
|
|
@cindex macOS
|
|
@cindex Mac OS X
|
|
Darwin is a partially proprietary operating system maintained by Apple
|
|
Computer and used by most of their products. It is also known as macOS,
|
|
iOS, etc.@: depending on the exact variant. Older versions were called
|
|
``Mac OS X.''
|
|
|
|
By default the file system will be case insensitive, albeit case
|
|
preserving. This can cause nasty problems: for instance, the
|
|
installation attempt for a package having an @file{INSTALL} file can
|
|
result in @samp{make install} reporting that nothing is to be done!
|
|
|
|
Darwin does support case-sensitive file systems, but they must be
|
|
formatted specially as such, and Apple discourages use of a
|
|
case-sensitive volume for the base operating system. To build software
|
|
that expects case-sensitive filenames, it is best to create a separate
|
|
disk volume or disk image formatted as case sensitive; this can be done
|
|
using the @command{diskutil} command or the Disk Utility application.
|
|
|
|
@item QNX 4.25
|
|
@cindex QNX 4.25
|
|
@c FIXME: Please, if you feel like writing something more precise,
|
|
@c it'd be great. In particular, I can't understand the difference with
|
|
@c QNX Neutrino.
|
|
QNX is a realtime operating system running on Intel architecture
|
|
meant to be scalable from the small embedded systems to the hundred
|
|
processor super-computer. It claims to be POSIX certified. More
|
|
information is available on the
|
|
@uref{https://@/blackberry.qnx.com/@/en, QNX home page}.
|
|
|
|
@item Unix version 7
|
|
@cindex Unix version 7
|
|
@cindex V7
|
|
Officially this was called the ``Seventh Edition'' of ``the UNIX
|
|
time-sharing system'' but we use the more-common name ``Unix version 7''.
|
|
Documentation is available in the
|
|
@uref{https://@/s3.amazonaws.com/@/plan9-bell-labs/@/7thEdMan/@/index.html,
|
|
Unix Seventh Edition Manual}.
|
|
Previous versions of Unix are called ``Unix version 6'', etc., but
|
|
they were not as widely used.
|
|
@end table
|
|
|
|
|
|
@node Shellology
|
|
@section Shellology
|
|
@cindex Shellology
|
|
|
|
There are several families of shells, most prominently the Bourne family
|
|
and the C shell family which are deeply incompatible. If you want to
|
|
write portable shell scripts, avoid members of the C shell family. The
|
|
@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/@/shell-differences/, the
|
|
Shell difference FAQ} includes a small history of POSIX shells, and a
|
|
comparison between several of them.
|
|
|
|
Below we describe some of the members of the Bourne shell family.
|
|
|
|
@table @asis
|
|
@item Ash
|
|
@cindex Ash
|
|
Ash is often used on GNU/Linux and BSD
|
|
systems as a light-weight Bourne-compatible shell. Ash 0.2 has some
|
|
bugs that are fixed in the 0.3.x series, but portable shell scripts
|
|
should work around them, since version 0.2 is still shipped with many
|
|
GNU/Linux distributions.
|
|
|
|
To be compatible with Ash 0.2:
|
|
|
|
@itemize @minus
|
|
@item
|
|
don't use @samp{$?} after expanding empty or unset variables,
|
|
or at the start of an @command{eval}:
|
|
|
|
@example
|
|
foo=
|
|
false
|
|
$foo
|
|
echo "Do not use it: $?"
|
|
false
|
|
eval 'echo "Do not use it: $?"'
|
|
@end example
|
|
|
|
@item
|
|
don't use command substitution within variable expansion:
|
|
|
|
@example
|
|
cat $@{FOO=`bar`@}
|
|
@end example
|
|
|
|
@item
|
|
beware that single builtin substitutions are not performed by a
|
|
subshell, hence their effect applies to the current shell! @xref{Shell
|
|
Substitutions}, item ``Command Substitution''.
|
|
@end itemize
|
|
|
|
@item Bash
|
|
@cindex Bash
|
|
To detect whether you are running Bash, test whether
|
|
@code{BASH_VERSION} is set. To require
|
|
POSIX compatibility, run @samp{set -o posix}. @xref{Bash POSIX
|
|
Mode, , Bash POSIX Mode, bash, The GNU Bash Reference
|
|
Manual}, for details.
|
|
|
|
@item Bash 2.05 and later
|
|
@cindex Bash 2.05 and later
|
|
Versions 2.05 and later of Bash use a different format for the
|
|
output of the @command{set} builtin, designed to make evaluating its
|
|
output easier. However, this output is not compatible with earlier
|
|
versions of Bash (or with many other shells, probably). So if
|
|
you use Bash 2.05 or higher to execute @command{configure},
|
|
you'll need to use Bash 2.05 for all other build tasks as well.
|
|
|
|
@item Ksh
|
|
@cindex Ksh
|
|
@cindex Korn shell
|
|
@prindex @samp{ksh}
|
|
@prindex @samp{ksh88}
|
|
@prindex @samp{ksh93}
|
|
The Korn shell is compatible with the Bourne family and it mostly
|
|
conforms to POSIX. It has two major variants commonly
|
|
called @samp{ksh88} and @samp{ksh93}, named after the years of initial
|
|
release. It is usually called @command{ksh}, but is called @command{sh}
|
|
on some hosts if you set your path appropriately.
|
|
|
|
On Solaris 11, @command{/bin/sh} and @command{/usr/bin/ksh} are both
|
|
@samp{ksh93}. On Solaris 10 and earlier, @command{/bin/sh} is a
|
|
pre-POSIX Bourne shell and the Korn shell is found elsewhere:
|
|
@prindex @command{/usr/bin/ksh} on Solaris
|
|
@command{/usr/bin/ksh} is @samp{ksh88} on Solaris 10,
|
|
@prindex @command{/usr/xpg4/bin/sh} on Solaris
|
|
@command{/usr/xpg4/bin/sh} is a POSIX-compliant variant of
|
|
@samp{ksh88} on Solaris 10 and later,
|
|
@prindex @command{/usr/dt/bin/dtksh} on Solaris
|
|
and @command{/usr/dt/bin/dtksh} is @samp{ksh93}.
|
|
Variants that are not standard may be parts of optional
|
|
packages. There is no extra charge for these packages, but they are
|
|
not part of a minimal OS install and therefore some installations may
|
|
not have it.
|
|
|
|
@item Pdksh
|
|
@prindex @samp{pdksh}
|
|
A public-domain clone of the Korn shell called @command{pdksh} is widely
|
|
available: it has most of the @samp{ksh88} features along with a few of
|
|
its own. It usually sets @code{KSH_VERSION}, except if invoked as
|
|
@command{/bin/sh} on OpenBSD, and similarly to Bash you can require
|
|
POSIX compatibility by running @samp{set -o posix}. Unfortunately, with
|
|
@command{pdksh} 5.2.14 (the latest stable version as of January 2007)
|
|
POSIX mode is buggy and causes @command{pdksh} to depart from POSIX in
|
|
at least one respect, see @ref{Shell Substitutions}.
|
|
|
|
@item Zsh
|
|
@cindex Zsh
|
|
To detect whether you are running @command{zsh}, test whether
|
|
@code{ZSH_VERSION} is set. By default @command{zsh} is @emph{not}
|
|
compatible with the Bourne shell: you must execute @samp{emulate sh},
|
|
and for @command{zsh} versions before 3.1.6-dev-18 you must also
|
|
set @code{NULLCMD} to @samp{:}. @xref{Compatibility, , Compatibility,
|
|
zsh, The Z Shell Manual}, for details.
|
|
|
|
The default Mac OS X @command{sh} was originally Zsh; it was changed to
|
|
Bash in Mac OS X 10.2 (2002) and changed back to Zsh in macOS 10.15 (2019).
|
|
@end table
|
|
|
|
@node Invoking the Shell
|
|
@section Invoking the Shell
|
|
@cindex invoking the shell
|
|
@cindex shell invocation
|
|
|
|
The Korn shell (up to at least version M-12/28/93d) has a bug when
|
|
invoked on a file whose name does not contain a slash. It first
|
|
searches for the file's name in @env{PATH}, and if found it executes
|
|
that rather than the original file. For example, assuming there is a
|
|
binary executable @file{/usr/bin/script} in your @env{PATH}, the last
|
|
command in the following example fails because the Korn shell finds
|
|
@file{/usr/bin/script} and refuses to execute it as a shell script:
|
|
|
|
@example
|
|
$ @kbd{touch xxyzzyz script}
|
|
$ @kbd{ksh xxyzzyz}
|
|
$ @kbd{ksh ./script}
|
|
$ @kbd{ksh script}
|
|
ksh: script: cannot execute
|
|
@end example
|
|
|
|
Bash 2.03 has a bug when invoked with the @option{-c} option: if the
|
|
option-argument ends in backslash-newline, Bash incorrectly reports a
|
|
syntax error. The problem does not occur if a character follows the
|
|
backslash:
|
|
|
|
@example
|
|
$ @kbd{$ bash -c 'echo foo \}
|
|
> @kbd{'}
|
|
bash: -c: line 2: syntax error: unexpected end of file
|
|
$ @kbd{bash -c 'echo foo \}
|
|
> @kbd{ '}
|
|
foo
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Backslash-Newline-Empty}, for how this can cause problems in makefiles.
|
|
|
|
@node Here-Documents
|
|
@section Here-Documents
|
|
@cindex Here-documents
|
|
@cindex Shell here-documents
|
|
|
|
Because unquoted here-documents are subject to parameter expansion and
|
|
command substitution, the characters @samp{$} and @samp{`} are special
|
|
in unquoted here-documents and should be escaped by @samp{\} if you want
|
|
them as-is. Also, @samp{\} is special if it precedes @samp{$},
|
|
@samp{`}, newline or @samp{\} itself, so @samp{\} should be doubled if
|
|
it appears before these characters and you want it as-is.
|
|
|
|
Using command substitutions in a here-document that is fed to a shell
|
|
function is not portable. For example, with Solaris 10 @command{/bin/sh}:
|
|
|
|
@example
|
|
$ @kbd{kitty () @{ cat; @}}
|
|
$ @kbd{kitty <<EOF
|
|
> `echo ok`
|
|
> EOF}
|
|
/tmp/sh199886: cannot open
|
|
$ @kbd{echo $?}
|
|
1
|
|
@end example
|
|
|
|
Some shells mishandle large here-documents: for example,
|
|
Solaris 10 @command{dtksh} and the UnixWare 7.1.1 POSIX shell, which are
|
|
derived from Korn shell version M-12/28/93d, mishandle braced variable
|
|
expansion that crosses a 1024- or 4096-byte buffer boundary
|
|
within a here-document. Only the part of the variable name after the boundary
|
|
is used. For example, @code{$@{variable@}} could be replaced by the expansion
|
|
of @code{$@{ble@}}. If the end of the variable name is aligned with the block
|
|
boundary, the shell reports an error, as if you used @code{$@{@}}.
|
|
Instead of @code{$@{variable-default@}}, the shell may expand
|
|
@code{$@{riable-default@}}, or even @code{$@{fault@}}. This bug can often
|
|
be worked around by omitting the braces: @code{$variable}. The bug was
|
|
fixed in
|
|
@samp{ksh93g} (1998-04-30) but as of 2006 many operating systems were
|
|
still shipping older versions with the bug.
|
|
|
|
Empty here-documents are not portable either; with the following code,
|
|
@command{zsh} up to at least version 4.3.10 creates a file with a single
|
|
newline, whereas other shells create an empty file:
|
|
|
|
@example
|
|
cat >file <<EOF
|
|
EOF
|
|
@end example
|
|
|
|
Many shells (including the Bourne shell) implement here-documents
|
|
inefficiently. In particular, some shells can be extremely inefficient when
|
|
a single statement contains many here-documents. For instance if your
|
|
@file{configure.ac} includes something like:
|
|
|
|
@example
|
|
@group
|
|
AS_IF([<cross_compiling>],
|
|
[assume this and that],
|
|
[check this
|
|
check that
|
|
check something else
|
|
@dots{}
|
|
on and on forever
|
|
@dots{}])
|
|
@end group
|
|
@end example
|
|
|
|
A shell parses the whole @code{if}/@code{fi} construct generated by
|
|
@code{AS_IF}, creating
|
|
temporary files for each here-document in it. Some shells create links
|
|
for such here-documents on every @code{fork}, so that the clean-up code
|
|
they had installed correctly removes them. It is creating the links
|
|
that can take the shell forever.
|
|
|
|
Moving the tests out of the @code{if}/@code{fi}, or creating multiple
|
|
@code{if}/@code{fi} constructs, would improve the performance
|
|
significantly. Anyway, this kind of construct is not exactly the
|
|
typical use of Autoconf. In fact, it's even not recommended, because M4
|
|
macros can't look into shell conditionals, so we may fail to expand a
|
|
macro when it was expanded before in a conditional path, and the
|
|
condition turned out to be false at runtime, and we end up not
|
|
executing the macro at all.
|
|
|
|
Be careful with the use of @samp{<<-} to unindent here-documents. The
|
|
behavior is only portable for stripping leading @key{TAB}s, and things
|
|
can silently break if an overzealous editor converts to using leading
|
|
spaces (not all shells are nice enough to warn about unterminated
|
|
here-documents).
|
|
|
|
@example
|
|
$ @kbd{printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done}
|
|
1
|
|
2
|
|
done
|
|
$ @kbd{printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done}
|
|
1
|
|
2
|
|
x
|
|
done
|
|
@end example
|
|
|
|
@node File Descriptors
|
|
@section File Descriptors
|
|
@cindex Descriptors
|
|
@cindex File descriptors
|
|
@cindex Shell file descriptors
|
|
|
|
Most shells, if not all (including Bash, Zsh, Ash), output traces on
|
|
stderr, even for subshells. This might result in undesirable content
|
|
if you meant to capture the standard-error output of the inner command:
|
|
|
|
@example
|
|
$ @kbd{ash -x -c '(eval "echo foo >&2") 2>stderr'}
|
|
$ @kbd{cat stderr}
|
|
+ eval echo foo >&2
|
|
+ echo foo
|
|
foo
|
|
$ @kbd{bash -x -c '(eval "echo foo >&2") 2>stderr'}
|
|
$ @kbd{cat stderr}
|
|
+ eval 'echo foo >&2'
|
|
++ echo foo
|
|
foo
|
|
$ @kbd{zsh -x -c '(eval "echo foo >&2") 2>stderr'}
|
|
@i{# Traces on startup files deleted here.}
|
|
$ @kbd{cat stderr}
|
|
+zsh:1> eval echo foo >&2
|
|
+zsh:1> echo foo
|
|
foo
|
|
@end example
|
|
|
|
@noindent
|
|
One workaround is to grep out uninteresting lines, hoping not to remove
|
|
good ones.
|
|
|
|
If you intend to redirect both standard error and standard output,
|
|
redirect standard output first. This works better with HP-UX,
|
|
since its shell mishandles tracing if standard error is redirected
|
|
first:
|
|
|
|
@example
|
|
$ @kbd{sh -x -c ': 2>err >out'}
|
|
+ :
|
|
+ 2> err $ @kbd{cat err}
|
|
1> out
|
|
@end example
|
|
|
|
Don't try to redirect the standard error of a command substitution. It
|
|
must be done @emph{inside} the command substitution. When running
|
|
@samp{: `cd /zorglub` 2>/dev/null} expect the error message to
|
|
escape, while @samp{: `cd /zorglub 2>/dev/null`} works properly.
|
|
|
|
On the other hand, some shells, such as Solaris or FreeBSD
|
|
@command{/bin/sh}, warn about missing programs before performing
|
|
redirections. Therefore, to silently check whether a program exists, it
|
|
is necessary to perform redirections on a subshell or brace group:
|
|
@example
|
|
$ @kbd{/bin/sh -c 'nosuch 2>/dev/null'}
|
|
nosuch: not found
|
|
$ @kbd{/bin/sh -c '(nosuch) 2>/dev/null'}
|
|
$ @kbd{/bin/sh -c '@{ nosuch; @} 2>/dev/null'}
|
|
$ @kbd{bash -c 'nosuch 2>/dev/null'}
|
|
@end example
|
|
|
|
FreeBSD 6.2 sh may mix the trace output lines from the statements in a
|
|
shell pipeline.
|
|
|
|
It is worth noting that Zsh (but not Ash nor Bash) makes it possible
|
|
in assignments though: @samp{foo=`cd /zorglub` 2>/dev/null}.
|
|
|
|
Some shells, like @command{ash}, don't recognize bi-directional
|
|
redirection (@samp{<>}). And even on shells that recognize it, it is
|
|
not portable to use on fifos: POSIX does not require read-write support
|
|
for named pipes, and Cygwin does not support it:
|
|
|
|
@example
|
|
$ @kbd{mkfifo fifo}
|
|
$ @kbd{exec 5<>fifo}
|
|
$ @kbd{echo hi >&5}
|
|
bash: echo: write error: Communication error on send
|
|
@end example
|
|
|
|
@noindent
|
|
Furthermore, versions of @command{dash} before 0.5.6 mistakenly truncate
|
|
regular files when using @samp{<>}:
|
|
|
|
@example
|
|
$ @kbd{echo a > file}
|
|
$ @kbd{bash -c ': 1<>file'; cat file}
|
|
a
|
|
$ @kbd{dash -c ': 1<>file'; cat file}
|
|
$ rm a
|
|
@end example
|
|
|
|
Solaris 10 @code{/bin/sh} executes redirected compound commands
|
|
in a subshell, while other shells don't:
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
|
|
0
|
|
$ @kbd{ksh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
|
|
1
|
|
$ @kbd{bash -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
|
|
1
|
|
@end example
|
|
|
|
Solaris 10 @command{sh} will try to optimize away a @command{:} command
|
|
(even if it is redirected) in a loop after the first iteration, or in a
|
|
shell function after the first call:
|
|
|
|
@example
|
|
$ @kbd{for i in 1 2 3 ; do : >x$i; done}
|
|
$ @kbd{ls x*}
|
|
x1
|
|
$ @kbd{f () @{ : >$1; @}; f y1; f y2; f y3;}
|
|
$ @kbd{ls y*}
|
|
y1
|
|
@end example
|
|
|
|
@noindent
|
|
As a workaround, @command{echo} or @command{eval} can be used.
|
|
|
|
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
|
|
@command{exec} in the shell. In @command{ksh} as well as HP-UX
|
|
@command{sh}, file descriptors above 2 which are opened using
|
|
@samp{exec @var{n}>file} are closed by a subsequent @samp{exec} (such as
|
|
that involved in the fork-and-exec which runs a program or script):
|
|
|
|
@example
|
|
$ @kbd{echo 'echo hello >&5' >k}
|
|
$ @kbd{/bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
|
|
hello
|
|
$ @kbd{bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
|
|
hello
|
|
$ @kbd{ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
|
|
./k[1]: 5: cannot open [Bad file number]
|
|
$ @kbd{ksh -c '(ksh ./k) 5>t; cat t'}
|
|
hello
|
|
$ @kbd{ksh -c '@{ ksh ./k; @} 5>t; cat t'}
|
|
hello
|
|
$ @kbd{ksh -c '5>t ksh ./k; cat t}
|
|
hello
|
|
@end example
|
|
|
|
Don't rely on duplicating a closed file descriptor to cause an
|
|
error. With Solaris 10 @command{/bin/sh}, failed duplication is silently
|
|
ignored, which can cause unintended leaks to the original file
|
|
descriptor. In this example, observe the leak to standard output:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'echo hi >&3' 3>&-; echo $?}
|
|
bash: 3: Bad file descriptor
|
|
1
|
|
$ @kbd{/bin/sh -c 'echo hi >&3' 3>&-; echo $?}
|
|
hi
|
|
0
|
|
@end example
|
|
|
|
Fortunately, an attempt to close an already closed file descriptor will
|
|
portably succeed. Likewise, it is safe to use either style of
|
|
@samp{@var{n}<&-} or @samp{@var{n}>&-} for closing a file descriptor,
|
|
even if it doesn't match the read/write mode that the file descriptor
|
|
was opened with.
|
|
|
|
DOS variants cannot rename or remove open files, such as in
|
|
@samp{mv foo bar >foo} or @samp{rm foo >foo}, even though this is
|
|
perfectly portable among POSIX hosts.
|
|
|
|
A few ancient systems reserved some file descriptors. By convention,
|
|
file descriptor 3 was opened to @file{/dev/tty} when you logged into
|
|
Eighth Edition (1985) through Tenth Edition Unix (1989). File
|
|
descriptor 4 had a special use on the Stardent/Kubota Titan (circa
|
|
1990), though we don't now remember what it was. Both these systems are
|
|
obsolete, so it's now safe to treat file descriptors 3 and 4 like any
|
|
other file descriptors.
|
|
|
|
On the other hand, you can't portably use multi-digit file descriptors.
|
|
@command{dash} and Solaris @command{ksh} don't understand any file
|
|
descriptor larger than @samp{9}:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'exec 10>&-'; echo $?}
|
|
0
|
|
$ @kbd{ksh -c 'exec 9>&-'; echo $?}
|
|
0
|
|
$ @kbd{ksh -c 'exec 10>&-'; echo $?}
|
|
ksh[1]: exec: 10: not found
|
|
127
|
|
$ @kbd{dash -c 'exec 9>&-'; echo $?}
|
|
0
|
|
$ @kbd{dash -c 'exec 10>&-'; echo $?}
|
|
exec: 1: 10: not found
|
|
2
|
|
@end example
|
|
|
|
@c <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
|
|
@node Signal Handling
|
|
@section Signal Handling
|
|
@cindex Signal handling in the shell
|
|
@cindex Signals, shells and
|
|
|
|
Portable handling of signals within the shell is another major source of
|
|
headaches. This is worsened by the fact that various different, mutually
|
|
incompatible approaches are possible in this area, each with its
|
|
distinctive merits and demerits. A detailed description of these possible
|
|
approaches, as well as of their pros and cons, can be found in
|
|
@uref{https://www.cons.org/cracauer/sigint.html, this article}.
|
|
|
|
Solaris 10 @command{/bin/sh} automatically traps most signals by default;
|
|
the shell still exits with error upon termination by one of those signals,
|
|
but in such a case the exit status might be somewhat unexpected (even if
|
|
allowed by POSIX, strictly speaking):
|
|
@c FIXME: We had a reference for this behavior but the website no longer
|
|
@c exists and the page is not in the Internet Archive. --zw 2020-07-10.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'kill -1 $$'; echo $?} # Will exit 128 + (signal number).
|
|
Hangup
|
|
129
|
|
$ @kbd{/bin/ksh -c 'kill -15 $$'; echo $?} # Likewise.
|
|
Terminated
|
|
143
|
|
$ @kbd{for sig in 1 2 3 15; do}
|
|
> @kbd{ echo $sig:}
|
|
> @kbd{ /bin/sh -c "kill -$s \$\$"; echo $?}
|
|
> @kbd{done}
|
|
signal 1:
|
|
Hangup
|
|
129
|
|
signal 2:
|
|
208
|
|
signal 3:
|
|
208
|
|
signal 15:
|
|
208
|
|
@end example
|
|
|
|
This gets even worse if one is using the POSIX ``wait'' interface to get
|
|
details about the shell process terminations: it will result in the shell
|
|
having exited normally, rather than by receiving a signal.
|
|
|
|
@example
|
|
$ @kbd{cat > foo.c <<'END'}
|
|
#include <stdio.h> /* for printf */
|
|
#include <stdlib.h> /* for system */
|
|
#include <sys/wait.h> /* for WIF* macros */
|
|
int main(void)
|
|
@{
|
|
int status = system ("kill -15 $$");
|
|
printf ("Terminated by signal: %s\n",
|
|
WIFSIGNALED (status) ? "yes" : "no");
|
|
printf ("Exited normally: %s\n",
|
|
WIFEXITED (status) ? "yes" : "no");
|
|
return 0;
|
|
@}
|
|
END
|
|
@c $$ font-lock
|
|
$ @kbd{cc -o foo foo.c}
|
|
$ @kbd{./a.out} # On GNU/Linux
|
|
Terminated by signal: no
|
|
Exited normally: yes
|
|
$ @kbd{./a.out} # On Solaris 10
|
|
Terminated by signal: yes
|
|
Exited normally: no
|
|
@end example
|
|
|
|
Various shells seem to handle @code{SIGQUIT} specially: they ignore it even
|
|
if it is not blocked, and even if the shell is not running interactively
|
|
(in fact, even if the shell has no attached tty); among these shells
|
|
are at least Bash (from version 2 onward), Zsh 4.3.12, Solaris 10
|
|
@code{/bin/ksh} and @code{/usr/xpg4/bin/sh}, and AT&T @code{ksh93} (2011).
|
|
Still, @code{SIGQUIT} seems to be trappable quite portably within all
|
|
these shells. OTOH, some other shells doesn't special-case the handling
|
|
of @code{SIGQUIT}; among these shells are at least @code{pdksh} 5.2.14,
|
|
Solaris 10 and NetBSD 5.1 @code{/bin/sh}, and the Almquist Shell 0.5.5.1.
|
|
|
|
Some shells (especially Korn shells and derivatives) might try to
|
|
propagate to themselves a signal that has killed a child process; this is
|
|
not a bug, but a conscious design choice (although its overall value might
|
|
be debatable). The exact details of how this is attained vary from shell
|
|
to shell. For example, upon running @code{perl -e 'kill 2, $$'}, after
|
|
the perl process has been interrupted, AT&T @code{ksh93} (2011) will
|
|
proceed to send itself a @code{SIGINT}, while Solaris 10 @code{/bin/ksh}
|
|
and @code{/usr/xpg4/bin/sh} will proceed to exit with status 130 (i.e.,
|
|
128 + 2). In any case, if there is an active trap associated with
|
|
@code{SIGINT}, those shells will correctly execute it.
|
|
|
|
@c See: <https://www.austingroupbugs.net/view.php?id=51>
|
|
Some Korn shells, when a child process die due receiving a signal with
|
|
signal number @var{n}, can leave in @samp{$?} an exit status of
|
|
256+@var{n} instead of the more common 128+@var{n}. Observe the
|
|
difference between AT&T @code{ksh93} (2011) and @code{bash} 4.1.5 on
|
|
Debian:
|
|
|
|
@example
|
|
$ @kbd{/bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'}
|
|
/bin/ksh: line 1: 7837: Hangup
|
|
257
|
|
$ @kbd{/bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'}
|
|
/bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$")
|
|
129
|
|
@end example
|
|
|
|
@noindent
|
|
This @command{ksh} behavior is allowed by POSIX, if implemented with
|
|
due care; see this @uref{https://www.austingroupbugs.net/view.php?id=51,
|
|
Austin Group discussion} for more background. However, if it is not
|
|
implemented with proper care, such a behavior might cause problems
|
|
in some corner cases. To see why, assume we have a ``wrapper'' script
|
|
like this:
|
|
|
|
@example
|
|
#!/bin/sh
|
|
# Ignore some signals in the shell only, not in its child processes.
|
|
trap : 1 2 13 15
|
|
wrapped_command "$@@"
|
|
ret=$?
|
|
other_command
|
|
exit $ret
|
|
@end example
|
|
|
|
@noindent
|
|
If @command{wrapped_command} is interrupted by a @code{SIGHUP} (which
|
|
has signal number 1), @code{ret} will be set to 257. Unless the
|
|
@command{exit} shell builtin is smart enough to understand that such
|
|
a value can only have originated from a signal, and adjust the final
|
|
wait status of the shell appropriately, the value 257 will just get
|
|
truncated to 1 by the closing @code{exit} call, so that a caller of
|
|
the script will have no way to determine that termination by a signal
|
|
was involved. Observe the different behavior of AT&T @code{ksh93}
|
|
(2011) and @code{bash} 4.1.5 on Debian:
|
|
|
|
@example
|
|
$ @kbd{cat foo.sh}
|
|
#!/bin/sh
|
|
sh -c 'kill -1 $$'
|
|
ret=$?
|
|
echo $ret
|
|
exit $ret
|
|
$ @kbd{/bin/ksh foo.sh; echo $?}
|
|
foo.sh: line 2: 12479: Hangup
|
|
257
|
|
1
|
|
$ @kbd{/bin/bash foo.sh; echo $?}
|
|
foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$')
|
|
129
|
|
129
|
|
@end example
|
|
|
|
@node File System Conventions
|
|
@section File System Conventions
|
|
@cindex File system conventions
|
|
|
|
Autoconf uses shell-script processing extensively, so the file names
|
|
that it processes should not contain characters that are special to the
|
|
shell. Special characters include space, tab, newline, NUL, and
|
|
the following:
|
|
|
|
@example
|
|
" # $ & ' ( ) * ; < = > ? [ \ ` |
|
|
@end example
|
|
|
|
Also, file names should not begin with @samp{~} or @samp{-}, and should
|
|
contain neither @samp{-} immediately after @samp{/} nor @samp{~}
|
|
immediately after @samp{:}. On POSIX-like platforms, directory names
|
|
should not contain @samp{:}, as this runs afoul of @samp{:} used as the
|
|
path separator.
|
|
|
|
These restrictions apply not only to the files that you distribute, but
|
|
also to the absolute file names of your source, build, and destination
|
|
directories.
|
|
|
|
On some POSIX-like platforms, @samp{!} and @samp{^} are special too, so
|
|
they should be avoided.
|
|
|
|
POSIX lets implementations treat leading @file{//} specially, but
|
|
requires leading @file{///} and beyond to be equivalent to @file{/}.
|
|
Most Unix variants treat @file{//} like @file{/}. However, some treat
|
|
@file{//} as a ``super-root'' that can provide access to files that are
|
|
not otherwise reachable from @file{/}. The super-root tradition began
|
|
with Apollo Domain/OS, which died out long ago, but unfortunately Cygwin
|
|
has revived it.
|
|
|
|
While @command{autoconf} and friends are usually run on some POSIX
|
|
variety, they can be used on other systems, most notably DOS
|
|
variants. This impacts several assumptions regarding file names.
|
|
|
|
@noindent
|
|
For example, the following code:
|
|
|
|
@example
|
|
case $foo_dir in
|
|
/*) # Absolute
|
|
;;
|
|
*)
|
|
foo_dir=$dots$foo_dir ;;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
fails to properly detect absolute file names on those systems, because
|
|
they can use a drivespec, and usually use a backslash as directory
|
|
separator. If you want to be portable to DOS variants (at the
|
|
price of rejecting valid but oddball POSIX file names like @file{a:\b}),
|
|
you can check for absolute file names like this:
|
|
|
|
@cindex absolute file names, detect
|
|
@example
|
|
case $foo_dir in
|
|
[\\/]* | ?:[\\/]* ) # Absolute
|
|
;;
|
|
*)
|
|
foo_dir=$dots$foo_dir ;;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
Make sure you quote the brackets if appropriate and keep the backslash as
|
|
first character. @xref{case, , Limitations of Shell Builtins}.
|
|
|
|
Also, because the colon is used as part of a drivespec, these systems don't
|
|
use it as path separator. When creating or accessing paths, you can use the
|
|
@code{PATH_SEPARATOR} output variable instead. @command{configure} sets this
|
|
to the appropriate value for the build system (@samp{:} or @samp{;}) when it
|
|
starts up.
|
|
|
|
File names need extra care as well. While DOS variants
|
|
that are POSIXy enough to run @command{autoconf} (such as DJGPP)
|
|
are usually able to handle long file names properly, there are still
|
|
limitations that can seriously break packages. Several of these issues
|
|
can be easily detected by the
|
|
@uref{https://@/ftp.gnu.org/@/gnu/@/non-gnu/@/doschk/@/doschk-1.1.tar.gz, doschk}
|
|
package.
|
|
|
|
A short overview follows; problems are marked with SFN/LFN to
|
|
indicate where they apply: SFN means the issues are only relevant to
|
|
plain DOS, not to DOS under Microsoft Windows
|
|
variants, while LFN identifies problems that exist even under
|
|
Microsoft Windows variants.
|
|
|
|
@table @asis
|
|
@item No multiple dots (SFN)
|
|
DOS cannot handle multiple dots in file names. This is an especially
|
|
important thing to remember when building a portable configure script,
|
|
as @command{autoconf} uses a .in suffix for template files.
|
|
|
|
This is perfectly OK on POSIX variants:
|
|
|
|
@example
|
|
AC_CONFIG_HEADERS([config.h])
|
|
AC_CONFIG_FILES([source.c foo.bar])
|
|
AC_OUTPUT
|
|
@end example
|
|
|
|
@noindent
|
|
but it causes problems on DOS, as it requires @samp{config.h.in},
|
|
@samp{source.c.in} and @samp{foo.bar.in}. To make your package more portable
|
|
to DOS-based environments, you should use this instead:
|
|
|
|
@example
|
|
AC_CONFIG_HEADERS([config.h:config.hin])
|
|
AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
|
|
AC_OUTPUT
|
|
@end example
|
|
|
|
@item No leading dot (SFN)
|
|
DOS cannot handle file names that start with a dot. This is usually
|
|
not important for @command{autoconf}.
|
|
|
|
@item Case insensitivity (LFN)
|
|
DOS is case insensitive, so you cannot, for example, have both a
|
|
file called @samp{INSTALL} and a directory called @samp{install}. This
|
|
also affects @command{make}; if there's a file called @samp{INSTALL} in
|
|
the directory, @samp{make install} does nothing (unless the
|
|
@samp{install} target is marked as PHONY).
|
|
|
|
@item The 8+3 limit (SFN)
|
|
Because the DOS file system only stores the first 8 characters of
|
|
the file name and the first 3 of the extension, those must be unique.
|
|
That means that @file{foobar-part1.c}, @file{foobar-part2.c} and
|
|
@file{foobar-prettybird.c} all resolve to the same file name
|
|
(@file{FOOBAR-P.C}). The same goes for @file{foo.bar} and
|
|
@file{foo.bartender}.
|
|
|
|
The 8+3 limit is not usually a problem under Microsoft Windows, as it
|
|
uses numeric
|
|
tails in the short version of file names to make them unique. However, a
|
|
registry setting can turn this behavior off. While this makes it
|
|
possible to share file trees containing long file names between SFN
|
|
and LFN environments, it also means the above problem applies there
|
|
as well.
|
|
|
|
@item Invalid characters (LFN)
|
|
Some characters are invalid in DOS file names, and should therefore
|
|
be avoided. In a LFN environment, these are @samp{/}, @samp{\},
|
|
@samp{?}, @samp{*}, @samp{:}, @samp{<}, @samp{>}, @samp{|} and @samp{"}.
|
|
In a SFN environment, other characters are also invalid. These
|
|
include @samp{+}, @samp{,}, @samp{[} and @samp{]}.
|
|
|
|
@item Invalid names (LFN)
|
|
Some DOS file names are reserved, and cause problems if you
|
|
try to use files with those names. These names include @file{CON},
|
|
@file{AUX}, @file{COM1}, @file{COM2}, @file{COM3}, @file{COM4},
|
|
@file{LPT1}, @file{LPT2}, @file{LPT3}, @file{NUL}, and @file{PRN}.
|
|
File names are case insensitive, so even names like
|
|
@file{aux/config.guess} are disallowed.
|
|
|
|
@end table
|
|
|
|
@node Shell Pattern Matching
|
|
@section Shell Pattern Matching
|
|
@cindex Shell pattern matching
|
|
|
|
Nowadays portable patterns can use negated character classes like
|
|
@samp{[!-aeiou]}. The older syntax @samp{[^-aeiou]} is supported by
|
|
some shells but not others; hence portable scripts should never use
|
|
@samp{^} as the first character of a bracket pattern.
|
|
|
|
Outside the C locale, patterns like @samp{[a-z]} are problematic since
|
|
they may match characters that are not lower-case letters.
|
|
|
|
@node Shell Substitutions
|
|
@section Shell Substitutions
|
|
@cindex Shell substitutions
|
|
|
|
Contrary to a persistent urban legend, the Bourne shell does not
|
|
systematically split variables and back-quoted expressions, in particular
|
|
on the right-hand side of assignments and in the argument of @code{case}.
|
|
For instance, the following code:
|
|
|
|
@example
|
|
case "$given_srcdir" in
|
|
.) top_srcdir="`printf '%s\n' "$dots" | sed 's|/$||'`" ;;
|
|
*) top_srcdir="$dots$given_srcdir" ;;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
is more readable when written as:
|
|
|
|
@example
|
|
case $given_srcdir in
|
|
.) top_srcdir=`printf '%s\n' "$dots" | sed 's|/$||'` ;;
|
|
*) top_srcdir=$dots$given_srcdir ;;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
and in fact it is even @emph{more} portable: in the first case of the
|
|
first attempt, the computation of @code{top_srcdir} is not portable,
|
|
since not all shells properly understand @code{"`@dots{}"@dots{}"@dots{}`"},
|
|
for example Solaris 10 @command{ksh}:
|
|
|
|
@example
|
|
$ @kbd{foo="`echo " bar" | sed 's, ,,'`"}
|
|
ksh: : cannot execute
|
|
ksh: bar | sed 's, ,,': cannot execute
|
|
@end example
|
|
|
|
@noindent
|
|
POSIX does not specify behavior for this sequence. On the other hand,
|
|
behavior for @code{"`@dots{}\"@dots{}\"@dots{}`"} is specified by POSIX,
|
|
but in practice, not all shells understand it the same way: pdksh 5.2.14
|
|
prints spurious quotes when in POSIX mode:
|
|
|
|
@example
|
|
$ @kbd{echo "`echo \"hello\"`"}
|
|
hello
|
|
$ @kbd{set -o posix}
|
|
$ @kbd{echo "`echo \"hello\"`"}
|
|
"hello"
|
|
@end example
|
|
|
|
@noindent
|
|
There is just no portable way to use double-quoted strings inside
|
|
double-quoted back-quoted expressions (pfew!).
|
|
|
|
Bash 4.1 has a bug where quoted empty strings adjacent to unquoted
|
|
parameter expansions are elided during word splitting. Meanwhile, zsh
|
|
does not perform word splitting except when in Bourne compatibility
|
|
mode. In the example below, the correct behavior is to have five
|
|
arguments to the function, and exactly two spaces on either side of the
|
|
middle @samp{-}, since word splitting collapses multiple spaces in
|
|
@samp{$f} but leaves empty arguments intact.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
|
|
3- - -
|
|
$ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
|
|
5- - -
|
|
$ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
|
|
3- - -
|
|
$ @kbd{zsh -c 'emulate sh;}
|
|
> @kbd{n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
|
|
5- - -
|
|
@end example
|
|
|
|
@noindent
|
|
You can work around this by doing manual word splitting, such as using
|
|
@samp{"$str" $list} rather than @samp{"$str"$list}.
|
|
|
|
There are also portability pitfalls with particular expansions:
|
|
|
|
@table @code
|
|
@item $@@
|
|
@cindex @code{"$@@"}
|
|
Autoconf macros often use the @command{set} command to update
|
|
@samp{$@@}, so if you are writing shell code intended for
|
|
@command{configure} you should not assume that the value of @samp{$@@}
|
|
persists for any length of time.
|
|
|
|
You may see usages like @samp{$@{1+"$@@"@}} in older shell scripts
|
|
designed to work around a portability problem in ancient shells.
|
|
Unfortunately this runs afoul of bugs in more-recent shells, and
|
|
nowadays it is better to use plain @samp{"$@@"} instead.
|
|
|
|
The portability problem with ancient shells was significant.
|
|
When there are no positional arguments @samp{"$@@"} should be discarded,
|
|
but the original Unix version 7 Bourne shell mistakenly treated it as
|
|
equivalent to @samp{""} instead, and many ancient shells followed its lead.
|
|
|
|
For many years shell scripts worked around this portability problem by
|
|
using @samp{$@{1+"$@@"@}} instead of @samp{"$@@"}, and you may see this
|
|
usage in older scripts. Unfortunately, @samp{$@{1+"$@@"@}} does not
|
|
work with @command{ksh93} M 93t+ (2009) as shipped in AIX 7.2 (2015),
|
|
as this shell drops a trailing empty argument:
|
|
|
|
@example
|
|
$ @kbd{set a b c ""}
|
|
$ @kbd{set $@{1+"$@@"@}}
|
|
$ @kbd{echo $#}
|
|
3
|
|
@end example
|
|
|
|
Also, @samp{$@{1+"$@@"@}} does not work with Zsh 4.2.6 (2005) and
|
|
earlier, as shipped in Mac OS X releases before 10.5, as this old Zsh
|
|
incorrectly word splits the result:
|
|
|
|
@example
|
|
zsh $ @kbd{emulate sh}
|
|
zsh $ @kbd{for i in "$@@"; do echo $i; done}
|
|
Hello World
|
|
!
|
|
zsh $ @kbd{for i in $@{1+"$@@"@}; do echo $i; done}
|
|
Hello
|
|
World
|
|
!
|
|
@end example
|
|
|
|
To work around these problems Autoconf does two things. First, in the
|
|
shell code that it generates Autoconf avoids @samp{"$@@"} if it is
|
|
possible that there may be no positional arguments. You can use this
|
|
workaround in your own code, too, if you want it to be portable to
|
|
ancient shells. For example, instead of:
|
|
|
|
@example
|
|
cat conftest.c "$@@"
|
|
@end example
|
|
|
|
you can use this:
|
|
|
|
@example
|
|
case $# in
|
|
0) cat conftest.c;;
|
|
*) cat conftest.c "$@@";;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
Second, Autoconf-generated @command{configure} scripts work around most
|
|
of the old Zsh problem by using Zsh's ``global aliases'' to convert
|
|
@samp{$@{1+"$@@"@}} into @samp{"$@@"} by itself:
|
|
|
|
@example
|
|
test $@{ZSH_VERSION+y@} && alias -g '$@{1+"$@@"@}'='"$@@"'
|
|
@end example
|
|
|
|
This workaround is for the benefit of any instances of
|
|
@samp{$@{1+"$@@"@}} in user-written code appearing in
|
|
@command{configure} scripts. However, it is not a complete solution, as
|
|
Zsh recognizes the alias only when a shell word matches it exactly,
|
|
which means older Zsh still mishandles more-complicated cases like
|
|
@samp{"foo"$@{1+"$@@"@}}.
|
|
|
|
@item $@{10@}
|
|
@cindex positional parameters
|
|
The 10th, 11th, @dots{} positional parameters can be accessed only after
|
|
a @code{shift}. The 7th Edition shell reported an error if given
|
|
@code{$@{10@}}, and
|
|
Solaris 10 @command{/bin/sh} still acts that way:
|
|
|
|
@example
|
|
$ @kbd{set 1 2 3 4 5 6 7 8 9 10}
|
|
$ @kbd{echo $@{10@}}
|
|
bad substitution
|
|
@end example
|
|
|
|
Conversely, not all shells obey the POSIX rule that when braces are
|
|
omitted, multiple digits beyond a @samp{$} imply the single-digit
|
|
positional parameter expansion concatenated with the remaining literal
|
|
digits. To work around the issue, you must use braces.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
|
|
a0 a0
|
|
$ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
|
|
j a0
|
|
@end example
|
|
|
|
@item $@{@var{var}-@var{value}@}
|
|
@itemx $@{@var{var}:-@var{value}@}
|
|
@itemx $@{@var{var}=@var{value}@}
|
|
@itemx $@{@var{var}:=@var{value}@}
|
|
@itemx $@{@var{var}?@var{value}@}
|
|
@itemx $@{@var{var}:?@var{value}@}
|
|
@itemx $@{@var{var}+@var{value}@}
|
|
@itemx $@{@var{var}:+@var{value}@}
|
|
@cindex @code{$@{@var{var}-@var{value}@}}
|
|
@cindex @code{$@{@var{var}=@var{value}@}}
|
|
@cindex @code{$@{@var{var}?@var{value}@}}
|
|
@cindex @code{$@{@var{var}+@var{value}@}}
|
|
@c Info cannot handle ':' in index entries.
|
|
@ifnotinfo
|
|
@cindex @code{$@{@var{var}:-@var{value}@}}
|
|
@cindex @code{$@{@var{var}:=@var{value}@}}
|
|
@cindex @code{$@{@var{var}:?@var{value}@}}
|
|
@cindex @code{$@{@var{var}:+@var{value}@}}
|
|
@end ifnotinfo
|
|
When using @samp{$@{@var{var}-@var{value}@}} or
|
|
similar notations that modify a parameter expansion,
|
|
POSIX requires that @var{value} must be a single shell word,
|
|
which can contain quoted strings but cannot contain unquoted spaces.
|
|
If this requirement is not met Solaris 10 @command{/bin/sh}
|
|
sometimes complains, and anyway the behavior is not portable.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'echo $@{a-b c@}'}
|
|
/bin/sh: bad substitution
|
|
$ @kbd{/bin/sh -c 'echo $@{a-'\''b c'\''@}'}
|
|
b c
|
|
$ @kbd{/bin/sh -c 'echo "$@{a-b c@}"'}
|
|
b c
|
|
$ @kbd{/bin/sh -c 'cat <<EOF
|
|
$@{a-b c@}
|
|
EOF}
|
|
b c
|
|
@end example
|
|
|
|
Most shells treat the special parameters @code{*} and @code{@@} as being
|
|
unset if there are no positional parameters. However, some shells treat
|
|
them as being set to the empty string. POSIX does not clearly specify
|
|
either behavior.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'echo "* is $@{*-unset@}."'}
|
|
* is unset.
|
|
$ @kbd{dash -c 'echo "* is $@{*-unset@}."'}
|
|
* is .
|
|
@end example
|
|
|
|
According to POSIX, if an expansion occurs inside double quotes, then
|
|
the use of unquoted double quotes within @var{value} is unspecified, and
|
|
any single quotes become literal characters; in that case, escaping must
|
|
be done with backslash. Likewise, the use of unquoted here-documents is
|
|
a case where double quotes have unspecified results:
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'echo "$@{a-"b c"@}"'}
|
|
/bin/sh: bad substitution
|
|
$ @kbd{ksh -c 'echo "$@{a-"b c"@}"'}
|
|
b c
|
|
$ @kbd{bash -c 'echo "$@{a-"b c"@}"'}
|
|
b c
|
|
$ @kbd{/bin/sh -c 'a=; echo $@{a+'\''b c'\''@}'}
|
|
b c
|
|
$ @kbd{/bin/sh -c 'a=; echo "$@{a+'\''b c'\''@}"'}
|
|
'b c'
|
|
$ @kbd{/bin/sh -c 'a=; echo "$@{a+\"b c\"@}"'}
|
|
"b c"
|
|
$ @kbd{/bin/sh -c 'a=; echo "$@{a+b c@}"'}
|
|
b c
|
|
$ @kbd{/bin/sh -c 'cat <<EOF
|
|
$@{a-"b c"@}
|
|
EOF'}
|
|
"b c"
|
|
$ @kbd{/bin/sh -c 'cat <<EOF
|
|
$@{a-'b c'@}
|
|
EOF'}
|
|
'b c'
|
|
$ @kbd{bash -c 'cat <<EOF
|
|
$@{a-"b c"@}
|
|
EOF'}
|
|
b c
|
|
$ @kbd{bash -c 'cat <<EOF
|
|
$@{a-'b c'@}
|
|
EOF'}
|
|
'b c'
|
|
@end example
|
|
|
|
Perhaps the easiest way to work around quoting issues in a manner
|
|
portable to all shells is to place the results in a temporary variable,
|
|
then use @samp{$t} as the @var{value}, rather than trying to inline
|
|
the expression needing quoting.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
|
|
b c"'@}\
|
|
$ @kbd{ksh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
|
|
b c"'@}\
|
|
$ @kbd{bash -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
|
|
b c"'@}\
|
|
@end example
|
|
|
|
@item $@{@var{var}=@var{value}@}
|
|
@cindex @code{$@{@var{var}=@var{value}@}}
|
|
When using @samp{$@{@var{var}=@var{value}@}} to assign a default value
|
|
to @var{var}, remember that even though the assignment to @var{var} does
|
|
not undergo file name expansion, the result of the variable expansion
|
|
does unless the expansion occurred within double quotes. In particular,
|
|
when using @command{:} followed by unquoted variable expansion for the
|
|
side effect of setting a default value, if the final value of
|
|
@samp{$var} contains any globbing characters (either from @var{value} or
|
|
from prior contents), the shell has to spend time performing file name
|
|
expansion and field splitting even though those results will not be
|
|
used. Therefore, it is a good idea to consider double quotes when performing
|
|
default initialization; while remembering how this impacts any quoting
|
|
characters appearing in @var{value}.
|
|
|
|
@example
|
|
$ @kbd{time bash -c ': "$@{a=/usr/bin/*@}"; echo "$a"'}
|
|
/usr/bin/*
|
|
|
|
real 0m0.005s
|
|
user 0m0.002s
|
|
sys 0m0.003s
|
|
$ @kbd{time bash -c ': $@{a=/usr/bin/*@}; echo "$a"'}
|
|
/usr/bin/*
|
|
|
|
real 0m0.039s
|
|
user 0m0.026s
|
|
sys 0m0.009s
|
|
$ @kbd{time bash -c 'a=/usr/bin/*; : $@{a=noglob@}; echo "$a"'}
|
|
/usr/bin/*
|
|
|
|
real 0m0.031s
|
|
user 0m0.020s
|
|
sys 0m0.010s
|
|
|
|
$ @kbd{time bash -c 'a=/usr/bin/*; : "$@{a=noglob@}"; echo "$a"'}
|
|
/usr/bin/*
|
|
|
|
real 0m0.006s
|
|
user 0m0.002s
|
|
sys 0m0.003s
|
|
@end example
|
|
|
|
As with @samp{+} and @samp{-}, @var{value} must be a single shell word,
|
|
otherwise some shells, such as Solaris 10 @command{/bin/sh} or on Digital
|
|
Unix V 5.0, die because of a ``bad substitution''. Meanwhile, POSIX
|
|
requires that with @samp{=}, quote removal happens prior to the
|
|
assignment, and the expansion be the final contents of @var{var} without
|
|
quoting (and thus subject to field splitting), in contrast to the
|
|
behavior with @samp{-} passing the quoting through to the final
|
|
expansion. However, @command{bash} 4.1 does not obey this rule.
|
|
|
|
@example
|
|
$ @kbd{ksh -c 'echo $@{var-a\ \ b@}'}
|
|
a b
|
|
$ @kbd{ksh -c 'echo $@{var=a\ \ b@}'}
|
|
a b
|
|
$ @kbd{bash -c 'echo $@{var=a\ \ b@}'}
|
|
a b
|
|
@end example
|
|
|
|
Finally, POSIX states that when mixing @samp{$@{a=b@}} with regular
|
|
commands, it is unspecified whether the assignments affect the parent
|
|
shell environment. It is best to perform assignments independently from
|
|
commands, to avoid the problems demonstrated in this example running on
|
|
Solaris 10:
|
|
|
|
@example
|
|
$ @kbd{cmd='x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";printf "%s\\n" -$x-'}
|
|
$ @kbd{bash -c "$cmd"}
|
|
+b+b+
|
|
-b-
|
|
$ @kbd{/bin/sh -c "$cmd"}
|
|
++b+
|
|
--
|
|
$ @kbd{ksh -c "$cmd"}
|
|
+b+b+
|
|
--
|
|
@end example
|
|
|
|
@item $@{@var{var}=@var{value}@}
|
|
@cindex @code{$@{@var{var}=@var{literal}@}}
|
|
Solaris 10 @command{/bin/sh} has a frightening bug in its handling of
|
|
literal assignments. Imagine you need set a variable to a string containing
|
|
@samp{@}}. This @samp{@}} character confuses Solaris 10 @command{/bin/sh}
|
|
when the affected variable was already set. This bug can be exercised
|
|
by running:
|
|
|
|
@example
|
|
$ @kbd{unset foo}
|
|
$ @kbd{foo=$@{foo='@}'@}}
|
|
$ @kbd{echo $foo}
|
|
@}
|
|
$ @kbd{foo=$@{foo='@}' # no error; this hints to what the bug is}
|
|
$ @kbd{echo $foo}
|
|
@}
|
|
$ @kbd{foo=$@{foo='@}'@}}
|
|
$ @kbd{echo $foo}
|
|
@}@}
|
|
^ ugh!
|
|
@end example
|
|
|
|
It seems that @samp{@}} is interpreted as matching @samp{$@{}, even
|
|
though it is enclosed in single quotes. The problem doesn't happen
|
|
using double quotes, or when using a temporary variable holding the
|
|
problematic string.
|
|
|
|
@item $@{@var{var}=@var{expanded-value}@}
|
|
@cindex @code{$@{@var{var}=@var{expanded-value}@}}
|
|
On shells so old that they are no longer relevant, the command
|
|
|
|
@example
|
|
# Set the shell variable to a default value
|
|
# if it is not already set.
|
|
: $@{var="$default"@}
|
|
@end example
|
|
|
|
@noindent
|
|
misbehaved badly in some cases. Older scripts worked around the bugs by
|
|
using one of following two lines, the latter of which was more portable:
|
|
|
|
@example
|
|
var=$@{var="$default"@}
|
|
test $@{var+y@} || var=$default
|
|
@end example
|
|
|
|
@noindent
|
|
However, these workarounds are no longer needed.
|
|
|
|
@item $@{#@var{var}@}
|
|
@itemx $@{@var{var}%@var{word}@}
|
|
@itemx $@{@var{var}%%@var{word}@}
|
|
@itemx $@{@var{var}#@var{word}@}
|
|
@itemx $@{@var{var}##@var{word}@}
|
|
@cindex @code{$@{#@var{var}@}}
|
|
@cindex @code{$@{@var{var}%@var{word}@}}
|
|
@cindex @code{$@{@var{var}%%@var{word}@}}
|
|
@cindex @code{$@{@var{var}#@var{word}@}}
|
|
@cindex @code{$@{@var{var}##@var{word}@}}
|
|
POSIX requires support for these usages, but they do not work with many
|
|
traditional shells, e.g., Solaris 10 @command{/bin/sh}.
|
|
|
|
Also, @command{pdksh} 5.2.14 mishandles some @var{word} forms. For
|
|
example if @samp{$1} is @samp{a/b} and @samp{$2} is @samp{a}, then
|
|
@samp{$@{1#$2@}} should yield @samp{/b}, but with @command{pdksh} it
|
|
yields the empty string.
|
|
|
|
|
|
@item `@var{commands}`
|
|
@cindex @code{`@var{commands}`}
|
|
@cindex Command Substitution
|
|
POSIX requires shells to trim all trailing newlines from command
|
|
output before substituting it, so assignments like
|
|
@samp{dir=`printf '%s\n' "$file" | tr a A`} do not work as expected if
|
|
@samp{$file} ends in a newline.
|
|
|
|
While in general it makes no sense, do not substitute a single builtin
|
|
with side effects, because Ash 0.2, trying to optimize, does not fork a
|
|
subshell to perform the command.
|
|
For instance, if you wanted to check that @command{cd} is silent, do not
|
|
use @samp{test -z "`cd /`"} because the following can happen:
|
|
|
|
@example
|
|
$ @kbd{pwd}
|
|
/tmp
|
|
$ @kbd{test -z "`cd /`" && pwd}
|
|
/
|
|
@end example
|
|
|
|
@noindent
|
|
The result of @samp{foo=`exit 1`} is left as an exercise to the reader.
|
|
|
|
The MSYS shell leaves a stray byte in the expansion of a double-quoted
|
|
command substitution of a native program, if the end of the substitution
|
|
is not aligned with the end of the double quote. This may be worked
|
|
around by inserting another pair of quotes:
|
|
|
|
@example
|
|
$ @kbd{echo "`printf 'foo\r\n'` bar" > broken}
|
|
$ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken}
|
|
- broken differ: char 4, line 1
|
|
@end example
|
|
|
|
Upon interrupt or SIGTERM, some shells may abort a command substitution,
|
|
replace it with a null string, and wrongly evaluate the enclosing
|
|
command before entering the trap or ending the script. This can lead to
|
|
spurious errors:
|
|
|
|
@example
|
|
$ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'}
|
|
$ @kbd{^C}
|
|
sh: test: hi: unexpected operator/operand
|
|
@end example
|
|
|
|
@noindent
|
|
You can avoid this by assigning the command substitution to a temporary
|
|
variable:
|
|
|
|
@example
|
|
$ @kbd{sh -c 'res=`sleep 5; echo hi`
|
|
if test "x$res" = xhi; then echo yes; fi'}
|
|
$ @kbd{^C}
|
|
@end example
|
|
|
|
@item $(@var{commands})
|
|
@cindex @code{$(@var{commands})}
|
|
This construct is meant to replace @samp{`@var{commands}`},
|
|
and it has most of the problems listed under @code{`@var{commands}`}.
|
|
|
|
This construct can be
|
|
nested while this is impossible to do portably with back quotes.
|
|
Although it is almost universally supported, unfortunately Solaris 10
|
|
and earlier releases lack it:
|
|
|
|
@example
|
|
$ @kbd{showrev -c /bin/sh | grep version}
|
|
Command version: SunOS 5.10 Generic 142251-02 Sep 2010
|
|
$ @kbd{echo $(echo blah)}
|
|
syntax error: `(' unexpected
|
|
@end example
|
|
|
|
If you do use @samp{$(@var{commands})}, make sure that the commands
|
|
do not start with a parenthesis, as that would cause confusion with
|
|
a different notation @samp{$((@var{expression}))} that in modern
|
|
shells is an arithmetic expression not a command. To avoid the
|
|
confusion, insert a space between the two opening parentheses.
|
|
|
|
Avoid @var{commands} that contain unbalanced parentheses in
|
|
here-documents, comments, or case statement patterns, as many shells
|
|
mishandle them. For example, Bash 3.1, @samp{ksh88}, @command{pdksh}
|
|
5.2.14, and Zsh 4.2.6 all mishandle the following valid command:
|
|
|
|
@example
|
|
echo $(case x in x) echo hello;; esac)
|
|
@end example
|
|
|
|
|
|
@item $((@var{expression}))
|
|
@cindex @code{$((@var{expression}))}
|
|
Arithmetic expansion is not portable as some shells (most
|
|
notably Solaris 10 @command{/bin/sh}) don't support it.
|
|
|
|
Among shells that do support @samp{$(( ))}, not all of them obey the
|
|
POSIX rule that octal and hexadecimal constants must be recognized:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'echo $(( 010 + 0x10 ))'}
|
|
24
|
|
$ @kbd{zsh -c 'echo $(( 010 + 0x10 ))'}
|
|
26
|
|
$ @kbd{zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'}
|
|
24
|
|
$ @kbd{pdksh -c 'echo $(( 010 + 0x10 ))'}
|
|
pdksh: 010 + 0x10 : bad number `0x10'
|
|
$ @kbd{pdksh -c 'echo $(( 010 ))'}
|
|
10
|
|
@end example
|
|
|
|
When it is available, using arithmetic expansion provides a noticeable
|
|
speedup in script execution; but testing for support requires
|
|
@command{eval} to avoid syntax errors. The following construct is used
|
|
by @code{AS_VAR_ARITH} to provide arithmetic computation when all
|
|
arguments are decimal integers without leading zeros, and all
|
|
operators are properly quoted and appear as distinct arguments:
|
|
|
|
@example
|
|
if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
|
|
eval 'func_arith ()
|
|
@{
|
|
func_arith_result=$(( $* ))
|
|
@}'
|
|
else
|
|
func_arith ()
|
|
@{
|
|
func_arith_result=`expr "$@@"`
|
|
@}
|
|
fi
|
|
func_arith 1 + 1
|
|
foo=$func_arith_result
|
|
@end example
|
|
|
|
|
|
@item ^
|
|
@cindex @code{^} quoting
|
|
Always quote @samp{^}, otherwise traditional shells such as
|
|
@command{/bin/sh} on Solaris 10 treat this like @samp{|}.
|
|
|
|
@end table
|
|
|
|
|
|
@node Assignments
|
|
@section Assignments
|
|
@cindex Shell assignments
|
|
|
|
When setting several variables in a row, be aware that the order of the
|
|
evaluation is undefined. For instance @samp{foo=1 foo=2; echo $foo}
|
|
gives @samp{1} with Solaris 10 @command{/bin/sh}, but @samp{2} with Bash.
|
|
You must use
|
|
@samp{;} to enforce the order: @samp{foo=1; foo=2; echo $foo}.
|
|
|
|
Don't rely on the following to find @file{subdir/program}:
|
|
|
|
@example
|
|
PATH=subdir$PATH_SEPARATOR$PATH program
|
|
@end example
|
|
|
|
@noindent
|
|
as this does not work with Zsh 3.0.6. Use something like this
|
|
instead:
|
|
|
|
@example
|
|
(PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
|
|
@end example
|
|
|
|
Don't rely on the exit status of an assignment: Ash 0.2 does not change
|
|
the status and propagates that of the last statement:
|
|
|
|
@example
|
|
$ @kbd{false || foo=bar; echo $?}
|
|
1
|
|
$ @kbd{false || foo=`:`; echo $?}
|
|
0
|
|
@end example
|
|
|
|
@noindent
|
|
and to make things even worse, QNX 4.25 just sets the exit status
|
|
to 0 in any case:
|
|
|
|
@example
|
|
$ @kbd{foo=`exit 1`; echo $?}
|
|
0
|
|
@end example
|
|
|
|
To assign default values, follow this algorithm:
|
|
|
|
@enumerate
|
|
@item
|
|
If the default value is a literal and does not contain any closing
|
|
brace, use:
|
|
|
|
@example
|
|
: "$@{var='my literal'@}"
|
|
@end example
|
|
|
|
@item
|
|
If the default value contains no closing brace, has to be expanded, and
|
|
the variable being initialized is not intended to be IFS-split
|
|
(i.e., it's not a list), then use:
|
|
|
|
@example
|
|
: $@{var="$default"@}
|
|
@end example
|
|
|
|
@item
|
|
If the default value contains no closing brace, has to be expanded, and
|
|
the variable being initialized is intended to be IFS-split (i.e., it's a list),
|
|
then use:
|
|
|
|
@example
|
|
var=$@{var="$default"@}
|
|
@end example
|
|
|
|
@item
|
|
If the default value contains a closing brace, then use:
|
|
|
|
@example
|
|
test $@{var+y@} || var="has a '@}'"
|
|
@end example
|
|
@end enumerate
|
|
|
|
In most cases @samp{var=$@{var="$default"@}} is fine, but in case of
|
|
doubt, just use the last form. @xref{Shell Substitutions}, items
|
|
@samp{$@{@var{var}:-@var{value}@}} and @samp{$@{@var{var}=@var{value}@}}
|
|
for the rationale.
|
|
|
|
@node Parentheses
|
|
@section Parentheses in Shell Scripts
|
|
@cindex Shell parentheses
|
|
|
|
Beware of two opening parentheses in a row, as many shell
|
|
implementations treat them specially, and POSIX says that a portable
|
|
script cannot use @samp{((} outside the @samp{$((} form used for shell
|
|
arithmetic. In traditional shells, @samp{((cat))} behaves like
|
|
@samp{(cat)}; but many shells, including
|
|
Bash and the Korn shell, treat @samp{((cat))} as an arithmetic
|
|
expression equivalent to @samp{let "cat"}, and may or may not report an
|
|
error when they detect that @samp{cat} is not a number. As another
|
|
example, @samp{pdksh} 5.2.14 does not treat the following code
|
|
as a traditional shell would:
|
|
|
|
@example
|
|
if ((true) || false); then
|
|
echo ok
|
|
fi
|
|
@end example
|
|
|
|
@noindent
|
|
To work around this problem, insert a space between the two opening
|
|
parentheses. There is a similar problem and workaround with
|
|
@samp{$((}; see @ref{Shell Substitutions}.
|
|
|
|
@node Special Shell Variables
|
|
@section Special Shell Variables
|
|
@cindex Shell variables
|
|
@cindex Special shell variables
|
|
|
|
Some shell variables should not be used, since they can have a deep
|
|
influence on the behavior of the shell. In order to recover a sane
|
|
behavior from the shell, some variables should be unset; M4sh takes
|
|
care of this and provides fallback values, whenever needed, to cater
|
|
for a very old @file{/bin/sh} that does not support @command{unset}.
|
|
(@pxref{Portable Shell, , Portable Shell Programming}).
|
|
|
|
As a general rule, shell variable names containing a lower-case letter
|
|
are safe; you can define and use these variables without worrying about
|
|
their effect on the underlying system, and without worrying about
|
|
whether the shell changes them unexpectedly. (The exception is the
|
|
shell variable @code{status}, as described below.)
|
|
|
|
Here is a list of names that are known to cause trouble. This list is
|
|
not exhaustive, but you should be safe if you avoid the name
|
|
@code{status} and names containing only upper-case letters and
|
|
underscores.
|
|
|
|
@c Alphabetical order, case insensitive, 'A' before 'a'.
|
|
@table @code
|
|
@item ?
|
|
Not all shells correctly reset @samp{$?} after conditionals (@pxref{if,
|
|
, Limitations of Shell Builtins}). Not all shells manage @samp{$?}
|
|
correctly in shell functions (@pxref{Shell Functions}) or in traps
|
|
(@pxref{trap, , Limitations of Shell Builtins}). Not all shells reset
|
|
@samp{$?} to zero after an empty command.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'false; $empty; echo $?'}
|
|
0
|
|
$ @kbd{zsh -c 'false; $empty; echo $?'}
|
|
1
|
|
@end example
|
|
|
|
@item _
|
|
@evindex _
|
|
Many shells reserve @samp{$_} for various purposes, e.g., the name of
|
|
the last command executed.
|
|
|
|
@item CDPATH
|
|
@evindex CDPATH
|
|
When this variable is set it specifies a list of directories to search
|
|
when invoking @code{cd} with a relative file name that did not start
|
|
with @samp{./} or @samp{../}. POSIX
|
|
1003.1-2001 says that if a nonempty directory name from @env{CDPATH}
|
|
is used successfully, @code{cd} prints the resulting absolute
|
|
file name. Unfortunately this output can break idioms like
|
|
@samp{abs=`cd src && pwd`} because @code{abs} receives the name twice.
|
|
Also, many shells do not conform to this part of POSIX; for
|
|
example, @command{zsh} prints the result only if a directory name
|
|
other than @file{.} was chosen from @env{CDPATH}.
|
|
|
|
In practice the shells that have this problem also support
|
|
@command{unset}, so you can work around the problem as follows:
|
|
|
|
@example
|
|
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
|
@end example
|
|
|
|
You can also avoid output by ensuring that your directory name is
|
|
absolute or anchored at @samp{./}, as in @samp{abs=`cd ./src && pwd`}.
|
|
|
|
Configure scripts use M4sh, which automatically unsets @env{CDPATH} if
|
|
possible, so you need not worry about this problem in those scripts.
|
|
|
|
@item CLICOLOR_FORCE
|
|
@evindex CLICOLOR_FORCE
|
|
When this variable is set, some implementations of tools like
|
|
@command{ls} attempt to add color to their output via terminal escape
|
|
sequences, even when the output is not directed to a terminal, and can
|
|
thus cause spurious failures in scripts. Configure scripts use M4sh,
|
|
which automatically unsets this variable.
|
|
|
|
@item DUALCASE
|
|
@evindex DUALCASE
|
|
In the MKS shell, case statements and file name generation are
|
|
case-insensitive unless @env{DUALCASE} is nonzero.
|
|
Autoconf-generated scripts export this variable when they start up.
|
|
|
|
@item ENV
|
|
@itemx MAIL
|
|
@itemx MAILPATH
|
|
@itemx PS1
|
|
@itemx PS2
|
|
@itemx PS4
|
|
@evindex ENV
|
|
@evindex MAIL
|
|
@evindex MAILPATH
|
|
@evindex PS1
|
|
@evindex PS2
|
|
@evindex PS4
|
|
These variables should not matter for shell scripts, since they are
|
|
supposed to affect only interactive shells. However, at least one
|
|
shell (the pre-3.0 UWIN Korn shell) gets confused about
|
|
whether it is interactive, which means that (for example) a @env{PS1}
|
|
with a side effect can unexpectedly modify @samp{$?}. To work around
|
|
this bug, M4sh scripts (including @file{configure} scripts) do something
|
|
like this:
|
|
|
|
@example
|
|
(unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
|
|
PS1='$ '
|
|
PS2='> '
|
|
PS4='+ '
|
|
@end example
|
|
|
|
@noindent
|
|
(actually, there is some complication due to bugs in @command{unset};
|
|
@pxref{unset, , Limitations of Shell Builtins}).
|
|
|
|
@item FPATH
|
|
@evindex FPATH
|
|
The Korn shell uses @env{FPATH} to find shell functions, so avoid
|
|
@env{FPATH} in portable scripts. @env{FPATH} is consulted after
|
|
@env{PATH}, but you still need to be wary of tests that use @env{PATH}
|
|
to find whether a command exists, since they might report the wrong
|
|
result if @env{FPATH} is also set.
|
|
|
|
@item GREP_OPTIONS
|
|
@evindex GREP_OPTIONS
|
|
When this variable is set, some implementations of @command{grep} honor
|
|
these options, even if the options include direction to enable colored
|
|
output via terminal escape sequences, and the result can cause spurious
|
|
failures when the output is not directed to a terminal. Configure
|
|
scripts use M4sh, which automatically unsets this variable.
|
|
|
|
@item IFS
|
|
@evindex IFS
|
|
Long ago, shell scripts inherited @env{IFS} from the environment,
|
|
but this caused many problems so modern shells ignore any environment
|
|
settings for @env{IFS}.
|
|
|
|
Don't set the first character of @env{IFS} to backslash. Indeed,
|
|
Bourne shells use the first character (backslash) when joining the
|
|
components in @samp{"$@@"} and some shells then reinterpret (!)@: the
|
|
backslash escapes, so you can end up with backspace and other strange
|
|
characters.
|
|
|
|
The proper value for @env{IFS} (in regular code, not when performing
|
|
splits) is @samp{@key{SPC}@key{TAB}@key{RET}}. The first character is
|
|
especially important, as it is used to join the arguments in @samp{$*};
|
|
however, note that traditional shells, but also bash-2.04, fail to adhere
|
|
to this and join with a space anyway.
|
|
|
|
M4sh guarantees that @env{IFS} will have the default value at the
|
|
beginning of a script, and many macros within autoconf rely on this
|
|
setting. It is okay to use blocks of shell code that temporarily change
|
|
the value of @env{IFS} in order to split on another character, but
|
|
remember to restore it before expanding further macros.
|
|
|
|
Unsetting @code{IFS} instead of resetting it to the default sequence
|
|
is not suggested, since code that tries to save and restore the
|
|
variable's value will incorrectly reset it to an empty value, thus
|
|
disabling field splitting:
|
|
|
|
@example
|
|
unset IFS
|
|
# default separators used for field splitting
|
|
|
|
save_IFS=$IFS
|
|
IFS=:
|
|
# ...
|
|
IFS=$save_IFS
|
|
# no field splitting performed
|
|
@end example
|
|
|
|
@item LANG
|
|
@itemx LC_ALL
|
|
@itemx LC_COLLATE
|
|
@itemx LC_CTYPE
|
|
@itemx LC_MESSAGES
|
|
@itemx LC_MONETARY
|
|
@itemx LC_NUMERIC
|
|
@itemx LC_TIME
|
|
@evindex LANG
|
|
@evindex LC_ALL
|
|
@evindex LC_COLLATE
|
|
@evindex LC_CTYPE
|
|
@evindex LC_MESSAGES
|
|
@evindex LC_MONETARY
|
|
@evindex LC_NUMERIC
|
|
@evindex LC_TIME
|
|
|
|
You should set all these variables to @samp{C} because so much
|
|
configuration code assumes the C locale and POSIX requires that locale
|
|
environment variables be set to @samp{C} if the C locale is desired;
|
|
@file{configure} scripts and M4sh do that for you.
|
|
Export these variables after setting them.
|
|
|
|
@item LANGUAGE
|
|
@evindex LANGUAGE
|
|
|
|
@env{LANGUAGE} is not specified by POSIX, but it is a GNU
|
|
extension that overrides @env{LC_ALL} in some cases, so you (or M4sh)
|
|
should set it too.
|
|
|
|
@item LC_ADDRESS
|
|
@itemx LC_IDENTIFICATION
|
|
@itemx LC_MEASUREMENT
|
|
@itemx LC_NAME
|
|
@itemx LC_PAPER
|
|
@itemx LC_TELEPHONE
|
|
@evindex LC_ADDRESS
|
|
@evindex LC_IDENTIFICATION
|
|
@evindex LC_MEASUREMENT
|
|
@evindex LC_NAME
|
|
@evindex LC_PAPER
|
|
@evindex LC_TELEPHONE
|
|
|
|
These locale environment variables are GNU extensions. They
|
|
are treated like their POSIX brethren (@env{LC_COLLATE},
|
|
etc.)@: as described above.
|
|
|
|
@item LINENO
|
|
@evindex LINENO
|
|
Most modern shells provide the current line number in @code{LINENO}.
|
|
Its value is the line number of the beginning of the current command.
|
|
M4sh, and hence Autoconf, attempts to execute @command{configure} with
|
|
a shell that supports @code{LINENO}. If no such shell is available, it
|
|
attempts to implement @code{LINENO} with a Sed prepass that replaces each
|
|
instance of the string @code{$LINENO} (not followed by an alphanumeric
|
|
character) with the line's number. In M4sh scripts you should execute
|
|
@code{AS_LINENO_PREPARE} so that these workarounds are included in
|
|
your script; configure scripts do this automatically in @code{AC_INIT}.
|
|
|
|
You should not rely on @code{LINENO} within @command{eval} or shell
|
|
functions, as the behavior differs in practice. The presence of a
|
|
quoted newline within simple commands can alter which line number is
|
|
used as the starting point for @code{$LINENO} substitutions within that
|
|
command. Also, the possibility of the Sed prepass means that you should
|
|
not rely on @code{$LINENO} when quoted, when in here-documents, or when
|
|
line continuations are used. Subshells should be OK, though. In the
|
|
following example, lines 1, 9, and 14 are portable, but the other
|
|
instances of @code{$LINENO} do not have deterministic values:
|
|
|
|
@example
|
|
@group
|
|
$ @kbd{cat lineno}
|
|
echo 1. $LINENO
|
|
echo "2. $LINENO
|
|
3. $LINENO"
|
|
cat <<EOF
|
|
5. $LINENO
|
|
6. $LINENO
|
|
7. \$LINENO
|
|
EOF
|
|
( echo 9. $LINENO )
|
|
eval 'echo 10. $LINENO'
|
|
eval 'echo 11. $LINENO
|
|
echo 12. $LINENO'
|
|
echo 13. '$LINENO'
|
|
echo 14. $LINENO '
|
|
15.' $LINENO
|
|
f () @{ echo $1 $LINENO;
|
|
echo $1 $LINENO @}
|
|
f 18.
|
|
echo 19. \
|
|
$LINENO
|
|
@end group
|
|
@group
|
|
$ @kbd{bash-3.2 ./lineno}
|
|
1. 1
|
|
2. 3
|
|
3. 3
|
|
5. 4
|
|
6. 4
|
|
7. $LINENO
|
|
9. 9
|
|
10. 10
|
|
11. 12
|
|
12. 13
|
|
13. $LINENO
|
|
14. 14
|
|
15. 14
|
|
18. 16
|
|
18. 17
|
|
19. 19
|
|
@end group
|
|
@group
|
|
$ @kbd{zsh-4.3.4 ./lineno}
|
|
1. 1
|
|
2. 2
|
|
3. 2
|
|
5. 4
|
|
6. 4
|
|
7. $LINENO
|
|
9. 9
|
|
10. 1
|
|
11. 1
|
|
12. 2
|
|
13. $LINENO
|
|
14. 14
|
|
15. 14
|
|
18. 0
|
|
18. 1
|
|
19. 19
|
|
@end group
|
|
@group
|
|
$ @kbd{pdksh-5.2.14 ./lineno}
|
|
1. 1
|
|
2. 2
|
|
3. 2
|
|
5. 4
|
|
6. 4
|
|
7. $LINENO
|
|
9. 9
|
|
10. 0
|
|
11. 0
|
|
12. 0
|
|
13. $LINENO
|
|
14. 14
|
|
15. 14
|
|
18. 16
|
|
18. 17
|
|
19. 19
|
|
@end group
|
|
@group
|
|
$ @kbd{sed '=' <lineno |}
|
|
> @kbd{ sed '}
|
|
> @kbd{ N}
|
|
> @kbd{ s,$,-,}
|
|
> @kbd{ t loop}
|
|
> @kbd{ :loop}
|
|
> @kbd{ s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,}
|
|
> @kbd{ t loop}
|
|
> @kbd{ s,-$,,}
|
|
> @kbd{ s,^[0-9]*\n,,}
|
|
> @kbd{ ' |}
|
|
> @kbd{ sh}
|
|
1. 1
|
|
2. 2
|
|
3. 3
|
|
5. 5
|
|
6. 6
|
|
7. \7
|
|
9. 9
|
|
10. 10
|
|
11. 11
|
|
12. 12
|
|
13. 13
|
|
14. 14
|
|
15. 15
|
|
18. 16
|
|
18. 17
|
|
19. 20
|
|
@end group
|
|
@end example
|
|
|
|
In particular, note that @file{config.status} (and any other subsidiary
|
|
script created by @code{AS_INIT_GENERATED}) might report line numbers
|
|
relative to the parent script as a result of the potential Sed pass.
|
|
|
|
@item NULLCMD
|
|
@evindex NULLCMD
|
|
When executing the command @samp{>foo}, @command{zsh} executes
|
|
@samp{$NULLCMD >foo} unless it is operating in Bourne shell
|
|
compatibility mode and the @command{zsh} version is newer
|
|
than 3.1.6-dev-18. If you are using an older @command{zsh}
|
|
and forget to set @env{NULLCMD},
|
|
your script might be suspended waiting for data on its standard input.
|
|
|
|
@item options
|
|
@evindex options
|
|
For @command{zsh} 4.3.10, @env{options} is treated as an associative
|
|
array even after @code{emulate sh}, so it should not be used.
|
|
|
|
@item PATH_SEPARATOR
|
|
@evindex PATH_SEPARATOR
|
|
On DJGPP systems, the @env{PATH_SEPARATOR} environment
|
|
variable can be set to either @samp{:} or @samp{;} to control the path
|
|
separator Bash uses to set up certain environment variables (such as
|
|
@env{PATH}). You can set this variable to @samp{;} if you want
|
|
@command{configure} to use @samp{;} as a separator; this might be useful
|
|
if you plan to use non-POSIX shells to execute files. @xref{File System
|
|
Conventions}, for more information about @code{PATH_SEPARATOR}.
|
|
|
|
@item POSIXLY_CORRECT
|
|
@evindex POSIXLY_CORRECT
|
|
In the GNU environment, exporting @env{POSIXLY_CORRECT} with any value
|
|
(even empty) causes programs to try harder to conform to POSIX.
|
|
Autoconf does not directly manipulate this variable, but @command{bash}
|
|
ties the shell variable @env{POSIXLY_CORRECT} to whether the script is
|
|
running in POSIX mode. Therefore, take care when exporting or unsetting
|
|
this variable, so as not to change whether @command{bash} is in POSIX
|
|
mode.
|
|
|
|
@example
|
|
$ @kbd{bash --posix -c 'set -o | grep posix}
|
|
> @kbd{unset POSIXLY_CORRECT}
|
|
> @kbd{set -o | grep posix'}
|
|
posix on
|
|
posix off
|
|
@end example
|
|
|
|
@item PWD
|
|
@evindex PWD
|
|
POSIX 1003.1-2001 requires that @command{cd} and
|
|
@command{pwd} must update the @env{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 @env{PWD} but a subsidiary and different shell does not know
|
|
about @env{PWD} and executes @command{cd}; in this case @env{PWD}
|
|
points to the wrong directory. Use @samp{`pwd`} rather than
|
|
@samp{$PWD}.
|
|
|
|
@item RANDOM
|
|
@evindex RANDOM
|
|
Many shells provide @code{RANDOM}, a variable that returns a different
|
|
integer each time it is used. It is common
|
|
practice to use @code{$RANDOM} as part of a file name, but code
|
|
shouldn't rely on @code{$RANDOM} expanding to a nonempty string.
|
|
|
|
@item status
|
|
@evindex status
|
|
This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6),
|
|
hence read-only. Do not use it.
|
|
@end table
|
|
|
|
@node Shell Functions
|
|
@section Shell Functions
|
|
@cindex Shell Functions
|
|
|
|
Nowadays, it is difficult to find a shell that does not support
|
|
shell functions at all. However, some differences should be expected.
|
|
|
|
When declaring a shell function, you must include whitespace between the
|
|
@samp{)} after the function name and the start of the compound
|
|
expression, to avoid upsetting @command{ksh}. While it is possible to
|
|
use any compound command, most scripts use @samp{@{@dots{}@}}.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'a()@{ echo hi;@}; a'}
|
|
hi
|
|
$ @kbd{ksh -c 'a()@{ echo hi;@}; a'}
|
|
ksh: syntax error at line 1: `@}' unexpected
|
|
$ @kbd{ksh -c 'a() @{ echo hi;@}; a'}
|
|
hi
|
|
@end example
|
|
|
|
Inside a shell function, you should not rely on the error status of a
|
|
subshell if the last command of that subshell was @code{exit} or
|
|
@code{trap}, as this triggers bugs in zsh 4.x; while Autoconf tries to
|
|
find a shell that does not exhibit the bug, zsh might be the only shell
|
|
present on the user's machine.
|
|
|
|
Likewise, the state of @samp{$?} is not reliable when entering a shell
|
|
function. This has the effect that using a function as the first
|
|
command in a @command{trap} handler can cause problems.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
|
|
2
|
|
2
|
|
$ @kbd{ash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
|
|
0
|
|
2
|
|
@end example
|
|
|
|
DJGPP bash 2.04 has a bug in that @command{return} from a
|
|
shell function which also used a command substitution causes a
|
|
segmentation fault. To work around the issue, you can use
|
|
@command{return} from a subshell, or @samp{AS_SET_STATUS} as last command
|
|
in the execution flow of the function (@pxref{Common Shell Constructs}).
|
|
|
|
Not all shells treat shell functions as simple commands impacted by
|
|
@samp{set -e}, for example with Solaris 10 @command{/bin/sh}:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'f() @{ return 1; @}; set -e; f; echo oops'}
|
|
$ @kbd{/bin/sh -c 'f() @{ return 1; @}; set -e; f; echo oops'}
|
|
oops
|
|
@end example
|
|
|
|
Shell variables and functions may share the same namespace, for example
|
|
with Solaris 10 @command{/bin/sh}:
|
|
|
|
@example
|
|
$ @kbd{f () @{ :; @}; f=; f}
|
|
f: not found
|
|
@end example
|
|
|
|
@noindent
|
|
For this reason, Autoconf (actually M4sh, @pxref{Programming in M4sh})
|
|
uses the prefix @samp{as_fn_} for its functions.
|
|
|
|
Handling of positional parameters and shell options varies among shells.
|
|
For example, Korn shells reset and restore trace output (@samp{set -x})
|
|
and other options upon function entry and exit.
|
|
|
|
It is not portable to pass temporary environment variables to shell
|
|
functions. Solaris 10 @command{/bin/sh} does not see the variable.
|
|
Meanwhile, not all shells follow the POSIX rule that the assignment must
|
|
affect the current environment in the same manner as special built-ins.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
|
|
@result{}
|
|
@result{}
|
|
$ @kbd{ash -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
|
|
@result{}1
|
|
@result{}
|
|
$ @kbd{bash -c 'set -o posix; func() @{ echo $a;@}; a=1 func; echo $a'}
|
|
@result{}1
|
|
@result{}1
|
|
@end example
|
|
|
|
Some ancient Bourne shell variants with function support did not reset
|
|
@samp{$@var{i}, @var{i} >= 0}, upon function exit, so effectively the
|
|
arguments of the script were lost after the first function invocation.
|
|
It is probably not worth worrying about these shells any more.
|
|
|
|
With AIX sh, a @command{trap} on 0 installed in a shell function
|
|
triggers at function exit rather than at script exit. @xref{trap, ,
|
|
Limitations of Shell Builtins}.
|
|
|
|
@node Limitations of Builtins
|
|
@section Limitations of Shell Builtins
|
|
@cindex Shell builtins
|
|
@cindex Limitations of shell builtins
|
|
|
|
No, no, we are serious: some shells do have limitations! :)
|
|
|
|
You should always keep in mind that any builtin or command may support
|
|
options, and therefore differ in behavior with arguments
|
|
starting with a dash. For instance, even the innocent @samp{echo "$word"}
|
|
can give unexpected results when @code{word} starts with a dash. To avoid
|
|
this problem, use @samp{printf '%s\n' "$word"}. Many of these limitations
|
|
can be worked around using M4sh (@pxref{Programming in M4sh}).
|
|
|
|
@c This table includes things like '@command{test} (files)', so we can't
|
|
@c use @table @command.
|
|
@table @asis
|
|
@item @command{.}
|
|
@c --------------
|
|
@prindex @command{.}
|
|
Use @command{.} only with regular files (use @samp{test -f}). Bash
|
|
2.03, for instance, chokes on @samp{. /dev/null}. Remember that
|
|
@command{.} uses @env{PATH} if its argument contains no slashes. Also,
|
|
some shells, including bash 3.2, implicitly append the current directory
|
|
to this @env{PATH} search, even though POSIX forbids it. So if you want
|
|
to use @command{.} on a file @file{foo} in the current directory, you
|
|
must use @samp{. ./foo}.
|
|
|
|
Not all shells gracefully handle syntax errors within a sourced file.
|
|
On one extreme, some non-interactive shells abort the entire script. On
|
|
the other, @command{zsh} 4.3.10 has a bug where it fails to react to the
|
|
syntax error.
|
|
|
|
@example
|
|
$ @kbd{echo 'fi' > syntax}
|
|
$ @kbd{bash -c '. ./syntax; echo $?'}
|
|
./syntax: line 1: syntax error near unexpected token `fi'
|
|
./syntax: line 1: `fi'
|
|
2
|
|
$ @kbd{ash -c '. ./syntax; echo $?'}
|
|
./syntax: 1: Syntax error: "fi" unexpected
|
|
$ @kbd{zsh -c '. ./syntax; echo $?'}
|
|
./syntax:1: parse error near `fi'
|
|
0
|
|
@end example
|
|
|
|
@anchor{!}
|
|
@item @command{!}
|
|
@c --------------
|
|
@prindex @command{!}
|
|
The Unix version 7 shell did not support
|
|
negating the exit status of commands with @command{!}, and this feature
|
|
is still absent from some shells (e.g., Solaris 10 @command{/bin/sh}).
|
|
Other shells, such as FreeBSD @command{/bin/sh} or @command{ash}, have
|
|
bugs when using @command{!}:
|
|
|
|
@example
|
|
$ @kbd{sh -c '! : | :'; echo $?}
|
|
1
|
|
$ @kbd{ash -c '! : | :'; echo $?}
|
|
0
|
|
$ @kbd{sh -c '! @{ :; @}'; echo $?}
|
|
1
|
|
$ @kbd{ash -c '! @{ :; @}'; echo $?}
|
|
@{: not found
|
|
Syntax error: "@}" unexpected
|
|
2
|
|
@end example
|
|
|
|
Shell code like this:
|
|
|
|
@example
|
|
if ! cmp file1 file2 >/dev/null 2>&1; then
|
|
echo files differ or trouble
|
|
fi
|
|
@end example
|
|
|
|
is therefore not portable in practice. Typically it is easy to rewrite
|
|
such code, e.g.:
|
|
|
|
@example
|
|
cmp file1 file2 >/dev/null 2>&1 ||
|
|
echo files differ or trouble
|
|
@end example
|
|
|
|
In M4sh, the @code{AS_IF} macro provides an easy way to write these kinds
|
|
of conditionals:
|
|
|
|
@example
|
|
AS_IF([cmp -s file file.new], [],
|
|
[echo files differ or trouble])
|
|
@end example
|
|
|
|
This kind of rewriting is needed in code outside macro definitions that
|
|
calls other macros. @xref{Common Shell Constructs}. It is also useful
|
|
inside macro definitions, where the @dfn{then} and @dfn{else} branches
|
|
might contain macro arguments.
|
|
|
|
More generally, one can always rewrite @samp{! @var{command}} as:
|
|
|
|
@example
|
|
AS_IF([@var{command}], [(exit 1)])
|
|
@end example
|
|
|
|
@item @command{&&} and @command{||}
|
|
@c --------------------------------
|
|
@prindex @command{&&}
|
|
@prindex @command{||}
|
|
If an AND-OR list is not inside @code{AC_DEFUN}, and it contains
|
|
calls to Autoconf macros, it should be rewritten using @code{AS_IF}.
|
|
@xref{Common Shell Constructs}. The operators @code{&&} and @code{||}
|
|
have equal precedence and are left associative, so instead of:
|
|
|
|
@example
|
|
# This is dangerous outside AC_DEFUN.
|
|
cmp a b >/dev/null 2>&1 &&
|
|
AS_ECHO([files are same]) >$tmpfile ||
|
|
AC_MSG_NOTICE([files differ, or echo failed])
|
|
@end example
|
|
|
|
you can use:
|
|
|
|
@example
|
|
# This is OK outside AC_DEFUN.
|
|
AS_IF([AS_IF([cmp a b >/dev/null 2>&1],
|
|
[AS_ECHO([files are same]) >$tmpfile],
|
|
[false])],
|
|
[AC_MSG_NOTICE([files differ, or echo failed])])
|
|
@end example
|
|
|
|
@item @command{@{...@}}
|
|
@c --------------------
|
|
@prindex @command{@{...@}}
|
|
Bash 3.2 (and earlier versions) sometimes does not properly set
|
|
@samp{$?} when failing to write redirected output of a compound command.
|
|
This problem is most commonly observed with @samp{@{@dots{}@}}; it does
|
|
not occur with @samp{(@dots{})}. For example:
|
|
|
|
@example
|
|
$ @kbd{bash -c '@{ echo foo; @} >/bad; echo $?'}
|
|
bash: line 1: /bad: Permission denied
|
|
0
|
|
$ @kbd{bash -c 'while :; do echo; done >/bad; echo $?'}
|
|
bash: line 1: /bad: Permission denied
|
|
0
|
|
@end example
|
|
|
|
To work around the bug, prepend @samp{:;}:
|
|
|
|
@example
|
|
$ @kbd{bash -c ':;@{ echo foo; @} >/bad; echo $?'}
|
|
bash: line 1: /bad: Permission denied
|
|
1
|
|
@end example
|
|
|
|
POSIX requires a syntax error if a brace list has no contents. However,
|
|
not all shells obey this rule; and on shells where empty lists are
|
|
permitted, the effect on @samp{$?} is inconsistent. To avoid problems,
|
|
ensure that a brace list is never empty.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'false; @{ @}; echo $?' || echo $?}
|
|
bash: line 1: syntax error near unexpected token `@}'
|
|
bash: line 1: `false; @{ @}; echo $?'
|
|
2
|
|
$ @kbd{zsh -c 'false; @{ @}; echo $?' || echo $?}
|
|
1
|
|
$ @kbd{pdksh -c 'false; @{ @}; echo $?' || echo $?}
|
|
0
|
|
@end example
|
|
|
|
|
|
@item @command{break}
|
|
@c ------------------
|
|
@prindex @command{break}
|
|
The use of @samp{break 2} etc.@: is safe.
|
|
|
|
|
|
@anchor{case}
|
|
@item @command{case}
|
|
@c -----------------
|
|
@prindex @command{case}
|
|
If a @code{case} command is not inside @code{AC_DEFUN}, and it contains
|
|
calls to Autoconf macros, it should be rewritten using @code{AS_CASE}.
|
|
@xref{Common Shell Constructs}. Instead of:
|
|
|
|
@example
|
|
# This is dangerous outside AC_DEFUN.
|
|
case $filename in
|
|
*.[ch]) AC_MSG_NOTICE([C source file]);;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
use:
|
|
|
|
@example
|
|
# This is OK outside AC_DEFUN.
|
|
AS_CASE([$filename],
|
|
[[*.[ch]]], [AC_MSG_NOTICE([C source file])])
|
|
@end example
|
|
|
|
You don't need to quote the argument; no splitting is performed.
|
|
|
|
You don't need the final @samp{;;}, but you should use it.
|
|
|
|
POSIX requires support for @code{case} patterns with opening
|
|
parentheses like this:
|
|
|
|
@example
|
|
case $file_name in
|
|
(*.c) echo "C source code";;
|
|
esac
|
|
@end example
|
|
|
|
@noindent
|
|
but the @code{(} in this example is not portable to a few obsolescent Bourne
|
|
shell implementations, which is a pity for those of us using tools that
|
|
rely on balanced parentheses. For instance, with Solaris 10
|
|
@command{/bin/sh}:
|
|
|
|
@example
|
|
$ @kbd{case foo in (foo) echo foo;; esac}
|
|
@error{}syntax error: `(' unexpected
|
|
@end example
|
|
|
|
@noindent
|
|
The leading @samp{(} can be omitted safely. Unfortunately, there are
|
|
contexts where unbalanced parentheses cause other problems, such as when
|
|
using a syntax-highlighting editor that searches for the balancing
|
|
counterpart, or more importantly, when using a case statement as an
|
|
underquoted argument to an Autoconf macro. @xref{Balancing
|
|
Parentheses}, for trade-offs involved in various styles of dealing with
|
|
unbalanced @samp{)}.
|
|
|
|
Zsh handles pattern fragments derived from parameter expansions or
|
|
command substitutions as though quoted:
|
|
|
|
@example
|
|
$ pat=\?; case aa in ?$pat) echo match;; esac
|
|
$ pat=\?; case a? in ?$pat) echo match;; esac
|
|
match
|
|
@end example
|
|
|
|
@noindent
|
|
Because of a bug in its @code{fnmatch}, Bash fails to properly
|
|
handle backslashes in character classes:
|
|
|
|
@example
|
|
bash-2.02$ @kbd{case /tmp in [/\\]*) echo OK;; esac}
|
|
bash-2.02$
|
|
@end example
|
|
|
|
@noindent
|
|
This is extremely unfortunate, since you are likely to use this code to
|
|
handle POSIX or MS-DOS absolute file names. To work around this
|
|
bug, always put the backslash first:
|
|
|
|
@example
|
|
bash-2.02$ @kbd{case '\TMP' in [\\/]*) echo OK;; esac}
|
|
OK
|
|
bash-2.02$ @kbd{case /tmp in [\\/]*) echo OK;; esac}
|
|
OK
|
|
@end example
|
|
|
|
Many Bourne shells cannot handle closing brackets in character classes
|
|
correctly.
|
|
|
|
Some shells also have problems with backslash escaping in case you do not want
|
|
to match the backslash: both a backslash and the escaped character match this
|
|
pattern. To work around this, specify the character class in a variable, so
|
|
that quote removal does not apply afterwards, and the special characters don't
|
|
have to be backslash-escaped:
|
|
|
|
@example
|
|
$ @kbd{case '\' in [\<]) echo OK;; esac}
|
|
OK
|
|
$ @kbd{scanset='[<]'; case '\' in $scanset) echo OK;; esac}
|
|
$
|
|
@end example
|
|
|
|
Even with this, Solaris @command{ksh} matches a backslash if the set
|
|
contains any
|
|
of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}.
|
|
|
|
Some shells, such as Ash 0.3.8, are confused by an empty
|
|
@code{case}/@code{esac}:
|
|
|
|
@example
|
|
ash-0.3.8 $ @kbd{case foo in esac;}
|
|
@error{}Syntax error: ";" unexpected (expecting ")")
|
|
@end example
|
|
|
|
POSIX requires @command{case} to give an exit status of 0 if no cases
|
|
match. However, @command{/bin/sh} in Solaris 10 does not obey this
|
|
rule. Meanwhile, it is unclear whether a case that matches, but
|
|
contains no statements, must also change the exit status to 0. The M4sh
|
|
macro @code{AS_CASE} works around these inconsistencies.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'case `false` in ?) ;; esac; echo $?'}
|
|
0
|
|
$ @kbd{/bin/sh -c 'case `false` in ?) ;; esac; echo $?'}
|
|
255
|
|
@end example
|
|
|
|
|
|
@item @command{cd}
|
|
@c ---------------
|
|
@prindex @command{cd}
|
|
POSIX 1003.1-2001 requires that @command{cd} must support
|
|
the @option{-L} (``logical'') and @option{-P} (``physical'') options,
|
|
with @option{-L} being the default. However, traditional shells do
|
|
not support these options, and their @command{cd} command has the
|
|
@option{-P} behavior.
|
|
|
|
Portable scripts should assume neither option is supported, and should
|
|
assume neither behavior is the default. This can be a bit tricky,
|
|
since the POSIX default behavior means that, for example,
|
|
@samp{ls ..} and @samp{cd ..} may refer to different directories if
|
|
the current logical directory is a symbolic link. It is safe to use
|
|
@code{cd @var{dir}} if @var{dir} contains no @file{..} components.
|
|
Also, Autoconf-generated scripts check for this problem when computing
|
|
variables like @code{ac_top_srcdir} (@pxref{Configuration Actions}),
|
|
so it is safe to @command{cd} to these variables.
|
|
|
|
POSIX states that behavior is undefined if @command{cd} is given an
|
|
explicit empty argument. Some shells do nothing, some change to the
|
|
first entry in @env{CDPATH}, some change to @env{HOME}, and some exit
|
|
the shell rather than returning an error. Unfortunately, this means
|
|
that if @samp{$var} is empty, then @samp{cd "$var"} is less predictable
|
|
than @samp{cd $var} (at least the latter is well-behaved in all shells
|
|
at changing to @env{HOME}, although this is probably not what you wanted
|
|
in a script). You should check that a directory name was supplied
|
|
before trying to change locations.
|
|
|
|
@xref{Special Shell Variables}, for portability problems involving
|
|
@command{cd} and the @env{CDPATH} environment variable.
|
|
Also please see the discussion of the @command{pwd} command.
|
|
|
|
|
|
@anchor{echo}
|
|
@item @command{echo}
|
|
@c -----------------
|
|
@prindex @command{echo}
|
|
The simple @command{echo} is probably the most surprising source of
|
|
portability troubles. It is not possible to use @samp{echo} portably
|
|
unless both options and escape sequences are omitted.
|
|
|
|
Do not use options, as some shells support them and others do not.
|
|
For example, POSIX says that the behavior of @samp{echo -n foo} is
|
|
implementation-defined. On some platforms the output is @samp{foo}
|
|
without a trailing newline, on others it is @samp{-n foo} with a
|
|
trailing newline, and POSIX allows even other behavior.
|
|
|
|
Do not use backslashes in the arguments, as there is no consensus on
|
|
their handling. For @samp{echo '\n' | wc -l}, the @command{sh} of
|
|
Solaris 10 outputs 2,
|
|
but Bash and Zsh (in @command{sh} emulation mode) output 1.
|
|
The problem is truly @command{echo}: all the shells
|
|
understand @samp{'\n'} as the string composed of a backslash and an
|
|
@samp{n}.
|
|
|
|
Because of these problems, do not pass a string containing arbitrary
|
|
characters to @command{echo}. For example, @samp{echo "$foo"} is safe
|
|
only if you know that @var{foo}'s value cannot contain backslashes and
|
|
cannot start with @samp{-}.
|
|
|
|
Normally, @command{printf} is safer and easier to use than @command{echo}
|
|
and @command{echo -n}. Thus, you should use @command{printf '%s\n'}
|
|
instead of @command{echo}, and similarly use @command{printf %s} instead
|
|
of @command{echo -n}.
|
|
|
|
Older scripts, written before @command{printf} was portable,
|
|
sometimes used a here-document as a safer alternative to @command{echo},
|
|
like this:
|
|
|
|
@example
|
|
cat <<EOF
|
|
$foo
|
|
EOF
|
|
@end example
|
|
|
|
@noindent
|
|
However, this usage is problematic, as even some modern shells have
|
|
hard-to-reproduce bugs when dealing with here-documents.
|
|
|
|
|
|
@item @command{eval}
|
|
@c -----------------
|
|
@prindex @command{eval}
|
|
The @command{eval} command is useful in limited circumstances, e.g.,
|
|
using commands like @samp{eval table_$key=\$value} and @samp{eval
|
|
value=table_$key} to simulate a hash table when the key is known to be
|
|
alphanumeric.
|
|
|
|
You should also be wary of common bugs in @command{eval} implementations.
|
|
In some shell implementations (e.g., older @command{ash}, OpenBSD 3.8
|
|
@command{sh}, @command{pdksh} v5.2.14 99/07/13.2, and @command{zsh}
|
|
4.2.5), the arguments of @samp{eval} are evaluated in a context where
|
|
@samp{$?} is 0, so they exhibit behavior like this:
|
|
|
|
@example
|
|
$ @kbd{false; eval 'echo $?'}
|
|
0
|
|
@end example
|
|
|
|
The correct behavior here is to output a nonzero value,
|
|
but portable scripts should not rely on this.
|
|
|
|
You should not rely on @code{LINENO} within @command{eval}.
|
|
@xref{Special Shell Variables}.
|
|
|
|
Note that, even though these bugs are easily avoided,
|
|
@command{eval} is tricky to use on arbitrary arguments.
|
|
It is obviously unwise to use @samp{eval $cmd} if the string value of
|
|
@samp{cmd} was derived from an untrustworthy source. But even if the
|
|
string value is valid, @samp{eval $cmd} might not work as intended,
|
|
since it causes field splitting and file name expansion to occur twice,
|
|
once for the @command{eval} and once for the command itself. It is
|
|
therefore safer to use @samp{eval "$cmd"}. For example, if @var{cmd}
|
|
has the value @samp{cat test?.c}, @samp{eval $cmd} might expand to the
|
|
equivalent of @samp{cat test;.c} if there happens to be a file named
|
|
@file{test;.c} in the current directory; and this in turn
|
|
mistakenly attempts to invoke @command{cat} on the file @file{test} and
|
|
then execute the command @command{.c}. To avoid this problem, use
|
|
@samp{eval "$cmd"} rather than @samp{eval $cmd}.
|
|
|
|
However, suppose that you want to output the text of the evaluated
|
|
command just before executing it. Assuming the previous example,
|
|
@samp{printf '%s\n' "Executing: $cmd"} outputs @samp{Executing: cat test?.c},
|
|
but this output doesn't show the user that @samp{test;.c} is the actual
|
|
name of the copied file.
|
|
Conversely, @samp{printf 'Executing:'; eval "printf ' %s' $cmd"; printf '\n'}
|
|
works on this example, but it fails with @samp{cmd='cat foo >bar'},
|
|
since it mistakenly replaces the contents of @file{bar} by the
|
|
string @samp{ cat foo}. No simple, general, and portable solution to
|
|
this problem is known.
|
|
|
|
@item @command{exec}
|
|
@c -----------------
|
|
@prindex @command{exec}
|
|
POSIX describes several categories of shell built-ins. Special
|
|
built-ins (such as @command{exit}) must impact the environment of the
|
|
current shell, and need not be available through @command{exec}. All
|
|
other built-ins are regular, and must not propagate variable assignments
|
|
to the environment of the current shell. However, the group of regular
|
|
built-ins is further distinguished by commands that do not require a
|
|
@env{PATH} search (such as @command{cd}), in contrast to built-ins that
|
|
are offered as a more efficient version of something that must still be
|
|
found in a @env{PATH} search (such as @command{echo}). POSIX is not
|
|
clear on whether @command{exec} must work with the list of 17 utilities
|
|
that are invoked without a @env{PATH} search, and many platforms lack an
|
|
executable for some of those built-ins:
|
|
|
|
@example
|
|
$ @kbd{sh -c 'exec cd /tmp'}
|
|
sh: line 0: exec: cd: not found
|
|
@end example
|
|
|
|
All other built-ins that provide utilities specified by POSIX must have
|
|
a counterpart executable that exists on @env{PATH}, although POSIX
|
|
allows @command{exec} to use the built-in instead of the executable.
|
|
For example, contrast @command{bash} 3.2 and @command{pdksh} 5.2.14:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'pwd --version' | head -n1}
|
|
bash: line 0: pwd: --: invalid option
|
|
pwd: usage: pwd [-LP]
|
|
$ @kbd{bash -c 'exec pwd --version' | head -n1}
|
|
pwd (GNU coreutils) 6.10
|
|
$ @kbd{pdksh -c 'exec pwd --version' | head -n1}
|
|
pdksh: pwd: --: unknown option
|
|
@end example
|
|
|
|
When it is desired to avoid a regular shell built-in, the workaround is
|
|
to use some other forwarding command, such as @command{env} or
|
|
@command{nice}, that will ensure a path search:
|
|
|
|
@example
|
|
$ @kbd{pdksh -c 'exec true --version' | head -n1}
|
|
$ @kbd{pdksh -c 'nice true --version' | head -n1}
|
|
true (GNU coreutils) 6.10
|
|
$ @kbd{pdksh -c 'env true --version' | head -n1}
|
|
true (GNU coreutils) 6.10
|
|
@end example
|
|
|
|
@item @command{exit}
|
|
@c -----------------
|
|
@prindex @command{exit}
|
|
The default value of @command{exit} is supposed to be @code{$?};
|
|
unfortunately, some shells, such as the DJGPP port of Bash 2.04, just
|
|
perform @samp{exit 0}.
|
|
|
|
@example
|
|
bash-2.04$ @kbd{foo=`exit 1` || echo fail}
|
|
fail
|
|
bash-2.04$ @kbd{foo=`(exit 1)` || echo fail}
|
|
fail
|
|
bash-2.04$ @kbd{foo=`(exit 1); exit` || echo fail}
|
|
bash-2.04$
|
|
@end example
|
|
|
|
Using @samp{exit $?} restores the expected behavior.
|
|
|
|
Some shell scripts, such as those generated by @command{autoconf}, use a
|
|
trap to clean up before exiting. If the last shell command exited with
|
|
nonzero status, the trap also exits with nonzero status so that the
|
|
invoker can tell that an error occurred.
|
|
|
|
Unfortunately, in some shells, such as Solaris 10 @command{/bin/sh}, an exit
|
|
trap ignores the @code{exit} command's argument. In these shells, a trap
|
|
cannot determine whether it was invoked by plain @code{exit} or by
|
|
@code{exit 1}. Instead of calling @code{exit} directly, use the
|
|
@code{AC_MSG_ERROR} macro that has a workaround for this problem.
|
|
|
|
|
|
@anchor{export}
|
|
@item @command{export}
|
|
@c -------------------
|
|
@prindex @command{export}
|
|
The builtin @command{export} dubs a shell variable @dfn{environment
|
|
variable}. Each update of exported variables corresponds to an update
|
|
of the environment variables. Conversely, each environment variable
|
|
received by the shell when it is launched should be imported as a shell
|
|
variable marked as exported.
|
|
|
|
Alas, some older shells, such as Solaris 10 @command{/bin/sh}, forget to
|
|
@command{export} the environment variables they receive. As a result,
|
|
two variables coexist: the environment variable and the shell
|
|
variable. The following code demonstrates this failure:
|
|
|
|
@example
|
|
#!/bin/sh
|
|
echo $FOO
|
|
FOO=bar
|
|
echo $FOO
|
|
exec /bin/sh $0
|
|
@end example
|
|
|
|
@noindent
|
|
when run with @samp{FOO=foo} in the environment, these shells print
|
|
alternately @samp{foo} and @samp{bar}, although they should print only
|
|
@samp{foo} and then a sequence of @samp{bar}s.
|
|
|
|
Therefore you should @command{export} again each environment variable
|
|
that you update; the export can occur before or after the assignment.
|
|
|
|
POSIX is not clear on whether the @command{export} of an undefined
|
|
variable causes the variable to be defined with the value of an empty
|
|
string, or merely marks any future definition of a variable by that name
|
|
for export. Various shells behave differently in this regard:
|
|
|
|
@example
|
|
$ @kbd{sh -c 'export foo; env | grep foo'}
|
|
$ @kbd{ash -c 'export foo; env | grep foo'}
|
|
foo=
|
|
@end example
|
|
|
|
POSIX requires @command{export} to honor assignments made as arguments,
|
|
but older shells do not support this, including @command{/bin/sh} in
|
|
Solaris 10. Portable scripts should separate assignments and exports
|
|
into different statements.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'export foo=bar; echo $foo'}
|
|
bar
|
|
$ @kbd{/bin/sh -c 'export foo=bar; echo $foo'}
|
|
/bin/sh: foo=bar: is not an identifier
|
|
$ @kbd{/bin/sh -c 'export foo; foo=bar; echo $foo'}
|
|
bar
|
|
@end example
|
|
|
|
POSIX requires @command{export} to work with any arbitrary value for the
|
|
contents of the variable being exported, as long as the total size of
|
|
the environment combined with arguments doesn't exceed @code{ARG_MAX}
|
|
when executing a child process. However, some shells have extensions
|
|
that involve interpreting some environment values specially, regardless
|
|
of the variable name. We currently know of one case: all versions of
|
|
Bash released prior to 27 September 2014 interpret an environment
|
|
variable with an initial content substring of @code{() @{} as an
|
|
exported function definition (this is the ``Shellshock'' remote
|
|
execution bug, CVE-2014-6271 and friends, where it was possible to
|
|
exploit the function parser to cause remote code execution on child bash
|
|
startup; newer versions of Bash use special environment variable
|
|
@emph{names} instead of values to implement the same feature).
|
|
|
|
There may be entries inherited into the environment that are not valid
|
|
as shell variable names; POSIX states that processes should be tolerant
|
|
of these names. Some shells such as @command{dash} do this by removing
|
|
those names from the environment at startup, while others such as
|
|
@command{bash} hide the entry from shell access but still pass it on to
|
|
child processes. While you can set such names using @command{env} for a
|
|
direct child process, you cannot rely on them being preserved through an
|
|
intermediate pass through the shell.
|
|
|
|
@item @command{false}
|
|
@c ------------------
|
|
@prindex @command{false}
|
|
Don't expect @command{false} to exit with status 1: in native
|
|
Solaris @file{/bin/false} exits with status 255.
|
|
|
|
|
|
@item @command{for}
|
|
@c ----------------
|
|
@prindex @command{for}
|
|
To loop over positional arguments, use:
|
|
|
|
@example
|
|
for arg
|
|
do
|
|
printf '%s\n' "$arg"
|
|
done
|
|
@end example
|
|
|
|
@noindent
|
|
You may @emph{not} leave the @code{do} on the same line as @code{for},
|
|
since some shells improperly grok:
|
|
|
|
@example
|
|
for arg; do
|
|
printf '%s\n' "$arg"
|
|
done
|
|
@end example
|
|
|
|
If you want to explicitly refer to the positional arguments, use:
|
|
|
|
@example
|
|
for arg in "$@@"; do
|
|
printf '%s\n' "$arg"
|
|
done
|
|
@end example
|
|
|
|
POSIX requires support for a @command{for} loop with no list after
|
|
@code{in}. However, Solaris 10 @command{/bin/sh} treats that as a syntax
|
|
error. It is possible to work around this by providing any shell word
|
|
that expands to nothing, or by ignoring an obvious sentinel.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'for a in $empty; do echo hi; done'}
|
|
$ @kbd{/bin/sh -c 'for a in ; do echo hi; done'}
|
|
/bin/sh: syntax error at line 1: `;' unexpected
|
|
@end example
|
|
|
|
This syntax problem is most frequently encountered in code that goes
|
|
through several layers of expansion, such as an m4 macro or makefile
|
|
variable used as a list body, where the first layer of expansion (m4 or
|
|
make) can end up expanding to nothing in the version handed to the
|
|
shell. In the makefile context, one common workaround is to use a shell
|
|
variable rather than a make variable as the source of the list.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
list =
|
|
bad:
|
|
@@for arg in $(list); do \
|
|
printf '%s\n' $$arg; \
|
|
done
|
|
good:
|
|
@@list='$(list)'; \
|
|
for arg in $$list; do \
|
|
printf '%s\n' $$arg; \
|
|
done
|
|
$ @kbd{make bad 2&>1 | head -n1}
|
|
sh: syntax error at line 1: `;' unexpected
|
|
$ @kbd{make bad list='a b'}
|
|
a
|
|
b
|
|
$ @kbd{make good}
|
|
$ @kbd{make good list='a b'}
|
|
a
|
|
b
|
|
@end example
|
|
|
|
In Solaris 10 @command{/bin/sh}, when the list of arguments of a
|
|
@command{for} loop starts with @emph{unquoted} tokens looking like
|
|
variable assignments, the loop is not executed on those tokens:
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'}
|
|
x
|
|
e=f
|
|
@end example
|
|
|
|
@noindent
|
|
Thankfully, quoting the assignment-like tokens, or starting the list
|
|
with other tokens (including unquoted variable expansion that results in
|
|
an assignment-like result), avoids the problem, so it is easy to work
|
|
around:
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'for v in "a=b"; do echo $v; done'}
|
|
a=b
|
|
$ @kbd{/bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'}
|
|
a=b
|
|
c=d
|
|
@end example
|
|
|
|
@anchor{if}
|
|
@item @command{if}
|
|
@c ---------------
|
|
@prindex @command{if}
|
|
If an @code{if} command is not inside @code{AC_DEFUN}, and it contains
|
|
calls to Autoconf macros, it should be rewritten using @code{AS_IF}.
|
|
@xref{Common Shell Constructs}.
|
|
|
|
Using @code{if ! @dots{}} is not portable. @xref{!,,@command{!} notes}.
|
|
|
|
Some very old shells did not reset the exit status from an @command{if}
|
|
with no @command{else}:
|
|
|
|
@example
|
|
$ @kbd{if (exit 42); then true; fi; echo $?}
|
|
42
|
|
@end example
|
|
|
|
@noindent
|
|
whereas a proper shell should have printed @samp{0}. Although this is no
|
|
longer a portability problem, as any shell that supports functions gets it
|
|
correct, it explains why some makefiles have lengthy
|
|
constructs:
|
|
|
|
@example
|
|
if test -f "$file"; then
|
|
install "$file" "$dest"
|
|
else
|
|
:
|
|
fi
|
|
@end example
|
|
|
|
|
|
@item @command{printf}
|
|
@c ------------------
|
|
@prindex @command{printf}
|
|
A format string starting with a @samp{-} can cause problems.
|
|
Bash interprets it as an option and
|
|
gives an error. And @samp{--} to mark the end of options is not good
|
|
in the NetBSD Almquist shell (e.g., 0.4.6) which takes that
|
|
literally as the format string. Putting the @samp{-} in a @samp{%c}
|
|
or @samp{%s} is probably easiest:
|
|
|
|
@example
|
|
printf %s -foo
|
|
@end example
|
|
|
|
AIX 7.2 @command{sh} mishandles octal escapes in multi-byte locales by
|
|
treating them as characters instead of bytes. For example, in a locale
|
|
using the UTF-8 encoding, @samp{printf '\351'} outputs the two bytes C3,
|
|
A9 (the UTF-8 encoding for U+00E9) instead of the desired single byte E9.
|
|
To work around the bug, use the C locale.
|
|
|
|
Bash 2.03 mishandles an escape sequence that happens to evaluate to @samp{%}:
|
|
|
|
@example
|
|
$ @kbd{printf '\045'}
|
|
bash: printf: `%': missing format character
|
|
@end example
|
|
|
|
Large outputs may cause trouble. On Solaris 10, for
|
|
example, @file{/usr/bin/printf} is buggy, so when using
|
|
@command{/bin/sh} the command @samp{printf %010000x 123} normally dumps
|
|
core.
|
|
|
|
Since @command{printf} is not always a shell builtin, there is a
|
|
potential speed penalty for using @code{printf '%s\n'} as a replacement
|
|
for an @command{echo} that does not interpret @samp{\} or leading
|
|
@samp{-}. With Solaris @command{ksh}, it is possible to use @code{print
|
|
-r --} for this role instead.
|
|
|
|
@xref{echo, , Limitations of Shell Builtins}, for a discussion of
|
|
portable alternatives to both @command{printf} and @command{echo}.
|
|
|
|
|
|
@item @command{pwd}
|
|
@c ----------------
|
|
@prindex @command{pwd}
|
|
With modern shells, plain @command{pwd} outputs a ``logical''
|
|
directory name, some of whose components may be symbolic links. These
|
|
directory names are in contrast to ``physical'' directory names, whose
|
|
components are all directories.
|
|
|
|
POSIX 1003.1-2001 requires that @command{pwd} must support
|
|
the @option{-L} (``logical'') and @option{-P} (``physical'') options,
|
|
with @option{-L} being the default. However, traditional shells do
|
|
not support these options, and their @command{pwd} command has the
|
|
@option{-P} behavior.
|
|
|
|
Portable scripts should assume neither option is supported, and should
|
|
assume neither behavior is the default. Also, on many hosts
|
|
@samp{/bin/pwd} is equivalent to @samp{pwd -P}, but POSIX
|
|
does not require this behavior and portable scripts should not rely on
|
|
it.
|
|
|
|
Typically it's best to use plain @command{pwd}. On modern hosts this
|
|
outputs logical directory names, which have the following advantages:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Logical names are what the user specified.
|
|
@item
|
|
Physical names may not be portable from one installation
|
|
host to another due to network file system gymnastics.
|
|
@item
|
|
On modern hosts @samp{pwd -P} may fail due to lack of permissions to
|
|
some parent directory, but plain @command{pwd} cannot fail for this
|
|
reason.
|
|
@end itemize
|
|
|
|
Also please see the discussion of the @command{cd} command.
|
|
|
|
|
|
@item @command{read}
|
|
@c -----------------
|
|
@prindex @command{read}
|
|
No options are portable, not even support @option{-r} (Solaris 10
|
|
@command{/bin/sh} for example).
|
|
|
|
|
|
@anchor{set}
|
|
@item @command{set}
|
|
@c ----------------
|
|
@prindex @command{set}
|
|
With the FreeBSD 6.0 shell, the @command{set} command (without
|
|
any options) does not sort its output.
|
|
|
|
The @command{set} builtin faces the usual problem with arguments
|
|
starting with a
|
|
dash. Modern shells such as Bash or Zsh understand @option{--} to specify
|
|
the end of the options (any argument after @option{--} is a parameter,
|
|
even @samp{-x} for instance), but many traditional shells (e.g., Solaris
|
|
10 @command{/bin/sh}) simply stop option
|
|
processing as soon as a non-option argument is found. Therefore, use
|
|
@samp{dummy} or simply @samp{x} to end the option processing, and use
|
|
@command{shift} to pop it out:
|
|
|
|
@example
|
|
set x $my_list; shift
|
|
@end example
|
|
|
|
Avoid @samp{set -}, e.g., @samp{set - $my_list}. POSIX no
|
|
longer requires support for this command, and in traditional shells
|
|
@samp{set - $my_list} resets the @option{-v} and @option{-x} options, which
|
|
makes scripts harder to debug.
|
|
|
|
Some nonstandard shells do not recognize more than one option
|
|
(e.g., @samp{set -e -x} assigns @samp{-x} to the command line). It is
|
|
better to combine them:
|
|
|
|
@example
|
|
set -ex
|
|
@end example
|
|
|
|
@cindex @command{set -e}
|
|
The @option{-e} option has historically been under-specified, with enough
|
|
ambiguities to cause numerous differences across various shell
|
|
implementations; see for example
|
|
@uref{https://www.in-ulm.de/@/~mascheck/@/various/@/set-e/, this overview},
|
|
or @uref{https://www.austingroupbugs.net/@/view.php?id=52, this link},
|
|
documenting a change to POSIX 2008 to match @command{ksh88} behavior.
|
|
Note that mixing @code{set -e} and shell functions is asking for surprises:
|
|
|
|
@example
|
|
set -e
|
|
doit()
|
|
@{
|
|
rm file
|
|
echo one
|
|
@}
|
|
doit || echo two
|
|
@end example
|
|
|
|
@noindent
|
|
According to the recommendation, @samp{one} should always be output
|
|
regardless of whether the @command{rm} failed, because it occurs within
|
|
the body of the shell function @samp{doit} invoked on the left side of
|
|
@samp{||}, where the effects of @samp{set -e} are not enforced.
|
|
Likewise, @samp{two} should never be printed, since the failure of
|
|
@command{rm} does not abort the function, such that the status of
|
|
@samp{doit} is 0.
|
|
|
|
The BSD shell has had several problems with the @option{-e}
|
|
option. Older versions of the BSD
|
|
shell (circa 1990) mishandled @samp{&&}, @samp{||}, @samp{if}, and
|
|
@samp{case} when @option{-e} was in effect, causing the shell to exit
|
|
unexpectedly in some cases. This was particularly a problem with
|
|
makefiles, and led to circumlocutions like @samp{sh -c 'test -f file ||
|
|
touch file'}, where the seemingly-unnecessary @samp{sh -c '@dots{}'}
|
|
wrapper works around the bug (@pxref{Failure in Make Rules}).
|
|
|
|
Even relatively-recent versions of the BSD shell (e.g., OpenBSD 3.4)
|
|
wrongly exit with @option{-e} if the last command within a compound
|
|
statement fails and is guarded by an @samp{&&} only. For example:
|
|
|
|
@example
|
|
#! /bin/sh
|
|
set -e
|
|
foo=''
|
|
test -n "$foo" && exit 1
|
|
echo one
|
|
if :; then
|
|
test -n "$foo" && exit 1
|
|
echo two
|
|
test -n "$foo" && exit 1
|
|
fi
|
|
echo three
|
|
@end example
|
|
|
|
@noindent
|
|
does not print @samp{three}. One workaround is to change the last
|
|
instance of @samp{test -n "$foo" && exit 1} to be @samp{if test -n
|
|
"$foo"; then exit 1; fi} instead. Another possibility is to warn BSD
|
|
users not to use @samp{sh -e}.
|
|
|
|
When @samp{set -e} is in effect, a failed command substitution in
|
|
Solaris 10 @command{/bin/sh} cannot be ignored, even with @samp{||}.
|
|
|
|
@example
|
|
$ @kbd{/bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'}
|
|
$ @kbd{bash -c 'set -e; foo=`false` || echo foo; echo bar'}
|
|
foo
|
|
bar
|
|
@end example
|
|
|
|
@noindent
|
|
Moreover, a command substitution, successful or not, causes this shell to
|
|
exit from a failing outer command even in presence of an @samp{&&} list:
|
|
|
|
@example
|
|
$ @kbd{bash -c 'set -e; false `true` && echo notreached; echo ok'}
|
|
ok
|
|
$ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'}
|
|
$
|
|
@end example
|
|
|
|
@cindex @command{set -b}
|
|
@cindex @command{set -m}
|
|
Job control is not provided by all shells, so the use of @samp{set -m}
|
|
or @samp{set -b} must be done with care. When using @command{zsh} in
|
|
native mode, asynchronous notification (@samp{set -b}) is enabled by
|
|
default, and using @samp{emulate sh} to switch to POSIX mode does not
|
|
clear this setting (although asynchronous notification has no impact
|
|
unless job monitoring is also enabled). Also, @command{zsh} 4.3.10 and
|
|
earlier have a bug where job control can be manipulated in interactive
|
|
shells, but not in subshells or scripts. Furthermore, some shells, like
|
|
@command{pdksh}, fail to treat subshells as interactive, even though the
|
|
parent shell was.
|
|
|
|
@example
|
|
$ @kbd{echo $ZSH_VERSION}
|
|
4.3.10
|
|
$ @kbd{set -m; echo $?}
|
|
0
|
|
$ @kbd{zsh -c 'set -m; echo $?'}
|
|
set: can't change option: -m
|
|
$ @kbd{(set -m); echo $?}
|
|
set: can't change option: -m
|
|
1
|
|
$ @kbd{pdksh -ci 'echo $-; (echo $-)'}
|
|
cim
|
|
c
|
|
@end example
|
|
|
|
@cindex @command{set -n}
|
|
Use of @command{set -n} (typically via @command{sh -n script}) to
|
|
validate a script is not foolproof. Modern @command{ksh93} tries to be
|
|
helpful by informing you about better syntax, but switching the script
|
|
to use the suggested syntax in order to silence the warnings would
|
|
render the script no longer portable to older shells:
|
|
|
|
@example
|
|
$ @kbd{ksh -nc '``'}
|
|
ksh: warning: line 1: `...` obsolete, use $(...)
|
|
0
|
|
@end example
|
|
|
|
Autoconf
|
|
itself uses @command{sh -n} within its testsuite to check that correct
|
|
scripts were generated, but only after first probing for other shell
|
|
features (such as @code{test $@{BASH_VERSION+y@}}) that indicate
|
|
a reasonably fast and working implementation.
|
|
|
|
@item @command{shift}
|
|
@c ------------------
|
|
@prindex @command{shift}
|
|
Not only is @command{shift}ing a bad idea when there is nothing left to
|
|
shift, but in addition it is not portable: the shell of MIPS
|
|
RISC/OS 4.52 refuses to do it.
|
|
|
|
Don't use @samp{shift 2} etc.; while it in the SVR1 shell (1983),
|
|
it is also absent in many pre-POSIX shells.
|
|
|
|
|
|
@item @command{source}
|
|
@c -------------------
|
|
@prindex @command{source}
|
|
This command is not portable, as POSIX does not require it; use
|
|
@command{.} instead.
|
|
|
|
|
|
@item @command{test}
|
|
@c -----------------
|
|
@prindex @command{test}
|
|
The @code{test} program is the way to perform many file and string
|
|
tests. It is often invoked by the alternate name @samp{[}, but using
|
|
that name in Autoconf code is asking for trouble since it is an M4 quote
|
|
character.
|
|
|
|
The @option{-a}, @option{-o}, @samp{(}, and @samp{)} operands are not
|
|
present in all implementations, and have been marked obsolete by POSIX
|
|
2008. This is because there are inherent ambiguities in using them.
|
|
For example, @samp{test "$1" -a "$2"} looks like a binary operator to
|
|
check whether two strings are both non-empty, but if @samp{$1} is the
|
|
literal @samp{!}, then some implementations of @command{test} treat it
|
|
as a negation of the unary operator @option{-a}.
|
|
|
|
Thus, portable uses of @command{test} should never have more than four
|
|
arguments, and scripts should use shell constructs like @samp{&&} and
|
|
@samp{||} instead. If you combine @samp{&&} and @samp{||} in the same
|
|
statement, keep in mind that they have equal precedence, so it is often
|
|
better to parenthesize even when this is redundant. For example:
|
|
|
|
@smallexample
|
|
# Not portable:
|
|
test "X$a" = "X$b" -a \
|
|
'(' "X$c" != "X$d" -o "X$e" = "X$f" ')'
|
|
|
|
# Portable:
|
|
test "X$a" = "X$b" &&
|
|
@{ test "X$c" != "X$d" || test "X$e" = "X$f"; @}
|
|
@end smallexample
|
|
|
|
@command{test} does not process options like most other commands do; for
|
|
example, it does not recognize the @option{--} argument as marking the
|
|
end of options.
|
|
|
|
It is safe to use @samp{!} as a @command{test} operator. For example,
|
|
@samp{if test ! -d foo; @dots{}} is portable even though @samp{if ! test
|
|
-d foo; @dots{}} is not.
|
|
|
|
|
|
@item @command{test} (files)
|
|
@c -------------------------
|
|
To enable @command{configure} scripts to support cross-compilation, they
|
|
shouldn't do anything that tests features of the build system instead of
|
|
the host system. But occasionally you may find it necessary to check
|
|
whether some arbitrary file exists. To do so, use @samp{test -f},
|
|
@samp{test -r}, or @samp{test -x}. Do not use @samp{test -e}, because
|
|
Solaris 10 @command{/bin/sh}
|
|
lacks it. To test for symbolic links on systems that have them, use
|
|
@samp{test -h} rather than @samp{test -L}; either form conforms to
|
|
POSIX 1003.1-2001, but @option{-h} has been around longer.
|
|
|
|
For historical reasons, POSIX reluctantly allows implementations of
|
|
@samp{test -x} that will succeed for the root user, even if no execute
|
|
permissions are present. Furthermore, shells do not all agree on
|
|
whether Access Control Lists should affect @samp{test -r}, @samp{test
|
|
-w}, and @samp{test -x}; some shells base test results strictly on the
|
|
current user id compared to file owner and mode, as if by
|
|
@code{stat(2)}; while other shells base test results on whether the
|
|
current user has the given right, even if that right is only granted by
|
|
an ACL, as if by @code{faccessat(2)}. Furthermore, there is a classic
|
|
time of check to time of use race between any use of @command{test}
|
|
followed by operating on the just-checked file. Therefore, it is a good
|
|
idea to write scripts that actually attempt an operation, and are
|
|
prepared for the resulting failure if permission is denied, rather than
|
|
trying to avoid an operation based solely on whether @command{test}
|
|
guessed that it might not be permitted.
|
|
|
|
@item @command{test} (strings)
|
|
@c ---------------------------
|
|
POSIX says that @samp{test "@var{string}"} succeeds if @var{string} is
|
|
not null, but this usage is not portable to traditional platforms like
|
|
Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and
|
|
@samp{-n}. However, it @emph{is} portable to test if a variable is set
|
|
to a non-empty value, by using @samp{test $@{var+y@}}, since all known
|
|
implementations properly distinguish between no arguments and a
|
|
known-safe string of @samp{y}.
|
|
|
|
POSIX also says that @samp{test ! "@var{string}"},
|
|
@samp{test -n "@var{string}"} and
|
|
@samp{test -z "@var{string}"} work with any string, but many
|
|
shells (such as Solaris 10, AIX 3.2, UNICOS 10.0.0.6,
|
|
Digital Unix 4, etc.)@: get confused if
|
|
@var{string} looks like an operator:
|
|
|
|
@example
|
|
$ @kbd{test -n =}
|
|
test: argument expected
|
|
$ @kbd{test ! -n}
|
|
test: argument expected
|
|
$ @kbd{test -z ")"; echo $?}
|
|
0
|
|
@end example
|
|
|
|
Similarly, POSIX says that both @samp{test "@var{string1}" = "@var{string2"}}
|
|
and @samp{test "@var{string1}" != "@var{string2"}} work for any pairs of
|
|
strings, but in practice this is not true for troublesome strings that
|
|
look like operators or parentheses, or that begin with @samp{-}.
|
|
|
|
It is best to protect such strings with a leading @samp{X}, e.g.,
|
|
@samp{test "X@var{string}" != X} rather than @samp{test -n
|
|
"@var{string}"} or @samp{test ! "@var{string}"}.
|
|
|
|
It is common to find variations of the following idiom:
|
|
|
|
@example
|
|
test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
|
|
@var{action}
|
|
@end example
|
|
|
|
@noindent
|
|
to take an action when a token matches a given pattern. Such constructs
|
|
should be avoided by using:
|
|
|
|
@example
|
|
AS_CASE([$ac_feature],
|
|
[[*[!-a-zA-Z0-9_]*]], [@var{action}])
|
|
@end example
|
|
|
|
If the pattern is a complicated regular expression that cannot be
|
|
expressed as a shell pattern, use something like this instead:
|
|
|
|
@example
|
|
expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
|
|
@var{action}
|
|
@end example
|
|
|
|
@samp{expr "X@var{foo}" : "X@var{bar}"} is more robust than @samp{echo
|
|
"X@var{foo}" | grep "^X@var{bar}"}, because it avoids problems when
|
|
@samp{@var{foo}} contains backslashes.
|
|
|
|
|
|
@anchor{trap}
|
|
@item @command{trap}
|
|
@c -----------------
|
|
@prindex @command{trap}
|
|
It is safe to trap at least the signals 1, 2, 13, and 15. You can also
|
|
trap 0, i.e., have the @command{trap} run when the script ends (either via an
|
|
explicit @command{exit}, or the end of the script). The trap for 0 should be
|
|
installed outside of a shell function, or AIX 5.3 @command{/bin/sh}
|
|
will invoke the trap at the end of this function.
|
|
|
|
POSIX says that @samp{trap - 1 2 13 15} resets the traps for the
|
|
specified signals to their default values, but many common shells (e.g.,
|
|
Solaris 10 @command{/bin/sh}) misinterpret this and attempt to execute a
|
|
``command'' named @command{-} when the specified conditions arise.
|
|
POSIX 2008 also added a requirement to support @samp{trap 1 2 13 15} to
|
|
reset traps, as this is supported by a larger set of shells, but there
|
|
are still shells like @command{dash} that mistakenly try to execute
|
|
@command{1} instead of resetting the traps. Therefore, there is no
|
|
portable workaround, except for @samp{trap - 0}, for which
|
|
@samp{trap '' 0} is a portable substitute.
|
|
|
|
Although POSIX is not absolutely clear on this point, it is widely
|
|
admitted that when entering the trap @samp{$?} should be set to the exit
|
|
status of the last command run before the trap. The ambiguity can be
|
|
summarized as: ``when the trap is launched by an @command{exit}, what is
|
|
the @emph{last} command run: that before @command{exit}, or
|
|
@command{exit} itself?''
|
|
|
|
Bash considers @command{exit} to be the last command, while Zsh and
|
|
Solaris 10 @command{/bin/sh} consider that when the trap is run it is
|
|
@emph{still} in the @command{exit}, hence it is the previous exit status
|
|
that the trap receives:
|
|
|
|
@example
|
|
$ @kbd{cat trap.sh}
|
|
trap 'echo $?' 0
|
|
(exit 42); exit 0
|
|
$ @kbd{zsh trap.sh}
|
|
42
|
|
$ @kbd{bash trap.sh}
|
|
0
|
|
@end example
|
|
|
|
The portable solution is then simple: when you want to @samp{exit 42},
|
|
run @samp{(exit 42); exit 42}, the first @command{exit} being used to
|
|
set the exit status to 42 for Zsh, and the second to trigger the trap
|
|
and pass 42 as exit status for Bash. In M4sh, this is covered by using
|
|
@code{AS_EXIT}.
|
|
|
|
The shell in FreeBSD 4.0 has the following bug: @samp{$?} is
|
|
reset to 0 by empty lines if the code is inside @command{trap}.
|
|
|
|
@example
|
|
$ @kbd{trap 'false}
|
|
|
|
echo $?' 0
|
|
$ @kbd{exit}
|
|
0
|
|
@end example
|
|
|
|
@noindent
|
|
Fortunately, this bug only affects @command{trap}.
|
|
|
|
Several shells fail to execute an exit trap that is defined inside a
|
|
subshell, when the last command of that subshell is not a builtin. A
|
|
workaround is to use @samp{exit $?} as the shell builtin.
|
|
|
|
@example
|
|
$ @kbd{bash -c '(trap "echo hi" 0; /bin/true)'}
|
|
hi
|
|
$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true)'}
|
|
$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'}
|
|
hi
|
|
@end example
|
|
|
|
@noindent
|
|
Likewise, older implementations of @command{bash} failed to preserve
|
|
@samp{$?} across an exit trap consisting of a single cleanup command.
|
|
|
|
@example
|
|
$ @kbd{bash -c 'trap "/bin/true" 0; exit 2'; echo $?}
|
|
2
|
|
$ @kbd{bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?}
|
|
0
|
|
$ @kbd{bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?}
|
|
2
|
|
@end example
|
|
|
|
Be aware that a trap can be called from any number of places in your
|
|
script, and therefore the trap handler should not make assumptions about
|
|
shell state. For some examples, if your script temporarily modifies
|
|
@env{IFS}, then the trap should include an initialization back to its
|
|
typical value of space-tab-newline (autoconf does this for generated
|
|
@file{configure} files). Likewise, if your script changes the current
|
|
working directory at some point after the trap is installed, then your
|
|
trap cannot assume which directory it is in, and should begin by
|
|
changing directories to an absolute path if that is important to the
|
|
cleanup efforts (autotest does this for generated @file{testsuite}
|
|
files).
|
|
|
|
@item @command{true}
|
|
@c -----------------
|
|
@prindex @command{true}
|
|
@c Info cannot handle ':' in index entries.
|
|
@c @prindex @command{:}
|
|
Don't worry: as far as we know @command{true} is portable.
|
|
Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the
|
|
portable shell community tends to prefer using @command{:}. This has a
|
|
funny side effect: when asked whether @command{false} is more portable
|
|
than @command{true} Alexandre Oliva answered:
|
|
|
|
@quotation
|
|
In a sense, yes, because if it doesn't exist, the shell will produce an
|
|
exit status of failure, which is correct for @command{false}, but not
|
|
for @command{true}.
|
|
@end quotation
|
|
|
|
Remember that even though @samp{:} ignores its arguments, it still takes
|
|
time to compute those arguments. It is a good idea to use double quotes
|
|
around any arguments to @samp{:} to avoid time spent in field splitting
|
|
and file name expansion.
|
|
|
|
|
|
@anchor{unset}
|
|
@item @command{unset}
|
|
@c ------------------
|
|
@prindex @command{unset}
|
|
In some nonconforming shells (e.g., Solaris 10 @command{/bin/ksh} and
|
|
@command{/usr/xpg4/bin/sh}, NetBSD 5.99.43 sh, or Bash 2.05a),
|
|
@code{unset FOO} fails when @code{FOO} is not set. This can interfere
|
|
with @code{set -e} operation. You can use
|
|
|
|
@smallexample
|
|
FOO=; unset FOO
|
|
@end smallexample
|
|
|
|
@noindent
|
|
if you are not sure that @code{FOO} is set.
|
|
|
|
A few ancient shells lack @command{unset} entirely. For some variables
|
|
such as @code{PS1}, you can use a neutralizing value instead:
|
|
|
|
@smallexample
|
|
PS1='$ '
|
|
@end smallexample
|
|
|
|
Usually, shells that do not support @command{unset} need less effort to
|
|
make the environment sane, so for example is not a problem if you cannot
|
|
unset @command{CDPATH} on those shells. However, Bash 2.01 mishandles
|
|
@code{unset MAIL} and @code{unset MAILPATH} in some cases and dumps core.
|
|
So, you should do something like
|
|
|
|
@smallexample
|
|
( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :
|
|
@end smallexample
|
|
|
|
@noindent
|
|
@xref{Special Shell Variables}, for some neutralizing values. Also, see
|
|
@ref{export, , Limitations of Builtins}, for
|
|
the case of environment variables.
|
|
|
|
@item @command{wait}
|
|
@c -----------------
|
|
@prindex @command{wait}
|
|
The exit status of @command{wait} is not always reliable.
|
|
@end table
|
|
|
|
@node Limitations of Usual Tools
|
|
@section Limitations of Usual Tools
|
|
@cindex Limitations of usual tools
|
|
|
|
The small set of tools you can expect to find on any machine can still
|
|
include some limitations you should be aware of.
|
|
|
|
@comment Between this list and the list of builtins above, we should
|
|
@comment mention all the tools in GNU Coding Standards ``Utilities in
|
|
@comment Makefiles''.
|
|
|
|
@c This table includes things like '@command{expr} (|)', so we can't
|
|
@c use @table @command.
|
|
@table @asis
|
|
@anchor{awk}
|
|
@item @command{awk}
|
|
@c ----------------
|
|
@prindex @command{awk}
|
|
Don't leave white space before the opening parenthesis in a user function call.
|
|
POSIX does not allow this and GNU Awk rejects it:
|
|
|
|
@example
|
|
$ @kbd{gawk 'function die () @{ print "Aaaaarg!" @}
|
|
BEGIN @{ die () @}'}
|
|
gawk: cmd. line:2: BEGIN @{ die () @}
|
|
gawk: cmd. line:2: ^ parse error
|
|
$ @kbd{gawk 'function die () @{ print "Aaaaarg!" @}
|
|
BEGIN @{ die() @}'}
|
|
Aaaaarg!
|
|
@end example
|
|
|
|
POSIX says that if a program contains only @samp{BEGIN} actions, and
|
|
contains no instances of @code{getline}, then the program merely
|
|
executes the actions without reading input. However, traditional Awk
|
|
implementations (such as Solaris 10 @command{awk}) read and discard
|
|
input in this case. Portable scripts can redirect input from
|
|
@file{/dev/null} to work around the problem. For example:
|
|
|
|
@example
|
|
awk 'BEGIN @{print "hello world"@}' </dev/null
|
|
@end example
|
|
|
|
POSIX says that in an @samp{END} action, @samp{$NF} (and presumably,
|
|
@samp{$1}) retain their value from the last record read, if no
|
|
intervening @samp{getline} occurred. However, some implementations
|
|
(such as Solaris 10 @samp{/usr/bin/awk}, @samp{nawk}, or Darwin
|
|
@samp{awk}) reset these variables. A workaround is to use an
|
|
intermediate variable prior to the @samp{END} block. For example:
|
|
|
|
@example
|
|
$ @kbd{cat end.awk}
|
|
@{ tmp = $1 @}
|
|
END @{ print "a", $1, $NF, "b", tmp @}
|
|
$ @kbd{echo 1 | awk -f end.awk}
|
|
a b 1
|
|
$ @kbd{echo 1 | gawk -f end.awk}
|
|
a 1 1 b 1
|
|
@end example
|
|
|
|
If you want your program to be deterministic, don't depend on @code{for}
|
|
on arrays:
|
|
|
|
@example
|
|
$ @kbd{cat for.awk}
|
|
END @{
|
|
arr["foo"] = 1
|
|
arr["bar"] = 1
|
|
for (i in arr)
|
|
print i
|
|
@}
|
|
$ @kbd{gawk -f for.awk </dev/null}
|
|
foo
|
|
bar
|
|
$ @kbd{nawk -f for.awk </dev/null}
|
|
bar
|
|
foo
|
|
@end example
|
|
|
|
Some Awk implementations, such as HP-UX 11.0's native one,
|
|
mishandle anchors:
|
|
|
|
@example
|
|
$ @kbd{echo xfoo | $AWK '/foo|^bar/ @{ print @}'}
|
|
$ @kbd{echo bar | $AWK '/foo|^bar/ @{ print @}'}
|
|
bar
|
|
$ @kbd{echo xfoo | $AWK '/^bar|foo/ @{ print @}'}
|
|
xfoo
|
|
$ @kbd{echo bar | $AWK '/^bar|foo/ @{ print @}'}
|
|
bar
|
|
@end example
|
|
|
|
@noindent
|
|
Either do not depend on such patterns (i.e., use @samp{/^(.*foo|bar)/},
|
|
or use a simple test to reject such implementations.
|
|
|
|
On @samp{ia64-hp-hpux11.23}, Awk mishandles @code{printf} conversions
|
|
after @code{%u}:
|
|
|
|
@example
|
|
$ @kbd{awk 'BEGIN @{ printf "%u %d\n", 0, -1 @}'}
|
|
0 0
|
|
@end example
|
|
|
|
AIX version 5.2 has an arbitrary limit of 399 on the
|
|
length of regular expressions and literal strings in an Awk program.
|
|
|
|
Traditional Awk implementations derived from Unix version 7, such as
|
|
Solaris @command{/bin/awk}, have many limitations and do not
|
|
conform to POSIX. Nowadays @code{AC_PROG_AWK} (@pxref{Particular
|
|
Programs}) finds you an Awk that doesn't have these problems, but if
|
|
for some reason you prefer not to use @code{AC_PROG_AWK} you may need to
|
|
address them. For more detailed descriptions, see @ref{Language
|
|
History, , @command{awk} language history, gawk, GNU Awk User's Guide}.
|
|
|
|
Traditional Awk does not support multidimensional arrays or user-defined
|
|
functions.
|
|
|
|
Traditional Awk does not support the @option{-v} option. You can use
|
|
assignments after the program instead, e.g., @code{$AWK '@{print v
|
|
$1@}' v=x}; however, don't forget that such assignments are not
|
|
evaluated until they are encountered (e.g., after any @code{BEGIN}
|
|
action).
|
|
|
|
Traditional Awk does not support the keywords @code{delete} or @code{do}.
|
|
|
|
Traditional Awk does not support the expressions
|
|
@code{@var{a}?@var{b}:@var{c}}, @code{!@var{a}}, @code{@var{a}^@var{b}},
|
|
or @code{@var{a}^=@var{b}}.
|
|
|
|
Traditional Awk does not support the predefined @code{CONVFMT} or
|
|
@code{ENVIRON} variables.
|
|
|
|
Traditional Awk supports only the predefined functions @code{exp}, @code{index},
|
|
@code{int}, @code{length}, @code{log}, @code{split}, @code{sprintf},
|
|
@code{sqrt}, and @code{substr}.
|
|
|
|
Traditional Awk @code{getline} is not at all compatible with POSIX;
|
|
avoid it.
|
|
|
|
Traditional Awk has @code{for (i in a) @dots{}} but no other uses of the
|
|
@code{in} keyword. For example, it lacks @code{if (i in a) @dots{}}.
|
|
|
|
In code portable to both traditional and modern Awk, @code{FS} must be a
|
|
string containing just one ordinary character, and similarly for the
|
|
field-separator argument to @code{split}.
|
|
|
|
Traditional Awk has a limit of 99 fields in a record
|
|
and splits the input even if you don't refer to any field in the script.
|
|
To circumvent this problem, set @samp{FS}
|
|
to an unusual character and use @code{split}.
|
|
|
|
Traditional Awk has a limit of at most 99 bytes in a number formatted by
|
|
@code{OFMT}; for example, @code{OFMT="%.300e"; print 0.1;} typically
|
|
dumps core.
|
|
|
|
The original version of Awk had a limit of at most 99 bytes per
|
|
@code{split} field, 99 bytes per @code{substr} substring, and 99 bytes
|
|
per run of non-special characters in a @code{printf} format, but these
|
|
bugs have been fixed on all practical hosts that we know of.
|
|
|
|
HP-UX 11.00 Awk requires that input files have a line length
|
|
of at most 3070 bytes.
|
|
|
|
@item @command{basename}
|
|
@c ---------------------
|
|
@prindex @command{basename}
|
|
Long ago some hosts lacked a working @command{basename},
|
|
and portable scripts needed to use @command{expr} instead.
|
|
Nowadays it is safe to use @command{basename}. For example:
|
|
|
|
@example
|
|
base=`basename -- "$file"`
|
|
@end example
|
|
|
|
@c AS_BASENAME is to be replaced by a better API.
|
|
@ignore
|
|
Not all hosts have a working @command{basename}, and you should instead
|
|
use @code{AS_BASENAME} (@pxref{Programming in M4sh}), followed by
|
|
@command{expr} if you need to strip a suffix. For example:
|
|
|
|
@example
|
|
a=`basename "$aname"` # This is not portable.
|
|
a=`AS_BASENAME(["$aname"])` # This is more portable.
|
|
|
|
# This is not portable.
|
|
c=`basename "$cname" .c`
|
|
|
|
# This is more portable.
|
|
c=`AS_BASENAME(["$cname"])`
|
|
case $c in
|
|
?*.c) c=`expr "X$c" : 'X\(.*\)\.c'`;;
|
|
esac
|
|
@end example
|
|
@end ignore
|
|
|
|
|
|
@item @command{cat}
|
|
@c ----------------
|
|
@prindex @command{cat}
|
|
Don't rely on any option.
|
|
|
|
|
|
@item @command{cc}
|
|
@c ---------------
|
|
@prindex @command{cc}
|
|
The command @samp{cc -c foo.c} traditionally produces an object file
|
|
named @file{foo.o}. Most compilers allow @option{-c} to be combined
|
|
with @option{-o} to specify a different object file name, but
|
|
POSIX does not require this combination and a few compilers
|
|
lack support for it. @xref{C Compiler}, for how GNU Make
|
|
tests for this feature with @code{AC_PROG_CC_C_O}.
|
|
|
|
When a compilation such as @samp{cc -o foo foo.c} fails, some compilers
|
|
(such as CDS on Reliant Unix) leave a @file{foo.o}.
|
|
|
|
HP-UX @command{cc} doesn't accept @file{.S} files to preprocess and
|
|
assemble. @samp{cc -c foo.S} appears to succeed, but in fact does
|
|
nothing.
|
|
|
|
The default executable, produced by @samp{cc foo.c}, can be
|
|
|
|
@itemize
|
|
@item @file{a.out} -- usual POSIX convention.
|
|
@item @file{b.out} -- i960 compilers (including @command{gcc}).
|
|
@item @file{a.exe} -- DJGPP port of @command{gcc}.
|
|
@item @file{a_out.exe} -- GNV @command{cc} wrapper for DEC C on OpenVMS.
|
|
@item @file{foo.exe} -- various MS-DOS compilers.
|
|
@end itemize
|
|
|
|
The C compiler's traditional name is @command{cc}, but other names like
|
|
@command{gcc} are common. POSIX 1003.1-2001 through 1003.1-2017 specify the
|
|
name @command{c99}, but older POSIX editions specified
|
|
@command{c89}, future POSIX standards will likely specify
|
|
other commands, and anyway these standard names are rarely used in
|
|
practice. Typically the C compiler is invoked from makefiles that use
|
|
@samp{$(CC)}, so the value of the @samp{CC} make variable selects the
|
|
compiler name.
|
|
|
|
@item @command{chgrp}
|
|
@itemx @command{chown}
|
|
@c -------------------
|
|
@prindex @command{chgrp}
|
|
@prindex @command{chown}
|
|
It is not portable to change a file's group to a group that the owner
|
|
does not belong to.
|
|
|
|
@item @command{chmod}
|
|
@c ------------------
|
|
@prindex @command{chmod}
|
|
Avoid usages like @samp{chmod -w file}; use @samp{chmod a-w file}
|
|
instead, for two reasons. First, plain @option{-w} does not necessarily
|
|
make the file unwritable, since it does not affect mode bits that
|
|
correspond to bits in the file mode creation mask. Second,
|
|
POSIX says that the @option{-w} might be interpreted as an
|
|
implementation-specific option, not as a mode; POSIX suggests
|
|
using @samp{chmod -- -w file} to avoid this confusion, but unfortunately
|
|
@samp{--} does not work on some older hosts.
|
|
|
|
|
|
@item @command{cmp}
|
|
@c ----------------
|
|
@prindex @command{cmp}
|
|
@command{cmp} performs a raw data comparison of two files, while
|
|
@command{diff} compares two text files. Therefore, if you might compare
|
|
DOS files, even if only checking whether two files are different, use
|
|
@command{diff} to avoid spurious differences due to differences of
|
|
newline encoding.
|
|
|
|
|
|
@item @command{cp}
|
|
@c ---------------
|
|
@prindex @command{cp}
|
|
The @option{-i}, @option{-f}, @option{-p} and @option{-R} options are
|
|
widely used. POSIX also specifies @option{-H}, @option{-L}, and
|
|
@option{-P}. Avoid other options in portable scripts.
|
|
|
|
@cindex timestamp resolution
|
|
Traditionally, file timestamps had 1-second resolution, and @samp{cp
|
|
-p} copied the timestamps exactly. However, many modern file systems
|
|
have timestamps with 1-nanosecond resolution. Unfortunately, some older
|
|
@samp{cp -p} implementations truncate timestamps when copying files,
|
|
which can cause the destination file to appear to be older than the
|
|
source. The exact amount of truncation depends on the resolution of
|
|
the system calls that @command{cp} uses. Traditionally this was
|
|
@code{utime}, which has 1-second resolution. Less-ancient @command{cp}
|
|
implementations such as GNU Core Utilities 5.0.91 (2003) use
|
|
@code{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
|
|
@code{futimens} and @code{utimensat} when they are available. As of
|
|
2011, though, many platforms do not yet fully support these new system
|
|
calls.
|
|
|
|
Bob Proulx notes that @samp{cp -p} always @emph{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 @command{cp} itself has control
|
|
over.
|
|
|
|
In Unix System V any user can chown files to any other user, and System
|
|
V also has a non-sticky @file{/tmp}. That probably derives from the
|
|
heritage of System V in a business environment without hostile users.
|
|
BSD changed this
|
|
to be a more secure model where only root can @command{chown} files and
|
|
a sticky @file{/tmp} is used. That undoubtedly derives from the heritage
|
|
of BSD in a campus environment.
|
|
|
|
GNU/Linux and Solaris by default follow BSD, but
|
|
can be configured to allow a System V style @command{chown}. On the
|
|
other hand, HP-UX follows System V, but can
|
|
be configured to use the modern security model and disallow
|
|
@command{chown}. Since it is an administrator-configurable parameter
|
|
you can't use the name of the kernel as an indicator of the behavior.
|
|
|
|
|
|
|
|
@item @command{date}
|
|
@c -----------------
|
|
@prindex @command{date}
|
|
When most versions of @command{date} do not recognize a @samp{%}
|
|
conversion specification, they quietly pass it through,
|
|
and exit with success:
|
|
|
|
@example
|
|
$ @kbd{date --version | head -n 1}
|
|
date (GNU coreutils) 9.5
|
|
$ @kbd{date +'%H:%M %Q'}
|
|
17:25 %Q
|
|
@end example
|
|
|
|
@noindent
|
|
However, this behavior is not required by POSIX.
|
|
|
|
|
|
@item @command{dirname}
|
|
@c --------------------
|
|
@prindex @command{dirname}
|
|
Long ago some hosts lacked a working @command{dirname} and portable
|
|
scripts needed to use use @code{AS_DIRNAME} (@pxref{Programming in M4sh}).
|
|
Nowadays @command{dirname} suffices and the following are equivalent:
|
|
|
|
@example
|
|
dir=`dirname -- "$file"`
|
|
dir=`AS_DIRNAME(["$file"])`
|
|
@end example
|
|
|
|
|
|
@item @command{egrep}
|
|
@c ------------------
|
|
@prindex @command{egrep}
|
|
Although POSIX stopped requiring @command{egrep} in 2001,
|
|
a few traditional hosts (notably Solaris 10) do not support the POSIX
|
|
replacement @code{grep -E}. Also, some traditional implementations do
|
|
not work on long input lines. To work around these problems, invoke
|
|
@code{AC_PROG_EGREP} and then use @code{$EGREP}.
|
|
|
|
Portable extended regular expressions should use @samp{\} only to escape
|
|
characters in the string @samp{$()*+.?[\^@{|}. For example, @samp{\@}}
|
|
is not portable, even though it typically matches @samp{@}}.
|
|
|
|
The empty alternative is not portable. Use @samp{?} instead. For
|
|
instance with Digital Unix v5.0:
|
|
|
|
@example
|
|
> printf 'foo\n|foo\n' | $EGREP '^(|foo|bar)$'
|
|
|foo
|
|
> printf 'bar\nbar|\n' | $EGREP '^(foo|bar|)$'
|
|
bar|
|
|
> printf 'foo\nfoo|\n|bar\nbar\n' | $EGREP '^(foo||bar)$'
|
|
foo
|
|
|bar
|
|
@end example
|
|
|
|
For more information about what can appear in portable extended regular
|
|
expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}.
|
|
|
|
@command{$EGREP} also suffers the limitations of @command{grep}
|
|
(@pxref{grep, , Limitations of Usual Tools}).
|
|
|
|
@item @command{expr}
|
|
@c -----------------
|
|
@prindex @command{expr}
|
|
Not all implementations obey the POSIX rule that @samp{--} separates
|
|
options from arguments; likewise, not all implementations provide the
|
|
extension to POSIX that the first argument can be treated as part of a
|
|
valid expression rather than an invalid option if it begins with
|
|
@samp{-}. When performing arithmetic, use @samp{expr 0 + $var} if
|
|
@samp{$var} might be a negative number, to keep @command{expr} from
|
|
interpreting it as an option.
|
|
|
|
No @command{expr} keyword starts with @samp{X}, so use @samp{expr
|
|
X"@var{word}" : 'X@var{regex}'} to keep @command{expr} from
|
|
misinterpreting @var{word}.
|
|
|
|
Don't use @code{length}, @code{substr}, @code{match} and @code{index}.
|
|
|
|
@item @command{expr} (@samp{|})
|
|
@prindex @command{expr} (@samp{|})
|
|
You can use @samp{|}. Although POSIX does require that @samp{expr
|
|
''} return the empty string, it does not specify the result when you
|
|
@samp{|} together the empty string (or zero) with the empty string. For
|
|
example:
|
|
|
|
@example
|
|
expr '' \| ''
|
|
@end example
|
|
|
|
POSIX 1003.2-1992 returns the empty string
|
|
for this case, but traditional Unix returns @samp{0} (Solaris is
|
|
one such example). In POSIX 1003.1-2001, the specification was
|
|
changed to match traditional Unix's behavior (which is
|
|
bizarre, but it's too late to fix this). Please note that the same
|
|
problem does arise when the empty string results from a computation,
|
|
as in:
|
|
|
|
@example
|
|
expr bar : foo \| foo : bar
|
|
@end example
|
|
|
|
@noindent
|
|
Avoid this portability problem by avoiding the empty string.
|
|
|
|
|
|
@item @command{expr} (@samp{:})
|
|
@c ----------------------------
|
|
@prindex @command{expr}
|
|
Portable @command{expr} regular expressions should use @samp{\} to
|
|
escape only characters in the string @samp{$()*.123456789[\^@{@}}.
|
|
For example, alternation, @samp{\|}, is common but POSIX does not
|
|
require its support, so it should be avoided in portable scripts.
|
|
Similarly, @samp{\+} and @samp{\?} should be avoided.
|
|
|
|
Portable @command{expr} regular expressions should not begin with
|
|
@samp{^}. Patterns are automatically anchored so leading @samp{^} is
|
|
not needed anyway.
|
|
|
|
On the other hand, the behavior of the @samp{$} anchor is not portable
|
|
on multi-line strings. POSIX is ambiguous whether the anchor applies to
|
|
each line, as was done in older versions of the GNU Core Utilities, or
|
|
whether it applies only to the end of the overall string, as in
|
|
Coreutils 6.0 and most other implementations.
|
|
|
|
@example
|
|
$ @kbd{baz='foo}
|
|
> @kbd{bar'}
|
|
$ @kbd{expr "X$baz" : 'X\(foo\)$'}
|
|
|
|
$ @kbd{expr-5.97 "X$baz" : 'X\(foo\)$'}
|
|
foo
|
|
@end example
|
|
|
|
The POSIX standard is ambiguous as to whether
|
|
@samp{expr 'a' : '\(b\)'} outputs @samp{0} or the empty string.
|
|
In practice, it outputs the empty string on most platforms, but portable
|
|
scripts should not assume this. For instance, the QNX 4.25 native
|
|
@command{expr} returns @samp{0}.
|
|
|
|
One might think that a way to get a uniform behavior would be to use
|
|
the empty string as a default value:
|
|
|
|
@example
|
|
expr a : '\(b\)' \| ''
|
|
@end example
|
|
|
|
@noindent
|
|
Unfortunately this behaves exactly as the original expression; see the
|
|
@command{expr} (@samp{|}) entry for more information.
|
|
|
|
Some ancient @command{expr} implementations (e.g.,
|
|
Solaris 10 @command{/usr/ucb/expr}) have a silly length limit that causes
|
|
@command{expr} to fail if the matched substring is longer than 120
|
|
bytes. In this case, you might want to fall back on @samp{printf|sed} if
|
|
@command{expr} fails. Nowadays this is of practical importance only for
|
|
the rare installer who mistakenly puts @file{/usr/ucb} before
|
|
@file{/usr/bin} in @env{PATH} on Solaris 10.
|
|
|
|
On Mac OS X 10.4, @command{expr} mishandles the pattern @samp{[^-]} in
|
|
some cases. For example, the command
|
|
@example
|
|
expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'
|
|
@end example
|
|
|
|
@noindent
|
|
outputs @samp{apple-darwin8.1.0} rather than the correct @samp{darwin8.1.0}.
|
|
This particular case can be worked around by substituting @samp{[^--]}
|
|
for @samp{[^-]}.
|
|
|
|
Don't leave, there is some more!
|
|
|
|
The QNX 4.25 @command{expr}, in addition of preferring @samp{0} to
|
|
the empty string, has a funny behavior in its exit status: it's always 1
|
|
when parentheses are used!
|
|
|
|
@example
|
|
$ @kbd{val=`expr 'a' : 'a'`; echo "$?: $val"}
|
|
0: 1
|
|
$ @kbd{val=`expr 'a' : 'b'`; echo "$?: $val"}
|
|
1: 0
|
|
|
|
$ @kbd{val=`expr 'a' : '\(a\)'`; echo "?: $val"}
|
|
1: a
|
|
$ @kbd{val=`expr 'a' : '\(b\)'`; echo "?: $val"}
|
|
1: 0
|
|
@end example
|
|
|
|
@noindent
|
|
In practice this can be a big problem if you are ready to catch failures
|
|
of @command{expr} programs with some other method (such as using
|
|
@command{sed}), since you may get twice the result. For instance
|
|
|
|
@example
|
|
$ @kbd{expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'}
|
|
@end example
|
|
|
|
@noindent
|
|
outputs @samp{a} on most hosts, but @samp{aa} on QNX 4.25. A
|
|
simple workaround consists of testing @command{expr} and using a variable
|
|
set to @command{expr} or to @command{false} according to the result.
|
|
|
|
On HP-UX 11, @command{expr} supports only a single
|
|
sub-expression.
|
|
|
|
@example
|
|
$ @kbd{expr 'Xfoo' : 'X\(f\(oo\)*\)$'}
|
|
expr: More than one '\(' was used.
|
|
@end example
|
|
|
|
|
|
@item @command{fgrep}
|
|
@c ------------------
|
|
@prindex @command{fgrep}
|
|
Although POSIX stopped requiring @command{fgrep} in 2001,
|
|
a few traditional hosts (notably Solaris 10) do not support the POSIX
|
|
replacement @code{grep -F}. Also, some traditional implementations do
|
|
not work on long input lines. To work around these problems, invoke
|
|
@code{AC_PROG_FGREP} and then use @code{$FGREP}.
|
|
|
|
|
|
@item @command{find}
|
|
@c -----------------
|
|
@prindex @command{find}
|
|
Many operands of GNU @command{find} are not standardized by POSIX and
|
|
are missing on many platforms. These nonportable operands include
|
|
@option{-follow}, @option{-maxdepth}, @option{-mindepth},
|
|
@option{-printf}, and @option{,}. See the
|
|
@uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/find.html,
|
|
POSIX spec for @command{find}} for @command{find} operands that
|
|
should be portable nowadays.
|
|
|
|
The replacement of @samp{@{@}} is guaranteed only if the argument is
|
|
exactly @emph{@{@}}, not if it's only a part of an argument. For
|
|
instance, on HP-UX 11:
|
|
|
|
@example
|
|
$ @kbd{touch foo}
|
|
$ @kbd{find . -name foo -exec echo "@{@}-@{@}" \;}
|
|
@{@}-@{@}
|
|
@end example
|
|
|
|
@noindent
|
|
while GNU @command{find} reports @samp{./foo-./foo}.
|
|
POSIX allows either behavior.
|
|
|
|
|
|
@anchor{grep}
|
|
@item @command{grep}
|
|
@c -----------------
|
|
@prindex @command{grep}
|
|
Portable scripts can rely on the @command{grep} options @option{-c},
|
|
@option{-l}, @option{-n}, and @option{-v}, but should avoid other
|
|
options. For example, don't use @option{-w}, as POSIX does not require it.
|
|
Also, portable scripts should not combine @option{-c} with @option{-l},
|
|
as POSIX does not allow this.
|
|
|
|
Some of the options required by POSIX are not portable in practice.
|
|
Don't use @samp{grep -q} to suppress output, because traditional @command{grep}
|
|
implementations (e.g., Solaris 10) do not support @option{-q}.
|
|
Don't use @samp{grep -s} to suppress output either, because POSIX
|
|
says @option{-s} does not suppress output, only some error messages;
|
|
also, the @option{-s} option of traditional @command{grep} behaved
|
|
like @option{-q} does in most modern implementations. Instead,
|
|
redirect the standard output and standard error (in case the file
|
|
doesn't exist) of @code{grep} to @file{/dev/null}. Check the exit
|
|
status of @code{grep} to determine whether it found a match.
|
|
|
|
The QNX4 implementation fails to count lines with @code{grep -c '$'},
|
|
but works with @code{grep -c '^'}. Other alternatives for counting
|
|
lines are to use @code{sed -n '$='} or @code{wc -l}.
|
|
|
|
Some traditional @command{grep} implementations do not work on long
|
|
input lines. On AIX the default @code{grep} silently truncates long
|
|
lines on the input before matching.
|
|
|
|
Also, Solaris 10 @command{grep} does not support @option{-e}.
|
|
To work around this, invoke @code{AC_PROG_GREP} and then use @code{$GREP}.
|
|
|
|
Another possible workaround for the multiple @option{-e} problem is to
|
|
separate the patterns by newlines, for example:
|
|
|
|
@example
|
|
grep 'foo
|
|
bar' in.txt
|
|
@end example
|
|
|
|
@noindent
|
|
except that this fails with traditional @command{grep}
|
|
implementations and with OpenBSD 3.8 @command{grep}.
|
|
|
|
Traditional @command{grep} implementations (e.g., Solaris 10) do not
|
|
support the @option{-E} or @option{-F} options. To work around these
|
|
problems, invoke @code{AC_PROG_EGREP} and then use @code{$EGREP}, and
|
|
similarly for @code{AC_PROG_FGREP} and @code{$FGREP}. Even if you are
|
|
willing to require support for POSIX @command{grep}, your script should
|
|
not use both @option{-E} and @option{-F}, since POSIX does not allow
|
|
this combination.
|
|
|
|
Portable @command{grep} regular expressions should use @samp{\} only to
|
|
escape characters in the string @samp{$()*.123456789[\^@{@}}. For example,
|
|
alternation, @samp{\|}, is common but POSIX does not require its
|
|
support in basic regular expressions, so it should be avoided in
|
|
portable scripts. Solaris and HP-UX @command{grep} do not support it.
|
|
Similarly, the following escape sequences should also be avoided:
|
|
@samp{\<}, @samp{\>}, @samp{\+}, @samp{\?}, @samp{\`}, @samp{\'},
|
|
@samp{\B}, @samp{\b}, @samp{\S}, @samp{\s}, @samp{\W}, and @samp{\w}.
|
|
For more information about what can appear in portable regular expressions,
|
|
@pxref{Problematic Expressions,,, grep, GNU Grep}.
|
|
|
|
POSIX does not specify the behavior of @command{grep} on binary files.
|
|
An example where this matters is using BSD @command{grep} to
|
|
search text that includes embedded ANSI escape sequences for
|
|
colored output to terminals (@samp{\033[m} is the sequence to restore
|
|
normal output); the behavior depends on whether input is seekable:
|
|
|
|
@example
|
|
$ @kbd{printf 'esc\033[mape\n' > sample}
|
|
$ @kbd{grep . sample}
|
|
Binary file sample matches
|
|
$ @kbd{cat sample | grep .}
|
|
escape
|
|
@end example
|
|
|
|
|
|
@item @command{join}
|
|
@c -----------------
|
|
@prindex @command{join}
|
|
On NetBSD, @command{join -a 1 file1 file2} mistakenly behaves like
|
|
@command{join -a 1 -a 2 1 file1 file2}, resulting in a usage warning;
|
|
the workaround is to use @command{join -a1 file1 file2} instead.
|
|
|
|
On some circa-2020 BSD-based systems @command{join} mishandles inputs
|
|
with missing fields. For example, an empty line is not treated as
|
|
containing an empty join field. As a workaround, input lines should
|
|
always have a join field.
|
|
|
|
On platforms with the BusyBox tools, the @command{join} command is
|
|
entirely missing. As a workaround, you can simulate special cases of the
|
|
@command{join} command using an @command{awk} script. For an example,
|
|
see @url{https://lists.gnu.org/r/bug-gnulib/2021-04/msg00054.html}.
|
|
|
|
|
|
@item @command{ln}
|
|
@c ---------------
|
|
@prindex @command{ln}
|
|
The @option{-f} option is portable nowadays.
|
|
|
|
@cindex Symbolic links
|
|
Symbolic links are not available on some systems; use @samp{$(LN_S)} as
|
|
a portable substitute.
|
|
|
|
For versions of the DJGPP before 2.04,
|
|
@command{ln} emulates symbolic links
|
|
to executables by generating a stub that in turn calls the real
|
|
program. This feature also works with nonexistent files like in the
|
|
POSIX spec. So @samp{ln -s file link} generates @file{link.exe},
|
|
which attempts to call @file{file.exe} if run. But this feature only
|
|
works for executables, so @samp{cp -p} is used instead for these
|
|
systems. DJGPP versions 2.04 and later have full support
|
|
for symbolic links.
|
|
|
|
|
|
@item @command{ls}
|
|
@c ---------------
|
|
@prindex @command{ls}
|
|
@cindex Listing directories
|
|
The portable options are @option{-acdilrtu}. Current practice is for
|
|
@option{-l} to output both owner and group, even though ancient versions
|
|
of @command{ls} omitted the group.
|
|
|
|
On ancient hosts, @samp{ls foo} sent the diagnostic @samp{foo not found}
|
|
to standard output if @file{foo} did not exist. Hence a shell command
|
|
like @samp{sources=`ls *.c 2>/dev/null`} did not always work, since it
|
|
was equivalent to @samp{sources='*.c not found'} in the absence of
|
|
@samp{.c} files. This is no longer a practical problem, since current
|
|
@command{ls} implementations send diagnostics to standard error.
|
|
|
|
The behavior of @command{ls} on a directory that is being concurrently
|
|
modified is not always predictable, because of a data race where cached
|
|
information returned by @code{readdir} does not match the current
|
|
directory state. In fact, Mac OS X 10.5 had an intermittent bug where
|
|
@code{readdir}, and thus @command{ls}, sometimes lists a file more than
|
|
once if other files were added or removed from the directory immediately
|
|
prior to the @command{ls} call. Since @command{ls} already sorts its
|
|
output, the duplicate entries can be avoided by piping the results
|
|
through @code{uniq}.
|
|
|
|
@anchor{mkdir}
|
|
@item @command{mkdir}
|
|
@c ------------------
|
|
@prindex @command{mkdir}
|
|
@cindex Making directories
|
|
Combining the @option{-m} and @option{-p} options, as in @samp{mkdir -m
|
|
go-w -p @var{dir}}, often leads to trouble. FreeBSD
|
|
@command{mkdir} incorrectly attempts to change the permissions of
|
|
@var{dir} even if it already exists. HP-UX 11.23
|
|
@command{mkdir} often assigns the wrong permissions to
|
|
any newly-created parents of @var{dir}.
|
|
|
|
POSIX does not clearly specify whether @samp{mkdir -p foo}
|
|
should succeed when @file{foo} is a symbolic link to an already-existing
|
|
directory. The GNU @command{mkdir}
|
|
succeeds, but Solaris 10 @command{mkdir} fails.
|
|
|
|
Traditional @code{mkdir -p} implementations suffer from race conditions.
|
|
For example, if you invoke @code{mkdir -p a/b} and @code{mkdir -p a/c}
|
|
at the same time, both processes might detect that @file{a} is missing,
|
|
one might create @file{a}, then the other might try to create @file{a}
|
|
and fail with a @code{File exists} diagnostic. Solaris 10 @command{mkdir}
|
|
is vulnerable, and other traditional Unix systems are
|
|
probably vulnerable too. This possible race is harmful in parallel
|
|
builds when several Make rules call @code{mkdir -p} to
|
|
construct directories. You may use
|
|
@code{install-sh -d} as a safe replacement, for example by setting
|
|
@samp{MKDIR_P='/path/to/install-sh -d'} in the environment of
|
|
@command{configure}, assuming the package distributes @file{install-sh}.
|
|
|
|
@item @command{mkfifo}
|
|
@itemx @command{mknod}
|
|
@c -------------------
|
|
@prindex @command{mkfifo}
|
|
@prindex @command{mknod}
|
|
The GNU Coding Standards state that @command{mknod} is safe to use on
|
|
platforms where it has been tested to exist; but it is generally portable
|
|
only for creating named FIFOs, since device numbers are
|
|
platform-specific. Autotest uses @command{mkfifo} to implement parallel
|
|
testsuites. POSIX states that behavior is unspecified when opening a
|
|
named FIFO for both reading and writing; on at least Cygwin, this
|
|
results in failure on any attempt to read or write to that file
|
|
descriptor.
|
|
|
|
@item @command{mktemp}
|
|
@c -------------------
|
|
@prindex @command{mktemp}
|
|
@cindex Creating temporary files
|
|
Shell scripts can use temporary files safely with @command{mktemp}, but
|
|
it does not exist on all systems. A portable way to create a safe
|
|
temporary file name is to create a temporary directory with mode 700 and
|
|
use a file inside this directory. Both methods prevent attackers from
|
|
gaining control, though @command{mktemp} is far less likely to fail
|
|
gratuitously under attack.
|
|
|
|
Here is sample code to create a new temporary directory @samp{$dir} safely:
|
|
|
|
@example
|
|
# Create a temporary directory $dir in $TMPDIR (default /tmp).
|
|
# Use mktemp if possible; otherwise fall back on mkdir,
|
|
# with $RANDOM to make collisions less likely.
|
|
: "$@{TMPDIR:=/tmp@}"
|
|
@{
|
|
dir=`
|
|
(umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
|
|
` &&
|
|
test -d "$dir"
|
|
@} || @{
|
|
dir=$TMPDIR/foo$$-$RANDOM
|
|
@c $$ restore font-lock
|
|
(umask 077 && mkdir "$dir")
|
|
@} || exit $?
|
|
@end example
|
|
|
|
|
|
@item @command{mv}
|
|
@c ---------------
|
|
@prindex @command{mv}
|
|
@cindex Moving open files
|
|
The only portable options are @option{-f} and @option{-i}.
|
|
|
|
Moving individual files between file systems is portable (it was in Unix
|
|
version 6),
|
|
but it is not always atomic: when doing @samp{mv new existing}, there's
|
|
a critical section where neither the old nor the new version of
|
|
@file{existing} actually exists.
|
|
|
|
On some systems moving files from @file{/tmp} can sometimes cause
|
|
undesirable (but perfectly valid) warnings, even if you created these
|
|
files. This is because @file{/tmp} belongs to a group that ordinary
|
|
users are not members of, and files created in @file{/tmp} inherit
|
|
the group of @file{/tmp}. When the file is copied, @command{mv} issues
|
|
a diagnostic without failing:
|
|
|
|
@smallexample
|
|
$ @kbd{touch /tmp/foo}
|
|
$ @kbd{mv /tmp/foo .}
|
|
@error{}mv: ./foo: set owner/group (was: 100/0): Operation not permitted
|
|
$ @kbd{echo $?}
|
|
0
|
|
$ @kbd{ls foo}
|
|
foo
|
|
@end smallexample
|
|
|
|
@noindent
|
|
This annoying behavior conforms to POSIX, unfortunately.
|
|
|
|
Moving directories across mount points is not portable, use @command{cp}
|
|
and @command{rm}.
|
|
|
|
DOS variants cannot rename or remove open files, and do not
|
|
support commands like @samp{mv foo bar >foo}, even though this is
|
|
perfectly portable among POSIX hosts.
|
|
|
|
|
|
@item @command{od}
|
|
@c ---------------
|
|
@prindex @command{od}
|
|
|
|
In Mac OS X versions prior to 10.4.3, @command{od} does not support the
|
|
standard POSIX options @option{-A}, @option{-j}, @option{-N}, or
|
|
@option{-t}, or the XSI option, @option{-s}. The only
|
|
supported POSIX option is @option{-v}, and the only supported
|
|
XSI options are those in @option{-bcdox}. The BSD
|
|
@command{hexdump} program can be used instead.
|
|
|
|
In some versions of some operating systems derived from Solaris 11,
|
|
@command{od} prints decimal byte values padded with zeros rather than
|
|
with spaces:
|
|
|
|
@smallexample
|
|
$ @kbd{printf '#!' | od -A n -t d1 -N 2}
|
|
035 033
|
|
@end smallexample
|
|
|
|
@noindent
|
|
instead of
|
|
|
|
@smallexample
|
|
$ @kbd{printf '#!' | od -A n -t d1 -N 2}
|
|
35 33
|
|
@end smallexample
|
|
|
|
We have observed this on both OpenIndiana and OmniOS;
|
|
Illumos may also be affected.
|
|
As a workaround, you can use octal output (option @code{-t o1}).
|
|
|
|
|
|
@item @command{rm}
|
|
@c ---------------
|
|
@prindex @command{rm}
|
|
The @option{-f} and @option{-r} options are portable.
|
|
|
|
It is not portable to invoke @command{rm} without options or operands.
|
|
On the other hand, POSIX now requires @command{rm -f} to silently
|
|
succeed when there are no operands (useful for constructs like
|
|
@command{rm -rf $filelist} without first checking if @samp{$filelist}
|
|
was empty). But this was not always portable; at least NetBSD
|
|
@command{rm} built before 2008 would fail with a diagnostic.
|
|
|
|
A file might not be removed even if its parent directory is writable
|
|
and searchable. Many POSIX hosts cannot remove a mount point, a named
|
|
stream, a working directory, or a last link to a file that is being
|
|
executed.
|
|
|
|
DOS variants cannot rename or remove open files, and do not
|
|
support commands like @samp{rm foo >foo}, even though this is
|
|
perfectly portable among POSIX hosts.
|
|
|
|
@item @command{rmdir}
|
|
@c ------------------
|
|
@prindex @command{rmdir}
|
|
Just as with @command{rm}, some platforms refuse to remove a working
|
|
directory.
|
|
|
|
@anchor{sed}
|
|
@item @command{sed}
|
|
@c ----------------
|
|
@prindex @command{sed}
|
|
Patterns should not include the separator (unless escaped), even as part
|
|
of a character class. In conformance with POSIX, the Cray
|
|
@command{sed} rejects @samp{s/[^/]*$//}: use @samp{s%[^/]*$%%}.
|
|
Even when escaped, patterns should not include separators that are also
|
|
used as @command{sed} metacharacters. For example, GNU sed 4.0.9 rejects
|
|
@samp{s,x\@{1\,\@},,}, while sed 4.1 strips the backslash before the comma
|
|
before evaluating the basic regular expression.
|
|
|
|
Avoid empty patterns within parentheses (i.e., @samp{\(\)}). POSIX does
|
|
not require support for empty patterns, and Unicos 9 @command{sed} rejects
|
|
them.
|
|
|
|
Unicos 9 @command{sed} loops endlessly on patterns like @samp{.*\n.*}.
|
|
|
|
Sed scripts should not use branch labels longer than 7 characters and
|
|
should not contain comments; AIX 5.3 @command{sed} rejects indented comments.
|
|
HP-UX sed has a limit of 99 commands (not counting @samp{:} commands) and
|
|
48 labels, which cannot be circumvented by using more than one script
|
|
file. It can execute up to 19 reads with the @samp{r} command per cycle.
|
|
Solaris @command{/usr/ucb/sed} rejects usages that exceed a limit of
|
|
about 6000 bytes for the internal representation of commands.
|
|
|
|
Avoid redundant @samp{;}, as some @command{sed} implementations, such as
|
|
NetBSD 1.4.2's, incorrectly try to interpret the second
|
|
@samp{;} as a command:
|
|
|
|
@example
|
|
$ @kbd{echo a | sed 's/x/x/;;s/x/x/'}
|
|
sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
|
|
@end example
|
|
|
|
Some @command{sed} implementations have a buffer limited to 4000 bytes,
|
|
and this limits the size of input lines, output lines, and internal
|
|
buffers that can be processed portably. Likewise,
|
|
not all @command{sed} implementations can handle embedded @code{NUL} or
|
|
a missing trailing newline.
|
|
|
|
Remember that ranges within a bracket expression of a regular expression
|
|
are only well-defined in the @samp{C} (or @samp{POSIX}) locale.
|
|
Meanwhile, support for character classes like @samp{[[:upper:]]} is not
|
|
yet universal, so if you cannot guarantee the setting of @env{LC_ALL},
|
|
it is better to spell out a range @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]}
|
|
than to rely on @samp{[A-Z]}.
|
|
|
|
Additionally, POSIX states that regular expressions are only
|
|
well-defined on characters. Unfortunately, there exist platforms such
|
|
as Mac OS X 10.5 where not all 8-bit byte values are valid characters,
|
|
even though that platform has a single-byte @samp{C} locale. And POSIX
|
|
allows the existence of a multi-byte @samp{C} locale, although that does
|
|
not yet appear to be a common implementation. At any rate, it means
|
|
that not all bytes will be matched by the regular expression @samp{.}:
|
|
|
|
@example
|
|
$ @kbd{printf '\200\n' | LC_ALL=C sed -n /./p | wc -l}
|
|
0
|
|
$ @kbd{printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l}
|
|
1
|
|
@end example
|
|
|
|
Portable @command{sed} regular expressions should use @samp{\} only to escape
|
|
characters in the string @samp{$()*.123456789[\^n@{@}}. For example,
|
|
alternation, @samp{\|}, is common but POSIX does not require its
|
|
support, so it should be avoided in portable scripts. Solaris
|
|
@command{sed} does not support alternation; e.g., @samp{sed '/a\|b/d'}
|
|
deletes only lines that contain the literal string @samp{a|b}.
|
|
Similarly, @samp{\+} and @samp{\?} should be avoided.
|
|
|
|
Anchors (@samp{^} and @samp{$}) inside groups are not portable.
|
|
|
|
Nested parentheses in patterns (e.g., @samp{\(\(a*\)b*)\)}) are
|
|
quite portable to current hosts, but was not supported by some ancient
|
|
@command{sed} implementations like SVR3.
|
|
|
|
Some @command{sed} implementations, e.g., Solaris, restrict the special
|
|
role of the asterisk @samp{*} to one-character regular expressions and
|
|
back-references, and the special role of interval expressions
|
|
@samp{\@{@var{m}\@}}, @samp{\@{@var{m},\@}}, or @samp{\@{@var{m},@var{n}\@}}
|
|
to one-character regular expressions. This may lead to unexpected behavior:
|
|
|
|
@example
|
|
$ @kbd{echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'}
|
|
x2x4
|
|
$ @kbd{echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'}
|
|
x
|
|
@end example
|
|
|
|
The @option{-e} option is mostly portable.
|
|
However, its argument cannot be empty, as this fails on AIX 7.3.
|
|
Some people prefer to use @samp{-e}:
|
|
|
|
@example
|
|
sed -e '@var{command-1}' \
|
|
-e '@var{command-2}'
|
|
@end example
|
|
|
|
@noindent
|
|
as opposed to the equivalent:
|
|
|
|
@example
|
|
sed '
|
|
@var{command-1}
|
|
@var{command-2}
|
|
'
|
|
@end example
|
|
|
|
@noindent
|
|
The following usage is sometimes equivalent:
|
|
|
|
@example
|
|
sed '@var{command-1};@var{command-2}'
|
|
@end example
|
|
|
|
but POSIX says that this use of a semicolon has undefined effect if
|
|
@var{command-1}'s verb is @samp{@{}, @samp{a}, @samp{b}, @samp{c},
|
|
@samp{i}, @samp{r}, @samp{t}, @samp{w}, @samp{:}, or @samp{#}, so you
|
|
should use semicolon only with simple scripts that do not use these
|
|
verbs.
|
|
|
|
POSIX up to the 2008 revision requires the argument of the @option{-e}
|
|
option to be a syntactically complete script. GNU @command{sed} allows
|
|
to pass multiple script fragments, each as argument of a separate
|
|
@option{-e} option, that are then combined, with newlines between the
|
|
fragments, and a future POSIX revision may allow this as well. This
|
|
approach is not portable with script fragments ending in backslash; for
|
|
example, the @command{sed} programs on Solaris 10, HP-UX 11, and AIX
|
|
don't allow splitting in this case:
|
|
|
|
@example
|
|
$ @kbd{echo a | sed -n -e 'i\}
|
|
@kbd{0'}
|
|
0
|
|
$ @kbd{echo a | sed -n -e 'i\' -e 0}
|
|
Unrecognized command: 0
|
|
@end example
|
|
|
|
@noindent
|
|
In practice, however, this technique of joining fragments
|
|
through @option{-e} works for multiple @command{sed} functions within
|
|
@samp{@{} and @samp{@}}, even if that is not specified by POSIX:
|
|
|
|
@example
|
|
@c The quote around the closing brace silences interactive zsh.
|
|
$ @kbd{echo a | sed -n -e '/a/@{' -e s/a/b/ -e p -e '@}'}
|
|
b
|
|
@end example
|
|
|
|
Commands inside @{ @} brackets are further restricted. POSIX 2008 says that
|
|
they cannot be preceded by addresses, @samp{!}, or @samp{;}, and that
|
|
each command must be followed immediately by a newline, without any
|
|
intervening blanks or semicolons. The closing bracket must be alone on
|
|
a line, other than white space preceding or following it. However, a
|
|
future version of POSIX may standardize the use of addresses within brackets.
|
|
|
|
Contrary to yet another urban legend, you may portably use @samp{&} in
|
|
the replacement part of the @code{s} command to mean ``what was
|
|
matched''. All descendants of Unix version 7 @command{sed}
|
|
(at least; we
|
|
don't have first hand experience with older @command{sed} implementations) have
|
|
supported it.
|
|
|
|
POSIX requires that you must not have any white space between
|
|
@samp{!} and the following command. It is OK to have blanks between
|
|
the address and the @samp{!}. For instance, on Solaris:
|
|
|
|
@example
|
|
$ @kbd{echo "foo" | sed -n '/bar/ ! p'}
|
|
@error{}Unrecognized command: /bar/ ! p
|
|
$ @kbd{echo "foo" | sed -n '/bar/! p'}
|
|
@error{}Unrecognized command: /bar/! p
|
|
$ @kbd{echo "foo" | sed -n '/bar/ !p'}
|
|
foo
|
|
@end example
|
|
|
|
POSIX also says that you should not combine @samp{!} and @samp{;}. If
|
|
you use @samp{!}, it is best to put it on a command that is delimited by
|
|
newlines rather than @samp{;}.
|
|
|
|
Also note that POSIX requires that the @samp{b}, @samp{t}, @samp{r}, and
|
|
@samp{w} commands be followed by exactly one space before their argument.
|
|
On the other hand, no white space is allowed between @samp{:} and the
|
|
subsequent label name.
|
|
|
|
If a sed script is specified on the command line and ends in an
|
|
@samp{a}, @samp{c}, or @samp{i} command, the last line of inserted text
|
|
should be followed by a newline. Otherwise some @command{sed}
|
|
implementations (e.g., OpenBSD 3.9) do not append a newline to the
|
|
inserted text.
|
|
|
|
Many @command{sed} implementations (e.g., Mac OS X 10.4,
|
|
OpenBSD 3.9, Solaris 10
|
|
@command{/usr/ucb/sed}) strip leading white space from the text of
|
|
@samp{a}, @samp{c}, and @samp{i} commands. Prepend a backslash to
|
|
work around this incompatibility with POSIX:
|
|
|
|
@example
|
|
$ @kbd{echo flushleft | sed 'a\}
|
|
> @kbd{ indented}
|
|
> @kbd{'}
|
|
flushleft
|
|
indented
|
|
$ @kbd{echo foo | sed 'a\}
|
|
> @kbd{\ indented}
|
|
> @kbd{'}
|
|
flushleft
|
|
indented
|
|
@end example
|
|
|
|
POSIX requires that with an empty regular expression, the last non-empty
|
|
regular expression from either an address specification or substitution
|
|
command is applied. However, busybox 1.6.1 complains when using a
|
|
substitution command with a replacement containing a back-reference to
|
|
an empty regular expression; the workaround is repeating the regular
|
|
expression.
|
|
|
|
@example
|
|
$ @kbd{echo abc | busybox sed '/a\(b\)c/ s//\1/'}
|
|
sed: No previous regexp.
|
|
$ @kbd{echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'}
|
|
b
|
|
@end example
|
|
|
|
Portable scripts should be aware of the inconsistencies and options for
|
|
handling word boundaries, as these are not specified by POSIX.
|
|
|
|
@example
|
|
\< \b [[:<:]]
|
|
Solaris 10 yes no no
|
|
Solaris XPG4 yes no error
|
|
NetBSD 5.1 no no yes
|
|
FreeBSD 9.1 no no yes
|
|
GNU yes yes error
|
|
busybox yes yes error
|
|
@end example
|
|
|
|
@item @command{sed} (@samp{t})
|
|
@c ---------------------------
|
|
@prindex @command{sed} (@samp{t})
|
|
There are two things one should remember about @samp{t} in @command{sed}.
|
|
First, @samp{t} jumps if @emph{some} substitution
|
|
succeeded, not only the immediately preceding substitution. Therefore,
|
|
always use a fake @samp{t clear} followed by a @samp{:clear} on the next
|
|
line, to reset the @samp{t} flag where needed.
|
|
|
|
Second, do not rely on @command{sed} to clear the flag at each new cycle.
|
|
|
|
For example, the following script replaces all instances of ``keep me''
|
|
with ``kept'', and replaces the contents of all lines that did not
|
|
contain ``keep me'' with ``deleted''.
|
|
|
|
@example
|
|
t clear
|
|
:clear
|
|
s/keep me/kept/g
|
|
t end
|
|
s/.*/deleted/g
|
|
:end
|
|
@end example
|
|
|
|
@item @command{sed} (@samp{w})
|
|
@c ---------------------------
|
|
@prindex @command{sed} (@samp{w})
|
|
|
|
When a script contains multiple commands to write lines to the same
|
|
output file, BusyBox @command{sed} mistakenly opens a separate output
|
|
stream for each command. This can cause one of the commands to ``win''
|
|
and the others to ``lose'', in the sense that their output is discarded.
|
|
For example:
|
|
|
|
@example
|
|
sed -n -e '
|
|
/a/w xxx
|
|
/b/w xxx
|
|
' <<EOF
|
|
a
|
|
b
|
|
EOF
|
|
@end example
|
|
|
|
This might output only @samp{a} to @file{xxx}; the @samp{b} is lost.
|
|
To avoid the problem, a portable script should contain at most one
|
|
@samp{w} or @samp{s/.../.../w} command per output file.
|
|
|
|
@item @command{sleep}
|
|
@c ------------------
|
|
@prindex @command{sleep}
|
|
Using @command{sleep} is generally portable. However, remember that
|
|
adding a @command{sleep} to work around timestamp issues, with a minimum
|
|
granularity of one second, doesn't scale well for parallel builds on
|
|
modern machines with sub-second process completion.
|
|
|
|
@item @command{sort}
|
|
@c -----------------
|
|
@prindex @command{sort}
|
|
Remember that sort order is influenced by the current locale. Inside
|
|
@file{configure}, the C locale is in effect, but in Makefile snippets,
|
|
you may need to specify @code{LC_ALL=C sort}.
|
|
|
|
@item @command{tar}
|
|
@c ----------------
|
|
@prindex @command{tar}
|
|
There are multiple file formats for @command{tar}; if you use Automake,
|
|
the macro @code{AM_INIT_AUTOMAKE} has some options controlling which
|
|
level of portability to use.
|
|
|
|
@anchor{touch}
|
|
@item @command{touch}
|
|
@c ------------------
|
|
@prindex @command{touch}
|
|
@cindex timestamp resolution
|
|
If you specify the desired timestamp (e.g., with the @option{-r}
|
|
option), older @command{touch} implementations use the @code{utime} or
|
|
@code{utimes} system call, which can result in the same kind of
|
|
timestamp truncation problems that @samp{cp -p} has.
|
|
|
|
@item @command{tr}
|
|
@c ---------------
|
|
@prindex @command{tr}
|
|
@cindex carriage return, deleting
|
|
@cindex newline, deleting
|
|
@cindex deleting carriage return
|
|
Not all versions of @command{tr} handle all backslash character escapes.
|
|
For example, Solaris 10 @command{/usr/ucb/tr} falls over, even though
|
|
Solaris contains more modern @command{tr} in other locations.
|
|
Using octal escapes is more portable for carriage returns, since
|
|
@samp{\015} is the same for both ASCII and EBCDIC, and since use of
|
|
literal carriage returns in scripts causes a number of other problems.
|
|
But for other characters, like newline, using octal escapes ties the
|
|
operation to ASCII, so it is better to use literal characters.
|
|
|
|
@example
|
|
$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\n' ; echo}
|
|
moo
|
|
light
|
|
$ @kbd{@{ echo moon; echo light; @} | /usr/bin/tr -d '\n' ; echo}
|
|
moonlight
|
|
$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\012' ; echo}
|
|
moonlight
|
|
$ @kbd{nl='}
|
|
@kbd{'; @{ echo moon; echo light; @} | /usr/ucb/tr -d "$nl" ; echo}
|
|
moonlight
|
|
@end example
|
|
|
|
Not all versions of @command{tr} recognize direct ranges of characters: at
|
|
least Solaris @command{/usr/bin/tr} still fails to do so. But you can
|
|
use @command{/usr/xpg4/bin/tr} instead, or add brackets (which in POSIX
|
|
transliterate to themselves).
|
|
|
|
@example
|
|
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z}
|
|
HAZy FAntAZy
|
|
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'}
|
|
HAZY FANTAZY
|
|
$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z}
|
|
HAZY FANTAZY
|
|
@end example
|
|
|
|
When providing two arguments, be sure the second string is at least as
|
|
long as the first.
|
|
|
|
@example
|
|
$ @kbd{echo abc | /usr/xpg4/bin/tr bc d}
|
|
adc
|
|
$ @kbd{echo abc | coreutils/tr bc d}
|
|
add
|
|
@end example
|
|
|
|
On platforms with the BusyBox tools, @command{tr} does not support the
|
|
@code{[@var{x}*@var{n}]} option syntax.
|
|
|
|
@example
|
|
$ @kbd{echo abc | tr 'abcd' '[A*4]'}
|
|
[A*
|
|
$ @kbd{echo abc | coreutils/tr 'abcd' '[A*4]'}
|
|
AAA
|
|
$ @kbd{echo xyz | tr 'a-z' '[A*]'}
|
|
]]]
|
|
$ @kbd{echo xyz | coreutils/tr 'a-z' '[A*]'}
|
|
AAA
|
|
@end example
|
|
|
|
POSIX requires @command{tr} to operate on binary files. But at least
|
|
Solaris @command{/usr/ucb/tr} and @command{/usr/bin/tr} silently discard
|
|
@code{NUL} in the input prior to doing any translation. When using
|
|
@command{tr} to process a binary file that may contain @code{NUL} bytes,
|
|
it is necessary to use @command{/usr/xpg4/bin/tr} instead, or
|
|
@command{/usr/xpg6/bin/tr} if that is available.
|
|
|
|
@example
|
|
$ @kbd{printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1}
|
|
61 62
|
|
$ @kbd{printf 'a\0b' | /usr/bin/tr x x | od -An -tx1}
|
|
61 62
|
|
$ @kbd{printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1}
|
|
61 00 62
|
|
@end example
|
|
|
|
Solaris @command{/usr/ucb/tr} additionally fails to handle @samp{\0} as the
|
|
octal escape for @code{NUL}.
|
|
|
|
@example
|
|
$ @kbd{printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1}
|
|
61 62 63
|
|
$ @kbd{printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1}
|
|
61 00 64
|
|
$ @kbd{printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1}
|
|
61 00 64
|
|
@end example
|
|
|
|
@end table
|
|
|
|
|
|
@node Portable Make
|
|
@chapter Portable Make Programming
|
|
@prindex @command{make}
|
|
@cindex Limitations of @command{make}
|
|
|
|
Writing portable makefiles is an art. Since a makefile's commands are
|
|
executed by the shell, you must consider the shell portability issues
|
|
already mentioned. However, other issues are specific to @command{make}
|
|
itself.
|
|
|
|
@menu
|
|
* $< in Ordinary Make Rules:: $< in ordinary rules
|
|
* Failure in Make Rules:: Failing portably in rules
|
|
* Command Line Prefixes:: What's at the start of makefile command lines
|
|
* Special Chars in Names:: Special characters in macro names
|
|
* Backslash-Newline-Empty:: Empty lines after backslash-newline
|
|
* Backslash-Newline Comments:: Spanning comments across line boundaries
|
|
* Macros and Submakes:: @code{make macro=value} and submakes
|
|
* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
|
|
* The Make Macro SHELL:: @code{$(SHELL)} portability issues
|
|
* Parallel Make:: Parallel @command{make} quirks
|
|
* Comments in Make Rules:: Other problems with Make comments
|
|
* Newlines in Make Rules:: Using literal newlines in rules
|
|
* Comments in Make Macros:: Other problems with Make comments in macros
|
|
* Trailing whitespace in Make Macros:: Macro substitution problems
|
|
* Command-line Macros and whitespace:: Whitespace trimming of values
|
|
* obj/ and Make:: Don't name a subdirectory @file{obj}
|
|
* make -k Status:: Exit status of @samp{make -k}
|
|
* VPATH and Make:: @code{VPATH} woes
|
|
* Single Suffix Rules:: Single suffix rules and separated dependencies
|
|
* Timestamps and Make:: Sub-second timestamp resolution
|
|
@end menu
|
|
|
|
@node $< in Ordinary Make Rules
|
|
@section @code{$<} in Ordinary Make Rules
|
|
|
|
POSIX says that the @samp{$<} construct in makefiles can be
|
|
used only in inference rules and in the @samp{.DEFAULT} rule; its
|
|
meaning in ordinary rules is unspecified. Solaris @command{make}
|
|
for instance replaces it with the empty string. OpenBSD (3.0 and
|
|
later) @command{make} diagnoses these uses and errors out.
|
|
|
|
@node Failure in Make Rules
|
|
@section Failure in Make Rules
|
|
|
|
Unless errors are being ignored
|
|
(e.g., because a makefile command line is preceded by a @samp{-} prefix),
|
|
POSIX 2008 requires that @command{make} must invoke each command with
|
|
the equivalent of a @samp{sh -e -c} subshell, which causes the
|
|
subshell to exit immediately if a subsidiary simple-command fails,
|
|
with some complicated exceptions.
|
|
Historically not all @command{make} implementations
|
|
followed this rule. For
|
|
example, the command @samp{touch T; rm -f U} may attempt to
|
|
remove @file{U} even if the @command{touch} fails, although this is not
|
|
permitted with POSIX make. One way to work around failures in simple
|
|
commands is to reword them so that they always succeed, e.g., @samp{touch
|
|
T || :; rm -f U}.
|
|
However, even this approach can run into common bugs in BSD
|
|
implementations of the @option{-e} option of @command{sh} and
|
|
@command{set} (@pxref{set, , Limitations of Shell Builtins}), so if you
|
|
are worried
|
|
about porting to buggy BSD shells it may be simpler to migrate
|
|
complicated @command{make} actions into separate scripts.
|
|
|
|
@node Command Line Prefixes
|
|
@section Makefile Command Line Prefixes
|
|
|
|
Makefile command lines can be preceded by zero or more of
|
|
the command line prefixes @samp{-}, @samp{@@}, and @samp{+},
|
|
which modify how @command{make} processes the command.
|
|
Although POSIX says these are the only command line prefixes,
|
|
some @command{make} implementations, such as Solaris @command{make},
|
|
support the additional prefixes @samp{!} and @samp{?}.
|
|
Portable makefiles should therefore avoid using these two characters at
|
|
the start of a makefile command line.
|
|
For example:
|
|
|
|
@example
|
|
mishandled-by-Solaris-make:; ! grep FIXME foo.c
|
|
portable-to-Solaris-make:; :;! grep FIXME foo.c
|
|
@end example
|
|
|
|
@node Special Chars in Names
|
|
@section Special Characters in Make Macro Names
|
|
|
|
POSIX limits macro names to nonempty strings containing only
|
|
ASCII letters and digits, @samp{.}, and @samp{_}. Many
|
|
@command{make} implementations allow a wider variety of characters, but
|
|
portable makefiles should avoid them. It is portable to start a name
|
|
with a special character, e.g., @samp{$(.FOO)}.
|
|
|
|
Some ancient @command{make} implementations don't support leading
|
|
underscores in macro names. An example is NEWS-OS 4.2R.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
_am_include = #
|
|
_am_quote =
|
|
all:; @@echo this is test
|
|
$ @kbd{make}
|
|
Make: Must be a separator on rules line 2. Stop.
|
|
$ @kbd{cat Makefile2}
|
|
am_include = #
|
|
am_quote =
|
|
all:; @@echo this is test
|
|
$ @kbd{make -f Makefile2}
|
|
this is test
|
|
@end example
|
|
|
|
@noindent
|
|
However, this problem is no longer of practical concern.
|
|
|
|
@node Backslash-Newline-Empty
|
|
@section Backslash-Newline Before Empty Lines
|
|
|
|
@c This has been seen on ia64 hpux 11.20, and on one hppa hpux 10.20,
|
|
@c but another hppa hpux 10.20 didn't have it. Bob Proulx
|
|
@c <bob@proulx.com> thinks it was in hpux 8.0 too.
|
|
On some versions of HP-UX, @command{make} reads multiple newlines
|
|
following a backslash, continuing to the next non-empty line. For
|
|
example,
|
|
|
|
@example
|
|
FOO = one \
|
|
|
|
BAR = two
|
|
|
|
test:
|
|
: FOO is "$(FOO)"
|
|
: BAR is "$(BAR)"
|
|
@end example
|
|
|
|
@noindent
|
|
shows @code{FOO} equal to @code{one BAR = two}. Other implementations
|
|
sensibly let a backslash continue only to the immediately following
|
|
line.
|
|
|
|
@node Backslash-Newline Comments
|
|
@section Backslash-Newline in Make Comments
|
|
|
|
According to POSIX, Make comments start with @code{#}
|
|
and continue until an unescaped newline is reached.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
# A = foo \
|
|
bar \
|
|
baz
|
|
|
|
all:
|
|
@@echo ok
|
|
$ @kbd{make} # GNU make
|
|
ok
|
|
@end example
|
|
|
|
@noindent
|
|
However this is not always the case. Some implementations
|
|
discard everything from @code{#} through the end of the line, ignoring any
|
|
trailing backslash.
|
|
|
|
@example
|
|
$ @kbd{pmake} # BSD make
|
|
"Makefile", line 3: Need an operator
|
|
Fatal errors encountered -- cannot continue
|
|
@end example
|
|
|
|
@noindent
|
|
Therefore, if you want to comment out a multi-line definition, prefix each
|
|
line with @code{#}, not only the first.
|
|
|
|
@example
|
|
# A = foo \
|
|
# bar \
|
|
# baz
|
|
@end example
|
|
|
|
@node Macros and Submakes
|
|
@section @code{make macro=value} and Submakes
|
|
|
|
A command-line variable definition such as @code{foo=bar} overrides any
|
|
definition of @code{foo} in a makefile. Some @command{make}
|
|
implementations (such as GNU @command{make}) propagate this
|
|
override to subsidiary invocations of @command{make}. Some other
|
|
implementations do not pass the substitution along to submakes.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
foo = foo
|
|
one:
|
|
@@printf '%s\n' $(foo)
|
|
$(MAKE) two
|
|
two:
|
|
@@printf '%s\n' $(foo)
|
|
$ @kbd{make foo=bar} # GNU make 3.79.1
|
|
bar
|
|
make two
|
|
make[1]: Entering directory `/home/adl'
|
|
bar
|
|
make[1]: Leaving directory `/home/adl'
|
|
$ @kbd{pmake foo=bar} # BSD make
|
|
bar
|
|
pmake two
|
|
foo
|
|
@end example
|
|
|
|
You have a few possibilities if you do want the @code{foo=bar} override
|
|
to propagate to submakes. One is to use the @option{-e}
|
|
option, which causes all environment variables to have precedence over
|
|
the makefile macro definitions, and declare foo as an environment
|
|
variable:
|
|
|
|
@example
|
|
$ @kbd{env foo=bar make -e}
|
|
@end example
|
|
|
|
The @option{-e} option is propagated to submakes automatically,
|
|
and since the environment is inherited between @command{make}
|
|
invocations, the @code{foo} macro is overridden in
|
|
submakes as expected.
|
|
|
|
This syntax (@code{foo=bar make -e}) is portable only when used
|
|
outside of a makefile, for instance from a script or from the
|
|
command line. When run inside a @command{make} rule, GNU
|
|
@command{make} 3.80 and prior versions forget to propagate the
|
|
@option{-e} option to submakes.
|
|
|
|
Moreover, using @option{-e} could have unexpected side effects if your
|
|
environment contains some other macros usually defined by the
|
|
makefile. (See also the note about @code{make -e} and @code{SHELL}
|
|
below.)
|
|
|
|
If you can foresee all macros that a user might want to override, then
|
|
you can propagate them to submakes manually, from your makefile:
|
|
|
|
@example
|
|
foo = foo
|
|
one:
|
|
@@printf '%s\n' $(foo)
|
|
$(MAKE) foo=$(foo) two
|
|
two:
|
|
@@printf '%s\n' $(foo)
|
|
@end example
|
|
|
|
Another way to propagate a variable to submakes in a portable way is to
|
|
expand an extra variable in every invocation of @samp{$(MAKE)} within
|
|
your makefile:
|
|
|
|
@example
|
|
foo = foo
|
|
one:
|
|
@@printf '%s\n' $(foo)
|
|
$(MAKE) $(SUBMAKEFLAGS) two
|
|
two:
|
|
@@printf '%s\n' $(foo)
|
|
@end example
|
|
|
|
Users must be aware that this technique is in use to take advantage of
|
|
it, e.g.@: with @code{make foo=bar SUBMAKEFLAGS='foo=bar'}, but it
|
|
allows any macro to be overridden. Makefiles generated by
|
|
@command{automake} use this technique, expanding @code{$(AM_MAKEFLAGS)}
|
|
on the command lines of submakes (@pxref{Subdirectories, , Automake,
|
|
automake, GNU Automake}).
|
|
|
|
@node The Make Macro MAKEFLAGS
|
|
@section The Make Macro MAKEFLAGS
|
|
@cindex @code{MAKEFLAGS} and @command{make}
|
|
@cindex @command{make} and @code{MAKEFLAGS}
|
|
|
|
POSIX requires @command{make} to use @code{MAKEFLAGS} to affect the
|
|
current and recursive invocations of make, but allows implementations
|
|
several formats for the variable. It is tricky to parse
|
|
@code{$MAKEFLAGS} to determine whether @option{-s} for silent execution
|
|
or @option{-k} for continued execution are in effect. For example, you
|
|
cannot assume that the first space-separated word in @code{$MAKEFLAGS}
|
|
contains single-letter options, since in the Cygwin version of
|
|
GNU @command{make} it is either @option{--unix} or
|
|
@option{--win32} with the second word containing single-letter options.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
all:
|
|
@@printf 'MAKEFLAGS = %s\n' '$(MAKEFLAGS)'
|
|
$ @kbd{make}
|
|
MAKEFLAGS = --unix
|
|
$ @kbd{make -k}
|
|
MAKEFLAGS = --unix -k
|
|
@end example
|
|
|
|
@node The Make Macro SHELL
|
|
@section The Make Macro @code{SHELL}
|
|
@cindex @code{SHELL} and @command{make}
|
|
@cindex @command{make} and @code{SHELL}
|
|
|
|
Many @command{make} implementations use the the @code{$(SHELL)}
|
|
macro to spawn shell processes and execute Make rules. This
|
|
is a builtin macro with a default value upplied by @command{make};
|
|
the default can be overridden by a makefile or by a command-line argument,
|
|
though not by the environment.
|
|
|
|
Other @command{make} implementations use other ways to spawn shell
|
|
processes, and the POSIX standard for @command{make} says that portable
|
|
makefiles should neither define nor use the @code{$(SHELL)} macro.
|
|
|
|
Despite this prohibition, in practice it does not hurt to define and
|
|
then possibly use @code{SHELL} in your makefiles and in some cases it
|
|
can help your builds use a better shell to spawn shell processes.
|
|
So it's a good idea to define @code{SHELL} in
|
|
your makefiles. If you use Autoconf, you can use
|
|
its standard output variable @code{SHELL} as follows:
|
|
|
|
@example
|
|
SHELL = @@SHELL@@
|
|
@end example
|
|
|
|
@noindent
|
|
If you use Automake, this is done for you.
|
|
|
|
Do not force @code{SHELL = /bin/sh} because that is not correct
|
|
everywhere. Remember, @file{/bin/sh} is not POSIX compliant on some
|
|
systems, such as Solaris 10.
|
|
Additionally, DJGPP lacks @code{/bin/sh}, and when its
|
|
GNU @command{make} port sees such a setting it enters a
|
|
special emulation mode where features like pipes and redirections are
|
|
emulated on top of DOS's @command{command.com}. Unfortunately this
|
|
emulation is incomplete; for instance it does not handle command
|
|
substitutions. Using @code{@@SHELL@@} means that your makefile will
|
|
benefit from the same improved shell, such as @command{bash} or
|
|
@command{ksh}, that was discovered during @command{configure}, so that
|
|
you aren't fighting two different sets of shell bugs between the two
|
|
contexts.
|
|
|
|
Do not rely on whether @command{make}'s @code{SHELL} settings are
|
|
exported to subprocesses, as implementations differ:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
all:
|
|
@@printf '%s\n' '$(SHELL)'
|
|
@@printenv SHELL
|
|
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # BSD make, AIX make
|
|
/bin/ksh
|
|
/bin/ksh
|
|
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # GNU make
|
|
/bin/ksh
|
|
sh
|
|
@end example
|
|
|
|
@node Parallel Make
|
|
@section Parallel Make
|
|
@cindex Parallel @command{make}
|
|
|
|
Support for parallel execution in @command{make} implementation varies.
|
|
Generally, using GNU make is your best bet.
|
|
|
|
When NetBSD or FreeBSD @command{make} are run in parallel mode, they will
|
|
reuse the same shell for multiple commands within one recipe. This can
|
|
have various unexpected consequences. For example, changes of directories
|
|
or variables persist between recipes, so that:
|
|
|
|
@example
|
|
all:
|
|
@@var=value; cd /; pwd; echo $$var; echo $$$$
|
|
@@pwd; echo $$var; echo $$$$
|
|
@end example
|
|
|
|
@noindent
|
|
may output the following with @code{make -j1}, at least on NetBSD up to
|
|
5.1 and FreeBSD up to 8.2:
|
|
|
|
@example
|
|
/
|
|
value
|
|
32235
|
|
/
|
|
value
|
|
32235
|
|
@end example
|
|
|
|
@noindent
|
|
while without @option{-j1}, or with @option{-B}, the output looks less
|
|
surprising:
|
|
|
|
@example
|
|
/
|
|
value
|
|
32238
|
|
/tmp
|
|
|
|
32239
|
|
@end example
|
|
|
|
@noindent
|
|
Another consequence is that, if one command in a recipe uses @code{exit 0}
|
|
to indicate a successful exit, the shell will be gone and the remaining
|
|
commands of this recipe will not be executed.
|
|
|
|
The BSD @command{make} implementations, when run in parallel mode,
|
|
will also pass the @command{Makefile} recipes to the shell through
|
|
its standard input, thus making it unusable from the recipes:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
read:
|
|
@@read line; echo LINE: $$line
|
|
@c $$ @c restore font-lock
|
|
$ @kbd{echo foo | make read}
|
|
LINE: foo
|
|
$ @kbd{echo foo | make -j1 read} # NetBSD 5.1 and FreeBSD 8.2
|
|
LINE:
|
|
@end example
|
|
|
|
@noindent
|
|
Moreover, when FreeBSD @command{make} (up at least to 8.2) is run in
|
|
parallel mode, it implements the @code{@@} and @code{-} ``recipe
|
|
modifiers'' by dynamically modifying the active shell flags. This
|
|
behavior has the effects of potentially clobbering the exit status
|
|
of recipes silenced with the @code{@@} modifier if they also unset
|
|
the @option{errexit} shell flag, and of mangling the output in
|
|
unexpected ways:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
a:
|
|
@@echo $$-; set +e; false
|
|
b:
|
|
-echo $$-; false; echo set -
|
|
$ @kbd{make a; echo status: $?}
|
|
ehBc
|
|
*** Error code 1
|
|
status: 1
|
|
$ @kbd{make -j1 a; echo status: $?}
|
|
ehB
|
|
status: 0
|
|
$ @kbd{make b}
|
|
echo $-; echo set -
|
|
hBc
|
|
set -
|
|
$ @kbd{make -j1 b}
|
|
echo $-; echo hvB
|
|
@end example
|
|
|
|
@noindent
|
|
You can avoid all these issues by using the @option{-B} option to enable
|
|
compatibility semantics. However, that will effectively also disable
|
|
all parallelism as that will cause prerequisites to be updated in the
|
|
order they are listed in a rule.
|
|
|
|
Some make implementations (among them, FreeBSD @command{make}, NetBSD
|
|
@command{make}, and Solaris @command{dmake}), when invoked with a
|
|
@option{-j@var{N}} option, connect the standard output and standard
|
|
error of all their child processes to pipes or temporary regular
|
|
files. This can lead to subtly different semantics in the behavior
|
|
of the spawned processes. For example, even if the @command{make}
|
|
standard output is connected to a tty, the recipe command will not be:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
all:
|
|
@@test -t 1 && echo "Is a tty" || echo "Is not a tty"
|
|
$ @kbd{make -j 2} # FreeBSD 8.2 make
|
|
Is not a tty
|
|
$ @kbd{make -j 2} # NetBSD 5.1 make
|
|
--- all ---
|
|
Is not a tty
|
|
$ @kbd{dmake -j 2} # Solaris 10 dmake
|
|
@var{hostname} --> 1 job
|
|
@var{hostname} --> Job output
|
|
Is not a tty
|
|
@end example
|
|
|
|
@noindent
|
|
On the other hand:
|
|
|
|
@example
|
|
$ @kbd{make -j 2} # GNU make, Heirloom make
|
|
Is a tty
|
|
@end example
|
|
|
|
@noindent
|
|
The above examples also show additional status output produced in parallel
|
|
mode for targets being updated by Solaris @command{dmake} and NetBSD
|
|
@command{make} (but @emph{not} by FreeBSD @command{make}).
|
|
|
|
Furthermore, parallel runs of those @command{make} implementations will
|
|
route standard error from commands that they spawn into their own
|
|
standard output, and may remove leading whitespace from output lines.
|
|
|
|
|
|
@node Comments in Make Rules
|
|
@section Comments in Make Rules
|
|
@cindex Comments in @file{Makefile} rules
|
|
@cindex @file{Makefile} rules and comments
|
|
|
|
Do not try to put comments (lines beginning with @samp{#}) in a rule, as
|
|
they end the rule. It is OK for a rule line to start with a tab
|
|
followed by @samp{#}, as a comment passed to a shell that does nothing.
|
|
|
|
To use the @samp{#} character in a command, put it in a rule not a
|
|
macro, as the character cannot portably appear in macros
|
|
(@pxref{Comments in Make Macros}). So for example, assuming the output
|
|
variable @code{COMMENT_CHAR} stands for @samp{#}, the following replaces
|
|
@samp{@@COMMENT_CHAR@@} by @samp{#} in a generated header:
|
|
|
|
@example
|
|
foo.h: foo.h.in
|
|
sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \
|
|
'$(srcdir)/foo.h.in' > $@@
|
|
@end example
|
|
|
|
The funny shell quoting avoids a substitution at @command{config.status}
|
|
run time of the left-hand side of the @command{sed} @samp{s} command.
|
|
|
|
@node Newlines in Make Rules
|
|
@section Newlines in Make Rules
|
|
@cindex Newlines in @file{Makefile} rules
|
|
@cindex @file{Makefile} rules and newlines
|
|
|
|
In shell scripts, newlines can be used inside string literals. But in
|
|
the shell statements of @file{Makefile} rules, this is not possible:
|
|
a newline not preceded by a backslash separates commands, whereas a
|
|
newline preceded by a backslash becomes part of the shell statement.
|
|
So, how can a newline be used in a string literal?
|
|
|
|
The trick is to set up a shell variable @code{nl} that contains a newline.
|
|
For example, the following uses a multi-line @samp{sed} expression that
|
|
appends an empty line after every line of a file:
|
|
|
|
@example
|
|
output: input
|
|
eval "$$(printf 'nl="\n"\n')"; \
|
|
sed "a\\$$nl" input >$@@
|
|
@end example
|
|
|
|
@node Comments in Make Macros
|
|
@section Comments in Make Macros
|
|
@cindex Comments in @file{Makefile} macros
|
|
@cindex @file{Makefile} macros and comments
|
|
|
|
In macro definitions, text from @samp{#} until line end is ignored,
|
|
which has the unfortunate effect of disallowing @samp{#} even in quotes.
|
|
Thus, the following does not work:
|
|
|
|
@example
|
|
CPPFLAGS = "-DCOMMENT_CHAR='#'"
|
|
@end example
|
|
|
|
@noindent
|
|
as @samp{CPPFLAGS} is expanded to @samp{"-DCOMMENT_CHAR='}.
|
|
|
|
GNU @command{make}, when not in POSIX mode, lets you put
|
|
@samp{#} into a macro value by escaping it with a backslash, i.e.,
|
|
@samp{\#}. However, this usage is not portable.
|
|
@xref{Comments in Make Rules}, for a portable alternative.
|
|
|
|
Even without quoting involved, comments can have surprising effects,
|
|
because the whitespace before them is part of the variable value:
|
|
|
|
@example
|
|
foo = bar # trailing comment
|
|
print: ; @@echo "$(foo)."
|
|
@end example
|
|
|
|
@noindent
|
|
prints @samp{bar .}, which is usually not intended, and can expose
|
|
@command{make} bugs as described below.
|
|
|
|
@node Trailing whitespace in Make Macros
|
|
@section Trailing whitespace in Make Macros
|
|
@cindex whitespace in @file{Makefile} macros
|
|
@cindex @file{Makefile} macros and whitespace
|
|
|
|
GNU @command{make} 3.80 mistreats trailing whitespace in macro
|
|
substitutions and appends another spurious suffix:
|
|
|
|
@example
|
|
empty =
|
|
foo = bar $(empty)
|
|
print: ; @@echo $(foo:=.test)
|
|
@end example
|
|
|
|
@noindent
|
|
prints @samp{bar.test .test}.
|
|
|
|
BSD and Solaris @command{make} implementations do not honor trailing
|
|
whitespace in macro definitions as POSIX requires:
|
|
|
|
@example
|
|
foo = bar # Note the space after "bar".
|
|
print: ; @@echo $(foo)t
|
|
@end example
|
|
|
|
@noindent
|
|
prints @samp{bart} instead of @samp{bar t}. To work around this, you
|
|
can use a helper macro as in the previous example.
|
|
|
|
|
|
@node Command-line Macros and whitespace
|
|
@section Command-line Macros and whitespace
|
|
@cindex whitespace in command-line macros
|
|
@cindex command-line, macros set on
|
|
@cindex environment, macros set from
|
|
|
|
Some @command{make} implementations may strip trailing whitespace off
|
|
of macros set on the command line in addition to leading whitespace.
|
|
Further, some may strip leading whitespace off of macros set from
|
|
environment variables:
|
|
|
|
@example
|
|
$ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' |
|
|
foo=' f f ' make -f - bar=' b b '}
|
|
x f f xb b x # AIX, BSD, GNU make
|
|
xf f xb b x # HP-UX
|
|
x f f xb bx # Solaris make
|
|
@end example
|
|
|
|
|
|
@node obj/ and Make
|
|
@section The @file{obj/} Subdirectory and Make
|
|
@cindex @file{obj/}, subdirectory
|
|
@cindex BSD @command{make} and @file{obj/}
|
|
|
|
Never name one of your subdirectories @file{obj/} if you don't like
|
|
surprises.
|
|
|
|
If an @file{obj/} directory exists, BSD @command{make} enters it
|
|
before reading the makefile. Hence the makefile in the
|
|
current directory is not read.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
all:
|
|
echo Hello
|
|
$ @kbd{cat obj/Makefile}
|
|
all:
|
|
echo World
|
|
$ @kbd{make} # GNU make
|
|
echo Hello
|
|
Hello
|
|
$ @kbd{pmake} # BSD make
|
|
echo World
|
|
World
|
|
@end example
|
|
|
|
@node make -k Status
|
|
@section Exit Status of @code{make -k}
|
|
@cindex @code{make -k}
|
|
|
|
Do not rely on the exit status of @code{make -k}. Some implementations
|
|
reflect whether they encountered an error in their exit status; other
|
|
implementations always succeed.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
all:
|
|
false
|
|
$ @kbd{make -k; echo exit status: $?} # GNU make
|
|
false
|
|
make: *** [all] Error 1
|
|
exit status: 2
|
|
$ @kbd{pmake -k; echo exit status: $?} # BSD make
|
|
false
|
|
*** Error code 1 (continuing)
|
|
exit status: 0
|
|
@end example
|
|
|
|
@node VPATH and Make
|
|
@section @code{VPATH} and Make
|
|
@cindex @code{VPATH}
|
|
|
|
POSIX does not specify the semantics of @code{VPATH}. Typically,
|
|
@command{make} supports @code{VPATH}, but its implementation is not
|
|
consistent.
|
|
|
|
Autoconf and Automake support makefiles whose usages of @code{VPATH} are
|
|
portable to recent-enough popular implementations of @command{make}, but
|
|
to keep the resulting makefiles portable, a package's makefile
|
|
prototypes must take the following issues into account. These issues
|
|
are complicated and are often poorly understood, and installers who use
|
|
@code{VPATH} should expect to find many bugs in this area. If you use
|
|
@code{VPATH}, the simplest way to avoid these portability bugs is to
|
|
stick with GNU @command{make}, since it is the most
|
|
commonly-used @command{make} among Autoconf users.
|
|
|
|
Here are some known issues with some @code{VPATH}
|
|
implementations.
|
|
|
|
@menu
|
|
* Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts
|
|
* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
|
|
* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
|
|
* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
|
|
* Make Target Lookup:: More details about @code{VPATH} lookup
|
|
@end menu
|
|
|
|
@node Variables listed in VPATH
|
|
@subsection Variables listed in @code{VPATH}
|
|
@cindex @code{VPATH} and variables
|
|
@cindex variables and @code{VPATH}
|
|
|
|
Do not set @code{VPATH} to the value of another variable, for example
|
|
@samp{VPATH = $(srcdir)}, because some ancient versions of
|
|
@command{make} do not do variable substitutions on the value of
|
|
@code{VPATH}. For example, use this
|
|
|
|
@example
|
|
srcdir = @@srcdir@@
|
|
VPATH = @@srcdir@@
|
|
@end example
|
|
|
|
@noindent
|
|
rather than @samp{VPATH = $(srcdir)}. Note that with GNU
|
|
Automake, there is no need to set this yourself.
|
|
|
|
@node VPATH and Double-colon
|
|
@subsection @code{VPATH} and Double-colon Rules
|
|
@cindex @code{VPATH} and double-colon rules
|
|
@cindex double-colon rules and @code{VPATH}
|
|
|
|
With ancient versions of Sun @command{make},
|
|
any assignment to @code{VPATH} causes @command{make} to execute only
|
|
the first set of double-colon rules.
|
|
However, this problem is no longer of practical concern.
|
|
|
|
@node $< in Explicit Rules
|
|
@subsection @code{$<} Not Supported in Explicit Rules
|
|
@cindex explicit rules, @code{$<}, and @code{VPATH}
|
|
@cindex @code{$<}, explicit rules, and @code{VPATH}
|
|
@cindex @code{VPATH}, explicit rules, and @code{$<}
|
|
|
|
Using @code{$<} in explicit rules is not portable.
|
|
The prerequisite file must be named explicitly in the rule. If you want
|
|
to find the prerequisite via a @code{VPATH} search, you have to code the
|
|
whole thing manually. @xref{Build Directories}.
|
|
|
|
@node Automatic Rule Rewriting
|
|
@subsection Automatic Rule Rewriting
|
|
@cindex @code{VPATH} and automatic rule rewriting
|
|
@cindex automatic rule rewriting and @code{VPATH}
|
|
|
|
Some @command{make} implementations, such as Solaris,
|
|
search for prerequisites in @code{VPATH} and
|
|
then rewrite each occurrence as a plain word in the rule.
|
|
For instance:
|
|
|
|
@example
|
|
# This isn't portable to GNU make.
|
|
VPATH = ../pkg/src
|
|
f.c: if.c
|
|
cp if.c f.c
|
|
@end example
|
|
|
|
@noindent
|
|
executes @code{cp ../pkg/src/if.c f.c} if @file{if.c} is
|
|
found in @file{../pkg/src}.
|
|
|
|
However, this rule leads to real problems in practice. For example, if
|
|
the source directory contains an ordinary file named @file{test} that is
|
|
used in a dependency, Solaris @command{make} rewrites commands like
|
|
@samp{if test -r foo; @dots{}} to @samp{if ../pkg/src/test -r foo;
|
|
@dots{}}, which is typically undesirable. In fact, @command{make} is
|
|
completely unaware of shell syntax used in the rules, so the VPATH
|
|
rewrite can potentially apply to @emph{any} whitespace-separated word
|
|
in a rule, including shell variables, functions, and keywords.
|
|
|
|
@example
|
|
$ @kbd{mkdir build}
|
|
$ @kbd{cd build}
|
|
$ @kbd{cat > Makefile <<'END'}
|
|
VPATH = ..
|
|
all: arg func for echo
|
|
func () @{ for arg in "$$@@"; do echo $$arg; done; @}; \
|
|
func "hello world"
|
|
END
|
|
$ @kbd{touch ../arg ../func ../for ../echo}
|
|
$ @kbd{make}
|
|
../func () @{ ../for ../arg in "$@@"; do ../echo $arg; done; @}; \
|
|
../func "hello world"
|
|
sh: syntax error at line 1: `do' unexpected
|
|
*** Error code 2
|
|
@end example
|
|
|
|
@noindent
|
|
To avoid this problem, portable makefiles should never mention a source
|
|
file or dependency whose name is that of a shell keyword like @file{for}
|
|
or @file{until}, a shell command like @command{cat} or @command{gcc} or
|
|
@command{test}, or a shell function or variable used in the corresponding
|
|
@command{Makefile} recipe.
|
|
|
|
Because of these problems GNU @command{make} and many other @command{make}
|
|
implementations do not rewrite commands, so portable makefiles should
|
|
search @code{VPATH} manually. It is tempting to write this:
|
|
|
|
@smallexample
|
|
# This isn't portable to Solaris make.
|
|
VPATH = ../pkg/src
|
|
f.c: if.c
|
|
cp `test -f if.c || echo $(VPATH)/`if.c f.c
|
|
@end smallexample
|
|
|
|
@noindent
|
|
However, the ``prerequisite rewriting'' still applies here. So if
|
|
@file{if.c} is in @file{../pkg/src}, Solaris @command{make}
|
|
executes
|
|
|
|
@smallexample
|
|
cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
|
|
@end smallexample
|
|
|
|
@noindent
|
|
which reduces to
|
|
|
|
@example
|
|
cp if.c f.c
|
|
@end example
|
|
|
|
@noindent
|
|
and thus fails. Oops.
|
|
|
|
A simple workaround, and good practice anyway, is to use @samp{$?} and
|
|
@samp{$@@} when possible:
|
|
|
|
@smallexample
|
|
VPATH = ../pkg/src
|
|
f.c: if.c
|
|
cp $? $@@
|
|
@end smallexample
|
|
|
|
@noindent
|
|
but this does not generalize well to commands with multiple
|
|
prerequisites. A more general workaround is to rewrite the rule so that
|
|
the prerequisite @file{if.c} never appears as a plain word. For
|
|
example, these three rules would be safe, assuming @file{if.c} is in
|
|
@file{../pkg/src} and the other files are in the working directory:
|
|
|
|
@smallexample
|
|
VPATH = ../pkg/src
|
|
f.c: if.c f1.c
|
|
cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@@
|
|
g.c: if.c g1.c
|
|
cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@@
|
|
h.c: if.c h1.c
|
|
cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@@
|
|
@end smallexample
|
|
|
|
Things get worse when your prerequisites are in a macro.
|
|
|
|
@example
|
|
VPATH = ../pkg/src
|
|
HEADERS = f.h g.h h.h
|
|
install-HEADERS: $(HEADERS)
|
|
for i in $(HEADERS); do \
|
|
$(INSTALL) -m 644 \
|
|
`test -f $$i || echo $(VPATH)/`$$i \
|
|
$(DESTDIR)$(includedir)/$$i; \
|
|
@c $$ restore font-lock
|
|
done
|
|
@end example
|
|
|
|
The above @code{install-HEADERS} rule is not Solaris-proof because @code{for
|
|
i in $(HEADERS);} is expanded to @code{for i in f.h g.h h.h;}
|
|
where @code{f.h} and @code{g.h} are plain words and are hence
|
|
subject to @code{VPATH} adjustments.
|
|
|
|
If the three files are in @file{../pkg/src}, the rule is run as:
|
|
|
|
@example
|
|
for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \
|
|
install -m 644 \
|
|
`test -f $i || echo ../pkg/src/`$i \
|
|
/usr/local/include/$i; \
|
|
done
|
|
@end example
|
|
|
|
where the two first @command{install} calls fail. For instance,
|
|
consider the @code{f.h} installation:
|
|
|
|
@example
|
|
install -m 644 \
|
|
`test -f ../pkg/src/f.h || \
|
|
echo ../pkg/src/ \
|
|
`../pkg/src/f.h \
|
|
/usr/local/include/../pkg/src/f.h;
|
|
@end example
|
|
|
|
@noindent
|
|
It reduces to:
|
|
|
|
@example
|
|
install -m 644 \
|
|
../pkg/src/f.h \
|
|
/usr/local/include/../pkg/src/f.h;
|
|
@end example
|
|
|
|
Note that the manual @code{VPATH} search did not cause any problems here;
|
|
however this command installs @file{f.h} in an incorrect directory.
|
|
|
|
Trying to quote @code{$(HEADERS)} in some way, as we did for
|
|
@code{foo.c} a few makefiles ago, does not help:
|
|
|
|
@example
|
|
install-HEADERS: $(HEADERS)
|
|
headers='$(HEADERS)'; \
|
|
for i in $$headers; do \
|
|
$(INSTALL) -m 644 \
|
|
`test -f $$i || echo $(VPATH)/`$$i \
|
|
$(DESTDIR)$(includedir)/$$i; \
|
|
done
|
|
@end example
|
|
|
|
Now, @code{headers='$(HEADERS)'} macro-expands to:
|
|
|
|
@example
|
|
headers='f.h g.h h.h'
|
|
@end example
|
|
|
|
@noindent
|
|
but @code{g.h} is still a plain word. (As an aside, the idiom
|
|
@code{headers='$(HEADERS)'; for i in $$headers;} is a good
|
|
idea if @code{$(HEADERS)} can be empty, because some shells diagnose a
|
|
syntax error on @code{for i in;}.)
|
|
|
|
One workaround is to strip this unwanted @file{../pkg/src/} prefix manually:
|
|
|
|
@example
|
|
VPATH = ../pkg/src
|
|
HEADERS = f.h g.h h.h
|
|
install-HEADERS: $(HEADERS)
|
|
headers='$(HEADERS)'; \
|
|
for i in $$headers; do \
|
|
i=`expr "$$i" : '$(VPATH)/\(.*\)'`;
|
|
$(INSTALL) -m 644 \
|
|
`test -f $$i || echo $(VPATH)/`$$i \
|
|
$(DESTDIR)$(includedir)/$$i; \
|
|
@c $$ restore font-lock
|
|
done
|
|
@end example
|
|
|
|
@noindent
|
|
Automake does something similar.
|
|
|
|
@node Make Target Lookup
|
|
@subsection Make Target Lookup
|
|
@cindex @code{VPATH}, resolving target pathnames
|
|
|
|
GNU @command{make} uses a complex algorithm to decide when it
|
|
should use files found via a @code{VPATH} search. @xref{Search
|
|
Algorithm, , How Directory Searches are Performed, make, The GNU Make
|
|
Manual}.
|
|
|
|
If a target needs to be rebuilt, GNU @command{make} discards the
|
|
file name found during the @code{VPATH} search for this target, and
|
|
builds the file locally using the file name given in the makefile.
|
|
If a target does not need to be rebuilt, GNU @command{make} uses the
|
|
file name found during the @code{VPATH} search.
|
|
|
|
Other @command{make} implementations, like NetBSD @command{make}, are
|
|
easier to describe: the file name found during the @code{VPATH} search
|
|
is used whether the target needs to be rebuilt or not. Therefore
|
|
new files are created locally, but existing files are updated at their
|
|
@code{VPATH} location.
|
|
|
|
OpenBSD and FreeBSD @command{make}, however,
|
|
never perform a
|
|
@code{VPATH} search for a dependency that has an explicit rule.
|
|
This is extremely annoying.
|
|
|
|
When attempting a @code{VPATH} build for an autoconfiscated package
|
|
(e.g., @code{mkdir build && cd build && ../configure}), this means
|
|
GNU
|
|
@command{make} builds everything locally in the @file{build}
|
|
directory, while BSD @command{make} builds new files locally and
|
|
updates existing files in the source directory.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
VPATH = ..
|
|
all: foo.x bar.x
|
|
foo.x bar.x: newer.x
|
|
@@echo Building $@@
|
|
$ @kbd{touch ../bar.x}
|
|
$ @kbd{touch ../newer.x}
|
|
$ @kbd{make} # GNU make
|
|
Building foo.x
|
|
Building bar.x
|
|
$ @kbd{pmake} # NetBSD make
|
|
Building foo.x
|
|
Building ../bar.x
|
|
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
|
Building foo.x
|
|
Building bar.x
|
|
$ @kbd{make} # GNU make
|
|
Building foo.x
|
|
$ @kbd{pmake} # NetBSD make
|
|
Building foo.x
|
|
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
|
Building foo.x
|
|
Building bar.x
|
|
@end example
|
|
|
|
Note how NetBSD @command{make} updates @file{../bar.x} in its
|
|
VPATH location, and how FreeBSD and OpenBSD
|
|
@command{make} always
|
|
update @file{bar.x}, even when @file{../bar.x} is up to date.
|
|
|
|
Another point worth mentioning is that once GNU @command{make} has
|
|
decided to ignore a @code{VPATH} file name (e.g., it ignored
|
|
@file{../bar.x} in the above example) it continues to ignore it when
|
|
the target occurs as a prerequisite of another rule.
|
|
|
|
The following example shows that GNU @command{make} does not look up
|
|
@file{bar.x} in @code{VPATH} before performing the @code{.x.y} rule,
|
|
because it ignored the @code{VPATH} result of @file{bar.x} while running
|
|
the @code{bar.x: newer.x} rule.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
VPATH = ..
|
|
all: bar.y
|
|
bar.x: newer.x
|
|
@@echo Building $@@
|
|
.SUFFIXES: .x .y
|
|
.x.y:
|
|
cp $< $@@
|
|
$ @kbd{touch ../bar.x}
|
|
$ @kbd{touch ../newer.x}
|
|
$ @kbd{make} # GNU make
|
|
Building bar.x
|
|
cp bar.x bar.y
|
|
cp: cannot stat 'bar.x': No such file or directory
|
|
make: *** [bar.y] Error 1
|
|
$ @kbd{pmake} # NetBSD make
|
|
Building ../bar.x
|
|
cp ../bar.x bar.y
|
|
$ @kbd{rm bar.y}
|
|
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
|
echo Building bar.x
|
|
cp bar.x bar.y
|
|
cp: cannot stat 'bar.x': No such file or directory
|
|
*** Error code 1
|
|
@end example
|
|
|
|
Note that if you drop away the command from the @code{bar.x: newer.x}
|
|
rule, GNU @command{make} magically starts to work: it
|
|
knows that @code{bar.x} hasn't been updated, therefore it doesn't
|
|
discard the result from @code{VPATH} (@file{../bar.x}) in succeeding
|
|
uses. FreeBSD and OpenBSD still don't work, though.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
VPATH = ..
|
|
all: bar.y
|
|
bar.x: newer.x
|
|
.SUFFIXES: .x .y
|
|
.x.y:
|
|
cp $< $@@
|
|
$ @kbd{touch ../bar.x}
|
|
$ @kbd{touch ../newer.x}
|
|
$ @kbd{make} # GNU make
|
|
cp ../bar.x bar.y
|
|
$ @kbd{rm bar.y}
|
|
$ @kbd{pmake} # NetBSD make
|
|
cp ../bar.x bar.y
|
|
$ @kbd{rm bar.y}
|
|
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
|
cp bar.x bar.y
|
|
cp: cannot stat 'bar.x': No such file or directory
|
|
*** Error code 1
|
|
@end example
|
|
|
|
It seems the sole solution that would please every @command{make}
|
|
implementation is to never rely on @code{VPATH} searches for targets.
|
|
In other words, @code{VPATH} should be reserved to sources that are not built.
|
|
|
|
|
|
@node Single Suffix Rules
|
|
@section Single Suffix Rules and Separated Dependencies
|
|
@cindex Single Suffix Inference Rule
|
|
@cindex Rule, Single Suffix Inference
|
|
A @dfn{Single Suffix Rule} is basically a usual suffix (inference) rule
|
|
(@samp{.from.to:}), but which @emph{destination} suffix is empty
|
|
(@samp{.from:}).
|
|
|
|
@cindex Separated Dependencies
|
|
@dfn{Separated dependencies} simply refers to listing the prerequisite
|
|
of a target, without defining a rule. Usually one can list on the one
|
|
hand side, the rules, and on the other hand side, the dependencies.
|
|
|
|
Solaris @command{make} does not support separated dependencies for
|
|
targets defined by single suffix rules:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
.SUFFIXES: .in
|
|
foo: foo.in
|
|
.in:
|
|
cp $< $@@
|
|
$ @kbd{touch foo.in}
|
|
$ @kbd{make}
|
|
$ @kbd{ls}
|
|
Makefile foo.in
|
|
@end example
|
|
|
|
@noindent
|
|
while GNU Make does:
|
|
|
|
@example
|
|
$ @kbd{gmake}
|
|
cp foo.in foo
|
|
$ @kbd{ls}
|
|
Makefile foo foo.in
|
|
@end example
|
|
|
|
Note it works without the @samp{foo: foo.in} dependency.
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
.SUFFIXES: .in
|
|
.in:
|
|
cp $< $@@
|
|
$ @kbd{make foo}
|
|
cp foo.in foo
|
|
@end example
|
|
|
|
@noindent
|
|
and it works with double suffix inference rules:
|
|
|
|
@example
|
|
$ @kbd{cat Makefile}
|
|
foo.out: foo.in
|
|
.SUFFIXES: .in .out
|
|
.in.out:
|
|
cp $< $@@
|
|
$ @kbd{make}
|
|
cp foo.in foo.out
|
|
@end example
|
|
|
|
As a result, in such a case, you have to write target rules.
|
|
|
|
@node Timestamps and Make
|
|
@section Timestamp Resolution and Make
|
|
@cindex timestamp resolution
|
|
Traditionally, file timestamps had 1-second resolution, and
|
|
@command{make} used those timestamps to determine whether one file was
|
|
newer than the other. However, many modern file systems have
|
|
timestamps with 1-nanosecond resolution. Some @command{make}
|
|
implementations look at the entire timestamp; others ignore the
|
|
fractional part, which can lead to incorrect results. Normally this
|
|
is not a problem, but in some extreme cases you may need to use tricks
|
|
like @samp{sleep 1} to work around timestamp truncation bugs.
|
|
|
|
Commands like @samp{cp -p} and @samp{touch -r} typically do not copy
|
|
file timestamps to their full resolutions (@pxref{touch, , Limitations of Usual
|
|
Tools}). Hence you should be wary of rules like this:
|
|
|
|
@example
|
|
dest: src
|
|
cp -p src dest
|
|
@end example
|
|
|
|
as @file{dest} often appears to be older than @file{src} after the
|
|
timestamp is truncated, and this can cause @command{make} to do
|
|
needless rework the next time it is invoked. To work around this
|
|
problem, you can use a timestamp file, e.g.:
|
|
|
|
@example
|
|
dest-stamp: src
|
|
cp -p src dest
|
|
echo >dest-stamp
|
|
@end example
|
|
|
|
Apart from timestamp resolution, there are also differences in handling
|
|
equal timestamps. HP-UX @command{make} updates targets if it has the
|
|
same timestamp as one of its prerequisites, in violation of POSIX rules.
|
|
|
|
This can cause spurious rebuilds for repeated runs of @command{make}.
|
|
This in turn can cause @command{make} to fail if it tries to rebuild
|
|
generated files in a possibly read-only source tree with tools not
|
|
present on the end-user machine. Use GNU @command{make} instead.
|
|
|
|
|
|
|
|
@c ======================================== Portable C and C++ Programming
|
|
|
|
@node Portable C and C++
|
|
@chapter Portable C and C++ Programming
|
|
@cindex Portable C and C++ programming
|
|
|
|
C and C++ programs often use low-level features of the underlying
|
|
system, and therefore are often more difficult to make portable to other
|
|
platforms.
|
|
|
|
Several standards have been developed to help make your programs more
|
|
portable. If you write programs with these standards in mind, you can
|
|
have greater confidence that your programs work on a wide variety
|
|
of systems.
|
|
@ifhtml
|
|
@uref{https://@/gcc.gnu.org/@/onlinedocs/@/gcc/@/Standards.html, Language
|
|
Standards Supported by GCC}
|
|
@end ifhtml
|
|
@ifnothtml
|
|
@xref{Standards, , Language Standards Supported by
|
|
GCC, gcc, Using the GNU Compiler Collection
|
|
(GCC)},
|
|
@end ifnothtml
|
|
for a list of C-related standards. Many programs also assume the
|
|
@uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX standard}.
|
|
|
|
@cindex K&R C
|
|
@cindex C89, C99, C11, C17, and C23
|
|
The first widely used C variant was K&R C, which predates any C
|
|
standard. K&R C compilers are no longer of practical interest, though,
|
|
and Autoconf assumes at least C89, the first C standard,
|
|
which is sometimes called ``C90'' due to a delay in standardization.
|
|
C has since gone through the standards C99, C11, C17, and C23, and
|
|
Autoconf is compatible with all these standards.
|
|
|
|
Program portability is a huge topic, and this section can only briefly
|
|
introduce common pitfalls. @xref{System Portability, , Portability
|
|
between System Types, standards, The GNU Coding Standards}, for
|
|
more information.
|
|
|
|
@menu
|
|
* Varieties of Unportability:: How to make your programs unportable
|
|
* Integer Overflow:: When integers get too large
|
|
* Preprocessor Arithmetic:: @code{#if} expression problems
|
|
* Null Pointers:: Properties of null pointers
|
|
* Buffer Overruns:: Subscript errors and the like
|
|
* Volatile Objects:: @code{volatile} and signals
|
|
* Floating Point Portability:: Portable floating-point arithmetic
|
|
* Exiting Portably:: Exiting and the exit status
|
|
@end menu
|
|
|
|
@node Varieties of Unportability
|
|
@section Varieties of Unportability
|
|
@cindex portability
|
|
|
|
Autoconf tests and ordinary programs often need to test what is allowed
|
|
on a system, and therefore they may need to deliberately exceed the
|
|
boundaries of what the standards allow, if only to see whether an
|
|
optional feature is present. When you write such a program, you should
|
|
keep in mind the difference between constraints, unspecified behavior,
|
|
and undefined behavior.
|
|
|
|
In C, a @dfn{constraint} is a rule that the compiler must enforce. An
|
|
example constraint is that C programs must not declare a bit-field with
|
|
negative width. Tests can therefore reliably assume that programs with
|
|
negative-width bit-fields are rejected by a compiler that conforms
|
|
to the standard.
|
|
|
|
@dfn{Unspecified behavior} is valid behavior, where the standard allows
|
|
multiple possibilities. For example, the order of evaluation of
|
|
function arguments is unspecified. Some unspecified behavior is
|
|
@dfn{implementation-defined}, i.e., documented by the implementation,
|
|
but since Autoconf tests cannot read the documentation they cannot
|
|
distinguish between implementation-defined and other unspecified
|
|
behavior. It is common for Autoconf tests to probe implementations to
|
|
determine otherwise-unspecified behavior.
|
|
|
|
@dfn{Undefined behavior} is invalid behavior, where the standard allows
|
|
the implementation to do anything it pleases. For example,
|
|
dereferencing a null pointer leads to undefined behavior. If possible,
|
|
test programs should avoid undefined behavior, since a program with
|
|
undefined behavior might succeed on a test that should fail.
|
|
|
|
The above rules apply to programs that are intended to conform to the
|
|
standard. However, strictly-conforming programs are quite rare, since
|
|
the standards are so limiting. A major goal of Autoconf is to support
|
|
programs that use implementation features not described by the standard,
|
|
and it is fairly common for test programs to violate the above rules, if
|
|
the programs work well enough in practice.
|
|
|
|
@node Integer Overflow
|
|
@section Integer Overflow
|
|
@cindex integer overflow
|
|
@cindex overflow, signed integer
|
|
@cindex signed integer overflow
|
|
@cindex wraparound arithmetic
|
|
|
|
Although some traditional C programs assume that signed integer overflow
|
|
wraps around reliably using two's complement arithmetic, the C standard
|
|
says that program behavior is undefined on overflow, and these C
|
|
programs may not work on many modern implementations.
|
|
|
|
@menu
|
|
* Integer Overflow Basics:: Why integer overflow is a problem
|
|
* Signed Overflow Examples:: Examples of code assuming wraparound
|
|
* Optimization and Wraparound:: Optimizations that break uses of wraparound
|
|
* Signed Overflow Advice:: Practical advice for signed overflow issues
|
|
* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1}
|
|
@end menu
|
|
|
|
@node Integer Overflow Basics
|
|
@subsection Basics of Integer Overflow
|
|
@cindex integer overflow
|
|
@cindex overflow, signed integer
|
|
@cindex signed integer overflow
|
|
@cindex wraparound arithmetic
|
|
|
|
In languages like C, integer overflow wraps around for unsigned
|
|
integer types that are at least as wide as @code{unsigned int};
|
|
e.g., @code{UINT_MAX + 1} yields zero.
|
|
This is guaranteed by the C standard and is
|
|
portable in practice, unless you specify aggressive,
|
|
nonstandard optimization options
|
|
suitable only for special applications.
|
|
|
|
In contrast, the C standard says that signed integer overflow leads to
|
|
undefined behavior where a program can do anything, including dumping
|
|
core or overrunning a buffer. The misbehavior can even precede the
|
|
overflow. Such an overflow can occur during addition, subtraction,
|
|
multiplication, division, and left shift. It can even occur for
|
|
unsigned types like @code{unsigned short int} that are narrower
|
|
than @code{int}, as values of these types are widened to @code{int}
|
|
before computation.
|
|
|
|
Despite this requirement of the standard, some C programs assume that
|
|
signed integer overflow silently wraps around modulo a power of two,
|
|
using two's complement arithmetic, so long as you convert the resulting
|
|
value to a signed integer type. These programs can have problems,
|
|
especially when optimization is enabled. If you assume a GCC-like
|
|
compiler, you can work around the problems by compiling with GCC's
|
|
@code{-fwrapv} option; however, this is not portable.
|
|
|
|
For historical reasons C17 and earlier also allowed implementations with
|
|
ones' complement or signed magnitude arithmetic, but C23 requires
|
|
two's complement and it is safe to assume two's complement nowadays.
|
|
|
|
Also, overflow can occur when converting an out-of-range value to a
|
|
signed integer type. Here a standard implementation must define what
|
|
happens, and this can include raising an exception. Although practical
|
|
implementations typically wrap around silently in this case, a few
|
|
debugging implementations trap instead.
|
|
|
|
@node Signed Overflow Examples
|
|
@subsection Examples of Code Assuming Wraparound Overflow
|
|
@cindex integer overflow
|
|
@cindex overflow, signed integer
|
|
@cindex signed integer overflow
|
|
@cindex wraparound arithmetic
|
|
|
|
There was long a tension between what the C standard requires for signed
|
|
integer overflow, and what traditional C programs commonly assumed. The
|
|
standard allows aggressive optimizations based on assumptions that
|
|
overflow never occurs, but traditionally many C programs relied on overflow
|
|
wrapping around. Although these programs did not conform to the standard,
|
|
they formerly worked in practice because traditionally compilers did not
|
|
optimize in such a way that would break the programs. Nowadays, though,
|
|
compilers do perform these optimizations, so portable programs can no
|
|
longer assume reliable wraparound on signed integer overflow.
|
|
|
|
The C Standard says that if a program has signed integer overflow its
|
|
behavior is undefined, and the undefined behavior can even precede the
|
|
overflow. To take an extreme example:
|
|
|
|
@c Inspired by Robert Dewar's example in
|
|
@c <https://gcc.gnu.org/ml/gcc/2007-01/msg00038.html> (2007-01-01).
|
|
@example
|
|
if (password == expected_password)
|
|
allow_superuser_privileges ();
|
|
else if (counter++ == INT_MAX)
|
|
abort ();
|
|
else
|
|
printf ("%d password mismatches\n", counter);
|
|
@end example
|
|
|
|
@noindent
|
|
If the @code{int} variable @code{counter} equals @code{INT_MAX},
|
|
@code{counter++} must overflow and the behavior is undefined, so the C
|
|
standard allows the compiler to optimize away the test against
|
|
@code{INT_MAX} and the @code{abort} call.
|
|
Worse, if an earlier bug in the program lets the compiler deduce that
|
|
@code{counter == INT_MAX} or that @code{counter} previously overflowed,
|
|
the C standard allows the compiler to optimize away the password test
|
|
and generate code that allows superuser privileges unconditionally.
|
|
|
|
Here is an example derived from the 7th Edition Unix implementation of
|
|
@code{atoi} (1979-01-10):
|
|
|
|
@example
|
|
char *p;
|
|
int f, n;
|
|
@dots{}
|
|
while (*p >= '0' && *p <= '9')
|
|
n = n * 10 + *p++ - '0';
|
|
return (f ? -n : n);
|
|
@end example
|
|
|
|
@noindent
|
|
Even if the input string is in range, on most modern machines this has
|
|
signed overflow when computing the most negative integer (the @code{-n}
|
|
overflows) or a value near an extreme integer (the @code{+}
|
|
overflows).
|
|
|
|
Here is another example, derived from the 7th Edition implementation of
|
|
@code{rand} (1979-01-10). Here the programmer expects both
|
|
multiplication and addition to wrap on overflow:
|
|
|
|
@example
|
|
static long int randx = 1;
|
|
@dots{}
|
|
randx = randx * 1103515245 + 12345;
|
|
return (randx >> 16) & 077777;
|
|
@end example
|
|
|
|
In the following example, derived from the GNU C Library 2.15
|
|
implementation of @code{mktime} (2012-03-21), the code assumes
|
|
wraparound arithmetic in @code{+} to detect signed overflow:
|
|
|
|
@example
|
|
time_t t, t1, t2;
|
|
int sec_requested, sec_adjustment;
|
|
@dots{}
|
|
t1 = t + sec_requested;
|
|
t2 = t1 + sec_adjustment;
|
|
if (((t1 < t) != (sec_requested < 0))
|
|
| ((t2 < t1) != (sec_adjustment < 0)))
|
|
return -1;
|
|
@end example
|
|
|
|
Although some of these examples will likely behave as if signed integer
|
|
overflow wraps around reliably, other examples are likely to misbehave
|
|
when optimization is enabled. All these examples should be avoided in
|
|
portable code because signed integer overflow is not reliable on modern
|
|
systems, and it's not worth worrying about which of these examples
|
|
happen to work on most platforms and which do not.
|
|
|
|
@node Optimization and Wraparound
|
|
@subsection Optimizations That Break Wraparound Arithmetic
|
|
@cindex loop induction
|
|
|
|
Compilers sometimes generate code that is incompatible with wraparound
|
|
integer arithmetic. A simple example is an algebraic simplification: a
|
|
compiler might translate @code{(i * 2000) / 1000} to @code{i * 2}
|
|
because it assumes that @code{i * 2000} does not overflow. The
|
|
translation is not equivalent to the original when overflow occurs:
|
|
e.g., in the typical case of 32-bit signed two's complement wraparound
|
|
@code{int}, if @code{i} has type @code{int} and value @code{1073742},
|
|
the original expression returns @minus{}2147483 but the optimized
|
|
version returns the mathematically correct value 2147484.
|
|
|
|
More subtly, loop induction optimizations often exploit the undefined
|
|
behavior of signed overflow. Consider the following contrived function
|
|
@code{sumc}:
|
|
|
|
@example
|
|
int
|
|
sumc (int lo, int hi)
|
|
@{
|
|
int sum = 0;
|
|
for (int i = lo; i <= hi; i++)
|
|
sum ^= i * 53;
|
|
return sum;
|
|
@}
|
|
@end example
|
|
|
|
@noindent
|
|
To avoid multiplying by 53 each time through the loop, an optimizing
|
|
compiler might internally transform @code{sumc} to the equivalent of the
|
|
following:
|
|
|
|
@example
|
|
int
|
|
transformed_sumc (int lo, int hi)
|
|
@{
|
|
int sum = 0;
|
|
int hic = hi * 53;
|
|
for (int ic = lo * 53; ic <= hic; ic += 53)
|
|
sum ^= ic;
|
|
return sum;
|
|
@}
|
|
@end example
|
|
|
|
@noindent
|
|
This transformation is allowed by the C standard, but it is invalid for
|
|
wraparound arithmetic when @code{INT_MAX / 53 < hi}, because then the
|
|
overflow in computing expressions like @code{hi * 53} can cause the
|
|
expression @code{i <= hi} to yield a different value from the
|
|
transformed expression @code{ic <= hic}.
|
|
|
|
For this reason, compilers that use loop induction and similar
|
|
techniques often do not support reliable wraparound arithmetic when a
|
|
loop induction variable like @code{ic} is involved. Since loop
|
|
induction variables are generated by the compiler, and are not visible
|
|
in the source code, it is not always trivial to say whether the problem
|
|
affects your code.
|
|
|
|
Hardly any code actually depends on wraparound arithmetic in cases like
|
|
these, so in practice these loop induction optimizations are almost
|
|
always useful. However, edge cases in this area can cause problems.
|
|
For example:
|
|
|
|
@example
|
|
for (int j = 1; 0 < j; j *= 2)
|
|
test (j);
|
|
@end example
|
|
|
|
@noindent
|
|
Here, the loop attempts to iterate through all powers of 2 that
|
|
@code{int} can represent, but the C standard allows a compiler to
|
|
optimize away the comparison and generate an infinite loop,
|
|
under the argument that behavior is undefined on overflow. As of this
|
|
writing this optimization is done on some platforms by
|
|
GCC with @option{-O2}, so this code is not portable in practice.
|
|
|
|
@node Signed Overflow Advice
|
|
@subsection Practical Advice for Signed Overflow Issues
|
|
@cindex integer overflow
|
|
@cindex overflow, signed integer
|
|
@cindex signed integer overflow
|
|
@cindex wraparound arithmetic
|
|
|
|
Ideally the safest approach is to avoid signed integer overflow
|
|
entirely. For example, instead of multiplying two signed integers, you
|
|
can convert them to double-width integers, multiply the wider values,
|
|
then test whether the result is in the narrower range. Or you can use
|
|
more-complicated code employing unsigned integers of the same width.
|
|
|
|
Rewriting code in this way will be inconvenient, though, especially if
|
|
the signed values might be negative and no wider type is available.
|
|
Using unsigned arithmetic to check for overflow is
|
|
particularly painful to do portably and efficiently when dealing with an
|
|
integer type like @code{uid_t} whose width and signedness vary from
|
|
platform to platform. Also, this approach may hurt performance.
|
|
|
|
Hence it is often useful to maintain code that needs
|
|
wraparound on overflow, instead of rewriting the code. The rest of this
|
|
section attempts to give practical advice for this situation.
|
|
|
|
To detect integer overflow portably when attempting operations like
|
|
@code{sum = a + b}, you can use the C23 @code{<stdckdint.h>} macros
|
|
@code{ckd_add}, @code{ckd_sub}, and @code{ckd_mul}.
|
|
The following code adds two integers with overflow wrapping around
|
|
reliably in the sum:
|
|
|
|
@example
|
|
#include <stdckdint.h>
|
|
...
|
|
/* Set sum = a + b, with wraparound. */
|
|
if (ckd_add (&sum, a, b))
|
|
/* 'sum' has just the low order bits. */;
|
|
else
|
|
/* 'sum' is the correct answer. */;
|
|
@end example
|
|
|
|
To be portable to pre-C23 platforms you can use Gnulib's
|
|
@code{stdckdint} module, which emulates this part of C23 (@pxref{Gnulib}).
|
|
Invoking the @code{stdckdint} macros typically costs just one machine
|
|
instruction for the arithmetic and another instruction for the rare
|
|
branch on overflow.
|
|
|
|
If your code uses a signed loop index, make sure that the index cannot
|
|
overflow, along with all signed expressions derived from the index.
|
|
Here is a contrived example of problematic code with two instances of
|
|
overflow.
|
|
|
|
@example
|
|
for (int i = INT_MAX - 10; i <= INT_MAX; i++)
|
|
if (i + 1 < 0)
|
|
@{
|
|
report_overflow ();
|
|
break;
|
|
@}
|
|
@end example
|
|
|
|
@noindent
|
|
Because of the two overflows, a compiler might optimize away or
|
|
transform the two comparisons in a way that is incompatible with the
|
|
wraparound assumption.
|
|
|
|
If your code is intended to be compiled only by GCC and
|
|
assumes wraparound behavior, and you want to insulate it
|
|
against any GCC optimizations that would fail to support that
|
|
behavior, you should use GCC's @option{-fwrapv} option, which
|
|
causes signed overflow to wrap around reliably (except for division and
|
|
remainder, as discussed in the next section).
|
|
|
|
If you need to write portable code and therefore cannot assume that
|
|
signed integer overflow wraps around reliably, you should consider
|
|
debugging with a GCC option that causes signed overflow to raise an
|
|
exception. These options include @option{-fsanitize=undefined} and
|
|
@option{-ftrapv}.
|
|
|
|
@node Signed Integer Division
|
|
@subsection Signed Integer Division and Integer Overflow
|
|
@cindex division, integer
|
|
|
|
Overflow in signed
|
|
integer division is not always harmless: for example, on CPUs of the
|
|
i386 family, dividing @code{INT_MIN} by @code{-1} yields a SIGFPE signal
|
|
which by default terminates the program. Worse, taking the remainder
|
|
of these two values typically yields the same signal on these CPUs,
|
|
behavior that the C standard allows.
|
|
|
|
@node Preprocessor Arithmetic
|
|
@section Preprocessor Arithmetic
|
|
@cindex preprocessor arithmetic
|
|
|
|
In C99 and later, preprocessor arithmetic, used for @code{#if}
|
|
expressions, must
|
|
be evaluated as if all signed values are of type @code{intmax_t} and all
|
|
unsigned values of type @code{uintmax_t}. Many compilers are buggy in
|
|
this area, though. For example, as of 2007, Sun C mishandles @code{#if
|
|
LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit
|
|
@code{long long int}. Also, some older preprocessors mishandle
|
|
constants ending in @code{LL}. To work around these problems, you can
|
|
compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at
|
|
@code{configure}-time rather than at @code{#if}-time.
|
|
|
|
@node Null Pointers
|
|
@section Properties of Null Pointers
|
|
@cindex null pointers
|
|
|
|
Most modern hosts reliably fail when you attempt to dereference a null
|
|
pointer.
|
|
|
|
On almost all modern hosts, null pointers use an all-bits-zero internal
|
|
representation, so you can reliably use @code{memset} with 0 to set all
|
|
the pointers in an array to null values.
|
|
|
|
If @code{p} is a null pointer to an object type, the C expression
|
|
@code{p + 0} always evaluates to @code{p} on modern hosts, even though
|
|
the standard says that it has undefined behavior.
|
|
|
|
@node Buffer Overruns
|
|
@section Buffer Overruns and Subscript Errors
|
|
@cindex buffer overruns
|
|
|
|
Buffer overruns and subscript errors are the most common dangerous
|
|
errors in C programs. They result in undefined behavior because storing
|
|
outside an array typically modifies storage that is used by some other
|
|
object, and most modern systems lack runtime checks to catch these
|
|
errors. Programs should not rely on buffer overruns being caught.
|
|
|
|
There is one exception to the usual rule that a portable program cannot
|
|
address outside an array. In C, it is valid to compute the address just
|
|
past an object, e.g., @code{&a[N]} where @code{a} has @code{N} elements,
|
|
so long as you do not dereference the resulting pointer. But it is not
|
|
valid to compute the address just before an object, e.g., @code{&a[-1]};
|
|
nor is it valid to compute two past the end, e.g., @code{&a[N+1]}. On
|
|
most platforms @code{&a[-1] < &a[0] && &a[N] < &a[N+1]}, but this is not
|
|
reliable in general, and it is usually easy enough to avoid the
|
|
potential portability problem, e.g., by allocating an extra unused array
|
|
element at the start or end.
|
|
|
|
@uref{https://@/www.valgrind.org/, Valgrind} can catch many overruns.
|
|
GCC users might also consider using the @option{-fsanitize=} options
|
|
to catch overruns.
|
|
@xref{Instrumentation Options, , Program Instrumentation Options,
|
|
gcc, Using the GNU Compiler Collection (GCC)}.
|
|
|
|
Buffer overruns are usually caused by off-by-one errors, but there are
|
|
more subtle ways to get them.
|
|
|
|
Using @code{int} values to index into an array or compute array sizes
|
|
causes problems on typical 64-bit hosts where an array index might
|
|
be @math{2^{31}} or larger. Index values of type @code{size_t} avoid this
|
|
problem, but cannot be negative. Index values of type @code{ptrdiff_t}
|
|
are signed, and are wide enough in practice.
|
|
|
|
If you add or multiply two numbers to calculate an array size, e.g.,
|
|
@code{malloc (x * sizeof y + z)}, havoc ensues if the addition or
|
|
multiplication overflows.
|
|
|
|
Many implementations of the @code{alloca} function silently misbehave
|
|
and can generate buffer overflows if given sizes that are too large.
|
|
The size limits are implementation dependent, but are at least 4000
|
|
bytes on all platforms that we know about.
|
|
|
|
The standard functions @code{asctime}, @code{asctime_r}, @code{ctime},
|
|
@code{ctime_r}, and @code{gets} are prone to buffer overflows, and
|
|
portable code should not use them unless the inputs are known to be
|
|
within certain limits. The time-related functions can overflow their
|
|
buffers if given timestamps out of range (e.g., a year less than -999
|
|
or greater than 9999). Time-related buffer overflows cannot happen with
|
|
recent-enough versions of the GNU C library, but are possible
|
|
with other
|
|
implementations. The @code{gets} function is the worst, since it almost
|
|
invariably overflows its buffer when presented with an input line larger
|
|
than the buffer.
|
|
|
|
@node Volatile Objects
|
|
@section Volatile Objects
|
|
@cindex volatile objects
|
|
|
|
The keyword @code{volatile} is often misunderstood in portable code.
|
|
Its use inhibits some memory-access optimizations, but programmers often
|
|
wish that it had a different meaning than it actually does.
|
|
|
|
@code{volatile} was designed for code that accesses special objects like
|
|
memory-mapped device registers whose contents spontaneously change.
|
|
Such code is inherently low-level, and it is difficult to specify
|
|
portably what @code{volatile} means in these cases. The C standard
|
|
says, ``What constitutes an access to an object that has
|
|
volatile-qualified type is implementation-defined,'' so in theory each
|
|
implementation is supposed to fill in the gap by documenting what
|
|
@code{volatile} means for that implementation. In practice, though,
|
|
this documentation is usually absent or incomplete.
|
|
|
|
One area of confusion is the distinction between objects defined with
|
|
volatile types, and volatile lvalues. From the C standard's point of
|
|
view, an object defined with a volatile type has externally visible
|
|
behavior. You can think of such objects as having little oscilloscope
|
|
probes attached to them, so that the user can observe some properties of
|
|
accesses to them, just as the user can observe data written to output
|
|
files. However, accesses via volatile lvalues to ordinary objects
|
|
are merely side effects (i.e., changes to the state of the execution
|
|
environment), and the implementation is not required to document
|
|
their visibility any further. For example:
|
|
|
|
@example
|
|
/* Declare and access a volatile object.
|
|
Accesses to X are "visible" to users. */
|
|
static int volatile x;
|
|
x = 1;
|
|
|
|
/* Access two ordinary objects via a volatile lvalue.
|
|
Although each read and write is a side effect,
|
|
the accesses are not directly "visible" to users. */
|
|
int y = 0;
|
|
int *z = malloc (sizeof *z);
|
|
*z = 7;
|
|
int volatile *p;
|
|
p = &y;
|
|
*p = *p + 1;
|
|
p = z;
|
|
*p = *p + 1;
|
|
@end example
|
|
|
|
Programmers often wish that @code{volatile} meant ``Perform the memory
|
|
access here and now, without merging several memory accesses, without
|
|
changing the memory word size, and without reordering.'' But the C
|
|
standard does not require this. For objects defined with a volatile
|
|
type, accesses must be done before the next sequence point; but
|
|
otherwise merging, reordering, and word-size change is allowed.
|
|
|
|
Even when accessing objects defined with a volatile type,
|
|
the C standard allows only
|
|
extremely limited signal handlers: in C23 the behavior is undefined if a
|
|
signal handler refers to any non-local object that is not a lock-free
|
|
atomic object and that is not @code{constexpr} (other than by writing to
|
|
a @code{sig_atomic_t volatile} object), or calls any standard library
|
|
function other than from a small set that includes @code{abort},
|
|
@code{_Exit}, @code{quick_exit}, some @code{<stdatomic.h>} functions,
|
|
and @code{signal}. Hence C compilers need not worry about a signal
|
|
handler disturbing ordinary computation. POSIX allows some additional
|
|
behavior in a portable signal handler, but is still quite restrictive.
|
|
@xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the
|
|
GNU Compiler Collection (GCC)}, for some
|
|
restrictions imposed by GCC. @xref{Defining Handlers, ,
|
|
Defining Signal Handlers, libc, The GNU C Library}, for some
|
|
restrictions imposed by the GNU C library. Restrictions
|
|
differ on other platforms.
|
|
|
|
If possible, it is best to use a signal handler that fits within the
|
|
limits imposed by the C and POSIX standards.
|
|
|
|
If this is not practical, you can try the following rules of thumb. A
|
|
signal handler should access only volatile lvalues, preferably lvalues
|
|
that refer to objects defined with a volatile type, and should not
|
|
assume that the accessed objects have an internally consistent state
|
|
if they are larger than a machine word. Furthermore, installers
|
|
should employ compilers and compiler options that are commonly used
|
|
for building operating system kernels, because kernels often need more
|
|
from @code{volatile} than the C Standard requires, and installers who
|
|
compile an application in a similar environment can sometimes benefit
|
|
from the extra constraints imposed by kernels on compilers.
|
|
Admittedly we are hand-waving somewhat here, as there are few
|
|
guarantees in this area; the rules of thumb may help to fix some bugs
|
|
but there is a good chance that they will not fix them all.
|
|
|
|
For @code{volatile}, C++ has the same problems that C does.
|
|
Multithreaded applications have even more problems with @code{volatile},
|
|
but they are beyond the scope of this section.
|
|
|
|
The bottom line is that using @code{volatile} typically hurts
|
|
performance but should not hurt correctness. In some cases its use
|
|
does help correctness, but these cases are often so poorly understood
|
|
that all too often adding @code{volatile} to a data structure merely
|
|
alleviates some symptoms of a bug while not fixing the bug in general.
|
|
|
|
@node Floating Point Portability
|
|
@section Floating Point Portability
|
|
@cindex floating point
|
|
|
|
Almost all modern systems use IEEE-754 floating point, and it is safe to
|
|
assume IEEE-754 in most portable code these days. For more information,
|
|
please see David Goldberg's classic paper
|
|
@uref{https://@/www.validlab.com/@/goldberg/@/paper.pdf, What Every Computer
|
|
Scientist Should Know About Floating-Point Arithmetic}.
|
|
|
|
@node Exiting Portably
|
|
@section Exiting Portably
|
|
@cindex exiting portably
|
|
|
|
A C or C++ program can exit with status @var{N} by returning
|
|
@var{N} from the @code{main} function. Portable programs are supposed
|
|
to exit either with status 0 or @code{EXIT_SUCCESS} to succeed, or with
|
|
status @code{EXIT_FAILURE} to fail, but in practice it is portable to
|
|
fail by exiting with status 1, and test programs that assume POSIX can
|
|
fail by exiting with status values from 1 through 255.
|
|
|
|
A program can also exit with status @var{N} by passing @var{N} to the
|
|
@code{exit} function, and a program can fail by calling the @code{abort}
|
|
function. If a program is specialized to just some platforms, it can fail
|
|
by calling functions specific to those platforms, e.g., @code{_exit}
|
|
(POSIX). However, like other functions, an exit
|
|
function should be declared, typically by including a header. For
|
|
example, if a C program calls @code{exit}, it should include @file{stdlib.h}
|
|
either directly or via the default includes (@pxref{Default Includes}).
|
|
|
|
A program can fail due to undefined behavior such as dereferencing a null
|
|
pointer, but this is not recommended as undefined behavior allows an
|
|
implementation to do whatever it pleases and this includes exiting
|
|
successfully.
|
|
|
|
|
|
@c ================================================== Manual Configuration
|
|
|
|
@node Manual Configuration
|
|
@chapter Manual Configuration
|
|
|
|
A few kinds of features can't be guessed automatically by running test
|
|
programs. For example, the details of the object-file format, or
|
|
special options that need to be passed to the compiler or linker.
|
|
Autoconf provides a uniform method for handling unguessable features,
|
|
by giving each operating system a @dfn{canonical system type}, also
|
|
known as a @dfn{canonical name} or @dfn{target triplet}.
|
|
|
|
@prindex @command{config.guess}
|
|
@prindex @command{config.sub}
|
|
|
|
If you use any of the macros described in this chapter, you must
|
|
distribute the helper scripts @command{config.guess} and
|
|
@command{config.sub} along with your source code. Some Autoconf macros
|
|
use these macros internally, so you may need to distribute these scripts
|
|
even if you do not use any of these macros yourself. @xref{Input}, for
|
|
information about the @code{AC_CONFIG_AUX_DIR} macro which you can use
|
|
to control in which directory @command{configure} looks for helper
|
|
scripts, and where to get the scripts from.
|
|
|
|
@menu
|
|
* Specifying Target Triplets:: Specifying target triplets
|
|
* Canonicalizing:: Getting the canonical system type
|
|
* Using System Type:: What to do with the system type
|
|
@end menu
|
|
|
|
@node Specifying Target Triplets
|
|
@section Specifying target triplets
|
|
@cindex System type
|
|
@cindex Target triplet
|
|
@c This node used to be named Specifying Names. The @anchor allows old
|
|
@c links to still work.
|
|
@anchor{Specifying Names}
|
|
|
|
Autoconf-generated
|
|
@command{configure} scripts can make decisions based on a canonical name
|
|
for the system type, or @dfn{target triplet}, which has the form:
|
|
@samp{@var{cpu}-@var{vendor}-@var{os}}, where @var{os} can be
|
|
@samp{@var{system}} or @samp{@var{kernel}-@var{system}}
|
|
|
|
@command{configure} can usually guess the canonical name for the type of
|
|
system it's running on. To do so it runs a script called
|
|
@command{config.guess}, which infers the name using the @code{uname}
|
|
command or symbols predefined by the C preprocessor.
|
|
|
|
Alternately, the user can specify the system type with command line
|
|
arguments to @command{configure} (@pxref{System Types}. Doing so is
|
|
necessary when
|
|
cross-compiling. In the most complex case of cross-compiling, three
|
|
system types are involved. The options to specify them are:
|
|
|
|
@table @option
|
|
@item --build=@var{build-type}
|
|
the type of system on which the package is being configured and
|
|
compiled. It defaults to the result of running @command{config.guess}.
|
|
Specifying a @var{build-type} that differs from @var{host-type} enables
|
|
cross-compilation mode.
|
|
|
|
@item --host=@var{host-type}
|
|
the type of system on which the package runs. By default it is the
|
|
same as the build machine. The tools that get used to build and
|
|
manipulate binaries will, by default, all be prefixed with
|
|
@code{@var{host-type}-}, such as @code{@var{host-type}-gcc},
|
|
@code{@var{host-type}-g++}, @code{@var{host-type}-ar}, and
|
|
@code{@var{host-type}-nm}. If the binaries produced by these tools can
|
|
be executed by the build system, the configure script will make use of
|
|
it in @code{AC_RUN_IFELSE} invocations; otherwise, cross-compilation
|
|
mode is enabled. Specifying a @var{host-type} that differs
|
|
from @var{build-type}, when @var{build-type} was also explicitly
|
|
specified, equally enables cross-compilation mode.
|
|
|
|
@item --target=@var{target-type}
|
|
the type of system for which any compiler tools in the package
|
|
produce code (rarely needed). By default, it is the same as host.
|
|
@end table
|
|
|
|
If you mean to override the result of @command{config.guess} but
|
|
still produce binaries for the build machine, use @option{--build},
|
|
not @option{--host}.
|
|
|
|
So, for example, to produce binaries for 64-bit MinGW, use a command
|
|
like this:
|
|
|
|
@example
|
|
./configure --host=x86_64-w64-mingw64
|
|
@end example
|
|
|
|
If your system has the ability to execute MinGW binaries but you don't
|
|
want to make use of this feature and instead prefer cross-compilation
|
|
guesses, use a command like this:
|
|
|
|
@example
|
|
./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64
|
|
@end example
|
|
|
|
@noindent
|
|
Note that if you do not specify @option{--host}, @command{configure}
|
|
fails if it can't run the code generated by the specified compiler. For
|
|
example, configuring as follows fails:
|
|
|
|
@example
|
|
./configure CC=x86_64-w64-mingw64-gcc
|
|
@end example
|
|
|
|
When cross-compiling, @command{configure} will warn about any tools
|
|
(compilers, linkers, assemblers) whose name is not prefixed with the
|
|
host type. This is an aid to users performing cross-compilation.
|
|
Continuing the example above, if a cross-compiler named @command{cc} is
|
|
used with a native @command{pkg-config}, then libraries found by
|
|
@command{pkg-config} will likely cause subtle build failures; but using
|
|
the names @command{x86_64-w64-mingw64-gcc} and
|
|
@command{x86_64-w64-mingw64-pkg-config}
|
|
avoids any confusion. Avoiding the warning is as simple as creating the
|
|
correct symlinks naming the cross tools.
|
|
|
|
@cindex @command{config.sub}
|
|
@command{configure} recognizes short aliases for some system types; for
|
|
example, @samp{mingw64} can be used instead of
|
|
@samp{x86_64-pc-mingw64}. @command{configure} runs a script called
|
|
@command{config.sub} to canonicalize system type aliases.
|
|
|
|
This section deliberately omits the description of the obsolete
|
|
interface; see @ref{Hosts and Cross-Compilation}.
|
|
|
|
|
|
@node Canonicalizing
|
|
@section Getting the Canonical System Type
|
|
@cindex System type
|
|
@cindex Canonical system type
|
|
|
|
The following macros make the system type available to @command{configure}
|
|
scripts.
|
|
|
|
@ovindex build_alias
|
|
@ovindex host_alias
|
|
@ovindex target_alias
|
|
|
|
The variables @samp{build_alias}, @samp{host_alias}, and
|
|
@samp{target_alias} are always exactly the arguments of @option{--build},
|
|
@option{--host}, and @option{--target}; in particular, they are left empty
|
|
if the user did not use them, even if the corresponding
|
|
@code{AC_CANONICAL} macro was run. Any configure script may use these
|
|
variables anywhere. These are the variables that should be used when in
|
|
interaction with the user.
|
|
|
|
If you need to recognize some special environments based on their system
|
|
type, run the following macros to get canonical system names. These
|
|
variables are not set before the macro call.
|
|
|
|
@defmac AC_CANONICAL_BUILD
|
|
@acindex{CANONICAL_BUILD}
|
|
@ovindex build
|
|
@ovindex build_cpu
|
|
@ovindex build_vendor
|
|
@ovindex build_os
|
|
Compute the canonical build-system type variable, @code{build}, and its
|
|
three individual parts @code{build_cpu}, @code{build_vendor}, and
|
|
@code{build_os}.
|
|
|
|
If @option{--build} was specified, then @code{build} is the
|
|
canonicalization of @code{build_alias} by @command{config.sub},
|
|
otherwise it is determined by the shell script @command{config.guess}.
|
|
@end defmac
|
|
|
|
@defmac AC_CANONICAL_HOST
|
|
@acindex{CANONICAL_HOST}
|
|
@ovindex host
|
|
@ovindex host_cpu
|
|
@ovindex host_vendor
|
|
@ovindex host_os
|
|
Compute the canonical host-system type variable, @code{host}, and its
|
|
three individual parts @code{host_cpu}, @code{host_vendor}, and
|
|
@code{host_os}.
|
|
|
|
If @option{--host} was specified, then @code{host} is the
|
|
canonicalization of @code{host_alias} by @command{config.sub},
|
|
otherwise it defaults to @code{build}.
|
|
@end defmac
|
|
|
|
@defmac AC_CANONICAL_TARGET
|
|
@acindex{CANONICAL_TARGET}
|
|
@ovindex target
|
|
@ovindex target_cpu
|
|
@ovindex target_vendor
|
|
@ovindex target_os
|
|
Compute the canonical target-system type variable, @code{target}, and its
|
|
three individual parts @code{target_cpu}, @code{target_vendor}, and
|
|
@code{target_os}.
|
|
|
|
If @option{--target} was specified, then @code{target} is the
|
|
canonicalization of @code{target_alias} by @command{config.sub},
|
|
otherwise it defaults to @code{host}.
|
|
@end defmac
|
|
|
|
Note that there can be artifacts due to the backward compatibility
|
|
code. @xref{Hosts and Cross-Compilation}, for more.
|
|
|
|
@node Using System Type
|
|
@section Using the System Type
|
|
|
|
In @file{configure.ac} the system type is generally used by one or more
|
|
@code{case} statements to select system-specifics. Shell wildcards can
|
|
be used to match a group of system types.
|
|
|
|
For example, an extra assembler code object file could be chosen, giving
|
|
access to a CPU cycle counter register. @code{$(CYCLE_OBJ)} in the
|
|
following would be used in a makefile to add the object to a
|
|
program or library.
|
|
|
|
@example
|
|
AS_CASE([$host],
|
|
[aarch64*-*-*], [CYCLE_OBJ=pmccntr.o],
|
|
[i?86-*-*], [CYCLE_OBJ=rdtsc.o],
|
|
[CYCLE_OBJ=""])
|
|
AC_SUBST([CYCLE_OBJ])
|
|
@end example
|
|
|
|
@code{AC_CONFIG_LINKS} (@pxref{Configuration Links}) is another good way
|
|
to select variant source files, for example optimized code for some
|
|
CPUs. The configured CPU type doesn't always indicate exact CPU types,
|
|
so some runtime capability checks may be necessary too.
|
|
|
|
@example
|
|
AS_CASE([$host],
|
|
[aarch64*-*-*], [AC_CONFIG_LINKS([dither.c:aarch64/dither.c])],
|
|
[powerpc*-*-*], [AC_CONFIG_LINKS([dither.c:powerpc/dither.c])],
|
|
[AC_CONFIG_LINKS([dither.c:generic/dither.c])])
|
|
@end example
|
|
|
|
The host system type can also be used to find cross-compilation tools
|
|
with @code{AC_CHECK_TOOL} (@pxref{Generic Programs}).
|
|
|
|
The above examples all show @samp{$host}, since this is where the code
|
|
is going to run. Only rarely is it necessary to test @samp{$build}
|
|
(which is where the build is being done).
|
|
|
|
Whenever you're tempted to use @samp{$host} it's worth considering
|
|
whether some sort of probe would be better. New system types come along
|
|
periodically or previously missing features are added. Well-written
|
|
probes can adapt themselves to such things, but hard-coded lists of
|
|
names can't. Here are some guidelines,
|
|
|
|
@itemize @bullet
|
|
@item
|
|
Availability of libraries and library functions should always be checked
|
|
by probing.
|
|
@item
|
|
Variant behavior of system calls is best identified with runtime tests
|
|
if possible, but bug workarounds or obscure difficulties might have to
|
|
be driven from @samp{$host}.
|
|
@item
|
|
Assembler code is inevitably highly CPU-specific and is best selected
|
|
according to @samp{$host_cpu}.
|
|
@item
|
|
Assembler variations like underscore prefix on globals or ELF versus
|
|
COFF type directives are however best determined by probing, perhaps
|
|
even examining the compiler output.
|
|
@end itemize
|
|
|
|
@samp{$target} is for use by a package creating a compiler or similar.
|
|
For ordinary packages it's meaningless and should not be used. It
|
|
indicates what the created compiler should generate code for, if it can
|
|
cross-compile. @samp{$target} generally selects various hard-coded CPU
|
|
and system conventions, since usually the compiler or tools under
|
|
construction themselves determine how the target works.
|
|
|
|
|
|
@c ===================================================== Site Configuration.
|
|
|
|
@node Site Configuration
|
|
@chapter Site Configuration
|
|
|
|
@command{configure} scripts support several kinds of local configuration
|
|
decisions. There are ways for users to specify where external software
|
|
packages are, include or exclude optional features, install programs
|
|
under modified names, and set default values for @command{configure}
|
|
options.
|
|
|
|
@menu
|
|
* Help Formatting:: Customizing @samp{configure --help}
|
|
* External Software:: Working with other optional software
|
|
* Package Options:: Selecting optional features
|
|
* Pretty Help Strings:: Formatting help string
|
|
* Option Checking:: Controlling checking of @command{configure} options
|
|
* Site Details:: Configuring site details
|
|
* Transforming Names:: Changing program names when installing
|
|
* Site Defaults:: Giving @command{configure} local defaults
|
|
@end menu
|
|
|
|
@node Help Formatting
|
|
@section Controlling Help Output
|
|
|
|
Users consult @samp{configure --help} to learn of configuration
|
|
decisions specific to your package. By default, @command{configure}
|
|
breaks this output into sections for each type of option; within each
|
|
section, help strings appear in the order @file{configure.ac} defines
|
|
them:
|
|
|
|
@example
|
|
Optional Features:
|
|
@dots{}
|
|
--enable-bar include bar
|
|
|
|
Optional Packages:
|
|
@dots{}
|
|
--with-foo use foo
|
|
@end example
|
|
|
|
@defmac AC_PRESERVE_HELP_ORDER
|
|
@acindex{PRESERVE_HELP_ORDER}
|
|
|
|
Request an alternate @option{--help} format, in which options of all
|
|
types appear together, in the order defined. Call this macro before any
|
|
@code{AC_ARG_ENABLE} or @code{AC_ARG_WITH}.
|
|
|
|
@example
|
|
Optional Features and Packages:
|
|
@dots{}
|
|
--enable-bar include bar
|
|
--with-foo use foo
|
|
@end example
|
|
|
|
@end defmac
|
|
|
|
@node External Software
|
|
@section Working With External Software
|
|
@cindex External software
|
|
|
|
Some packages require, or can optionally use, other software packages
|
|
that are already installed. The user can give @command{configure}
|
|
command line options to specify which such external software to use.
|
|
The options have one of these forms:
|
|
|
|
@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
|
|
@c awful.
|
|
@example
|
|
--with-@var{package}@r{[}=@var{arg}@r{]}
|
|
--without-@var{package}
|
|
@end example
|
|
|
|
For example, @option{--with-gnu-ld} means work with the GNU linker
|
|
instead of some other linker. @option{--with-x} means work with The X
|
|
Window System.
|
|
|
|
The user can give an argument by following the package name with
|
|
@samp{=} and the argument. Giving an argument of @samp{no} is for
|
|
packages that are used by default; it says to @emph{not} use the
|
|
package. An argument that is neither @samp{yes} nor @samp{no} could
|
|
include a name or number of a version of the other package, to specify
|
|
more precisely which other package this program is supposed to work
|
|
with. If no argument is given, it defaults to @samp{yes}.
|
|
@option{--without-@var{package}} is equivalent to
|
|
@option{--with-@var{package}=no}.
|
|
|
|
Normally @command{configure} scripts complain about
|
|
@option{--with-@var{package}} options that they do not support.
|
|
@xref{Option Checking}, for details, and for how to override the
|
|
defaults.
|
|
|
|
For each external software package that may be used, @file{configure.ac}
|
|
should call @code{AC_ARG_WITH} to detect whether the @command{configure}
|
|
user asked to use it. Whether each package is used or not by default,
|
|
and which arguments are valid, is up to you.
|
|
|
|
@anchor{AC_ARG_WITH}
|
|
@defmac AC_ARG_WITH (@var{package}, @var{help-string}, @
|
|
@ovar{action-if-given}, @ovar{action-if-not-given})
|
|
@acindex{ARG_WITH}
|
|
If the user gave @command{configure} the option @option{--with-@var{package}}
|
|
or @option{--without-@var{package}}, run shell commands
|
|
@var{action-if-given}. If neither option was given, run shell commands
|
|
@var{action-if-not-given}. The name @var{package} indicates another
|
|
software package that this program should work with. It should consist
|
|
only of alphanumeric characters, dashes, plus signs, and dots.
|
|
|
|
The option's argument is available to the shell commands
|
|
@var{action-if-given} in the shell variable @code{withval}, which is
|
|
actually just the value of the shell variable named
|
|
@code{with_@var{package}}, with any non-alphanumeric characters in
|
|
@var{package} changed into @samp{_}. You may use that variable instead,
|
|
if you wish.
|
|
|
|
Note that @var{action-if-not-given} is not expanded until the point that
|
|
@code{AC_ARG_WITH} was expanded. If you need the value of
|
|
@code{with_@var{package}} set to a default value by the time argument
|
|
parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS}
|
|
diversion (@pxref{m4_divert_text}) (if done as an argument to
|
|
@code{AC_ARG_WITH}, also provide non-diverted text to avoid a shell
|
|
syntax error).
|
|
|
|
The argument @var{help-string} is a description of the option that
|
|
looks like this:
|
|
@example
|
|
--with-readline support fancy command line editing
|
|
@end example
|
|
|
|
@noindent
|
|
@var{help-string} may be more than one line long, if more detail is
|
|
needed. Just make sure the columns line up in @samp{configure
|
|
--help}. Avoid tabs in the help string. The easiest way to provide the
|
|
proper leading whitespace is to format your @var{help-string} with the macro
|
|
@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).
|
|
|
|
The following example shows how to use the @code{AC_ARG_WITH} macro in
|
|
a common situation. You want to let the user decide whether to enable
|
|
support for an external library (e.g., the readline library); if the user
|
|
specified neither @option{--with-readline} nor @option{--without-readline},
|
|
you want to enable support for readline only if the library is available
|
|
on the system.
|
|
|
|
@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
|
|
@example
|
|
AC_ARG_WITH([readline],
|
|
[AS_HELP_STRING([--with-readline],
|
|
[support fancy command line editing @@<:@@default=check@@:>@@])],
|
|
[],
|
|
[: m4_divert_text([DEFAULTS], [with_readline=check])])
|
|
|
|
LIBREADLINE=
|
|
AS_IF([test "x$with_readline" != xno],
|
|
[AC_CHECK_LIB([readline], [main],
|
|
[AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
|
|
AC_DEFINE([HAVE_LIBREADLINE], [1],
|
|
[Define if you have libreadline])
|
|
],
|
|
[if test "x$with_readline" != xcheck; then
|
|
AC_MSG_FAILURE(
|
|
[--with-readline was given, but test for readline failed])
|
|
fi
|
|
], -lncurses)])
|
|
@end example
|
|
|
|
The next example shows how to use @code{AC_ARG_WITH} to give the user the
|
|
possibility to enable support for the readline library, in case it is still
|
|
experimental and not well tested, and is therefore disabled by default.
|
|
|
|
@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
|
|
@example
|
|
AC_ARG_WITH([readline],
|
|
[AS_HELP_STRING([--with-readline],
|
|
[enable experimental support for readline])],
|
|
[],
|
|
[with_readline=no])
|
|
|
|
LIBREADLINE=
|
|
AS_IF([test "x$with_readline" != xno],
|
|
[AC_CHECK_LIB([readline], [main],
|
|
[AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
|
|
AC_DEFINE([HAVE_LIBREADLINE], [1],
|
|
[Define if you have libreadline])
|
|
],
|
|
[AC_MSG_FAILURE(
|
|
[--with-readline was given, but test for readline failed])],
|
|
[-lncurses])])
|
|
@end example
|
|
|
|
The last example shows how to use @code{AC_ARG_WITH} to give the user the
|
|
possibility to disable support for the readline library, given that it is
|
|
an important feature and that it should be enabled by default.
|
|
|
|
@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved.
|
|
@example
|
|
AC_ARG_WITH([readline],
|
|
[AS_HELP_STRING([--without-readline],
|
|
[disable support for readline])],
|
|
[],
|
|
[with_readline=yes])
|
|
|
|
LIBREADLINE=
|
|
AS_IF([test "x$with_readline" != xno],
|
|
[AC_CHECK_LIB([readline], [main],
|
|
[AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
|
|
AC_DEFINE([HAVE_LIBREADLINE], [1],
|
|
[Define if you have libreadline])
|
|
],
|
|
[AC_MSG_FAILURE(
|
|
[readline test failed (--without-readline to disable)])],
|
|
[-lncurses])])
|
|
@end example
|
|
|
|
These three examples can be easily adapted to the case where
|
|
@code{AC_ARG_ENABLE} should be preferred to @code{AC_ARG_WITH} (see
|
|
@ref{Package Options}).
|
|
@end defmac
|
|
|
|
@node Package Options
|
|
@section Choosing Package Options
|
|
@cindex Package options
|
|
@cindex Options, package
|
|
|
|
If a software package has optional compile-time features, the user can
|
|
give @command{configure} command line options to specify whether to
|
|
compile them. The options have one of these forms:
|
|
|
|
@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
|
|
@c awful.
|
|
@example
|
|
--enable-@var{feature}@r{[}=@var{arg}@r{]}
|
|
--disable-@var{feature}
|
|
@end example
|
|
|
|
These options allow users to choose which optional features to build and
|
|
install. @option{--enable-@var{feature}} options should never make a
|
|
feature behave differently or cause one feature to replace another.
|
|
They should only cause parts of the program to be built rather than left
|
|
out.
|
|
|
|
The user can give an argument by following the feature name with
|
|
@samp{=} and the argument. Giving an argument of @samp{no} requests
|
|
that the feature @emph{not} be made available. A feature with an
|
|
argument looks like @option{--enable-debug=stabs}. If no argument is
|
|
given, it defaults to @samp{yes}. @option{--disable-@var{feature}} is
|
|
equivalent to @option{--enable-@var{feature}=no}.
|
|
|
|
Normally @command{configure} scripts complain about
|
|
@option{--enable-@var{package}} options that they do not support.
|
|
@xref{Option Checking}, for details, and for how to override the
|
|
defaults.
|
|
|
|
For each optional feature, @file{configure.ac} should call
|
|
@code{AC_ARG_ENABLE} to detect whether the @command{configure} user asked
|
|
to include it. Whether each feature is included or not by default, and
|
|
which arguments are valid, is up to you.
|
|
|
|
@anchor{AC_ARG_ENABLE}
|
|
@defmac AC_ARG_ENABLE (@var{feature}, @var{help-string}, @
|
|
@ovar{action-if-given}, @ovar{action-if-not-given})
|
|
@acindex{ARG_ENABLE}
|
|
If the user gave @command{configure} the option
|
|
@option{--enable-@var{feature}} or @option{--disable-@var{feature}}, run
|
|
shell commands @var{action-if-given}. If neither option was given, run
|
|
shell commands @var{action-if-not-given}. The name @var{feature}
|
|
indicates an optional user-level facility. It should consist only of
|
|
alphanumeric characters, dashes, plus signs, and dots.
|
|
|
|
The option's argument is available to the shell commands
|
|
@var{action-if-given} in the shell variable @code{enableval}, which is
|
|
actually just the value of the shell variable named
|
|
@code{enable_@var{feature}}, with any non-alphanumeric characters in
|
|
@var{feature} changed into @samp{_}. You may use that variable instead,
|
|
if you wish. The @var{help-string} argument is like that of
|
|
@code{AC_ARG_WITH} (@pxref{External Software}).
|
|
|
|
Note that @var{action-if-not-given} is not expanded until the point that
|
|
@code{AC_ARG_ENABLE} was expanded. If you need the value of
|
|
@code{enable_@var{feature}} set to a default value by the time argument
|
|
parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS}
|
|
diversion (@pxref{m4_divert_text}) (if done as an argument to
|
|
@code{AC_ARG_ENABLE}, also provide non-diverted text to avoid a shell
|
|
syntax error).
|
|
|
|
You should format your @var{help-string} with the macro
|
|
@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).
|
|
|
|
See the examples suggested with the definition of @code{AC_ARG_WITH}
|
|
(@pxref{External Software}) to get an idea of possible applications of
|
|
@code{AC_ARG_ENABLE}.
|
|
@end defmac
|
|
|
|
@node Pretty Help Strings
|
|
@section Making Your Help Strings Look Pretty
|
|
@cindex Help strings
|
|
|
|
Properly formatting the @samp{help strings} which are used in
|
|
@code{AC_ARG_WITH} (@pxref{External Software}) and @code{AC_ARG_ENABLE}
|
|
(@pxref{Package Options}) can be challenging. Specifically, you want
|
|
your own @samp{help strings} to line up in the appropriate columns of
|
|
@samp{configure --help} just like the standard Autoconf @samp{help
|
|
strings} do. This is the purpose of the @code{AS_HELP_STRING} macro.
|
|
|
|
@anchor{AS_HELP_STRING}
|
|
@defmac AS_HELP_STRING (@var{left-hand-side}, @var{right-hand-side} @
|
|
@dvar{indent-column, 26}, @dvar{wrap-column, 79})
|
|
@asindex{HELP_STRING}
|
|
|
|
Expands into a help string that looks pretty when the user executes
|
|
@samp{configure --help}. It is typically used in @code{AC_ARG_WITH}
|
|
(@pxref{External Software}) or @code{AC_ARG_ENABLE} (@pxref{Package
|
|
Options}). The following example makes this clearer.
|
|
|
|
@example
|
|
AC_ARG_WITH([foo],
|
|
[AS_HELP_STRING([--with-foo],
|
|
[use foo (default is no)])],
|
|
[use_foo=$withval],
|
|
[use_foo=no])
|
|
@end example
|
|
|
|
Then the last few lines of @samp{configure --help} appear like
|
|
this:
|
|
|
|
@example
|
|
--enable and --with options recognized:
|
|
--with-foo use foo (default is no)
|
|
@end example
|
|
|
|
Macro expansion is performed on the first argument. However, the second
|
|
argument of @code{AS_HELP_STRING} is treated as a whitespace separated
|
|
list of text to be reformatted, and is not subject to macro expansion.
|
|
Since it is not expanded, it should not be double quoted.
|
|
@xref{Autoconf Language}, for a more detailed explanation.
|
|
|
|
The @code{AS_HELP_STRING} macro is particularly helpful when the
|
|
@var{left-hand-side} and/or @var{right-hand-side} are composed of macro
|
|
arguments, as shown in the following example. Be aware that
|
|
@var{left-hand-side} may not expand to unbalanced quotes,
|
|
although quadrigraphs can be used.
|
|
|
|
@example
|
|
AC_DEFUN([MY_ARG_WITH],
|
|
[AC_ARG_WITH(m4_translit([[$1]], [_], [-]),
|
|
[AS_HELP_STRING([--with-m4_translit([$1], [_], [-])],
|
|
[use $1 (default is $2)])],
|
|
[use_[]$1=$withval],
|
|
[use_[]$1=$2])])
|
|
MY_ARG_WITH([a_b], [no])
|
|
@end example
|
|
@noindent
|
|
Here, the last few lines of @samp{configure --help} will include:
|
|
|
|
@example
|
|
--enable and --with options recognized:
|
|
--with-a-b use a_b (default is no)
|
|
@end example
|
|
|
|
The parameters @var{indent-column} and @var{wrap-column} were introduced
|
|
in Autoconf 2.62. Generally, they should not be specified; they exist
|
|
for fine-tuning of the wrapping.
|
|
@example
|
|
AS_HELP_STRING([--option], [description of option])
|
|
@result{} --option description of option
|
|
AS_HELP_STRING([--option], [description of option], [15], [30])
|
|
@result{} --option description of
|
|
@result{} option
|
|
@end example
|
|
@end defmac
|
|
|
|
|
|
@node Option Checking
|
|
@section Controlling Checking of @command{configure} Options
|
|
@cindex Options, Package
|
|
|
|
The @command{configure} script checks its command-line options against a
|
|
list of known options, like @option{--help} or @option{--config-cache}.
|
|
An unknown option ordinarily indicates a mistake by the user and
|
|
@command{configure} halts with an error. However, by default unknown
|
|
@option{--with-@var{package}} and @option{--enable-@var{feature}}
|
|
options elicit only a warning, to support configuring entire source
|
|
trees.
|
|
|
|
Source trees often contain multiple packages with a top-level
|
|
@command{configure} script that uses the @code{AC_CONFIG_SUBDIRS} macro
|
|
(@pxref{Subdirectories}). Because the packages generally support
|
|
different @option{--with-@var{package}} and
|
|
@option{--enable-@var{feature}} options, the GNU Coding
|
|
Standards say they must accept unrecognized options without halting.
|
|
Even a warning message is undesirable here, so @code{AC_CONFIG_SUBDIRS}
|
|
automatically disables the warnings.
|
|
|
|
This default behavior may be modified in two ways. First, the installer
|
|
can invoke @code{configure --disable-option-checking} to disable
|
|
these warnings, or invoke @code{configure --enable-option-checking=fatal}
|
|
options to turn them into fatal errors, respectively. Second, the
|
|
maintainer can use @code{AC_DISABLE_OPTION_CHECKING}.
|
|
|
|
@defmac AC_DISABLE_OPTION_CHECKING
|
|
@acindex{DISABLE_OPTION_CHECKING}
|
|
|
|
By default, disable warnings related to any unrecognized
|
|
@option{--with-@var{package}} or @option{--enable-@var{feature}}
|
|
options. This is implied by @code{AC_CONFIG_SUBDIRS}.
|
|
|
|
The installer can override this behavior by passing
|
|
@option{--enable-option-checking} (enable warnings) or
|
|
@option{--enable-option-checking=fatal} (enable errors) to
|
|
@command{configure}.
|
|
@end defmac
|
|
|
|
|
|
@node Site Details
|
|
@section Configuring Site Details
|
|
@cindex Site details
|
|
|
|
Some software packages require complex site-specific information. Some
|
|
examples are host names to use for certain services, company names, and
|
|
email addresses to contact. Since some configuration scripts generated
|
|
by Metaconfig ask for such information interactively, people sometimes
|
|
wonder how to get that information in Autoconf-generated configuration
|
|
scripts, which aren't interactive.
|
|
|
|
Such site configuration information should be put in a file that is
|
|
edited @emph{only by users}, not by programs. The location of the file
|
|
can either be based on the @code{prefix} variable, or be a standard
|
|
location such as the user's home directory. It could even be specified
|
|
by an environment variable. The programs should examine that file at
|
|
runtime, rather than at compile time. Runtime configuration is more
|
|
convenient for users and makes the configuration process simpler than
|
|
getting the information while configuring. @xref{Directory Variables, ,
|
|
Variables for Installation Directories, standards, The GNU Coding
|
|
Standards}, for more information on where to put data files.
|
|
|
|
@node Transforming Names
|
|
@section Transforming Program Names When Installing
|
|
@cindex Transforming program names
|
|
@cindex Program names, transforming
|
|
|
|
Autoconf supports changing the names of programs when installing them.
|
|
In order to use these transformations, @file{configure.ac} must call the
|
|
macro @code{AC_ARG_PROGRAM}.
|
|
|
|
@defmac AC_ARG_PROGRAM
|
|
@acindex{ARG_PROGRAM}
|
|
@ovindex program_transform_name
|
|
Place in output variable @code{program_transform_name} a sequence of
|
|
@code{sed} commands for changing the names of installed programs.
|
|
|
|
If any of the options described below are given to @command{configure},
|
|
program names are transformed accordingly. Otherwise, if
|
|
@code{AC_CANONICAL_TARGET} has been called and a @option{--target} value
|
|
is given, the target type followed by a dash is used as a prefix.
|
|
Otherwise, no program name transformation is done.
|
|
@end defmac
|
|
|
|
@menu
|
|
* Transformation Options:: @command{configure} options to transform names
|
|
* Transformation Examples:: Sample uses of transforming names
|
|
* Transformation Rules:: Makefile uses of transforming names
|
|
@end menu
|
|
|
|
@node Transformation Options
|
|
@subsection Transformation Options
|
|
|
|
You can specify name transformations by giving @command{configure} these
|
|
command line options:
|
|
|
|
@table @option
|
|
@item --program-prefix=@var{prefix}
|
|
prepend @var{prefix} to the names;
|
|
|
|
@item --program-suffix=@var{suffix}
|
|
append @var{suffix} to the names;
|
|
|
|
@item --program-transform-name=@var{expression}
|
|
perform @code{sed} substitution @var{expression} on the names.
|
|
@end table
|
|
|
|
@node Transformation Examples
|
|
@subsection Transformation Examples
|
|
|
|
These transformations are useful with programs that can be part of a
|
|
cross-compilation development environment. For example, a
|
|
cross-assembler running on x86-64 configured with
|
|
@option{--target=aarch64-linux-gnu} is normally installed as
|
|
@file{aarch64-linux-gnu-as}, rather than @file{as}, which could be confused
|
|
with a native x86-64 assembler.
|
|
|
|
You can force a program name to begin with @file{g}, if you don't want
|
|
GNU programs installed on your system to shadow other programs with
|
|
the same name. For example, if you configure GNU @code{diff} with
|
|
@option{--program-prefix=g}, then when you run @samp{make install} it is
|
|
installed as @file{/usr/local/bin/gdiff}.
|
|
|
|
As a more sophisticated example, you could use
|
|
|
|
@example
|
|
--program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
|
|
@end example
|
|
@noindent
|
|
|
|
to prepend @samp{g} to most of the program names in a source tree,
|
|
excepting those like @code{gdb} that already have one and those like
|
|
@code{less} and @code{lesskey} that aren't GNU programs. (That is
|
|
assuming that you have a source tree containing those programs that is
|
|
set up to use this feature.)
|
|
|
|
One way to install multiple versions of some programs simultaneously is
|
|
to append a version number to the name of one or both. For example, if
|
|
you want to keep Autoconf version 1 around for awhile, you can configure
|
|
Autoconf version 2 using @option{--program-suffix=2} to install the
|
|
programs as @file{/usr/local/bin/autoconf2},
|
|
@file{/usr/local/bin/autoheader2}, etc. Nevertheless, pay attention
|
|
that only the binaries are renamed, therefore you'd have problems with
|
|
the library files which might overlap.
|
|
|
|
@node Transformation Rules
|
|
@subsection Transformation Rules
|
|
|
|
Here is how to use the variable @code{program_transform_name} in a
|
|
@file{Makefile.in}:
|
|
|
|
@example
|
|
PROGRAMS = cp ls rm
|
|
transform = @@program_transform_name@@
|
|
install:
|
|
for p in $(PROGRAMS); do \
|
|
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
|
|
sed '$(transform)'`; \
|
|
done
|
|
|
|
uninstall:
|
|
for p in $(PROGRAMS); do \
|
|
rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
|
|
@c $$ restore font-lock
|
|
done
|
|
@end example
|
|
|
|
It is guaranteed that @code{program_transform_name} is never empty, and
|
|
that there are no useless separators. Therefore you may safely embed
|
|
@code{program_transform_name} within a sed program using @samp{;}:
|
|
|
|
@example
|
|
transform = @@program_transform_name@@
|
|
transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
|
|
@end example
|
|
|
|
Whether to do the transformations on documentation files (Texinfo or
|
|
@code{man}) is a tricky question; there seems to be no perfect answer,
|
|
due to the several reasons for name transforming. Documentation is not
|
|
usually particular to a specific architecture, and Texinfo files do not
|
|
conflict with system documentation. But they might conflict with
|
|
earlier versions of the same files, and @code{man} pages sometimes do
|
|
conflict with system documentation. As a compromise, it is probably
|
|
best to do name transformations on @code{man} pages but not on Texinfo
|
|
manuals.
|
|
|
|
@node Site Defaults
|
|
@section Setting Site Defaults
|
|
@cindex Site defaults
|
|
@cindex config.site
|
|
|
|
Autoconf-generated @command{configure} scripts allow your site to provide
|
|
default values for some configuration values. You do this by creating
|
|
site- and system-wide initialization files.
|
|
|
|
@evindex CONFIG_SITE
|
|
If the environment variable @code{CONFIG_SITE} is set, @command{configure}
|
|
uses its value as a space-separated list of shell scripts to read;
|
|
it is recommended that these be absolute file names. Otherwise, it
|
|
reads the shell script @file{@var{prefix}/share/config.site} if it exists,
|
|
then @file{@var{prefix}/etc/config.site} if it exists. Thus,
|
|
settings in machine-specific files override those in machine-independent
|
|
ones in case of conflict.
|
|
|
|
Site files can be arbitrary shell scripts, but only certain kinds of
|
|
code are really appropriate to be in them. Because @command{configure}
|
|
reads any cache file after it has read any site files, a site file can
|
|
define a default cache file to be shared between all Autoconf-generated
|
|
@command{configure} scripts run on that system (@pxref{Cache Files}). If
|
|
you set a default cache file in a site file, it is a good idea to also
|
|
set the output variable @code{CC} in that site file, because the cache
|
|
file is only valid for a particular compiler, but many systems have
|
|
several available.
|
|
|
|
You can examine or override the value set by a command line option to
|
|
@command{configure} in a site file; options set shell variables that have
|
|
the same names as the options, with any dashes turned into underscores.
|
|
The exceptions are that @option{--without-} and @option{--disable-} options
|
|
are like giving the corresponding @option{--with-} or @option{--enable-}
|
|
option and the value @samp{no}. Thus, @option{--cache-file=localcache}
|
|
sets the variable @code{cache_file} to the value @samp{localcache};
|
|
@option{--enable-warnings=no} or @option{--disable-warnings} sets the variable
|
|
@code{enable_warnings} to the value @samp{no}; @option{--prefix=/usr} sets the
|
|
variable @code{prefix} to the value @samp{/usr}; etc.
|
|
|
|
Site files are also good places to set default values for other output
|
|
variables, such as @code{CFLAGS}, if you need to give them non-default
|
|
values: anything you would normally do, repetitively, on the command
|
|
line. If you use non-default values for @var{prefix} or
|
|
@var{exec_prefix} (wherever you locate the site file), you can set them
|
|
in the site file if you specify it with the @code{CONFIG_SITE}
|
|
environment variable.
|
|
|
|
You can set some cache values in the site file itself. Doing this is
|
|
useful if you are cross-compiling, where it is impossible to check features
|
|
that require running a test program. You could ``prime the cache'' by
|
|
setting those values correctly for that system in
|
|
@file{@var{prefix}/etc/config.site}. To find out the names of the cache
|
|
variables you need to set, see the documentation of the respective
|
|
Autoconf macro. If the variables or their semantics are undocumented,
|
|
you may need to look for shell variables with @samp{_cv_} in their names
|
|
in the affected @command{configure} scripts, or in the Autoconf M4
|
|
source code for those macros; but in that case, their name or semantics
|
|
may change in a future Autoconf version.
|
|
|
|
The cache file is careful to not override any variables set in the site
|
|
files. Similarly, you should not override command-line options in the
|
|
site files. Your code should check that variables such as @code{prefix}
|
|
and @code{cache_file} have their default values (as set near the top of
|
|
@command{configure}) before changing them.
|
|
|
|
Here is a sample file @file{/usr/share/local/@/gnu/share/@/config.site}. The
|
|
command @samp{configure --prefix=/usr/share/local/gnu} would read this
|
|
file (if @code{CONFIG_SITE} is not set to a different file).
|
|
|
|
@example
|
|
# /usr/share/local/gnu/share/config.site for configure
|
|
#
|
|
# Change some defaults.
|
|
test "$prefix" = NONE && prefix=/usr/share/local/gnu
|
|
test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
|
|
test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
|
|
test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
|
|
test "$runstatedir" = '$@{localstatedir@}/run' && runstatedir=/run
|
|
|
|
# Give Autoconf 2.x generated configure scripts a shared default
|
|
# cache file for feature test results, architecture-specific.
|
|
if test "$cache_file" = /dev/null; then
|
|
cache_file="$prefix/var/config.cache"
|
|
# A cache file is only valid for one C compiler.
|
|
CC=gcc
|
|
fi
|
|
@end example
|
|
|
|
@c Leave this use of "File system" rendered as one word, but
|
|
@c slightly obfuscated so as not to trigger the syntax-check prohibition.
|
|
@cindex File@/system Hierarchy Standard
|
|
@cindex FHS
|
|
|
|
Another use of @file{config.site} is for priming the directory variables
|
|
@c "File system", but slightly obfuscated, as above.
|
|
in a manner consistent with the File@/system Hierarchy Standard
|
|
(FHS). Once the following file is installed at
|
|
@file{/usr/share/config.site}, a user can execute simply
|
|
@code{./configure --prefix=/usr} to get all the directories chosen in
|
|
the locations recommended by FHS.
|
|
|
|
@example
|
|
# /usr/share/config.site for FHS defaults when installing below /usr,
|
|
# and the respective settings were not changed on the command line.
|
|
if test "$prefix" = /usr; then
|
|
test "$sysconfdir" = '$@{prefix@}/etc' && sysconfdir=/etc
|
|
test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
|
|
test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
|
|
fi
|
|
@end example
|
|
|
|
@cindex @file{lib64}
|
|
@cindex 64-bit libraries
|
|
Likewise, on platforms where 64-bit libraries are built by default, then
|
|
installed in @file{/usr/local/@/lib64} instead of @file{/usr/local/@/lib},
|
|
it is appropriate to install @file{/usr/local/@/share/config.site}:
|
|
|
|
@example
|
|
# /usr/local/share/config.site for platforms that prefer
|
|
# the directory /usr/local/lib64 over /usr/local/lib.
|
|
test "$libdir" = '$@{exec_prefix@}/lib' && libdir='$@{exec_prefix@}/lib64'
|
|
@end example
|
|
|
|
|
|
@c ============================================== Running configure Scripts.
|
|
|
|
@node Running configure Scripts
|
|
@chapter Running @command{configure} Scripts
|
|
@cindex @command{configure}
|
|
|
|
Below are instructions on how to configure a package that uses a
|
|
@command{configure} script, suitable for inclusion as an @file{INSTALL}
|
|
file in the package. A plain-text version of @file{INSTALL} which you
|
|
may use comes with Autoconf.
|
|
|
|
@menu
|
|
* Basic Installation:: Instructions for typical cases
|
|
* Compilers and Options:: Selecting compilers and optimization
|
|
* Multiple Architectures:: Compiling for multiple architectures at once
|
|
* Installation Names:: Installing in different directories
|
|
* Optional Features:: Selecting optional features
|
|
* System Types:: Specifying a system type
|
|
* Sharing Defaults:: Setting site-wide defaults for @command{configure}
|
|
* Defining Variables:: Specifying the compiler etc.
|
|
* configure Invocation:: Changing how @command{configure} runs
|
|
@end menu
|
|
|
|
@set autoconf
|
|
@include install.texi
|
|
|
|
|
|
@c ============================================== config.status Invocation
|
|
|
|
@node config.status Invocation
|
|
@chapter config.status Invocation
|
|
@cindex @command{config.status}
|
|
|
|
The @command{configure} script creates a file named @file{config.status},
|
|
which actually configures, @dfn{instantiates}, the template files. It
|
|
also records the configuration options that were specified when the
|
|
package was last configured in case reconfiguring is needed.
|
|
|
|
Synopsis:
|
|
@example
|
|
./config.status @ovar{option}@dots{} @ovar{tag}@dots{}
|
|
@end example
|
|
|
|
It configures each @var{tag}; if none are specified, all the templates
|
|
are instantiated. A @var{tag} refers to a file or other tag associated
|
|
with a configuration action, as specified by an @code{AC_CONFIG_@var{ITEMS}}
|
|
macro (@pxref{Configuration Actions}). The files must be specified
|
|
without their dependencies, as in
|
|
|
|
@example
|
|
./config.status foobar
|
|
@end example
|
|
|
|
@noindent
|
|
not
|
|
|
|
@example
|
|
./config.status foobar:foo.in:bar.in
|
|
@end example
|
|
|
|
The supported options are:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options, the list of the template
|
|
files, and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and the configuration settings,
|
|
and exit.
|
|
|
|
@item --config
|
|
Print the configuration settings in reusable way, quoted for the shell,
|
|
and exit. For example, for a debugging build that otherwise reuses the
|
|
configuration from a different build directory @var{build-dir} of a
|
|
package in @var{src-dir}, you could use the following:
|
|
|
|
@example
|
|
args=`@var{build-dir}/config.status --config`
|
|
eval @var{src-dir}/configure "$args" CFLAGS=-g --srcdir=@var{src-dir}
|
|
@end example
|
|
|
|
@noindent
|
|
Note that it may be necessary to override a @option{--srcdir} setting
|
|
that was saved in the configuration, if the arguments are used in a
|
|
different build directory.
|
|
|
|
@item --silent
|
|
@itemx --quiet
|
|
@itemx -q
|
|
Do not print progress messages.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files.
|
|
|
|
@item --file=@var{file}[:@var{template}]
|
|
Require that @var{file} be instantiated as if
|
|
@samp{AC_CONFIG_FILES(@var{file}:@var{template})} was used. Both
|
|
@var{file} and @var{template} may be @samp{-} in which case the standard
|
|
output and/or standard input, respectively, is used. If a
|
|
@var{template} file name is relative, it is first looked for in the build
|
|
tree, and then in the source tree. @xref{Configuration Actions}, for
|
|
more details.
|
|
|
|
This option and the following ones provide one way for separately
|
|
distributed packages to share the values computed by @command{configure}.
|
|
Doing so can be useful if some of the packages need a superset of the
|
|
features that one of them, perhaps a common library, does. These
|
|
options allow a @file{config.status} file to create files other than the
|
|
ones that its @file{configure.ac} specifies, so it can be used for a
|
|
different package, or for extracting a subset of values. For example,
|
|
|
|
@example
|
|
echo '@@CC@@' | ./config.status --file=-
|
|
@end example
|
|
|
|
@noindent
|
|
provides the value of @code{@@CC@@} on standard output.
|
|
|
|
@item --header=@var{file}[:@var{template}]
|
|
Same as @option{--file} above, but with @samp{AC_CONFIG_HEADERS}.
|
|
|
|
@item --recheck
|
|
Ask @file{config.status} to update itself and exit (no instantiation).
|
|
This option is useful if you change @command{configure}, so that the
|
|
results of some tests might be different from the previous run. The
|
|
@option{--recheck} option reruns @command{configure} with the same arguments
|
|
you used before, plus the @option{--no-create} option, which prevents
|
|
@command{configure} from running @file{config.status} and creating
|
|
@file{Makefile} and other files, and the @option{--no-recursion} option,
|
|
which prevents @command{configure} from running other @command{configure}
|
|
scripts in subdirectories. (This is so other Make rules can
|
|
run @file{config.status} when it changes; @pxref{Automatic Remaking},
|
|
for an example).
|
|
@end table
|
|
|
|
@file{config.status} checks several optional environment variables that
|
|
can alter its behavior:
|
|
|
|
@anchor{CONFIG_SHELL}
|
|
@defvar CONFIG_SHELL
|
|
@evindex CONFIG_SHELL
|
|
The shell with which to run @command{configure}. It must be
|
|
Bourne-compatible, and the absolute name of the shell should be passed.
|
|
The default is a shell that supports @code{LINENO} if available, and
|
|
@file{/bin/sh} otherwise.
|
|
@end defvar
|
|
|
|
@defvar CONFIG_STATUS
|
|
@evindex CONFIG_STATUS
|
|
The file name to use for the shell script that records the
|
|
configuration. The default is @file{./config.status}. This variable is
|
|
useful when one package uses parts of another and the @command{configure}
|
|
scripts shouldn't be merged because they are maintained separately.
|
|
@end defvar
|
|
|
|
You can use @file{./config.status} in your makefiles. For example, in
|
|
the dependencies given above (@pxref{Automatic Remaking}),
|
|
@file{config.status} is run twice when @file{configure.ac} has changed.
|
|
If that bothers you, you can make each run only regenerate the files for
|
|
that rule:
|
|
@example
|
|
@group
|
|
config.h: stamp-h
|
|
stamp-h: config.h.in config.status
|
|
./config.status config.h
|
|
echo > stamp-h
|
|
|
|
Makefile: Makefile.in config.status
|
|
./config.status Makefile
|
|
@end group
|
|
@end example
|
|
|
|
The calling convention of @file{config.status} has changed; see
|
|
@ref{Obsolete config.status Use}, for details.
|
|
|
|
|
|
@c =================================================== Obsolete Constructs
|
|
|
|
@node Obsolete Constructs
|
|
@chapter Obsolete Constructs
|
|
@cindex Obsolete constructs
|
|
|
|
Autoconf changes, and throughout the years some constructs have been
|
|
obsoleted. Most of the changes involve the macros, but in some cases
|
|
the tools themselves, or even some concepts, are now considered
|
|
obsolete.
|
|
|
|
You may completely skip this chapter if you are new to Autoconf. Its
|
|
intention is mainly to help maintainers updating their packages by
|
|
understanding how to move to more modern constructs.
|
|
|
|
@menu
|
|
* Obsolete config.status Use:: Obsolete convention for @command{config.status}
|
|
* acconfig Header:: Additional entries in @file{config.h.in}
|
|
* autoupdate Invocation:: Automatic update of @file{configure.ac}
|
|
* Obsolete Macros:: Backward compatibility macros
|
|
* Autoconf 1:: Tips for upgrading your files
|
|
* Autoconf 2.13:: Some fresher tips
|
|
@end menu
|
|
|
|
@node Obsolete config.status Use
|
|
@section Obsolete @file{config.status} Invocation
|
|
|
|
@file{config.status} now supports arguments to specify the files to
|
|
instantiate; see @ref{config.status Invocation}, for more details.
|
|
Before, environment variables had to be used.
|
|
|
|
@defvar CONFIG_COMMANDS
|
|
@evindex CONFIG_COMMANDS
|
|
The tags of the commands to execute. The default is the arguments given
|
|
to @code{AC_OUTPUT} and @code{AC_CONFIG_COMMANDS} in
|
|
@file{configure.ac}.
|
|
@end defvar
|
|
|
|
@defvar CONFIG_FILES
|
|
@evindex CONFIG_FILES
|
|
The files in which to perform @samp{@@@var{variable}@@} substitutions.
|
|
The default is the arguments given to @code{AC_OUTPUT} and
|
|
@code{AC_CONFIG_FILES} in @file{configure.ac}.
|
|
@end defvar
|
|
|
|
@defvar CONFIG_HEADERS
|
|
@evindex CONFIG_HEADERS
|
|
The files in which to substitute C @code{#define} statements. The
|
|
default is the arguments given to @code{AC_CONFIG_HEADERS}; if that
|
|
macro was not called, @file{config.status} ignores this variable.
|
|
@end defvar
|
|
|
|
@defvar CONFIG_LINKS
|
|
@evindex CONFIG_LINKS
|
|
The symbolic links to establish. The default is the arguments given to
|
|
@code{AC_CONFIG_LINKS}; if that macro was not called,
|
|
@file{config.status} ignores this variable.
|
|
@end defvar
|
|
|
|
In @ref{config.status Invocation}, using this old interface, the example
|
|
would be:
|
|
|
|
@example
|
|
@group
|
|
config.h: stamp-h
|
|
stamp-h: config.h.in config.status
|
|
CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
|
|
CONFIG_HEADERS=config.h ./config.status
|
|
echo > stamp-h
|
|
|
|
Makefile: Makefile.in config.status
|
|
CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
|
|
CONFIG_FILES=Makefile ./config.status
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
(If @file{configure.ac} does not call @code{AC_CONFIG_HEADERS}, there is
|
|
no need to set @code{CONFIG_HEADERS} in the @command{make} rules. Equally
|
|
for @code{CONFIG_COMMANDS}, etc.)
|
|
|
|
|
|
@node acconfig Header
|
|
@section @file{acconfig.h}
|
|
|
|
@cindex @file{acconfig.h}
|
|
@cindex @file{config.h.top}
|
|
@cindex @file{config.h.bot}
|
|
|
|
In order to produce @file{config.h.in}, @command{autoheader} needs to
|
|
build or to find templates for each symbol. Modern releases of Autoconf
|
|
use @code{AH_VERBATIM} and @code{AH_TEMPLATE} (@pxref{Autoheader
|
|
Macros}), but in older releases a file, @file{acconfig.h}, contained the
|
|
list of needed templates. @command{autoheader} copied comments and
|
|
@code{#define} and @code{#undef} statements from @file{acconfig.h} in
|
|
the current directory, if present. This file used to be mandatory if
|
|
you @code{AC_DEFINE} any additional symbols.
|
|
|
|
Modern releases of Autoconf also provide @code{AH_TOP} and
|
|
@code{AH_BOTTOM} if you need to prepend/append some information to
|
|
@file{config.h.in}. Ancient versions of Autoconf had a similar feature:
|
|
if @file{./acconfig.h} contains the string @samp{@@TOP@@},
|
|
@command{autoheader} copies the lines before the line containing
|
|
@samp{@@TOP@@} into the top of the file that it generates. Similarly,
|
|
if @file{./acconfig.h} contains the string @samp{@@BOTTOM@@},
|
|
@command{autoheader} copies the lines after that line to the end of the
|
|
file it generates. Either or both of those strings may be omitted. An
|
|
even older alternate way to produce the same effect in ancient versions
|
|
of Autoconf is to create the files @file{@var{file}.top} (typically
|
|
@file{config.h.top}) and/or @file{@var{file}.bot} in the current
|
|
directory. If they exist, @command{autoheader} copies them to the
|
|
beginning and end, respectively, of its output.
|
|
|
|
In former versions of Autoconf, the files used in preparing a software
|
|
package for distribution were:
|
|
@example
|
|
@group
|
|
configure.ac --. .------> autoconf* -----> configure
|
|
+---+
|
|
[aclocal.m4] --+ `---.
|
|
[acsite.m4] ---' |
|
|
+--> [autoheader*] -> [config.h.in]
|
|
[acconfig.h] ----. |
|
|
+-----'
|
|
[config.h.top] --+
|
|
[config.h.bot] --'
|
|
@end group
|
|
@end example
|
|
|
|
Using only the @code{AH_} macros, @file{configure.ac} should be
|
|
self-contained, and should not depend upon @file{acconfig.h} etc.
|
|
|
|
|
|
@node autoupdate Invocation
|
|
@section Using @command{autoupdate} to Modernize @file{configure.ac}
|
|
@cindex @command{autoupdate}
|
|
|
|
The @command{autoupdate} program updates a @file{configure.ac} file that
|
|
calls Autoconf macros by their old names to use the current macro names.
|
|
In version 2 of Autoconf, most of the macros were renamed to use a more
|
|
uniform and descriptive naming scheme. @xref{Macro Names}, for a
|
|
description of the new scheme. Although the old names still work
|
|
(@pxref{Obsolete Macros}, for a list of the old macros and the corresponding
|
|
new names), you can make your @file{configure.ac} files more readable
|
|
and make it easier to use the current Autoconf documentation if you
|
|
update them to use the new macro names.
|
|
|
|
@evindex SIMPLE_BACKUP_SUFFIX
|
|
If given no arguments, @command{autoupdate} updates @file{configure.ac},
|
|
backing up the original version with the suffix @file{~} (or the value
|
|
of the environment variable @code{SIMPLE_BACKUP_SUFFIX}, if that is
|
|
set). If you give @command{autoupdate} an argument, it reads that file
|
|
instead of @file{configure.ac} and writes the updated file to the
|
|
standard output.
|
|
|
|
@noindent
|
|
@command{autoupdate} accepts the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Print a summary of the command line options and exit.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Print the version number of Autoconf and exit.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Report processing steps.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Don't remove the temporary files.
|
|
|
|
@item --force
|
|
@itemx -f
|
|
Force the update even if the file has not changed. Disregard the cache.
|
|
|
|
@item --include=@var{dir}
|
|
@itemx -I @var{dir}
|
|
Also look for input files in @var{dir}. Multiple invocations accumulate.
|
|
Directories are browsed from last to first.
|
|
|
|
@item --prepend-include=@var{dir}
|
|
@itemx -B @var{dir}
|
|
Prepend directory @var{dir} to the search path. This is used to include
|
|
the language-specific files before any third-party macros.
|
|
@end table
|
|
|
|
@node Obsolete Macros
|
|
@section Obsolete Macros
|
|
|
|
Several macros are obsoleted in Autoconf, for various reasons (typically
|
|
they failed to quote properly, couldn't be extended for more recent
|
|
issues, etc.). They are still supported, but deprecated: their use
|
|
should be avoided.
|
|
|
|
During the jump from Autoconf version 1 to version 2, most of the
|
|
macros were renamed to use a more uniform and descriptive naming scheme,
|
|
but their signature did not change. @xref{Macro Names}, for a
|
|
description of the new naming scheme. Below, if there is just the mapping
|
|
from old names to new names for these macros, the reader is invited to
|
|
refer to the definition of the new macro for the signature and the
|
|
description.
|
|
|
|
@defmac AC_AIX
|
|
@acindex{AIX}
|
|
@cvindex _ALL_SOURCE
|
|
This macro is a platform-specific subset of
|
|
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
|
|
@end defmac
|
|
|
|
@defmac AC_ALLOCA
|
|
@acindex{ALLOCA}
|
|
Replaced by @code{AC_FUNC_ALLOCA} (@pxref{AC_FUNC_ALLOCA}).
|
|
@end defmac
|
|
|
|
@defmac AC_ARG_ARRAY
|
|
@acindex{ARG_ARRAY}
|
|
Removed because of limited usefulness.
|
|
@end defmac
|
|
|
|
@defmac AC_C_CROSS
|
|
@acindex{C_CROSS}
|
|
This macro is obsolete; it does nothing.
|
|
@end defmac
|
|
|
|
@defmac AC_C_LONG_DOUBLE
|
|
@acindex{C_LONG_DOUBLE}
|
|
@cvindex HAVE_LONG_DOUBLE
|
|
If the C compiler supports a working @code{long double} type with more
|
|
range or precision than the @code{double} type, define
|
|
@code{HAVE_LONG_DOUBLE}.
|
|
|
|
You should use @code{AC_TYPE_LONG_DOUBLE} or
|
|
@code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}.
|
|
@end defmac
|
|
|
|
@defmac AC_CANONICAL_SYSTEM
|
|
@acindex{CANONICAL_SYSTEM}
|
|
Determine the system type and set output variables to the names of the
|
|
canonical system types. @xref{Canonicalizing}, for details about the
|
|
variables this macro sets.
|
|
|
|
The user is encouraged to use either @code{AC_CANONICAL_BUILD}, or
|
|
@code{AC_CANONICAL_HOST}, or @code{AC_CANONICAL_TARGET}, depending on
|
|
the needs. Using @code{AC_CANONICAL_TARGET} is enough to run the two
|
|
other macros (@pxref{Canonicalizing}).
|
|
@end defmac
|
|
|
|
@defmac AC_CHAR_UNSIGNED
|
|
@acindex{CHAR_UNSIGNED}
|
|
Replaced by @code{AC_C_CHAR_UNSIGNED} (@pxref{AC_C_CHAR_UNSIGNED}).
|
|
@end defmac
|
|
|
|
@defmac AC_CHECK_TYPE (@var{type}, @var{default})
|
|
@acindex{CHECK_TYPE}
|
|
Autoconf, up to 2.13, used to provide this version of
|
|
@code{AC_CHECK_TYPE}, deprecated because of its flaws. First, although
|
|
it is a member of the @code{CHECK} clan, it does
|
|
more than just checking. Secondly, missing types are defined
|
|
using @code{#define}, not @code{typedef}, and this can lead to
|
|
problems in the case of pointer types.
|
|
|
|
This use of @code{AC_CHECK_TYPE} is obsolete and discouraged; see
|
|
@ref{Generic Types}, for the description of the current macro.
|
|
|
|
If the type @var{type} is not defined, define it to be the C (or C++)
|
|
builtin type @var{default}, e.g., @samp{short int} or @samp{unsigned int}.
|
|
|
|
This macro is equivalent to:
|
|
|
|
@example
|
|
AC_CHECK_TYPE([@var{type}], [],
|
|
[AC_DEFINE_UNQUOTED([@var{type}], [@var{default}],
|
|
[Define to '@var{default}'
|
|
if <sys/types.h> does not define.])])
|
|
@end example
|
|
|
|
In order to keep backward compatibility, the two versions of
|
|
@code{AC_CHECK_TYPE} are implemented, selected using these heuristics:
|
|
|
|
@enumerate
|
|
@item
|
|
If there are three or four arguments, the modern version is used.
|
|
|
|
@item
|
|
If the second argument appears to be a C or C++ type, then the
|
|
obsolete version is used. This happens if the argument is a C or C++
|
|
@emph{builtin} type or a C identifier ending in @samp{_t}, optionally
|
|
followed by one of @samp{[(* } and then by a string of zero or more
|
|
characters taken from the set @samp{[]()* _a-zA-Z0-9}.
|
|
|
|
@item
|
|
If the second argument is spelled with the alphabet of valid C and C++
|
|
types, the user is warned and the modern version is used.
|
|
|
|
@item
|
|
Otherwise, the modern version is used.
|
|
@end enumerate
|
|
|
|
@noindent
|
|
You are encouraged either to use a valid builtin type, or to use the
|
|
equivalent modern code (see above), or better yet, to use
|
|
@code{AC_CHECK_TYPES} together with
|
|
|
|
@example
|
|
#ifndef HAVE_LOFF_T
|
|
typedef loff_t off_t;
|
|
#endif
|
|
@end example
|
|
@end defmac
|
|
@c end of AC_CHECK_TYPE
|
|
|
|
@defmac AC_CHECKING (@var{feature-description})
|
|
@acindex{CHECKING}
|
|
Same as
|
|
|
|
@example
|
|
AC_MSG_NOTICE([checking @var{feature-description}@dots{}]
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{AC_MSG_NOTICE}.
|
|
@end defmac
|
|
|
|
@defmac AC_COMPILE_CHECK (@var{echo-text}, @var{includes}, @
|
|
@var{function-body}, @var{action-if-true}, @ovar{action-if-false})
|
|
@acindex{COMPILE_CHECK}
|
|
This is an obsolete version of @code{AC_TRY_COMPILE} itself replaced by
|
|
@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}), with the
|
|
addition that it prints @samp{checking for @var{echo-text}} to the
|
|
standard output first, if @var{echo-text} is non-empty. Use
|
|
@code{AC_MSG_CHECKING} and @code{AC_MSG_RESULT} instead to print
|
|
messages (@pxref{Printing Messages}).
|
|
@end defmac
|
|
|
|
@defmac AC_CONST
|
|
@acindex{CONST}
|
|
Replaced by @code{AC_C_CONST} (@pxref{AC_C_CONST}).
|
|
@end defmac
|
|
|
|
@defmac AC_CROSS_CHECK
|
|
@acindex{CROSS_CHECK}
|
|
Same as @code{AC_C_CROSS}, which is obsolete too, and does nothing
|
|
@code{:-)}.
|
|
@end defmac
|
|
|
|
@defmac AC_CYGWIN
|
|
@acindex{CYGWIN}
|
|
@evindex CYGWIN
|
|
Check for the Cygwin environment in which case the shell variable
|
|
@code{CYGWIN} is set to @samp{yes}. Don't use this macro, the dignified
|
|
means to check the nature of the host is using @code{AC_CANONICAL_HOST}
|
|
(@pxref{Canonicalizing}). As a matter of fact this macro is defined as:
|
|
|
|
@example
|
|
AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
|
|
case $host_os in
|
|
*cygwin* ) CYGWIN=yes;;
|
|
* ) CYGWIN=no;;
|
|
esac
|
|
@end example
|
|
|
|
Beware that the variable @env{CYGWIN} has a special meaning when
|
|
running Cygwin, and should not be changed. That's yet another reason
|
|
not to use this macro.
|
|
@end defmac
|
|
|
|
@defmac AC_DECL_SYS_SIGLIST
|
|
@acindex{DECL_SYS_SIGLIST}
|
|
@cvindex SYS_SIGLIST_DECLARED
|
|
Same as:
|
|
|
|
@example
|
|
AC_CHECK_DECLS([sys_siglist], [], [],
|
|
[#include <signal.h>
|
|
/* NetBSD declares sys_siglist in unistd.h. */
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
])
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{AC_CHECK_DECLS}.
|
|
@end defmac
|
|
|
|
@defmac AC_DECL_YYTEXT
|
|
@acindex{DECL_YYTEXT}
|
|
Does nothing, now integrated in @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
|
|
@end defmac
|
|
|
|
@defmac AC_DIAGNOSE (@var{category}, @var{message})
|
|
@acindex{DIAGNOSE}
|
|
Replaced by @code{m4_warn} (@pxref{m4_warn}).
|
|
@end defmac
|
|
|
|
@defmac AC_DIR_HEADER
|
|
@acindex{DIR_HEADER}
|
|
@cvindex DIRENT
|
|
@cvindex SYSNDIR
|
|
@cvindex SYSDIR
|
|
@cvindex NDIR
|
|
Like calling @code{AC_FUNC_CLOSEDIR_VOID}
|
|
(@pxref{AC_FUNC_CLOSEDIR_VOID}) and @code{AC_HEADER_DIRENT}
|
|
(@pxref{AC_HEADER_DIRENT}),
|
|
but defines a different set of C preprocessor macros to indicate which
|
|
header file is found:
|
|
|
|
@multitable {@file{sys/ndir.h}} {Old Symbol} {@code{HAVE_SYS_NDIR_H}}
|
|
@item Header @tab Old Symbol @tab New Symbol
|
|
@item @file{dirent.h} @tab @code{DIRENT} @tab @code{HAVE_DIRENT_H}
|
|
@item @file{sys/ndir.h} @tab @code{SYSNDIR} @tab @code{HAVE_SYS_NDIR_H}
|
|
@item @file{sys/dir.h} @tab @code{SYSDIR} @tab @code{HAVE_SYS_DIR_H}
|
|
@item @file{ndir.h} @tab @code{NDIR} @tab @code{HAVE_NDIR_H}
|
|
@end multitable
|
|
@end defmac
|
|
|
|
@defmac AC_DYNIX_SEQ
|
|
@acindex{DYNIX_SEQ}
|
|
If on DYNIX/ptx, add @option{-lseq} to output variable
|
|
@code{LIBS}. This macro used to be defined as
|
|
|
|
@example
|
|
AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])
|
|
@end example
|
|
|
|
@noindent
|
|
now it is just @code{AC_FUNC_GETMNTENT} (@pxref{AC_FUNC_GETMNTENT}).
|
|
@end defmac
|
|
|
|
@defmac AC_EXEEXT
|
|
@acindex{EXEEXT}
|
|
@ovindex EXEEXT
|
|
Defined the output variable @code{EXEEXT} based on the output of the
|
|
compiler, which is now done automatically. Typically set to empty
|
|
string if POSIX and @samp{.exe} if a DOS variant.
|
|
@end defmac
|
|
|
|
@defmac AC_EMXOS2
|
|
@acindex{EMXOS2}
|
|
Similar to @code{AC_CYGWIN} but checks for the EMX environment on OS/2
|
|
and sets @code{EMXOS2}. Don't use this macro, the dignified means to
|
|
check the nature of the host is using @code{AC_CANONICAL_HOST}
|
|
(@pxref{Canonicalizing}).
|
|
@end defmac
|
|
|
|
@defmac AC_ENABLE (@var{feature}, @var{action-if-given}, @
|
|
@ovar{action-if-not-given})
|
|
@acindex{ENABLE}
|
|
This is an obsolete version of @code{AC_ARG_ENABLE} that does not
|
|
support providing a help string (@pxref{AC_ARG_ENABLE}).
|
|
@end defmac
|
|
|
|
@defmac AC_ERROR
|
|
@acindex{ERROR}
|
|
Replaced by @code{AC_MSG_ERROR} (@pxref{AC_MSG_ERROR}).
|
|
@end defmac
|
|
|
|
@defmac AC_FATAL (@var{message})
|
|
@acindex{FATAL}
|
|
Replaced by @code{m4_fatal} (@pxref{m4_fatal}).
|
|
@end defmac
|
|
|
|
@defmac AC_FIND_X
|
|
@acindex{FIND_X}
|
|
Replaced by @code{AC_PATH_X} (@pxref{AC_PATH_X}).
|
|
@end defmac
|
|
|
|
@defmac AC_FIND_XTRA
|
|
@acindex{FIND_XTRA}
|
|
Replaced by @code{AC_PATH_XTRA} (@pxref{AC_PATH_XTRA}).
|
|
@end defmac
|
|
|
|
@defmac AC_FOREACH
|
|
@acindex{FOREACH}
|
|
Replaced by @code{m4_foreach_w} (@pxref{m4_foreach_w}).
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_CHECK
|
|
@acindex{FUNC_CHECK}
|
|
Replaced by @code{AC_CHECK_FUNC} (@pxref{AC_CHECK_FUNC}).
|
|
@end defmac
|
|
|
|
@anchor{AC_FUNC_SETVBUF_REVERSED}
|
|
@defmac AC_FUNC_SETVBUF_REVERSED
|
|
@acindex{FUNC_SETVBUF_REVERSED}
|
|
@cvindex SETVBUF_REVERSED
|
|
@c @fuindex setvbuf
|
|
@prindex @code{setvbuf}
|
|
Do nothing. Formerly, this macro checked whether @code{setvbuf} takes
|
|
the buffering type as its second argument and the buffer pointer as the
|
|
third, instead of the other way around, and defined
|
|
@code{SETVBUF_REVERSED}. However, the last systems to have the problem
|
|
were those based on SVR2, which became obsolete in 1987, and the macro
|
|
is no longer needed.
|
|
@end defmac
|
|
|
|
@defmac AC_FUNC_WAIT3
|
|
@acindex{FUNC_WAIT3}
|
|
@cvindex HAVE_WAIT3
|
|
@c @fuindex wait3
|
|
@prindex @code{wait3}
|
|
If @code{wait3} is found and fills in the contents of its third argument
|
|
(a @samp{struct rusage *}), which HP-UX does not do, define
|
|
@code{HAVE_WAIT3}.
|
|
|
|
These days portable programs should use @code{waitpid}, not
|
|
@code{wait3}, as @code{wait3} has been removed from POSIX.
|
|
@end defmac
|
|
|
|
@defmac AC_GCC_TRADITIONAL
|
|
@acindex{GCC_TRADITIONAL}
|
|
Replaced by @code{AC_PROG_GCC_TRADITIONAL} (@pxref{AC_PROG_GCC_TRADITIONAL}),
|
|
which is itself obsolete.
|
|
@end defmac
|
|
|
|
@defmac AC_GETGROUPS_T
|
|
@acindex{GETGROUPS_T}
|
|
Replaced by @code{AC_TYPE_GETGROUPS} (@pxref{AC_TYPE_GETGROUPS}).
|
|
@end defmac
|
|
|
|
@defmac AC_GETLOADAVG
|
|
@acindex{GETLOADAVG}
|
|
Replaced by @code{AC_FUNC_GETLOADAVG} (@pxref{AC_FUNC_GETLOADAVG}).
|
|
@end defmac
|
|
|
|
@defmac AC_GNU_SOURCE
|
|
@acindex{GNU_SOURCE}
|
|
@cvindex _GNU_SOURCE
|
|
This macro is a platform-specific subset of
|
|
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
|
|
@end defmac
|
|
|
|
@defmac AC_HAVE_FUNCS
|
|
@acindex{HAVE_FUNCS}
|
|
Replaced by @code{AC_CHECK_FUNCS} (@pxref{AC_CHECK_FUNCS}).
|
|
@end defmac
|
|
|
|
@defmac AC_HAVE_HEADERS
|
|
@acindex{HAVE_HEADERS}
|
|
Replaced by @code{AC_CHECK_HEADERS} (@pxref{AC_CHECK_HEADERS}).
|
|
@end defmac
|
|
|
|
@defmac AC_HAVE_LIBRARY (@var{library}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found}, @ovar{other-libraries})
|
|
@acindex{HAVE_LIBRARY}
|
|
This macro is equivalent to calling @code{AC_CHECK_LIB} with a
|
|
@var{function} argument of @code{main}. In addition, @var{library} can
|
|
be written as any of @samp{foo}, @option{-lfoo}, or @samp{libfoo.a}. In
|
|
all of those cases, the compiler is passed @option{-lfoo}. However,
|
|
@var{library} cannot be a shell variable; it must be a literal name.
|
|
@xref{AC_CHECK_LIB}.
|
|
@end defmac
|
|
|
|
@defmac AC_HAVE_POUNDBANG
|
|
@acindex{HAVE_POUNDBANG}
|
|
Replaced by @code{AC_SYS_INTERPRETER} (@pxref{AC_SYS_INTERPRETER}).
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_CHECK
|
|
@acindex{HEADER_CHECK}
|
|
Replaced by @code{AC_CHECK_HEADER} (@pxref{AC_CHECK_HEADER}).
|
|
@end defmac
|
|
|
|
@defmac AC_HEADER_EGREP
|
|
@acindex{HEADER_EGREP}
|
|
Replaced by @code{AC_EGREP_HEADER} (@pxref{AC_EGREP_HEADER}).
|
|
@end defmac
|
|
|
|
@anchor{AC_HEADER_TIME}
|
|
@defmac AC_HEADER_TIME
|
|
@acindex{HEADER_TIME}
|
|
@cvindex TIME_WITH_SYS_TIME
|
|
@hdrindex{time.h}
|
|
@hdrindex{sys/time.h}
|
|
@caindex header_time
|
|
This macro used to check whether it was possible to include
|
|
@file{time.h} and @file{sys/time.h} in the same source file,
|
|
defining @code{TIME_WITH_SYS_TIME} if so.
|
|
|
|
Nowadays, it is equivalent to @samp{AC_CHECK_HEADERS([sys/time.h])},
|
|
although it does still define @code{TIME_WITH_SYS_TIME} for
|
|
compatibility's sake. @file{time.h} is universally present, and the
|
|
systems on which @file{sys/time.h} conflicted with @file{time.h} are
|
|
obsolete.
|
|
@end defmac
|
|
|
|
@defmac AC_HELP_STRING
|
|
@acindex{HELP_STRING}
|
|
Replaced by @code{AS_HELP_STRING} (@pxref{AS_HELP_STRING}).
|
|
@end defmac
|
|
|
|
@defmac AC_INIT (@var{unique-file-in-source-dir})
|
|
@acindex{INIT}
|
|
Formerly @code{AC_INIT} used to have a single argument, and was
|
|
equivalent to:
|
|
|
|
@example
|
|
AC_INIT
|
|
AC_CONFIG_SRCDIR(@var{unique-file-in-source-dir})
|
|
@end example
|
|
See @ref{AC_INIT} and @ref{AC_CONFIG_SRCDIR}.
|
|
@end defmac
|
|
|
|
@defmac AC_INLINE
|
|
@acindex{INLINE}
|
|
Replaced by @code{AC_C_INLINE} (@pxref{AC_C_INLINE}).
|
|
@end defmac
|
|
|
|
@defmac AC_INT_16_BITS
|
|
@acindex{INT_16_BITS}
|
|
@cvindex INT_16_BITS
|
|
If the C type @code{int} is 16 bits wide, define @code{INT_16_BITS}.
|
|
Use @samp{AC_CHECK_SIZEOF(int)} instead (@pxref{AC_CHECK_SIZEOF}).
|
|
@end defmac
|
|
|
|
@defmac AC_IRIX_SUN
|
|
@acindex{IRIX_SUN}
|
|
If on IRIX (Silicon Graphics Unix), add @option{-lsun} to output
|
|
@code{LIBS}. If you were using it to get @code{getmntent}, use
|
|
@code{AC_FUNC_GETMNTENT} instead. If you used it for the NIS versions
|
|
of the password and group functions, use @samp{AC_CHECK_LIB(sun,
|
|
getpwnam)}. Up to Autoconf 2.13, it used to be
|
|
|
|
@example
|
|
AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])
|
|
@end example
|
|
|
|
@noindent
|
|
now it is defined as
|
|
|
|
@example
|
|
AC_FUNC_GETMNTENT
|
|
AC_CHECK_LIB([sun], [getpwnam])
|
|
@end example
|
|
|
|
@noindent
|
|
See @ref{AC_FUNC_GETMNTENT} and @ref{AC_CHECK_LIB}.
|
|
@end defmac
|
|
|
|
@defmac AC_ISC_POSIX
|
|
@acindex{ISC_POSIX}
|
|
@ovindex LIBS
|
|
This macro adds @option{-lcposix} to output variable @code{LIBS} if
|
|
necessary for POSIX facilities. Sun dropped support for the obsolete
|
|
INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs
|
|
need not use this macro. It is implemented as
|
|
@code{AC_SEARCH_LIBS([strerror], [cposix])} (@pxref{AC_SEARCH_LIBS}).
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_C
|
|
@acindex{LANG_C}
|
|
Same as @samp{AC_LANG([C])} (@pxref{AC_LANG}).
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_CPLUSPLUS
|
|
@acindex{LANG_CPLUSPLUS}
|
|
Same as @samp{AC_LANG([C++])} (@pxref{AC_LANG}).
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_FORTRAN77
|
|
@acindex{LANG_FORTRAN77}
|
|
Same as @samp{AC_LANG([Fortran 77])} (@pxref{AC_LANG}).
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_RESTORE
|
|
@acindex{LANG_RESTORE}
|
|
Select the @var{language} that is saved on the top of the stack, as set
|
|
by @code{AC_LANG_SAVE}, remove it from the stack, and call
|
|
@code{AC_LANG(@var{language})}. @xref{Language Choice}, for the
|
|
preferred way to change languages.
|
|
@end defmac
|
|
|
|
@defmac AC_LANG_SAVE
|
|
@acindex{LANG_SAVE}
|
|
Remember the current language (as set by @code{AC_LANG}) on a stack.
|
|
The current language does not change. @code{AC_LANG_PUSH} is preferred
|
|
(@pxref{AC_LANG_PUSH}).
|
|
@end defmac
|
|
|
|
@defmac AC_LINK_FILES (@var{source}@dots{}, @var{dest}@dots{})
|
|
@acindex{LINK_FILES}
|
|
This is an obsolete version of @code{AC_CONFIG_LINKS}
|
|
(@pxref{AC_CONFIG_LINKS}. An updated version of:
|
|
|
|
@example
|
|
AC_LINK_FILES(config/$machine.h config/$obj_format.h,
|
|
host.h object.h)
|
|
@end example
|
|
|
|
@noindent
|
|
is:
|
|
|
|
@example
|
|
AC_CONFIG_LINKS([host.h:config/$machine.h
|
|
object.h:config/$obj_format.h])
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_LN_S
|
|
@acindex{LN_S}
|
|
Replaced by @code{AC_PROG_LN_S} (@pxref{AC_PROG_LN_S}).
|
|
@end defmac
|
|
|
|
@defmac AC_LONG_64_BITS
|
|
@acindex{LONG_64_BITS}
|
|
@cvindex LONG_64_BITS
|
|
Define @code{LONG_64_BITS} if the C type @code{long int} is 64 bits wide.
|
|
Use the generic macro @samp{AC_CHECK_SIZEOF([long int])} instead
|
|
(@pxref{AC_CHECK_SIZEOF}).
|
|
@end defmac
|
|
|
|
@defmac AC_LONG_DOUBLE
|
|
@acindex{LONG_DOUBLE}
|
|
If the C compiler supports a working @code{long double} type with more
|
|
range or precision than the @code{double} type, define
|
|
@code{HAVE_LONG_DOUBLE}.
|
|
|
|
You should use @code{AC_TYPE_LONG_DOUBLE} or
|
|
@code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}.
|
|
@end defmac
|
|
|
|
@defmac AC_LONG_FILE_NAMES
|
|
@acindex{LONG_FILE_NAMES}
|
|
Replaced by
|
|
@example
|
|
AC_SYS_LONG_FILE_NAMES
|
|
@end example
|
|
@noindent
|
|
@xref{AC_SYS_LONG_FILE_NAMES}.
|
|
@end defmac
|
|
|
|
@defmac AC_MAJOR_HEADER
|
|
@acindex{MAJOR_HEADER}
|
|
Replaced by @code{AC_HEADER_MAJOR} (@pxref{AC_HEADER_MAJOR}).
|
|
@end defmac
|
|
|
|
@defmac AC_MEMORY_H
|
|
@acindex{MEMORY_H}
|
|
@cvindex NEED_MEMORY_H
|
|
Used to define @code{NEED_MEMORY_H} if the @code{mem} functions were
|
|
defined in @file{memory.h}. Today it is equivalent to
|
|
@samp{AC_CHECK_HEADERS([memory.h])} (@pxref{AC_CHECK_HEADERS}). Adjust
|
|
your code to get the @code{mem} functions from @file{string.h} instead.
|
|
@end defmac
|
|
|
|
@defmac AC_MINGW32
|
|
@acindex{MINGW32}
|
|
Similar to @code{AC_CYGWIN} but checks for the MinGW compiler
|
|
environment and sets @code{MINGW32}. Don't use this macro, the
|
|
dignified means to check the nature of the host is using
|
|
@code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
|
|
@end defmac
|
|
|
|
@defmac AC_MINIX
|
|
@acindex{MINIX}
|
|
@cvindex _MINIX
|
|
@cvindex _POSIX_SOURCE
|
|
@cvindex _POSIX_1_SOURCE
|
|
This macro is a platform-specific subset of
|
|
@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
|
|
@end defmac
|
|
|
|
@defmac AC_MINUS_C_MINUS_O
|
|
@acindex{MINUS_C_MINUS_O}
|
|
Replaced by @code{AC_PROG_CC_C_O} (@pxref{AC_PROG_CC_C_O}).
|
|
@end defmac
|
|
|
|
@defmac AC_MMAP
|
|
@acindex{MMAP}
|
|
Replaced by @code{AC_FUNC_MMAP} (@pxref{AC_FUNC_MMAP}).
|
|
@end defmac
|
|
|
|
@defmac AC_MODE_T
|
|
@acindex{MODE_T}
|
|
Replaced by @code{AC_TYPE_MODE_T} (@pxref{AC_TYPE_MODE_T}).
|
|
@end defmac
|
|
|
|
@defmac AC_OBJEXT
|
|
@acindex{OBJEXT}
|
|
@ovindex OBJEXT
|
|
Defined the output variable @code{OBJEXT} based on the output of the
|
|
compiler, after .c files have been excluded. Typically set to @samp{o}
|
|
if POSIX, @samp{obj} if a DOS variant.
|
|
Now the compiler checking macros handle
|
|
this automatically.
|
|
@end defmac
|
|
|
|
@defmac AC_OBSOLETE (@var{this-macro-name}, @ovar{suggestion})
|
|
@acindex{OBSOLETE}
|
|
Make M4 print a message to the standard error output warning that
|
|
@var{this-macro-name} is obsolete, and giving the file and line number
|
|
where it was called. @var{this-macro-name} should be the name of the
|
|
macro that is calling @code{AC_OBSOLETE}. If @var{suggestion} is given,
|
|
it is printed at the end of the warning message; for example, it can be
|
|
a suggestion for what to use instead of @var{this-macro-name}.
|
|
|
|
For instance
|
|
|
|
@example
|
|
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
|
|
@end example
|
|
|
|
@noindent
|
|
You are encouraged to use @code{AU_DEFUN} instead, since it gives better
|
|
services to the user (@pxref{AU_DEFUN}).
|
|
@end defmac
|
|
|
|
@defmac AC_OFF_T
|
|
@acindex{OFF_T}
|
|
Replaced by @code{AC_TYPE_OFF_T} (@pxref{AC_TYPE_OFF_T}).
|
|
@end defmac
|
|
|
|
@defmac AC_OUTPUT (@ovar{file}@dots{}, @ovar{extra-cmds}, @ovar{init-cmds})
|
|
@acindex{OUTPUT}
|
|
The use of @code{AC_OUTPUT} with arguments is deprecated. This obsoleted
|
|
interface is equivalent to:
|
|
|
|
@example
|
|
@group
|
|
AC_CONFIG_FILES(@var{file}@dots{})
|
|
AC_CONFIG_COMMANDS([default],
|
|
@var{extra-cmds}, @var{init-cmds})
|
|
AC_OUTPUT
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
See @ref{AC_CONFIG_FILES}, @ref{AC_CONFIG_COMMANDS}, and @ref{AC_OUTPUT}.
|
|
@end defmac
|
|
|
|
@defmac AC_OUTPUT_COMMANDS (@var{extra-cmds}, @ovar{init-cmds})
|
|
@acindex{OUTPUT_COMMANDS}
|
|
Specify additional shell commands to run at the end of
|
|
@file{config.status}, and shell commands to initialize any variables
|
|
from @command{configure}. This macro may be called multiple times. It is
|
|
obsolete, replaced by @code{AC_CONFIG_COMMANDS} (@pxref{AC_CONFIG_COMMANDS}).
|
|
|
|
Here is an unrealistic example:
|
|
|
|
@example
|
|
fubar=27
|
|
AC_OUTPUT_COMMANDS(
|
|
[AS_ECHO(["this is extra $fubar, and so on."])],
|
|
[fubar=$fubar])
|
|
AC_OUTPUT_COMMANDS(
|
|
[AS_ECHO(["this is another, extra, bit"])],
|
|
[AS_ECHO(["init bit"])])
|
|
@end example
|
|
|
|
Aside from the fact that @code{AC_CONFIG_COMMANDS} requires an
|
|
additional key, an important difference is that
|
|
@code{AC_OUTPUT_COMMANDS} is quoting its arguments twice, unlike
|
|
@code{AC_CONFIG_COMMANDS}. This means that @code{AC_CONFIG_COMMANDS}
|
|
can safely be given macro calls as arguments:
|
|
|
|
@example
|
|
AC_CONFIG_COMMANDS(foo, [my_FOO()])
|
|
@end example
|
|
|
|
@noindent
|
|
Conversely, where one level of quoting was enough for literal strings
|
|
with @code{AC_OUTPUT_COMMANDS}, you need two with
|
|
@code{AC_CONFIG_COMMANDS}. The following lines are equivalent:
|
|
|
|
@example
|
|
@group
|
|
AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
|
|
AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
|
|
@end group
|
|
@end example
|
|
@end defmac
|
|
|
|
@defmac AC_PID_T
|
|
@acindex{PID_T}
|
|
Replaced by @code{AC_TYPE_PID_T} (@pxref{AC_TYPE_PID_T}).
|
|
@end defmac
|
|
|
|
@defmac AC_PREFIX
|
|
@acindex{PREFIX}
|
|
Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CC_C89
|
|
@acindex{PROG_CC_C89}
|
|
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CC_C99
|
|
@acindex{PROG_CC_C99}
|
|
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROG_CC_STDC
|
|
@acindex{PROG_CC_STDC}
|
|
Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
|
|
@end defmac
|
|
|
|
@anchor{AC_PROG_GCC_TRADITIONAL}
|
|
@defmac AC_PROG_GCC_TRADITIONAL
|
|
@acindex{PROG_GCC_TRADITIONAL}
|
|
Used to put GCC into ``traditional'' (pre-ISO C) compilation mode,
|
|
on systems with headers that did not work correctly with a
|
|
standard-compliant compiler. GCC has not supported traditional
|
|
compilation in many years, and all of the systems that required this are
|
|
long obsolete themselves. This macro is now a compatibility synonym for
|
|
@code{AC_PROG_CC} (@pxref{AC_PROG_CC}).
|
|
|
|
@end defmac
|
|
|
|
@defmac AC_PROGRAMS_CHECK
|
|
@acindex{PROGRAMS_CHECK}
|
|
Replaced by @code{AC_CHECK_PROGS} (@pxref{AC_CHECK_PROGS}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROGRAMS_PATH
|
|
@acindex{PROGRAMS_PATH}
|
|
Replaced by @code{AC_PATH_PROGS} (@pxref{AC_PATH_PROGS}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROGRAM_CHECK
|
|
@acindex{PROGRAM_CHECK}
|
|
Replaced by @code{AC_CHECK_PROG} (@pxref{AC_CHECK_PROG}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROGRAM_EGREP
|
|
@acindex{PROGRAM_EGREP}
|
|
Replaced by @code{AC_EGREP_CPP} (@pxref{AC_EGREP_CPP}).
|
|
@end defmac
|
|
|
|
@defmac AC_PROGRAM_PATH
|
|
@acindex{PROGRAM_PATH}
|
|
Replaced by @code{AC_PATH_PROG} (@pxref{AC_PATH_PROG}).
|
|
@end defmac
|
|
|
|
@defmac AC_REMOTE_TAPE
|
|
@acindex{REMOTE_TAPE}
|
|
Removed because of limited usefulness.
|
|
@end defmac
|
|
|
|
@defmac AC_RESTARTABLE_SYSCALLS
|
|
@acindex{RESTARTABLE_SYSCALLS}
|
|
This macro was renamed @code{AC_SYS_RESTARTABLE_SYSCALLS}. However,
|
|
these days portable programs should use @code{sigaction} with
|
|
@code{SA_RESTART} if they want restartable system calls. They should
|
|
not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
|
|
system call is restartable is a dynamic issue, not a configuration-time
|
|
issue.
|
|
@end defmac
|
|
|
|
@defmac AC_RETSIGTYPE
|
|
@acindex{RETSIGTYPE}
|
|
Replaced by @code{AC_TYPE_SIGNAL} (@pxref{AC_TYPE_SIGNAL}), which itself
|
|
is obsolete.
|
|
@end defmac
|
|
|
|
@defmac AC_RSH
|
|
@acindex{RSH}
|
|
Removed because of limited usefulness.
|
|
@end defmac
|
|
|
|
@defmac AC_SCO_INTL
|
|
@acindex{SCO_INTL}
|
|
@ovindex LIBS
|
|
Equivalent to the obsolescent macro @code{AC_FUNC_STRFTIME}.
|
|
@xref{AC_FUNC_STRFTIME}.
|
|
@end defmac
|
|
|
|
@defmac AC_SETVBUF_REVERSED
|
|
@acindex{SETVBUF_REVERSED}
|
|
Replaced by
|
|
@example
|
|
AC_FUNC_SETVBUF_REVERSED
|
|
@end example
|
|
@noindent
|
|
@xref{AC_FUNC_SETVBUF_REVERSED}.
|
|
@end defmac
|
|
|
|
@defmac AC_SET_MAKE
|
|
@acindex{SET_MAKE}
|
|
Replaced by @code{AC_PROG_MAKE_SET} (@pxref{AC_PROG_MAKE_SET}).
|
|
@end defmac
|
|
|
|
@defmac AC_SIZEOF_TYPE
|
|
@acindex{SIZEOF_TYPE}
|
|
Replaced by @code{AC_CHECK_SIZEOF} (@pxref{AC_CHECK_SIZEOF}).
|
|
@end defmac
|
|
|
|
@defmac AC_SIZE_T
|
|
@acindex{SIZE_T}
|
|
Replaced by @code{AC_TYPE_SIZE_T} (@pxref{AC_TYPE_SIZE_T}).
|
|
@end defmac
|
|
|
|
@defmac AC_STAT_MACROS_BROKEN
|
|
@acindex{STAT_MACROS_BROKEN}
|
|
Replaced by @code{AC_HEADER_STAT} (@pxref{AC_HEADER_STAT}).
|
|
@end defmac
|
|
|
|
@defmac AC_STDC_HEADERS
|
|
@acindex{STDC_HEADERS}
|
|
Replaced by @code{AC_HEADER_STDC} (@pxref{AC_HEADER_STDC}), which
|
|
is itself obsolete. Nowadays it is safe to assume the facilities of C89
|
|
exist.
|
|
@end defmac
|
|
|
|
@defmac AC_STRCOLL
|
|
@acindex{STRCOLL}
|
|
Replaced by @code{AC_FUNC_STRCOLL} (@pxref{AC_FUNC_STRCOLL}).
|
|
@end defmac
|
|
|
|
@defmac AC_STRUCT_ST_BLKSIZE
|
|
@acindex{STRUCT_ST_BLKSIZE}
|
|
@cvindex HAVE_STRUCT_STAT_ST_BLKSIZE
|
|
@cvindex HAVE_ST_BLKSIZE
|
|
If @code{struct stat} contains an @code{st_blksize} member, define
|
|
@code{HAVE_STRUCT_STAT_ST_BLKSIZE}. The former name,
|
|
@code{HAVE_ST_BLKSIZE} is to be avoided, as its support will cease in
|
|
the future. This macro is obsoleted, and should be replaced by
|
|
|
|
@example
|
|
AC_CHECK_MEMBERS([struct stat.st_blksize])
|
|
@end example
|
|
@noindent
|
|
@xref{AC_CHECK_MEMBERS}.
|
|
@end defmac
|
|
|
|
@defmac AC_STRUCT_ST_RDEV
|
|
@acindex{STRUCT_ST_RDEV}
|
|
@cvindex HAVE_ST_RDEV
|
|
@cvindex HAVE_STRUCT_STAT_ST_RDEV
|
|
If @code{struct stat} contains an @code{st_rdev} member, define
|
|
@code{HAVE_STRUCT_STAT_ST_RDEV}. The former name for this macro,
|
|
@code{HAVE_ST_RDEV}, is to be avoided as it will cease to be supported
|
|
in the future. Actually, even the new macro is obsolete and should be
|
|
replaced by:
|
|
@example
|
|
AC_CHECK_MEMBERS([struct stat.st_rdev])
|
|
@end example
|
|
@noindent
|
|
@xref{AC_CHECK_MEMBERS}.
|
|
@end defmac
|
|
|
|
@defmac AC_ST_BLKSIZE
|
|
@acindex{ST_BLKSIZE}
|
|
Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
|
|
@end defmac
|
|
|
|
@defmac AC_ST_BLOCKS
|
|
@acindex{ST_BLOCKS}
|
|
Replaced by @code{AC_STRUCT_ST_BLOCKS} (@pxref{AC_STRUCT_ST_BLOCKS}).
|
|
@end defmac
|
|
|
|
@defmac AC_ST_RDEV
|
|
@acindex{ST_RDEV}
|
|
Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
|
|
@end defmac
|
|
|
|
@defmac AC_SYS_RESTARTABLE_SYSCALLS
|
|
@acindex{SYS_RESTARTABLE_SYSCALLS}
|
|
@cvindex HAVE_RESTARTABLE_SYSCALLS
|
|
If the system automatically restarts a system call that is interrupted
|
|
by a signal, define @code{HAVE_RESTARTABLE_SYSCALLS}. This macro does
|
|
not check whether system calls are restarted in general---it checks whether a
|
|
signal handler installed with @code{signal} (but not @code{sigaction})
|
|
causes system calls to be restarted. It does not check whether system calls
|
|
can be restarted when interrupted by signals that have no handler.
|
|
|
|
These days portable programs should use @code{sigaction} with
|
|
@code{SA_RESTART} if they want restartable system calls. They should
|
|
not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
|
|
system call is restartable is a dynamic issue, not a configuration-time
|
|
issue.
|
|
@end defmac
|
|
|
|
@defmac AC_SYS_SIGLIST_DECLARED
|
|
@acindex{SYS_SIGLIST_DECLARED}
|
|
This macro was renamed @code{AC_DECL_SYS_SIGLIST}. However, even that
|
|
name is obsolete, as the same functionality is now achieved via
|
|
@code{AC_CHECK_DECLS} (@pxref{AC_CHECK_DECLS}).
|
|
@end defmac
|
|
|
|
@defmac AC_TEST_CPP
|
|
@acindex{TEST_CPP}
|
|
This macro was renamed @code{AC_TRY_CPP}, which in turn was replaced by
|
|
@code{AC_PREPROC_IFELSE} (@pxref{AC_PREPROC_IFELSE}).
|
|
@end defmac
|
|
|
|
@defmac AC_TEST_PROGRAM
|
|
@acindex{TEST_PROGRAM}
|
|
This macro was renamed @code{AC_TRY_RUN}, which in turn was replaced by
|
|
@code{AC_RUN_IFELSE} (@pxref{AC_RUN_IFELSE}).
|
|
@end defmac
|
|
|
|
@defmac AC_TIMEZONE
|
|
@acindex{TIMEZONE}
|
|
Replaced by @code{AC_STRUCT_TIMEZONE} (@pxref{AC_STRUCT_TIMEZONE}).
|
|
@end defmac
|
|
|
|
@defmac AC_TIME_WITH_SYS_TIME
|
|
@acindex{TIME_WITH_SYS_TIME}
|
|
Replaced by @code{AC_HEADER_TIME} (@pxref{AC_HEADER_TIME}), which is
|
|
itself obsolete; nowadays one need only do
|
|
@samp{AC_CHECK_HEADERS([sys/time.h])}.
|
|
@end defmac
|
|
|
|
@defmac AC_TRY_COMPILE (@var{includes}, @var{function-body}, @
|
|
@ovar{action-if-true}, @ovar{action-if-false})
|
|
@acindex{TRY_COMPILE}
|
|
Same as:
|
|
|
|
@example
|
|
AC_COMPILE_IFELSE(
|
|
[AC_LANG_PROGRAM([[@var{includes}]],
|
|
[[@var{function-body}]])],
|
|
[@var{action-if-true}],
|
|
[@var{action-if-false}])
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Running the Compiler}.
|
|
|
|
This macro double quotes both @var{includes} and @var{function-body}.
|
|
|
|
For C and C++, @var{includes} is any @code{#include} statements needed
|
|
by the code in @var{function-body} (@var{includes} is ignored if
|
|
the currently selected language is Fortran or Fortran 77). The compiler
|
|
and compilation flags are determined by the current language
|
|
(@pxref{Language Choice}).
|
|
@end defmac
|
|
|
|
@defmac AC_TRY_CPP (@var{input}, @ovar{action-if-true}, @ovar{action-if-false})
|
|
@acindex{TRY_CPP}
|
|
Same as:
|
|
|
|
@example
|
|
AC_PREPROC_IFELSE(
|
|
[AC_LANG_SOURCE([[@var{input}]])],
|
|
[@var{action-if-true}],
|
|
[@var{action-if-false}])
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Running the Preprocessor}.
|
|
|
|
This macro double quotes the @var{input}.
|
|
@end defmac
|
|
|
|
@defmac AC_TRY_LINK (@var{includes}, @var{function-body}, @
|
|
@ovar{action-if-true}, @ovar{action-if-false})
|
|
@acindex{TRY_LINK}
|
|
Same as:
|
|
|
|
@example
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM([[@var{includes}]],
|
|
[[@var{function-body}]])],
|
|
[@var{action-if-true}],
|
|
[@var{action-if-false}])
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Running the Linker}.
|
|
|
|
This macro double quotes both @var{includes} and @var{function-body}.
|
|
|
|
Depending on the current language (@pxref{Language Choice}), create a
|
|
test program to see whether a function whose body consists of
|
|
@var{function-body} can be compiled and linked. If the file compiles
|
|
and links successfully, run shell commands @var{action-if-found},
|
|
otherwise run @var{action-if-not-found}.
|
|
|
|
This macro double quotes both @var{includes} and @var{function-body}.
|
|
|
|
For C and C++, @var{includes} is any @code{#include} statements needed
|
|
by the code in @var{function-body} (@var{includes} is ignored if
|
|
the currently selected language is Fortran or Fortran 77). The compiler
|
|
and compilation flags are determined by the current language
|
|
(@pxref{Language Choice}), and in addition @code{LDFLAGS} and
|
|
@code{LIBS} are used for linking.
|
|
@end defmac
|
|
|
|
@defmac AC_TRY_LINK_FUNC (@var{function}, @ovar{action-if-found}, @
|
|
@ovar{action-if-not-found})
|
|
@acindex{TRY_LINK_FUNC}
|
|
This macro is equivalent to
|
|
@example
|
|
AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])],
|
|
[@var{action-if-found}], [@var{action-if-not-found}])
|
|
@end example
|
|
@noindent
|
|
@xref{Running the Linker}.
|
|
@end defmac
|
|
|
|
@defmac AC_TRY_RUN (@var{program}, @ovar{action-if-true}, @
|
|
@ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
|
|
@acindex{TRY_RUN}
|
|
Same as:
|
|
|
|
@example
|
|
AC_RUN_IFELSE(
|
|
[AC_LANG_SOURCE([[@var{program}]])],
|
|
[@var{action-if-true}],
|
|
[@var{action-if-false}],
|
|
[@var{action-if-cross-compiling}])
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Runtime}.
|
|
@end defmac
|
|
|
|
@anchor{AC_TYPE_SIGNAL}
|
|
@defmac AC_TYPE_SIGNAL
|
|
@acindex{TYPE_SIGNAL}
|
|
@cvindex RETSIGTYPE
|
|
@hdrindex{signal.h}
|
|
If @file{signal.h} declares @code{signal} as returning a pointer to a
|
|
function returning @code{void}, define @code{RETSIGTYPE} to be
|
|
@code{void}; otherwise, define it to be @code{int}. These days, it is
|
|
portable to assume C89, and that signal handlers return @code{void},
|
|
without needing to use this macro or @code{RETSIGTYPE}.
|
|
@end defmac
|
|
|
|
@defmac AC_UID_T
|
|
@acindex{UID_T}
|
|
Replaced by @code{AC_TYPE_UID_T} (@pxref{AC_TYPE_UID_T}).
|
|
@end defmac
|
|
|
|
@defmac AC_UNISTD_H
|
|
@acindex{UNISTD_H}
|
|
Same as @samp{AC_CHECK_HEADERS([unistd.h])} (@pxref{AC_CHECK_HEADERS}),
|
|
which is one of the tests done as a side effect by
|
|
@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), so usually
|
|
unnecessary to write explicitly.
|
|
@end defmac
|
|
|
|
@defmac AC_USG
|
|
@acindex{USG}
|
|
@cvindex USG
|
|
Define @code{USG} if the BSD string functions (@code{bcopy},
|
|
@code{bzero}, @code{index}, @code{rindex}, etc) are @emph{not} defined
|
|
in @file{strings.h}. Modern code should assume @file{string.h} exists
|
|
and should use the standard C string functions (@code{memmove}, @code{memset},
|
|
@code{strchr}, @code{strrchr}, etc) unconditionally.
|
|
|
|
@file{strings.h} may be the only header that declares @code{strcasecmp},
|
|
@code{strncasecmp}, and @code{ffs}. @code{AC_INCLUDES_DEFAULT} checks
|
|
for it (@pxref{Default Includes}); test @code{HAVE_STRINGS_H}.
|
|
@end defmac
|
|
|
|
@defmac AC_UTIME_NULL
|
|
@acindex{UTIME_NULL}
|
|
Replaced by @code{AC_FUNC_UTIME_NULL} (@pxref{AC_FUNC_UTIME_NULL}).
|
|
@end defmac
|
|
|
|
@defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@ovar{cmd})
|
|
@acindex{VALIDATE_CACHED_SYSTEM_TUPLE}
|
|
If the cache file is inconsistent with the current host, target and
|
|
build system types, it used to execute @var{cmd} or print a default
|
|
error message. This is now handled by default.
|
|
@end defmac
|
|
|
|
@defmac AC_VERBOSE (@var{result-description})
|
|
@acindex{VERBOSE}
|
|
Replaced by @code{AC_MSG_RESULT} (@pxref{AC_MSG_RESULT}).
|
|
@end defmac
|
|
|
|
@defmac AC_VFORK
|
|
@acindex{VFORK}
|
|
Replaced by @code{AC_FUNC_FORK} (@pxref{AC_FUNC_FORK}).
|
|
@end defmac
|
|
|
|
@defmac AC_VPRINTF
|
|
@acindex{VPRINTF}
|
|
Replaced by @code{AC_FUNC_VPRINTF} (@pxref{AC_FUNC_VPRINTF}).
|
|
@end defmac
|
|
|
|
@defmac AC_WAIT3
|
|
@acindex{WAIT3}
|
|
This macro was renamed @code{AC_FUNC_WAIT3}. However, these days
|
|
portable programs should use @code{waitpid}, not @code{wait3}, as
|
|
@code{wait3} has been removed from POSIX.
|
|
@end defmac
|
|
|
|
@defmac AC_WARN
|
|
@acindex{WARN}
|
|
Replaced by @code{AC_MSG_WARN} (@pxref{AC_MSG_WARN}).
|
|
@end defmac
|
|
|
|
@defmac AC_WARNING (@var{message})
|
|
@acindex{WARNING}
|
|
Replaced by @code{m4_warn} (@pxref{m4_warn}).
|
|
@end defmac
|
|
|
|
@defmac AC_WITH (@var{package}, @var{action-if-given}, @
|
|
@ovar{action-if-not-given})
|
|
@acindex{WITH}
|
|
This is an obsolete version of @code{AC_ARG_WITH} that does not
|
|
support providing a help string (@pxref{AC_ARG_WITH}).
|
|
@end defmac
|
|
|
|
@defmac AC_WORDS_BIGENDIAN
|
|
@acindex{WORDS_BIGENDIAN}
|
|
Replaced by @code{AC_C_BIGENDIAN} (@pxref{AC_C_BIGENDIAN}).
|
|
@end defmac
|
|
|
|
@defmac AC_XENIX_DIR
|
|
@acindex{XENIX_DIR}
|
|
@ovindex LIBS
|
|
This macro is equivalent to the obsolescent @code{AC_HEADER_DIRENT}
|
|
macro, plus it also sets the shell variable @code{XENIX}.
|
|
Don't use this macro, the dignified means to check the nature of the
|
|
host is using @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
|
|
@end defmac
|
|
|
|
@defmac AC_YYTEXT_POINTER
|
|
@acindex{YYTEXT_POINTER}
|
|
This macro was renamed @code{AC_DECL_YYTEXT}, which in turn was
|
|
integrated into @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
|
|
@end defmac
|
|
|
|
@node Autoconf 1
|
|
@section Upgrading From Version 1
|
|
@cindex Upgrading autoconf
|
|
@cindex Autoconf upgrading
|
|
|
|
Autoconf version 2 is mostly backward compatible with version 1.
|
|
However, it introduces better ways to do some things, and doesn't
|
|
support some of the ugly things in version 1. So, depending on how
|
|
sophisticated your @file{configure.ac} files are, you might have to do
|
|
some manual work in order to upgrade to version 2. This chapter points
|
|
out some problems to watch for when upgrading. Also, perhaps your
|
|
@command{configure} scripts could benefit from some of the new features in
|
|
version 2; the changes are summarized in the file @file{NEWS} in the
|
|
Autoconf distribution.
|
|
|
|
@menu
|
|
* Changed File Names:: Files you might rename
|
|
* Changed Makefiles:: New things to put in @file{Makefile.in}
|
|
* Changed Macros:: Macro calls you might replace
|
|
* Changed Results:: Changes in how to check test results
|
|
* Changed Macro Writing:: Better ways to write your own macros
|
|
@end menu
|
|
|
|
@node Changed File Names
|
|
@subsection Changed File Names
|
|
|
|
If you have an @file{aclocal.m4} installed with Autoconf (as opposed to
|
|
in a particular package's source directory), you must rename it to
|
|
@file{acsite.m4}. @xref{autoconf Invocation}.
|
|
|
|
If you distribute @file{install.sh} with your package, rename it to
|
|
@file{install-sh} so @command{make} builtin rules don't inadvertently
|
|
create a file called @file{install} from it. @code{AC_PROG_INSTALL}
|
|
looks for the script under both names, but it is best to use the new name.
|
|
|
|
If you were using @file{config.h.top}, @file{config.h.bot}, or
|
|
@file{acconfig.h}, you still can, but you have less clutter if you
|
|
use the @code{AH_} macros. @xref{Autoheader Macros}.
|
|
|
|
@node Changed Makefiles
|
|
@subsection Changed Makefiles
|
|
|
|
Add @samp{@@CFLAGS@@}, @samp{@@CPPFLAGS@@}, and @samp{@@LDFLAGS@@} in
|
|
your @file{Makefile.in} files, so they can take advantage of the values
|
|
of those variables in the environment when @command{configure} is run.
|
|
Doing this isn't necessary, but it's a convenience for users.
|
|
|
|
Also add @samp{@@configure_input@@} in a comment to each input file for
|
|
@code{AC_OUTPUT}, so that the output files contain a comment saying
|
|
they were produced by @command{configure}. Automatically selecting the
|
|
right comment syntax for all the kinds of files that people call
|
|
@code{AC_OUTPUT} on became too much work.
|
|
|
|
Add @file{config.log} and @file{config.cache} to the list of files you
|
|
remove in @code{distclean} targets.
|
|
|
|
If you have the following in @file{Makefile.in}:
|
|
|
|
@example
|
|
prefix = /usr/local
|
|
exec_prefix = $(prefix)
|
|
@end example
|
|
|
|
@noindent
|
|
you must change it to:
|
|
|
|
@example
|
|
prefix = @@prefix@@
|
|
exec_prefix = @@exec_prefix@@
|
|
@end example
|
|
|
|
@noindent
|
|
The old behavior of replacing those variables without @samp{@@}
|
|
characters around them has been removed.
|
|
|
|
@node Changed Macros
|
|
@subsection Changed Macros
|
|
|
|
Many of the macros were renamed in Autoconf version 2. You can still
|
|
use the old names, but the new ones are clearer, and it's easier to find
|
|
the documentation for them. @xref{Obsolete Macros}, for a table showing the
|
|
new names for the old macros. Use the @command{autoupdate} program to
|
|
convert your @file{configure.ac} to using the new macro names.
|
|
@xref{autoupdate Invocation}.
|
|
|
|
Some macros have been superseded by similar ones that do the job better,
|
|
but are not call-compatible. If you get warnings about calling obsolete
|
|
macros while running @command{autoconf}, you may safely ignore them, but
|
|
your @command{configure} script generally works better if you follow
|
|
the advice that is printed about what to replace the obsolete macros with. In
|
|
particular, the mechanism for reporting the results of tests has
|
|
changed. If you were using @command{echo} or @code{AC_VERBOSE} (perhaps
|
|
via @code{AC_COMPILE_CHECK}), your @command{configure} script's output
|
|
looks better if you switch to @code{AC_MSG_CHECKING} and
|
|
@code{AC_MSG_RESULT}. @xref{Printing Messages}. Those macros work best
|
|
in conjunction with cache variables. @xref{Caching Results}.
|
|
|
|
|
|
|
|
@node Changed Results
|
|
@subsection Changed Results
|
|
|
|
If you were checking the results of previous tests by examining the
|
|
shell variable @code{DEFS}, you need to switch to checking the values of
|
|
the cache variables for those tests. @code{DEFS} no longer exists while
|
|
@command{configure} is running; it is only created when generating output
|
|
files. This difference from version 1 is because properly quoting the
|
|
contents of that variable turned out to be too cumbersome and
|
|
inefficient to do every time @code{AC_DEFINE} is called. @xref{Cache
|
|
Variable Names}.
|
|
|
|
For example, here is a @file{configure.ac} fragment written for Autoconf
|
|
version 1:
|
|
|
|
@example
|
|
AC_HAVE_FUNCS(syslog)
|
|
case "$DEFS" in
|
|
*-DHAVE_SYSLOG*) ;;
|
|
*) # syslog is not in the default libraries. See if it's in some other.
|
|
saved_LIBS="$LIBS"
|
|
for lib in bsd socket inet; do
|
|
AC_CHECKING(for syslog in -l$lib)
|
|
LIBS="-l$lib $saved_LIBS"
|
|
AC_HAVE_FUNCS(syslog)
|
|
case "$DEFS" in
|
|
*-DHAVE_SYSLOG*) break ;;
|
|
*) ;;
|
|
esac
|
|
LIBS="$saved_LIBS"
|
|
done ;;
|
|
esac
|
|
@end example
|
|
|
|
Here is a way to write it for version 2:
|
|
|
|
@example
|
|
AC_CHECK_FUNCS([syslog])
|
|
AS_IF([test "x$ac_cv_func_syslog" = xno],
|
|
[# syslog is not in the default libraries. See if it's in some other.
|
|
for lib in bsd socket inet; do
|
|
AC_CHECK_LIB([$lib], [syslog],
|
|
[AC_DEFINE([HAVE_SYSLOG])
|
|
LIBS="-l$lib $LIBS"; break])
|
|
done])
|
|
@end example
|
|
|
|
If you were working around bugs in @code{AC_DEFINE_UNQUOTED} by adding
|
|
backslashes before quotes, you need to remove them. It now works
|
|
predictably, and does not treat quotes (except back quotes) specially.
|
|
@xref{Setting Output Variables}.
|
|
|
|
All of the Boolean shell variables set by Autoconf macros now use
|
|
@samp{yes} for the true value. Most of them use @samp{no} for false,
|
|
though for backward compatibility some use the empty string instead. If
|
|
you were relying on a shell variable being set to something like 1 or
|
|
@samp{t} for true, you need to change your tests.
|
|
|
|
@node Changed Macro Writing
|
|
@subsection Changed Macro Writing
|
|
|
|
When defining your own macros, you should now use @code{AC_DEFUN}
|
|
instead of @code{define}. @code{AC_DEFUN} automatically calls
|
|
@code{AC_PROVIDE} and ensures that macros called via @code{AC_REQUIRE}
|
|
do not interrupt other macros, to prevent nested @samp{checking@dots{}}
|
|
messages on the screen. There's no actual harm in continuing to use the
|
|
older way, but it's less convenient and attractive. @xref{Macro
|
|
Definitions}.
|
|
|
|
You probably looked at the macros that came with Autoconf as a guide for
|
|
how to do things. It would be a good idea to take a look at the new
|
|
versions of them, as the style is somewhat improved and they take
|
|
advantage of some new features.
|
|
|
|
If you were doing tricky things with undocumented Autoconf internals
|
|
(macros, variables, diversions), check whether you need to change
|
|
anything to account for changes that have been made. Perhaps you can
|
|
even use an officially supported technique in version 2 instead of
|
|
kludging. Or perhaps not.
|
|
|
|
To speed up your locally written feature tests, add caching to them.
|
|
See whether any of your tests are of general enough usefulness to
|
|
encapsulate them into macros that you can share.
|
|
|
|
|
|
@node Autoconf 2.13
|
|
@section Upgrading From Version 2.13
|
|
@cindex Upgrading autoconf
|
|
@cindex Autoconf upgrading
|
|
|
|
The introduction of the previous section (@pxref{Autoconf 1}) perfectly
|
|
suits this section@enddots{}
|
|
|
|
@quotation
|
|
Autoconf version 2.50 is mostly backward compatible with version 2.13.
|
|
However, it introduces better ways to do some things, and doesn't
|
|
support some of the ugly things in version 2.13. So, depending on how
|
|
sophisticated your @file{configure.ac} files are, you might have to do
|
|
some manual work in order to upgrade to version 2.50. This chapter
|
|
points out some problems to watch for when upgrading. Also, perhaps
|
|
your @command{configure} scripts could benefit from some of the new
|
|
features in version 2.50; the changes are summarized in the file
|
|
@file{NEWS} in the Autoconf distribution.
|
|
@end quotation
|
|
|
|
@menu
|
|
* Changed Quotation:: Broken code which used to work
|
|
* New Macros:: Interaction with foreign macros
|
|
* Hosts and Cross-Compilation:: Bugward compatibility kludges
|
|
* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
|
|
* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
|
|
@end menu
|
|
|
|
@node Changed Quotation
|
|
@subsection Changed Quotation
|
|
|
|
The most important changes are invisible to you: the implementation of
|
|
most macros have completely changed. This allowed more factorization of
|
|
the code, better error messages, a higher uniformity of the user's
|
|
interface etc. Unfortunately, as a side effect, some construct which
|
|
used to (miraculously) work might break starting with Autoconf 2.50.
|
|
The most common culprit is bad quotation.
|
|
|
|
For instance, in the following example, the message is not properly
|
|
quoted:
|
|
|
|
@example
|
|
AC_INIT
|
|
AC_CHECK_HEADERS(foo.h, ,
|
|
AC_MSG_ERROR(cannot find foo.h, bailing out))
|
|
AC_OUTPUT
|
|
@end example
|
|
|
|
@noindent
|
|
Autoconf 2.13 simply ignores it:
|
|
|
|
@example
|
|
$ @kbd{autoconf-2.13; ./configure --silent}
|
|
creating cache ./config.cache
|
|
configure: error: cannot find foo.h
|
|
$
|
|
@end example
|
|
|
|
@noindent
|
|
while Autoconf 2.50 produces a broken @file{configure}:
|
|
|
|
@example
|
|
$ @kbd{autoconf-2.50; ./configure --silent}
|
|
configure: error: cannot find foo.h
|
|
./configure: exit: bad non-numeric arg `bailing'
|
|
./configure: exit: bad non-numeric arg `bailing'
|
|
$
|
|
@end example
|
|
|
|
The message needs to be quoted, and the @code{AC_MSG_ERROR} invocation
|
|
too!
|
|
|
|
@example
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AC_CHECK_HEADERS([foo.h], [],
|
|
[AC_MSG_ERROR([cannot find foo.h, bailing out])])
|
|
AC_OUTPUT
|
|
@end example
|
|
|
|
Many many (and many more) Autoconf macros were lacking proper quotation,
|
|
including no less than@dots{} @code{AC_DEFUN} itself!
|
|
|
|
@example
|
|
$ @kbd{cat configure.in}
|
|
AC_DEFUN([AC_PROG_INSTALL],
|
|
[# My own much better version
|
|
])
|
|
AC_INIT
|
|
AC_PROG_INSTALL
|
|
AC_OUTPUT
|
|
$ @kbd{autoconf-2.13}
|
|
autoconf: Undefined macros:
|
|
***BUG in Autoconf--please report*** AC_FD_MSG
|
|
***BUG in Autoconf--please report*** AC_EPI
|
|
configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
|
|
configure.in:5:AC_PROG_INSTALL
|
|
$ @kbd{autoconf-2.50}
|
|
$
|
|
@end example
|
|
|
|
|
|
@node New Macros
|
|
@subsection New Macros
|
|
|
|
@cindex undefined macro
|
|
@cindex @code{_m4_divert_diversion}
|
|
|
|
While Autoconf was relatively dormant in the late 1990s, Automake
|
|
provided Autoconf-like macros for a while. Starting with Autoconf 2.50
|
|
in 2001, Autoconf provided
|
|
versions of these macros, integrated in the @code{AC_} namespace,
|
|
instead of @code{AM_}. But in order to ease the upgrading via
|
|
@command{autoupdate}, bindings to such @code{AM_} macros are provided.
|
|
|
|
Unfortunately older versions of Automake (e.g., Automake 1.4)
|
|
did not quote the names of these macros.
|
|
Therefore, when @command{m4} finds something like
|
|
@samp{AC_DEFUN(AM_TYPE_PTRDIFF_T, @dots{})} in @file{aclocal.m4},
|
|
@code{AM_TYPE_PTRDIFF_T} is
|
|
expanded, replaced with its Autoconf definition.
|
|
|
|
Fortunately Autoconf catches pre-@code{AC_INIT} expansions, and
|
|
complains, in its own words:
|
|
|
|
@example
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AM_TYPE_PTRDIFF_T
|
|
$ @kbd{aclocal-1.4}
|
|
$ @kbd{autoconf}
|
|
aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
|
|
aclocal.m4:17: the top level
|
|
autom4te: m4 failed with exit status: 1
|
|
$
|
|
@end example
|
|
|
|
Modern versions of Automake no longer define most of these
|
|
macros, and properly quote the names of the remaining macros.
|
|
If you must use an old Automake, do not depend upon macros from Automake
|
|
as it is simply not its job
|
|
to provide macros (but the one it requires itself):
|
|
|
|
@example
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AM_TYPE_PTRDIFF_T
|
|
$ @kbd{rm aclocal.m4}
|
|
$ @kbd{autoupdate}
|
|
autoupdate: 'configure.ac' is updated
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AC_CHECK_TYPES([ptrdiff_t])
|
|
$ @kbd{aclocal-1.4}
|
|
$ @kbd{autoconf}
|
|
$
|
|
@end example
|
|
|
|
|
|
@node Hosts and Cross-Compilation
|
|
@subsection Hosts and Cross-Compilation
|
|
@cindex Cross compilation
|
|
|
|
Based on the experience of compiler writers, and after long public
|
|
debates, many aspects of the cross-compilation chain have changed:
|
|
|
|
@itemize @minus
|
|
@item
|
|
the relationship between the build, host, and target architecture types,
|
|
|
|
@item
|
|
the command line interface for specifying them to @command{configure},
|
|
|
|
@item
|
|
the variables defined in @command{configure},
|
|
|
|
@item
|
|
the enabling of cross-compilation mode.
|
|
@end itemize
|
|
|
|
@sp 1
|
|
|
|
The relationship between build, host, and target have been cleaned up:
|
|
the chain of default is now simply: target defaults to host, host to
|
|
build, and build to the result of @command{config.guess}. Nevertheless,
|
|
in order to ease the transition from 2.13 to 2.50, the following
|
|
transition scheme is implemented. @emph{Do not rely on it}, as it will
|
|
be completely disabled in a couple of releases (we cannot keep it, as it
|
|
proves to cause more problems than it cures).
|
|
|
|
They all default to the result of running @command{config.guess}, unless
|
|
you specify either @option{--build} or @option{--host}. In this case,
|
|
the default becomes the system type you specified. If you specify both,
|
|
and they're different, @command{configure} enters cross compilation
|
|
mode, so it doesn't run any tests that require execution.
|
|
|
|
Hint: if you mean to override the result of @command{config.guess},
|
|
prefer @option{--build} over @option{--host}.
|
|
|
|
@sp 1
|
|
|
|
For backward compatibility, @command{configure} accepts a system
|
|
type as an option by itself. Such an option overrides the
|
|
defaults for build, host, and target system types. The following
|
|
configure statement configures a cross toolchain that runs on
|
|
NetBSD/aarch64 but generates code for GNU Hurd/riscv64,
|
|
which is also the build platform.
|
|
|
|
@example
|
|
./configure --host=aarch64-netbsd riscv64-gnu
|
|
@end example
|
|
|
|
@sp 1
|
|
|
|
In Autoconf 2.13 and before, the variables @code{build}, @code{host},
|
|
and @code{target} had a different semantics before and after the
|
|
invocation of @code{AC_CANONICAL_BUILD} etc. Now, the argument of
|
|
@option{--build} is strictly copied into @code{build_alias}, and is left
|
|
empty otherwise. After the @code{AC_CANONICAL_BUILD}, @code{build} is
|
|
set to the canonicalized build type. To ease the transition, before,
|
|
its contents is the same as that of @code{build_alias}. Do @emph{not}
|
|
rely on this broken feature.
|
|
|
|
For consistency with the backward compatibility scheme exposed above,
|
|
when @option{--host} is specified but @option{--build} isn't, the build
|
|
system is assumed to be the same as @option{--host}, and
|
|
@samp{build_alias} is set to that value. Eventually, this
|
|
historically incorrect behavior will go away.
|
|
|
|
@sp 1
|
|
|
|
The former scheme to enable cross-compilation proved to cause more harm
|
|
than good, in particular, it used to be triggered too easily, leaving
|
|
regular end users puzzled in front of cryptic error messages.
|
|
@command{configure} could even enter cross-compilation mode only
|
|
because the compiler was not functional. This is mainly because
|
|
@command{configure} used to try to detect cross-compilation, instead of
|
|
waiting for an explicit flag from the user.
|
|
|
|
Now, @command{configure} enters cross-compilation mode if and only if
|
|
@option{--host} is passed.
|
|
|
|
That's the short documentation. To ease the transition between 2.13 and
|
|
its successors, a more complicated scheme is implemented. @emph{Do not
|
|
rely on the following}, as it will be removed in the near future.
|
|
|
|
If you specify @option{--host}, but not @option{--build}, when
|
|
@command{configure} performs the first compiler test it tries to run
|
|
an executable produced by the compiler. If the execution fails, it
|
|
enters cross-compilation mode. This is fragile. Moreover, by the time
|
|
the compiler test is performed, it may be too late to modify the
|
|
build-system type: other tests may have already been performed.
|
|
Therefore, whenever you specify @option{--host}, be sure to specify
|
|
@option{--build} too.
|
|
|
|
@example
|
|
./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64
|
|
@end example
|
|
|
|
@noindent
|
|
enters cross-compilation mode. The former interface, which
|
|
consisted in setting the compiler to a cross-compiler without informing
|
|
@command{configure} is obsolete. For instance, @command{configure}
|
|
fails if it can't run the code generated by the specified compiler if you
|
|
configure as follows:
|
|
|
|
@example
|
|
./configure CC=x86_64-w64-mingw64-gcc
|
|
@end example
|
|
|
|
|
|
@node AC_LIBOBJ vs LIBOBJS
|
|
@subsection @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}
|
|
|
|
Up to Autoconf 2.13, the replacement of functions was triggered via the
|
|
variable @code{LIBOBJS}. Since Autoconf 2.50, the macro
|
|
@code{AC_LIBOBJ} should be used instead (@pxref{Generic Functions}).
|
|
Starting at Autoconf 2.53, the use of @code{LIBOBJS} is an error.
|
|
|
|
This change is mandated by the unification of the GNU Build System
|
|
components. In particular, the various fragile techniques used to parse
|
|
a @file{configure.ac} are all replaced with the use of traces. As a
|
|
consequence, any action must be traceable, which obsoletes critical
|
|
variable assignments. Fortunately, @code{LIBOBJS} was the only problem,
|
|
and it can even be handled gracefully (read, ``without your having to
|
|
change something'').
|
|
|
|
There were two typical uses of @code{LIBOBJS}: asking for a replacement
|
|
function, and adjusting @code{LIBOBJS} for Automake and/or Libtool.
|
|
|
|
@sp 1
|
|
|
|
As for function replacement, the fix is immediate: use
|
|
@code{AC_LIBOBJ}. For instance:
|
|
|
|
@example
|
|
LIBOBJS="$LIBOBJS fnmatch.o"
|
|
LIBOBJS="$LIBOBJS malloc.$ac_objext"
|
|
@end example
|
|
|
|
@noindent
|
|
should be replaced with:
|
|
|
|
@example
|
|
AC_LIBOBJ([fnmatch])
|
|
AC_LIBOBJ([malloc])
|
|
@end example
|
|
|
|
@sp 1
|
|
|
|
@ovindex LIBOBJDIR
|
|
When used with Automake 1.10 or newer, a suitable value for
|
|
@code{LIBOBJDIR} is set so that the @code{LIBOBJS} and @code{LTLIBOBJS}
|
|
can be referenced from any @file{Makefile.am}. Even without Automake,
|
|
arranging for @code{LIBOBJDIR} to be set correctly enables
|
|
referencing @code{LIBOBJS} and @code{LTLIBOBJS} in another directory.
|
|
The @code{LIBOBJDIR} feature is experimental.
|
|
|
|
|
|
@node AC_ACT_IFELSE vs AC_TRY_ACT
|
|
@subsection @code{AC_@var{ACT}_IFELSE} vs.@: @code{AC_TRY_@var{ACT}}
|
|
@c the anchor keeps the old node name, to try to avoid breaking links
|
|
@anchor{AC_FOO_IFELSE vs AC_TRY_FOO}
|
|
|
|
@acindex{@var{ACT}_IFELSE}
|
|
@acindex{TRY_@var{ACT}}
|
|
Since Autoconf 2.50, internal codes uses @code{AC_PREPROC_IFELSE},
|
|
@code{AC_COMPILE_IFELSE}, @code{AC_LINK_IFELSE}, and
|
|
@code{AC_RUN_IFELSE} on one hand and @code{AC_LANG_SOURCE},
|
|
and @code{AC_LANG_PROGRAM} on the other hand instead of the deprecated
|
|
@code{AC_TRY_CPP}, @code{AC_TRY_COMPILE}, @code{AC_TRY_LINK}, and
|
|
@code{AC_TRY_RUN}. The motivations where:
|
|
@itemize @minus
|
|
@item
|
|
a more consistent interface: @code{AC_TRY_COMPILE} etc.@: were double
|
|
quoting their arguments;
|
|
|
|
@item
|
|
the combinatorial explosion is solved by decomposing on the one hand the
|
|
generation of sources, and on the other hand executing the program;
|
|
|
|
@item
|
|
this scheme helps supporting more languages than plain C and C++.
|
|
@end itemize
|
|
|
|
In addition to the change of syntax, the philosophy has changed too:
|
|
while emphasis was put on speed at the expense of accuracy, today's
|
|
Autoconf promotes accuracy of the testing framework at, ahem@dots{}, the
|
|
expense of speed.
|
|
|
|
|
|
As a perfect example of what is @emph{not} to be done, here is how to
|
|
find out whether a header file contains a particular declaration, such
|
|
as a typedef, a structure, a structure member, or a function. Use
|
|
@code{AC_EGREP_HEADER} instead of running @code{grep} directly on the
|
|
header file; on some systems the symbol might be defined in another
|
|
header file that the file you are checking includes.
|
|
|
|
As a (bad) example, here is how you should not check for C preprocessor
|
|
symbols, either defined by header files or predefined by the C
|
|
preprocessor: using @code{AC_EGREP_CPP}:
|
|
|
|
@example
|
|
@group
|
|
AC_EGREP_CPP(yes,
|
|
[#ifdef _AIX
|
|
yes
|
|
#endif
|
|
], is_aix=yes, is_aix=no)
|
|
@end group
|
|
@end example
|
|
|
|
The above example, properly written would (i) use
|
|
@code{AC_LANG_PROGRAM}, and (ii) run the compiler:
|
|
|
|
@example
|
|
@group
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
[[#ifndef _AIX
|
|
error: This isn't AIX!
|
|
#endif
|
|
]])],
|
|
[is_aix=yes],
|
|
[is_aix=no])
|
|
@end group
|
|
@end example
|
|
|
|
|
|
@c ============================= Generating Test Suites with Autotest
|
|
|
|
@node Using Autotest
|
|
@chapter Generating Test Suites with Autotest
|
|
|
|
@cindex Autotest
|
|
|
|
@display
|
|
@strong{N.B.: This section describes a feature which is still
|
|
stabilizing. Although we believe that Autotest is useful as-is, this
|
|
documentation describes an interface which might change in the future:
|
|
do not depend upon Autotest without subscribing to the Autoconf mailing
|
|
lists.}
|
|
@end display
|
|
|
|
It is paradoxical that portable projects depend on nonportable tools
|
|
to run their test suite. Autoconf by itself is the paragon of this
|
|
problem: although it aims at perfectly portability, up to 2.13 its
|
|
test suite was using DejaGNU, a rich and complex testing
|
|
framework, but which is far from being standard on POSIX systems.
|
|
Worse yet, it was likely to be missing on the most fragile platforms,
|
|
the very platforms that are most likely to torture Autoconf and
|
|
exhibit deficiencies.
|
|
|
|
To circumvent this problem, many package maintainers have developed their
|
|
own testing framework, based on simple shell scripts whose sole outputs
|
|
are exit status values describing whether the test succeeded. Most of
|
|
these tests share common patterns, and this can result in lots of
|
|
duplicated code and tedious maintenance.
|
|
|
|
Following exactly the same reasoning that yielded to the inception of
|
|
Autoconf, Autotest provides a test suite generation framework, based on
|
|
M4 macros building a portable shell script. The suite itself is
|
|
equipped with automatic logging and tracing facilities which greatly
|
|
diminish the interaction with bug reporters, and simple timing reports.
|
|
|
|
Autoconf itself has been using Autotest for years, and we do attest that
|
|
it has considerably improved the strength of the test suite and the
|
|
quality of bug reports. Other projects are known to use some generation
|
|
of Autotest, such as Bison, GNU Wdiff, GNU Tar, each of
|
|
them with different needs, and this usage has validated Autotest as a general
|
|
testing framework.
|
|
|
|
Nonetheless, compared to DejaGNU, Autotest is inadequate for
|
|
interactive tool testing, which is probably its main limitation.
|
|
|
|
@menu
|
|
* Using an Autotest Test Suite:: Autotest and the user
|
|
* Writing Testsuites:: Autotest macros
|
|
* testsuite Invocation:: Running @command{testsuite} scripts
|
|
* Making testsuite Scripts:: Using autom4te to create @command{testsuite}
|
|
@end menu
|
|
|
|
@node Using an Autotest Test Suite
|
|
@section Using an Autotest Test Suite
|
|
|
|
@menu
|
|
* testsuite Scripts:: The concepts of Autotest
|
|
* Autotest Logs:: Their contents
|
|
@end menu
|
|
|
|
@node testsuite Scripts
|
|
@subsection @command{testsuite} Scripts
|
|
|
|
@cindex @command{testsuite}
|
|
|
|
Generating testing or validation suites using Autotest is rather easy.
|
|
The whole validation suite is held in a file to be processed through
|
|
@command{autom4te}, itself using GNU M4 under the hood, to
|
|
produce a stand-alone Bourne shell script which then gets distributed.
|
|
Neither @command{autom4te} nor GNU M4 are needed at
|
|
the installer's end.
|
|
|
|
@cindex test group
|
|
Each test of the validation suite should be part of some test group. A
|
|
@dfn{test group} is a sequence of interwoven tests that ought to be
|
|
executed together, usually because one test in the group creates data
|
|
files that a later test in the same group needs to read. Complex test
|
|
groups make later debugging more tedious. It is much better to
|
|
keep only a few tests per test group. Ideally there is only one test
|
|
per test group.
|
|
|
|
For all but the simplest packages, some file such as @file{testsuite.at}
|
|
does not fully hold all test sources, as these are often easier to
|
|
maintain in separate files. Each of these separate files holds a single
|
|
test group, or a sequence of test groups all addressing some common
|
|
functionality in the package. In such cases, @file{testsuite.at}
|
|
merely initializes the validation suite, and sometimes does elementary
|
|
health checking, before listing include statements for all other test
|
|
files. The special file @file{package.m4}, containing the
|
|
identification of the package, is automatically included if found.
|
|
|
|
A convenient alternative consists in moving all the global issues
|
|
(local Autotest macros, elementary health checking, and @code{AT_INIT}
|
|
invocation) into the file @code{local.at}, and making
|
|
@file{testsuite.at} be a simple list of @code{m4_include}s of sub test
|
|
suites. In such case, generating the whole test suite or pieces of it
|
|
is only a matter of choosing the @command{autom4te} command line
|
|
arguments.
|
|
|
|
The validation scripts that Autotest produces are by convention called
|
|
@command{testsuite}. When run, @command{testsuite} executes each test
|
|
group in turn, producing only one summary line per test to say if that
|
|
particular test succeeded or failed. At end of all tests, summarizing
|
|
counters get printed. One debugging directory is left for each test
|
|
group which failed, if any: such directories are named
|
|
@file{testsuite.dir/@var{nn}}, where @var{nn} is the sequence number of
|
|
the test group, and they include:
|
|
|
|
@itemize @bullet
|
|
@item a debugging script named @file{run} which reruns the test in
|
|
@dfn{debug mode} (@pxref{testsuite Invocation}). The automatic generation
|
|
of debugging scripts has the purpose of easing the chase for bugs.
|
|
|
|
@item all the files created with @code{AT_DATA}
|
|
|
|
@item all the Erlang source code files created with @code{AT_CHECK_EUNIT}
|
|
|
|
@item a log of the run, named @file{testsuite.log}
|
|
@end itemize
|
|
|
|
In the ideal situation, none of the tests fail, and consequently no
|
|
debugging directory is left behind for validation.
|
|
|
|
It often happens in practice that individual tests in the validation
|
|
suite need to get information coming out of the configuration process.
|
|
Some of this information, common for all validation suites, is provided
|
|
through the file @file{atconfig}, automatically created by
|
|
@code{AC_CONFIG_TESTDIR}. For configuration information which your
|
|
testing environment specifically needs, you might prepare an optional
|
|
file named @file{atlocal.in}, instantiated by @code{AC_CONFIG_FILES}.
|
|
The configuration process produces @file{atconfig} and @file{atlocal}
|
|
out of these two input files, and these two produced files are
|
|
automatically read by the @file{testsuite} script.
|
|
|
|
Here is a diagram showing the relationship between files.
|
|
|
|
@noindent
|
|
Files used in preparing a software package for distribution:
|
|
|
|
@example
|
|
[package.m4] -->.
|
|
\
|
|
subfile-1.at ->. [local.at] ---->+
|
|
... \ \
|
|
subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
|
|
... /
|
|
subfile-n.at ->'
|
|
@end example
|
|
|
|
@noindent
|
|
Files used in configuring a software package:
|
|
|
|
@example
|
|
.--> atconfig
|
|
/
|
|
[atlocal.in] --> config.status* --<
|
|
\
|
|
`--> [atlocal]
|
|
@end example
|
|
|
|
@noindent
|
|
Files created during test suite execution:
|
|
|
|
@example
|
|
atconfig -->. .--> testsuite.log
|
|
\ /
|
|
>-- testsuite* --<
|
|
/ \
|
|
[atlocal] ->' `--> [testsuite.dir]
|
|
@end example
|
|
|
|
|
|
@node Autotest Logs
|
|
@subsection Autotest Logs
|
|
|
|
When run, the test suite creates a log file named after itself, e.g., a
|
|
test suite named @command{testsuite} creates @file{testsuite.log}. It
|
|
contains a lot of information, usually more than maintainers actually
|
|
need, but therefore most of the time it contains all that is needed:
|
|
|
|
@table @asis
|
|
@item command line arguments
|
|
A bad but unfortunately widespread habit consists of
|
|
setting environment variables before the command, such as in
|
|
@samp{CC=my-home-grown-cc ./testsuite}. The test suite does not
|
|
know this change, hence (i) it cannot report it to you, and (ii)
|
|
it cannot preserve the value of @code{CC} for subsequent runs.
|
|
Autoconf faced exactly the same problem, and solved it by asking
|
|
users to pass the variable definitions as command line arguments.
|
|
Autotest requires this rule, too, but has no means to enforce it; the log
|
|
then contains a trace of the variables that were changed by the user.
|
|
|
|
@item @file{ChangeLog} excerpts
|
|
The topmost lines of all the @file{ChangeLog} files found in the source
|
|
hierarchy. This is especially useful when bugs are reported against
|
|
development versions of the package, since the version string does not
|
|
provide sufficient information to know the exact state of the sources
|
|
the user compiled. Of course, this relies on the use of a
|
|
@file{ChangeLog}.
|
|
|
|
@item build machine
|
|
Running a test suite in a cross-compile environment is not an easy task,
|
|
since it would mean having the test suite run on a machine @var{build},
|
|
while running programs on a machine @var{host}. It is much simpler to
|
|
run both the test suite and the programs on @var{host}, but then, from
|
|
the point of view of the test suite, there remains a single environment,
|
|
@var{host} = @var{build}. The log contains relevant information on the
|
|
state of the @var{build} machine, including some important environment
|
|
variables.
|
|
@c FIXME: How about having an M4sh macro to say "hey, log the value
|
|
@c of '@dots{}'"? This would help both Autoconf and Autotest.
|
|
|
|
@item tested programs
|
|
The absolute file name and answers to @option{--version} of the tested
|
|
programs (see @ref{Writing Testsuites}, @code{AT_TESTED}).
|
|
|
|
@item configuration log
|
|
The contents of @file{config.log}, as created by @command{configure},
|
|
are appended. It contains the configuration flags and a detailed report
|
|
on the configuration itself.
|
|
@end table
|
|
|
|
|
|
@node Writing Testsuites
|
|
@section Writing @file{testsuite.at}
|
|
|
|
The @file{testsuite.at} is a Bourne shell script making use of special
|
|
Autotest M4 macros. It often contains a call to @code{AT_INIT} near
|
|
its beginning followed by one call to @code{m4_include} per source file
|
|
for tests. Each such included file, or the remainder of
|
|
@file{testsuite.at} if include files are not used, contain a sequence of
|
|
test groups. Each test group begins with a call to @code{AT_SETUP},
|
|
then an arbitrary number of shell commands or calls to @code{AT_CHECK},
|
|
and then completes with a call to @code{AT_CLEANUP}. Multiple test
|
|
groups can be categorized by a call to @code{AT_BANNER}.
|
|
|
|
All of the public Autotest macros have all-uppercase names in the
|
|
namespace @samp{^AT_} to prevent them from accidentally conflicting with
|
|
other text; Autoconf also reserves the namespace @samp{^_AT_} for
|
|
internal macros. All shell variables used in the testsuite for internal
|
|
purposes have mostly-lowercase names starting with @samp{at_}. Autotest
|
|
also uses here-document delimiters in the namespace @samp{^_AT[A-Z]}, and
|
|
makes use of the file system namespace @samp{^at-}.
|
|
|
|
Since Autoconf is built on top of M4sugar (@pxref{Programming in
|
|
M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
|
|
of those namespaces (@samp{^_?\(m4\|AS\)_}). In general, you
|
|
@emph{should not use} the namespace of a package that does not own the
|
|
macro or shell code you are writing.
|
|
|
|
@defmac AT_INIT (@ovar{name})
|
|
@atindex{INIT}
|
|
@c FIXME: Not clear, plus duplication of the information.
|
|
Initialize Autotest. Giving a @var{name} to the test suite is
|
|
encouraged if your package includes several test suites. Before this
|
|
macro is called, @code{AT_PACKAGE_STRING} and
|
|
@code{AT_PACKAGE_BUGREPORT} must be defined, which are used to display
|
|
information about the testsuite to the user. Typically, these macros
|
|
are provided by a file @file{package.m4} built by @command{make}
|
|
(@pxref{Making testsuite Scripts}), in order to inherit the package
|
|
name, version, and bug reporting address from @file{configure.ac}.
|
|
@end defmac
|
|
|
|
@defmac AT_COPYRIGHT (@var{copyright-notice})
|
|
@atindex{COPYRIGHT}
|
|
@cindex Copyright Notice
|
|
State that, in addition to the Free Software Foundation's copyright on
|
|
the Autotest macros, parts of your test suite are covered by
|
|
@var{copyright-notice}.
|
|
|
|
The @var{copyright-notice} shows up in both the head of
|
|
@command{testsuite} and in @samp{testsuite --version}.
|
|
@end defmac
|
|
|
|
@defmac AT_ARG_OPTION (@var{options}, @var{help-text}, @
|
|
@ovar{action-if-given}, @ovar{action-if-not-given})
|
|
@atindex{ARG_OPTION}
|
|
@vrindex at_arg_@var{option}
|
|
Accept options from the space-separated list @var{options}, a list that
|
|
has leading dashes removed from the options. Long options will be
|
|
prefixed with @samp{--}, single-character options with @samp{-}. The
|
|
first word in this list is the primary @var{option}, any others are
|
|
assumed to be short-hand aliases. The variable associated with it
|
|
is @code{at_arg_@var{option}}, with any dashes in @var{option} replaced
|
|
with underscores.
|
|
|
|
If the user passes @option{--@var{option}} to the @command{testsuite},
|
|
the variable will be set to @samp{:}. If the user does not pass the
|
|
option, or passes @option{--no-@var{option}}, then the variable will be
|
|
set to @samp{false}.
|
|
|
|
@vrindex at_optarg
|
|
@vrindex at_optarg_@var{option}
|
|
@var{action-if-given} is run each time the option is encountered; here,
|
|
the variable @code{at_optarg} will be set to @samp{:} or @samp{false} as
|
|
appropriate. @code{at_optarg} is actually just a copy of
|
|
@code{at_arg_@var{option}}.
|
|
|
|
@var{action-if-not-given} will be run once after option parsing is
|
|
complete and if no option from @var{options} was used.
|
|
|
|
@var{help-text} is added to the end of the list of options shown in
|
|
@command{testsuite --help} (@pxref{AS_HELP_STRING}).
|
|
|
|
It is recommended that you use a package-specific prefix to @var{options}
|
|
names in order to avoid clashes with future Autotest built-in options.
|
|
@end defmac
|
|
|
|
@defmac AT_ARG_OPTION_ARG (@var{options}, @var{help-text}, @
|
|
@ovar{action-if-given}, @ovar{action-if-not-given})
|
|
@atindex{ARG_OPTION_ARG}
|
|
@vrindex at_arg_@var{option}
|
|
Accept options with arguments from the space-separated list
|
|
@var{options}, a list that has leading dashes removed from the options.
|
|
Long options will be prefixed with @samp{--}, single-character options
|
|
with @samp{-}. The first word in this list is the primary @var{option},
|
|
any others are assumed to be short-hand aliases. The variable associated
|
|
with it is @code{at_arg_@var{option}}, with any dashes in @var{option}
|
|
replaced with underscores.
|
|
|
|
If the user passes @option{--@var{option}=@var{arg}} or
|
|
@option{--@var{option} @var{arg}} to the @command{testsuite}, the
|
|
variable will be set to @samp{@var{arg}}.
|
|
|
|
@vrindex at_optarg
|
|
@var{action-if-given} is run each time the option is encountered; here,
|
|
the variable @code{at_optarg} will be set to @samp{@var{arg}}.
|
|
@code{at_optarg} is actually just a copy of @code{at_arg_@var{option}}.
|
|
|
|
@var{action-if-not-given} will be run once after option parsing is
|
|
complete and if no option from @var{options} was used.
|
|
|
|
@var{help-text} is added to the end of the list of options shown in
|
|
@command{testsuite --help} (@pxref{AS_HELP_STRING}).
|
|
|
|
It is recommended that you use a package-specific prefix to @var{options}
|
|
names in order to avoid clashes with future Autotest built-in options.
|
|
@end defmac
|
|
|
|
@defmac AT_COLOR_TESTS
|
|
@atindex{COLOR_TESTS}
|
|
Enable colored test results by default when the output is connected to
|
|
a terminal.
|
|
@end defmac
|
|
|
|
@defmac AT_TESTED (@var{executables})
|
|
@atindex{TESTED}
|
|
Log the file name and answer to @option{--version} of each program in
|
|
space-separated list @var{executables}. Several invocations register
|
|
new executables, in other words, don't fear registering one program
|
|
several times.
|
|
|
|
Autotest test suites rely on @env{PATH} to find the tested program.
|
|
This avoids the need to generate absolute names of the various tools, and
|
|
makes it possible to test installed programs. Therefore, knowing which
|
|
programs are being exercised is crucial to understanding problems in
|
|
the test suite itself, or its occasional misuses. It is a good idea to
|
|
also subscribe foreign programs you depend upon, to avoid incompatible
|
|
diagnostics.
|
|
|
|
@var{executables} is implicitly wrapped in shell double quotes, but it
|
|
will still use shell variable expansion (@samp{$}), command substitution
|
|
(@samp{`}), and backslash escaping (@samp{\}). In particular, the
|
|
@env{EXEEXT} variable is available if it is passed to the testsuite
|
|
via @file{atlocal} or @file{atconfig}.
|
|
@end defmac
|
|
|
|
@defmac AT_PREPARE_TESTS (@var{shell-code})
|
|
@atindex{PREPARE_TESTS}
|
|
Execute @var{shell-code} in the main testsuite process,
|
|
after initializing the test suite and processing command-line options,
|
|
but before running any tests. If this macro is used several times,
|
|
all of the @var{shell-code}s will be executed,
|
|
in the order they appeared in @file{testsuite.at}.
|
|
|
|
One reason to use @code{AT_PREPARE_TESTS} is when the programs under
|
|
test are sensitive to environment variables: you can unset all these
|
|
variables or reset them to safe values in @var{shell-code}.
|
|
|
|
@var{shell-code} is only executed if at least one test is going to be
|
|
run. In particular, it will not be executed if any of the @option{--help},
|
|
@option{--version}, @option{--list}, or @option{--clean} options are
|
|
given to @command{testsuite} (@pxref{testsuite Invocation}).
|
|
@end defmac
|
|
|
|
@defmac AT_PREPARE_EACH_TEST (@var{shell-code})
|
|
@atindex{AT_PREPARE_EACH_TEST}
|
|
Execute @var{shell-code} in each test group's subshell, at the point of
|
|
the @code{AT_SETUP} that starts the test group.
|
|
@end defmac
|
|
|
|
@defmac AT_TEST_HELPER_FN (@var{name}, @var{args}, @var{description}, @var{code})
|
|
Define a shell function that will be available to the code for each test
|
|
group. Its name will be @code{ath_fn_@var{name}}, and its body will be
|
|
@var{code}. (The prefix prevents name conflicts with shell functions
|
|
defined by M4sh and Autotest.)
|
|
|
|
@var{args} should describe the function's arguments and @var{description}
|
|
what it does; these are used only for documentation comments in the
|
|
generated testsuite script.
|
|
@end defmac
|
|
|
|
@sp 1
|
|
|
|
@defmac AT_BANNER (@var{test-category-name})
|
|
@atindex{BANNER}
|
|
This macro identifies the start of a category of related test groups.
|
|
When the resulting @file{testsuite} is invoked with more than one test
|
|
group to run, its output will include a banner containing
|
|
@var{test-category-name} prior to any tests run from that category. The
|
|
banner should be no more than about 40 or 50 characters. A blank banner
|
|
indicates uncategorized tests; an empty line will be inserted after
|
|
tests from an earlier category, effectively ending that category.
|
|
@end defmac
|
|
|
|
@defmac AT_SETUP (@var{test-group-name})
|
|
@atindex{SETUP}
|
|
This macro starts a group of related tests, all to be executed in the
|
|
same subshell. It accepts a single argument, which holds a few words
|
|
(no more than about 30 or 40 characters) quickly describing the purpose
|
|
of the test group being started. @var{test-group-name} must not expand
|
|
to unbalanced quotes, although quadrigraphs can be used.
|
|
@end defmac
|
|
|
|
@defmac AT_KEYWORDS (@var{keywords})
|
|
@atindex{KEYWORDS}
|
|
Associate the space-separated list of @var{keywords} to the enclosing
|
|
test group. This makes it possible to run ``slices'' of the test suite.
|
|
For instance, if some of your test groups exercise some @samp{foo}
|
|
feature, then using @samp{AT_KEYWORDS(foo)} lets you run
|
|
@samp{./testsuite -k foo} to run exclusively these test groups. The
|
|
@var{test-group-name} of the test group is automatically recorded to
|
|
@code{AT_KEYWORDS}.
|
|
|
|
Several invocations within a test group accumulate new keywords. In
|
|
other words, don't fear registering the same keyword several times in a
|
|
test group.
|
|
@end defmac
|
|
|
|
@defmac AT_CAPTURE_FILE (@var{file})
|
|
@atindex{CAPTURE_FILE}
|
|
If the current test group fails, log the contents of @var{file}.
|
|
Several identical calls within one test group have no additional effect.
|
|
@end defmac
|
|
|
|
@defmac AT_FAIL_IF (@var{shell-condition})
|
|
@atindex{FAIL_IF}
|
|
Make the test group fail and skip the rest of its execution, if
|
|
@var{shell-condition} is true. @var{shell-condition} is a shell expression
|
|
such as a @code{test} command. Tests before @command{AT_FAIL_IF}
|
|
will be executed and may still cause the test group to be skipped.
|
|
You can instantiate this macro many times from within the same test group.
|
|
|
|
You should use this macro only for very simple failure conditions. If the
|
|
@var{shell-condition} could emit any kind of output you should instead
|
|
use @command{AT_CHECK} like
|
|
@example
|
|
AT_CHECK([if @var{shell-condition}; then exit 99; fi])
|
|
@end example
|
|
@noindent
|
|
so that such output is properly recorded in the @file{testsuite.log}
|
|
file.
|
|
@end defmac
|
|
|
|
@defmac AT_SKIP_IF (@var{shell-condition})
|
|
@atindex{SKIP_IF}
|
|
Determine whether the test should be skipped because it requires
|
|
features that are unsupported on the machine under test.
|
|
@var{shell-condition} is a shell expression such as a @code{test}
|
|
command. Tests before @command{AT_SKIP_IF} will be executed
|
|
and may still cause the test group to fail. You can instantiate this
|
|
macro many times from within the same test group.
|
|
|
|
You should use this macro only for very simple skip conditions. If the
|
|
@var{shell-condition} could emit any kind of output you should instead
|
|
use @command{AT_CHECK} like
|
|
@example
|
|
AT_CHECK([if @var{shell-condition}; then exit 77; fi])
|
|
@end example
|
|
@noindent
|
|
so that such output is properly recorded in the @file{testsuite.log}
|
|
file.
|
|
@end defmac
|
|
|
|
@defmac AT_XFAIL_IF (@var{shell-condition})
|
|
@atindex{XFAIL_IF}
|
|
Determine whether the test is expected to fail because it is a known
|
|
bug (for unsupported features, you should skip the test).
|
|
@var{shell-condition} is a shell expression such as a @code{test}
|
|
command; you can instantiate this macro many times from within the
|
|
same test group, and one of the conditions is enough to turn
|
|
the test into an expected failure.
|
|
@end defmac
|
|
|
|
@defmac AT_CLEANUP
|
|
@atindex{CLEANUP}
|
|
End the current test group.
|
|
@end defmac
|
|
|
|
@sp 1
|
|
|
|
@defmac AT_DATA (@var{file}, @var{contents})
|
|
@defmacx AT_DATA_UNQUOTED (@var{file}, @var{contents})
|
|
@atindex{DATA}
|
|
Initialize an input data @var{file} with given @var{contents}. Of
|
|
course, the @var{contents} have to be properly quoted between square
|
|
brackets to protect against included commas or spurious M4
|
|
expansion. @var{contents} must be empty or end with a newline.
|
|
@var{file} must
|
|
be a single shell word that expands into a single file name.
|
|
|
|
The difference between @code{AT_DATA} and @code{AT_DATA_UNQUOTED} is
|
|
that only the latter performs shell variable expansion (@samp{$}),
|
|
command substitution (@samp{`}), and backslash escaping (@samp{\})
|
|
on @var{contents}.
|
|
@end defmac
|
|
|
|
@defmac AT_CHECK (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
|
|
@ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
|
|
@defmacx AT_CHECK_UNQUOTED (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
|
|
@ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
|
|
@atindex{CHECK}
|
|
@atindex{CHECK_UNQUOTED}
|
|
@vrindex at_status
|
|
Perform a test, by running the shell @var{commands} in a subshell.
|
|
@var{commands} is output as-is, so shell expansions are honored.
|
|
These commands are expected to have a final exit status of @var{status},
|
|
and to produce output as described by @var{stdout} and @var{stderr}
|
|
(see below).
|
|
|
|
This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.
|
|
|
|
If @var{commands} exit with unexpected status 77, then the rest of the
|
|
test group is skipped. If @var{commands} exit with unexpected status
|
|
99, then the test group is immediately failed; this is called a
|
|
@emph{hard failure}. Otherwise, the test is considered to have
|
|
succeeded if all of the status, stdout, and stderr expectations were
|
|
met.
|
|
|
|
If @var{run-if-fail} is nonempty, it provides extra shell commands to
|
|
run when the test fails; if @var{run-if-pass} is nonempty, it provides
|
|
extra shell commands to run when the test succeeds. These commands are
|
|
@emph{not} run in a subshell, and they are not run when the test group
|
|
is skipped (exit code 77) or hard-failed (exit code 99). They may
|
|
change whether the test group is considered to have succeeded, by
|
|
modifying the shell variable @code{at_failed}; set it to @code{:} to
|
|
indicate that the test group has failed, or @code{false} to indicate
|
|
that it has succeeded.
|
|
|
|
The exit status of @var{commands} is available to @var{run-if-fail} and
|
|
@var{run-if-pass} commands in the @code{at_status} shell variable. The
|
|
output from @var{commands} is also available, in the files named by the
|
|
@code{at_stdout} and @code{at_stderr} variables.
|
|
|
|
If @var{status} is the literal @samp{ignore}, then the exit status of
|
|
@var{commands} is not checked, except for the special cases of 77 (skip)
|
|
and 99 (hard failure). The existence of hard failures allows one to
|
|
mark a test as an expected failure with @code{AT_XFAIL_IF} because a
|
|
feature has not yet been implemented, but to still distinguish between
|
|
gracefully handling the missing feature and dumping core.
|
|
|
|
If the value of the @var{stdout} or @var{stderr} parameter is one of the
|
|
literals in the following table, then the test treats the output
|
|
according to the rules of that literal.
|
|
|
|
@table @samp
|
|
@item ignore
|
|
The content of the output is ignored, but still captured in the test
|
|
group log (if the testsuite is run with the @option{-v} option, the test
|
|
group log is displayed as the test is run; if the test group later
|
|
fails, the test group log is also copied into the overall testsuite
|
|
log). This action is valid for both @var{stdout} and @var{stderr}.
|
|
|
|
@item ignore-nolog
|
|
The content of the output is ignored, and nothing is captured in the log
|
|
files. If @var{commands} are likely to produce binary output (including
|
|
long lines) or large amounts of output, then logging the output can make
|
|
it harder to locate details related to subsequent tests within the
|
|
group, and could potentially corrupt terminal display of a user running
|
|
@command{testsuite -v}. This action is valid for both @var{stdout} and
|
|
@var{stderr}.
|
|
|
|
@item stdout
|
|
Only valid as the @var{stdout} parameter. Capture the content of
|
|
standard output in both a file named @file{stdout} and the test group log.
|
|
Subsequent commands in the test group can then post-process the file.
|
|
This action is often used when it is desired to use @command{grep} to
|
|
look for a substring in the output, or when the output must be
|
|
post-processed to normalize error messages into a common form.
|
|
|
|
@item stderr
|
|
Only valid as the @var{stderr} parameter. Capture the content of
|
|
standard error in both a file named @file{stderr} and the test group log.
|
|
|
|
@item stdout-nolog
|
|
@itemx stderr-nolog
|
|
Like @samp{stdout} or @samp{stderr}, except that the captured output is
|
|
not duplicated into the test group log. This action is particularly
|
|
useful for an intermediate check that produces large amounts of data,
|
|
which will be followed by another check that filters down to the
|
|
relevant data, as it makes it easier to locate details in the log.
|
|
|
|
@item expout
|
|
Only valid as the @var{stdout} parameter. Compare standard output with
|
|
the previously created file @file{expout}, and list any differences in
|
|
the testsuite log.
|
|
|
|
@item experr
|
|
Only valid as the @var{stderr} parameter. Compare standard error with
|
|
the previously created file @file{experr}, and list any differences in
|
|
the testsuite log.
|
|
@end table
|
|
|
|
Otherwise, the values of the @var{stdout} and @var{stderr} parameters
|
|
are treated as text that must exactly match the output given by
|
|
@var{commands} on standard output and standard error (including an empty
|
|
parameter for no output); any differences are captured in the testsuite
|
|
log and the test is failed (unless an unexpected exit status of 77
|
|
skipped the test instead).
|
|
|
|
@code{AT_CHECK_UNQUOTED} performs shell variable expansion (@samp{$}),
|
|
command substitution (@samp{`}), and backslash escaping (@samp{\}) on
|
|
comparison text given in the @var{stdout} and @var{stderr} parameters;
|
|
@code{AT_CHECK} does not. There is no difference in the interpretation
|
|
of @var{commands}.
|
|
@end defmac
|
|
|
|
@defmac AT_CHECK_EUNIT (@var{module}, @var{test-spec}, @ovar{erlflags}, @
|
|
@ovar{run-if-fail}, @ovar{run-if-pass})
|
|
@atindex{CHECK_EUNIT}
|
|
Initialize and execute an Erlang module named @var{module} that performs
|
|
tests following the @var{test-spec} EUnit test specification.
|
|
@var{test-spec} must be a valid EUnit test specification, as defined in
|
|
the @uref{https://@/erlang.org/@/doc/@/apps/@/eunit/@/index.html, EUnit
|
|
Reference Manual}. @var{erlflags} are optional command-line options
|
|
passed to the Erlang interpreter to execute the test Erlang module.
|
|
Typically, @var{erlflags} defines at least the paths to directories
|
|
containing the compiled Erlang modules under test, as @samp{-pa path1
|
|
path2 ...}.
|
|
|
|
For example, the unit tests associated with Erlang module @samp{testme},
|
|
which compiled code is in subdirectory @file{src}, can be performed
|
|
with:
|
|
|
|
@example
|
|
AT_CHECK_EUNIT([testme_testsuite], [@{module, testme@}],
|
|
[-pa "$@{abs_top_builddir@}/src"])
|
|
@end example
|
|
|
|
This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.
|
|
|
|
Variables @code{ERL}, @code{ERLC}, and (optionally) @code{ERLCFLAGS}
|
|
must be defined as the path of the Erlang interpreter, the path of the
|
|
Erlang compiler, and the command-line flags to pass to the compiler,
|
|
respectively. Those variables should be configured in
|
|
@file{configure.ac} using the @command{AC_ERLANG_PATH_ERL} and
|
|
@command{AC_ERLANG_PATH_ERLC} macros, and the configured values of those
|
|
variables are automatically defined in the testsuite. If @code{ERL} or
|
|
@code{ERLC} is not defined, the test group is skipped.
|
|
|
|
If the EUnit library cannot be found, i.e. if module @code{eunit} cannot
|
|
be loaded, the test group is skipped. Otherwise, if @var{test-spec} is
|
|
an invalid EUnit test specification, the test group fails. Otherwise,
|
|
if the EUnit test passes, shell commands @var{run-if-pass} are executed
|
|
or, if the EUnit test fails, shell commands @var{run-if-fail} are
|
|
executed and the test group fails.
|
|
|
|
Only the generated test Erlang module is automatically compiled and
|
|
executed. If @var{test-spec} involves testing other Erlang modules,
|
|
e.g. module @samp{testme} in the example above, those modules must be
|
|
already compiled.
|
|
|
|
If the testsuite is run in verbose mode and with the @option{--verbose} option,
|
|
EUnit is also run in verbose mode to output more details about
|
|
individual unit tests.
|
|
@end defmac
|
|
|
|
|
|
@node testsuite Invocation
|
|
@section Running @command{testsuite} Scripts
|
|
@cindex @command{testsuite}
|
|
|
|
Autotest test suites support the following options:
|
|
|
|
@table @option
|
|
@item --help
|
|
@itemx -h
|
|
Display the list of options and exit successfully.
|
|
|
|
@item --version
|
|
@itemx -V
|
|
Display the version of the test suite and exit successfully.
|
|
|
|
@item --directory=@var{dir}
|
|
@itemx -C @var{dir}
|
|
Change the current directory to @var{dir} before creating any files.
|
|
Useful for running the testsuite in a subdirectory from a top-level
|
|
Makefile.
|
|
|
|
@item --jobs@r{[}=@var{n}@r{]}
|
|
@itemx -j@ovar{n}
|
|
Run @var{n} tests in parallel, if possible. If @var{n} is not given,
|
|
run all given tests in parallel. Note that there should be no space
|
|
before the argument to @option{-j}, as @option{-j @var{number}} denotes
|
|
the separate arguments @option{-j} and @option{@var{number}}, see below.
|
|
|
|
In parallel mode, the standard input device of the testsuite script is
|
|
not available to commands inside a test group. Furthermore, banner
|
|
lines are not printed, and the summary line for each test group is
|
|
output after the test group completes. Summary lines may appear
|
|
unordered. If verbose and trace output are enabled (see below), they
|
|
may appear intermixed from concurrently running tests.
|
|
|
|
Parallel mode requires the @command{mkfifo} command to work, and will be
|
|
silently disabled otherwise.
|
|
|
|
@item --clean
|
|
@itemx -c
|
|
Remove all the files the test suite might have created and exit. Meant
|
|
for @code{clean} Make targets.
|
|
|
|
@item --list
|
|
@itemx -l
|
|
List all the tests (or only the selection), including their possible
|
|
keywords.
|
|
@end table
|
|
|
|
@sp 1
|
|
|
|
By default all tests are performed (or described with @option{--list})
|
|
silently in the default environment, but the environment, set of tests,
|
|
and verbosity level can be tuned:
|
|
|
|
@table @samp
|
|
@item @var{variable}=@var{value}
|
|
Set the environment @var{variable} to @var{value}. Use this rather
|
|
than @samp{FOO=foo ./testsuite} as debugging scripts would then run in a
|
|
different environment.
|
|
|
|
@cindex @code{AUTOTEST_PATH}
|
|
The variable @code{AUTOTEST_PATH} specifies the testing path to prepend
|
|
to @env{PATH}. Relative directory names (not starting with
|
|
@samp{/}) are considered to be relative to the top level of the
|
|
package being built. All directories are made absolute, first
|
|
starting from the top level @emph{build} tree, then from the
|
|
@emph{source} tree. For instance @samp{./testsuite
|
|
AUTOTEST_PATH=tests:bin} for a @file{/src/foo-1.0} source package built
|
|
in @file{/tmp/foo} results in @samp{/tmp/foo/tests:/tmp/foo/bin} and
|
|
then @samp{/src/foo-1.0/tests:/src/foo-1.0/bin} being prepended to
|
|
@env{PATH}.
|
|
|
|
@item @var{number}
|
|
@itemx @var{number}-@var{number}
|
|
@itemx @var{number}-
|
|
@itemx -@var{number}
|
|
Add the corresponding test groups, with obvious semantics, to the
|
|
selection.
|
|
|
|
@item --keywords=@var{keywords}
|
|
@itemx -k @var{keywords}
|
|
Add to the selection the test groups with title or keywords (arguments
|
|
to @code{AT_SETUP} or @code{AT_KEYWORDS}) that match @emph{all} keywords
|
|
of the comma separated list @var{keywords}, case-insensitively. Use
|
|
@samp{!} immediately before the keyword to invert the selection for this
|
|
keyword. By default, the keywords match whole words; enclose them in
|
|
@samp{.*} to also match parts of words.
|
|
|
|
For example, running
|
|
|
|
@example
|
|
@kbd{./testsuite -k 'autoupdate,.*FUNC.*'}
|
|
@end example
|
|
|
|
@noindent
|
|
selects all tests tagged @samp{autoupdate} @emph{and} with tags
|
|
containing @samp{FUNC} (as in @samp{AC_CHECK_FUNC}, @samp{AC_FUNC_ALLOCA},
|
|
etc.), while
|
|
|
|
@example
|
|
@kbd{./testsuite -k '!autoupdate' -k '.*FUNC.*'}
|
|
@end example
|
|
|
|
@noindent
|
|
selects all tests not tagged @samp{autoupdate} @emph{or} with tags
|
|
containing @samp{FUNC}.
|
|
|
|
@item --errexit
|
|
@itemx -e
|
|
If any test fails, immediately abort testing. This implies
|
|
@option{--debug}: post test group clean up, and top-level logging
|
|
are inhibited. This option is meant for the full test
|
|
suite, it is not really useful for generated debugging scripts.
|
|
If the testsuite is run in parallel mode using @option{--jobs},
|
|
then concurrently running tests will finish before exiting.
|
|
|
|
@item --verbose
|
|
@itemx -v
|
|
Force more verbosity in the detailed output of what is being done. This
|
|
is the default for debugging scripts.
|
|
|
|
@item --color
|
|
@itemx --color@r{[}=never@r{|}auto@r{|}always@r{]}
|
|
Enable colored test results. Without an argument, or with @samp{always},
|
|
test results will be colored. With @samp{never}, color mode is turned
|
|
off. Otherwise, if either the macro @code{AT_COLOR_TESTS} is used by
|
|
the testsuite author, or the argument @samp{auto} is given, then test
|
|
results are colored if standard output is connected to a terminal.
|
|
|
|
@item --debug
|
|
@itemx -d
|
|
Do not remove the files after a test group was performed---but they are
|
|
still removed @emph{before}, therefore using this option is sane when
|
|
running several test groups. Create debugging scripts. Do not
|
|
overwrite the top-level
|
|
log (in order to preserve a supposedly existing full log file). This is
|
|
the default for debugging scripts, but it can also be useful to debug
|
|
the testsuite itself.
|
|
|
|
@item --recheck
|
|
Add to the selection all test groups that failed or passed unexpectedly
|
|
during the last non-debugging test run.
|
|
|
|
@item --trace
|
|
@itemx -x
|
|
Trigger shell tracing of the test groups.
|
|
@end table
|
|
|
|
Besides these options accepted by every Autotest testsuite, the
|
|
testsuite author might have added package-specific options
|
|
via the @code{AT_ARG_OPTION} and @code{AT_ARG_OPTION_ARG} macros
|
|
(@pxref{Writing Testsuites}); refer to @command{testsuite --help} and
|
|
the package documentation for details.
|
|
|
|
|
|
@node Making testsuite Scripts
|
|
@section Making @command{testsuite} Scripts
|
|
|
|
For putting Autotest into movement, you need some configuration and
|
|
makefile machinery. We recommend, at least if your package uses deep or
|
|
shallow hierarchies, that you use @file{tests/} as the name of the
|
|
directory holding all your tests and their makefile. Here is a
|
|
check list of things to do, followed by an example, taking into
|
|
consideration whether you are also using Automake.
|
|
|
|
@itemize @minus
|
|
|
|
@item
|
|
@cindex @file{package.m4}
|
|
@atindex{PACKAGE_STRING}
|
|
@atindex{PACKAGE_BUGREPORT}
|
|
@atindex{PACKAGE_NAME}
|
|
@atindex{PACKAGE_TARNAME}
|
|
@atindex{PACKAGE_VERSION}
|
|
@atindex{PACKAGE_URL}
|
|
Make sure to create the file @file{package.m4}, which defines the
|
|
identity of the package. It must define @code{AT_PACKAGE_STRING}, the
|
|
full signature of the package, and @code{AT_PACKAGE_BUGREPORT}, the
|
|
address to which bug reports should be sent. For sake of completeness,
|
|
we suggest that you also define @code{AT_PACKAGE_NAME},
|
|
@code{AT_PACKAGE_TARNAME}, @code{AT_PACKAGE_VERSION}, and
|
|
@code{AT_PACKAGE_URL}.
|
|
@xref{Initializing configure}, for a description of these variables.
|
|
Be sure to distribute @file{package.m4} and to put it into the source
|
|
hierarchy: the test suite ought to be shipped! See below for an example.
|
|
|
|
@item
|
|
Invoke @code{AC_CONFIG_TESTDIR} in your @file{configure.ac}.
|
|
|
|
@defmac AC_CONFIG_TESTDIR (@var{directory}, @dvarv{test-path, directory})
|
|
@acindex{CONFIG_TESTDIR}
|
|
An Autotest test suite is to be configured in @var{directory}. This
|
|
macro causes @file{@var{directory}/atconfig} to be created by
|
|
@command{config.status} and sets the default @code{AUTOTEST_PATH} to
|
|
@var{test-path} (@pxref{testsuite Invocation}).
|
|
@end defmac
|
|
|
|
@item
|
|
Still within @file{configure.ac}, as appropriate, ensure that some
|
|
@code{AC_CONFIG_FILES} command includes substitution for
|
|
@file{tests/atlocal}.
|
|
|
|
@item
|
|
Also within your @file{configure.ac}, arrange for the @code{AUTOM4TE}
|
|
variable to be set.
|
|
|
|
@item
|
|
The appropriate @file{Makefile} should be modified so the validation in
|
|
your package is triggered by @samp{make check}.
|
|
@end itemize
|
|
|
|
The following example demonstrates the above checklist, first by
|
|
assuming that you are using Automake (see below for tweaks to make to
|
|
get the same results without Automake). Begin by adding the following
|
|
lines to your @file{configure.ac}:
|
|
|
|
@example
|
|
# Initialize the test suite.
|
|
AC_CONFIG_TESTDIR([tests])
|
|
AC_CONFIG_FILES([tests/Makefile tests/atlocal])
|
|
AM_MISSING_PROG([AUTOM4TE], [autom4te])
|
|
@end example
|
|
|
|
Next, add the following lines to your @file{tests/Makefile.am}, in order
|
|
to link @samp{make check} with a validation suite.
|
|
|
|
@example
|
|
$(srcdir)/package.m4: $(top_srcdir)/configure.ac
|
|
printf >'$@@' '%s\n' \
|
|
'# Signature of the current package.' \
|
|
'm4_define([AT_PACKAGE_NAME], [$(PACKAGE_NAME)])' \
|
|
'm4_define([AT_PACKAGE_TARNAME], [$(PACKAGE_TARNAME)])' \
|
|
'm4_define([AT_PACKAGE_VERSION], [$(PACKAGE_VERSION)])' \
|
|
'm4_define([AT_PACKAGE_STRING], [$(PACKAGE_STRING)])' \
|
|
'm4_define([AT_PACKAGE_URL], [$(PACKAGE_URL)])' \
|
|
'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'
|
|
|
|
EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in
|
|
TESTSUITE = $(srcdir)/testsuite
|
|
|
|
check-local: atconfig atlocal $(TESTSUITE)
|
|
$(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
|
|
|
|
installcheck-local: atconfig atlocal $(TESTSUITE)
|
|
$(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
|
|
$(TESTSUITEFLAGS)
|
|
|
|
clean-local:
|
|
test ! -f '$(TESTSUITE)' || \
|
|
$(SHELL) '$(TESTSUITE)' --clean
|
|
|
|
AUTOTEST = $(AUTOM4TE) --language=autotest
|
|
$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
|
|
$(AUTOTEST) -I '$(srcdir)' -o $@@.tmp $@@.at
|
|
mv $@@.tmp $@@
|
|
@end example
|
|
|
|
Note that the built testsuite is distributed; this is necessary because
|
|
users might not have Autoconf installed, and thus would not be able to
|
|
rebuild it. Likewise, the use of Automake's @code{AM_MISSING_PROG} will
|
|
arrange for the definition of @code{$AUTOM4TE} within the Makefile to
|
|
provide the user with
|
|
a nicer error message if they modify a source file to the testsuite, and
|
|
accidentally trigger the rebuild rules.
|
|
|
|
You might want to list explicitly the dependencies, i.e., the list of
|
|
the files @file{testsuite.at} includes.
|
|
|
|
If you don't use Automake, you should make the following tweaks. In
|
|
your @file{configure.ac}, replace the @code{AM_MISSING_PROG} line above
|
|
with @code{AC_PATH_PROG([AUTOM4TE], [autom4te], [false])}. You are
|
|
welcome to also try using the @command{missing} script from the Automake
|
|
project instead of @command{false}, to try to get a nicer error message
|
|
when the user modifies prerequisites but did not have Autoconf
|
|
installed, but at that point you may be better off using Automake.
|
|
Then, take the code suggested above for @file{tests/@/Makefile.am} and
|
|
place it in your @file{tests/@/Makefile.in} instead. Add code to your
|
|
@file{tests/@/Makefile.in} to ensure that @code{$(EXTRA_DIST)} files are
|
|
distributed, as well as adding the following additional lines to prepare
|
|
the set of needed Makefile variables:
|
|
|
|
@example
|
|
subdir = tests
|
|
PACKAGE_NAME = @@PACKAGE_NAME@@
|
|
PACKAGE_TARNAME = @@PACKAGE_TARNAME@@
|
|
PACKAGE_VERSION = @@PACKAGE_VERSION@@
|
|
PACKAGE_STRING = @@PACKAGE_STRING@@
|
|
PACKAGE_BUGREPORT = @@PACKAGE_BUGREPORT@@
|
|
PACKAGE_URL = @@PACKAGE_URL@@
|
|
AUTOM4TE = @@AUTOM4TE@@
|
|
|
|
atconfig: $(top_builddir)/config.status
|
|
cd $(top_builddir) && \
|
|
$(SHELL) ./config.status $(subdir)/$@@
|
|
|
|
atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
|
|
cd $(top_builddir) && \
|
|
$(SHELL) ./config.status $(subdir)/$@@
|
|
@end example
|
|
|
|
Using the above example (with or without Automake), and assuming you
|
|
were careful to not initialize @samp{TESTSUITEFLAGS} within your
|
|
makefile, you can now fine-tune test suite execution at runtime by
|
|
altering this variable, for example:
|
|
|
|
@example
|
|
make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'
|
|
@end example
|
|
|
|
|
|
|
|
@c =============================== Frequent Autoconf Questions, with answers
|
|
|
|
@node FAQ
|
|
@chapter Frequent Autoconf Questions, with answers
|
|
|
|
Several questions about Autoconf come up occasionally. Here some of them
|
|
are addressed.
|
|
|
|
@menu
|
|
* Distributing:: Distributing @command{configure} scripts
|
|
* Why GNU M4:: Why not use the standard M4?
|
|
* Bootstrapping:: Autoconf and GNU M4 require each other?
|
|
* Why Not Imake:: Why GNU uses @command{configure} instead of Imake
|
|
* Defining Directories:: Passing @code{datadir} to program
|
|
* Autom4te Cache:: What is it? Can I remove it?
|
|
* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
|
|
* Expanded Before Required:: Expanded Before Required
|
|
* Debugging:: Debugging @command{configure} scripts
|
|
@end menu
|
|
|
|
@node Distributing
|
|
@section Distributing @command{configure} Scripts
|
|
@cindex License
|
|
|
|
@display
|
|
What are the restrictions on distributing @command{configure}
|
|
scripts that Autoconf generates? How does that affect my
|
|
programs that use them?
|
|
@end display
|
|
|
|
There are no restrictions on how the configuration scripts that Autoconf
|
|
produces may be distributed or used. In Autoconf version 1, they were
|
|
covered by the GNU General Public License. We still encourage
|
|
software authors to distribute their work under terms like those of the
|
|
GPL, but doing so is not required to use Autoconf.
|
|
|
|
Of the other files that might be used with @command{configure},
|
|
@file{config.h.in} is under whatever copyright you use for your
|
|
@file{configure.ac}. @file{config.sub} and @file{config.guess} have an
|
|
exception to the GPL when they are used with an Autoconf-generated
|
|
@command{configure} script, which permits you to distribute them under the
|
|
same terms as the rest of your package. @file{install-sh} is from the X
|
|
Consortium and is not copyrighted.
|
|
|
|
@node Why GNU M4
|
|
@section Why Require GNU M4?
|
|
|
|
@display
|
|
Why does Autoconf require GNU M4?
|
|
@end display
|
|
|
|
Many M4 implementations have hard-coded limitations on the size and
|
|
number of macros that Autoconf exceeds. They also lack several
|
|
builtin macros that it would be difficult to get along without in a
|
|
sophisticated application like Autoconf, including:
|
|
|
|
@example
|
|
m4_builtin
|
|
m4_indir
|
|
m4_bpatsubst
|
|
__file__
|
|
__line__
|
|
@end example
|
|
|
|
Autoconf requires version 1.4.8 or later of GNU M4.
|
|
It works better with version 1.4.16 or later.
|
|
|
|
Since only software maintainers need to use Autoconf, and since GNU
|
|
M4 is simple to configure and install, it seems reasonable to require
|
|
GNU M4 to be installed also. Many maintainers of GNU and
|
|
other free software already have most of the GNU utilities
|
|
installed, since they prefer them.
|
|
|
|
@node Bootstrapping
|
|
@section How Can I Bootstrap?
|
|
@cindex Bootstrap
|
|
|
|
@display
|
|
If Autoconf requires GNU M4 and GNU M4 has an Autoconf
|
|
@command{configure} script, how do I bootstrap? It seems like a chicken
|
|
and egg problem!
|
|
@end display
|
|
|
|
This is a misunderstanding. Although GNU M4 does come with a
|
|
@command{configure} script produced by Autoconf, Autoconf is not required
|
|
in order to run the script and install GNU M4. Autoconf is only
|
|
required if you want to change the M4 @command{configure} script, which few
|
|
people have to do (mainly its maintainer).
|
|
|
|
@node Why Not Imake
|
|
@section Why Not Imake?
|
|
@cindex Imake
|
|
|
|
@display
|
|
Why not use Imake instead of @command{configure} scripts?
|
|
@end display
|
|
|
|
Several people have written addressing this question, so
|
|
adaptations of their explanations are included here.
|
|
|
|
The following answer is based on one written by Richard Pixley:
|
|
|
|
@quotation
|
|
Autoconf generated scripts frequently work on machines that it has
|
|
never been set up to handle before. That is, it does a good job of
|
|
inferring a configuration for a new system. Imake cannot do this.
|
|
|
|
Imake uses a common database of host specific data. For X11, this makes
|
|
sense because the distribution is made as a collection of tools, by one
|
|
central authority who has control over the database.
|
|
|
|
GNU tools are not released this way. Each GNU tool has a
|
|
maintainer; these maintainers are scattered across the world. Using a
|
|
common database would be a maintenance nightmare. Autoconf may appear
|
|
to be this kind of database, but in fact it is not. Instead of listing
|
|
host dependencies, it lists program requirements.
|
|
|
|
If you view the GNU suite as a collection of native tools, then the
|
|
problems are similar. But the GNU development tools can be
|
|
configured as cross tools in almost any host+target permutation. All of
|
|
these configurations can be installed concurrently. They can even be
|
|
configured to share host independent files across hosts. Imake doesn't
|
|
address these issues.
|
|
|
|
Imake templates are a form of standardization. The GNU coding
|
|
standards address the same issues without necessarily imposing the same
|
|
restrictions.
|
|
@end quotation
|
|
|
|
|
|
Here is some further explanation, written by Per Bothner:
|
|
|
|
@quotation
|
|
One of the advantages of Imake is that it is easy to generate large
|
|
makefiles using the @samp{#include} and macro mechanisms of @command{cpp}.
|
|
However, @code{cpp} is not programmable: it has limited conditional
|
|
facilities, and no looping. And @code{cpp} cannot inspect its
|
|
environment.
|
|
|
|
All of these problems are solved by using @code{sh} instead of
|
|
@code{cpp}. The shell is fully programmable, has macro substitution,
|
|
can execute (or source) other shell scripts, and can inspect its
|
|
environment.
|
|
@end quotation
|
|
|
|
|
|
Paul Eggert elaborates more:
|
|
|
|
@quotation
|
|
With Autoconf, installers need not assume that Imake itself is already
|
|
installed and working well. This may not seem like much of an advantage
|
|
to people who are accustomed to Imake. But on many hosts Imake is not
|
|
installed or the default installation is not working well, and requiring
|
|
Imake to install a package hinders the acceptance of that package on
|
|
those hosts. For example, the Imake template and configuration files
|
|
might not be installed properly on a host, or the Imake build procedure
|
|
might wrongly assume that all source files are in one big directory
|
|
tree, or the Imake configuration might assume one compiler whereas the
|
|
package or the installer needs to use another, or there might be a
|
|
version mismatch between the Imake expected by the package and the Imake
|
|
supported by the host. These problems are much rarer with Autoconf,
|
|
where each package comes with its own independent configuration
|
|
processor.
|
|
|
|
Also, Imake often suffers from unexpected interactions between
|
|
@command{make} and the installer's C preprocessor. The fundamental problem
|
|
here is that the C preprocessor was designed to preprocess C programs,
|
|
not makefiles. This is much less of a problem with Autoconf,
|
|
which uses the general-purpose preprocessor M4, and where the
|
|
package's author (rather than the installer) does the preprocessing in a
|
|
standard way.
|
|
@end quotation
|
|
|
|
|
|
Finally, Mark Eichin notes:
|
|
|
|
@quotation
|
|
Imake isn't all that extensible, either. In order to add new features to
|
|
Imake, you need to provide your own project template, and duplicate most
|
|
of the features of the existing one. This means that for a sophisticated
|
|
project, using the vendor-provided Imake templates fails to provide any
|
|
leverage---since they don't cover anything that your own project needs
|
|
(unless it is an X11 program).
|
|
|
|
On the other side, though:
|
|
|
|
The one advantage that Imake has over @command{configure}:
|
|
@file{Imakefile} files tend to be much shorter (likewise, less redundant)
|
|
than @file{Makefile.in} files. There is a fix to this, however---at least
|
|
for the Kerberos V5 tree, we've modified things to call in common
|
|
@file{post.in} and @file{pre.in} makefile fragments for the
|
|
entire tree. This means that a lot of common things don't have to be
|
|
duplicated, even though they normally are in @command{configure} setups.
|
|
@end quotation
|
|
|
|
|
|
@node Defining Directories
|
|
@section How Do I @code{#define} Installation Directories?
|
|
|
|
@display
|
|
My program needs library files, installed in @code{datadir} and
|
|
similar. If I use
|
|
|
|
@example
|
|
AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
|
|
[Define to the read-only architecture-independent
|
|
data directory.])
|
|
@end example
|
|
|
|
@noindent
|
|
I get
|
|
|
|
@example
|
|
#define DATADIR "$@{prefix@}/share"
|
|
@end example
|
|
@end display
|
|
|
|
As already explained, this behavior is on purpose, mandated by the
|
|
GNU Coding Standards, see @ref{Installation Directory
|
|
Variables}. There are several means to achieve a similar goal:
|
|
|
|
@itemize @minus
|
|
@item
|
|
Do not use @code{AC_DEFINE} but use your makefile to pass the
|
|
actual value of @code{datadir} via compilation flags.
|
|
@xref{Installation Directory Variables}, for the details.
|
|
|
|
@item
|
|
This solution can be simplified when compiling a program: you may either
|
|
extend the @code{CPPFLAGS}:
|
|
|
|
@example
|
|
CPPFLAGS = -DDATADIR='"$(datadir)"' @@CPPFLAGS@@
|
|
@end example
|
|
|
|
@noindent
|
|
If you are using Automake, you should use @code{AM_CPPFLAGS} instead:
|
|
|
|
@example
|
|
AM_CPPFLAGS = -DDATADIR='"$(datadir)"'
|
|
@end example
|
|
|
|
@noindent
|
|
Alternatively, create a dedicated header file:
|
|
|
|
@example
|
|
DISTCLEANFILES = myprog-paths.h
|
|
myprog-paths.h: Makefile
|
|
printf '%s\n' '#define DATADIR "$(datadir)"' >$@@
|
|
@end example
|
|
|
|
@noindent
|
|
The Gnulib module @samp{configmake} provides such a header with all the
|
|
standard directory variables defined, @pxref{configmake,,, gnulib, GNU
|
|
Gnulib}.
|
|
|
|
@item
|
|
Use @code{AC_DEFINE} but have @command{configure} compute the literal
|
|
value of @code{datadir} and others. Many people have wrapped macros to
|
|
automate this task; for an example, see the macro @code{AC_DEFINE_DIR} from
|
|
the @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
|
|
Archive}.
|
|
|
|
This solution does not conform to the GNU Coding Standards.
|
|
|
|
@item
|
|
Note that all the previous solutions hard wire the absolute name of
|
|
these directories in the executables, which is not a good property. You
|
|
may try to compute the names relative to @code{prefix}, and try to
|
|
find @code{prefix} at runtime, this way your package is relocatable.
|
|
@end itemize
|
|
|
|
|
|
@node Autom4te Cache
|
|
@section What is @file{autom4te.cache}?
|
|
|
|
@display
|
|
What is this directory @file{autom4te.cache}? Can I safely remove it?
|
|
@end display
|
|
|
|
In the GNU Build System, @file{configure.ac} plays a central
|
|
role and is read by many tools: @command{autoconf} to create
|
|
@file{configure}, @command{autoheader} to create @file{config.h.in},
|
|
@command{automake} to create @file{Makefile.in}, @command{autoscan} to
|
|
check the completeness of @file{configure.ac}, @command{autoreconf} to
|
|
check the GNU Build System components that are used. To
|
|
``read @file{configure.ac}'' actually means to compile it with M4,
|
|
which can be a long process for complex @file{configure.ac}.
|
|
|
|
This is why all these tools, instead of running directly M4, invoke
|
|
@command{autom4te} (@pxref{autom4te Invocation}) which, while answering to
|
|
a specific demand, stores additional information in
|
|
@file{autom4te.cache} for future runs. For instance, if you run
|
|
@command{autoconf}, behind the scenes, @command{autom4te} also
|
|
stores information for the other tools, so that when you invoke
|
|
@command{autoheader} or @command{automake} etc., reprocessing
|
|
@file{configure.ac} is not needed. The speed up is frequently 30%,
|
|
and is increasing with the size of @file{configure.ac}.
|
|
|
|
But it is and remains being simply a cache: you can safely remove it.
|
|
|
|
@sp 1
|
|
|
|
@display
|
|
Can I permanently get rid of it?
|
|
@end display
|
|
|
|
The creation of this cache can be disabled from
|
|
@file{~/.autom4te.cfg}, see @ref{Customizing autom4te}, for more
|
|
details. You should be aware that disabling the cache slows down the
|
|
Autoconf test suite by 40%. The more GNU Build System
|
|
components are used, the more the cache is useful; for instance
|
|
running @samp{autoreconf -f} on the Core Utilities is twice slower without
|
|
the cache @emph{although @option{--force} implies that the cache is
|
|
not fully exploited}, and eight times slower than without
|
|
@option{--force}.
|
|
|
|
|
|
@node Present But Cannot Be Compiled
|
|
@section Header Present But Cannot Be Compiled
|
|
|
|
The most important guideline to bear in mind when checking for
|
|
features is to mimic as much as possible the intended use.
|
|
Unfortunately, old versions of @code{AC_CHECK_HEADER} and
|
|
@code{AC_CHECK_HEADERS} failed to follow this idea, and called
|
|
the preprocessor, instead of the compiler, to check for headers. As a
|
|
result, incompatibilities between headers went unnoticed during
|
|
configuration, and maintainers finally had to deal with this issue
|
|
elsewhere.
|
|
|
|
The transition began with Autoconf 2.56. As of Autoconf 2.64 both
|
|
checks are performed, and @command{configure} complains loudly if the
|
|
compiler and the preprocessor do not agree. However, only the compiler
|
|
result is considered. As of Autoconf 2.70, only the compiler check is
|
|
performed.
|
|
|
|
Consider the following example:
|
|
|
|
@smallexample
|
|
$ @kbd{cat number.h}
|
|
typedef int number;
|
|
$ @kbd{cat pi.h}
|
|
const number pi = 3;
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AC_CHECK_HEADERS([pi.h])
|
|
$ @kbd{autoconf -Wall}
|
|
$ @kbd{./configure CPPFLAGS='-I.'}
|
|
checking for gcc... gcc
|
|
checking whether the C compiler works... yes
|
|
checking for C compiler default output file name... a.out
|
|
checking for suffix of executables...
|
|
checking whether we are cross compiling... no
|
|
checking for suffix of object files... o
|
|
checking whether the compiler supports GNU C... yes
|
|
checking whether gcc accepts -g... yes
|
|
checking for gcc option to enable C23 features... -std=gnu23
|
|
checking for sys/types.h... yes
|
|
checking for sys/stat.h... yes
|
|
checking for strings.h... yes
|
|
checking for inttypes.h... yes
|
|
checking for stdint.h... yes
|
|
checking for unistd.h... yes
|
|
checking for pi.h... no
|
|
@end smallexample
|
|
|
|
@noindent
|
|
The proper way to handle this case is using the fourth argument
|
|
(@pxref{Generic Headers}):
|
|
|
|
@example
|
|
$ @kbd{cat configure.ac}
|
|
AC_INIT([Example], [1.0], [bug-example@@example.org])
|
|
AC_CHECK_HEADERS([number.h pi.h], [], [],
|
|
[[#ifdef HAVE_NUMBER_H
|
|
# include <number.h>
|
|
#endif
|
|
]])
|
|
$ @kbd{autoconf -Wall}
|
|
$ @kbd{./configure CPPFLAGS='-I.'}
|
|
checking for gcc... gcc
|
|
checking whether the C compiler works... yes
|
|
checking for C compiler default output file name... a.out
|
|
checking for suffix of executables...
|
|
checking whether we are cross compiling... no
|
|
checking for suffix of object files... o
|
|
checking whether the compiler supports GNU C... yes
|
|
checking whether gcc accepts -g... yes
|
|
checking for gcc option to enable C23 features... -std=gnu23
|
|
checking for number.h... yes
|
|
checking for pi.h... yes
|
|
@end example
|
|
|
|
See @ref{Particular Headers}, for a list of headers with their
|
|
prerequisites.
|
|
|
|
@node Expanded Before Required
|
|
@section Expanded Before Required
|
|
|
|
@cindex expanded before required
|
|
Older versions of Autoconf silently built files with incorrect ordering
|
|
between dependent macros if an outer macro first expanded, then later
|
|
indirectly required, an inner macro. Starting with Autoconf 2.64, this
|
|
situation no longer generates out-of-order code, but results in
|
|
duplicate output and a syntax warning:
|
|
|
|
@example
|
|
$ @kbd{cat configure.ac}
|
|
@result{}AC_DEFUN([TESTA], [[echo in A
|
|
@result{}if test -n "$SEEN_A" ; then echo duplicate ; fi
|
|
@result{}SEEN_A=:]])
|
|
@result{}AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
|
|
@result{}if test -z "$SEEN_A" ; then echo bug ; fi]])
|
|
@result{}AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
|
|
@result{}AC_DEFUN([OUTER], [[echo in OUTER]
|
|
@result{}TESTA
|
|
@result{}TESTC])
|
|
@result{}AC_INIT
|
|
@result{}OUTER
|
|
@result{}AC_OUTPUT
|
|
$ @kbd{autoconf}
|
|
@result{}configure.ac:11: warning: AC_REQUIRE:
|
|
@result{} 'TESTA' was expanded before it was required
|
|
@result{}configure.ac:4: TESTB is expanded from...
|
|
@result{}configure.ac:6: TESTC is expanded from...
|
|
@result{}configure.ac:7: OUTER is expanded from...
|
|
@result{}configure.ac:11: the top level
|
|
@end example
|
|
|
|
@noindent
|
|
To avoid this warning, decide what purpose the macro in question serves.
|
|
If it only needs to be expanded once (for example, if it provides
|
|
initialization text used by later macros), then the simplest fix is to
|
|
change the macro to be declared with @code{AC_DEFUN_ONCE}
|
|
(@pxref{One-Shot Macros}), although this only works in Autoconf 2.64 and
|
|
newer. A more portable fix is to change all
|
|
instances of direct calls to instead go through @code{AC_REQUIRE}
|
|
(@pxref{Prerequisite Macros}). If, instead, the macro is parameterized
|
|
by arguments or by the current definition of other macros in the m4
|
|
environment, then the macro should always be directly expanded instead
|
|
of required.
|
|
|
|
For another case study, consider this example trimmed down from an
|
|
actual package. Originally, the package contained shell code and
|
|
multiple macro invocations at the top level of @file{configure.ac}:
|
|
|
|
@example
|
|
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
|
|
foobar=
|
|
AC_PROG_CC
|
|
FOO
|
|
@end example
|
|
|
|
@noindent
|
|
but that was getting complex, so the author wanted to offload some of
|
|
the text into a new macro in another file included via
|
|
@file{aclocal.m4}. The naïve approach merely wraps the text in a new
|
|
macro:
|
|
|
|
@example
|
|
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
|
|
AC_DEFUN([BAR], [
|
|
foobar=
|
|
AC_PROG_CC
|
|
FOO
|
|
])
|
|
BAR
|
|
@end example
|
|
|
|
@noindent
|
|
With older versions of Autoconf, the setting of @samp{foobar=} occurs
|
|
before the single compiler check, as the author intended. But with
|
|
Autoconf 2.64, this issues the ``expanded before it was required''
|
|
warning for @code{AC_PROG_CC}, and outputs two copies of the compiler
|
|
check, one before @samp{foobar=}, and one after. To understand why this
|
|
is happening, remember that the use of @code{AC_COMPILE_IFELSE} includes
|
|
a call to @code{AC_REQUIRE([AC_PROG_CC])} under the hood. According to
|
|
the documented semantics of @code{AC_REQUIRE}, this means that
|
|
@code{AC_PROG_CC} @emph{must} occur before the body of the outermost
|
|
@code{AC_DEFUN}, which in this case is @code{BAR}, thus preceding the
|
|
use of @samp{foobar=}. The older versions of Autoconf were broken with
|
|
regards to the rules of @code{AC_REQUIRE}, which explains why the code
|
|
changed from one over to two copies of @code{AC_PROG_CC} when upgrading
|
|
autoconf. In other words, the author was unknowingly relying on a bug
|
|
exploit to get the desired results, and that exploit broke once the bug
|
|
was fixed.
|
|
|
|
So, what recourse does the author have, to restore their intended
|
|
semantics of setting @samp{foobar=} prior to a single compiler check,
|
|
regardless of whether Autoconf 2.63 or 2.64 is used? One idea is to
|
|
remember that only @code{AC_DEFUN} is impacted by @code{AC_REQUIRE};
|
|
there is always the possibility of using the lower-level
|
|
@code{m4_define}:
|
|
|
|
@example
|
|
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
|
|
m4_define([BAR], [
|
|
foobar=
|
|
AC_PROG_CC
|
|
FOO
|
|
])
|
|
BAR
|
|
@end example
|
|
|
|
@noindent
|
|
This works great if everything is in the same file. However, it does
|
|
not help in the case where the author wants to have @command{aclocal}
|
|
find the definition of @code{BAR} from its own file, since
|
|
@command{aclocal} requires the use of @code{AC_DEFUN}. In this case, a
|
|
better fix is to recognize that if @code{BAR} also uses
|
|
@code{AC_REQUIRE}, then there will no longer be direct expansion prior
|
|
to a subsequent require. Then, by creating yet another helper macro,
|
|
the author can once again guarantee a single invocation of
|
|
@code{AC_PROG_CC}, which will still occur after @code{foobar=}. The
|
|
author can also use @code{AC_BEFORE} to make sure no other macro
|
|
appearing before @code{BAR} has triggered an unwanted expansion of
|
|
@code{AC_PROG_CC}.
|
|
|
|
@example
|
|
AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
|
|
AC_DEFUN([BEFORE_CC], [
|
|
foobar=
|
|
])
|
|
AC_DEFUN([BAR], [
|
|
AC_BEFORE([$0], [AC_PROG_CC])dnl
|
|
AC_REQUIRE([BEFORE_CC])dnl
|
|
AC_REQUIRE([AC_PROG_CC])dnl
|
|
FOO
|
|
])
|
|
BAR
|
|
@end example
|
|
|
|
|
|
@node Debugging
|
|
@section Debugging @command{configure} scripts
|
|
|
|
While in general, @command{configure} scripts generated by Autoconf
|
|
strive to be fairly portable to various systems, compilers, shells, and
|
|
other tools, it may still be necessary to debug a failing test, broken
|
|
script or makefile, or fix or override an incomplete, faulty, or erroneous
|
|
test, especially during macro development. Failures can occur at all levels,
|
|
in M4 syntax or semantics, shell script issues, or due to bugs in the
|
|
test or the tools invoked by @command{configure}. Together with the
|
|
rather arcane error message that @command{m4} and @command{make} may
|
|
produce when their input contains syntax errors, this can make debugging
|
|
rather painful.
|
|
|
|
Nevertheless, here is a list of hints and strategies that may help:
|
|
|
|
@itemize
|
|
@item
|
|
When @command{autoconf} fails, common causes for error include:
|
|
|
|
@itemize
|
|
@item
|
|
mismatched or unbalanced parentheses or braces (@pxref{Balancing
|
|
Parentheses}),
|
|
|
|
@item under- or over-quoted macro arguments (@pxref{Autoconf
|
|
Language}, @pxref{Quoting and Parameters}, @pxref{Quotation and Nested
|
|
Macros}),
|
|
|
|
@item spaces between macro name and opening parenthesis (@pxref{Autoconf
|
|
Language}).
|
|
@end itemize
|
|
|
|
Typically, it helps to go back to the last working version of the input
|
|
and compare the differences for each of these errors. Another
|
|
possibility is to sprinkle pairs of @code{m4_traceon} and
|
|
@code{m4_traceoff} judiciously in the code, either without a parameter
|
|
or listing some macro names and watch @command{m4} expand its input
|
|
verbosely (@pxref{Debugging via autom4te}).
|
|
|
|
@item
|
|
Sometimes @command{autoconf} succeeds but the generated
|
|
@command{configure} script has invalid shell syntax. You can detect this
|
|
case by running @samp{bash -n configure} or @samp{sh -n configure}.
|
|
If this command fails, the same tips apply, as if @command{autoconf} had
|
|
failed.
|
|
|
|
@item
|
|
Debugging @command{configure} script execution may be done by sprinkling
|
|
pairs of @code{set -x} and @code{set +x} into the shell script before
|
|
and after the region that contains a bug. Running the whole script with
|
|
@samp{@var{shell} -vx ./configure 2>&1 | tee @var{log-file}} with a decent
|
|
@var{shell} may work, but produces lots of output. Here, it can help to
|
|
search for markers like @samp{checking for} a particular test in the
|
|
@var{log-file}.
|
|
|
|
@item
|
|
Alternatively, you might use a shell with debugging capabilities like
|
|
@uref{https://bashdb.sourceforge.net/, bashdb}.
|
|
|
|
@item
|
|
When @command{configure} tests produce invalid results for your system,
|
|
it may be necessary to override them:
|
|
|
|
@itemize
|
|
@item
|
|
For programs, tools or libraries variables, preprocessor, compiler, or
|
|
linker flags, it is often sufficient to override them at @command{make}
|
|
run time with some care (@pxref{Macros and Submakes}). Since this
|
|
normally won't cause @command{configure} to be run again with these
|
|
changed settings, it may fail if the changed variable would have caused
|
|
different test results from @command{configure}, so this may work only
|
|
for simple differences.
|
|
|
|
@item
|
|
Most tests which produce their result in a substituted variable allow to
|
|
override the test by setting the variable on the @command{configure}
|
|
command line (@pxref{Compilers and Options}, @pxref{Defining Variables}).
|
|
|
|
@item
|
|
Many tests store their result in a cache variable (@pxref{Caching
|
|
Results}). This lets you override them either on the
|
|
@command{configure} command line as above, or through a primed cache or
|
|
site file (@pxref{Cache Files}, @pxref{Site Defaults}). The name of a
|
|
cache variable is documented with a test macro or may be inferred from
|
|
@ref{Cache Variable Names}; the precise semantics of undocumented
|
|
variables are often internal details, subject to change.
|
|
@end itemize
|
|
|
|
@item
|
|
Alternatively, @command{configure} may produce invalid results because
|
|
of uncaught programming errors, in your package or in an upstream
|
|
library package. For example, when @code{AC_CHECK_LIB} fails to find a
|
|
library with a specified function, always check @file{config.log}. This
|
|
will reveal the exact error that produced the failing result: the
|
|
library linked by @code{AC_CHECK_LIB} probably has a fatal bug.
|
|
@end itemize
|
|
|
|
Conversely, as macro author, you can make it easier for users of your
|
|
macro:
|
|
|
|
@itemize
|
|
@item
|
|
by minimizing dependencies between tests and between test results as far
|
|
as possible,
|
|
|
|
@item
|
|
by using @command{make} variables to factorize and allow
|
|
override of settings at @command{make} run time,
|
|
|
|
@item
|
|
by honoring the GNU Coding Standards and not overriding flags
|
|
reserved for the user except temporarily during @command{configure}
|
|
tests,
|
|
|
|
@item
|
|
by not requiring users of your macro to use the cache variables.
|
|
Instead, expose the result of the test via @var{run-if-true} and
|
|
@var{run-if-false} parameters. If the result is not a boolean,
|
|
then provide it through documented shell variables.
|
|
@end itemize
|
|
|
|
|
|
@c ===================================================== History of Autoconf.
|
|
|
|
@node History
|
|
@chapter History of Autoconf
|
|
@cindex History of autoconf
|
|
|
|
@emph{This chapter was written by the original author, David MacKenzie.}
|
|
|
|
You may be wondering, Why was Autoconf originally written? How did it
|
|
get into its present form? (Why does it look like gorilla spit?) If
|
|
you're not wondering, then this chapter contains no information useful
|
|
to you, and you might as well skip it. If you @emph{are} wondering,
|
|
then let there be light@enddots{}
|
|
|
|
@menu
|
|
* Genesis:: Prehistory and naming of @command{configure}
|
|
* Exodus:: The plagues of M4 and Perl
|
|
* Leviticus:: The priestly code of portability arrives
|
|
* Numbers:: Growth and contributors
|
|
* Deuteronomy:: Approaching the promises of easy configuration
|
|
@end menu
|
|
|
|
@node Genesis
|
|
@section Genesis
|
|
|
|
In June 1991 I was maintaining many of the GNU utilities for the
|
|
Free Software Foundation. As they were ported to more platforms and
|
|
more programs were added, the number of @option{-D} options that users
|
|
had to select in the makefile (around 20) became burdensome.
|
|
Especially for me---I had to test each new release on a bunch of
|
|
different systems. So I wrote a little shell script to guess some of
|
|
the correct settings for the fileutils package, and released it as part
|
|
of fileutils 2.0. That @command{configure} script worked well enough that
|
|
the next month I adapted it (by hand) to create similar @command{configure}
|
|
scripts for several other GNU utilities packages. Brian Berliner
|
|
also adapted one of my scripts for his CVS revision control system.
|
|
|
|
Later that summer, I learned that Richard Stallman and Richard Pixley
|
|
were developing similar scripts to use in the GNU compiler tools;
|
|
so I adapted my @command{configure} scripts to support their evolving
|
|
interface: using the file name @file{Makefile.in} as the templates;
|
|
adding @samp{+srcdir}, the first option (of many); and creating
|
|
@file{config.status} files.
|
|
|
|
@node Exodus
|
|
@section Exodus
|
|
|
|
As I got feedback from users, I incorporated many improvements, using
|
|
Emacs to search and replace, cut and paste, similar changes in each of
|
|
the scripts. As I adapted more GNU utilities packages to use
|
|
@command{configure} scripts, updating them all by hand became impractical.
|
|
Rich Murphey, the maintainer of the GNU graphics utilities, sent me
|
|
mail saying that the @command{configure} scripts were great, and asking if
|
|
I had a tool for generating them that I could send him. No, I thought,
|
|
but I should! So I started to work out how to generate them. And the
|
|
journey from the slavery of hand-written @command{configure} scripts to the
|
|
abundance and ease of Autoconf began.
|
|
|
|
Cygnus @command{configure}, which was being developed at around that time,
|
|
is table driven; it is meant to deal mainly with a discrete number of
|
|
system types with a small number of mainly unguessable features (such as
|
|
details of the object file format). The automatic configuration system
|
|
that Brian Fox had developed for Bash takes a similar approach. For
|
|
general use, it seems to me a hopeless cause to try to maintain an
|
|
up-to-date database of which features each variant of each operating
|
|
system has. It's easier and more reliable to check for most features on
|
|
the fly---especially on hybrid systems that people have hacked on
|
|
locally or that have patches from vendors installed.
|
|
|
|
I considered using an architecture similar to that of Cygnus
|
|
@command{configure}, where there is a single @command{configure} script that
|
|
reads pieces of @file{configure.in} when run. But I didn't want to have
|
|
to distribute all of the feature tests with every package, so I settled
|
|
on having a different @command{configure} made from each
|
|
@file{configure.in} by a preprocessor. That approach also offered more
|
|
control and flexibility.
|
|
|
|
I looked briefly into using the Metaconfig package, by Larry Wall,
|
|
Harlan Stenn, and Raphael Manfredi, but I decided not to for several
|
|
reasons. The @command{Configure} scripts it produces are interactive,
|
|
which I find quite inconvenient; I didn't like the ways it checked for
|
|
some features (such as library functions); I didn't know that it was
|
|
still being maintained, and the @command{Configure} scripts I had
|
|
seen didn't work on many modern systems (such as System V R4 and NeXT);
|
|
it wasn't flexible in what it could do in response to a feature's
|
|
presence or absence; I found it confusing to learn; and it was too big
|
|
and complex for my needs (I didn't realize then how much Autoconf would
|
|
eventually have to grow).
|
|
|
|
I considered using Perl to generate my style of @command{configure}
|
|
scripts, but decided that M4 was better suited to the job of simple
|
|
textual substitutions: it gets in the way less, because output is
|
|
implicit. Plus, everyone already has it. (Initially I didn't rely on
|
|
the GNU extensions to M4.) Also, some of my friends at the
|
|
University of Maryland had recently been putting M4 front ends on
|
|
several programs, including @code{tvtwm}, and I was interested in trying
|
|
out a new language.
|
|
|
|
@node Leviticus
|
|
@section Leviticus
|
|
|
|
Since my @command{configure} scripts determine the system's capabilities
|
|
automatically, with no interactive user intervention, I decided to call
|
|
the program that generates them Autoconfig. But with a version number
|
|
tacked on, that name would be too long for old Unix file systems,
|
|
so I shortened it to Autoconf.
|
|
|
|
In the fall of 1991 I called together a group of fellow questers after
|
|
the Holy Grail of portability (er, that is, alpha testers) to give me
|
|
feedback as I encapsulated pieces of my handwritten scripts in M4 macros
|
|
and continued to add features and improve the techniques used in the
|
|
checks. Prominent among the testers were François Pinard, who came up
|
|
with the idea of making an Autoconf shell script to run M4
|
|
and check for unresolved macro calls; Richard Pixley, who suggested
|
|
running the compiler instead of searching the file system to find
|
|
include files and symbols, for more accurate results; Karl Berry, who
|
|
got Autoconf to configure @TeX{} and added the macro index to the
|
|
documentation; and Ian Lance Taylor, who added support for creating a C
|
|
header file as an alternative to putting @option{-D} options in a
|
|
makefile, so he could use Autoconf for his UUCP package.
|
|
The alpha testers cheerfully adjusted their files again and again as the
|
|
names and calling conventions of the Autoconf macros changed from
|
|
release to release. They all contributed many specific checks, great
|
|
ideas, and bug fixes.
|
|
|
|
@node Numbers
|
|
@section Numbers
|
|
|
|
In July 1992, after months of alpha testing, I released Autoconf 1.0,
|
|
and converted many GNU packages to use it. I was surprised by how
|
|
positive the reaction to it was. More people started using it than I
|
|
could keep track of, including people working on software that wasn't
|
|
part of the GNU Project (such as TCL, FSP, and Kerberos V5).
|
|
Autoconf continued to improve rapidly, as many people using the
|
|
@command{configure} scripts reported problems they encountered.
|
|
|
|
Autoconf turned out to be a good torture test for M4 implementations.
|
|
Unix M4 started to dump core because of the length of the
|
|
macros that Autoconf defined, and several bugs showed up in GNU
|
|
M4 as well. Eventually, we realized that we needed to use some
|
|
features that only GNU M4 has. 4.3BSD M4, in
|
|
particular, has an impoverished set of builtin macros; the System V
|
|
version is better, but still doesn't provide everything we need.
|
|
|
|
More development occurred as people put Autoconf under more stresses
|
|
(and to uses I hadn't anticipated). Karl Berry added checks for X11.
|
|
david zuhn contributed C++ support. François Pinard made it diagnose
|
|
invalid arguments. Jim Blandy bravely coerced it into configuring
|
|
GNU Emacs, laying the groundwork for several later improvements.
|
|
Roland McGrath got it to configure the GNU C Library, wrote the
|
|
@command{autoheader} script to automate the creation of C header file
|
|
templates, and added a @option{--verbose} option to @command{configure}.
|
|
Noah Friedman added the @option{--autoconf-dir} option and
|
|
@code{AC_MACRODIR} environment variable. (He also coined the term
|
|
@dfn{autoconfiscate} to mean ``adapt a software package to use
|
|
Autoconf''.) Roland and Noah improved the quoting protection in
|
|
@code{AC_DEFINE} and fixed many bugs, especially when I got sick of
|
|
dealing with portability problems from February through June, 1993.
|
|
|
|
@node Deuteronomy
|
|
@section Deuteronomy
|
|
|
|
A long wish list for major features had accumulated, and the effect of
|
|
several years of patching by various people had left some residual
|
|
cruft. In April 1994, while working for Cygnus Support, I began a major
|
|
revision of Autoconf. I added most of the features of the Cygnus
|
|
@command{configure} that Autoconf had lacked, largely by adapting the
|
|
relevant parts of Cygnus @command{configure} with the help of david zuhn
|
|
and Ken Raeburn. These features include support for using
|
|
@file{config.sub}, @file{config.guess}, @option{--host}, and
|
|
@option{--target}; making links to files; and running @command{configure}
|
|
scripts in subdirectories. Adding these features enabled Ken to convert
|
|
GNU @code{as}, and Rob Savoye to convert DejaGNU, to using
|
|
Autoconf.
|
|
|
|
I added more features in response to other peoples' requests. Many
|
|
people had asked for @command{configure} scripts to share the results of
|
|
the checks between runs, because (particularly when configuring a large
|
|
source tree, like Cygnus does) they were frustratingly slow. Mike
|
|
Haertel suggested adding site-specific initialization scripts. People
|
|
distributing software that had to unpack on MS-DOS asked for a way to
|
|
override the @file{.in} extension on the file names, which produced file
|
|
names like @file{config.h.in} containing two dots. Jim Avera did an
|
|
extensive examination of the problems with quoting in @code{AC_DEFINE}
|
|
and @code{AC_SUBST}; his insights led to significant improvements.
|
|
Richard Stallman asked that compiler output be sent to @file{config.log}
|
|
instead of @file{/dev/null}, to help people debug the Emacs
|
|
@command{configure} script.
|
|
|
|
I made some other changes because of my dissatisfaction with the quality
|
|
of the program. I made the messages showing results of the checks less
|
|
ambiguous, always printing a result. I regularized the names of the
|
|
macros and cleaned up coding style inconsistencies. I added some
|
|
auxiliary utilities that I had developed to help convert source code
|
|
packages to use Autoconf. With the help of François Pinard, I made
|
|
the macros not interrupt each others' messages. (That feature revealed
|
|
some performance bottlenecks in GNU M4, which he hastily
|
|
corrected!) I reorganized the documentation around problems people want
|
|
to solve. And I began a test suite, because experience had shown that
|
|
Autoconf has a pronounced tendency to regress when we change it.
|
|
|
|
Again, several alpha testers gave invaluable feedback, especially
|
|
François Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn,
|
|
and Mark Eichin.
|
|
|
|
Finally, version 2.0 was ready. And there was much rejoicing. (And I
|
|
have free time again. I think. Yeah, right.)
|
|
|
|
|
|
@c ========================================================== Appendices
|
|
|
|
|
|
@node GNU Free Documentation License
|
|
@appendix GNU Free Documentation License
|
|
|
|
@include fdl.texi
|
|
|
|
@node Indices
|
|
@appendix Indices
|
|
|
|
@menu
|
|
* Environment Variable Index:: Index of environment variables used
|
|
* Output Variable Index:: Index of variables set in output files
|
|
* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
|
|
* Cache Variable Index:: Index of documented cache variables
|
|
* Autoconf Macro Index:: Index of Autoconf macros
|
|
* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
|
|
* Autotest Macro Index:: Index of Autotest macros
|
|
* Program & Function Index:: Index of those with portability problems
|
|
* Concept Index:: General index
|
|
@end menu
|
|
|
|
@node Environment Variable Index
|
|
@appendixsec Environment Variable Index
|
|
|
|
This is an alphabetical list of the environment variables that might
|
|
influence Autoconf checks.
|
|
|
|
@printindex ev
|
|
|
|
@node Output Variable Index
|
|
@appendixsec Output Variable Index
|
|
|
|
This is an alphabetical list of the variables that Autoconf can
|
|
substitute into files that it creates, typically one or more
|
|
makefiles. @xref{Setting Output Variables}, for more information
|
|
on how this is done.
|
|
|
|
@printindex ov
|
|
|
|
@node Preprocessor Symbol Index
|
|
@appendixsec Preprocessor Symbol Index
|
|
|
|
This is an alphabetical list of the C preprocessor symbols that the
|
|
Autoconf macros define. To work with Autoconf, C source code needs to
|
|
use these names in @code{#if} or @code{#ifdef} directives.
|
|
|
|
@printindex cv
|
|
|
|
@node Cache Variable Index
|
|
@appendixsec Cache Variable Index
|
|
|
|
This is an alphabetical list of documented cache variables used
|
|
by macros defined in Autoconf. Autoconf macros may use additional cache
|
|
variables internally.
|
|
@ifset shortindexflag
|
|
To make the list easier to use, the variables are listed without their
|
|
preceding @samp{ac_cv_}.
|
|
@end ifset
|
|
|
|
@printindex CA
|
|
|
|
@node Autoconf Macro Index
|
|
@appendixsec Autoconf Macro Index
|
|
|
|
This is an alphabetical list of the Autoconf macros.
|
|
@ifset shortindexflag
|
|
To make the list easier to use, the macros are listed without their
|
|
preceding @samp{AC_}.
|
|
@end ifset
|
|
|
|
@printindex AC
|
|
|
|
@node M4 Macro Index
|
|
@appendixsec M4 Macro Index
|
|
|
|
This is an alphabetical list of the M4, M4sugar, and M4sh macros.
|
|
@ifset shortindexflag
|
|
To make the list easier to use, the macros are listed without their
|
|
preceding @samp{m4_} or @samp{AS_}. The prefix is @samp{m4_} for
|
|
all-lowercase macro names and @samp{AS_} for all-uppercase macro
|
|
names.
|
|
@end ifset
|
|
|
|
@printindex MS
|
|
|
|
@node Autotest Macro Index
|
|
@appendixsec Autotest Macro Index
|
|
|
|
This is an alphabetical list of the Autotest macros.
|
|
@ifset shortindexflag
|
|
To make the list easier to use, the macros are listed without their
|
|
preceding @samp{AT_}.
|
|
@end ifset
|
|
|
|
@printindex AT
|
|
|
|
@node Program & Function Index
|
|
@appendixsec Program and Function Index
|
|
|
|
This is an alphabetical list of the programs and functions whose
|
|
portability is discussed in this document.
|
|
|
|
@printindex pr
|
|
|
|
@node Concept Index
|
|
@appendixsec Concept Index
|
|
|
|
This is an alphabetical list of the files, tools, and concepts
|
|
introduced in this document.
|
|
|
|
@printindex cp
|
|
|
|
@bye
|
|
|
|
@c LocalWords: texinfo setfilename autoconf texi settitle setchapternewpage
|
|
@c LocalWords: setcontentsaftertitlepage finalout ARG ovar varname dvar acx
|
|
@c LocalWords: makeinfo dvi defcodeindex ev ov CPP cv Autotest mv defindex fn
|
|
@c LocalWords: shortindexflag iftex ifset acindex ACindex ifclear ahindex fu
|
|
@c LocalWords: asindex MSindex atindex ATindex auindex hdrindex prindex FIXME
|
|
@c LocalWords: msindex alloca fnindex Aaarg indices FSF's dircategory ifnames
|
|
@c LocalWords: direntry autoscan autoreconf autoheader autoupdate config FDs
|
|
@c LocalWords: testsuite titlepage Elliston Demaille vskip filll ifnottex hmm
|
|
@c LocalWords: insertcopying Autoconf's detailmenu Automake Libtool POSIX ois
|
|
@c LocalWords: Systemology Checkpointing Changequote INTERCAL changequote dfn
|
|
@c LocalWords: Quadrigraphs builtins Shellology acconfig Bugward LIBOBJ Imake
|
|
@c LocalWords: LIBOBJS IFELSE cindex flushright Pinard Metaconfig uref Simons
|
|
@c LocalWords: distclean uninstall noindent versioning Tromey dir vr
|
|
@c LocalWords: SAMS samp aclocal acsite underquoted emph itemx prepend SUBST
|
|
@c LocalWords: evindex automake Gettext autopoint gettext symlink libtoolize
|
|
@c LocalWords: defmac INIT tarname ovindex cvindex BUGREPORT PREREQ asis PROG
|
|
@c LocalWords: SRCDIR srcdir globbing afterwards cmds foos fooo foooo init cd
|
|
@c LocalWords: builddir timestamp src Imakefile chmod defvar CFLAGS CPPFLAGS
|
|
@c LocalWords: CXXFLAGS DEFS DHAVE defvarx FCFLAGS FFLAGS LDFLAGS bindir GCC
|
|
@c LocalWords: datadir datarootdir docdir dvidir htmldir libdir ifnothtml kbd
|
|
@c LocalWords: includedir infodir libexecdir localedir localstatedir mandir
|
|
@c LocalWords: oldincludedir pdfdir PDF psdir PostScript sbindir sysconfdir
|
|
@c LocalWords: sharedstatedir DDATADIR sed tmp pkgdatadir VPATH conf unistd
|
|
@c LocalWords: undef endif builtin FUNCS ifndef STACKSEG getb GETB YMP fubar
|
|
@c LocalWords: PRE dest SUBDIRS subdirs fi struct STDC stdlib stddef INTTYPES
|
|
@c LocalWords: inttypes STDINT stdint AWK AIX Solaris NeXT env EGREP FGREP yy
|
|
@c LocalWords: LEXLIB YYTEXT lfl nonportable Automake's LN RANLIB byacc INETD
|
|
@c LocalWords: inetd prog PROGS progs ranlib lmp lXt lX nsl gethostbyname UX
|
|
@c LocalWords: isinf isnan glibc IRIX sunmath lm lsunmath pre sizeof
|
|
@c LocalWords: ld inline malloc putenv setenv FreeBSD realloc SunOS MinGW
|
|
@c LocalWords: snprintf vsnprintf sprintf vsprintf sscanf gcc strerror ifdef
|
|
@c LocalWords: strnlen sysconf PAGESIZE unsetenv va fallback memcpy dst FUNC
|
|
@c LocalWords: PowerPC GNUC libPW pragma Olibcalls CHOWN chown CLOSEDIR VFORK
|
|
@c LocalWords: closedir FNMATCH fnmatch vfork FSEEKO LARGEFILE fseeko SVR sc
|
|
@c LocalWords: largefile GETGROUPS getgroups GETLOADAVG DGUX UMAX NLIST KMEM
|
|
@c LocalWords: SETGID getloadavg nlist GETMNTENT irix acxindex autom
|
|
@c LocalWords: getmntent UnixWare GETPGRP getpgid getpgrp POSIX's pid LSTAT
|
|
@c LocalWords: lstat rpl MEMCMP memcmp OpenStep MBRTOWC mbrtowc MKTIME mktime
|
|
@c LocalWords: localtime MMAP mmap OBSTACK obstack obstacks ARGTYPES timeval
|
|
@c LocalWords: SETPGRP setpgrp defmacx Hurd SETVBUF setvbuf STRCOLL strcoll
|
|
@c LocalWords: STRTOD strtod DECL STRFTIME strftime UTIME utime VPRINTF
|
|
@c LocalWords: DOPRNT vprintf doprnt sp unfixable LIBSOURCE LIBSOURCES Eggert
|
|
@c LocalWords: linux netinet ia Tru XFree DIRENT NDIR dirent ndir multitable
|
|
@c LocalWords: NAMLEN strlen namlen MKDEV SYSMACROS makedev RESOLV resolv DNS
|
|
@c LocalWords: inet structs NAMESER arpa NETDB netdb UTekV UTS GCC's kB
|
|
@c LocalWords: STDBOOL BOOL stdbool cplusplus bool Bool stdarg tm te
|
|
@c LocalWords: ctype strchr strrchr rindex bcopy memmove memchr WEXITSTATUS
|
|
@c LocalWords: WIFEXITED TIOCGWINSZ GWINSZ termios preprocess preprocessable
|
|
@c LocalWords: DECLS strdup calloc BLKSIZE blksize RDEV rdev TZNAME tzname pw
|
|
@c LocalWords: passwd gecos pwd MBSTATE mbstate wchar RETSIGTYPE hup UID uid
|
|
@c LocalWords: gid ptrdiff uintmax EXEEXT OBJEXT Ae conftest AXP str
|
|
@c LocalWords: ALIGNOF WERROR Werror cpp HP's WorkShop egcs un fied stdc CXX
|
|
@c LocalWords: varargs BIGENDIAN Endianness SPARC endianness grep'ed CONST FC
|
|
@c LocalWords: const STRINGIZE stringizing PARAMS unprotoize protos KCC cxx
|
|
@c LocalWords: xlC aCC CXXCPP FREEFORM xlf FLIBS FCLIBS ish SRCEXT XTRA LFS
|
|
@c LocalWords: ISC lcposix MINIX Minix conditionalized inlines hw dD confdefs
|
|
@c LocalWords: fputs stdout PREPROC ar UFS HFS QNX realtime fstype STATVFS se
|
|
@c LocalWords: statvfs STATFS statfs func machfile hdr lelf raboof DEFUN GTK
|
|
@c LocalWords: GTKMM Grmph ified ine defn baz EOF qar Ahhh changecom algol io
|
|
@c LocalWords: changeword quadrigraphs quadrigraph dnl SGI atoi overquoting
|
|
@c LocalWords: Aas Wcross sep args namespace undefine bpatsubst popdef dquote
|
|
@c LocalWords: bregexp Overquote overquotation meisch maisch meische maische
|
|
@c LocalWords: miscian DIRNAME dirname MKDIR CATFILE XMKMF TRAVOLTA celsius
|
|
@c LocalWords: EMX emxos Emacsen Korn DYNIX subshell posix Ksh ksh Pdksh Zsh
|
|
@c LocalWords: pdksh zsh Allbery Lipe Kubota UWS zorglub stderr eval esac lfn
|
|
@c LocalWords: drivespec POSIXy DJGPP doschk prettybird LPT pfew Zsh's yu yaa
|
|
@c LocalWords: yM uM aM firebird IP subdir misparses ok Unpatched abc bc zA
|
|
@c LocalWords: CDPATH DUALCASE LINENO prepass Subshells lineno NULLCMD cmp wc
|
|
@c LocalWords: MAILPATH scanset arg NetBSD Almquist printf expr cp pR
|
|
@c LocalWords: Oliva awk Aaaaarg cmd regex xfoo GNV OpenVMS VM url fc
|
|
@c LocalWords: sparc Proulx nbar nfoo maxdepth acdilrtu TWG mc ing FP
|
|
@c LocalWords: mkdir exe uname OpenBSD Fileutils mktemp umask TMPDIR guid os
|
|
@c LocalWords: fooXXXXXX Unicos utimes hpux hppa unescaped SUBST'ed
|
|
@c LocalWords: pmake DOS's gmake ifoo DESTDIR autoconfiscated pc coff mips gg
|
|
@c LocalWords: cpu wildcards rpcc rdtsc powerpc readline
|
|
@c LocalWords: withval vxworks gless localcache usr LOFF loff CYGWIN Cygwin
|
|
@c LocalWords: cygwin SIGLIST siglist SYSNDIR SYSDIR ptx lseq rusage elif MSC
|
|
@c LocalWords: lfoo POUNDBANG lsun NIS getpwnam SYSCALLS RSH INTL lintl aix
|
|
@c LocalWords: intl lx ldir syslog bsd EPI toolchain netbsd objext de KNR nn
|
|
@c LocalWords: fication LTLIBOBJS Wdiff TESTDIR atconfig atlocal akim XFAIL
|
|
@c LocalWords: ChangeLog prepended errexit smallexample TESTSUITEFLAGS GPL er
|
|
@c LocalWords: installcheck autotest indir Pixley Bothner Eichin Kerberos adl
|
|
@c LocalWords: DISTCLEANFILES preprocessor's fileutils Stallman Murphey Stenn
|
|
@c LocalWords: Manfredi Autoconfig TCL FSP david zuhn Blandy MACRODIR Raeburn
|
|
@c LocalWords: autoconfiscate Savoye Haertel Avera Meyering fdl appendixsec
|
|
@c LocalWords: printindex american LIBOBJDIR LibdirTest ERLCFLAGS OBJCFLAGS
|
|
@c LocalWords: VER Gnulib online xyes strcpy TYPEOF typeof OBJC objcc objc ln
|
|
@c LocalWords: GOBJC OTP ERLC erl valloc decr dumpdef errprint incr
|
|
@c LocalWords: esyscmd len maketemp pushdef substr syscmd sysval translit txt
|
|
@c LocalWords: sinclude foreach myvar tolower toupper uniq BASENAME STDIN
|
|
@c LocalWords: Dynix basename aname cname macroexpands xno xcheck iso
|
|
@c LocalWords: LIBREADLINE lreadline lncurses libreadline vrindex SYS
|
|
@c LocalWords: syncodeindex define'd caindex CAindex MacKenzie DIRS
|
|
@c LocalWords: Runtime runtime Submakes submakes MAKEFLAGS whitespace
|
|
@c LocalWords: Timestamps Unportability Canonicalizing stdckdint dirN
|
|
@c LocalWords: acinclude AMFLAGS LIBS OBJCXXFLAGS GOFLAGS runstatedir
|
|
@c LocalWords: metacharacter EXPENSIVEP errno setjmp wctype sys mawk
|
|
@c LocalWords: nawk ggrep egrep gegrep fgrep gfgrep LEX lex yytext nm
|
|
@c LocalWords: yywrap xflex lexyy YFLAGS yacc divnum libs fuindex ffs
|
|
@c LocalWords: environ sigaction extern ftello nonnull STRTOLD LLONG
|
|
@c LocalWords: strtold vfprintf ULLONG strcasecmp strncasecmp MSVC th
|
|
@c LocalWords: NDEBUG INO libc ISDIR ISREG Tektronix Amdahl ino
|
|
@c LocalWords: typedef pxref fileblocks submembers INTMAX intmax UINT
|
|
@c LocalWords: INTPTR intptr SSIZE ssize uint UINTPTR uintptr OPENMP
|
|
@c LocalWords: openmp OpenMP omp Alignas Alignof Noreturn UTF vals gl
|
|
@c LocalWords: offsetof VARARRAYS VLA CCC stdcxx nullptr
|
|
@c LocalWords: constexpr decltype unicode fstreams iostreams iomanip
|
|
@c LocalWords: stringstreams GXX OBJCPP OBJCXX objcxx GOBJCXX erlc tx
|
|
@c LocalWords: OBJCXXCPP FIXEDFORM GFC argc argv shellvar fpp MODEXT
|
|
@c LocalWords: freeform fixedform MODINC MODOUT gccgo GOC xmkmf fseek
|
|
@c LocalWords: interpval ftell Interix macOS PTHREAD NonStop XOPEN xc
|
|
@c LocalWords: IEC ATTRIBS BFP DFP O'Donell Sebor ERTS Erlang's erts
|
|
@c LocalWords: erlang Wundef scalable USG NOTMAKE DOUCH
|
|
@c LocalWords: IVE changesyntax ifnotinfo oline num cfg debugfile cdr
|
|
@c LocalWords: debugmode traceoff traceon patsubst dumpdefs ifelse aa
|
|
@c LocalWords: mkstemp undivert lifo errprintn BINSH sanitization bcd
|
|
@c LocalWords: cleardivert bmatch bpatsubsts subst cond nblank ifval
|
|
@c LocalWords: ifblank ifnblank ifvaln fputc fgetc argn mapall dvarv
|
|
@c LocalWords: shiftn abcd elt noquote mkargs joinall SHA prereq dup
|
|
@c LocalWords: listc setb seta ARITH HNUM xcurly xoccupied
|
|
@c LocalWords: TESTA TESTB TESTC hoc xpg xxyzzyz dtksh nosuch fifos
|
|
@c LocalWords: fifo Stardent sig WIF WIFSIGNALED SIGQUIT tty perl ret
|
|
@c LocalWords: SIGINT NUL SFN PRN aeiou MSYS SIGTERM xhi arith UWIN
|
|
@c LocalWords: CLICOLOR FPATH POSIXLY Shellshock CVE doit ec ci
|
|
@c LocalWords: notreached cim nc ACL faccessat Alexandre getline sqrt
|
|
@c LocalWords: CONVFMT FS OFMT CDS chgrp futimens utimensat oo esc od
|
|
@c LocalWords: ownerships mape readdir mkfifo mknod testsuites XSI rf
|
|
@c LocalWords: bcdox hexdump filelist rmdir flushleft busybox nl HAZy
|
|
@c LocalWords: ABCDEFGHIJKLMNOPQRSTUVWXYZ Fantazy FAntAZy adc unix xb
|
|
@c LocalWords: SUBMAKEFLAGS ehBc ehB hBc hvB dmake hostname nlinit xf
|
|
@c LocalWords: DCOMMENT bart pathnames ifhtml randx
|
|
@c LocalWords: sumc hic ic fwrapv ftrapv SIGFPE memset fmudflap ctime
|
|
@c LocalWords: asctime lvalues lvalue Multithreaded decstation gdb na
|
|
@c LocalWords: enableval lesskey FHS superset waitpid libfoo cposix
|
|
@c LocalWords: mem RESTARTABLE bzero DejaGNU EUNIT subfile optarg ive
|
|
@c LocalWords: nolog expout experr erlflags EUnit testme eunit myprog
|
|
@c LocalWords: configmake vx bashdb tvtwm questers UUCP McGrath
|
|
@c LocalWords: ispell
|
|
@c Local Variables:
|
|
@c coding: utf-8
|
|
@c fill-column: 72
|
|
@c ispell-local-dictionary: "american"
|
|
@c indent-tabs-mode: nil
|
|
@c whitespace-check-buffer-indent: nil
|
|
@c End:
|