| \input texinfo @c -*-texinfo-*- | |
| @comment ======================================================== | |
| @comment %**start of header | |
| @setfilename autoconf.info | |
| @include version.texi | |
| @settitle Autoconf | |
| @documentencoding UTF-8 | |
| @set txicodequoteundirected | |
| @set txicodequotebacktick | |
| @set txidefnamenospace | |
| @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--2026 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 | |
| * Algol 68 Compiler:: Likewise | |
| Writing Tests | |
| * Language Choice:: Selecting which language to use for testing | |
| * Writing Test Programs:: Forging source files for compilers | |
| * Running the Preprocessor:: Detecting preprocessor symbols | |
| * Running the Compiler:: Detecting language or header features | |
| * Running the Linker:: Detecting library features | |
| * Runtime:: Testing for runtime features | |
| * Multiple Cases:: Tests for several possible values | |
| Writing Test Programs | |
| * Guidelines:: General rules for writing test programs | |
| * Test Functions:: Avoiding pitfalls in test programs | |
| * Generating Sources:: Source program boilerplate | |
| Results of Tests | |
| * Defining Symbols:: Defining C preprocessor symbols | |
| * Setting Output Variables:: Replacing variables in output files | |
| * Special Chars in Variables:: Characters to beware of in variables | |
| * Caching Results:: Speeding up subsequent @command{configure} runs | |
| * Printing Messages:: Notifying @command{configure} users | |
| Caching Results | |
| * Cache Variable Names:: Shell variables used in caches | |
| * Cache Files:: Files @command{configure} uses for caching | |
| * Cache Checkpointing:: Loading and saving the cache file | |
| Programming in M4 | |
| * M4 Quotation:: Protecting macros from unwanted expansion | |
| * Using autom4te:: The Autoconf executables backbone | |
| * Programming in M4sugar:: Convenient pure M4 macros | |
| * Debugging via autom4te:: Figuring out what M4 was doing | |
| M4 Quotation | |
| * Active Characters:: Characters that change the behavior of M4 | |
| * One Macro Call:: Quotation and one macro call | |
| * Quoting and Parameters:: M4 vs. shell parameters | |
| * Quotation and Nested Macros:: Macros calling macros | |
| * Changequote is Evil:: Worse than INTERCAL: M4 + changequote | |
| * Quadrigraphs:: Another way to escape special characters | |
| * Balancing Parentheses:: Dealing with unbalanced parentheses | |
| * Quotation Rule Of Thumb:: One parenthesis, one quote | |
| Using @command{autom4te} | |
| * autom4te Invocation:: A GNU M4 wrapper | |
| * Customizing autom4te:: Customizing the Autoconf package | |
| Programming in M4sugar | |
| * Redefined M4 Macros:: M4 builtins changed in M4sugar | |
| * Diagnostic Macros:: Diagnostic messages from M4sugar | |
| * Diversion support:: Diversions in M4sugar | |
| * Conditional constructs:: Conditions in M4 | |
| * Looping constructs:: Iteration in M4 | |
| * Evaluation Macros:: More quotation and evaluation control | |
| * Text processing Macros:: String manipulation in M4 | |
| * Number processing Macros:: Arithmetic computation in M4 | |
| * Set manipulation Macros:: Set manipulation in M4 | |
| * Forbidden Patterns:: Catching unexpanded macros | |
| Programming in M4sh | |
| * Common Shell Constructs:: Portability layer for common shell constructs | |
| * Polymorphic Variables:: Support for indirect variable names | |
| * Initialization Macros:: Macros to establish a sane shell environment | |
| * File Descriptor Macros:: File descriptor macros for input and output | |
| Writing Autoconf Macros | |
| * Macro Definitions:: Basic format of an Autoconf macro | |
| * Macro Names:: What to call your new macros | |
| * Dependencies Between Macros:: What to do when macros depend on other macros | |
| * Obsoleting Macros:: Warning about old ways of doing things | |
| * Coding Style:: Writing Autoconf macros à la Autoconf | |
| Dependencies Between Macros | |
| * Prerequisite Macros:: Ensuring required information | |
| * Suggested Ordering:: Warning about possible ordering problems | |
| * One-Shot Macros:: Ensuring a macro is called only once | |
| Portable Shell Programming | |
| * Systemology:: A zoology of operating systems | |
| * Shellology:: A zoology of shells | |
| * Invoking the Shell:: Invoking the shell as a command | |
| * Here-Documents:: Quirks and tricks | |
| * File Descriptors:: FDs and redirections | |
| * Signal Handling:: Shells, signals, and headaches | |
| * File System Conventions:: File names | |
| * Shell Pattern Matching:: Pattern matching | |
| * Shell Substitutions:: Variable and command expansions | |
| * Assignments:: Varying side effects of assignments | |
| * Parentheses:: Parentheses in shell scripts | |
| * Special Shell Variables:: Variables you should not change | |
| * Shell Functions:: What to look out for if you use them | |
| * Limitations of Builtins:: Portable use of not so portable /bin/sh | |
| * Limitations of Usual Tools:: Portable use of portable tools | |
| Portable Make Programming | |
| * $< in Ordinary Make Rules:: $< in ordinary rules | |
| * Failure in Make Rules:: Failing portably in rules | |
| * Command Line Prefixes:: What's at the start of makefile command lines | |
| * Special Chars in Names:: Special characters in macro names | |
| * Backslash-Newline-Empty:: Empty lines after backslash-newline | |
| * Backslash-Newline Comments:: Spanning comments across line boundaries | |
| * Macros and Submakes:: @code{make macro=value} and submakes | |
| * The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues | |
| * The Make Macro SHELL:: @code{$(SHELL)} portability issues | |
| * Parallel Make:: Parallel @command{make} quirks | |
| * Comments in Make Rules:: Other problems with Make comments | |
| * Newlines in Make Rules:: Using literal newlines in rules | |
| * Comments in Make Macros:: Other problems with Make comments in macros | |
| * Trailing whitespace in Make Macros:: Macro substitution problems | |
| * Command-line Macros and whitespace:: Whitespace trimming of values | |
| * obj/ and Make:: Don't name a subdirectory @file{obj} | |
| * make -k Status:: Exit status of @samp{make -k} | |
| * VPATH and Make:: @code{VPATH} woes | |
| * Single Suffix Rules:: Single suffix rules and separated dependencies | |
| * Timestamps and Make:: Sub-second timestamp resolution | |
| @code{VPATH} and Make | |
| * Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts | |
| * VPATH and Double-colon:: Problems with @samp{::} on ancient hosts | |
| * $< in Explicit Rules:: @code{$<} does not work in ordinary rules | |
| * Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris | |
| * Make Target Lookup:: More details about @code{VPATH} lookup | |
| Portable C and C++ Programming | |
| * Varieties of Unportability:: How to make your programs unportable | |
| * Integer Overflow:: When integers get too large | |
| * Preprocessor Arithmetic:: @code{#if} expression problems | |
| * Null Pointers:: Properties of null pointers | |
| * Buffer Overruns:: Subscript errors and the like | |
| * Volatile Objects:: @code{volatile} and signals | |
| * Floating Point Portability:: Portable floating-point arithmetic | |
| * Exiting Portably:: Exiting and the exit status | |
| Integer Overflow | |
| * Integer Overflow Basics:: Why integer overflow is a problem | |
| * Signed Overflow Examples:: Examples of code assuming wraparound | |
| * Optimization and Wraparound:: Optimizations that break uses of wraparound | |
| * Signed Overflow Advice:: Practical advice for signed overflow issues | |
| * Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} | |
| Manual Configuration | |
| * Specifying Target Triplets:: Specifying target triplets | |
| * Canonicalizing:: Getting the canonical system type | |
| * Using System Type:: What to do with the system type | |
| Site Configuration | |
| * Help Formatting:: Customizing @samp{configure --help} | |
| * External Software:: Working with other optional software | |
| * Package Options:: Selecting optional features | |
| * Pretty Help Strings:: Formatting help string | |
| * Option Checking:: Controlling checking of @command{configure} options | |
| * Site Details:: Configuring site details | |
| * Transforming Names:: Changing program names when installing | |
| * Site Defaults:: Giving @command{configure} local defaults | |
| Transforming Program Names When Installing | |
| * Transformation Options:: @command{configure} options to transform names | |
| * Transformation Examples:: Sample uses of transforming names | |
| * Transformation Rules:: Makefile uses of transforming names | |
| Running @command{configure} Scripts | |
| * Basic Installation:: Instructions for typical cases | |
| * Installation Prerequisites:: What you need to install | |
| * Compilers and Options:: Selecting compilers and optimization | |
| * Multiple Architectures:: Compiling for multiple architectures at once | |
| * Installation Names:: Installing in different directories | |
| * Optional Features:: Selecting optional features | |
| * System Types:: Specifying a system type | |
| * Sharing Defaults:: Setting site-wide defaults for @command{configure} | |
| * Defining Variables:: Specifying the compiler etc. | |
| * configure Invocation:: Changing how @command{configure} runs | |
| Obsolete Constructs | |
| * Obsolete config.status Use:: Obsolete convention for @command{config.status} | |
| * acconfig Header:: Additional entries in @file{config.h.in} | |
| * autoupdate Invocation:: Automatic update of @file{configure.ac} | |
| * Obsolete Macros:: Backward compatibility macros | |
| * Autoconf 1:: Tips for upgrading your files | |
| * Autoconf 2.13:: Some fresher tips | |
| Upgrading From Version 1 | |
| * Changed File Names:: Files you might rename | |
| * Changed Makefiles:: New things to put in @file{Makefile.in} | |
| * Changed Macros:: Macro calls you might replace | |
| * Changed Results:: Changes in how to check test results | |
| * Changed Macro Writing:: Better ways to write your own macros | |
| Upgrading From Version 2.13 | |
| * Changed Quotation:: Broken code which used to work | |
| * New Macros:: Interaction with foreign macros | |
| * Hosts and Cross-Compilation:: Bugward compatibility kludges | |
| * AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token | |
| * AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources | |
| Generating Test Suites with Autotest | |
| * Using an Autotest Test Suite:: Autotest and the user | |
| * Writing Testsuites:: Autotest macros | |
| * testsuite Invocation:: Running @command{testsuite} scripts | |
| * Making testsuite Scripts:: Using autom4te to create @command{testsuite} | |
| Using an Autotest Test Suite | |
| * testsuite Scripts:: The concepts of Autotest | |
| * Autotest Logs:: Their contents | |
| Frequent Autoconf Questions, with answers | |
| * Distributing:: Distributing @command{configure} scripts | |
| * Why GNU M4:: Why not use the standard M4? | |
| * Bootstrapping:: Autoconf and GNU M4 require each other? | |
| * Why Not Imake:: Why GNU uses @command{configure} instead of Imake | |
| * Defining Directories:: Passing @code{datadir} to program | |
| * Autom4te Cache:: What is it? Can I remove it? | |
| * Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree | |
| * Expanded Before Required:: Expanded Before Required | |
| * Debugging:: Debugging @command{configure} scripts | |
| History of Autoconf | |
| * Genesis:: Prehistory and naming of @command{configure} | |
| * Exodus:: The plagues of M4 and Perl | |
| * Leviticus:: The priestly code of portability arrives | |
| * Numbers:: Growth and contributors | |
| * Deuteronomy:: Approaching the promises of easy configuration | |
| Indices | |
| * Environment Variable Index:: Index of environment variables used | |
| * Output Variable Index:: Index of variables set in output files | |
| * Preprocessor Symbol Index:: Index of C preprocessor symbols defined | |
| * Cache Variable Index:: Index of documented cache variables | |
| * Autoconf Macro Index:: Index of Autoconf macros | |
| * M4 Macro Index:: Index of M4, M4sugar, and M4sh macros | |
| * Autotest Macro Index:: Index of Autotest macros | |
| * Program & Function Index:: Index of those with portability problems | |
| * Concept Index:: General index | |
| @end detailmenu | |
| @end menu | |
| @c ============================================================= Introduction. | |
| @node Introduction | |
| @chapter Introduction | |
| @cindex Introduction | |
| @flushright | |
| A physicist, an engineer, and a computer scientist were discussing the | |
| nature of God. ``Surely a Physicist,'' said the physicist, ``because | |
| early in the Creation, God made Light; and you know, Maxwell's | |
| equations, the dual nature of electromagnetic waves, the relativistic | |
| consequences@enddots{}'' ``An Engineer!,'' said the engineer, ``because | |
| before making Light, God split the Chaos into Land and Water; it takes | |
| a hell of an engineer to handle that big amount of mud, and orderly | |
| separation of solids from liquids@enddots{}'' The computer scientist | |
| shouted: ``And the Chaos, where do you think it was coming from, hmm?'' | |
| ---Anonymous | |
| @end flushright | |
| @c (via François Pinard) | |
| Autoconf is a tool for producing shell scripts that automatically | |
| configure software source code packages to adapt to many kinds of | |
| POSIX-like systems. The configuration scripts produced by Autoconf | |
| are independent of Autoconf when they are run, so their users do not | |
| need to have Autoconf. | |
| The configuration scripts produced by Autoconf require no manual user | |
| intervention when run; they do not normally even need an argument | |
| specifying the system type. Instead, they individually test for the | |
| presence of each feature that the software package they are for might need. | |
| (Before each check, they print a one-line message stating what they are | |
| checking for, so the user doesn't get too bored while waiting for the | |
| script to finish.) As a result, they deal well with systems that are | |
| hybrids or customized from the more common POSIX variants. There is | |
| no need to maintain files that list the features supported by each | |
| release of each variant of POSIX. | |
| For each software package that Autoconf is used with, it creates a | |
| configuration script from a template file that lists the system features | |
| that the package needs or can use. After the shell code to recognize | |
| and respond to a system feature has been written, Autoconf allows it to | |
| be shared by many software packages that can use (or need) that feature. | |
| If it later turns out that the shell code needs adjustment for some | |
| reason, it needs to be changed in only one place; all of the | |
| configuration scripts can be regenerated automatically to take advantage | |
| of the updated code. | |
| @c "Those who do not understand Unix are condemned to reinvent it, poorly." | |
| @c --Henry Spencer, 1987 (see https://en.wikipedia.org/wiki/Unix_philosophy) | |
| Those who do not understand Autoconf are condemned to reinvent it, poorly. | |
| The primary goal of Autoconf is making the @emph{user's} life easier; | |
| making the @emph{maintainer's} life easier is only a secondary goal. | |
| Put another way, the primary goal is not to make the generation of | |
| @file{configure} automatic for package maintainers (although patches | |
| along that front are welcome, since package maintainers form the user | |
| base of Autoconf); rather, the goal is to make @file{configure} | |
| painless, portable, and predictable for the end user of each | |
| @dfn{autoconfiscated} package. And to this degree, Autoconf is highly | |
| successful at its goal---most complaints to the Autoconf list are | |
| about difficulties in writing Autoconf input, and not in the behavior of | |
| the resulting @file{configure}. Even packages that don't use Autoconf | |
| will generally provide a @file{configure} script, and the most common | |
| complaint about these alternative home-grown scripts is that they fail | |
| to meet one or more of the GNU Coding Standards (@pxref{Configuration, , , | |
| standards, The GNU Coding Standards}) that users | |
| have come to expect from Autoconf-generated @file{configure} scripts. | |
| The Metaconfig package is similar in purpose to Autoconf, but the | |
| scripts it produces require manual user intervention, which is quite | |
| inconvenient when configuring large source trees. Unlike Metaconfig | |
| scripts, Autoconf scripts can support cross-compiling, if some care is | |
| taken in writing them. | |
| Autoconf does not solve all problems related to making portable | |
| software packages---for a more complete solution, it should be used in | |
| concert with other GNU build tools like Automake and | |
| Libtool. These other tools take on jobs like the creation of a | |
| portable, recursive makefile with all of the standard targets, | |
| linking of shared libraries, and so on. @xref{The GNU Build System}, | |
| for more information. | |
| Autoconf imposes some restrictions on the names of macros used with | |
| @code{#if} in C programs (@pxref{Preprocessor Symbol Index}). | |
| Autoconf requires GNU M4 version 1.4.8 or later in order to | |
| generate the scripts. It uses features that some versions of M4, | |
| including GNU M4 1.3, do not have. Autoconf works better | |
| with GNU M4 version 1.4.16 or later, though this is not | |
| required. | |
| @xref{Autoconf 1}, for information about upgrading from version 1. | |
| @xref{History}, for the story of Autoconf's development. @xref{FAQ}, | |
| for answers to some common questions about Autoconf. | |
| See the @uref{https://@/www.gnu.org/@/software/@/autoconf/, | |
| Autoconf web page} for up-to-date information, details on the mailing | |
| lists, pointers to a list of known bugs, etc. | |
| Mail suggestions to @email{autoconf@@gnu.org, the Autoconf mailing | |
| list}. Past suggestions are | |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf/, archived}. | |
| Mail bug reports to @email{bug-autoconf@@gnu.org, the | |
| Autoconf Bugs mailing list}. Past bug reports are | |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/bug-autoconf/, archived}. | |
| If possible, first check that your bug is | |
| not already solved in current development versions, and that it has not | |
| been reported yet. Be sure to include all the needed information and a | |
| short @file{configure.ac} that demonstrates the problem. | |
| Autoconf's development tree is accessible via @command{git}; see the | |
| @uref{https://@/savannah.gnu.org/@/projects/@/autoconf/, Autoconf | |
| Summary} for details, or view | |
| @uref{https://@/git.savannah.gnu.org/@/cgit/@/autoconf.git, the actual | |
| repository}. Patches relative to the current @command{git} version can | |
| be sent for review to the @email{autoconf-patches@@gnu.org, Autoconf | |
| Patches mailing list}, with discussion on prior patches | |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-@/patches/, | |
| archived}; and all commits are posted in the read-only | |
| @email{autoconf-commit@@gnu.org, Autoconf Commit mailing list}, which is | |
| also @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-commit/, | |
| archived}. | |
| Because of its mission, the Autoconf package itself | |
| includes only a set of often-used | |
| macros that have already demonstrated their usefulness. Nevertheless, | |
| if you wish to share your macros, or find existing ones, see the | |
| @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro | |
| Archive}, which is kindly run by @email{simons@@cryp.to, | |
| Peter Simons}. | |
| @c ================================================= The GNU Build System | |
| @node The GNU Build System | |
| @chapter The GNU Build System | |
| @cindex GNU build system | |
| Autoconf solves an important problem---reliable discovery of | |
| system-specific build and runtime information---but this is only one | |
| piece of the puzzle for the development of portable software. To this | |
| end, the GNU project has developed a suite of integrated | |
| utilities to finish the job Autoconf started: the GNU build | |
| system, whose most important components are Autoconf, Automake, and | |
| Libtool. In this chapter, we introduce you to those tools, point you | |
| to sources of more information, and try to convince you to use the | |
| entire GNU build system for your software. | |
| @menu | |
| * Automake:: Escaping makefile hell | |
| * Gnulib:: The GNU portability library | |
| * Libtool:: Building libraries portably | |
| * Pointers:: More info on the GNU build system | |
| @end menu | |
| @node Automake | |
| @section Automake | |
| The ubiquity of @command{make} means that a makefile is almost the | |
| only viable way to distribute automatic build rules for software, but | |
| one quickly runs into its numerous limitations. Its lack of | |
| support for automatic dependency tracking, recursive builds in | |
| subdirectories, reliable timestamps (e.g., for network file systems), and | |
| so on, mean that developers must painfully (and often incorrectly) | |
| reinvent the wheel for each project. Portability is non-trivial, thanks | |
| to the quirks of @command{make} on many systems. On top of all this is the | |
| manual labor required to implement the many standard targets that users | |
| have come to expect (@code{make install}, @code{make distclean}, | |
| @code{make uninstall}, etc.). Since you are, of course, using Autoconf, | |
| you also have to insert repetitive code in your @file{Makefile.in} to | |
| recognize @code{@@CC@@}, @code{@@CFLAGS@@}, and other substitutions | |
| provided by @command{configure}. Into this mess steps @dfn{Automake}. | |
| @cindex Automake | |
| Automake allows you to specify your build needs in a @file{Makefile.am} | |
| file with a vastly simpler and more powerful syntax than that of a plain | |
| makefile, and then generates a portable @file{Makefile.in} for | |
| use with Autoconf. For example, the @file{Makefile.am} to build and | |
| install a simple ``Hello world'' program might look like: | |
| @example | |
| bin_PROGRAMS = hello | |
| hello_SOURCES = hello.c | |
| @end example | |
| @noindent | |
| The resulting @file{Makefile.in} (~400 lines) automatically supports all | |
| the standard targets, the substitutions provided by Autoconf, automatic | |
| dependency tracking, @code{VPATH} building, and so on. @command{make} | |
| builds the @code{hello} program, and @code{make install} installs it | |
| in @file{/usr/local/bin} (or whatever prefix was given to | |
| @command{configure}, if not @file{/usr/local}). | |
| The benefits of Automake increase for larger packages (especially ones | |
| with subdirectories), but even for small programs the added convenience | |
| and portability can be substantial. And that's not all@enddots{} | |
| @node Gnulib | |
| @section Gnulib | |
| GNU software has a well-deserved reputation for running on | |
| many different types of systems. While our primary goal is to write | |
| software for the GNU system, many users and developers have | |
| been introduced to us through the systems that they were already using. | |
| @cindex Gnulib | |
| Gnulib is a central location for common GNU code, intended to | |
| be shared among free software packages. Its components are typically | |
| shared at the source level, rather than being a library that gets built, | |
| installed, and linked against. The idea is to copy files from Gnulib | |
| into your own source tree. There is no distribution tarball; developers | |
| should just grab source modules from the repository. The source files | |
| are available online, under various licenses, mostly GNU | |
| GPL or GNU LGPL. | |
| Gnulib modules typically contain C source code along with Autoconf | |
| macros used to configure the source code. For example, the Gnulib | |
| @code{stdckdint} module implements a @file{stdckdint.h} header that nearly | |
| conforms to C23, even on older hosts that lack @file{stdckdint.h}. | |
| This module contains a source file for the replacement header, along | |
| with an Autoconf macro that arranges to use the replacement header on | |
| older systems. | |
| For more information, consult the Gnulib website, | |
| @uref{https://@/www.gnu.org/@/software/@/gnulib/}. | |
| @node Libtool | |
| @section Libtool | |
| Often, one wants to build not only programs, but libraries, so that | |
| other programs can benefit from the fruits of your labor. Ideally, one | |
| would like to produce @emph{shared} (dynamically linked) libraries, | |
| which can be used by multiple programs without duplication on disk or in | |
| memory and can be updated independently of the linked programs. | |
| Producing shared libraries portably, however, is the stuff of | |
| nightmares---each system has its own incompatible tools, compiler flags, | |
| and magic incantations. Fortunately, GNU provides a solution: | |
| @dfn{Libtool}. | |
| @cindex Libtool | |
| Libtool handles all the requirements of building shared libraries for | |
| you, and at this time seems to be the @emph{only} way to do so with any | |
| portability. It also handles many other headaches, such as: the | |
| interaction of Make rules with the variable suffixes of | |
| shared libraries, linking reliably with shared libraries before they are | |
| installed by the superuser, and supplying a consistent versioning system | |
| (so that different versions of a library can be installed or upgraded | |
| without breaking binary compatibility). Although Libtool, like | |
| Autoconf, can be used without Automake, it is most simply utilized in | |
| conjunction with Automake---there, Libtool is used automatically | |
| whenever shared libraries are needed, and you need not know its syntax. | |
| @node Pointers | |
| @section Pointers | |
| Developers who are used to the simplicity of @command{make} for small | |
| projects on a single system might be daunted at the prospect of | |
| learning to use Automake and Autoconf. As your software is | |
| distributed to more and more users, however, you otherwise | |
| quickly find yourself putting lots of effort into reinventing the | |
| services that the GNU build tools provide, and making the | |
| same mistakes that they once made and overcame. (Besides, since | |
| you're already learning Autoconf, Automake is a piece of cake.) | |
| There are a number of places that you can go to for more information on | |
| the GNU build tools. | |
| @itemize @minus | |
| @item Web | |
| The project home pages for | |
| @uref{https://@/www@/.gnu@/.org/@/software/@/autoconf/, Autoconf}, | |
| @uref{https://@/www@/.gnu@/.org/@/software/@/automake/, Automake}, | |
| @uref{https://@/www@/.gnu@/.org/@/software/@/gnulib/, Gnulib}, and | |
| @uref{https://@/www@/.gnu@/.org/@/software/@/libtool/, Libtool}. | |
| @item Automake Manual | |
| @xref{Top, , Automake, automake, GNU Automake}, for more | |
| information on Automake. | |
| @item Books | |
| The book @cite{GNU Autoconf, Automake and | |
| Libtool}@footnote{@cite{GNU Autoconf, Automake and Libtool}, | |
| by G. V. Vaughan, B. Elliston, T. Tromey, and I. L. Taylor. SAMS (originally | |
| New Riders), 2000, ISBN 1578701902.} describes the complete GNU | |
| build environment. You can also find | |
| @uref{https://@/www.sourceware.org/@/autobook/, the entire book on-line}. | |
| @end itemize | |
| @c ================================================= Making configure Scripts. | |
| @node Making configure Scripts | |
| @chapter Making @command{configure} Scripts | |
| @cindex @file{aclocal.m4} | |
| @cindex @command{configure} | |
| The configuration scripts that Autoconf produces are by convention | |
| called @command{configure}. When run, @command{configure} creates several | |
| files, replacing configuration parameters in them with appropriate | |
| values. The files that @command{configure} creates are: | |
| @itemize @minus | |
| @item | |
| one or more @file{Makefile} files, usually one in each subdirectory of the | |
| package (@pxref{Makefile Substitutions}); | |
| @item | |
| optionally, a C header file, the name of which is configurable, | |
| containing @code{#define} directives (@pxref{Configuration Headers}); | |
| @item | |
| a shell script called @file{config.status} that, when run, recreates | |
| the files listed above (@pxref{config.status Invocation}); | |
| @item | |
| an optional shell script normally called @file{config.cache} | |
| (created when using @samp{configure --config-cache}) that | |
| saves the results of running many of the tests (@pxref{Cache Files}); | |
| @item | |
| a file called @file{config.log} containing any messages produced by | |
| compilers, to help debugging if @command{configure} makes a mistake. | |
| @end itemize | |
| @cindex @file{configure.ac} | |
| To create a @command{configure} script with Autoconf, you need | |
| to write an Autoconf input file @file{configure.ac} and run | |
| @command{autoconf} on it. If you write your own feature tests to | |
| supplement those that come with Autoconf, you might also write files | |
| called @file{aclocal.m4} and @file{acsite.m4}. If you use a C header | |
| file to contain @code{#define} directives, you might also run | |
| @command{autoheader}, and you can distribute the generated file | |
| @file{config.h.in} with the package. | |
| Here is a diagram showing how the files that can be used in | |
| configuration are produced. Programs that are executed are suffixed by | |
| @samp{*}. Optional files are enclosed in square brackets (@samp{[]}). | |
| @command{autoconf} and @command{autoheader} also read the installed Autoconf | |
| macro files (by reading @file{autoconf.m4}). | |
| @noindent | |
| Files used in preparing a software package for distribution, when using | |
| just Autoconf: | |
| @example | |
| your source files --> [autoscan*] --> [configure.scan] --> configure.ac | |
| @group | |
| configure.ac --. | |
| | .------> autoconf* -----> configure | |
| [aclocal.m4] --+---+ | |
| | `-----> [autoheader*] --> [config.h.in] | |
| [acsite.m4] ---' | |
| @end group | |
| Makefile.in | |
| @end example | |
| @noindent | |
| Additionally, if you use Automake, the following additional productions | |
| come into play: | |
| @example | |
| @group | |
| [acinclude.m4] --. | |
| | | |
| [local macros] --+--> aclocal* --> aclocal.m4 | |
| | | |
| configure.ac ----' | |
| @end group | |
| @group | |
| configure.ac --. | |
| +--> automake* --> Makefile.in | |
| Makefile.am ---' | |
| @end group | |
| @end example | |
| @noindent | |
| Files used in configuring a software package: | |
| @example | |
| @group | |
| .-------------> [config.cache] | |
| configure* ------------+-------------> config.log | |
| | | |
| [config.h.in] -. v .-> [config.h] -. | |
| +--> config.status* -+ +--> make* | |
| Makefile.in ---' `-> Makefile ---' | |
| @end group | |
| @end example | |
| @menu | |
| * Writing Autoconf Input:: What to put in an Autoconf input file | |
| * autoscan Invocation:: Semi-automatic @file{configure.ac} writing | |
| * ifnames Invocation:: Listing the conditionals in source code | |
| * autoconf Invocation:: How to create configuration scripts | |
| * autoreconf Invocation:: Remaking multiple @command{configure} scripts | |
| @end menu | |
| @node Writing Autoconf Input | |
| @section Writing @file{configure.ac} | |
| To produce a @command{configure} script for a software package, create a | |
| file called @file{configure.ac} that contains invocations of the | |
| Autoconf macros that test the system features your package needs or can | |
| use. Autoconf macros already exist to check for many features; see | |
| @ref{Existing Tests}, for their descriptions. For most other features, | |
| you can use Autoconf template macros to produce custom checks; see | |
| @ref{Writing Tests}, for information about them. For especially tricky | |
| or specialized features, @file{configure.ac} might need to contain some | |
| hand-crafted shell commands; see @ref{Portable Shell, , Portable Shell | |
| Programming}. The @command{autoscan} program can give you a good start | |
| in writing @file{configure.ac} (@pxref{autoscan Invocation}, for more | |
| information). | |
| @cindex @file{configure.in} | |
| Previous versions of Autoconf promoted the name @file{configure.in}, | |
| which is somewhat ambiguous (the tool needed to process this file is not | |
| described by its extension), and introduces a slight confusion with | |
| @file{config.h.in} and so on (for which @samp{.in} means ``to be | |
| processed by @command{configure}''). Using @file{configure.ac} is now | |
| preferred, while the use of @file{configure.in} will cause warnings | |
| from @command{autoconf}. | |
| @menu | |
| * Shell Script Compiler:: Autoconf as solution of a problem | |
| * Autoconf Language:: Programming in Autoconf | |
| * Autoconf Input Layout:: Standard organization of @file{configure.ac} | |
| @end menu | |
| @node Shell Script Compiler | |
| @subsection A Shell Script Compiler | |
| Just as for any other computer language, in order to properly program | |
| @file{configure.ac} in Autoconf you must understand @emph{what} problem | |
| the language tries to address and @emph{how} it does so. | |
| The problem Autoconf addresses is that the world is a mess. After all, | |
| you are using Autoconf in order to have your package compile easily on | |
| all sorts of different systems, some of them being extremely hostile. | |
| Autoconf itself bears the price for these differences: @command{configure} | |
| must run on all those systems, and thus @command{configure} must limit itself | |
| to their lowest common denominator of features. | |
| Naturally, you might then think of shell scripts; who needs | |
| @command{autoconf}? A set of properly written shell functions is enough to | |
| make it easy to write @command{configure} scripts by hand. Sigh! | |
| Unfortunately, even in 2008, where shells without any function support are | |
| far and few between, there are pitfalls to avoid when making use of them. | |
| Also, finding a Bourne shell that accepts shell functions is not trivial, | |
| even though there is almost always one on interesting porting targets. | |
| So, what is really needed is some kind of compiler, @command{autoconf}, | |
| that takes an Autoconf program, @file{configure.ac}, and transforms it | |
| into a portable shell script, @command{configure}. | |
| How does @command{autoconf} perform this task? | |
| There are two obvious possibilities: creating a brand new language or | |
| extending an existing one. The former option is attractive: all | |
| sorts of optimizations could easily be implemented in the compiler and | |
| many rigorous checks could be performed on the Autoconf program | |
| (e.g., rejecting any non-portable construct). Alternatively, you can | |
| extend an existing language, such as the @code{sh} (Bourne shell) | |
| language. | |
| Autoconf does the latter: it is a layer on top of @code{sh}. It was | |
| therefore most convenient to implement @command{autoconf} as a macro | |
| expander: a program that repeatedly performs @dfn{macro expansions} on | |
| text input, replacing macro calls with macro bodies and producing a pure | |
| @code{sh} script in the end. Instead of implementing a dedicated | |
| Autoconf macro expander, it is natural to use an existing | |
| general-purpose macro language, such as M4, and implement the extensions | |
| as a set of M4 macros. | |
| @node Autoconf Language | |
| @subsection The Autoconf Language | |
| @cindex quotation | |
| The Autoconf language differs from many other computer | |
| languages because it treats actual code the same as plain text. Whereas | |
| in C, for instance, data and instructions have different syntactic | |
| status, in Autoconf their status is rigorously the same. Therefore, we | |
| need a means to distinguish literal strings from text to be expanded: | |
| quotation. | |
| When calling macros that take arguments, there must not be any white | |
| space between the macro name and the open parenthesis. | |
| @example | |
| AC_INIT ([oops], [1.0]) # incorrect | |
| AC_INIT([hello], [1.0]) # good | |
| @end example | |
| Arguments should | |
| be enclosed within the quote characters @samp{[} and @samp{]}, and be | |
| separated by commas. Any leading blanks or newlines in arguments are ignored, | |
| unless they are quoted. You should always quote an argument that | |
| might contain a macro name, comma, parenthesis, or a leading blank or | |
| newline. This rule applies recursively for every macro | |
| call, including macros called from other macros. For more details on | |
| quoting rules, see @ref{Programming in M4}. | |
| For instance: | |
| @example | |
| AC_CHECK_HEADER([stdio.h], | |
| [AC_DEFINE([HAVE_STDIO_H], [1], | |
| [Define to 1 if you have <stdio.h>.])], | |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) | |
| @end example | |
| @noindent | |
| is quoted properly. You may safely simplify its quotation to: | |
| @example | |
| AC_CHECK_HEADER([stdio.h], | |
| [AC_DEFINE([HAVE_STDIO_H], 1, | |
| [Define to 1 if you have <stdio.h>.])], | |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) | |
| @end example | |
| @noindent | |
| because @samp{1} cannot contain a macro call. Here, the argument of | |
| @code{AC_MSG_ERROR} must be quoted; otherwise, its comma would be | |
| interpreted as an argument separator. Also, the second and third arguments | |
| of @samp{AC_CHECK_HEADER} must be quoted, since they contain | |
| macro calls. The three arguments @samp{HAVE_STDIO_H}, @samp{stdio.h}, | |
| and @samp{Define to 1 if you have <stdio.h>.} do not need quoting, but | |
| if you unwisely defined a macro with a name like @samp{Define} or | |
| @samp{stdio} then they would need quoting. Cautious Autoconf users | |
| would keep the quotes, but many Autoconf users find such precautions | |
| annoying, and would rewrite the example as follows: | |
| @example | |
| AC_CHECK_HEADER(stdio.h, | |
| [AC_DEFINE(HAVE_STDIO_H, 1, | |
| [Define to 1 if you have <stdio.h>.])], | |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) | |
| @end example | |
| @noindent | |
| This is safe, so long as you adopt good naming conventions and do not | |
| define macros with names like @samp{HAVE_STDIO_H}, @samp{stdio}, or | |
| @samp{h}. Though it is also safe here to omit the quotes around | |
| @samp{Define to 1 if you have <stdio.h>.} this is not recommended, as | |
| message strings are more likely to inadvertently contain commas. | |
| The following example is wrong and dangerous, as it is underquoted: | |
| @example | |
| AC_CHECK_HEADER(stdio.h, | |
| AC_DEFINE(HAVE_STDIO_H, 1, | |
| Define to 1 if you have <stdio.h>.), | |
| AC_MSG_ERROR([sorry, can't do anything for you])) | |
| @end example | |
| In other cases, you may want to use text that also resembles a macro | |
| call. You must quote that text (whether just the potential problem, or | |
| the entire line) even when it is not passed as a macro argument; and you | |
| may also have to use @code{m4_pattern_allow} (@pxref{Forbidden | |
| Patterns}), to declare your intention that the resulting configure file | |
| will have a literal that resembles what would otherwise be reserved for | |
| a macro name. For example: | |
| @example | |
| dnl Simulate a possible future autoconf macro | |
| m4_define([AC_DC], [oops]) | |
| dnl Underquoted: | |
| echo "Hard rock was here! --AC_DC" | |
| dnl Correctly quoted: | |
| m4_pattern_allow([AC_DC]) | |
| echo "Hard rock was here! --[AC_DC]" | |
| [echo "Hard rock was here! --AC_DC"] | |
| @end example | |
| @noindent | |
| which results in this text in @file{configure}: | |
| @example | |
| echo "Hard rock was here! --oops" | |
| echo "Hard rock was here! --AC_DC" | |
| echo "Hard rock was here! --AC_DC" | |
| @end example | |
| @noindent | |
| When you use the same text in a macro argument, you must therefore have | |
| an extra quotation level (since one is stripped away by the macro | |
| substitution). In general, then, it is a good idea to @emph{use double | |
| quoting for all literal string arguments}, either around just the | |
| problematic portions, or over the entire argument: | |
| @example | |
| m4_pattern_allow([AC_DC]) | |
| AC_MSG_WARN([[AC_DC] stinks --Iron Maiden]) | |
| AC_MSG_WARN([[AC_DC stinks --Iron Maiden]]) | |
| @end example | |
| It is also possible to avoid the problematic patterns in the first | |
| place, by the use of additional escaping (either a quadrigraph, or | |
| creative shell constructs), in which case it is no longer necessary to | |
| use @code{m4_pattern_allow}: | |
| @example | |
| echo "Hard rock was here! --AC""_DC" | |
| AC_MSG_WARN([[AC@@&t@@_DC stinks --Iron Maiden]]) | |
| @end example | |
| You are now able to understand one of the constructs of Autoconf that | |
| has been continually misunderstood@enddots{} The rule of thumb is that | |
| @emph{whenever you expect macro expansion, expect quote expansion}; | |
| i.e., expect one level of quotes to be lost. For instance: | |
| @example | |
| AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [], | |
| [AC_MSG_ERROR([you lose])]) | |
| @end example | |
| @noindent | |
| is incorrect: here, the first argument of @code{AC_LANG_SOURCE} is | |
| @samp{char b[10];} and is expanded once, which results in | |
| @samp{char b10;}; and the @code{AC_LANG_SOURCE} is also expanded prior | |
| to being passed to @code{AC_COMPILE_IFELSE}. (There was an idiom common | |
| in Autoconf's past to | |
| address this issue via the M4 @code{changequote} primitive, but do not | |
| use it!) Let's take a closer look: the author meant the first argument | |
| to be understood as a literal, and therefore it must be quoted twice; | |
| likewise, the intermediate @code{AC_LANG_SOURCE} macro should be quoted | |
| once so that it is only expanded after the rest of the body of | |
| @code{AC_COMPILE_IFELSE} is in place: | |
| @example | |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [], | |
| [AC_MSG_ERROR([you lose])]) | |
| @end example | |
| @noindent | |
| Voilà , you actually produce @samp{char b[10];} this time! | |
| On the other hand, descriptions (e.g., the last parameter of | |
| @code{AC_DEFINE} or @code{AS_HELP_STRING}) are not literals---they | |
| are subject to line breaking, for example---and should not be double quoted. | |
| Even if these descriptions are short and are not actually broken, double | |
| quoting them yields weird results. | |
| Some macros take optional arguments, which this documentation represents | |
| as @ovar{arg} (not to be confused with the quote characters). You may | |
| just leave them empty, or use @samp{[]} to make the emptiness of the | |
| argument explicit, or you may simply omit the trailing commas. The | |
| three lines below are equivalent: | |
| @example | |
| AC_CHECK_HEADERS([stdio.h], [], [], []) | |
| AC_CHECK_HEADERS([stdio.h],,,) | |
| AC_CHECK_HEADERS([stdio.h]) | |
| @end example | |
| It is best to put each macro call on its own line in | |
| @file{configure.ac}. Most of the macros don't add extra newlines; they | |
| rely on the newline after the macro call to terminate the commands. | |
| This approach makes the generated @command{configure} script a little | |
| easier to read by not inserting lots of blank lines. It is generally | |
| safe to set shell variables on the same line as a macro call, because | |
| the shell allows assignments without intervening newlines. | |
| You can include comments in @file{configure.ac} files by starting them | |
| with the @samp{#}. For example, it is helpful to begin | |
| @file{configure.ac} files with a line like this: | |
| @example | |
| # Process this file with autoconf to produce a configure script. | |
| @end example | |
| @node Autoconf Input Layout | |
| @subsection Standard @file{configure.ac} Layout | |
| The order in which @file{configure.ac} calls the Autoconf macros is not | |
| important, with a few exceptions. Every @file{configure.ac} must | |
| contain a call to @code{AC_INIT} before the checks, and a call to | |
| @code{AC_OUTPUT} at the end (@pxref{Output}). Additionally, some macros | |
| rely on other macros having been called first, because they check | |
| previously set values of some variables to decide what to do. These | |
| macros are noted in the individual descriptions (@pxref{Existing | |
| Tests}), and they also warn you when @command{configure} is created if they | |
| are called out of order. | |
| To encourage consistency, here is a suggested order for calling the | |
| Autoconf macros. Generally speaking, the things near the end of this | |
| list are those that could depend on things earlier in it. For example, | |
| library functions could be affected by types and libraries. | |
| @display | |
| @group | |
| Autoconf requirements | |
| @code{AC_INIT(@var{package}, @var{version}, @var{bug-report-address})} | |
| information on the package | |
| checks for programs | |
| checks for libraries | |
| checks for header files | |
| checks for types | |
| checks for structures | |
| checks for compiler characteristics | |
| checks for library functions | |
| checks for system services | |
| @code{AC_CONFIG_FILES(@r{[}@var{file@dots{}}@r{]})} | |
| @code{AC_OUTPUT} | |
| @end group | |
| @end display | |
| @node autoscan Invocation | |
| @section Using @command{autoscan} to Create @file{configure.ac} | |
| @cindex @command{autoscan} | |
| The @command{autoscan} program can help you create and/or maintain a | |
| @file{configure.ac} file for a software package. @command{autoscan} | |
| examines source files in the directory tree rooted at a directory given | |
| as a command line argument, or the current directory if none is given. | |
| It searches the source files for common portability problems and creates | |
| a file @file{configure.scan} which is a preliminary @file{configure.ac} | |
| for that package, and checks a possibly existing @file{configure.ac} for | |
| completeness. | |
| When using @command{autoscan} to create a @file{configure.ac}, you | |
| should manually examine @file{configure.scan} before renaming it to | |
| @file{configure.ac}; it probably needs some adjustments. | |
| Occasionally, @command{autoscan} outputs a macro in the wrong order | |
| relative to another macro, so that @command{autoconf} produces a warning; | |
| you need to move such macros manually. Also, if you want the package to | |
| use a configuration header file, you must add a call to | |
| @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}). You might | |
| also have to change or add some @code{#if} directives to your program in | |
| order to make it work with Autoconf (@pxref{ifnames Invocation}, for | |
| information about a program that can help with that job). | |
| When using @command{autoscan} to maintain a @file{configure.ac}, simply | |
| consider adding its suggestions. The file @file{autoscan.log} | |
| contains detailed information on why a macro is requested. | |
| @command{autoscan} uses several data files (installed along with Autoconf) | |
| to determine which macros to output when it finds particular symbols in | |
| a package's source files. These data files all have the same format: | |
| each line consists of a symbol, one or more blanks, and the Autoconf macro to | |
| output if that symbol is encountered. Lines starting with @samp{#} are | |
| comments. | |
| @command{autoscan} accepts the following options: | |
| @table @option | |
| @item --help | |
| @itemx -h | |
| Print a summary of the command line options and exit. | |
| @item --version | |
| @itemx -V | |
| Print the version number of Autoconf and exit. | |
| @item --verbose | |
| @itemx -v | |
| Print the names of the files it examines and the potentially interesting | |
| symbols it finds in them. This output can be voluminous. | |
| @item --debug | |
| @itemx -d | |
| Don't remove temporary files. | |
| @item --include=@var{dir} | |
| @itemx -I @var{dir} | |
| Append @var{dir} to the include path. Multiple invocations accumulate. | |
| @item --prepend-include=@var{dir} | |
| @itemx -B @var{dir} | |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. | |
| @end table | |
| @node ifnames Invocation | |
| @section Using @command{ifnames} to List Conditionals | |
| @cindex @command{ifnames} | |
| @command{ifnames} can help you write @file{configure.ac} for a software | |
| package. It prints the identifiers that the package already uses in C | |
| preprocessor conditionals. If a package has already been set up to have | |
| some portability, @command{ifnames} can thus help you figure out what its | |
| @command{configure} needs to check for. It may help fill in some gaps in a | |
| @file{configure.ac} generated by @command{autoscan} (@pxref{autoscan | |
| Invocation}). | |
| @command{ifnames} scans all of the C source files named on the command line | |
| (or the standard input, if none are given) and writes to the standard | |
| output a sorted list of all the identifiers that appear in those files | |
| in @code{#if}, @code{#ifdef}, @code{#ifndef}, @code{#elif}, | |
| @code{#elifdef}, or @code{#elifndef} directives. | |
| It prints each identifier on a line, followed by a | |
| space-separated list of the files in which that identifier occurs. | |
| @noindent | |
| @command{ifnames} accepts the following options: | |
| @table @option | |
| @item --help | |
| @itemx -h | |
| Print a summary of the command line options and exit. | |
| @item --version | |
| @itemx -V | |
| Print the version number of Autoconf and exit. | |
| @end table | |
| @node autoconf Invocation | |
| @section Using @command{autoconf} to Create @command{configure} | |
| @cindex @command{autoconf} | |
| To create @command{configure} from @file{configure.ac}, run the | |
| @command{autoconf} program with no arguments. @command{autoconf} processes | |
| @file{configure.ac} with the M4 macro processor, using the | |
| Autoconf macros. If you give @command{autoconf} an argument, it reads that | |
| file instead of @file{configure.ac} and writes the configuration script | |
| to the standard output instead of to @command{configure}. If you give | |
| @command{autoconf} the argument @option{-}, it reads from the standard | |
| input instead of @file{configure.ac} and writes the configuration script | |
| to the standard output. | |
| The Autoconf macros are defined in several files. Some of the files are | |
| distributed with Autoconf; @command{autoconf} reads them first. Then it | |
| looks for the optional file @file{acsite.m4} in the directory that | |
| contains the distributed Autoconf macro files, and for the optional file | |
| @file{aclocal.m4} in the current directory. Those files can contain | |
| your site's or the package's own Autoconf macro definitions | |
| (@pxref{Writing Autoconf Macros}, for more information). If a macro is | |
| defined in more than one of the files that @command{autoconf} reads, the | |
| last definition it reads overrides the earlier ones. | |
| @command{autoconf} accepts the following options: | |
| @table @option | |
| @item --help | |
| @itemx -h | |
| Print a summary of the command line options and exit. | |
| @item --version | |
| @itemx -V | |
| Print the version number of Autoconf and exit. | |
| @item --verbose | |
| @itemx -v | |
| Report processing steps. | |
| @item --debug | |
| @itemx -d | |
| Don't remove the temporary files. | |
| @item --force | |
| @itemx -f | |
| Remake @file{configure} even if newer than its input files. | |
| @item --include=@var{dir} | |
| @itemx -I @var{dir} | |
| Append @var{dir} to the include path. Multiple invocations accumulate. | |
| @item --prepend-include=@var{dir} | |
| @itemx -B @var{dir} | |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. | |
| @item --output=@var{file} | |
| @itemx -o @var{file} | |
| Save output (script or trace) to @var{file}. The file @option{-} stands | |
| for the standard output. | |
| @item --warnings=@var{category}[,@var{category}...] | |
| @itemx -W@var{category}[,@var{category}...] | |
| @evindex WARNINGS | |
| Enable or disable warnings related to each @var{category}. | |
| @xref{m4_warn}, for a comprehensive list of categories. | |
| Special values include: | |
| @table @samp | |
| @item all | |
| Enable all categories of warnings. | |
| @item none | |
| Disable all categories of warnings. | |
| @item error | |
| Treat all warnings as errors. | |
| @item no-@var{category} | |
| Disable warnings falling into @var{category}. | |
| @end table | |
| The environment variable @env{WARNINGS} may also be set to a | |
| comma-separated list of warning categories to enable or disable. | |
| It is interpreted exactly the same way as the argument of | |
| @option{--warnings}, but unknown categories are silently ignored. | |
| The command line takes precedence; for instance, if @env{WARNINGS} | |
| is set to @code{obsolete}, but @option{-Wnone} is given on the | |
| command line, no warnings will be issued. | |
| Some categories of warnings are on by default. | |
| Again, for details see @ref{m4_warn}. | |
| @item --trace=@var{macro}[:@var{format}] | |
| @itemx -t @var{macro}[:@var{format}] | |
| Do not create the @command{configure} script, but list the calls to | |
| @var{macro} according to the @var{format}. Multiple @option{--trace} | |
| arguments can be used to list several macros. Multiple @option{--trace} | |
| arguments for a single macro are not cumulative; instead, you should | |
| just make @var{format} as long as needed. | |
| The @var{format} is a regular string, with newlines if desired, and | |
| several special escape codes. It defaults to @samp{$f:$l:$n:$%}; see | |
| @ref{autom4te Invocation}, for details on the @var{format}. | |
| @item --initialization | |
| @itemx -i | |
| By default, @option{--trace} does not trace the initialization of the | |
| Autoconf macros (typically the @code{AC_DEFUN} definitions). This | |
| results in a noticeable speedup, but can be disabled by this option. | |
| @end table | |
| It is often necessary to check the content of a @file{configure.ac} | |
| file, but parsing it yourself is extremely fragile and error-prone. It | |
| is suggested that you rely upon @option{--trace} to scan | |
| @file{configure.ac}. For instance, to find the list of variables that | |
| are substituted, use: | |
| @example | |
| @group | |
| $ @kbd{autoconf -t AC_SUBST} | |
| configure.ac:28:AC_SUBST:SHELL | |
| configure.ac:28:AC_SUBST:PATH_SEPARATOR | |
| @i{More traces deleted} | |
| @end group | |
| @end example | |
| @noindent | |
| The example below highlights the difference between @samp{$@@}, | |
| @samp{$*}, and @samp{$%}. | |
| @example | |
| @group | |
| $ @kbd{cat configure.ac} | |
| AC_DEFINE(This, is, [an | |
| [example]]) | |
| $ @kbd{autoconf -t 'AC_DEFINE:@@: $@@} | |
| *: $* | |
| %: $%' | |
| @@: [This],[is],[an | |
| [example]] | |
| *: This,is,an | |
| [example] | |
| %: This:is:an [example] | |
| @end group | |
| @end example | |
| @noindent | |
| The @var{format} gives you a lot of freedom: | |
| @example | |
| @group | |
| $ @kbd{autoconf -t 'AC_SUBST:$$ac_subst@{"$1"@} = "$f:$l";'} | |
| $ac_subst@{"SHELL"@} = "configure.ac:28"; | |
| $ac_subst@{"PATH_SEPARATOR"@} = "configure.ac:28"; | |
| @i{More traces deleted} | |
| @end group | |
| @end example | |
| @noindent | |
| A long @var{separator} can be used to improve the readability of complex | |
| structures, and to ease their parsing (for instance when no single | |
| character is suitable as a separator): | |
| @example | |
| @group | |
| $ @kbd{autoconf -t 'AM_MISSING_PROG:$@{|:::::|@}*'} | |
| ACLOCAL|:::::|aclocal|:::::|$missing_dir | |
| AUTOCONF|:::::|autoconf|:::::|$missing_dir | |
| AUTOMAKE|:::::|automake|:::::|$missing_dir | |
| @i{More traces deleted} | |
| @end group | |
| @end example | |
| @node autoreconf Invocation | |
| @section Using @command{autoreconf} to Update @command{configure} Scripts | |
| @cindex @command{autoreconf} | |
| Installing the various components of the GNU Build System can be | |
| tedious: running @command{autopoint} for Gettext, @command{automake} for | |
| @file{Makefile.in} etc.@: in each directory. It may be needed either | |
| because some tools such as @command{automake} have been updated on your | |
| system, or because some of the sources such as @file{configure.ac} have | |
| been updated, or finally, simply in order to install the GNU Build | |
| System in a fresh tree. | |
| @command{autoreconf} runs @command{autoconf}, @command{autoheader}, | |
| @command{aclocal}, @command{automake}, @command{libtoolize}, @command{intltoolize}, | |
| @command{gtkdocize}, and @command{autopoint} (when appropriate) repeatedly | |
| to update the GNU Build System in the specified directories and their | |
| subdirectories (@pxref{Subdirectories}). By default, it only remakes | |
| those files that are older than their sources. | |
| 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. | |
| 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. | |
| Except for @env{AUTOM4TE} and @env{M4}, setting any of these enviroment | |
| variables to @samp{true}, @samp{false}, @samp{:}, or the empty string | |
| has the same effect as passing @samp{--exclude=@var{cmd}} on the command | |
| line, where @var{cmd} is the lowercased version of the command's name; | |
| see the description of the @option{--exclude} option, below. | |
| @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 --replace-handwritten | |
| @itemx -R | |
| Replace files that @emph{could} be generated but appear to have been | |
| written by hand. Currently this only affects the treatment of the | |
| primary configuration header template (usually @file{config.h.in}; | |
| @pxref{Header Templates}). In the future it may also affect | |
| @file{aclocal.m4} and others. | |
| @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 --exclude=@var{cmd}[,@var{cmd}...] | |
| @itemx -x @var{cmd}[,@var{cmd}...] | |
| Do not run any @var{cmd} in the list, even if it seems to be needed. | |
| @var{cmd} can be @samp{autoconf}, @samp{autoheader}, @samp{automake}, | |
| @samp{aclocal}, @samp{autopoint}, @samp{libtoolize}, @samp{intltoolize}, | |
| @samp{gtkdocize}, or @samp{make}. | |
| @samp{--exclude make} has priority over @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 | |
| features in C, C++, Objective C, Objective C++, Fortran, Go, and Algol 68. | |
| 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 A68FLAGS | |
| @evindex A68FLAGS | |
| @ovindex A68FLAGS | |
| Debugging and optimization options for the Algol 68 compiler. It acts | |
| like @code{CFLAGS}, but for Algol 68 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 --replace-handwritten | |
| @itemx -R | |
| Remake the template file even if it appears not to have been generated | |
| by @command{autoheader}. | |
| @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. | |
| @var{key} must expand to a literal symbol name. Otherwise, this macro | |
| has no effect and issues no diagnostic (@pxref{Defining Symbols}). | |
| 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. @var{key} must expand to a literal word. Otherwise, this | |
| macro has no effect and issues no diagnostic. | |
| @end defmac | |
| @defmac AH_TOP (@var{text}) | |
| @ahindex{TOP} | |
| Include @var{text} at the top of the header template file. | |
| @end defmac | |
| @defmac AH_BOTTOM (@var{text}) | |
| @ahindex{BOTTOM} | |
| Include @var{text} at the bottom of the header template file. | |
| @end defmac | |
| Please note that @var{text} gets included ``verbatim'' to the template file, | |
| not to the resulting config header, so it can easily get mangled when the | |
| template is processed. There is rarely a need for something other than | |
| @example | |
| AH_BOTTOM([#include <custom.h>]) | |
| @end example | |
| @node Configuration Commands | |
| @section Running Arbitrary Configuration Commands | |
| @cindex Configuration commands | |
| @cindex Commands for configuration | |
| You can execute arbitrary commands before, during, and after | |
| @file{config.status} is run. The three following macros accumulate the | |
| commands to run when they are called multiple times. | |
| @code{AC_CONFIG_COMMANDS} replaces the obsolete macro | |
| @code{AC_OUTPUT_COMMANDS}; see @ref{Obsolete Macros}, for details. | |
| @anchor{AC_CONFIG_COMMANDS} | |
| @defmac AC_CONFIG_COMMANDS (@var{tag}@dots{}, @ovar{cmds}, @ovar{init-cmds}) | |
| @acindex{CONFIG_COMMANDS} | |
| Specify additional shell commands to run at the end of | |
| @file{config.status}, and shell commands to initialize any variables | |
| from @command{configure}. Associate the commands with @var{tag}. | |
| Since typically the @var{cmds} create a file, @var{tag} should | |
| naturally be the name of that file. If needed, the directory hosting | |
| @var{tag} is created. The @var{tag} should not contain shell | |
| metacharacters. @xref{Special Chars in Variables}. | |
| This macro is one of the instantiating macros; | |
| see @ref{Configuration Actions}. | |
| Here is an unrealistic example: | |
| @example | |
| fubar=42 | |
| AC_CONFIG_COMMANDS([fubar], | |
| [AS_ECHO(["this is extra $fubar, and so on."])], | |
| [fubar=$fubar]) | |
| @end example | |
| Here is a better one: | |
| @example | |
| AC_CONFIG_COMMANDS([timestamp], [echo >timestamp]) | |
| @end example | |
| @end defmac | |
| The following two macros look similar, but in fact they are not of the same | |
| breed: they are executed directly by @file{configure}, so you cannot use | |
| @file{config.status} to rerun them. | |
| @c Yet it is good to leave them here. The user sees them together and | |
| @c decides which best fits their needs. | |
| @defmac AC_CONFIG_COMMANDS_PRE (@var{cmds}) | |
| @acindex{CONFIG_COMMANDS_PRE} | |
| Execute the @var{cmds} right before creating @file{config.status}. | |
| This macro presents the last opportunity to call @code{AC_SUBST}, | |
| @code{AC_DEFINE}, or @code{AC_CONFIG_@var{ITEMS}} macros. | |
| @end defmac | |
| @defmac AC_CONFIG_COMMANDS_POST (@var{cmds}) | |
| @acindex{CONFIG_COMMANDS_POST} | |
| Execute the @var{cmds} right after creating @file{config.status}. | |
| @end defmac | |
| @node Configuration Links | |
| @section Creating Configuration Links | |
| @cindex Configuration links | |
| @cindex Links for configuration | |
| You may find it convenient to create links whose destinations depend upon | |
| results of tests. One can use @code{AC_CONFIG_COMMANDS} but the | |
| creation of relative symbolic links can be delicate when the package is | |
| built in a directory different from the source directory. | |
| @anchor{AC_CONFIG_LINKS} | |
| @defmac AC_CONFIG_LINKS (@var{dest}:@var{source}@dots{}, @ovar{cmds}, @ | |
| @ovar{init-cmds}) | |
| @acindex{CONFIG_LINKS} | |
| @cindex Links | |
| Make @code{AC_OUTPUT} link each of the existing files @var{source} to | |
| the corresponding link name @var{dest}. Makes a symbolic link if | |
| possible, otherwise a hard link if possible, otherwise a copy. The | |
| @var{dest} and @var{source} names should be relative to the top level | |
| source or build directory, and should not contain shell metacharacters. | |
| @xref{Special Chars in Variables}. | |
| This macro is one of the instantiating | |
| macros; see @ref{Configuration Actions}. | |
| For example, this call: | |
| @example | |
| AC_CONFIG_LINKS([host.h:config/$machine.h | |
| object.h:config/$obj_format.h]) | |
| @end example | |
| @noindent | |
| creates in the current directory @file{host.h} as a link to | |
| @file{@var{srcdir}/config/$machine.h}, and @file{object.h} as a | |
| link to @file{@var{srcdir}/config/$obj_format.h}. | |
| The tempting value @samp{.} for @var{dest} is invalid: it makes it | |
| impossible for @samp{config.status} to guess the links to establish. | |
| One can then run: | |
| @example | |
| ./config.status host.h object.h | |
| @end example | |
| @noindent | |
| to create the links. | |
| @end defmac | |
| @node Subdirectories | |
| @section Configuring Other Packages in Subdirectories | |
| @cindex Configure subdirectories | |
| @cindex Subdirectory configure | |
| In most situations, calling @code{AC_OUTPUT} is sufficient to produce | |
| makefiles in subdirectories. However, @command{configure} scripts | |
| that control more than one independent package can use | |
| @code{AC_CONFIG_SUBDIRS} to run @command{configure} scripts for other | |
| packages in subdirectories. | |
| @defmac AC_CONFIG_SUBDIRS (@var{dir} @dots{}) | |
| @acindex{CONFIG_SUBDIRS} | |
| @ovindex subdirs | |
| Make @code{AC_OUTPUT} run @command{configure} in each subdirectory | |
| @var{dir} in the given blank-or-newline-separated list. Each @var{dir} should | |
| be a literal, i.e., please do not use: | |
| @example | |
| @c If you change this example, adjust tests/torture.at:Non-literal AC_CONFIG_SUBDIRS. | |
| if test "x$package_foo_enabled" = xyes; then | |
| my_subdirs="$my_subdirs foo" | |
| fi | |
| AC_CONFIG_SUBDIRS([$my_subdirs]) | |
| @end example | |
| @noindent | |
| because this prevents @samp{./configure --help=recursive} from | |
| displaying the options of the package @code{foo}. Instead, you should | |
| write: | |
| @example | |
| AS_IF([test "x$package_foo_enabled" = xyes], | |
| [AC_CONFIG_SUBDIRS([foo])]) | |
| @end example | |
| If a given @var{dir} is not found at @command{configure} run time, a | |
| warning is reported; if the subdirectory is optional, write: | |
| @example | |
| AS_IF([test -d "$srcdir/foo"], | |
| [AC_CONFIG_SUBDIRS([foo])]) | |
| @end example | |
| These examples use @code{AS_IF} instead of ordinary shell @code{if} to | |
| avoid problems that Autoconf has with macro calls in shell conditionals | |
| outside macro definitions. @xref{Common Shell Constructs}. | |
| If a given @var{dir} contains @command{configure.gnu}, it is run instead | |
| of @command{configure}. This is for packages that might use a | |
| non-Autoconf script @command{Configure}, which can't be called through a | |
| wrapper @command{configure} since it would be the same file on | |
| case-insensitive file systems. | |
| The subdirectory @command{configure} scripts are given the same command | |
| line options that were given to this @command{configure} script, with minor | |
| changes if needed, which include: | |
| @itemize @minus | |
| @item | |
| adjusting a relative name for the cache file; | |
| @item | |
| adjusting a relative name for the source directory; | |
| @item | |
| propagating the current value of @code{$prefix}, including if it was | |
| defaulted, and if the default values of the top level and of the subdirectory | |
| @file{configure} differ. | |
| @end itemize | |
| This macro also sets the output variable @code{subdirs} to the list of | |
| directories @samp{@var{dir} @dots{}}. Make rules can use | |
| this variable to determine which subdirectories to recurse into. | |
| This macro may be called multiple times. | |
| @end defmac | |
| @node Default Prefix | |
| @section Default Prefix | |
| @cindex Install prefix | |
| @cindex Prefix for install | |
| By default, @command{configure} sets the prefix for files it installs to | |
| @file{/usr/local}. The user of @command{configure} can select a different | |
| prefix using the @option{--prefix} and @option{--exec-prefix} options. | |
| There are two ways to change the default: when creating | |
| @command{configure}, and when running it. | |
| Some software packages might want to install in a directory other than | |
| @file{/usr/local} by default. To accomplish that, use the | |
| @code{AC_PREFIX_DEFAULT} macro. | |
| @defmac AC_PREFIX_DEFAULT (@var{prefix}) | |
| @acindex{PREFIX_DEFAULT} | |
| Set the default installation prefix to @var{prefix} instead of | |
| @file{/usr/local}. | |
| @end defmac | |
| It may be convenient for users to have @command{configure} guess the | |
| installation prefix from the location of a related program that they | |
| have already installed. If you wish to do that, you can call | |
| @code{AC_PREFIX_PROGRAM}. | |
| @anchor{AC_PREFIX_PROGRAM} | |
| @defmac AC_PREFIX_PROGRAM (@var{program}) | |
| @acindex{PREFIX_PROGRAM} | |
| If the user did not specify an installation prefix (using the | |
| @option{--prefix} option), guess a value for it by looking for | |
| @var{program} in @env{PATH}, the way the shell does. If @var{program} | |
| is found, set the prefix to the parent of the directory containing | |
| @var{program}, else default the prefix as described above | |
| (@file{/usr/local} or @code{AC_PREFIX_DEFAULT}). For example, if | |
| @var{program} is @code{gcc} and the @env{PATH} contains | |
| @file{/usr/local/gnu/bin/gcc}, set the prefix to @file{/usr/local/gnu}. | |
| @end defmac | |
| @c ======================================================== Existing tests | |
| @node Existing Tests | |
| @chapter Existing Tests | |
| These macros test for particular system features that packages might | |
| need or want to use. If you need to test for a kind of feature that | |
| none of these macros check for, you can probably do it by calling | |
| primitive test macros with appropriate arguments (@pxref{Writing | |
| Tests}). | |
| These tests print messages telling the user which feature they're | |
| checking for, and what they find. They cache their results for future | |
| @command{configure} runs (@pxref{Caching Results}). | |
| Some of these macros set output variables. @xref{Makefile | |
| Substitutions}, for how to get their values. The phrase ``define | |
| @var{name}'' is used below as a shorthand to mean ``define the C | |
| preprocessor symbol @var{name} to the value 1''. @xref{Defining | |
| Symbols}, for how to get those symbol definitions into your program. | |
| @menu | |
| * Common Behavior:: Macros' standard schemes | |
| * Alternative Programs:: Selecting between alternative programs | |
| * Files:: Checking for the existence of files | |
| * Libraries:: Library archives that might be missing | |
| * Library Functions:: C library functions that might be missing | |
| * Header Files:: Header files that might be missing | |
| * Declarations:: Declarations that may be missing | |
| * Structures:: Structures or members that might be missing | |
| * Types:: Types that might be missing | |
| * Compilers and Preprocessors:: Checking for compiling programs | |
| * System Services:: Operating system services | |
| * C and POSIX Variants:: Kludges for C and POSIX variants | |
| * Erlang Libraries:: Checking for the existence of Erlang libraries | |
| @end menu | |
| @node Common Behavior | |
| @section Common Behavior | |
| @cindex Common autoconf behavior | |
| Much effort has been expended to make Autoconf easy to learn. The most | |
| obvious way to reach this goal is simply to enforce standard interfaces | |
| and behaviors, avoiding exceptions as much as possible. Because of | |
| history and inertia, unfortunately, there are still too many exceptions | |
| in Autoconf; nevertheless, this section describes some of the common | |
| rules. | |
| @menu | |
| * Standard Symbols:: Symbols defined by the macros | |
| * Default Includes:: Includes used by the generic macros | |
| @end menu | |
| @node Standard Symbols | |
| @subsection Standard Symbols | |
| @cindex Standard symbols | |
| All the generic macros that @code{AC_DEFINE} a symbol as a result of | |
| their test transform their @var{argument} values to a standard alphabet. | |
| First, @var{argument} is converted to upper case and any asterisks | |
| (@samp{*}) are each converted to @samp{P}. Any remaining characters | |
| that are not alphanumeric are converted to underscores. | |
| For instance, | |
| @example | |
| AC_CHECK_TYPES([struct $Expensive*]) | |
| @end example | |
| @noindent | |
| defines the symbol @samp{HAVE_STRUCT__EXPENSIVEP} if the check | |
| succeeds. | |
| @node Default Includes | |
| @subsection Default Includes | |
| @cindex Default includes | |
| @cindex Includes, default | |
| @hdrindex{assert.h} | |
| @hdrindex{ctype.h} | |
| @hdrindex{errno.h} | |
| @hdrindex{float.h} | |
| @hdrindex{iso646.h} | |
| @hdrindex{limits.h} | |
| @hdrindex{locale.h} | |
| @hdrindex{math.h} | |
| @hdrindex{setjmp.h} | |
| @hdrindex{signal.h} | |
| @hdrindex{stdarg.h} | |
| @hdrindex{stddef.h} | |
| @hdrindex{stdio.h} | |
| @hdrindex{stdlib.h} | |
| @hdrindex{string.h} | |
| @hdrindex{time.h} | |
| @hdrindex{wchar.h} | |
| @hdrindex{wctype.h} | |
| Test programs frequently need to include headers that may or may not be | |
| available on the system whose features are being tested. Each test can | |
| use all the preprocessor macros that have been @code{AC_DEFINE}d by | |
| previous tests, so for example one may write | |
| @example | |
| @group | |
| #include <time.h> | |
| #ifdef HAVE_SYS_TIME_H | |
| # include <sys/time.h> | |
| #endif | |
| @end group | |
| @end example | |
| @noindent | |
| if @file{sys/time.h} has already been tested for. | |
| All hosted environments that are still of interest for portable code | |
| provide all of the headers specified in C89 (as amended in 1995): | |
| @file{assert.h}, @file{ctype.h}, @file{errno.h}, @file{float.h}, | |
| @file{iso646.h}, @file{limits.h}, @file{locale.h}, @file{math.h}, | |
| @file{setjmp.h}, @file{signal.h}, @file{stdarg.h}, @file{stddef.h}, | |
| @file{stdio.h}, @file{stdlib.h}, @file{string.h}, @file{time.h}, | |
| @file{wchar.h}, and @file{wctype.h}. Most programs can safely include | |
| these headers unconditionally. A program not intended to be portable to | |
| C89 can also safely include the C99-specified header @file{stdbool.h}. | |
| Other headers, including headers from C99 and later revisions of the C | |
| standard, might need to be tested for (@pxref{Header Files}) or their | |
| bugs may need to be worked around (@pxref{Gnulib}). | |
| If your program needs to be portable to a @emph{freestanding} | |
| environment, such as an embedded OS that doesn't provide all of the | |
| facilities of the C89 standard library, you may need to test for some of | |
| the above headers as well. Note that many Autoconf macros internally | |
| assume that the complete set of C89 headers are available. | |
| Most generic macros use the following macro to provide a default set | |
| of includes: | |
| @defmac AC_INCLUDES_DEFAULT (@ovar{include-directives}) | |
| @acindex{INCLUDES_DEFAULT} | |
| Expand to @var{include-directives} if present and nonempty, otherwise to: | |
| @example | |
| @group | |
| #include <stddef.h> | |
| #ifdef HAVE_STDIO_H | |
| # include <stdio.h> | |
| #endif | |
| #ifdef HAVE_STDLIB_H | |
| # include <stdlib.h> | |
| #endif | |
| #ifdef HAVE_STRING_H | |
| # include <string.h> | |
| #endif | |
| #ifdef HAVE_INTTYPES_H | |
| # include <inttypes.h> | |
| #endif | |
| #ifdef HAVE_STDINT_H | |
| # include <stdint.h> | |
| #endif | |
| #ifdef HAVE_STRINGS_H | |
| # include <strings.h> | |
| #endif | |
| #ifdef HAVE_SYS_TYPES_H | |
| # include <sys/types.h> | |
| #endif | |
| #ifdef HAVE_SYS_STAT_H | |
| # include <sys/stat.h> | |
| #endif | |
| #ifdef HAVE_UNISTD_H | |
| # include <unistd.h> | |
| #endif | |
| @end group | |
| @end example | |
| Using this macro without @var{include-directives} has the side effect of | |
| checking for @file{stdio.h}, @file{stdlib.h}, @file{string.h}, | |
| @file{inttypes.h}, @file{stdint.h}, @file{strings.h}, | |
| @file{sys/types.h}, @file{sys/stat.h}, and @file{unistd.h}, as if by | |
| @code{AC_CHECK_HEADERS_ONCE}. For backward compatibility, the macro | |
| @code{STDC_HEADERS} will be defined when both @file{stdlib.h} and | |
| @file{string.h} are available. | |
| @strong{Portability Note:} It is safe for most programs to assume the | |
| presence of all of the headers required by the original 1990 C standard. | |
| @code{AC_INCLUDES_DEFAULT} checks for @file{stdio.h}, @file{stdlib.h}, | |
| and @file{string.h}, even though they are in that list, because they | |
| might not be available when compiling for a ``freestanding environment'' | |
| (in which most of the features of the C library are optional). You | |
| probably do not need to write @samp{#ifdef HAVE_STDIO_H} in your own | |
| code. | |
| @file{inttypes.h} and @file{stdint.h} were added to C in the 1999 | |
| revision of the standard, and @file{strings.h}, @file{sys/types.h}, | |
| @file{sys/stat.h}, and @file{unistd.h} are POSIX extensions. You | |
| @emph{should} guard uses of these headers with appropriate conditionals. | |
| @end defmac | |
| @defmac AC_CHECK_INCLUDES_DEFAULT | |
| @acindex{CHECK_INCLUDES_DEFAULT} | |
| Check for all the headers that @code{AC_INCLUDES_DEFAULT} would check | |
| for as a side-effect, if this has not already happened. | |
| This macro mainly exists so that @code{autoupdate} can replace certain | |
| obsolete constructs with it. You should not need to use it yourself; in | |
| fact, it is likely to be safe to delete it from any script in which it | |
| appears. (@code{autoupdate} does not know whether preprocessor macros | |
| such as @code{HAVE_STDINT_H} are used in the program, nor whether they | |
| would get defined as a side-effect of other checks.) | |
| @end defmac | |
| @node Alternative Programs | |
| @section Alternative Programs | |
| @cindex Programs, checking | |
| These macros check for the presence or behavior of particular programs. | |
| They are used to choose between several alternative programs and to | |
| decide what to do once one has been chosen. If there is no macro | |
| specifically defined to check for a program you need, and you don't need | |
| to check for any special properties of it, then you can use one of the | |
| general program-check macros. | |
| @menu | |
| * Particular Programs:: Special handling to find certain programs | |
| * Generic Programs:: How to find other programs | |
| @end menu | |
| @node Particular Programs | |
| @subsection Particular Program Checks | |
| These macros check for particular programs---whether they exist, and | |
| in some cases whether they support certain features. | |
| @defmac AC_PROG_AR | |
| @acindex{PROG_AR} | |
| @ovindex AR | |
| @c @caindex prog_AR | |
| @c @caindex prog_ac_ct_AR | |
| Set output variable @code{AR} to @samp{ar} if @code{ar} is found, and | |
| otherwise to @samp{:} (do nothing). | |
| @end defmac | |
| @defmac AC_PROG_AWK | |
| @acindex{PROG_AWK} | |
| @ovindex AWK | |
| @caindex prog_AWK | |
| Check for the commands @command{gawk}, @command{mawk}, | |
| @command{nawk}, @command{awk}, and @code{busybox awk}, in that | |
| order, and set output variable @code{AWK} to the first one that is found. | |
| Try @code{gawk} first because that is reported to be the | |
| best implementation. The result can be overridden by setting the | |
| variable @code{AWK} or the cache variable @code{ac_cv_prog_AWK}. | |
| Using this macro avoids some pitfalls of older systems that have both | |
| traditional @command{awk} (@pxref{awk, , Limitations of Usual Tools}) | |
| and better alternatives like @command{gawk}. | |
| It also can help port to stripped-down systems that have only | |
| @code{busybox awk}, although these systems could well have problems | |
| with other build components that use plain @command{awk}. | |
| @end defmac | |
| @defmac AC_PROG_GREP | |
| @acindex{PROG_GREP} | |
| @ovindex GREP | |
| @caindex prog_GREP | |
| Look for the best available @code{grep} or @code{ggrep} that accepts the | |
| longest input lines possible, and that supports multiple @option{-e} options. | |
| Set the output variable @code{GREP} to whatever is chosen. | |
| @xref{grep, , Limitations of Usual Tools}, for more information about | |
| portability problems with the @command{grep} command family. The result | |
| can be overridden by setting the @code{GREP} variable and is cached in the | |
| @code{ac_cv_path_GREP} variable. | |
| @end defmac | |
| @defmac AC_PROG_EGREP | |
| @acindex{PROG_EGREP} | |
| @ovindex EGREP | |
| @caindex prog_EGREP | |
| Check whether @code{$GREP -E} works, or else look for the best available | |
| @code{egrep} or @code{gegrep} that accepts the longest input lines possible. | |
| Set the output variable @code{EGREP} to whatever is chosen. The result | |
| can be overridden by setting the @code{EGREP} variable and is cached in the | |
| @code{ac_cv_path_EGREP} variable. | |
| @end defmac | |
| @defmac AC_PROG_FGREP | |
| @acindex{PROG_FGREP} | |
| @ovindex FGREP | |
| @caindex prog_FGREP | |
| Check whether @code{$GREP -F} works, or else look for the best available | |
| @code{fgrep} or @code{gfgrep} that accepts the longest input lines possible. | |
| Set the output variable @code{FGREP} to whatever is chosen. The result | |
| can be overridden by setting the @code{FGREP} variable and is cached in the | |
| @code{ac_cv_path_FGREP} variable. | |
| @end defmac | |
| @defmac AC_PROG_INSTALL | |
| @acindex{PROG_INSTALL} | |
| @ovindex INSTALL | |
| @ovindex INSTALL_PROGRAM | |
| @ovindex INSTALL_DATA | |
| @ovindex INSTALL_SCRIPT | |
| @caindex path_install | |
| @prindex @command{install-sh} | |
| Set output variable @code{INSTALL} to the name of a BSD-compatible | |
| @command{install} program, if one is found in the current @env{PATH}. | |
| Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c}, | |
| checking the directories specified to @code{AC_CONFIG_AUX_DIR} (or its | |
| default directories) to determine @var{dir} (@pxref{Output}). Also set | |
| the variables @code{INSTALL_PROGRAM} and @code{INSTALL_SCRIPT} to | |
| @samp{$@{INSTALL@}} and @code{INSTALL_DATA} to @samp{$@{INSTALL@} -m 644}. | |
| @samp{@@INSTALL@@} is special, as its value may vary for different | |
| configuration files. | |
| This macro screens out various instances of @command{install} known not to | |
| work. It prefers to find a C program rather than a shell script, for | |
| speed. Instead of @file{install-sh}, it can also use @file{install.sh}, | |
| but that name is obsolete because some @command{make} programs have a rule | |
| that creates @file{install} from it if there is no makefile. Further, this | |
| macro requires @command{install} to be able to install multiple files into a | |
| target directory in a single invocation. | |
| Autoconf comes with a copy of @file{install-sh} that you can use. | |
| If you use @code{AC_PROG_INSTALL}, you must include @file{install-sh} in | |
| your distribution; otherwise @command{autoreconf} and @command{configure} | |
| will produce an error message saying they can't find it---even if the | |
| system you're on has a good @command{install} program. This check is a | |
| safety measure to prevent you from accidentally leaving that file out, | |
| which would prevent your package from installing on systems that don't | |
| have a BSD-compatible @command{install} program. | |
| If you need to use your own installation program because it has features | |
| not found in standard @command{install} programs, there is no reason to use | |
| @code{AC_PROG_INSTALL}; just put the file name of your program into your | |
| @file{Makefile.in} files. | |
| The result of the test can be overridden by setting the variable | |
| @code{INSTALL} or the cache variable @code{ac_cv_path_install}. | |
| @end defmac | |
| @defmac AC_PROG_MKDIR_P | |
| @acindex{PROG_MKDIR_P} | |
| @ovindex MKDIR_P | |
| @caindex path_mkdir | |
| @prindex @command{install-sh} | |
| Set output variable @code{MKDIR_P} to a program that ensures that for | |
| each argument, a directory named by this argument exists, creating it | |
| and its parent directories if needed, and without race conditions when | |
| two instances of the program attempt to make the same directory at | |
| nearly the same time. | |
| This macro uses the equivalent of the @samp{mkdir -p} command. Ancient | |
| versions of @command{mkdir} are vulnerable to race conditions, so if you | |
| want to support parallel installs from different packages into the same | |
| directory you should use a non-ancient @command{mkdir}. | |
| This macro is related to the @code{AS_MKDIR_P} macro (@pxref{Programming | |
| in M4sh}), but it sets an output variable intended for use in other | |
| files, whereas @code{AS_MKDIR_P} is intended for use in scripts like | |
| @command{configure}. Also, @code{AS_MKDIR_P} does not accept options, | |
| but @code{MKDIR_P} supports the @option{-m} option, e.g., a makefile | |
| might invoke @code{$(MKDIR_P) -m 0 dir} to create an inaccessible | |
| directory, and conversely a makefile should use @code{$(MKDIR_P) -- | |
| $(FOO)} if @var{FOO} might yield a value that begins with @samp{-}. | |
| The result of the test can be overridden by setting the variable | |
| @code{MKDIR_P} or the cache variable @code{ac_cv_path_mkdir}. | |
| @end defmac | |
| @anchor{AC_PROG_LEX} | |
| @defmac AC_PROG_LEX (@var{options}) | |
| @acindex{PROG_LEX} | |
| @ovindex LEX | |
| @ovindex LEXLIB | |
| @cvindex YYTEXT_POINTER | |
| @ovindex LEX_OUTPUT_ROOT | |
| @caindex prog_LEX | |
| Search for a lexical analyzer generator, preferring @code{flex} | |
| to plain @code{lex}. Output variable @code{LEX} is set to whichever | |
| program is available. If neither program is available, @code{LEX} | |
| is set to @samp{:}; | |
| for packages that ship the generated @file{file.yy.c} | |
| alongside the source @file{file.l}, this default allows users without a | |
| lexer generator to still build the package even if the timestamp for | |
| @file{file.l} is inadvertently changed. | |
| The name of the program to use can be overridden by setting the | |
| output variable @code{LEX} or the cache variable @code{ac_cv_prog_LEX} | |
| when running @command{configure}. | |
| If a lexical analyzer generator is found, this macro performs additional | |
| checks for common portability pitfalls. If these additional checks | |
| fail, @code{LEX} is reset to @samp{:}; otherwise the following | |
| additional macros and variables are provided. | |
| Preprocessor macro @code{YYTEXT_POINTER} is defined if the lexer | |
| skeleton, by default, declares @code{yytext} as a @samp{@w{char *}} | |
| rather than a @samp{@w{char []}}. | |
| Output variable @code{LEX_OUTPUT_ROOT} is set to the base of the file | |
| name that the lexer generates; this is usually either @file{lex.yy} or | |
| @file{lexyy}. | |
| If generated lexers need a library to work, output variable | |
| @code{LEXLIB} is set to a link option for that library (e.g., | |
| @option{-ll}), otherwise it is set to empty. | |
| The @var{options} argument modifies the behavior of @code{AC_PROG_LEX}. | |
| It should be a whitespace-separated list of options. Currently there | |
| are only two options, and they are mutually exclusive: | |
| @table @code | |
| @item yywrap | |
| Indicate that the library in @code{LEXLIB} needs to define the function | |
| @code{yywrap}. If a library that defines this function cannot be found, | |
| @code{LEX} will be reset to @samp{:}. | |
| @item noyywrap | |
| Indicate that the library in @code{LEXLIB} does not need to define the | |
| function @code{yywrap}. @command{configure} will not search for it at | |
| all. | |
| @end table | |
| Prior to Autoconf 2.70, @code{AC_PROG_LEX} did not take any arguments, | |
| and its behavior was different from either of the above possibilities: | |
| it would search for a library that defines @code{yywrap}, and would set | |
| @code{LEXLIB} to that library if it finds one. However, if a library | |
| that defines this function could not be found, @code{LEXLIB} would be | |
| left empty and @code{LEX} would @emph{not} be reset. This behavior was | |
| due to a bug, but several packages came to depend on it, so | |
| @code{AC_PROG_LEX} still does this if neither the @code{yywrap} nor the | |
| @code{noyywrap} option is given. | |
| Usage of @code{AC_PROG_LEX} without choosing one of the @code{yywrap} | |
| or @code{noyywrap} options is deprecated. It is usually better to | |
| use @code{noyywrap} and define the @code{yywrap} function yourself, | |
| as this almost always renders the @code{LEXLIB} unnecessary. | |
| @strong{Caution:} As a side-effect of the test, this macro may delete | |
| any file in the configure script's current working directory named | |
| @file{lex.yy.c} or @file{lexyy.c}. | |
| @strong{Caution:} Packages that ship a generated @file{lex.yy.c} | |
| cannot assume that the definition of @code{YYTEXT_POINTER} matches | |
| the code in that file. They also cannot assume that @code{LEXLIB} | |
| provides the library routines required by the code in that file. | |
| If you use Flex to generate @file{lex.yy.c}, you can work around these | |
| limitations by defining @code{yywrap} and @code{main} yourself | |
| (rendering @code{-lfl} unnecessary), and by using either the | |
| @option{--array} or @option{--pointer} options to control how | |
| @code{yytext} is declared. The code generated by Flex is also more | |
| portable than the code generated by historical versions of Lex. | |
| If you have used Flex to generate @file{lex.yy.c}, and especially if | |
| your scanner depends on Flex features, we recommend you use this | |
| Autoconf snippet to prevent the scanner being regenerated with | |
| historical Lex: | |
| @example | |
| AC_PROG_LEX | |
| AS_IF([test "x$LEX" != xflex], | |
| [LEX="$SHELL $missing_dir/missing flex" | |
| AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy]) | |
| AC_SUBST([LEXLIB], [''])]) | |
| @end example | |
| The shell script @command{missing} can be found in the Automake | |
| distribution. | |
| Remember that the user may have supplied an alternate location in | |
| @env{LEX}, so if Flex is required, it is better to check that the user | |
| provided something sufficient by parsing the output of @samp{$LEX | |
| --version} than by simply relying on @code{test "x$LEX" = xflex}. | |
| @end defmac | |
| @anchor{AC_PROG_LN_S} | |
| @defmac AC_PROG_LN_S | |
| @acindex{PROG_LN_S} | |
| @ovindex LN_S | |
| If @samp{ln -s} works on the current file system (the operating system | |
| and file system support symbolic links), set the output variable | |
| @code{LN_S} to @samp{ln -s}; otherwise, if @samp{ln} works, set | |
| @code{LN_S} to @samp{ln}, and otherwise set it to @samp{cp -pR}. | |
| If you make a link in a directory other than the current directory, its | |
| meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely | |
| create links using @samp{$(LN_S)}, either find out which form is used | |
| and adjust the arguments, or always invoke @code{ln} in the directory | |
| where the link is to be created. | |
| In other words, it does not work to do: | |
| @example | |
| $(LN_S) foo /x/bar | |
| @end example | |
| Instead, do: | |
| @example | |
| (cd /x && $(LN_S) foo bar) | |
| @end example | |
| @end defmac | |
| @defmac AC_PROG_RANLIB | |
| @acindex{PROG_RANLIB} | |
| @ovindex RANLIB | |
| @c @caindex prog_RANLIB | |
| @c @caindex prog_ac_ct_RANLIB | |
| Set output variable @code{RANLIB} to @samp{ranlib} if @code{ranlib} | |
| is found, and otherwise to @samp{:} (do nothing). | |
| @end defmac | |
| @defmac AC_PROG_SED | |
| @acindex{PROG_SED} | |
| @ovindex SED | |
| @caindex path_SED | |
| Set output variable @code{SED} to a Sed implementation that conforms to | |
| POSIX and does not have arbitrary length limits. Report an error if no | |
| acceptable Sed is found. @xref{sed, , Limitations of Usual Tools}. | |
| The result of this test can be overridden by setting the @code{SED} variable | |
| and is cached in the @code{ac_cv_path_SED} variable. | |
| @end defmac | |
| @defmac AC_PROG_YACC | |
| @acindex{PROG_YACC} | |
| @evindex YACC | |
| @evindex YFLAGS | |
| @ovindex YACC | |
| @caindex prog_YACC | |
| If @code{bison} is found, set output variable @code{YACC} to @samp{bison | |
| -y}. Otherwise, if @code{byacc} is found, set @code{YACC} to | |
| @samp{byacc}. Otherwise set @code{YACC} to @samp{yacc}. | |
| The result of this test can be influenced by setting the variable | |
| @code{YACC} or the cache variable @code{ac_cv_prog_YACC}. | |
| @end defmac | |
| @node Generic Programs | |
| @subsection Generic Program and File Checks | |
| These macros are used to find programs not covered by the ``particular'' | |
| test macros. If you need to check the behavior of a program as well as | |
| find out whether it is present, you have to write your own test for it | |
| (@pxref{Writing Tests}). By default, these macros use the environment | |
| variable @env{PATH}. If you need to check for a program that might not | |
| be in the user's @env{PATH}, you can pass a modified path to use | |
| instead, like this: | |
| @example | |
| AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd], | |
| [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl | |
| [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc]) | |
| @end example | |
| You are strongly encouraged to declare the @var{variable} passed to | |
| @code{AC_CHECK_PROG} etc.@: as precious. @xref{Setting Output Variables}, | |
| @code{AC_ARG_VAR}, for more details. | |
| @anchor{AC_CHECK_PROG} | |
| @defmac AC_CHECK_PROG (@var{variable}, @var{prog-to-check-for}, @ | |
| @var{value-if-found}, @ovar{value-if-not-found}, @dvar{path, $PATH}, @ | |
| @ovar{reject}) | |
| @acindex{CHECK_PROG} | |
| @caindex prog_@var{variable} | |
| Check whether program @var{prog-to-check-for} exists in @var{path}. If | |
| it is found, set @var{variable} to @var{value-if-found}, otherwise to | |
| @var{value-if-not-found}, if given. Always pass over @var{reject} (an | |
| absolute file name) even if it is the first found in the search path; in | |
| that case, set @var{variable} using the absolute file name of the | |
| @var{prog-to-check-for} found that is not @var{reject}. If | |
| @var{variable} was already set, do nothing. Calls @code{AC_SUBST} for | |
| @var{variable}. The result of this test can be overridden by setting the | |
| @var{variable} variable or the cache variable | |
| @code{ac_cv_prog_@var{variable}}. | |
| @end defmac | |
| @anchor{AC_CHECK_PROGS} | |
| @defmac AC_CHECK_PROGS (@var{variable}, @var{progs-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{CHECK_PROGS} | |
| @caindex prog_@var{variable} | |
| Check for each program in the blank-separated list | |
| @var{progs-to-check-for} existing in the @var{path}. If one is found, set | |
| @var{variable} to the name of that program. Otherwise, continue | |
| checking the next program in the list. If none of the programs in the | |
| list are found, set @var{variable} to @var{value-if-not-found}; if | |
| @var{value-if-not-found} is not specified, the value of @var{variable} | |
| is not changed. Calls @code{AC_SUBST} for @var{variable}. The result of | |
| this test can be overridden by setting the @var{variable} variable or the | |
| cache variable @code{ac_cv_prog_@var{variable}}. | |
| @end defmac | |
| @defmac AC_CHECK_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{CHECK_TARGET_TOOL} | |
| Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for} | |
| with a prefix of the target type as determined by | |
| @code{AC_CANONICAL_TARGET}, followed by a dash (@pxref{Canonicalizing}). | |
| If the tool cannot be found with a prefix, and if the build and target | |
| types are equal, then it is also searched for without a prefix. | |
| As noted in @ref{Specifying Target Triplets}, the | |
| target is rarely specified, because most of the time it is the same | |
| as the host: it is the type of system for which any compiler tool in | |
| the package produces code. What this macro looks for is, | |
| for example, @emph{a tool @r{(assembler, linker, etc.)}@: that the | |
| compiler driver @r{(@command{gcc} for the GNU C Compiler)} | |
| uses to produce objects, archives or executables}. | |
| @end defmac | |
| @defmac AC_CHECK_TOOL (@var{variable}, @var{prog-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{CHECK_TOOL} | |
| @c @caindex prog_@var{VARIABLE} | |
| @c @caindex prog_ac_ct_@var{VARIABLE} | |
| Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for} | |
| with a prefix of the host type as specified by @option{--host}, followed by a | |
| dash. For example, if the user runs | |
| @samp{configure --build=x86_64-gnu --host=aarch64-linux-gnu}, then this call: | |
| @example | |
| AC_CHECK_TOOL([RANLIB], [ranlib], [:]) | |
| @end example | |
| @noindent | |
| sets @code{RANLIB} to @file{aarch64-linux-gnu-ranlib} if that program exists in | |
| @var{path}, or otherwise to @samp{ranlib} if that program exists in | |
| @var{path}, or to @samp{:} if neither program exists. | |
| When cross-compiling, this macro will issue a warning if no program | |
| prefixed with the host type could be found. | |
| For more information, see @ref{Specifying Target Triplets}. | |
| @end defmac | |
| @defmac AC_CHECK_TARGET_TOOLS (@var{variable}, @var{progs-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{CHECK_TARGET_TOOLS} | |
| Like @code{AC_CHECK_TARGET_TOOL}, each of the tools in the list | |
| @var{progs-to-check-for} are checked with a prefix of the target type as | |
| determined by @code{AC_CANONICAL_TARGET}, followed by a dash | |
| (@pxref{Canonicalizing}). If none of the tools can be found with a | |
| prefix, and if the build and target types are equal, then the first one | |
| without a prefix is used. If a tool is found, set @var{variable} to | |
| the name of that program. If none of the tools in the list are found, | |
| set @var{variable} to @var{value-if-not-found}; if @var{value-if-not-found} | |
| is not specified, the value of @var{variable} is not changed. Calls | |
| @code{AC_SUBST} for @var{variable}. | |
| @end defmac | |
| @defmac AC_CHECK_TOOLS (@var{variable}, @var{progs-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{CHECK_TOOLS} | |
| Like @code{AC_CHECK_TOOL}, each of the tools in the list | |
| @var{progs-to-check-for} are checked with a prefix of the host type as | |
| determined by @code{AC_CANONICAL_HOST}, followed by a dash | |
| (@pxref{Canonicalizing}). If none of the tools can be found with a | |
| prefix, then the first one without a prefix is used. If a tool is found, | |
| set @var{variable} to the name of that program. If none of the tools in | |
| the list are found, set @var{variable} to @var{value-if-not-found}; if | |
| @var{value-if-not-found} is not specified, the value of @var{variable} | |
| is not changed. Calls @code{AC_SUBST} for @var{variable}. | |
| When cross-compiling, this macro will issue a warning if no program | |
| prefixed with the host type could be found. | |
| For more information, see @ref{Specifying Target Triplets}. | |
| @end defmac | |
| @anchor{AC_PATH_PROG} | |
| @defmac AC_PATH_PROG (@var{variable}, @var{prog-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{PATH_PROG} | |
| @caindex path_@var{variable} | |
| Like @code{AC_CHECK_PROG}, but set @var{variable} to the absolute | |
| name of @var{prog-to-check-for} if found. The result of this test | |
| can be overridden by setting the @var{variable} variable. A positive | |
| result of this test is cached in the @code{ac_cv_path_@var{variable}} | |
| variable. | |
| @end defmac | |
| @anchor{AC_PATH_PROGS} | |
| @defmac AC_PATH_PROGS (@var{variable}, @var{progs-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{PATH_PROGS} | |
| @caindex path_@var{variable} | |
| Like @code{AC_CHECK_PROGS}, but if any of @var{progs-to-check-for} | |
| are found, set @var{variable} to the absolute name of the program | |
| found. The result of this test can be overridden by setting the | |
| @var{variable} variable. A positive result of this test is cached in | |
| the @code{ac_cv_path_@var{variable}} variable. | |
| @end defmac | |
| @defmac AC_PATH_PROGS_FEATURE_CHECK (@var{variable}, @ | |
| @var{progs-to-check-for}, @var{feature-test}, @ | |
| @ovar{action-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{PATH_PROGS_FEATURE_CHECK} | |
| @caindex path_@var{variable} | |
| @vrindex ac_path_@var{variable} | |
| @vrindex ac_path_@var{variable}_found | |
| This macro was introduced in Autoconf 2.62. If @var{variable} is not | |
| empty, then set the cache variable @code{ac_cv_path_@var{variable}} to | |
| its value. Otherwise, check for each program in the blank-separated | |
| list @var{progs-to-check-for} existing in @var{path}. For each program | |
| found, execute @var{feature-test} with @code{ac_path_@var{variable}} | |
| set to the absolute name of the candidate program. If no invocation of | |
| @var{feature-test} sets the shell variable | |
| @code{ac_cv_path_@var{variable}}, then @var{action-if-not-found} is | |
| executed. @var{feature-test} will be run even when | |
| @code{ac_cv_path_@var{variable}} is set, to provide the ability to | |
| choose a better candidate found later in @var{path}; to accept the | |
| current setting and bypass all further checks, @var{feature-test} can | |
| execute @code{ac_path_@var{variable}_found=:}. | |
| Note that this macro has some subtle differences from | |
| @code{AC_CHECK_PROGS}. It is designed to be run inside | |
| @code{AC_CACHE_VAL}, therefore, it should have no side effects. In | |
| particular, @var{variable} is not set to the final value of | |
| @code{ac_cv_path_@var{variable}}, nor is @code{AC_SUBST} automatically | |
| run. Also, on failure, any action can be performed, whereas | |
| @code{AC_CHECK_PROGS} only performs | |
| @code{@var{variable}=@var{value-if-not-found}}. | |
| Here is an example that searches for an implementation of @command{m4} that | |
| supports the @code{indir} builtin, even if it goes by the name | |
| @command{gm4} or is not the first implementation on @env{PATH}. | |
| @example | |
| AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4], | |
| [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4], | |
| [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4` | |
| test "x$m4out" = x0 \ | |
| && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]], | |
| [AC_MSG_ERROR([could not find m4 that supports indir])])]) | |
| AC_SUBST([M4], [$ac_cv_path_M4]) | |
| @end example | |
| @end defmac | |
| @defmac AC_PATH_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{PATH_TARGET_TOOL} | |
| Like @code{AC_CHECK_TARGET_TOOL}, but set @var{variable} to the absolute | |
| name of the program if it is found. | |
| @end defmac | |
| @defmac AC_PATH_TOOL (@var{variable}, @var{prog-to-check-for}, @ | |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) | |
| @acindex{PATH_TOOL} | |
| Like @code{AC_CHECK_TOOL}, but set @var{variable} to the absolute | |
| name of the program if it is found. | |
| When cross-compiling, this macro will issue a warning if no program | |
| prefixed with the host type could be found. | |
| For more information, see @ref{Specifying Target Triplets}. | |
| @end defmac | |
| @node Files | |
| @section Files | |
| @cindex File, checking | |
| You might also need to check for the existence of files. Before using | |
| these macros, ask yourself whether a runtime test might not be a better | |
| solution. Be aware that, like most Autoconf macros, they test a feature | |
| of the host machine, and therefore, they die when cross-compiling. | |
| @defmac AC_CHECK_FILE (@var{file}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{CHECK_FILE} | |
| @caindex file_@var{file} | |
| Check whether file @var{file} exists on the native system. If it is | |
| found, execute @var{action-if-found}, otherwise do | |
| @var{action-if-not-found}, if given. Cache the result of this test | |
| in the @code{ac_cv_file_@var{file}} variable, with characters not | |
| suitable for a variable name mapped to underscores. | |
| @end defmac | |
| @defmac AC_CHECK_FILES (@var{files}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{CHECK_FILES} | |
| @caindex file_@var{file} | |
| For each file listed in @var{files}, execute @code{AC_CHECK_FILE} | |
| and perform either @var{action-if-found} or @var{action-if-not-found}. | |
| Like @code{AC_CHECK_FILE}, this defines @samp{HAVE_@var{file}} | |
| (@pxref{Standard Symbols}) for each file found and caches the results of | |
| each test in the @code{ac_cv_file_@var{file}} variable, with characters | |
| not suitable for a variable name mapped to underscores. | |
| @end defmac | |
| @node Libraries | |
| @section Library Files | |
| @cindex Library, checking | |
| The following macros check for the presence of certain C, C++, Fortran, | |
| or Go library archive files. | |
| @anchor{AC_CHECK_LIB} | |
| @defmac AC_CHECK_LIB (@var{library}, @var{function}, @ | |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) | |
| @acindex{CHECK_LIB} | |
| @caindex lib_@var{library}_@var{function} | |
| Test whether the library @var{library} is available by trying to link | |
| a test program that calls function @var{function} with the library. | |
| @var{function} should be a function provided by the library. | |
| Use the base | |
| name of the library; e.g., to check for @option{-lmp}, use @samp{mp} as | |
| the @var{library} argument. | |
| @var{action-if-found} is a list of shell commands to run if the link | |
| with the library succeeds; @var{action-if-not-found} is a list of shell | |
| commands to run if the link fails. If @var{action-if-found} is not | |
| specified, the default action prepends @option{-l@var{library}} to | |
| @code{LIBS} and defines @samp{HAVE_LIB@var{library}} (in all | |
| capitals). This macro is intended to support building @code{LIBS} in | |
| a right-to-left (least-dependent to most-dependent) fashion such that | |
| library dependencies are satisfied as a natural side effect of | |
| consecutive tests. Linkers are sensitive to library ordering | |
| so the order in which @code{LIBS} is generated is important to reliable | |
| detection of libraries. | |
| If linking with @var{library} results in unresolved symbols that would | |
| be resolved by linking with additional libraries, give those libraries | |
| as the @var{other-libraries} argument, separated by spaces: | |
| e.g., @option{-lXt -lX11}. Otherwise, this macro may fail to detect | |
| that @var{library} is present, because linking the test program can | |
| fail with unresolved symbols. The @var{other-libraries} argument | |
| should be limited to cases where it is desirable to test for one library | |
| in the presence of another that is not already in @code{LIBS}. | |
| @code{AC_CHECK_LIB} requires some care in usage, and should be avoided | |
| in some common cases. Many standard functions like @code{gethostbyname} | |
| appear in the standard C library on some hosts, and in special libraries | |
| like @code{nsl} on other hosts. On some hosts the special libraries | |
| contain variant implementations that you may not want to use. These | |
| days it is normally better to use @code{AC_SEARCH_LIBS([gethostbyname], | |
| [nsl])} instead of @code{AC_CHECK_LIB([nsl], [gethostbyname])}. | |
| The result of this test is cached in the | |
| @code{ac_cv_lib_@var{library}_@var{function}} variable. | |
| @end defmac | |
| @anchor{AC_SEARCH_LIBS} | |
| @defmac AC_SEARCH_LIBS (@var{function}, @var{search-libs}, @ | |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) | |
| @acindex{SEARCH_LIBS} | |
| @caindex search_@var{function} | |
| Search for a library defining @var{function} if it's not already | |
| available. This equates to calling | |
| @samp{AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])])} first with | |
| no libraries, then for each library listed in @var{search-libs}. | |
| Prepend @option{-l@var{library}} to @code{LIBS} for the first library found | |
| to contain @var{function}, and run @var{action-if-found}. If the | |
| function is not found, run @var{action-if-not-found}. | |
| If linking with @var{library} results in unresolved symbols that would | |
| be resolved by linking with additional libraries, give those libraries | |
| as the @var{other-libraries} argument, separated by spaces: | |
| e.g., @option{-lXt -lX11}. Otherwise, this macro fails to detect | |
| that @var{function} is present, because linking the test program | |
| always fails with unresolved symbols. | |
| The result of this test is cached in the | |
| @code{ac_cv_search_@var{function}} variable as @samp{none required} if | |
| @var{function} is already available, as @samp{no} if no library | |
| containing @var{function} was found, otherwise as the | |
| @option{-l@var{library}} option that needs to be prepended to @code{LIBS}. | |
| @end defmac | |
| @node Library Functions | |
| @section Library Functions | |
| The following macros check for particular C library functions. | |
| If there is no macro specifically defined to check for a function you need, | |
| and you don't need to check for any special properties of | |
| it, then you can use one of the general function-check macros. | |
| @menu | |
| * Function Portability:: Pitfalls with usual functions | |
| * Particular Functions:: Special handling to find certain functions | |
| * Generic Functions:: How to find other functions | |
| @end menu | |
| @node Function Portability | |
| @subsection Portability of C Functions | |
| @cindex Portability of C functions | |
| @cindex C function portability | |
| Most usual functions can either be missing, or be buggy, or be limited | |
| on some architectures. This section tries to make an inventory of these | |
| portability issues. By definition, this list always requires | |
| additions. A much more complete list is maintained by the Gnulib | |
| project (@pxref{Gnulib}), covering @ref{Function Substitutes, , | |
| Current POSIX Functions, gnulib, Gnulib}, @ref{Legacy Function | |
| Substitutes, , Legacy Functions, gnulib, Gnulib}, and @ref{Glibc | |
| Function Substitutes, , Glibc Functions, gnulib, Gnulib}. Please | |
| help us keep the Gnulib list as complete as possible. | |
| @table @asis | |
| @item @code{exit} | |
| @c @fuindex exit | |
| @prindex @code{exit} | |
| On ancient hosts, @code{exit} returned @code{int}. | |
| This is because @code{exit} predates @code{void}, and there was a long | |
| tradition of it returning @code{int}. | |
| On current hosts, the problem more likely is that @code{exit} is not | |
| declared, due to C++ problems of some sort or another. For this reason | |
| we suggest that test programs not invoke @code{exit}, but return from | |
| @code{main} instead. | |
| @item @code{malloc} | |
| @c @fuindex malloc | |
| @prindex @code{malloc} | |
| The C standard says a successful call @code{malloc (0)} is implementation | |
| dependent. It can return either @code{NULL} or a new non-null pointer. | |
| The latter is more common (e.g., the GNU C Library) but is by | |
| no means universal. @code{AC_FUNC_MALLOC} | |
| can be used to insist on non-@code{NULL} (@pxref{Particular Functions}). | |
| @item @code{putenv} | |
| @c @fuindex putenv | |
| @prindex @code{putenv} | |
| POSIX prefers @code{setenv} to @code{putenv}; among other things, | |
| @code{putenv} is not required of all POSIX implementations, but | |
| @code{setenv} is. | |
| POSIX specifies that @code{putenv} puts the given string directly in | |
| @code{environ}, but some systems make a copy of it instead (e.g., | |
| glibc 2.0, or BSD). And when a copy is made, @code{unsetenv} might | |
| not free it, causing a memory leak (e.g., FreeBSD 4). | |
| On some systems @code{putenv ("FOO")} removes @samp{FOO} from the | |
| environment, but this is not standard usage and it dumps core | |
| on some systems (e.g., AIX). | |
| On MinGW, a call @code{putenv ("FOO=")} removes @samp{FOO} from the | |
| environment, rather than inserting it with an empty value. | |
| @item @code{realloc} | |
| @c @fuindex realloc | |
| @prindex @code{realloc} | |
| It is problematic to call @code{realloc} with a zero size. | |
| The C standard says @code{realloc (NULL, 0)} is equivalent to | |
| @code{malloc (0)}, which means one cannot portably tell whether the call | |
| has succeeded if it returns a null pointer. If @code{ptr} is non-null, | |
| the C standard says @code{realloc (ptr, 0)} has undefined behavior. | |
| The @code{AC_FUNC_REALLOC} macro avoids some of these portability issues. | |
| @xref{Particular Functions}. | |
| @item @code{signal} handler | |
| @c @fuindex signal | |
| @prindex @code{signal} | |
| @prindex @code{sigaction} | |
| In most cases, it is more robust to use @code{sigaction} when it is | |
| available, rather than @code{signal}. | |
| @item @code{snprintf} | |
| @c @fuindex snprintf | |
| @prindex @code{snprintf} | |
| @c @fuindex vsnprintf | |
| @prindex @code{vsnprintf} | |
| In C99 and later, if the output array isn't big enough | |
| and if no other errors occur, @code{snprintf} and @code{vsnprintf} | |
| truncate the output and return the number of bytes that ought to have | |
| been produced. Some older systems, notably Microsoft Windows before | |
| Visual Studio 2015 and Windows 10, do not null-terminate the output | |
| and return @minus{}1 instead. | |
| Portable code can check the return value of @code{snprintf (buf, sizeof | |
| buf, ...)}: if the value is negative or is not less than @code{sizeof | |
| buf}, an error occurred and the contents of @code{buf} can be ignored. | |
| Alternatively, one of the Gnulib modules related to @code{snprintf} can | |
| be used. @xref{Gnulib}. | |
| @item @code{strerror_r} | |
| @c @fuindex strerror_r | |
| @prindex @code{strerror_r} | |
| POSIX specifies that @code{strerror_r} returns an @code{int}, but many | |
| systems (e.g., the GNU C Library) provide a | |
| different version returning a @code{char *}. @code{AC_FUNC_STRERROR_R} | |
| can detect which is in use (@pxref{Particular Functions}). | |
| @item @code{strnlen} | |
| @c @fuindex strnlen | |
| @prindex @code{strnlen} | |
| Android 5.0's strnlen was broken, because it assumed the addressed array | |
| always had at least the specified number of bytes. For example, | |
| @code{strnlen ("", SIZE_MAX)} should return 0 but on Android 5.0 it | |
| crashed. | |
| AIX 4.3 provided a broken version which produces the | |
| following results: | |
| @example | |
| strnlen ("foobar", 0) = 0 | |
| strnlen ("foobar", 1) = 3 | |
| strnlen ("foobar", 2) = 2 | |
| strnlen ("foobar", 3) = 1 | |
| strnlen ("foobar", 4) = 0 | |
| strnlen ("foobar", 5) = 6 | |
| strnlen ("foobar", 6) = 6 | |
| strnlen ("foobar", 7) = 6 | |
| strnlen ("foobar", 8) = 6 | |
| strnlen ("foobar", 9) = 6 | |
| @end example | |
| @item @code{sysconf} | |
| @c @fuindex sysconf | |
| @prindex @code{sysconf} | |
| @code{_SC_PAGESIZE} is standard, but some older systems (e.g., HP-UX | |
| 9) have @code{_SC_PAGE_SIZE} instead. This can be tested with | |
| @code{#ifdef}. | |
| @item @code{unlink} | |
| @c @fuindex unlink | |
| @prindex @code{unlink} | |
| The POSIX spec says that @code{unlink} causes the given file to be | |
| removed only after there are no more open file handles for it. Some | |
| non-POSIX hosts have trouble with this requirement, though, | |
| and some DOS variants even corrupt the file system. | |
| @item @code{unsetenv} | |
| @c @fuindex unsetenv | |
| @prindex @code{unsetenv} | |
| On MinGW, @code{unsetenv} is not available, but a variable @samp{FOO} | |
| can be removed with a call @code{putenv ("FOO=")}, as described under | |
| @code{putenv} above. | |
| @item @code{va_copy} | |
| @c @fuindex va_copy | |
| @prindex @code{va_copy} | |
| C99 and later provide @code{va_copy} for copying | |
| @code{va_list} variables. It may be available in older environments | |
| too, though possibly as @code{__va_copy} (e.g., @command{gcc} in strict | |
| pre-C99 mode). These can be tested with @code{#ifdef}. A fallback to | |
| @code{memcpy (&dst, &src, sizeof (va_list))} gives maximum | |
| portability. | |
| @item @code{va_list} | |
| @c @fuindex va_list | |
| @prindex @code{va_list} | |
| @code{va_list} is not necessarily just a pointer. It can be a | |
| @code{struct}, which means @code{NULL} is not portable. | |
| Or it can be an array, which means as a function parameter it can be | |
| effectively call-by-reference and library routines might modify the | |
| value back in the caller. | |
| @item Signed @code{>>} | |
| Normally the C @code{>>} right shift of a signed type replicates the | |
| high bit, giving a so-called ``arithmetic'' shift. But care should be | |
| taken since Standard C doesn't require that behavior. On a few platforms | |
| (e.g., Cray C by default) zero bits are shifted in, the same as a shift of an | |
| unsigned type. | |
| @item Integer @code{/} | |
| C divides signed integers by truncating their quotient toward zero, | |
| yielding the same result as Fortran. However, before C99 the standard | |
| allowed C implementations to take the floor or ceiling of the quotient | |
| in some cases. Hardly any implementations took advantage of this | |
| freedom, though, and it's probably not worth worrying about this issue | |
| nowadays. | |
| @end table | |
| @node Particular Functions | |
| @subsection Particular Function Checks | |
| @cindex Function, checking | |
| These macros check for particular C functions---whether they exist, and | |
| in some cases how they respond when given certain arguments. | |
| @anchor{AC_FUNC_ALLOCA} | |
| @defmac AC_FUNC_ALLOCA | |
| @acindex{FUNC_ALLOCA} | |
| @cvindex C_ALLOCA | |
| @cvindex HAVE_ALLOCA_H | |
| @ovindex ALLOCA | |
| @c @fuindex alloca | |
| @prindex @code{alloca} | |
| @hdrindex{alloca.h} | |
| @c @caindex working_alloca_h | |
| Check for the @code{alloca} function. Define @code{HAVE_ALLOCA_H} if | |
| @file{alloca.h} defines a working @code{alloca}. If not, look for a | |
| builtin alternative. If either method succeeds, define | |
| @code{HAVE_ALLOCA}. Otherwise, set the output variable @code{ALLOCA} to | |
| @samp{$@{LIBOBJDIR@}alloca.o} and define | |
| @code{C_ALLOCA} (so programs can periodically call @samp{alloca (0)} to | |
| garbage collect). This variable is separate from @code{LIBOBJS} so | |
| multiple programs can share the value of @code{ALLOCA} without needing | |
| to create an actual library, in case only some of them use the code in | |
| @code{LIBOBJS}. The @samp{$@{LIBOBJDIR@}} prefix serves the same | |
| purpose as in @code{LIBOBJS} (@pxref{AC_LIBOBJ vs LIBOBJS}). | |
| Source files that use @code{alloca} should start with a piece of code | |
| like the following, to declare it properly. | |
| @example | |
| @group | |
| #include <stdlib.h> | |
| #include <stddef.h> | |
| #ifdef HAVE_ALLOCA_H | |
| # include <alloca.h> | |
| #elif !defined alloca | |
| # ifdef __GNUC__ | |
| # define alloca __builtin_alloca | |
| # elif defined _MSC_VER | |
| # include <malloc.h> | |
| # define alloca _alloca | |
| # elif !defined HAVE_ALLOCA | |
| # ifdef __cplusplus | |
| extern "C" | |
| # endif | |
| void *alloca (size_t); | |
| # endif | |
| #endif | |
| @end group | |
| @end example | |
| If you don't want to maintain this piece of code in your package manually, | |
| you can instead use the Gnulib module @code{alloca-opt} or @code{alloca}. | |
| @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_CHOWN | |
| @acindex{FUNC_CHOWN} | |
| @cvindex HAVE_CHOWN | |
| @c @fuindex chown | |
| @prindex @code{chown} | |
| @caindex func_chown_works | |
| If the @code{chown} function is available and works (in particular, it | |
| should accept @option{-1} for @code{uid} and @code{gid}), define | |
| @code{HAVE_CHOWN}. The result of this macro is cached in the | |
| @code{ac_cv_func_chown_works} variable. | |
| If you want a workaround, that is, a @code{chown} function that is | |
| available and works, you can use the Gnulib module @code{chown}. | |
| @xref{Gnulib}. | |
| @end defmac | |
| @anchor{AC_FUNC_CLOSEDIR_VOID} | |
| @defmac AC_FUNC_CLOSEDIR_VOID | |
| @acindex{FUNC_CLOSEDIR_VOID} | |
| @cvindex CLOSEDIR_VOID | |
| @c @fuindex closedir | |
| @prindex @code{closedir} | |
| @caindex func_closedir_void | |
| If the @code{closedir} function does not return a meaningful value, | |
| define @code{CLOSEDIR_VOID}. Otherwise, callers ought to check its | |
| return value for an error indicator. | |
| Currently this test is implemented by running a test program. When | |
| cross compiling the pessimistic assumption that @code{closedir} does not | |
| return a meaningful value is made. | |
| The result of this macro is cached in the @code{ac_cv_func_closedir_void} | |
| variable. | |
| This macro is obsolescent, as @code{closedir} returns a meaningful value | |
| on current systems. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_FUNC_ERROR_AT_LINE | |
| @acindex{FUNC_ERROR_AT_LINE} | |
| @c @fuindex error_at_line | |
| @prindex @code{error_at_line} | |
| @caindex lib_error_at_line | |
| If the @code{error_at_line} function is not found, require an | |
| @code{AC_LIBOBJ} replacement of @samp{error}. | |
| The result of this macro is cached in the @code{ac_cv_lib_error_at_line} | |
| variable. | |
| The @code{AC_FUNC_ERROR_AT_LINE} macro is obsolescent. New programs | |
| should use Gnulib's @code{error} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_FNMATCH | |
| @acindex{FUNC_FNMATCH} | |
| @c @fuindex fnmatch | |
| @prindex @code{fnmatch} | |
| @caindex func_fnmatch_works | |
| If the @code{fnmatch} function conforms to POSIX, define | |
| @code{HAVE_FNMATCH}. | |
| Unlike the other specific | |
| @code{AC_FUNC} macros, @code{AC_FUNC_FNMATCH} does not replace a | |
| broken/missing @code{fnmatch}. This is for historical reasons. | |
| See @code{AC_REPLACE_FNMATCH} below. | |
| The result of this macro is cached in the @code{ac_cv_func_fnmatch_works} | |
| variable. | |
| This macro is obsolescent. New programs should use Gnulib's | |
| @code{fnmatch-posix} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_FNMATCH_GNU | |
| @acindex{FUNC_FNMATCH_GNU} | |
| @c @fuindex fnmatch | |
| @prindex @code{fnmatch} | |
| @caindex func_fnmatch_gnu | |
| Behave like @code{AC_REPLACE_FNMATCH} (@emph{replace}) but also test | |
| whether @code{fnmatch} supports GNU extensions. Detect common | |
| implementation bugs, for example, the bugs in the GNU C | |
| Library 2.1. | |
| The result of this macro is cached in the @code{ac_cv_func_fnmatch_gnu} | |
| variable. | |
| This macro is obsolescent. New programs should use Gnulib's | |
| @code{fnmatch-gnu} module. @xref{Gnulib}. | |
| @end defmac | |
| @anchor{AC_FUNC_FORK} | |
| @defmac AC_FUNC_FORK | |
| @acindex{FUNC_FORK} | |
| @cvindex HAVE_VFORK_H | |
| @cvindex HAVE_WORKING_FORK | |
| @cvindex HAVE_WORKING_VFORK | |
| @cvindex vfork | |
| @c @fuindex fork | |
| @prindex @code{fork} | |
| @c @fuindex vfork | |
| @prindex @code{vfork} | |
| @hdrindex{vfork.h} | |
| @c @caindex func_fork | |
| @c @caindex func_fork_works | |
| This macro checks for the @code{fork} and @code{vfork} functions. If a | |
| working @code{fork} is found, define @code{HAVE_WORKING_FORK}. This macro | |
| checks whether @code{fork} is just a stub by trying to run it. | |
| If @file{vfork.h} is found, define @code{HAVE_VFORK_H}. If a working | |
| @code{vfork} is found, define @code{HAVE_WORKING_VFORK}. Otherwise, | |
| define @code{vfork} to be @code{fork} for backward compatibility with | |
| previous versions of @command{autoconf}. This macro checks for several known | |
| errors in implementations of @code{vfork} and considers the system to not | |
| have a working @code{vfork} if it detects any of them. | |
| Since this macro defines @code{vfork} only for backward compatibility with | |
| previous versions of @command{autoconf} you're encouraged to define it | |
| yourself in new code: | |
| @example | |
| @group | |
| #ifndef HAVE_WORKING_VFORK | |
| # define vfork fork | |
| #endif | |
| @end group | |
| @end example | |
| The results of this macro are cached in the @code{ac_cv_func_fork_works} | |
| and @code{ac_cv_func_vfork_works} variables. In order to override the | |
| test, you also need to set the @code{ac_cv_func_fork} and | |
| @code{ac_cv_func_vfork} variables. | |
| @end defmac | |
| @anchor{AC_FUNC_FSEEKO} | |
| @defmac AC_FUNC_FSEEKO | |
| @acindex{FUNC_FSEEKO} | |
| @cvindex _LARGEFILE_SOURCE | |
| @cvindex HAVE_FSEEKO | |
| @c @fuindex fseeko | |
| @prindex @code{fseeko} | |
| @c @fuindex ftello | |
| @prindex @code{ftello} | |
| @c @caindex sys_largefile_source | |
| If the @code{fseeko} and @code{ftello} functions are available, define | |
| @code{HAVE_FSEEKO}. Define @code{_LARGEFILE_SOURCE} if necessary to | |
| make the prototype visible. | |
| Configure scripts that use @code{AC_FUNC_FSEEKO} should normally also | |
| use @code{AC_SYS_LARGEFILE} to ensure that @code{off_t} can represent | |
| all supported file sizes. @xref{AC_SYS_LARGEFILE}. | |
| The Gnulib module @code{fseeko} invokes @code{AC_FUNC_FSEEKO} | |
| and also contains workarounds for other portability problems of | |
| @code{fseeko}. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_GETGROUPS | |
| @acindex{FUNC_GETGROUPS} | |
| @cvindex HAVE_GETGROUPS | |
| @ovindex GETGROUPS_LIB | |
| @c @fuindex getgroups | |
| @prindex @code{getgroups} | |
| @caindex func_getgroups_works | |
| Perform all the checks performed by @code{AC_TYPE_GETGROUPS} | |
| (@pxref{AC_TYPE_GETGROUPS}). | |
| Then, if the @code{getgroups} function is available | |
| and known to work correctly, define @code{HAVE_GETGROUPS}. | |
| Set the output variable @code{GETGROUPS_LIB} to any libraries | |
| needed to get that function. | |
| This macro relies on a list of systems with known, serious bugs in | |
| @code{getgroups}. If this list mis-identifies your system's | |
| @code{getgroups} as buggy, or as not buggy, you can override it by | |
| setting the cache variable @code{ac_cv_func_getgroups_works} in a | |
| @file{config.site} file (@pxref{Site Defaults}). Please also report the | |
| error to @email{bug-autoconf@@gnu.org, the Autoconf Bugs mailing list}. | |
| The Gnulib module @code{getgroups} provides workarounds for additional, | |
| less severe portability problems with this function. | |
| @end defmac | |
| @anchor{AC_FUNC_GETLOADAVG} | |
| @defmac AC_FUNC_GETLOADAVG | |
| @acindex{FUNC_GETLOADAVG} | |
| @cvindex SVR4 | |
| @cvindex DGUX | |
| @cvindex UMAX | |
| @cvindex UMAX4_3 | |
| @cvindex HAVE_NLIST_H | |
| @cvindex NLIST_NAME_UNION | |
| @cvindex GETLOADAVG_PRIVILEGED | |
| @cvindex NEED_SETGID | |
| @cvindex C_GETLOADAVG | |
| @ovindex LIBOBJS | |
| @ovindex NEED_SETGID | |
| @ovindex KMEM_GROUP | |
| @ovindex GETLOADAVG_LIBS | |
| @c @fuindex getloadavg | |
| @prindex @code{getloadavg} | |
| Check how to get the system load averages. To perform its tests | |
| properly, this macro needs the file @file{getloadavg.c}; therefore, be | |
| sure to set the @code{AC_LIBOBJ} replacement directory properly (see | |
| @ref{Generic Functions}, @code{AC_CONFIG_LIBOBJ_DIR}). | |
| If the system has the @code{getloadavg} function, define | |
| @code{HAVE_GETLOADAVG}, and set @code{GETLOADAVG_LIBS} to any libraries | |
| necessary to get that function. Also add @code{GETLOADAVG_LIBS} to | |
| @code{LIBS}. Otherwise, require an @code{AC_LIBOBJ} replacement for | |
| @samp{getloadavg} and possibly define several other C preprocessor | |
| macros and output variables: | |
| @enumerate | |
| @item | |
| Define @code{C_GETLOADAVG}. | |
| @item | |
| Define @code{SVR4}, @code{DGUX}, @code{UMAX}, or @code{UMAX4_3} if on | |
| those systems. | |
| @item | |
| @hdrindex{nlist.h} | |
| If @file{nlist.h} is found, define @code{HAVE_NLIST_H}. | |
| @item | |
| If @samp{struct nlist} has an @samp{n_un.n_name} member, define | |
| @code{HAVE_STRUCT_NLIST_N_UN_N_NAME}. The obsolete symbol | |
| @code{NLIST_NAME_UNION} is still defined, but do not depend upon it. | |
| @item | |
| Programs may need to be installed set-group-ID (or set-user-ID) for | |
| @code{getloadavg} to work. In this case, define | |
| @code{GETLOADAVG_PRIVILEGED}, set the output variable @code{NEED_SETGID} | |
| to @samp{true} (and otherwise to @samp{false}), and set | |
| @code{KMEM_GROUP} to the name of the group that should own the installed | |
| program. | |
| @end enumerate | |
| The @code{AC_FUNC_GETLOADAVG} macro is obsolescent. New programs should | |
| use Gnulib's @code{getloadavg} module. @xref{Gnulib}. | |
| @end defmac | |
| @anchor{AC_FUNC_GETMNTENT} | |
| @defmac AC_FUNC_GETMNTENT | |
| @acindex{FUNC_GETMNTENT} | |
| @cvindex HAVE_GETMNTENT | |
| @c @fuindex getmntent | |
| @prindex @code{getmntent} | |
| @caindex search_getmntent | |
| Check for @code{getmntent} in the standard C library, and then in the | |
| @file{sun}, @file{seq}, and @file{gen} libraries. Then, if | |
| @code{getmntent} is available, define @code{HAVE_GETMNTENT} and set | |
| @code{ac_cv_func_getmntent} to @code{yes}. Otherwise set | |
| @code{ac_cv_func_getmntent} to @code{no}. | |
| The result of this macro can be overridden by setting the cache variable | |
| @code{ac_cv_search_getmntent}. | |
| The @code{AC_FUNC_GETMNTENT} macro is obsolescent. New programs should | |
| use Gnulib's @code{mountlist} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_GETPGRP | |
| @acindex{FUNC_GETPGRP} | |
| @cvindex GETPGRP_VOID | |
| @c @fuindex getpgid | |
| @c @fuindex getpgrp | |
| @prindex @code{getpgid} | |
| @prindex @code{getpgrp} | |
| @caindex func_getpgrp_void | |
| Define @code{GETPGRP_VOID} if it is an error to pass 0 to | |
| @code{getpgrp}; this is the POSIX behavior. On older BSD | |
| systems, you must pass 0 to @code{getpgrp}, as it takes an argument and | |
| behaves like POSIX's @code{getpgid}. | |
| @example | |
| #ifdef GETPGRP_VOID | |
| pid = getpgrp (); | |
| #else | |
| pid = getpgrp (0); | |
| #endif | |
| @end example | |
| This macro does not check whether | |
| @code{getpgrp} exists at all; if you need to work in that situation, | |
| first call @code{AC_CHECK_FUNC} for @code{getpgrp}. | |
| The result of this macro is cached in the @code{ac_cv_func_getpgrp_void} | |
| variable. | |
| This macro is obsolescent, as current systems have a @code{getpgrp} | |
| whose signature conforms to POSIX@. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK | |
| @acindex{FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} | |
| @cvindex LSTAT_FOLLOWS_SLASHED_SYMLINK | |
| @c @fuindex lstat | |
| @prindex @code{lstat} | |
| @caindex func_lstat_dereferences_slashed_symlink | |
| If @file{link} is a symbolic link, then @code{lstat} should treat | |
| @file{link/} the same as @file{link/.}. However, many older | |
| @code{lstat} implementations incorrectly ignore trailing slashes. | |
| It is safe to assume that if @code{lstat} incorrectly ignores | |
| trailing slashes, then other symbolic-link-aware functions like | |
| @code{unlink} also incorrectly ignore trailing slashes. | |
| If @code{lstat} behaves properly, define | |
| @code{LSTAT_FOLLOWS_SLASHED_SYMLINK}, otherwise require an | |
| @code{AC_LIBOBJ} replacement of @code{lstat}. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_lstat_dereferences_slashed_symlink} variable. | |
| The @code{AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} macro is obsolescent. | |
| New programs should use Gnulib's @code{lstat} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_MALLOC | |
| @acindex{FUNC_MALLOC} | |
| @cvindex HAVE_MALLOC | |
| @cvindex malloc | |
| @c @fuindex malloc | |
| @prindex @code{malloc} | |
| @caindex func_malloc_0_nonnull | |
| If the @code{malloc} function is compatible with the GNU C | |
| library @code{malloc} (i.e., @samp{malloc (0)} returns a valid | |
| pointer), define @code{HAVE_MALLOC} to 1. Otherwise define | |
| @code{HAVE_MALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for | |
| @samp{malloc}, and define @code{malloc} to @code{rpl_malloc} so that the | |
| native @code{malloc} is not used in the main project. | |
| Typically, the replacement file @file{malloc.c} should look like (note | |
| the @samp{#undef malloc}): | |
| @verbatim | |
| #include <config.h> | |
| #undef malloc | |
| #include <stdlib.h> | |
| /* Allocate an N-byte block of memory from the heap. | |
| If N is zero, allocate a 1-byte block. */ | |
| void * | |
| rpl_malloc (size_t n) | |
| { | |
| if (n == 0) | |
| n = 1; | |
| return malloc (n); | |
| } | |
| @end verbatim | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_malloc_0_nonnull} variable. | |
| The result might contain spaces, e.g., @code{guessing yes}. | |
| If you don't want to maintain a @code{malloc.c} file in your package | |
| manually, you can instead use the Gnulib module @code{malloc-gnu}. | |
| @end defmac | |
| @defmac AC_FUNC_MBRTOWC | |
| @acindex{FUNC_MBRTOWC} | |
| @cvindex HAVE_MBRTOWC | |
| @c @fuindex mbrtowc | |
| @prindex @code{mbrtowc} | |
| @caindex func_mbrtowc | |
| Define @code{HAVE_MBRTOWC} to 1 if the function @code{mbrtowc} and the | |
| type @code{mbstate_t} are properly declared. | |
| The result of this macro is cached in the @code{ac_cv_func_mbrtowc} | |
| variable. | |
| The Gnulib module @code{mbrtowc} not only ensures that the | |
| function is declared, but also works around other portability | |
| problems of this function. | |
| @end defmac | |
| @defmac AC_FUNC_MEMCMP | |
| @acindex{FUNC_MEMCMP} | |
| @ovindex LIBOBJS | |
| @c @fuindex memcmp | |
| @prindex @code{memcmp} | |
| @caindex func_memcmp_working | |
| If the @code{memcmp} function is not available or does not work, require an | |
| @code{AC_LIBOBJ} replacement for @samp{memcmp}. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_memcmp_working} variable. | |
| This macro is obsolescent, as current systems have a working | |
| @code{memcmp}. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_FUNC_MKTIME | |
| @acindex{FUNC_MKTIME} | |
| @ovindex LIBOBJS | |
| @c @fuindex mktime | |
| @prindex @code{mktime} | |
| @caindex func_working_mktime | |
| If the @code{mktime} function is not available, or does not work | |
| correctly, require an @code{AC_LIBOBJ} replacement for @samp{mktime}. | |
| For the purposes of this test, @code{mktime} should conform to the | |
| POSIX standard and should be the inverse of | |
| @code{localtime}. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_working_mktime} variable. | |
| The @code{AC_FUNC_MKTIME} macro is obsolescent. New programs should | |
| use Gnulib's @code{mktime} module. @xref{Gnulib}. | |
| @end defmac | |
| @anchor{AC_FUNC_MMAP} | |
| @defmac AC_FUNC_MMAP | |
| @acindex{FUNC_MMAP} | |
| @cvindex HAVE_MMAP | |
| @c @fuindex mmap | |
| @prindex @code{mmap} | |
| @caindex func_mmap_fixed_mapped | |
| If the @code{mmap} function exists and works correctly, define | |
| @code{HAVE_MMAP}. This checks only private fixed mapping of already-mapped | |
| memory. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_mmap_fixed_mapped} variable. | |
| Note: This macro asks for more than what an average program needs from | |
| @code{mmap}. In particular, the use of @code{MAP_FIXED} fails on | |
| HP-UX 11, whereas @code{mmap} otherwise works fine on this platform. | |
| @end defmac | |
| @defmac AC_FUNC_OBSTACK | |
| @acindex{FUNC_OBSTACK} | |
| @cvindex HAVE_OBSTACK | |
| @cindex obstack | |
| @caindex func_obstack | |
| If the obstacks are found, define @code{HAVE_OBSTACK}, else require an | |
| @code{AC_LIBOBJ} replacement for @samp{obstack}. | |
| The result of this macro is cached in the @code{ac_cv_func_obstack} | |
| variable. | |
| The @code{AC_FUNC_OBSTACK} macro is obsolescent. New programs should use | |
| Gnulib's @code{obstack} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_REALLOC | |
| @acindex{FUNC_REALLOC} | |
| @cvindex HAVE_REALLOC | |
| @cvindex realloc | |
| @c @fuindex realloc | |
| @prindex @code{realloc} | |
| @caindex func_realloc_0_nonnull | |
| If a successful call to @samp{realloc (NULL, 0)} returns a | |
| non-null pointer, define @code{HAVE_REALLOC} to 1. Otherwise define | |
| @code{HAVE_REALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for | |
| @samp{realloc}, and define @code{realloc} to @code{rpl_realloc} so that | |
| the native @code{realloc} is not used in the main project. See | |
| @code{AC_FUNC_MALLOC} for details. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_realloc_0_nonnull} variable. | |
| The result might contain spaces, e.g., @code{guessing yes}. | |
| This macro does not check compatibility with glibc @code{realloc (@var{p}, 0)} | |
| when @var{p} is non-null, as glibc 1--2.1 behaves differently from glibc | |
| 2.1.1--2.40 (at least), and the C standard says behavior is undefined. | |
| @end defmac | |
| @defmac AC_FUNC_SELECT_ARGTYPES | |
| @acindex{FUNC_SELECT_ARGTYPES} | |
| @cvindex SELECT_TYPE_ARG1 | |
| @cvindex SELECT_TYPE_ARG234 | |
| @cvindex SELECT_TYPE_ARG5 | |
| @c @fuindex select | |
| @prindex @code{select} | |
| @c @caindex func_select_args | |
| Determines the correct type to be passed for each of the | |
| @code{select} function's arguments, and defines those types | |
| in @code{SELECT_TYPE_ARG1}, @code{SELECT_TYPE_ARG234}, and | |
| @code{SELECT_TYPE_ARG5} respectively. @code{SELECT_TYPE_ARG1} defaults | |
| to @samp{int}, @code{SELECT_TYPE_ARG234} defaults to @samp{int *}, | |
| and @code{SELECT_TYPE_ARG5} defaults to @samp{struct timeval *}. | |
| This macro is obsolescent, as current systems have a @code{select} whose | |
| signature conforms to POSIX@. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_FUNC_SETPGRP | |
| @acindex{FUNC_SETPGRP} | |
| @cvindex SETPGRP_VOID | |
| @c @fuindex setpgrp | |
| @prindex @code{setpgrp} | |
| @caindex func_setpgrp_void | |
| If @code{setpgrp} takes no argument (the POSIX version), define | |
| @code{SETPGRP_VOID}. Otherwise, it is the BSD version, which takes | |
| two process IDs as arguments. This macro does not check whether | |
| @code{setpgrp} exists at all; if you need to work in that situation, | |
| first call @code{AC_CHECK_FUNC} for @code{setpgrp}. This macro also | |
| does not check for the Solaris variant of @code{setpgrp}, which returns | |
| a @code{pid_t} instead of an @code{int}; portable code should only use | |
| the return value by comparing it against @code{-1} to check for errors. | |
| The result of this macro is cached in the @code{ac_cv_func_setpgrp_void} | |
| variable. | |
| This macro is obsolescent, as all forms of @code{setpgrp} are also | |
| obsolescent. New programs should use the POSIX function @code{setpgid}, | |
| which takes two process IDs as arguments (like the BSD @code{setpgrp}). | |
| @end defmac | |
| @defmac AC_FUNC_STAT | |
| @defmacx AC_FUNC_LSTAT | |
| @acindex{FUNC_STAT} | |
| @acindex{FUNC_LSTAT} | |
| @cvindex HAVE_STAT_EMPTY_STRING_BUG | |
| @cvindex HAVE_LSTAT_EMPTY_STRING_BUG | |
| @c @fuindex stat | |
| @prindex @code{stat} | |
| @c @fuindex lstat | |
| @prindex @code{lstat} | |
| @caindex func_stat_empty_string_bug | |
| @caindex func_lstat_empty_string_bug | |
| Determine whether @code{stat} or @code{lstat} have the bug that it | |
| succeeds when given the zero-length file name as argument. | |
| If it does, then define @code{HAVE_STAT_EMPTY_STRING_BUG} (or | |
| @code{HAVE_LSTAT_EMPTY_STRING_BUG}) and ask for an @code{AC_LIBOBJ} | |
| replacement of it. | |
| The results of these macros are cached in the | |
| @code{ac_cv_func_stat_empty_string_bug} and the | |
| @code{ac_cv_func_lstat_empty_string_bug} variables, respectively. | |
| These macros are obsolescent, as no current systems have the bug. | |
| New programs need not use these macros. | |
| @end defmac | |
| @anchor{AC_FUNC_STRCOLL} | |
| @defmac AC_FUNC_STRCOLL | |
| @acindex{FUNC_STRCOLL} | |
| @cvindex HAVE_STRCOLL | |
| @c @fuindex strcoll | |
| @prindex @code{strcoll} | |
| @caindex func_strcoll_works | |
| If the @code{strcoll} function exists and works correctly, define | |
| @code{HAVE_STRCOLL}. This does a bit more than | |
| @samp{AC_CHECK_FUNCS(strcoll)}, because some systems have incorrect | |
| definitions of @code{strcoll} that should not be used. But it does | |
| not check against a known bug of this function on Solaris 10. | |
| The result of this macro is cached in the @code{ac_cv_func_strcoll_works} | |
| variable. | |
| @end defmac | |
| @defmac AC_FUNC_STRERROR_R | |
| @acindex{FUNC_STRERROR_R} | |
| @cvindex HAVE_STRERROR_R | |
| @cvindex HAVE_DECL_STRERROR_R | |
| @cvindex STRERROR_R_CHAR_P | |
| @c @fuindex strerror_r | |
| @caindex func_strerror_r_char_p | |
| @prindex @code{strerror_r} | |
| If @code{strerror_r} is available, define @code{HAVE_STRERROR_R}, and if | |
| it is declared, define @code{HAVE_DECL_STRERROR_R}. If it returns a | |
| @code{char *} message, define @code{STRERROR_R_CHAR_P}; otherwise it | |
| returns an @code{int} error number. The Thread-Safe Functions option of | |
| POSIX requires @code{strerror_r} to return @code{int}, but | |
| many systems (including, for example, the GNU C | |
| Library) return a @code{char *} value that is not necessarily equal to | |
| the buffer argument. | |
| The result of this macro is cached in the | |
| @code{ac_cv_func_strerror_r_char_p} variable. | |
| The Gnulib module @code{strerror_r} not only ensures that the function | |
| has the return type specified by POSIX, but also works around other | |
| portability problems of this function. | |
| @end defmac | |
| @anchor{AC_FUNC_STRFTIME} | |
| @defmac AC_FUNC_STRFTIME | |
| @acindex{FUNC_STRFTIME} | |
| @cvindex HAVE_STRFTIME | |
| @c @fuindex strftime | |
| @prindex @code{strftime} | |
| Check for @code{strftime} in the @file{intl} library. | |
| Then, if @code{strftime} is available, define @code{HAVE_STRFTIME}. | |
| This macro is obsolescent, as no current systems require the @file{intl} | |
| library for @code{strftime}. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_FUNC_STRTOD | |
| @acindex{FUNC_STRTOD} | |
| @ovindex POW_LIB | |
| @c @fuindex strtod | |
| @prindex @code{strtod} | |
| @caindex func_strtod | |
| @caindex func_pow | |
| If the @code{strtod} function does not exist or doesn't work correctly, | |
| ask for an @code{AC_LIBOBJ} replacement of @samp{strtod}. In this case, | |
| because @file{strtod.c} is likely to need @samp{pow}, set the output | |
| variable @code{POW_LIB} to the extra library needed. | |
| This macro caches its result in the @code{ac_cv_func_strtod} variable | |
| and depends upon the result in the @code{ac_cv_func_pow} variable. | |
| The @code{AC_FUNC_STRTOD} macro is obsolescent. New programs should | |
| use Gnulib's @code{strtod} module. @xref{Gnulib}. | |
| @end defmac | |
| @defmac AC_FUNC_STRTOLD | |
| @acindex{FUNC_STRTOLD} | |
| @cvindex HAVE_STRTOLD | |
| @prindex @code{strtold} | |
| @caindex func_strtold | |
| If the @code{strtold} function exists and conforms to C99 or later, define | |
| @code{HAVE_STRTOLD}. | |
| This macro caches its result in the @code{ac_cv_func_strtold} variable. | |
| The Gnulib module @code{strtold} not only ensures that the | |
| function exists, but also works around other portability | |
| problems of this function. | |
| @end defmac | |
| @defmac AC_FUNC_STRNLEN | |
| @acindex{FUNC_STRNLEN} | |
| @cvindex HAVE_STRNLEN | |
| @c @fuindex strnlen | |
| @prindex @code{strnlen} | |
| @caindex func_strnlen_working | |
| If the @code{strnlen} function is not available, or is buggy (like the one | |
| from Android 5.0 or AIX 4.3), require an @code{AC_LIBOBJ} replacement for it. | |
| This macro caches its result in the @code{ac_cv_func_strnlen_working} | |
| variable. | |
| The @code{AC_FUNC_STRNLEN} macro is obsolescent. New programs should | |
| use Gnulib's @code{strnlen} module. @xref{Gnulib}. | |
| @end defmac | |
| @anchor{AC_FUNC_UTIME_NULL} | |
| @defmac AC_FUNC_UTIME_NULL | |
| @acindex{FUNC_UTIME_NULL} | |
| @cvindex HAVE_UTIME_NULL | |
| @c @fuindex utime | |
| @prindex @code{utime} | |
| @caindex func_utime_null | |
| If @samp{utime (@var{file}, NULL)} sets @var{file}'s timestamp to | |
| the present, define @code{HAVE_UTIME_NULL}. | |
| This macro caches its result in the @code{ac_cv_func_utime_null} | |
| variable. | |
| This macro is obsolescent, as all current systems have a @code{utime} | |
| that behaves this way. New programs need not use this macro. | |
| @end defmac | |
| @anchor{AC_FUNC_VPRINTF} | |
| @defmac AC_FUNC_VPRINTF | |
| @acindex{FUNC_VPRINTF} | |
| @cvindex HAVE_VPRINTF | |
| @cvindex HAVE_DOPRNT | |
| @c @fuindex vprintf | |
| @prindex @code{vprintf} | |
| @c @fuindex vsprintf | |
| @prindex @code{vsprintf} | |
| If @code{vprintf} is found, define @code{HAVE_VPRINTF}. Otherwise, if | |
| @code{_doprnt} is found, define @code{HAVE_DOPRNT}. (If @code{vprintf} | |
| is available, you may assume that @code{vfprintf} and @code{vsprintf} | |
| are also available.) | |
| This macro is obsolescent, as all current systems have @code{vprintf}. | |
| New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_REPLACE_FNMATCH | |
| @acindex{REPLACE_FNMATCH} | |
| @c @fuindex fnmatch | |
| @prindex @code{fnmatch} | |
| @hdrindex{fnmatch.h} | |
| @caindex func_fnmatch_works | |
| If the @code{fnmatch} function does not conform to POSIX (see | |
| @code{AC_FUNC_FNMATCH}), ask for its @code{AC_LIBOBJ} replacement. | |
| The files @file{fnmatch.c}, @file{fnmatch_loop.c}, and @file{fnmatch_.h} | |
| in the @code{AC_LIBOBJ} replacement directory are assumed to contain a | |
| copy of the source code of GNU @code{fnmatch}. If necessary, | |
| this source code is compiled as an @code{AC_LIBOBJ} replacement, and the | |
| @file{fnmatch_.h} file is linked to @file{fnmatch.h} so that it can be | |
| included in place of the system @code{<fnmatch.h>}. | |
| This macro caches its result in the @code{ac_cv_func_fnmatch_works} | |
| variable. | |
| This macro is obsolescent, as it assumes the use of particular source | |
| files. New programs should use Gnulib's @code{fnmatch-posix} module, | |
| which provides this macro along with the source files. @xref{Gnulib}. | |
| @end defmac | |
| @node Generic Functions | |
| @subsection Generic Function Checks | |
| These macros are used to find functions not covered by the ``particular'' | |
| test macros. If the functions might be in libraries other than the | |
| default C library, first call @code{AC_CHECK_LIB} for those libraries. | |
| If you need to check the behavior of a function as well as find out | |
| whether it is present, you have to write your own test for | |
| it (@pxref{Writing Tests}). | |
| @anchor{AC_CHECK_FUNC} | |
| @defmac AC_CHECK_FUNC (@var{function}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{CHECK_FUNC} | |
| @caindex func_@var{function} | |
| If C function @var{function} is available, run shell commands | |
| @var{action-if-found}, otherwise @var{action-if-not-found}. If you just | |
| want to define a symbol if the function is available, consider using | |
| @code{AC_CHECK_FUNCS} instead. This macro checks for functions with C | |
| linkage even when @code{AC_LANG(C++)} has been called, since C is more | |
| standardized than C++. (@pxref{Language Choice}, for more information | |
| about selecting the language for checks.) | |
| This macro caches its result in the @code{ac_cv_func_@var{function}} | |
| variable. | |
| @end defmac | |
| @anchor{AC_CHECK_FUNCS} | |
| @defmac AC_CHECK_FUNCS (@var{function}@dots{}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{CHECK_FUNCS} | |
| @cvindex HAVE_@var{function} | |
| For each @var{function} enumerated in the blank-or-newline-separated argument | |
| list, define @code{HAVE_@var{function}} (in all capitals) if it is available. | |
| If @var{action-if-found} is given, it is additional shell code to | |
| execute when one of the functions is found. You can give it a value of | |
| @samp{break} to break out of the loop on the first match. If | |
| @var{action-if-not-found} is given, it is executed when one of the | |
| functions is not found. | |
| Results are cached for each @var{function} as in @code{AC_CHECK_FUNC}. | |
| @end defmac | |
| @defmac AC_CHECK_FUNCS_ONCE (@var{function}@dots{}) | |
| @acindex{CHECK_FUNCS_ONCE} | |
| @cvindex HAVE_@var{function} | |
| For each @var{function} enumerated in the blank-or-newline-separated argument | |
| list, define @code{HAVE_@var{function}} (in all capitals) if it is available. | |
| This is a once-only variant of @code{AC_CHECK_FUNCS}. It generates the | |
| checking code at most once, so that @command{configure} is smaller and | |
| faster; but the checks cannot be conditionalized and are always done once, | |
| early during the @command{configure} run. | |
| @end defmac | |
| @sp 1 | |
| Autoconf follows a philosophy that was formed over the years by those | |
| who have struggled for portability: isolate the portability issues in | |
| specific files, and then program as if you were in a POSIX | |
| environment. Some functions may be missing or unfixable, and your | |
| package must be ready to replace them. | |
| Suitable replacements for many such problem functions are available from | |
| Gnulib (@pxref{Gnulib}). | |
| @defmac AC_LIBOBJ (@var{function}) | |
| @acindex{LIBOBJ} | |
| @ovindex LIBOBJS | |
| Specify that @samp{@var{function}.c} must be included in the executables | |
| to replace a missing or broken implementation of @var{function}. | |
| @vrindex ac_objext | |
| Technically, it adds @samp{@var{function}.$ac_objext} to the output | |
| variable @code{LIBOBJS} if it is not already in, and calls | |
| @code{AC_LIBSOURCE} for @samp{@var{function}.c}. You should not | |
| directly change @code{LIBOBJS}, since this is not traceable. | |
| @end defmac | |
| @defmac AC_LIBSOURCE (@var{file}) | |
| @acindex{LIBSOURCE} | |
| Specify that @var{file} might be needed to compile the project. If you | |
| need to know what files might be needed by a @file{configure.ac}, you | |
| should trace @code{AC_LIBSOURCE}. @var{file} must be a literal. | |
| This macro is called automatically from @code{AC_LIBOBJ}, but you must | |
| call it explicitly if you pass a shell variable to @code{AC_LIBOBJ}. In | |
| that case, since shell variables cannot be traced statically, you must | |
| pass to @code{AC_LIBSOURCE} any possible files that the shell variable | |
| might cause @code{AC_LIBOBJ} to need. For example, if you want to pass | |
| a variable @code{$foo_or_bar} to @code{AC_LIBOBJ} that holds either | |
| @code{"foo"} or @code{"bar"}, you should do: | |
| @example | |
| AC_LIBSOURCE([foo.c]) | |
| AC_LIBSOURCE([bar.c]) | |
| AC_LIBOBJ([$foo_or_bar]) | |
| @end example | |
| @noindent | |
| There is usually a way to avoid this, however, and you are encouraged to | |
| simply call @code{AC_LIBOBJ} with literal arguments. | |
| Note that this macro replaces the obsolete @code{AC_LIBOBJ_DECL}, with | |
| slightly different semantics: the old macro took the function name, | |
| e.g., @code{foo}, as its argument rather than the file name. | |
| @end defmac | |
| @defmac AC_LIBSOURCES (@var{files}) | |
| @acindex{LIBSOURCES} | |
| Like @code{AC_LIBSOURCE}, but accepts one or more @var{files} in a | |
| comma-separated M4 list. Thus, the above example might be rewritten: | |
| @example | |
| AC_LIBSOURCES([foo.c, bar.c]) | |
| AC_LIBOBJ([$foo_or_bar]) | |
| @end example | |
| @end defmac | |
| @defmac AC_CONFIG_LIBOBJ_DIR (@var{directory}) | |
| @acindex{CONFIG_LIBOBJ_DIR} | |
| Specify that @code{AC_LIBOBJ} replacement files are to be found in | |
| @var{directory}, a name relative to the top level of the | |
| source tree. The replacement directory defaults to @file{.}, the top | |
| level directory, and the most typical value is @file{lib}, corresponding | |
| to @samp{AC_CONFIG_LIBOBJ_DIR([lib])}. | |
| @command{configure} might need to know the replacement directory for the | |
| following reasons: (i) some checks use the replacement files, (ii) some | |
| macros bypass broken system headers by installing links to the | |
| replacement headers (iii) when used in conjunction with Automake, | |
| within each makefile, @var{directory} is used as a relative path | |
| from @code{$(top_srcdir)} to each object named in @code{LIBOBJS} and | |
| @code{LTLIBOBJS}, etc. | |
| @end defmac | |
| @sp 1 | |
| It is common to merely check for the existence of a function, and ask | |
| for its @code{AC_LIBOBJ} replacement if missing. The following macro is | |
| a convenient shorthand. | |
| @defmac AC_REPLACE_FUNCS (@var{function}@dots{}) | |
| @acindex{REPLACE_FUNCS} | |
| @cvindex HAVE_@var{function} | |
| @ovindex LIBOBJS | |
| Like @code{AC_CHECK_FUNCS}, but uses @samp{AC_LIBOBJ(@var{function})} as | |
| @var{action-if-not-found}. You can declare your replacement function by | |
| enclosing the prototype in @samp{#ifndef HAVE_@var{function}}. If the | |
| system has the function, it probably declares it in a header file you | |
| should be including, so you shouldn't redeclare it lest your declaration | |
| conflict. | |
| @end defmac | |
| @node Header Files | |
| @section Header Files | |
| @cindex Header, checking | |
| The following macros check for the presence of certain C header files. | |
| If there is no macro specifically defined to check for a header file you need, | |
| and you don't need to check for any special properties of | |
| it, then you can use one of the general header-file check macros. | |
| @menu | |
| * Header Portability:: Collected knowledge on common headers | |
| * Particular Headers:: Special handling to find certain headers | |
| * Generic Headers:: How to find other headers | |
| @end menu | |
| @node Header Portability | |
| @subsection Portability of Headers | |
| @cindex Portability of headers | |
| @cindex Header portability | |
| This section documents some collected knowledge about common headers, | |
| and the problems they cause. By definition, this list always requires | |
| additions. A much more complete list is maintained by the Gnulib | |
| project (@pxref{Gnulib}), covering @ref{Header File Substitutes, , | |
| POSIX Headers, gnulib, Gnulib} and @ref{Glibc Header File | |
| Substitutes, , Glibc Headers, gnulib, Gnulib}. Please help us keep | |
| the Gnulib list as complete as possible. | |
| When we say that a header ``may require'' some set of other headers, we | |
| mean that it may be necessary for you to manually include those other | |
| headers first, or the contents of the header under test will fail to | |
| compile. When checking for these headers, you must provide the | |
| potentially-required headers in the @var{includes} argument to | |
| @code{AC_CHECK_HEADER} or @code{AC_CHECK_HEADERS}, or the check will | |
| fail spuriously. @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}) | |
| arranges to include a number of common requirements and should normally | |
| come first in your @var{includes}. For example, @file{net/if.h} may | |
| require @file{sys/types.h}, @file{sys/socket.h}, or both, and | |
| @code{AC_INCLUDES_DEFAULT} handles @file{sys/types.h} but not | |
| @file{sys/socket.h}, so you should check for it like this: | |
| @example | |
| AC_CHECK_HEADERS([sys/socket.h]) | |
| AC_CHECK_HEADERS([net/if.h], [], [], | |
| [AC_INCLUDES_DEFAULT[ | |
| #ifdef HAVE_SYS_SOCKET_H | |
| # include <sys/socket.h> | |
| #endif | |
| ]]) | |
| @end example | |
| Note that the example mixes single quoting (for@code{AC_INCLUDES_DEFAULT}, | |
| so that it gets expanded) and double quoting (to ensure that each | |
| preprocessor @code{#} gets treated as a literal string rather than a | |
| comment). | |
| @table @asis | |
| @item @file{limits.h} | |
| In C99 and later, @file{limits.h} defines @code{LLONG_MIN}, | |
| @code{LLONG_MAX}, and @code{ULLONG_MAX}, but many almost-C99 | |
| environments (e.g., default GCC 4.0.2 + glibc 2.4) do not | |
| define them. | |
| @item @file{memory.h} | |
| @hdrindex{memory.h} | |
| This header file is obsolete; use @file{string.h} instead. | |
| @item @file{strings.h} | |
| @hdrindex{strings.h} | |
| On some systems, this is the only header that declares | |
| @code{strcasecmp}, @code{strncasecmp}, and @code{ffs}. | |
| This header may or may not include @file{string.h} for you. However, on | |
| all recent systems it is safe to include both @file{string.h} and | |
| @file{strings.h}, in either order, in the same source file. | |
| @item @file{inttypes.h} vs.@: @file{stdint.h} | |
| @hdrindex{inttypes.h} | |
| @hdrindex{stdint.h} | |
| C99 specifies that @file{inttypes.h} includes @file{stdint.h}, so there's | |
| no need to include @file{stdint.h} separately in a standard environment. | |
| However, some implementations have @file{stdint.h} but not @file{inttypes.h} | |
| (e.g. MSVC 2012). Therefore, it is necessary to check for each and include | |
| each only if available. | |
| @item @file{linux/irda.h} | |
| @hdrindex{linux/irda.h} | |
| This header may require @file{linux/types.h} and/or @file{sys/socket.h}. | |
| @item @file{linux/random.h} | |
| @hdrindex{linux/random.h} | |
| This header may require @file{linux/types.h}. | |
| @item @file{net/if.h} | |
| @hdrindex{net/if.h} | |
| This header may require @file{sys/types.h} and/or @file{sys/socket.h}. | |
| @item @file{netinet/if_ether.h} | |
| @hdrindex{netinet/if_ether.h} | |
| This header may require some combination of @file{sys/types.h}, | |
| @file{sys/socket.h}, @file{netinet/in.h}, and @file{net/if.h}. | |
| @item @file{sys/mount.h} | |
| @hdrindex{sys/mount.h} | |
| This header may require @file{sys/params.h}. | |
| @item @file{sys/ptem.h} | |
| @hdrindex{sys/ptem.h} | |
| This header may require @file{sys/stream.h}. | |
| @item @file{sys/socket.h} | |
| @hdrindex{sys/socket.h} | |
| This header may require @file{sys/types.h}. | |
| @item @file{sys/ucred.h} | |
| @hdrindex{sys/ucred.h} | |
| This header may require @file{sys/types.h}. | |
| @item @file{X11/extensions/scrnsaver.h} | |
| @hdrindex{X11/extensions/scrnsaver.h} | |
| Using XFree86, this header requires @file{X11/Xlib.h}, which is probably | |
| so required that you might not even consider looking for it. | |
| @end table | |
| @node Particular Headers | |
| @subsection Particular Header Checks | |
| These macros check for particular system header files---whether they | |
| exist, and in some cases whether they declare certain symbols. | |
| @defmac AC_CHECK_HEADER_STDBOOL | |
| @acindex{CHECK_HEADER_STDBOOL} | |
| @cvindex HAVE__BOOL | |
| @hdrindex{stdbool.h} | |
| @caindex header_stdbool_h | |
| Check whether @file{stdbool.h} exists and conforms to C99 or later, | |
| and cache the result in the @code{ac_cv_header_stdbool_h} variable. | |
| If the type @code{_Bool} is defined, define @code{HAVE__BOOL} to 1. | |
| This macro is obsolescent, as all current C compilers have @file{stdbool.h}, | |
| a header that is itself obsolescent as of C23. | |
| This macro is intended for use by Gnulib (@pxref{Gnulib}) and other | |
| packages that supply a substitute @file{stdbool.h} on platforms lacking | |
| a conforming one. The @code{AC_HEADER_STDBOOL} macro is better for code | |
| that explicitly checks for @file{stdbool.h}. | |
| @end defmac | |
| @defmac AC_HEADER_ASSERT | |
| @acindex{HEADER_ASSERT} | |
| @cvindex NDEBUG | |
| @hdrindex{assert.h} | |
| Check whether to enable assertions in the style of @file{assert.h}. | |
| Assertions are enabled by default, but the user can override this by | |
| invoking @command{configure} with the @option{--disable-assert} option. | |
| @end defmac | |
| @anchor{AC_HEADER_DIRENT} | |
| @defmac AC_HEADER_DIRENT | |
| @acindex{HEADER_DIRENT} | |
| @cvindex HAVE_DIRENT_H | |
| @cvindex HAVE_NDIR_H | |
| @cvindex HAVE_SYS_DIR_H | |
| @cvindex HAVE_SYS_NDIR_H | |
| @hdrindex{dirent.h} | |
| @hdrindex{sys/ndir.h} | |
| @hdrindex{sys/dir.h} | |
| @hdrindex{ndir.h} | |
| Check for the following header files. For the first one that is | |
| found and defines @samp{DIR}, define the listed C preprocessor macro: | |
| @multitable {@file{sys/ndir.h}} {@code{HAVE_SYS_NDIR_H}} | |
| @item @file{dirent.h} @tab @code{HAVE_DIRENT_H} | |
| @item @file{sys/ndir.h} @tab @code{HAVE_SYS_NDIR_H} | |
| @item @file{sys/dir.h} @tab @code{HAVE_SYS_DIR_H} | |
| @item @file{ndir.h} @tab @code{HAVE_NDIR_H} | |
| @end multitable | |
| The directory-library declarations in your source code should look | |
| something like the following: | |
| @example | |
| @group | |
| #include <sys/types.h> | |
| #ifdef HAVE_DIRENT_H | |
| # include <dirent.h> | |
| # define NAMLEN(dirent) strlen ((dirent)->d_name) | |
| #else | |
| # define dirent direct | |
| # define NAMLEN(dirent) ((dirent)->d_namlen) | |
| # ifdef HAVE_SYS_NDIR_H | |
| # include <sys/ndir.h> | |
| # endif | |
| # ifdef HAVE_SYS_DIR_H | |
| # include <sys/dir.h> | |
| # endif | |
| # ifdef HAVE_NDIR_H | |
| # include <ndir.h> | |
| # endif | |
| #endif | |
| @end group | |
| @end example | |
| Using the above declarations, the program would declare variables to be | |
| of type @code{struct dirent}, not @code{struct direct}, and would access | |
| the length of a directory entry name by passing a pointer to a | |
| @code{struct dirent} to the @code{NAMLEN} macro. | |
| This macro also checks for the obsolete @file{dir} and @file{x} libraries. | |
| This macro is obsolescent, as all current systems with directory | |
| libraries have @code{<dirent.h>}. New programs need not use this macro. | |
| Also see @code{AC_STRUCT_DIRENT_D_INO} and | |
| @code{AC_STRUCT_DIRENT_D_TYPE} (@pxref{Particular Structures}). | |
| @end defmac | |
| @anchor{AC_HEADER_MAJOR} | |
| @defmac AC_HEADER_MAJOR | |
| @acindex{HEADER_MAJOR} | |
| @cvindex MAJOR_IN_MKDEV | |
| @cvindex MAJOR_IN_SYSMACROS | |
| @hdrindex{sys/mkdev.h} | |
| @hdrindex{sys/sysmacros.h} | |
| Detect the headers required to use @code{makedev}, @code{major}, and | |
| @code{minor}. These functions may be defined by @file{sys/mkdev.h}, | |
| @code{sys/sysmacros.h}, or @file{sys/types.h}. | |
| @code{AC_HEADER_MAJOR} defines @code{MAJOR_IN_MKDEV} if they are in | |
| @file{sys/mkdev.h}, or @code{MAJOR_IN_SYSMACROS} if they are in | |
| @file{sys/sysmacros.h}. If neither macro is defined, they are either in | |
| @file{sys/types.h} or unavailable. | |
| To properly use these functions, your code should contain something | |
| like: | |
| @verbatim | |
| #include <sys/types.h> | |
| #ifdef MAJOR_IN_MKDEV | |
| # include <sys/mkdev.h> | |
| #elif defined MAJOR_IN_SYSMACROS | |
| # include <sys/sysmacros.h> | |
| #endif | |
| @end verbatim | |
| Note: Configure scripts built with Autoconf 2.69 or earlier will not | |
| detect a problem if @file{sys/types.h} contains definitions of | |
| @code{major}, @code{minor}, and/or @code{makedev} that trigger compiler | |
| warnings upon use. This is known to occur with GNU libc 2.25, where | |
| those definitions are being deprecated to reduce namespace pollution. | |
| If it is not practical to use Autoconf 2.70 to regenerate the configure | |
| script of affected software, you can work around the problem by setting | |
| @samp{ac_cv_header_sys_types_h_makedev=no}, as an argument to | |
| @command{configure} or as part of a @file{config.site} site default file | |
| (@pxref{Site Defaults}). | |
| @end defmac | |
| @defmac AC_HEADER_RESOLV | |
| @acindex{HEADER_RESOLV} | |
| @cvindex HAVE_RESOLV_H | |
| @hdrindex{resolv.h} | |
| Checks for header @file{resolv.h}, checking for prerequisites first. | |
| To properly use @file{resolv.h}, your code should contain something like | |
| the following: | |
| @verbatim | |
| #ifdef HAVE_SYS_TYPES_H | |
| # include <sys/types.h> | |
| #endif | |
| #ifdef HAVE_NETINET_IN_H | |
| # include <netinet/in.h> /* inet_ functions / structs */ | |
| #endif | |
| #ifdef HAVE_ARPA_NAMESER_H | |
| # include <arpa/nameser.h> /* DNS HEADER struct */ | |
| #endif | |
| #ifdef HAVE_NETDB_H | |
| # include <netdb.h> | |
| #endif | |
| #include <resolv.h> | |
| @end verbatim | |
| @end defmac | |
| @anchor{AC_HEADER_STAT} | |
| @defmac AC_HEADER_STAT | |
| @acindex{HEADER_STAT} | |
| @cvindex STAT_MACROS_BROKEN | |
| @hdrindex{sys/stat.h} | |
| If the macros @code{S_ISDIR}, @code{S_ISREG}, etc.@: defined in | |
| @file{sys/stat.h} do not work properly (returning false positives), | |
| define @code{STAT_MACROS_BROKEN}. This is the case on Tektronix UTekV, | |
| Amdahl UTS and Motorola System V/88. | |
| This macro is obsolescent, as no current systems have the bug. | |
| New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_HEADER_STDBOOL | |
| @acindex{HEADER_STDBOOL} | |
| @cvindex HAVE_STDBOOL_H | |
| @cvindex HAVE__BOOL | |
| @hdrindex{stdbool.h} | |
| @caindex header_stdbool_h | |
| If @file{stdbool.h} exists and conforms to C99 or later, define | |
| @code{HAVE_STDBOOL_H} to 1; if the type @code{_Bool} is defined, define | |
| @code{HAVE__BOOL} to 1. | |
| This macro is obsolescent, as all current C compilers have | |
| @file{stdbool.h}, a header that is itself obsolescent as of C23. | |
| Nowadays programs that need @code{bool}, @code{true} and @code{false} | |
| can include @file{stdbool.h} unconditionally, without using | |
| @code{AC_HEADER_STDBOOL}, and if such a program needs to be portable | |
| only to C23 or later it need not even include @file{stdbool.h}. | |
| This macro caches its result in the @code{ac_cv_header_stdbool_h} | |
| variable. | |
| This macro differs from @code{AC_CHECK_HEADER_STDBOOL} only in that it | |
| defines @code{HAVE_STDBOOL_H} whereas @code{AC_CHECK_HEADER_STDBOOL} | |
| does not. | |
| @end defmac | |
| @anchor{AC_HEADER_STDC} | |
| @defmac AC_HEADER_STDC | |
| @acindex{HEADER_STDC} | |
| @cvindex STDC_HEADERS | |
| @caindex header_stdc | |
| This macro is obsolescent. Its sole effect is to make sure that all the | |
| headers that are included by @code{AC_INCLUDES_DEFAULT} (@pxref{Default | |
| Includes}), but not part of C89, have been checked for. | |
| All hosted environments that are still of interest for portable code | |
| provide all of the headers specified in C89 (as amended in 1995). | |
| @end defmac | |
| @defmac AC_HEADER_SYS_WAIT | |
| @acindex{HEADER_SYS_WAIT} | |
| @cvindex HAVE_SYS_WAIT_H | |
| @hdrindex{sys/wait.h} | |
| @caindex header_sys_wait_h | |
| If @file{sys/wait.h} exists and is compatible with POSIX, define | |
| @code{HAVE_SYS_WAIT_H}. Incompatibility can occur if @file{sys/wait.h} | |
| does not exist, or if it uses the old BSD @code{union wait} instead | |
| of @code{int} to store a status value. If @file{sys/wait.h} is not | |
| POSIX compatible, then instead of including it, define the | |
| POSIX macros with their usual interpretations. Here is an | |
| example: | |
| @example | |
| @group | |
| #include <sys/types.h> | |
| #ifdef HAVE_SYS_WAIT_H | |
| # include <sys/wait.h> | |
| #endif | |
| #ifndef WEXITSTATUS | |
| # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) | |
| #endif | |
| #ifndef WIFEXITED | |
| # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) | |
| #endif | |
| @end group | |
| @end example | |
| @noindent | |
| This macro caches its result in the @code{ac_cv_header_sys_wait_h} | |
| variable. | |
| This macro is obsolescent, as current systems are compatible with POSIX@. | |
| New programs need not use this macro. | |
| @end defmac | |
| @cvindex _POSIX_VERSION | |
| @hdrindex{unistd.h} | |
| @code{_POSIX_VERSION} is defined when @file{unistd.h} is included on | |
| POSIX systems. If there is no @file{unistd.h}, it is definitely | |
| not a POSIX system. However, some non-POSIX systems do | |
| have @file{unistd.h}. | |
| The way to check whether the system says it supports POSIX is: | |
| @example | |
| @group | |
| #ifdef HAVE_UNISTD_H | |
| # include <sys/types.h> | |
| # include <unistd.h> | |
| #endif | |
| #ifdef _POSIX_VERSION | |
| /* Code for POSIX systems. */ | |
| #endif | |
| @end group | |
| @end example | |
| @defmac AC_HEADER_TIOCGWINSZ | |
| @acindex{HEADER_TIOCGWINSZ} | |
| @cvindex GWINSZ_IN_SYS_IOCTL | |
| @hdrindex{sys/ioctl.h} | |
| @hdrindex{termios.h} | |
| @c FIXME: I need clarifications from Jim. | |
| If the use of @code{TIOCGWINSZ} requires @file{<sys/ioctl.h>}, then | |
| define @code{GWINSZ_IN_SYS_IOCTL}. Otherwise @code{TIOCGWINSZ} can be | |
| found in @file{<termios.h>}. | |
| Use: | |
| @example | |
| @group | |
| #ifdef HAVE_TERMIOS_H | |
| # include <termios.h> | |
| #endif | |
| #ifdef GWINSZ_IN_SYS_IOCTL | |
| # include <sys/ioctl.h> | |
| #endif | |
| @end group | |
| @end example | |
| @end defmac | |
| @node Generic Headers | |
| @subsection Generic Header Checks | |
| These macros are used to find system header files not covered by the | |
| ``particular'' test macros. If you need to check the contents of a header | |
| as well as find out whether it is present, you have to write your own | |
| test for it (@pxref{Writing Tests}). | |
| @anchor{AC_CHECK_HEADER} | |
| @defmac AC_CHECK_HEADER (@var{header-file}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}, @ovar{includes}) | |
| @acindex{CHECK_HEADER} | |
| @caindex header_@var{header-file} | |
| If the system header file @var{header-file} is compilable, execute shell | |
| commands @var{action-if-found}, otherwise execute | |
| @var{action-if-not-found}. If you just want to define a symbol if the | |
| header file is available, consider using @code{AC_CHECK_HEADERS} | |
| instead. | |
| @var{includes} should be the appropriate @dfn{prerequisite} code, i.e.@: | |
| whatever might be required to appear above | |
| @samp{#include <@var{header-file}>} for it to compile without error. | |
| This can be anything, but will normally be additional @samp{#include} | |
| directives. If @var{includes} is omitted or empty, @file{configure} will | |
| use the contents of the macro @code{AC_INCLUDES_DEFAULT}. | |
| @xref{Default Includes}. | |
| This macro used to check only for the @emph{presence} of a header, not | |
| whether its contents were acceptable to the compiler. Some older | |
| @command{configure} scripts rely on this behavior, so it is still | |
| available by specifying @samp{-} as @var{includes}. This mechanism is | |
| deprecated as of Autoconf 2.70; situations where a preprocessor-only | |
| check is required should use @code{AC_PREPROC_IFELSE}. | |
| @xref{Running the Preprocessor}. | |
| This macro caches its result in the @code{ac_cv_header_@var{header-file}} | |
| variable, with characters not suitable for a variable name mapped to | |
| underscores. | |
| @end defmac | |
| @anchor{AC_CHECK_HEADERS} | |
| @defmac AC_CHECK_HEADERS (@var{header-file}@dots{}, @ | |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ | |
| @ovar{includes}) | |
| @acindex{CHECK_HEADERS} | |
| @cvindex HAVE_@var{header} | |
| @caindex header_@var{header-file} | |
| For each given system header file @var{header-file} in the | |
| blank-separated argument list that exists, define | |
| @code{HAVE_@var{header-file}} (in all capitals). If @var{action-if-found} | |
| is given, it is additional shell code to execute when one of the header | |
| files is found. You can give it a value of @samp{break} to break out of | |
| the loop on the first match. If @var{action-if-not-found} is given, it | |
| is executed when one of the header files is not found. | |
| @var{includes} is interpreted as in @code{AC_CHECK_HEADER}, in order to | |
| choose the set of preprocessor directives supplied before the header | |
| under test. | |
| This macro caches its result in the @code{ac_cv_header_@var{header-file}} | |
| variable, with characters not suitable for a variable name mapped to | |
| underscores. | |
| @end defmac | |
| @defmac AC_CHECK_HEADERS_ONCE (@var{header-file}@dots{}) | |
| @acindex{CHECK_HEADERS_ONCE} | |
| @cvindex HAVE_@var{header} | |
| For each given system header file @var{header-file} in the | |
| blank-separated argument list that exists, define | |
| @code{HAVE_@var{header-file}} (in all capitals). | |
| If you do not need the full power of @code{AC_CHECK_HEADERS}, this | |
| variant generates smaller, faster @command{configure} files. All | |
| headers passed to @code{AC_CHECK_HEADERS_ONCE} are checked for in one | |
| pass, early during the @command{configure} run. The checks cannot be | |
| conditionalized, you cannot specify an @var{action-if-found} or | |
| @var{action-if-not-found}, and @code{AC_INCLUDES_DEFAULT} is always used | |
| for the prerequisites. | |
| @end defmac | |
| In previous versions of Autoconf, these macros merely checked whether | |
| the header was accepted by the preprocessor. This was changed because | |
| the old test was inappropriate for typical uses. Headers are typically | |
| used to compile, not merely to preprocess, and the old behavior | |
| sometimes accepted headers that clashed at compile-time | |
| (@pxref{Present But Cannot Be Compiled}). If for some reason it is | |
| inappropriate to check whether a header is compilable, you should use | |
| @code{AC_PREPROC_IFELSE} (@pxref{Running the Preprocessor}) instead of | |
| these macros. | |
| Requiring each header to compile improves the robustness of the test, | |
| but it also requires you to make sure that the @var{includes} are | |
| correct. Most system headers nowadays make sure to @code{#include} | |
| whatever they require, or else have their dependencies satisfied by | |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), but | |
| @pxref{Header Portability}, for known exceptions. In general, if you | |
| are looking for @file{bar.h}, which requires that @file{foo.h} be | |
| included first if it exists, you should do something like this: | |
| @example | |
| AC_CHECK_HEADERS([foo.h]) | |
| AC_CHECK_HEADERS([bar.h], [], [], | |
| [#ifdef HAVE_FOO_H | |
| # include <foo.h> | |
| #endif | |
| ]) | |
| @end example | |
| @node Declarations | |
| @section Declarations | |
| @cindex Declaration, checking | |
| The following macros check for the declaration of variables and | |
| functions. If there is no macro specifically defined to check for a | |
| symbol you need, then you can use the general macros (@pxref{Generic | |
| Declarations}) or, for more complex tests, you may use | |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}). | |
| @menu | |
| * Particular Declarations:: Macros to check for certain declarations | |
| * Generic Declarations:: How to find other declarations | |
| @end menu | |
| @node Particular Declarations | |
| @subsection Particular Declaration Checks | |
| There are no specific macros for declarations. | |
| @node Generic Declarations | |
| @subsection Generic Declaration Checks | |
| These macros are used to find declarations not covered by the ``particular'' | |
| test macros. | |
| @defmac AC_CHECK_DECL (@var{symbol}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) | |
| @acindex{CHECK_DECL} | |
| @caindex have_decl_@var{symbol} | |
| If @var{symbol} (a function, variable, or constant) is not declared in | |
| @var{includes} and a declaration is needed, run the shell commands | |
| @var{action-if-not-found}, otherwise @var{action-if-found}. | |
| @var{includes} is a series of include directives, defaulting to | |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used | |
| prior to the declaration under test. | |
| This macro actually tests whether @var{symbol} is defined as a macro or | |
| can be used as an r-value, not whether it is really declared, because it | |
| is much safer to avoid introducing extra declarations when they are not | |
| needed. In order to facilitate use of C++ and overloaded function | |
| declarations, it is possible to specify function argument types in | |
| parentheses for types which can be zero-initialized: | |
| @example | |
| AC_CHECK_DECL([basename(char *)]) | |
| @end example | |
| This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}} | |
| variable, with characters not suitable for a variable name mapped to | |
| underscores. | |
| @end defmac | |
| @anchor{AC_CHECK_DECLS} | |
| @defmac AC_CHECK_DECLS (@var{symbols}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) | |
| @acindex{CHECK_DECLS} | |
| @cvindex HAVE_DECL_@var{symbol} | |
| @caindex have_decl_@var{symbol} | |
| For each of the @var{symbols} (@emph{comma}-separated list with optional | |
| function argument types for C++ overloads), define | |
| @code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if | |
| @var{symbol} is declared, otherwise to @samp{0}. If | |
| @var{action-if-not-found} is given, it is additional shell code to | |
| execute when one of the function declarations is needed, otherwise | |
| @var{action-if-found} is executed. | |
| @var{includes} is a series of include directives, defaulting to | |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used | |
| prior to the declarations under test. | |
| This macro uses an M4 list as first argument: | |
| @example | |
| AC_CHECK_DECLS([strdup]) | |
| AC_CHECK_DECLS([strlen]) | |
| AC_CHECK_DECLS([malloc, realloc, calloc, free]) | |
| AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]]) | |
| AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]]) | |
| @end example | |
| Unlike the other @samp{AC_CHECK_*S} macros, when a @var{symbol} is not | |
| declared, @code{HAVE_DECL_@var{symbol}} is defined to @samp{0} instead | |
| of leaving @code{HAVE_DECL_@var{symbol}} undeclared. When you are | |
| @emph{sure} that the check was performed, use | |
| @code{HAVE_DECL_@var{symbol}} in @code{#if}: | |
| @example | |
| #if !HAVE_DECL_SYMBOL | |
| extern char *symbol; | |
| #endif | |
| @end example | |
| @noindent | |
| If the test may have not been performed, however, because it is safer | |
| @emph{not} to declare a symbol than to use a declaration that conflicts | |
| with the system's one, you should use: | |
| @example | |
| #if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC | |
| void *malloc (size_t *s); | |
| #endif | |
| @end example | |
| @noindent | |
| You fall into the second category only in extreme situations: either | |
| your files may be used without being configured, or they are used during | |
| the configuration. In most cases the traditional approach is enough. | |
| This macro caches its results in @code{ac_cv_have_decl_@var{symbol}} | |
| variables, with characters not suitable for a variable name mapped to | |
| underscores. | |
| @end defmac | |
| @defmac AC_CHECK_DECLS_ONCE (@var{symbols}) | |
| @acindex{CHECK_DECLS_ONCE} | |
| @cvindex HAVE_DECL_@var{symbol} | |
| For each of the @var{symbols} (@emph{comma}-separated list), define | |
| @code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if | |
| @var{symbol} is declared in the default include files, otherwise to | |
| @samp{0}. This is a once-only variant of @code{AC_CHECK_DECLS}. It | |
| generates the checking code at most once, so that @command{configure} is | |
| smaller and faster; but the checks cannot be conditionalized and are | |
| always done once, early during the @command{configure} run. | |
| @end defmac | |
| @node Structures | |
| @section Structures | |
| @cindex Structure, checking | |
| The following macros check for the presence of certain members in C | |
| structures. If there is no macro specifically defined to check for a | |
| member you need, then you can use the general structure-member macros | |
| (@pxref{Generic Structures}) or, for more complex tests, you may use | |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}). | |
| @menu | |
| * Particular Structures:: Macros to check for certain structure members | |
| * Generic Structures:: How to find other structure members | |
| @end menu | |
| @node Particular Structures | |
| @subsection Particular Structure Checks | |
| The following macros check for certain structures or structure members. | |
| @defmac AC_STRUCT_DIRENT_D_INO | |
| @acindex{STRUCT_DIRENT_D_INO} | |
| @cvindex HAVE_STRUCT_DIRENT_D_INO | |
| @c @caindex header_dirent_dirent_h | |
| @c @caindex member_struct_dirent_d_ino | |
| Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular | |
| Headers}). Then, if @code{struct dirent} contains a @code{d_ino} | |
| member, define @code{HAVE_STRUCT_DIRENT_D_INO}. | |
| @code{HAVE_STRUCT_DIRENT_D_INO} indicates only the presence of | |
| @code{d_ino}, not whether its contents are always reliable. | |
| Traditionally, a zero @code{d_ino} indicated a deleted directory entry, | |
| though current systems hide this detail from the user and never return | |
| zero @code{d_ino} values. | |
| Many current systems report an incorrect @code{d_ino} for a directory | |
| entry that is a mount point. | |
| @end defmac | |
| @defmac AC_STRUCT_DIRENT_D_TYPE | |
| @acindex{STRUCT_DIRENT_D_TYPE} | |
| @cvindex HAVE_STRUCT_DIRENT_D_TYPE | |
| @c @caindex header_dirent_dirent_h | |
| @c @caindex member_struct_dirent_d_type | |
| Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular | |
| Headers}). Then, if @code{struct dirent} contains a @code{d_type} | |
| member, define @code{HAVE_STRUCT_DIRENT_D_TYPE}. | |
| @end defmac | |
| @anchor{AC_STRUCT_ST_BLOCKS} | |
| @defmac AC_STRUCT_ST_BLOCKS | |
| @acindex{STRUCT_ST_BLOCKS} | |
| @cvindex HAVE_STRUCT_STAT_ST_BLOCKS | |
| @cvindex HAVE_ST_BLOCKS | |
| @ovindex LIBOBJS | |
| @caindex member_struct_stat_st_blocks | |
| If @code{struct stat} contains an @code{st_blocks} member, define | |
| @code{HAVE_STRUCT_STAT_ST_BLOCKS}. Otherwise, require an | |
| @code{AC_LIBOBJ} replacement of @samp{fileblocks}. The former name, | |
| @code{HAVE_ST_BLOCKS} is to be avoided, as its support will cease in the | |
| future. | |
| This macro caches its result in the @code{ac_cv_member_struct_stat_st_blocks} | |
| variable. | |
| @end defmac | |
| @defmac AC_STRUCT_TM | |
| @acindex{STRUCT_TM} | |
| @cvindex TM_IN_SYS_TIME | |
| @hdrindex{time.h} | |
| @hdrindex{sys/time.h} | |
| If @file{time.h} does not define @code{struct tm}, define | |
| @code{TM_IN_SYS_TIME}, which means that including @file{sys/time.h} | |
| had better define @code{struct tm}. | |
| This macro is obsolescent, as @file{time.h} defines @code{struct tm} in | |
| current systems. New programs need not use this macro. | |
| @end defmac | |
| @anchor{AC_STRUCT_TIMEZONE} | |
| @defmac AC_STRUCT_TIMEZONE | |
| @acindex{STRUCT_TIMEZONE} | |
| @cvindex HAVE_DECL_TZNAME | |
| @cvindex HAVE_STRUCT_TM_TM_ZONE | |
| @cvindex HAVE_TM_ZONE | |
| @cvindex HAVE_TZNAME | |
| @c @caindex member_struct_tm_tm_zone | |
| @c @caindex struct_tm | |
| Figure out how to get the current timezone. If @code{struct tm} has a | |
| @code{tm_zone} member, define @code{HAVE_STRUCT_TM_TM_ZONE} (and the | |
| obsoleted @code{HAVE_TM_ZONE}). Otherwise, if the external array | |
| @code{tzname} is found, define @code{HAVE_TZNAME}; if it is declared, | |
| define @code{HAVE_DECL_TZNAME}. | |
| @end defmac | |
| @node Generic Structures | |
| @subsection Generic Structure Checks | |
| These macros are used to find structure members not covered by the | |
| ``particular'' test macros. | |
| @defmac AC_CHECK_MEMBER (@var{aggregate}.@var{member}, @ | |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ | |
| @dvar{includes, AC_INCLUDES_DEFAULT}) | |
| @acindex{CHECK_MEMBER} | |
| @caindex member_@var{aggregate}_@var{member} | |
| Check whether @var{member} is a member of the aggregate @var{aggregate}. | |
| If no @var{includes} are specified, the default includes are used | |
| (@pxref{Default Includes}). | |
| @example | |
| AC_CHECK_MEMBER([struct passwd.pw_gecos], [], | |
| [AC_MSG_ERROR([we need 'passwd.pw_gecos'])], | |
| [[#include <pwd.h>]]) | |
| @end example | |
| You can use this macro for submembers: | |
| @example | |
| AC_CHECK_MEMBER(struct top.middle.bot) | |
| @end example | |
| This macro caches its result in the | |
| @code{ac_cv_member_@var{aggregate}_@var{member}} variable, with | |
| characters not suitable for a variable name mapped to underscores. | |
| @end defmac | |
| @anchor{AC_CHECK_MEMBERS} | |
| @defmac AC_CHECK_MEMBERS (@var{members}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) | |
| @acindex{CHECK_MEMBERS} | |
| @cvindex HAVE_@var{aggregate}_@var{member} | |
| Check for the existence of each @samp{@var{aggregate}.@var{member}} of | |
| @var{members} using the previous macro. When @var{member} belongs to | |
| @var{aggregate}, define @code{HAVE_@var{aggregate}_@var{member}} (in all | |
| capitals, with spaces and dots replaced by underscores). If | |
| @var{action-if-found} is given, it is executed for each of the found | |
| members. If @var{action-if-not-found} is given, it is executed for each | |
| of the members that could not be found. | |
| @var{includes} is a series of include directives, defaulting to | |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used | |
| prior to the members under test. | |
| This macro uses M4 lists: | |
| @example | |
| AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize]) | |
| @end example | |
| @end defmac | |
| @node Types | |
| @section Types | |
| @cindex Types | |
| @cindex C types | |
| The following macros check for C types, either builtin or typedefs. If | |
| there is no macro specifically defined to check for a type you need, and | |
| you don't need to check for any special properties of it, then you can | |
| use a general type-check macro. | |
| @menu | |
| * Particular Types:: Special handling to find certain types | |
| * Generic Types:: How to find other types | |
| @end menu | |
| @node Particular Types | |
| @subsection Particular Type Checks | |
| @hdrindex{sys/types.h} | |
| @hdrindex{stdlib.h} | |
| @hdrindex{stdint.h} | |
| @hdrindex{inttypes.h} | |
| These macros check for particular C types in @file{sys/types.h}, | |
| @file{stdlib.h}, @file{stdint.h}, @file{inttypes.h} and others, if they | |
| exist. | |
| The Gnulib @code{stdint} module is an alternate way to define many of | |
| these symbols; it is useful if you prefer your code to assume a | |
| C99-or-better environment. @xref{Gnulib}. | |
| @anchor{AC_TYPE_GETGROUPS} | |
| @defmac AC_TYPE_GETGROUPS | |
| @acindex{TYPE_GETGROUPS} | |
| @cvindex GETGROUPS_T | |
| @caindex type_getgroups | |
| Define @code{GETGROUPS_T} to be whichever of @code{gid_t} or @code{int} | |
| is the base type of the array argument to @code{getgroups}. | |
| This macro caches the base type in the @code{ac_cv_type_getgroups} | |
| variable. | |
| @end defmac | |
| @defmac AC_TYPE_INT8_T | |
| @acindex{TYPE_INT8_T} | |
| @cvindex HAVE_INT8_T | |
| @cvindex int8_t | |
| @caindex c_int8_t | |
| If @file{stdint.h} or @file{inttypes.h} does not define the type | |
| @code{int8_t}, define @code{int8_t} to a signed | |
| integer type that is exactly 8 bits wide and that uses two's complement | |
| representation, if such a type exists. | |
| If you are worried about porting to hosts that lack such a type, you can | |
| use the results of this macro as follows: | |
| @example | |
| #if HAVE_STDINT_H | |
| # include <stdint.h> | |
| #endif | |
| #if defined INT8_MAX || defined int8_t | |
| @emph{code using int8_t} | |
| #else | |
| @emph{complicated alternative using >8-bit 'signed char'} | |
| #endif | |
| @end example | |
| This macro caches the type in the @code{ac_cv_c_int8_t} variable. | |
| @end defmac | |
| @defmac AC_TYPE_INT16_T | |
| @acindex{TYPE_INT16_T} | |
| @cvindex HAVE_INT16_T | |
| @cvindex int16_t | |
| @caindex c_int16_t | |
| This is like @code{AC_TYPE_INT8_T}, except for 16-bit integers. | |
| @end defmac | |
| @defmac AC_TYPE_INT32_T | |
| @acindex{TYPE_INT32_T} | |
| @cvindex HAVE_INT32_T | |
| @cvindex int32_t | |
| @caindex c_int32_t | |
| This is like @code{AC_TYPE_INT8_T}, except for 32-bit integers. | |
| @end defmac | |
| @defmac AC_TYPE_INT64_T | |
| @acindex{TYPE_INT64_T} | |
| @cvindex HAVE_INT64_T | |
| @cvindex int64_t | |
| @caindex c_int64_t | |
| This is like @code{AC_TYPE_INT8_T}, except for 64-bit integers. | |
| @end defmac | |
| @defmac AC_TYPE_INTMAX_T | |
| @acindex{TYPE_INTMAX_T} | |
| @cvindex HAVE_INTMAX_T | |
| @cvindex intmax_t | |
| @c @caindex type_intmax_t | |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{intmax_t}, | |
| define @code{HAVE_INTMAX_T}. Otherwise, define @code{intmax_t} to the | |
| widest signed integer type. | |
| @end defmac | |
| @defmac AC_TYPE_INTPTR_T | |
| @acindex{TYPE_INTPTR_T} | |
| @cvindex HAVE_INTPTR_T | |
| @cvindex intptr_t | |
| @c @caindex type_intptr_t | |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{intptr_t}, | |
| define @code{HAVE_INTPTR_T}. Otherwise, define @code{intptr_t} to a | |
| signed integer type wide enough to hold a pointer, if such a type | |
| exists. | |
| @end defmac | |
| @defmac AC_TYPE_LONG_DOUBLE | |
| @acindex{TYPE_LONG_DOUBLE} | |
| @cvindex HAVE_LONG_DOUBLE | |
| @caindex type_long_double | |
| If the C compiler supports a working @code{long double} type, define | |
| @code{HAVE_LONG_DOUBLE}. The @code{long double} type might have the | |
| same range and precision as @code{double}. | |
| This macro caches its result in the @code{ac_cv_type_long_double} | |
| variable. | |
| This macro is obsolescent, as current C compilers support @code{long | |
| double}. New programs need not use this macro. | |
| @end defmac | |
| @defmac AC_TYPE_LONG_DOUBLE_WIDER | |
| @acindex{TYPE_LONG_DOUBLE_WIDER} | |
| @cvindex HAVE_LONG_DOUBLE_WIDER | |
| @caindex type_long_double_wider | |
| If the C compiler supports a working @code{long double} type with more | |
| range or precision than the @code{double} type, define | |
| @code{HAVE_LONG_DOUBLE_WIDER}. | |
| This macro caches its result in the @code{ac_cv_type_long_double_wider} | |
| variable. | |
| @end defmac | |
| @defmac AC_TYPE_LONG_LONG_INT | |
| @acindex{TYPE_LONG_LONG_INT} | |
| @cvindex HAVE_LONG_LONG_INT | |
| @caindex type_long_long_int | |
| If the C compiler supports a working @code{long long int} type, define | |
| @code{HAVE_LONG_LONG_INT}. However, this test does not test | |
| @code{long long int} values in preprocessor @code{#if} expressions, | |
| because too many compilers mishandle such expressions. | |
| @xref{Preprocessor Arithmetic}. | |
| This macro caches its result in the @code{ac_cv_type_long_long_int} | |
| variable. | |
| @end defmac | |
| @defmac AC_TYPE_MBSTATE_T | |
| @acindex{TYPE_MBSTATE_T} | |
| @cvindex mbstate_t | |
| @hdrindex{wchar.h} | |
| @caindex type_mbstate_t | |
| Define @code{HAVE_MBSTATE_T} if @code{<wchar.h>} declares the | |
| @code{mbstate_t} type. Also, define @code{mbstate_t} to be a type if | |
| @code{<wchar.h>} does not declare it. | |
| This macro caches its result in the @code{ac_cv_type_mbstate_t} | |
| variable. | |
| @end defmac | |
| @anchor{AC_TYPE_MODE_T} | |
| @defmac AC_TYPE_MODE_T | |
| @acindex{TYPE_MODE_T} | |
| @cvindex mode_t | |
| @caindex type_mode_t | |
| Define @code{mode_t} to a suitable type, if standard headers do not | |
| define it. | |
| This macro caches its result in the @code{ac_cv_type_mode_t} variable. | |
| @end defmac | |
| @anchor{AC_TYPE_OFF_T} | |
| @defmac AC_TYPE_OFF_T | |
| @acindex{TYPE_OFF_T} | |
| @cvindex off_t | |
| @caindex type_off_t | |
| Define @code{off_t} to a suitable type, if standard headers do not | |
| define it. | |
| This macro caches its result in the @code{ac_cv_type_off_t} variable. | |
| @end defmac | |
| @anchor{AC_TYPE_PID_T} | |
| @defmac AC_TYPE_PID_T | |
| @acindex{TYPE_PID_T} | |
| @cvindex pid_t | |
| @caindex type_pid_t | |
| Define @code{pid_t} to a suitable type, if standard headers do not | |
| define it. | |
| This macro caches its result in the @code{ac_cv_type_pid_t} variable. | |
| @end defmac | |
| @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 | |
| * Algol 68 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 for both C++ and non-C99 C; | |
| 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 Algol 68 Compiler | |
| @subsection Algol 68 Compiler | |
| @cindex Algol 68 | |
| Autoconf provides basic support for the Algol 68 programming language | |
| when using the @code{ga68} compiler. | |
| Note that the GCC Algol 68 front-end is not yet integrated in the main | |
| compiler, so it is developed and distributed off-tree. See | |
| @url{https://gcc.gnu.org/wiki/Algol68FrontEnd}. Additional information | |
| about the Algol 68 programming language, and how it is being evolved by | |
| the GNU Algol 68 Working Group can be found at | |
| @url{https://algol68-lang.org}. | |
| @defmac AC_PROG_A68 (@ovar{compiler-search-list}) | |
| Find the Algol 68 compiler to use. Check whether the environment | |
| variable @code{A68} is set; if so, then set output variable @code{A68} | |
| to its value. | |
| Otherwise, if the macro is invoked without an argument, then search for | |
| an Algol 68 compiler named @code{ga68}. If it is not found, then as a | |
| last resort set @code{A68} to @code{ga68}. | |
| This macro may be invoked with an optional first argument which, if | |
| specified, must be a blank-separated list of Algol 68 compilers to | |
| search for. | |
| If output variable @code{A68FLAGS} was not already set, set it to | |
| @option{-g -O2}. If your package does not like this default, | |
| @code{A68FLAGS} may be set before @code{AC_PROG_A68}. | |
| @end defmac | |
| @node System Services | |
| @section System Services | |
| The following macros check for operating system services or capabilities. | |
| @anchor{AC_PATH_X} | |
| @defmac AC_PATH_X | |
| @acindex{PATH_X} | |
| @evindex XMKMF | |
| @cindex X Window System | |
| Try to locate the X Window System include files and libraries. If the | |
| user gave the command line options @option{--x-includes=@var{dir}} and | |
| @option{--x-libraries=@var{dir}}, use those directories. | |
| If either or both were not given, get the missing values by running | |
| @code{xmkmf} (or an executable pointed to by the @code{XMKMF} | |
| environment variable) on a trivial @file{Imakefile} and examining the | |
| makefile that it produces. Setting @code{XMKMF} to @samp{false} | |
| disables this method. | |
| If this method fails to find the X Window System, @command{configure} | |
| looks for the files in several directories where they often reside. | |
| If either method is successful, set the shell variables | |
| @code{x_includes} and @code{x_libraries} to their locations, unless they | |
| are in directories the compiler searches by default. | |
| If both methods fail, or the user gave the command line option | |
| @option{--without-x}, set the shell variable @code{no_x} to @samp{yes}; | |
| otherwise set it to the empty string. | |
| @end defmac | |
| @anchor{AC_PATH_XTRA} | |
| @defmac AC_PATH_XTRA | |
| @acindex{PATH_XTRA} | |
| @ovindex X_CFLAGS | |
| @ovindex X_LIBS | |
| @ovindex X_EXTRA_LIBS | |
| @ovindex X_PRE_LIBS | |
| @cvindex X_DISPLAY_MISSING | |
| An enhanced version of @code{AC_PATH_X}. It adds the C compiler flags | |
| that X needs to output variable @code{X_CFLAGS}, and the X linker flags | |
| to @code{X_LIBS}. Define @code{X_DISPLAY_MISSING} if X is not | |
| available. | |
| This macro also checks for special libraries that some systems need in | |
| order to compile X programs. It adds any that the system needs to | |
| output variable @code{X_EXTRA_LIBS}. And it checks for special X11R6 | |
| libraries that need to be linked with before @option{-lX11}, and adds | |
| any found to the output variable @code{X_PRE_LIBS}. | |
| @c This is an incomplete kludge. Make a real way to do it. | |
| @c If you need to check for other X functions or libraries yourself, then | |
| @c after calling this macro, add the contents of @code{X_EXTRA_LIBS} to | |
| @c @code{LIBS} temporarily, like this: (FIXME - add example) | |
| @end defmac | |
| @anchor{AC_SYS_INTERPRETER} | |
| @defmac AC_SYS_INTERPRETER | |
| @acindex{SYS_INTERPRETER} | |
| Check whether the system supports starting scripts with a line of the | |
| form @samp{#!/bin/sh} to select the interpreter to use for the script. | |
| After running this macro, shell code in @file{configure.ac} can check | |
| the shell variable @code{interpval}; it is set to @samp{yes} | |
| if the system supports @samp{#!}, @samp{no} if not. | |
| @end defmac | |
| @anchor{AC_SYS_LARGEFILE} | |
| @defmac AC_SYS_LARGEFILE | |
| @acindex{SYS_LARGEFILE} | |
| @cvindex _FILE_OFFSET_BITS | |
| @cvindex _TIME_BITS | |
| @ovindex CC | |
| @cindex Large file support | |
| @cindex LFS | |
| If the default @code{off_t} type is a 32-bit integer, | |
| and therefore cannot be used with files 2 GiB or larger, | |
| make a wider @code{off_t} available if the system supports it. | |
| Similarly, widen other types related to sizes of files and file systems | |
| if possible. These types may include @code{blkcnt_t}, @code{dev_t}, | |
| @code{ino_t}, @code{fsblkcnt_t}, @code{fsfilcnt_t}, and @code{rlim_t}. | |
| Also, arrange for a @command{configure} option @code{--enable-year2038} | |
| to request widening the type @code{time_t} as needed to represent file | |
| wand other timestamps after mid-January 2038. This widening is possible | |
| only on 32-bit GNU/Linux x86 and ARM systems with glibc 2.34 or later. | |
| If year-2038 support is requested but @command{configure} fails to find a way | |
| to widen @code{time_t} and inspection of the system suggests that | |
| this feature is available somehow, @command{configure} will error out. | |
| If you want the default to be @code{--enable-year2038}, you can use | |
| @code{AC_SYS_YEAR2038} or @code{AC_SYS_YEAR2038_RECOMMENDED} | |
| instead of @code{AC_SYS_LARGEFILE}. | |
| In other words, older packages that have long used @code{AC_SYS_LARGEFILE} | |
| can have year-2038 support on 32-bit GNU/Linux x86 and ARM systems either by | |
| regenerating @file{configure} with current Autoconf and configuring with | |
| @option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} or | |
| @code{AC_SYS_YEAR2038_RECOMMENDED} and configuring without | |
| @option{--disable-year2038}. | |
| A future version of Autoconf might change the @code{AC_SYS_LARGEFILE} | |
| default to @code{--enable-year2038}; if and when that happens, | |
| @code{AC_SYS_LARGEFILE} and @code{AC_SYS_YEAR2038} will become equivalent. | |
| @xref{AC_SYS_YEAR2038}. | |
| Set the shell variable @code{ac_have_largefile} to @samp{yes} or | |
| @code{no} depending on whether a wide @code{off_t} is available, | |
| regardless of whether arrangements were necessary. | |
| Similarly, set the shell variable @code{ac_have_year2038} to @code{yes} | |
| or @code{no} depending on whether a wide-enough @code{time_t} is available. | |
| Define preprocessor macros if necessary to make types wider; | |
| for example, on GNU/Linux systems the macros @code{_FILE_OFFSET_BITS} | |
| and @code{_TIME_BITS} can be defined. Some of these macros work only if | |
| defined before the first system header is included; | |
| therefore, when using this macro in concert with | |
| @code{AC_CONFIG_HEADERS}, make sure that @file{config.h} is included | |
| before any system headers. | |
| Large-file support can be disabled by configuring with the | |
| @option{--disable-largefile} option, and year-2038 support can | |
| be enabled and disabled via the @option{--enable-year2038} and | |
| @option{--disable-year2038} options. These options have no effect on | |
| systems where types are wide enough by default. | |
| Large-file support is required for year-2038 support: if you configure | |
| with @option{--disable-largefile} on a platform with 32-bit | |
| @code{time_t}, then year-2038 support is not available. | |
| Disabling large-file or year-2038 support can have surprising effects, | |
| such as causing functions like @code{readdir} and @code{stat} to fail | |
| even on a small file because its inode number or timestamp is out of range. | |
| Regardless of whether you use this macro, portable programs should not | |
| assume that any of the types listed above fit into a @code{long int}. | |
| For example, it is not portable to print an arbitrary @code{off_t} or | |
| @code{time_t} value @code{X} with @code{printf ("%ld", (long int) X)}. | |
| The standard C library functions @code{fseek} and @code{ftell} | |
| do not use @code{off_t}. If you need to use either of these functions, | |
| you should use @code{AC_FUNC_FSEEKO} as well as @code{AC_SYS_LARGEFILE}, | |
| and then use their POSIX replacements @code{fseeko} and @code{ftello}. | |
| @xref{AC_FUNC_FSEEKO}. | |
| When using @code{AC_SYS_LARGEFILE} in different packages that are linked | |
| together and that have interfaces that depend on the width of @code{off_t}, | |
| @code{time_t} or related types, the simplest thing is to configure all | |
| components the same way. For example, if an application uses | |
| @code{AC_SYS_LARGEFILE} and is configured with | |
| @option{--enable-year2038}, libraries it links to with an @code{off_t}- | |
| or @code{time_t}-dependent interface should be configured equivalently. | |
| Alternatively, you can modify libraries to support both 32- and 64-bit | |
| interfaces though this is more work and few libraries other than the C | |
| library itself are modified in this way. | |
| Applications and libraries should be configured compatibly. | |
| If @code{off_t}, @code{time_t} or related types appear in a library's | |
| public interface, enabling or disabling the library's large-file or | |
| year-2038 support may break binary compatibility with applications or | |
| with other libraries. Similarly, if an application links to a such a | |
| library, enabling or disabling the application's large-file support may | |
| break binary compatibility with that library. | |
| @end defmac | |
| @anchor{AC_SYS_LONG_FILE_NAMES} | |
| @defmac AC_SYS_LONG_FILE_NAMES | |
| @acindex{SYS_LONG_FILE_NAMES} | |
| @cvindex HAVE_LONG_FILE_NAMES | |
| If the system supports file names longer than 14 characters, define | |
| @code{HAVE_LONG_FILE_NAMES}. | |
| @end defmac | |
| @defmac AC_SYS_POSIX_TERMIOS | |
| @acindex{SYS_POSIX_TERMIOS} | |
| @cindex POSIX termios headers | |
| @cindex termios POSIX headers | |
| @caindex sys_posix_termios | |
| Check to see if the POSIX termios headers and functions are available on the | |
| system. If so, set the shell variable @code{ac_cv_sys_posix_termios} to | |
| @samp{yes}. If not, set the variable to @samp{no}. | |
| @end defmac | |
| @anchor{AC_SYS_YEAR2038} | |
| @defmac AC_SYS_YEAR2038 | |
| @acindex{SYS_YEAR2038} | |
| @cindex Year 2038 | |
| This is like @code{AC_SYS_LARGEFILE} except it defaults to enabling | |
| instead of disabling year-2038 support. Year-2038 support for | |
| applications and libraries should be configured compatibly. | |
| @xref{AC_SYS_LARGEFILE}. | |
| @end defmac | |
| @defmac AC_SYS_YEAR2038_RECOMMENDED | |
| @acindex{SYS_YEAR2038_RECOMMENDED} | |
| This macro has the same effect as @code{AC_SYS_YEAR2038}, | |
| but also declares that the program being configured | |
| should support timestamps after mid-January 2038. | |
| If a large @code{time_t} is unavailable, @command{configure} will error | |
| out unless the @option{--disable-year2038} option is specified. | |
| Year-2038 support for applications and libraries should be configured | |
| compatibly. @xref{AC_SYS_YEAR2038}. | |
| @end defmac | |
| @node C and POSIX Variants | |
| @section C and POSIX Variants | |
| The following macro makes it possible to use C language and library | |
| extensions defined by the C standards committee, features of POSIX that | |
| are extensions to C, and platform extensions not defined by POSIX. | |
| @anchor{AC_USE_SYSTEM_EXTENSIONS} | |
| @defmac AC_USE_SYSTEM_EXTENSIONS | |
| @acindex{USE_SYSTEM_EXTENSIONS} | |
| If possible, enable extensions to C or POSIX on hosts that normally | |
| disable the extensions, typically due to standards-conformance namespace | |
| issues. This should be called before any macros that run the C | |
| compiler. Also, when using this macro in concert with | |
| @code{AC_CONFIG_HEADERS}, be sure that @file{config.h} is included | |
| before any system header. | |
| Define the following preprocessor macros unconditionally: | |
| @table @code | |
| @item _ALL_SOURCE | |
| @cvindex _ALL_SOURCE | |
| Enable extensions on AIX and z/OS. | |
| @item _COSMO_SOURCE | |
| @cvindex _COSMO_SOURCE | |
| Enable extensions on Cosmopolitan Libc. | |
| @item _DARWIN_C_SOURCE | |
| @cvindex _DARWIN_C_SOURCE | |
| Enable extensions on macOS. | |
| @item _GNU_SOURCE | |
| @cvindex _GNU_SOURCE | |
| Enable extensions on GNU systems. | |
| @item _NETBSD_SOURCE | |
| @cvindex _NETBSD_SOURCE | |
| Enable general extensions on NetBSD. | |
| Enable NetBSD compatibility extensions on Minix. | |
| @item _OPENBSD_SOURCE | |
| @cvindex _OPENBSD_SOURCE | |
| Enable OpenBSD compatibility extensions on NetBSD. | |
| Oddly enough, this does nothing on OpenBSD. | |
| @item _POSIX_PTHREAD_SEMANTICS | |
| @cvindex _POSIX_PTHREAD_SEMANTICS | |
| Enable POSIX-compatible threading on Solaris. | |
| @item __STDC_WANT_IEC_60559_ATTRIBS_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_ATTRIBS_EXT__ | |
| Enable extensions specified by ISO/IEC TS 18661-5:2014. | |
| @item __STDC_WANT_IEC_60559_BFP_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_BFP_EXT__ | |
| Enable extensions specified by ISO/IEC TS 18661-1:2014. | |
| @item __STDC_WANT_IEC_60559_DFP_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_DFP_EXT__ | |
| Enable extensions specified by ISO/IEC TS 18661-2:2015. | |
| @item __STDC_WANT_IEC_60559_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_EXT__ | |
| Enable extensions specified by C23 Annex F. | |
| @item __STDC_WANT_IEC_60559_FUNCS_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_FUNCS_EXT__ | |
| Enable extensions specified by ISO/IEC TS 18661-4:2015. | |
| @item __STDC_WANT_IEC_60559_TYPES_EXT__ | |
| @cvindex __STDC_WANT_IEC_60559_TYPES_EXT__ | |
| Enable extensions specified by C23 Annex H and by ISO/IEC TS 18661-3:2015. | |
| @item __STDC_WANT_LIB_EXT2__ | |
| @cvindex __STDC_WANT_LIB_EXT2__ | |
| Enable extensions specified by ISO/IEC TR 24731-2:2010. | |
| @item __STDC_WANT_MATH_SPEC_FUNCS__ | |
| @cvindex __STDC_WANT_MATH_SPEC_FUNCS__ | |
| Enable extensions specified by ISO/IEC 24747:2009. | |
| @item _TANDEM_SOURCE | |
| @cvindex _TANDEM_SOURCE | |
| Enable extensions on HP NonStop systems. | |
| @end table | |
| The following preprocessor macros are defined only when necessary; | |
| they enable access to extensions on some operating systems but | |
| @emph{disable} extensions on other operating systems. | |
| @table @code | |
| @item __EXTENSIONS__ | |
| @cvindex __EXTENSIONS__ | |
| Enable general extensions on Solaris. This macro is defined only if | |
| the headers included by @code{AC_INCLUDES_DEFAULT} | |
| (@pxref{Default Includes}) work correctly with it defined. | |
| @item _MINIX | |
| @itemx _POSIX_SOURCE | |
| @itemx _POSIX_1_SOURCE | |
| @cvindex _MINIX | |
| @cvindex _POSIX_SOURCE | |
| @cvindex _POSIX_1_SOURCE | |
| Defined only on MINIX. @code{_POSIX_SOURCE} and @code{_POSIX_1_SOURCE} | |
| are needed to enable a number of POSIX features on this OS. | |
| @code{_MINIX} does not affect the system headers' behavior; | |
| future versions of Autoconf may stop defining it. | |
| Programs that need to recognize Minix should use @code{AC_CANONICAL_HOST}. | |
| @item _XOPEN_SOURCE | |
| @cvindex _XOPEN_SOURCE | |
| Defined (with value 500) only if needed to make @file{wchar.h} declare | |
| @code{mbstate_t}. This is known to be necessary on some versions of HP-UX. | |
| @end table | |
| @cvindex __STDC_WANT_DEC_FP__ | |
| The C preprocessor macro @code{__STDC_WANT_DEC_FP__} is not defined. | |
| ISO/IEC TR 24732:2009 was superseded by ISO/IEC TS 18661-2:2015. | |
| @cvindex __STDC_WANT_LIB_EXT1__ | |
| The C preprocessor macro @code{__STDC_WANT_LIB_EXT1__} is not defined, | |
| as the C standard's Annex K is problematic. See: O'Donell C, Sebor M. | |
| @uref{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm, Field | |
| Experience With Annex K---Bounds Checking Interfaces}. | |
| The Autoconf macro @code{AC_USE_SYSTEM_EXTENSIONS} was introduced in | |
| Autoconf 2.60. | |
| @end defmac | |
| @node Erlang Libraries | |
| @section Erlang Libraries | |
| @cindex Erlang, Library, checking | |
| The following macros check for an installation of Erlang/OTP, and for the | |
| presence of certain Erlang libraries. All those macros require the | |
| configuration of an Erlang interpreter and an Erlang compiler | |
| (@pxref{Erlang Compiler and Interpreter}). | |
| @defmac AC_ERLANG_SUBST_ERTS_VER | |
| @acindex{ERLANG_SUBST_ERTS_VER} | |
| @ovindex ERLANG_ERTS_VER | |
| Set the output variable @code{ERLANG_ERTS_VER} to the version of the | |
| Erlang runtime system (as returned by Erlang's | |
| @code{erlang:system_info(version)} function). The result of this test | |
| is cached if caching is enabled when running @command{configure}. The | |
| @code{ERLANG_ERTS_VER} variable is not intended to be used for testing | |
| for features of specific ERTS versions, but to be used for substituting | |
| the ERTS version in Erlang/OTP release resource files (@code{.rel} | |
| files), as shown below. | |
| @end defmac | |
| @defmac AC_ERLANG_SUBST_ROOT_DIR | |
| @acindex{ERLANG_SUBST_ROOT_DIR} | |
| @ovindex ERLANG_ROOT_DIR | |
| Set the output variable @code{ERLANG_ROOT_DIR} to the path to the base | |
| directory in which Erlang/OTP is installed (as returned by Erlang's | |
| @code{code:root_dir/0} function). The result of this test is cached if | |
| caching is enabled when running @command{configure}. | |
| @end defmac | |
| @defmac AC_ERLANG_SUBST_LIB_DIR | |
| @acindex{ERLANG_SUBST_LIB_DIR} | |
| @ovindex ERLANG_LIB_DIR | |
| Set the output variable @code{ERLANG_LIB_DIR} to the path of the library | |
| directory of Erlang/OTP (as returned by Erlang's | |
| @code{code:lib_dir/0} function), which subdirectories each contain an installed | |
| Erlang/OTP library. The result of this test is cached if caching is enabled | |
| when running @command{configure}. | |
| @end defmac | |
| @defmac AC_ERLANG_CHECK_LIB (@var{library}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{ERLANG_CHECK_LIB} | |
| @ovindex ERLANG_LIB_DIR_@var{library} | |
| @ovindex ERLANG_LIB_VER_@var{library} | |
| Test whether the Erlang/OTP library @var{library} is installed by | |
| calling Erlang's @code{code:lib_dir/1} function. The result of this | |
| test is cached if caching is enabled when running @command{configure}. | |
| @var{action-if-found} is a list of shell commands to run if the library | |
| is installed; @var{action-if-not-found} is a list of shell commands to | |
| run if it is not. Additionally, if the library is installed, the output | |
| variable @samp{ERLANG_LIB_DIR_@var{library}} is set to the path to the | |
| library installation directory, and the output variable | |
| @samp{ERLANG_LIB_VER_@var{library}} is set to the version number that is | |
| part of the subdirectory name, if it is in the standard form | |
| (@code{@var{library}-@var{version}}). If the directory name does not | |
| have a version part, @samp{ERLANG_LIB_VER_@var{library}} is set to the | |
| empty string. If the library is not installed, | |
| @samp{ERLANG_LIB_DIR_@var{library}} and | |
| @samp{ERLANG_LIB_VER_@var{library}} are set to @code{"not found"}. For | |
| example, to check if library @code{stdlib} is installed: | |
| @example | |
| AC_ERLANG_CHECK_LIB([stdlib], | |
| [AS_ECHO(["stdlib version \"$ERLANG_LIB_VER_stdlib\""]) | |
| AS_ECHO(["is installed in \"$ERLANG_LIB_DIR_stdlib\""])], | |
| [AC_MSG_ERROR([stdlib was not found!])]) | |
| @end example | |
| The @samp{ERLANG_LIB_VER_@var{library}} variables (set by | |
| @code{AC_ERLANG_CHECK_LIB}) and the @code{ERLANG_ERTS_VER} variable (set | |
| by @code{AC_ERLANG_SUBST_ERTS_VER}) are not intended to be used for | |
| testing for features of specific versions of libraries or of the Erlang | |
| runtime system. Those variables are intended to be substituted in | |
| Erlang release resource files (@code{.rel} files). For instance, to | |
| generate a @file{example.rel} file for an application depending on the | |
| @code{stdlib} library, @file{configure.ac} could contain: | |
| @example | |
| AC_ERLANG_SUBST_ERTS_VER | |
| AC_ERLANG_CHECK_LIB([stdlib], | |
| [], | |
| [AC_MSG_ERROR([stdlib was not found!])]) | |
| AC_CONFIG_FILES([example.rel]) | |
| @end example | |
| @noindent | |
| The @file{example.rel.in} file used to generate @file{example.rel} | |
| should contain: | |
| @example | |
| @{release, | |
| @{"@@PACKAGE@@", "@@VERSION@@"@}, | |
| @{erts, "@@ERLANG_ERTS_VER@@"@}, | |
| [@{stdlib, "@@ERLANG_LIB_VER_stdlib@@"@}, | |
| @{@@PACKAGE@@, "@@VERSION@@"@}]@}. | |
| @end example | |
| @end defmac | |
| In addition to the above macros, which test installed Erlang libraries, the | |
| following macros determine the paths to the directories into which newly built | |
| Erlang libraries are to be installed: | |
| @defmac AC_ERLANG_SUBST_INSTALL_LIB_DIR | |
| @acindex{ERLANG_SUBST_INSTALL_LIB_DIR} | |
| @ovindex ERLANG_INSTALL_LIB_DIR | |
| Set the @code{ERLANG_INSTALL_LIB_DIR} output variable to the directory into | |
| which every built Erlang library should be installed in a separate | |
| subdirectory. | |
| If this variable is not set in the environment when @command{configure} runs, | |
| its default value is @code{$@{libdir@}/erlang/lib}. | |
| @end defmac | |
| @defmac AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (@var{library}, @var{version}) | |
| @acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR} | |
| @ovindex ERLANG_INSTALL_LIB_DIR_@var{library} | |
| Set the @samp{ERLANG_INSTALL_LIB_DIR_@var{library}} output variable to the | |
| directory into which the built Erlang library @var{library} version | |
| @var{version} should be installed. If this variable is not set in the | |
| environment when @command{configure} runs, its default value is | |
| @samp{$ERLANG_INSTALL_LIB_DIR/@var{library}-@var{version}}, the value of the | |
| @code{ERLANG_INSTALL_LIB_DIR} variable being set by the | |
| @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} macro. | |
| @end defmac | |
| @c ========================================================= Writing Tests | |
| @node Writing Tests | |
| @chapter Writing Tests | |
| If the existing feature tests don't do something you need, you have to | |
| write new ones. These macros are the building blocks. They provide | |
| ways for other macros to check whether various kinds of features are | |
| available and report the results. | |
| This chapter contains some suggestions and some of the reasons why the | |
| existing tests are written the way they are. You can also learn a lot | |
| about how to write Autoconf tests by looking at the existing ones. If | |
| something goes wrong in one or more of the Autoconf tests, this | |
| information can help you understand the assumptions behind them, which | |
| might help you figure out how to best solve the problem. | |
| These macros check the output of the compiler system of the current | |
| language (@pxref{Language Choice}). They do not cache the results of | |
| their tests for future use (@pxref{Caching Results}), because they don't | |
| know enough about the information they are checking for to generate a | |
| cache variable name. They also do not print any messages, for the same | |
| reason. The checks for particular kinds of features call these macros | |
| and do cache their results and print messages about what they're | |
| checking for. | |
| When you write a feature test that could be applicable to more than one | |
| software package, the best thing to do is encapsulate it in a new macro. | |
| @xref{Writing Autoconf Macros}, for how to do that. | |
| @menu | |
| * Language Choice:: Selecting which language to use for testing | |
| * Writing Test Programs:: Forging source files for compilers | |
| * Running the Preprocessor:: Detecting preprocessor symbols | |
| * Running the Compiler:: Detecting language or header features | |
| * Running the Linker:: Detecting library features | |
| * Runtime:: Testing for runtime features | |
| * Multiple Cases:: Tests for several possible values | |
| @end menu | |
| @node Language Choice | |
| @section Language Choice | |
| @cindex Language | |
| Autoconf-generated @command{configure} scripts check for the C compiler and | |
| its features by default. Packages that use other programming languages | |
| (maybe more than one, e.g., C and C++) need to test features of the | |
| compilers for the respective languages. The following macros determine | |
| which programming language is used in the subsequent tests in | |
| @file{configure.ac}. | |
| @anchor{AC_LANG} | |
| @defmac AC_LANG (@var{language}) | |
| @acindex{LANG} | |
| Do compilation tests using the compiler, preprocessor, and file | |
| extensions for the specified @var{language}. | |
| Supported languages are: | |
| @table @samp | |
| @item C | |
| Do compilation tests using @code{CC} and @code{CPP} and use extension | |
| @file{.c} for test programs. Use compilation flags: @code{CPPFLAGS} with | |
| @code{CPP}, and both @code{CPPFLAGS} and @code{CFLAGS} with @code{CC}. | |
| @item C++ | |
| Do compilation tests using @code{CXX} and @code{CXXCPP} and use | |
| extension @file{.C} for test programs. Use compilation flags: | |
| @code{CPPFLAGS} with @code{CXXCPP}, and both @code{CPPFLAGS} and | |
| @code{CXXFLAGS} with @code{CXX}. | |
| @item Fortran 77 | |
| Do compilation tests using @code{F77} and use extension @file{.f} for | |
| test programs. Use compilation flags: @code{FFLAGS}. | |
| @item Fortran | |
| Do compilation tests using @code{FC} and use extension @file{.f} (or | |
| whatever has been set by @code{AC_FC_SRCEXT}) for test programs. Use | |
| compilation flags: @code{FCFLAGS}. | |
| @item Erlang | |
| @ovindex ERLC | |
| @ovindex ERL | |
| @ovindex ERLCFLAGS | |
| Compile and execute tests using @code{ERLC} and @code{ERL} and use extension | |
| @file{.erl} for test Erlang modules. Use compilation flags: @code{ERLCFLAGS}. | |
| @item Objective C | |
| Do compilation tests using @code{OBJC} and @code{OBJCPP} and use | |
| extension @file{.m} for test programs. Use compilation flags: | |
| @code{CPPFLAGS} with @code{OBJCPP}, and both @code{CPPFLAGS} and | |
| @code{OBJCFLAGS} with @code{OBJC}. | |
| @item Objective C++ | |
| Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use | |
| extension @file{.mm} for test programs. Use compilation flags: | |
| @code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and | |
| @code{OBJCXXFLAGS} with @code{OBJCXX}. | |
| @item Go | |
| Do compilation tests using @code{GOC} and use extension @file{.go} for | |
| test programs. Use compilation flags @code{GOFLAGS}. | |
| @item Algol 68 | |
| Do compilation tests using @code{A68} and use extension @file{.a68} for | |
| test programs. Use compilation flags @code{A68FLAGS}. | |
| @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, Go, or Algol 68, | |
| the @code{AC_DEFINE} | |
| definitions are not automatically translated into constants in the | |
| source code by this macro. | |
| @defmac AC_LANG_PROGRAM (@ovar{prologue}, @ovar{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, Go, or Algol 68 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]) | |
| @end example | |
| @command{autoheader} can generate a template from @var{description} only | |
| when @var{variable} expands to a literal symbol name. If the name is | |
| computed at configure time, you must add every possible name to the input | |
| template when using @code{AC_CONFIG_HEADERS}. Use @code{AH_TEMPLATE}, or | |
| add an @samp{#undef} directive to a hand-written header template. An | |
| omitted symbol remains undefined in the generated header, without a | |
| diagnostic. This works only when all possible names are known in advance. | |
| See @ref{Autoheader Macros} and @ref{Configuration Headers}. | |
| @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 --define=@var{macro}[=@var{value}] | |
| @itemx -D@var{macro}[=@var{value}] | |
| Define @var{macro} to expand to @var{value}. If @var{value} is omitted, | |
| the macro is defined with an empty expansion. | |
| The effects of this option are visible only to files that appear after | |
| the option on the command line. For instance, this command | |
| @example | |
| autom4te 1.m4 --define=PART=bolt 2.m4 | |
| @end example | |
| causes the macro @code{PART} to have a definition in @file{2.m4} but not | |
| in @file{1.m4}. | |
| @item --undefine=@var{macro} | |
| @itemx -U@var{macro} | |
| Undefine the macro @var{macro}. Like @option{--define}, the effects | |
| are visible only to files that appear after the option on the command | |
| line. Continuing the previous example, this command | |
| @example | |
| autom4te 1.m4 --define=PART=bolt 2.m4 --undefine=PART 3.m4 | |
| @end example | |
| causes the macro @code{PART} to have a definition in @file{2.m4} but | |
| not in @file{1.m4} or @file{3.m4}. | |
| @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} | |
| @anchor{m4_bpatsubst} | |
| This is the M4sugar name for the M4 native macro @code{patsubst}. | |
| It uses the same regular expression syntax as @code{m4_bregexp}; see | |
| @ref{m4_bregexp}. Also see @ref{Patsubst,,Substituting text by regular | |
| expression,m4,GNU m4 macro processor}, for details of how the | |
| @var{replacement} is processed. | |
| The name @code{m4_patsubst} is reserved for use by a future version of | |
| M4sugar, when there is a version of GNU M4 that supports POSIX extended | |
| regular expression syntax. | |
| @end defmac | |
| @defmac m4_bregexp (@var{string}, @var{regexp}, @ovar{replacement}) | |
| @msindex{bregexp} | |
| @anchor{m4_bregexp} | |
| This is the M4sugar name for the M4 native macro @code{regexp}. | |
| The only regular expression syntax understood by GNU M4 is similar to, | |
| but not the same as, POSIX basic regular expression syntax. | |
| @xref{Regexp,,Searching for regular expressions,m4,GNU m4 macro | |
| processor}, for the precise syntax. | |
| The name @code{m4_regexp} is reserved for use by a future version of | |
| M4sugar, when there is a version of GNU M4 that supports POSIX extended | |
| regular expression syntax. | |
| @end defmac | |
| @defmac m4_copy (@var{source}, @var{dest}) | |
| @defmacx m4_copy_force (@var{source}, @var{dest}) | |
| @defmacx m4_rename (@var{source}, @var{dest}) | |
| @defmacx m4_rename_force (@var{source}, @var{dest}) | |
| @msindex{copy} | |
| @msindex{copy_force} | |
| @msindex{rename} | |
| @msindex{rename_force} | |
| These macros aren't directly builtins, but are closely related to | |
| @code{m4_pushdef} and @code{m4_defn}. @code{m4_copy} and | |
| @code{m4_rename} ensure that @var{dest} is undefined, while | |
| @code{m4_copy_force} and @code{m4_rename_force} overwrite any existing | |
| definition. All four macros then proceed to copy the entire pushdef | |
| stack of definitions of @var{source} over to @var{dest}. @code{m4_copy} | |
| and @code{m4_copy_force} preserve the source (including in the special | |
| case where @var{source} is undefined), while @code{m4_rename} and | |
| @code{m4_rename_force} undefine the original macro name (making it an | |
| error to rename an undefined @var{source}). | |
| Note that attempting to invoke a renamed macro might not work, since the | |
| macro may have a dependence on helper macros accessed via composition of | |
| @samp{$0} but that were not also renamed; likewise, other macros may | |
| have a hard-coded dependence on @var{source} and could break if | |
| @var{source} has been deleted. On the other hand, it is always safe to | |
| rename a macro to temporarily move it out of the way, then rename it | |
| back later to restore original semantics. | |
| @end defmac | |
| @defmac m4_defn (@var{macro}@dots{}) | |
| @msindex{defn} | |
| This macro fails if @var{macro} is not defined, even when using older | |
| versions of M4 that did not warn. See @code{m4_undefine}. | |
| Unfortunately, in order to support these older versions of M4, there are | |
| some situations involving unbalanced quotes where concatenating multiple | |
| macros together will work in newer M4 but not in m4sugar; use | |
| quadrigraphs to work around this. | |
| @end defmac | |
| @defmac m4_divert (@var{diversion}) | |
| @msindex{divert} | |
| M4sugar relies heavily on diversions, so rather than behaving as a | |
| primitive, @code{m4_divert} behaves like: | |
| @example | |
| m4_divert_pop()m4_divert_push([@var{diversion}]) | |
| @end example | |
| @noindent | |
| @xref{Diversion support}, for more details about the use of the | |
| diversion stack. In particular, this implies that @var{diversion} | |
| should be a named diversion rather than a raw number. But be aware that | |
| it is seldom necessary to explicitly change the diversion stack, and | |
| that when done incorrectly, it can lead to syntactically invalid | |
| scripts. | |
| @end defmac | |
| @defmac m4_dumpdef (@var{name}@dots{}) | |
| @defmacx m4_dumpdefs (@var{name}@dots{}) | |
| @msindex{dumpdef} | |
| @msindex{dumpdefs} | |
| @code{m4_dumpdef} is like the M4 builtin, except that this version | |
| requires at least one argument, output always goes to standard error | |
| rather than the current debug file, no sorting is done on multiple | |
| arguments, and an error is issued if any | |
| @var{name} is undefined. @code{m4_dumpdefs} is a convenience macro that | |
| calls @code{m4_dumpdef} for all of the | |
| @code{m4_pushdef} stack of definitions, starting with the current, and | |
| silently does nothing if @var{name} is undefined. | |
| Unfortunately, due to a limitation in M4 1.4.x, any macro defined as a | |
| builtin is output as the empty string. This behavior is rectified by | |
| using M4 1.6 or newer. However, this behavior difference means that | |
| @code{m4_dumpdef} should only be used while developing m4sugar macros, | |
| and never in the final published form of a macro. | |
| @end defmac | |
| @defmac m4_esyscmd_s (@var{command}) | |
| @msindex{esyscmd_s} | |
| Like @code{m4_esyscmd}, this macro expands to the result of running | |
| @var{command} in a shell. The difference is that any trailing newlines | |
| are removed, so that the output behaves more like shell command | |
| substitution. | |
| @end defmac | |
| @defmac m4_exit (@var{exit-status}) | |
| @msindex{exit} | |
| This macro corresponds to @code{m4exit}. | |
| @end defmac | |
| @defmac m4_if (@var{comment}) | |
| @defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal}, @ovar{not-equal}) | |
| @defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal-1}, @ | |
| @var{string-3}, @var{string-4}, @var{equal-2}, @dots{}, @ovar{not-equal}) | |
| @msindex{if} | |
| This macro corresponds to @code{ifelse}. @var{string-1} and | |
| @var{string-2} are compared literally, so usually one of the two | |
| arguments is passed unquoted. @xref{Conditional constructs}, for more | |
| conditional idioms. | |
| @end defmac | |
| @defmac m4_include (@var{file}) | |
| @defmacx m4_sinclude (@var{file}) | |
| @msindex{include} | |
| @msindex{sinclude} | |
| Like the M4 builtins, but warn against multiple inclusions of @var{file}. | |
| @end defmac | |
| @defmac m4_mkstemp (@var{template}) | |
| @defmacx m4_maketemp (@var{template}) | |
| @msindex{maketemp} | |
| @msindex{mkstemp} | |
| Older versions of POSIX specified a macro @code{maketemp}, | |
| which replaced the trailing @samp{X} | |
| characters in @var{template} with the process id, without regards to the | |
| existence of a file by that name. | |
| This was a security hole, so current POSIX instead specifies a macro | |
| @code{mkstemp} that always creates a uniquely named file. In M4sugar, | |
| @code{m4_maketemp} and @code{m4_mkstemp} are synonyms for each other, | |
| and both have the secure semantics regardless of which macro the | |
| underlying M4 provides. | |
| @end defmac | |
| @defmac m4_popdef (@var{macro}@dots{}) | |
| @msindex{popdef} | |
| This macro fails if @var{macro} is not defined, even when using older | |
| versions of M4 that did not warn. See @code{m4_undefine}. | |
| @end defmac | |
| @defmac m4_undefine (@var{macro}@dots{}) | |
| @msindex{undefine} | |
| This macro fails if @var{macro} is not defined, even when using older | |
| versions of M4 that did not warn. Use | |
| @example | |
| m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])]) | |
| @end example | |
| @noindent | |
| if you are not sure whether @var{macro} is defined. | |
| @end defmac | |
| @defmac m4_undivert (@var{diversion}@dots{}) | |
| @msindex{undivert} | |
| Unlike the M4 builtin, at least one @var{diversion} must be specified. | |
| Also, since the M4sugar diversion stack prefers named | |
| diversions, the use of @code{m4_undivert} to include files is risky. | |
| @xref{Diversion support}, for more details about the use of the | |
| diversion stack. But be aware that it is seldom necessary to explicitly | |
| change the diversion stack, and that when done incorrectly, it can lead | |
| to syntactically invalid scripts. | |
| @end defmac | |
| @defmac m4_wrap (@var{text}) | |
| @defmacx m4_wrap_lifo (@var{text}) | |
| @msindex{wrap} | |
| @msindex{wrap_lifo} | |
| These macros correspond to @code{m4wrap}. POSIX requires arguments of | |
| multiple wrap calls to be reprocessed at EOF in the same order | |
| as the original calls (first-in, first-out). GNU M4 versions | |
| through 1.4.10, however, reprocess them in reverse order (last-in, | |
| first-out). Both orders are useful, therefore, you can rely on | |
| @code{m4_wrap} to provide FIFO semantics and @code{m4_wrap_lifo} for | |
| LIFO semantics, regardless of the underlying GNU M4 version. | |
| Unlike the GNU M4 builtin, these macros only recognize one | |
| argument, and avoid token pasting between consecutive invocations. On | |
| the other hand, nested calls to @code{m4_wrap} from within wrapped text | |
| work just as in the builtin. | |
| @end defmac | |
| @node Diagnostic Macros | |
| @subsection Diagnostic messages from M4sugar | |
| @cindex Messages, from @command{M4sugar} | |
| When macros statically diagnose abnormal situations, benign or fatal, | |
| they should report them using these macros. For issuing dynamic issues, | |
| i.e., when @command{configure} is run, see @ref{Printing Messages}. | |
| @defmac m4_assert (@var{expression}, @dvar{exit-status, 1}) | |
| @msindex{assert} | |
| Assert that the arithmetic @var{expression} evaluates to non-zero. | |
| Otherwise, issue a fatal error, and exit @command{autom4te} with | |
| @var{exit-status}. | |
| @end defmac | |
| @defmac m4_errprintn (@var{message}) | |
| @msindex{errprintn} | |
| Similar to the builtin @code{m4_errprint}, except that a newline is | |
| guaranteed after @var{message}. | |
| @end defmac | |
| @anchor{m4_fatal} | |
| @defmac m4_fatal (@var{message}) | |
| @msindex{fatal} | |
| Report a severe error @var{message} prefixed with the current location, | |
| and have @command{autom4te} die. | |
| @end defmac | |
| @defmac m4_location | |
| @msindex{location} | |
| Useful as a prefix in a message line. Short for: | |
| @example | |
| __file__:__line__ | |
| @end example | |
| @end defmac | |
| @anchor{m4_warn} | |
| @defmac m4_warn (@var{category}, @var{message}) | |
| @msindex{warn} | |
| Report @var{message} as a warning (or as an error if requested by the | |
| user) if warnings of the @var{category} are turned on. If the message | |
| is emitted, it is prefixed with the current location, and followed by a | |
| call trace of all macros defined via @code{AC_DEFUN} used to get to the | |
| current expansion. | |
| The @var{category} must be one of: | |
| @table @samp | |
| @item cross | |
| Warnings about constructs that may interfere with cross-compilation, | |
| such as using @code{AC_RUN_IFELSE} without a default. | |
| @item gnu | |
| Warnings related to the GNU Coding Standards | |
| (@pxref{Top,,, standards, The GNU Coding Standards}). | |
| On by default. | |
| @item obsolete | |
| Warnings about obsolete features. On by default. | |
| @item override | |
| Warnings about redefinitions of Autoconf internals. | |
| @item portability | |
| Warnings about non-portable constructs. | |
| @item portability-recursive | |
| Warnings about recursive Make variable expansions (@code{$(foo$(x))}). | |
| @item extra-portability | |
| Extra warnings about non-portable constructs, covering rarely-used | |
| tools. | |
| @item syntax | |
| Warnings about questionable syntactic constructs, incorrectly ordered | |
| macro calls, typos, etc. On by default. | |
| @item unsupported | |
| Warnings about unsupported features. On by default. | |
| @end table | |
| @strong{Hacking Note:} The set of categories is defined by code in | |
| @command{autom4te}, not by M4sugar itself. Additions should be | |
| coordinated with Automake, so that both sets of tools accept the same | |
| options. | |
| @end defmac | |
| @node Diversion support | |
| @subsection Diversion support | |
| M4sugar makes heavy use of diversions under the hood, because it is | |
| often the case that | |
| text that must appear early in the output is not discovered until late | |
| in the input. Additionally, some of the topological sorting algorithms | |
| used in resolving macro dependencies use diversions. However, most | |
| macros should not need to change diversions directly, but rather rely on | |
| higher-level M4sugar macros to manage diversions transparently. If you | |
| change diversions improperly, you risk generating a syntactically | |
| invalid script, because an incorrect diversion will violate assumptions | |
| made by many macros about whether prerequisite text has been previously | |
| output. In short, if you manually change the diversion, you should not | |
| expect any macros provided by the Autoconf package to work until you | |
| have restored the diversion stack back to its original state. | |
| In the rare case that it is necessary to write a macro that explicitly | |
| outputs text to a different diversion, it is important to be aware of an | |
| M4 limitation regarding diversions: text only goes to a diversion if it | |
| is not part of argument collection. Therefore, any macro that changes | |
| the current diversion cannot be used as an unquoted argument to another | |
| macro, but must be expanded at the top level. The macro | |
| @code{m4_expand} will diagnose any attempt to change diversions, since | |
| it is generally useful only as an argument to another macro. The | |
| following example shows what happens when diversion manipulation is | |
| attempted within macro arguments: | |
| @example | |
| m4_do([normal text] | |
| m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL]) | |
| [m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl | |
| @result{}normal text | |
| @result{}unwanted | |
| @end example | |
| @noindent | |
| Notice that the unquoted text @code{unwanted} is output, even though it | |
| was processed while the current diversion was @code{KILL}, because it | |
| was collected as part of the argument to @code{m4_do}. However, the | |
| text @code{discarded} disappeared as desired, because the diversion | |
| changes were single-quoted, and were not expanded until the top-level | |
| rescan of the output of @code{m4_do}. | |
| To make diversion management easier, M4sugar uses the concept of named | |
| diversions. Rather than using diversion numbers directly, it is nicer | |
| to associate a name with each diversion. The diversion number associated | |
| with a particular diversion name is an implementation detail, and a | |
| syntax warning is issued if a diversion number is used instead of a | |
| name. In general, you should not output text | |
| to a named diversion until after calling the appropriate initialization | |
| routine for your language (@code{m4_init}, @code{AS_INIT}, | |
| @code{AT_INIT}, @dots{}), although there are some exceptions documented | |
| below. | |
| M4sugar defines two named diversions. | |
| @table @code | |
| @item KILL | |
| Text written to this diversion is discarded. This is the default | |
| diversion once M4sugar is initialized. | |
| @item GROW | |
| This diversion is used behind the scenes by topological sorting macros, | |
| such as @code{AC_REQUIRE}. | |
| @end table | |
| M4sh adds several more named diversions. | |
| @table @code | |
| @item BINSH | |
| This diversion is reserved for the @samp{#!} interpreter line. | |
| @item HEADER-REVISION | |
| This diversion holds text from @code{AC_REVISION}. | |
| @item HEADER-COMMENT | |
| This diversion holds comments about the purpose of a file. | |
| @item HEADER-COPYRIGHT | |
| This diversion is managed by @code{AC_COPYRIGHT}. | |
| @item M4SH-SANITIZE | |
| This diversion contains M4sh sanitization code, used to ensure M4sh is | |
| executing in a reasonable shell environment. | |
| @item M4SH-INIT | |
| This diversion contains M4sh initialization code, initializing variables | |
| that are required by other M4sh macros. | |
| @item BODY | |
| This diversion contains the body of the shell code, and is the default | |
| diversion once M4sh is initialized. | |
| @end table | |
| Autotest inherits diversions from M4sh, and changes the default | |
| diversion from @code{BODY} back to @code{KILL}. It also adds several | |
| more named diversions, with the following subset designed for developer | |
| use. | |
| @table @code | |
| @item PREPARE_TESTS | |
| This diversion contains initialization sequences which are executed | |
| after @file{atconfig} and @file{atlocal}, and after all command line | |
| arguments have been parsed, but prior to running any tests. It can be | |
| used to set up state that is required across all tests. This diversion | |
| will work even before @code{AT_INIT}. | |
| @end table | |
| Autoconf inherits diversions from M4sh, and adds the following named | |
| diversions which developers can utilize. | |
| @table @code | |
| @item DEFAULTS | |
| This diversion contains shell variable assignments to set defaults that | |
| must be in place before arguments are parsed. This diversion is placed | |
| early enough in @file{configure} that it is unsafe to expand any | |
| autoconf macros into this diversion. | |
| @item HELP_ENABLE | |
| If @code{AC_PRESERVE_HELP_ORDER} was used, then text placed in this | |
| diversion will be included as part of a quoted here-doc providing all of | |
| the @option{--help} output of @file{configure} related to options | |
| created by @code{AC_ARG_WITH} and @code{AC_ARG_ENABLE}. | |
| @item INIT_PREPARE | |
| This diversion occurs after all command line options have been parsed, | |
| but prior to the main body of the @file{configure} script. This | |
| diversion is the last chance to insert shell code such as variable | |
| assignments or shell function declarations that will used by the | |
| expansion of other macros. | |
| @end table | |
| For now, the remaining named diversions of Autoconf, Autoheader, and | |
| Autotest are not documented. In other words, | |
| intentionally outputting text into an undocumented diversion is subject | |
| to breakage in a future release of Autoconf. | |
| @defmac m4_cleardivert (@var{diversion}@dots{}) | |
| @msindex{cleardivert} | |
| Permanently discard any text that has been diverted into | |
| @var{diversion}. | |
| @end defmac | |
| @defmac m4_divert_once (@var{diversion}, @ovar{content}) | |
| @msindex{divert_once} | |
| Similar to @code{m4_divert_text}, except that @var{content} is only | |
| output to @var{diversion} if this is the first time that | |
| @code{m4_divert_once} has been called with its particular arguments. | |
| @end defmac | |
| @defmac m4_divert_pop (@ovar{diversion}) | |
| @msindex{divert_pop} | |
| If provided, check that the current diversion is indeed @var{diversion}. | |
| Then change to the diversion located earlier on the stack, giving an | |
| error if an attempt is made to pop beyond the initial m4sugar diversion | |
| of @code{KILL}. | |
| @end defmac | |
| @defmac m4_divert_push (@var{diversion}) | |
| @msindex{divert_push} | |
| Remember the former diversion on the diversion stack, and output | |
| subsequent text into @var{diversion}. M4sugar maintains a diversion | |
| stack, and issues an error if there is not a matching pop for every | |
| push. | |
| @end defmac | |
| @anchor{m4_divert_text} | |
| @defmac m4_divert_text (@var{diversion}, @ovar{content}) | |
| @msindex{divert_text} | |
| Output @var{content} and a newline into @var{diversion}, without | |
| affecting the current diversion. Shorthand for: | |
| @example | |
| m4_divert_push([@var{diversion}])@var{content} | |
| m4_divert_pop([@var{diversion}])dnl | |
| @end example | |
| One use of @code{m4_divert_text} is to develop two related macros, where | |
| macro @samp{MY_A} does the work, but adjusts what work is performed | |
| based on whether the optional macro @samp{MY_B} has also been expanded. | |
| Of course, it is possible to use @code{AC_BEFORE} within @code{MY_A} to | |
| require that @samp{MY_B} occurs first, if it occurs at all. But this | |
| imposes an ordering restriction on the user; it would be nicer if macros | |
| @samp{MY_A} and @samp{MY_B} can be invoked in either order. The trick | |
| is to let @samp{MY_B} leave a breadcrumb in an early diversion, which | |
| @samp{MY_A} can then use to determine whether @samp{MY_B} has been | |
| expanded. | |
| @example | |
| AC_DEFUN([MY_A], | |
| [# various actions | |
| if test -n "$b_was_used"; then | |
| # extra action | |
| fi]) | |
| AC_DEFUN([MY_B], | |
| [AC_REQUIRE([MY_A])dnl | |
| m4_divert_text([INIT_PREPARE], [b_was_used=true])]) | |
| @end example | |
| @end defmac | |
| @defmac m4_init | |
| @msindex{init} | |
| Initialize the M4sugar environment, setting up the default named | |
| diversion to be @code{KILL}. | |
| @end defmac | |
| @node Conditional constructs | |
| @subsection Conditional constructs | |
| The following macros provide additional conditional constructs as | |
| convenience wrappers around @code{m4_if}. | |
| @defmac m4_bmatch (@var{string}, @var{regex-1}, @var{value-1}, @ | |
| @ovar{regex-2}, @ovar{value-2}, @dots{}, @ovar{default}) | |
| @msindex{bmatch} | |
| The string @var{string} is repeatedly compared against a series of | |
| @var{regex} arguments; if a match is found, the expansion is the | |
| corresponding @var{value}, otherwise, the macro moves on to the next | |
| @var{regex}. If no @var{regex} match, then the result is the optional | |
| @var{default}, or nothing. | |
| The regular expression syntax understood by @code{m4_bmatch} is the same as | |
| that understood by @code{m4_bregexp}; see @ref{m4_bregexp}. The name | |
| @code{m4_match} is reserved for use by a future version of M4sugar, when | |
| there is a version of GNU M4 that supports POSIX extended | |
| regular expression syntax. | |
| @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. | |
| The regular expression and replacement syntax understood by | |
| @code{m4_bpatsubsts} is the same as that understood by @code{m4_bpatsubst}; | |
| see @ref{m4_bpatsubst}. The name @code{m4_patsubsts} is reserved for use by | |
| future version of M4sugar, when there is a version of GNU M4 that | |
| supports POSIX extended regular expression syntax. | |
| @end defmac | |
| @defmac m4_case (@var{string}, @var{value-1}, @var{if-value-1}, @ | |
| @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default}) | |
| @msindex{case} | |
| Test @var{string} against multiple @var{value} possibilities, resulting | |
| in the first @var{if-value} for a match, or in the optional | |
| @var{default}. This is shorthand for: | |
| @example | |
| m4_if([@var{string}], [@var{value-1}], [@var{if-value-1}], | |
| [@var{string}], [@var{value-2}], [@var{if-value-2}], @dots{}, | |
| [@var{default}]) | |
| @end example | |
| @end defmac | |
| @defmac m4_cond (@var{test-1}, @var{value-1}, @var{if-value-1}, @ | |
| @ovar{test-2}, @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default}) | |
| @msindex{cond} | |
| This macro was introduced in Autoconf 2.62. Similar to @code{m4_if}, | |
| except that each @var{test} is expanded only when it is encountered. | |
| This is useful for short-circuiting expensive tests; while @code{m4_if} | |
| requires all its strings to be expanded up front before doing | |
| comparisons, @code{m4_cond} only expands a @var{test} when all earlier | |
| tests have failed. | |
| For an example, these two sequences give the same result, but in the | |
| case where @samp{$1} does not contain a backslash, the @code{m4_cond} | |
| version only expands @code{m4_index} once, instead of five times, for | |
| faster computation if this is a common case for @samp{$1}. Notice that | |
| every third argument is unquoted for @code{m4_if}, and quoted for | |
| @code{m4_cond}: | |
| @example | |
| m4_if(m4_index([$1], [\]), [-1], [$2], | |
| m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2], | |
| m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2], | |
| m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3], | |
| m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3], | |
| [$2]) | |
| m4_cond([m4_index([$1], [\])], [-1], [$2], | |
| [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2], | |
| [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2], | |
| [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3], | |
| [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3], | |
| [$2]) | |
| @end example | |
| @end defmac | |
| @defmac m4_default (@var{expr-1}, @var{expr-2}) | |
| @defmacx m4_default_quoted (@var{expr-1}, @var{expr-2}) | |
| @defmacx m4_default_nblank (@var{expr-1}, @ovar{expr-2}) | |
| @defmacx m4_default_nblank_quoted (@var{expr-1}, @ovar{expr-2}) | |
| @msindex{default} | |
| @msindex{default_quoted} | |
| @msindex{default_nblank} | |
| @msindex{default_nblank_quoted} | |
| If @var{expr-1} contains text, use it. Otherwise, select @var{expr-2}. | |
| @code{m4_default} expands the result, while @code{m4_default_quoted} | |
| does not. Useful for providing a fixed default if the expression that | |
| results in @var{expr-1} would otherwise be empty. The difference | |
| between @code{m4_default} and @code{m4_default_nblank} is whether an | |
| argument consisting of just blanks (space, tab, newline) is | |
| significant. When using the expanding versions, note that an argument | |
| may contain text but still expand to an empty string. | |
| @example | |
| m4_define([active], [ACTIVE])dnl | |
| m4_define([empty], [])dnl | |
| m4_define([demo1], [m4_default([$1], [$2])])dnl | |
| m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl | |
| m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl | |
| m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl | |
| demo1([active], [default]) | |
| @result{}ACTIVE | |
| demo1([], [active]) | |
| @result{}ACTIVE | |
| demo1([empty], [text]) | |
| @result{} | |
| -demo1([ ], [active])- | |
| @result{}- - | |
| demo2([active], [default]) | |
| @result{}active | |
| demo2([], [active]) | |
| @result{}active | |
| demo2([empty], [text]) | |
| @result{}empty | |
| -demo2([ ], [active])- | |
| @result{}- - | |
| demo3([active], [default]) | |
| @result{}ACTIVE | |
| demo3([], [active]) | |
| @result{}ACTIVE | |
| demo3([empty], [text]) | |
| @result{} | |
| -demo3([ ], [active])- | |
| @result{}-ACTIVE- | |
| demo4([active], [default]) | |
| @result{}active | |
| demo4([], [active]) | |
| @result{}active | |
| demo4([empty], [text]) | |
| @result{}empty | |
| -demo4([ ], [active])- | |
| @result{}-active- | |
| @end example | |
| @end defmac | |
| @defmac m4_define_default (@var{macro}, @ovar{default-definition}) | |
| @msindex{define_default} | |
| If @var{macro} does not already have a definition, then define it to | |
| @var{default-definition}. | |
| @end defmac | |
| @defmac m4_ifblank (@var{cond}, @ovar{if-blank}, @ovar{if-text}) | |
| @defmacx m4_ifnblank (@var{cond}, @ovar{if-text}, @ovar{if-blank}) | |
| @msindex{ifblank} | |
| @msindex{ifnblank} | |
| If @var{cond} is empty or consists only of blanks (space, tab, newline), | |
| then expand @var{if-blank}; otherwise, expand @var{if-text}. Two | |
| variants exist, in order to make it easier to select the correct logical | |
| sense when using only two parameters. Note that this is more efficient | |
| than the equivalent behavior of: | |
| @example | |
| m4_ifval(m4_normalize([@var{cond}]), @var{if-text}, @var{if-blank}) | |
| @end example | |
| @end defmac | |
| @defmac m4_ifndef (@var{macro}, @var{if-not-defined}, @ovar{if-defined}) | |
| @msindex{ifndef} | |
| This is shorthand for: | |
| @example | |
| m4_ifdef([@var{macro}], [@var{if-defined}], [@var{if-not-defined}]) | |
| @end example | |
| @end defmac | |
| @defmac m4_ifset (@var{macro}, @ovar{if-true}, @ovar{if-false}) | |
| @msindex{ifset} | |
| If @var{macro} is undefined, or is defined as the empty string, expand | |
| to @var{if-false}. Otherwise, expands to @var{if-true}. Similar to: | |
| @example | |
| m4_ifval(m4_defn([@var{macro}]), [@var{if-true}], [@var{if-false}]) | |
| @end example | |
| @noindent | |
| except that it is not an error if @var{macro} is undefined. | |
| @end defmac | |
| @defmac m4_ifval (@var{cond}, @ovar{if-true}, @ovar{if-false}) | |
| @msindex{ifval} | |
| Expands to @var{if-true} if @var{cond} is not empty, otherwise to | |
| @var{if-false}. This is shorthand for: | |
| @example | |
| m4_if([@var{cond}], [], [@var{if-false}], [@var{if-true}]) | |
| @end example | |
| @end defmac | |
| @defmac m4_ifvaln (@var{cond}, @ovar{if-true}, @ovar{if-false}) | |
| @msindex{ifvaln} | |
| Similar to @code{m4_ifval}, except guarantee that a newline is present | |
| after any non-empty expansion. Often followed by @code{dnl}. | |
| @end defmac | |
| @defmac m4_n (@var{text}) | |
| @msindex{n} | |
| Expand to @var{text}, and add a newline if @var{text} is not empty. | |
| Often followed by @code{dnl}. | |
| @end defmac | |
| @node Looping constructs | |
| @subsection Looping constructs | |
| The following macros are useful in implementing recursive algorithms in | |
| M4, including loop operations. An M4 list is formed by quoting a list | |
| of quoted elements; generally the lists are comma-separated, although | |
| @code{m4_foreach_w} is whitespace-separated. For example, the list | |
| @samp{[[a], [b,c]]} contains two elements: @samp{[a]} and @samp{[b,c]}. | |
| It is common to see lists with unquoted elements when those elements are | |
| not likely to be macro names, as in @samp{[fputc_unlocked, | |
| fgetc_unlocked]}. | |
| Although not generally recommended, it is possible for quoted lists to | |
| have side effects; all side effects are expanded only once, and prior to | |
| visiting any list element. On the other hand, the fact that unquoted | |
| macros are expanded exactly once means that macros without side effects | |
| can be used to generate lists. For example, | |
| @example | |
| m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i]) | |
| @error{}hi | |
| @result{}123 | |
| m4_define([list], [[1], [2], [3]]) | |
| @result{} | |
| m4_foreach([i], [list], [i]) | |
| @result{}123 | |
| @end example | |
| @defmac m4_argn (@var{n}, @ovar{arg}@dots{}) | |
| @msindex{argn} | |
| Extracts argument @var{n} (larger than 0) from the remaining arguments. | |
| If there are too few arguments, the empty string is used. For any | |
| @var{n} besides 1, this is more efficient than the similar | |
| @samp{m4_car(m4_shiftn([@var{n}], [], [@var{arg}@dots{}]))}. | |
| @end defmac | |
| @defmac m4_car (@var{arg}@dots{}) | |
| @msindex{car} | |
| Expands to the quoted first @var{arg}. Can be used with @code{m4_cdr} | |
| to recursively iterate | |
| through a list. Generally, when using quoted lists of quoted elements, | |
| @code{m4_car} should be called without any extra quotes. | |
| @end defmac | |
| @defmac m4_cdr (@var{arg}@dots{}) | |
| @msindex{cdr} | |
| Expands to a quoted list of all but the first @var{arg}, or the empty | |
| string if there was only one argument. Generally, when using quoted | |
| lists of quoted elements, @code{m4_cdr} should be called without any | |
| extra quotes. | |
| For example, this is a simple implementation of @code{m4_map}; note how | |
| each iteration checks for the end of recursion, then merely applies the | |
| first argument to the first element of the list, then repeats with the | |
| rest of the list. (The actual implementation in M4sugar is a bit more | |
| involved, to gain some speed and share code with @code{m4_map_sep}, and | |
| also to avoid expanding side effects in @samp{$2} twice). | |
| @example | |
| m4_define([m4_map], [m4_ifval([$2], | |
| [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl | |
| m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]]) | |
| @result{} 1 2 a | |
| @end example | |
| @end defmac | |
| @defmac m4_for (@var{var}, @var{first}, @var{last}, @ovar{step}, @ | |
| @var{expression}) | |
| @msindex{for} | |
| Loop over the numeric values between @var{first} and @var{last} | |
| including bounds by increments of @var{step}. For each iteration, | |
| expand @var{expression} with the numeric value assigned to @var{var}. | |
| If @var{step} is omitted, it defaults to @samp{1} or @samp{-1} depending | |
| on the order of the limits. If given, @var{step} has to match this | |
| order. The number of iterations is determined independently from | |
| definition of @var{var}; iteration cannot be short-circuited or | |
| lengthened by modifying @var{var} from within @var{expression}. | |
| @end defmac | |
| @defmac m4_foreach (@var{var}, @var{list}, @var{expression}) | |
| @msindex{foreach} | |
| Loop over the comma-separated M4 list @var{list}, assigning each value | |
| to @var{var}, and expand @var{expression}. The following example | |
| outputs two lines: | |
| @example | |
| m4_foreach([myvar], [[foo], [bar, baz]], | |
| [echo myvar | |
| ])dnl | |
| @result{}echo foo | |
| @result{}echo bar, baz | |
| @end example | |
| Note that for some forms of @var{expression}, it may be faster to use | |
| @code{m4_map_args}. | |
| @end defmac | |
| @anchor{m4_foreach_w} | |
| @defmac m4_foreach_w (@var{var}, @var{list}, @var{expression}) | |
| @msindex{foreach_w} | |
| Loop over the white-space-separated list @var{list}, assigning each value | |
| to @var{var}, and expand @var{expression}. If @var{var} is only | |
| referenced once in @var{expression}, it is more efficient to use | |
| @code{m4_map_args_w}. | |
| The deprecated macro @code{AC_FOREACH} is an alias of | |
| @code{m4_foreach_w}. | |
| @end defmac | |
| @defmac m4_map (@var{macro}, @var{list}) | |
| @defmacx m4_mapall (@var{macro}, @var{list}) | |
| @defmacx m4_map_sep (@var{macro}, @var{separator}, @var{list}) | |
| @defmacx m4_mapall_sep (@var{macro}, @var{separator}, @var{list}) | |
| @msindex{map} | |
| @msindex{mapall} | |
| @msindex{map_sep} | |
| @msindex{mapall_sep} | |
| Loop over the comma separated quoted list of argument descriptions in | |
| @var{list}, and invoke @var{macro} with the arguments. An argument | |
| description is in turn a comma-separated quoted list of quoted elements, | |
| suitable for @code{m4_apply}. The macros @code{m4_map} and | |
| @code{m4_map_sep} ignore empty argument descriptions, while | |
| @code{m4_mapall} and @code{m4_mapall_sep} invoke @var{macro} with no | |
| arguments. The macros @code{m4_map_sep} and @code{m4_mapall_sep} | |
| additionally expand @var{separator} between invocations of @var{macro}. | |
| Note that @var{separator} is expanded, unlike in @code{m4_join}. When | |
| separating output with commas, this means that the map result can be | |
| used as a series of arguments, by using a single-quoted comma as | |
| @var{separator}, or as a single string, by using a double-quoted comma. | |
| @example | |
| m4_map([m4_count], []) | |
| @result{} | |
| m4_map([ m4_count], [[], | |
| [[1]], | |
| [[1], [2]]]) | |
| @result{} 1 2 | |
| m4_mapall([ m4_count], [[], | |
| [[1]], | |
| [[1], [2]]]) | |
| @result{} 0 1 2 | |
| m4_map_sep([m4_eval], [,], [[[1+2]], | |
| [[10], [16]]]) | |
| @result{}3,a | |
| m4_map_sep([m4_echo], [,], [[[a]], [[b]]]) | |
| @result{}a,b | |
| m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]])) | |
| @result{}2 | |
| m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]) | |
| @result{}a,b | |
| m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])) | |
| @result{}1 | |
| @end example | |
| @end defmac | |
| @defmac m4_map_args (@var{macro}, @var{arg}@dots{}) | |
| @msindex{map_args} | |
| Repeatedly invoke @var{macro} with each successive @var{arg} as its only | |
| argument. In the following example, three solutions are presented with | |
| the same expansion; the solution using @code{m4_map_args} is the most | |
| efficient. | |
| @example | |
| m4_define([active], [ACTIVE])dnl | |
| m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))]) | |
| @result{} plain active | |
| m4_map([ m4_echo], [[[plain]], [[active]]]) | |
| @result{} plain active | |
| m4_map_args([ m4_echo], [plain], [active]) | |
| @result{} plain active | |
| @end example | |
| In cases where it is useful to operate on additional parameters besides | |
| the list elements, the macro @code{m4_curry} can be used in @var{macro} | |
| to supply the argument currying necessary to generate the desired | |
| argument list. In the following example, @code{list_add_n} is more | |
| efficient than @code{list_add_x}. On the other hand, using | |
| @code{m4_map_args_sep} can be even more efficient. | |
| @example | |
| m4_define([list], [[1], [2], [3]])dnl | |
| m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl | |
| dnl list_add_n(N, ARG...) | |
| dnl Output a list consisting of each ARG added to N | |
| m4_define([list_add_n], | |
| [m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@@)))])dnl | |
| list_add_n([1], list) | |
| @result{}2,3,4 | |
| list_add_n([2], list) | |
| @result{}3,4,5 | |
| m4_define([list_add_x], | |
| [m4_shift(m4_foreach([var], m4_dquote(m4_shift($@@)), | |
| [,add([$1],m4_defn([var]))]))])dnl | |
| list_add_x([1], list) | |
| @result{}2,3,4 | |
| @end example | |
| @end defmac | |
| @defmac m4_map_args_pair (@var{macro}, @dvarv{macro-end, macro}, @ | |
| @var{arg}@dots{}) | |
| @msindex{map_args_pair} | |
| For every pair of arguments @var{arg}, invoke @var{macro} with two | |
| arguments. If there is an odd number of arguments, invoke | |
| @var{macro-end}, which defaults to @var{macro}, with the remaining | |
| argument. | |
| @example | |
| m4_map_args_pair([, m4_reverse], [], [1], [2], [3]) | |
| @result{}, 2, 1, 3 | |
| m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3]) | |
| @result{}, 2, 1, [3] | |
| m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4]) | |
| @result{}, 2, 1, 4, 3 | |
| @end example | |
| @end defmac | |
| @defmac m4_map_args_sep (@ovar{pre}, @ovar{post}, @ovar{sep}, @var{arg}@dots{}) | |
| @msindex{map_args_sep} | |
| Expand the sequence @code{@var{pre}[@var{arg}]@var{post}} for each | |
| argument, additionally expanding @var{sep} between arguments. One | |
| common use of this macro is constructing a macro call, where the opening | |
| and closing parentheses are split between @var{pre} and @var{post}; in | |
| particular, @code{m4_map_args([@var{macro}], [@var{arg}])} is equivalent | |
| to @code{m4_map_args_sep([@var{macro}(], [)], [], [@var{arg}])}. This | |
| macro provides the most efficient means for iterating over an arbitrary | |
| list of arguments, particularly when repeatedly constructing a macro | |
| call with more arguments than @var{arg}. | |
| @end defmac | |
| @defmac m4_map_args_w (@var{string}, @ovar{pre}, @ovar{post}, @ovar{sep}) | |
| @msindex{map_args_w} | |
| Expand the sequence @code{@var{pre}[word]@var{post}} for each word in | |
| the whitespace-separated @var{string}, additionally expanding @var{sep} | |
| between words. This macro provides the most efficient means for | |
| iterating over a whitespace-separated string. In particular, | |
| @code{m4_map_args_w([@var{string}], [@var{action}(], [)])} is more | |
| efficient than @code{m4_foreach_w([var], [@var{string}], | |
| [@var{action}(m4_defn([var]))])}. | |
| @end defmac | |
| @defmac m4_shiftn (@var{count}, @dots{}) | |
| @defmacx m4_shift2 (@dots{}) | |
| @defmacx m4_shift3 (@dots{}) | |
| @msindex{shift2} | |
| @msindex{shift3} | |
| @msindex{shiftn} | |
| @code{m4_shiftn} performs @var{count} iterations of @code{m4_shift}, | |
| along with validation that enough arguments were passed in to match the | |
| shift count, and that the count is positive. @code{m4_shift2} and | |
| @code{m4_shift3} are specializations | |
| of @code{m4_shiftn}, introduced in Autoconf 2.62, and are more efficient | |
| for two and three shifts, respectively. | |
| @end defmac | |
| @defmac m4_stack_foreach (@var{macro}, @var{action}) | |
| @defmacx m4_stack_foreach_lifo (@var{macro}, @var{action}) | |
| @msindex{stack_foreach} | |
| @msindex{stack_foreach_lifo} | |
| For each of the @code{m4_pushdef} definitions of @var{macro}, expand | |
| @var{action} with the single argument of a definition of @var{macro}. | |
| @code{m4_stack_foreach} starts with the oldest definition, while | |
| @code{m4_stack_foreach_lifo} starts with the current definition. | |
| @var{action} should not push or pop definitions of @var{macro}, nor is | |
| there any guarantee that the current definition of @var{macro} matches | |
| the argument that was passed to @var{action}. The macro @code{m4_curry} | |
| can be used if @var{action} needs more than one argument, although in | |
| that case it is more efficient to use @var{m4_stack_foreach_sep}. | |
| Due to technical limitations, there are a few low-level m4sugar | |
| functions, such as @code{m4_pushdef}, that cannot be used as the | |
| @var{macro} argument. | |
| @example | |
| m4_pushdef([a], [1])m4_pushdef([a], [2])dnl | |
| m4_stack_foreach([a], [ m4_incr]) | |
| @result{} 2 3 | |
| m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])]) | |
| @result{} cd bcd | |
| @end example | |
| @end defmac | |
| @defmac m4_stack_foreach_sep (@var{macro}, @ovar{pre}, @ovar{post}, @ovar{sep}) | |
| @defmacx m4_stack_foreach_sep_lifo (@var{macro}, @ovar{pre}, @ovar{post}, @ | |
| @ovar{sep}) | |
| @msindex{stack_foreach_sep} | |
| @msindex{stack_foreach_sep_lifo} | |
| Expand the sequence @code{@var{pre}[definition]@var{post}} for each | |
| @code{m4_pushdef} definition of @var{macro}, additionally expanding | |
| @var{sep} between definitions. @code{m4_stack_foreach_sep} visits the | |
| oldest definition first, while @code{m4_stack_foreach_sep_lifo} visits | |
| the current definition first. This macro provides the most efficient | |
| means for iterating over a pushdef stack. In particular, | |
| @code{m4_stack_foreach([@var{macro}], [@var{action}])} is short for | |
| @code{m4_stack_foreach_sep([@var{macro}], [@var{action}(], [)])}. | |
| @end defmac | |
| @node Evaluation Macros | |
| @subsection Evaluation Macros | |
| The following macros give some control over the order of the evaluation | |
| by adding or removing levels of quotes. | |
| @defmac m4_apply (@var{macro}, @var{list}) | |
| @msindex{apply} | |
| Apply the elements of the quoted, comma-separated @var{list} as the | |
| arguments to @var{macro}. If @var{list} is empty, invoke @var{macro} | |
| without arguments. Note the difference between @code{m4_indir}, which | |
| expects its first argument to be a macro name but can use names that are | |
| otherwise invalid, and @code{m4_apply}, where @var{macro} can contain | |
| other text, but must end in a valid macro name. | |
| @example | |
| m4_apply([m4_count], []) | |
| @result{}0 | |
| m4_apply([m4_count], [[]]) | |
| @result{}1 | |
| m4_apply([m4_count], [[1], [2]]) | |
| @result{}2 | |
| m4_apply([m4_join], [[|], [1], [2]]) | |
| @result{}1|2 | |
| @end example | |
| @end defmac | |
| @defmac m4_count (@var{arg}, @dots{}) | |
| @msindex{count} | |
| This macro returns the number of arguments it was passed. | |
| @end defmac | |
| @defmac m4_curry (@var{macro}, @var{arg}@dots{}) | |
| @msindex{curry} | |
| This macro performs argument currying. The expansion of this macro is | |
| another macro name that expects exactly one argument; that argument is | |
| then appended to the @var{arg} list, and then @var{macro} is expanded | |
| with the resulting argument list. | |
| @example | |
| m4_curry([m4_curry], [m4_reverse], [1])([2])([3]) | |
| @result{}3, 2, 1 | |
| @end example | |
| Unfortunately, due to a limitation in M4 1.4.x, it is not possible to | |
| pass the definition of a builtin macro as the argument to the output of | |
| @code{m4_curry}; the empty string is used instead of the builtin token. | |
| This behavior is rectified by using M4 1.6 or newer. | |
| @end defmac | |
| @defmac m4_do (@var{arg}, @dots{}) | |
| @msindex{do} | |
| This macro loops over its arguments and expands each @var{arg} in | |
| sequence. Its main use is for readability; it allows the use of | |
| indentation and fewer @code{dnl} to result in the same expansion. This | |
| macro guarantees that no expansion will be concatenated with subsequent | |
| text; to achieve full concatenation, use @code{m4_unquote(m4_join([], | |
| @var{arg@dots{}}))}. | |
| @example | |
| m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl | |
| m4_do([a],[b])c | |
| @result{}abc | |
| m4_unquote(m4_join([],[a],[b]))c | |
| @result{}3 | |
| m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl | |
| m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl | |
| m4_do([a],[b])c | |
| @result{}ABC | |
| m4_unquote(m4_join([],[a],[b]))c | |
| @result{}3 | |
| @end example | |
| @end defmac | |
| @defmac m4_dquote (@var{arg}, @dots{}) | |
| @msindex{dquote} | |
| Return the arguments as a quoted list of quoted arguments. | |
| Conveniently, if there is just one @var{arg}, this effectively adds a | |
| level of quoting. | |
| @end defmac | |
| @defmac m4_dquote_elt (@var{arg}, @dots{}) | |
| @msindex{dquote_elt} | |
| Return the arguments as a series of double-quoted arguments. Whereas | |
| @code{m4_dquote} returns a single argument, @code{m4_dquote_elt} returns | |
| as many arguments as it was passed. | |
| @end defmac | |
| @defmac m4_echo (@var{arg}, @dots{}) | |
| @msindex{echo} | |
| Return the arguments, with the same level of quoting. Other than | |
| discarding whitespace after unquoted commas, this macro is a no-op. | |
| @end defmac | |
| @defmac m4_expand (@var{arg}) | |
| @msindex{expand} | |
| Return the expansion of @var{arg} as a quoted string. Whereas | |
| @code{m4_quote} is designed to collect expanded text into a single | |
| argument, @code{m4_expand} is designed to perform one level of expansion | |
| on quoted text. One distinction is in the treatment of whitespace | |
| following a comma in the original @var{arg}. Any time multiple | |
| arguments are collected into one with @code{m4_quote}, the M4 argument | |
| collection rules discard the whitespace. However, with @code{m4_expand}, | |
| whitespace is preserved, even after the expansion of macros contained in | |
| @var{arg}. Additionally, @code{m4_expand} is able to expand text that | |
| would involve an unterminated comment, whereas expanding that same text | |
| as the argument to @code{m4_quote} runs into difficulty in finding the | |
| end of the argument. Since manipulating diversions during argument | |
| collection is inherently unsafe, @code{m4_expand} issues an error if | |
| @var{arg} attempts to change the current diversion (@pxref{Diversion | |
| support}). | |
| @example | |
| m4_define([active], [ACT, IVE])dnl | |
| m4_define([active2], [[ACT, IVE]])dnl | |
| m4_quote(active, active) | |
| @result{}ACT,IVE,ACT,IVE | |
| m4_expand([active, active]) | |
| @result{}ACT, IVE, ACT, IVE | |
| m4_quote(active2, active2) | |
| @result{}ACT, IVE,ACT, IVE | |
| m4_expand([active2, active2]) | |
| @result{}ACT, IVE, ACT, IVE | |
| m4_expand([# m4_echo]) | |
| @result{}# m4_echo | |
| m4_quote(# m4_echo) | |
| ) | |
| @result{}# m4_echo) | |
| @result{} | |
| @end example | |
| Note that @code{m4_expand} cannot handle an @var{arg} that expands to | |
| literal unbalanced quotes, but that quadrigraphs can be used when | |
| unbalanced output is necessary. Likewise, unbalanced parentheses should | |
| be supplied with double quoting or a quadrigraph. | |
| @example | |
| m4_define([pattern], [[!@@<:@@]])dnl | |
| m4_define([bar], [BAR])dnl | |
| m4_expand([case $foo in | |
| m4_defn([pattern])@@:@}@@ bar ;; | |
| *[)] blah ;; | |
| esac]) | |
| @result{}case $foo in | |
| @result{} [![]) BAR ;; | |
| @result{} *) blah ;; | |
| @result{}esac | |
| @end example | |
| @end defmac | |
| @defmac m4_ignore (@dots{}) | |
| @msindex{ignore} | |
| This macro was introduced in Autoconf 2.62. Expands to nothing, | |
| ignoring all of its arguments. By itself, this isn't very useful. | |
| However, it can be used to conditionally ignore an arbitrary number of | |
| arguments, by deciding which macro name to apply to a list of arguments. | |
| @example | |
| dnl foo outputs a message only if [debug] is defined. | |
| m4_define([foo], | |
| [m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])]) | |
| @end example | |
| Note that for earlier versions of Autoconf, the macro @code{__gnu__} can | |
| serve the same purpose, although it is less readable. | |
| @end defmac | |
| @defmac m4_make_list (@var{arg}, @dots{}) | |
| @msindex{make_list} | |
| This macro exists to aid debugging of M4sugar algorithms. Its net | |
| effect is similar to @code{m4_dquote}---it produces a quoted list of | |
| quoted arguments, for each @var{arg}. The difference is that this | |
| version uses a comma-newline separator instead of just comma, to improve | |
| readability of the list; with the result that it is less efficient than | |
| @code{m4_dquote}. | |
| @example | |
| m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl | |
| m4_dquote(zero, [one], [[two]]) | |
| @result{}[0],[one],[[two]] | |
| m4_make_list(zero, [one], [[two]]) | |
| @result{}[0], | |
| @result{}[one], | |
| @result{}[[two]] | |
| m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number]) | |
| @result{} 0 1 two | |
| m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number]) | |
| @result{} 0 1 two | |
| @end example | |
| @end defmac | |
| @c m4_noquote is too dangerous to document - it invokes macros that | |
| @c probably rely on @samp{[]} nested quoting for proper operation. The | |
| @c user should generally prefer m4_unquote instead. | |
| @defmac m4_quote (@var{arg}, @dots{}) | |
| @msindex{quote} | |
| Return the arguments as a single entity, i.e., wrap them into a pair of | |
| quotes. This effectively collapses multiple arguments into one, | |
| although it loses whitespace after unquoted commas in the process. | |
| @end defmac | |
| @defmac m4_reverse (@var{arg}, @dots{}) | |
| @msindex{reverse} | |
| Outputs each argument with the same level of quoting, but in reverse | |
| order, and with space following each comma for readability. | |
| @example | |
| m4_define([active], [ACT,IVE]) | |
| @result{} | |
| m4_reverse(active, [active]) | |
| @result{}active, IVE, ACT | |
| @end example | |
| @end defmac | |
| @defmac m4_unquote (@var{arg}, @dots{}) | |
| @msindex{unquote} | |
| This macro was introduced in Autoconf 2.62. Expand each argument, | |
| separated by commas. For a single @var{arg}, this effectively removes a | |
| layer of quoting, and @code{m4_unquote([@var{arg}])} is more efficient | |
| than the equivalent @code{m4_do([@var{arg}])}. For multiple arguments, | |
| this results in an unquoted list of expansions. This is commonly used | |
| with @code{m4_split}, in order to convert a single quoted list into a | |
| series of quoted elements. | |
| @end defmac | |
| The following example aims at emphasizing the difference between several | |
| scenarios: not using these macros, using @code{m4_defn}, using | |
| @code{m4_quote}, using @code{m4_dquote}, and using @code{m4_expand}. | |
| @example | |
| $ @kbd{cat example.m4} | |
| dnl Overquote, so that quotes are visible. | |
| m4_define([show], [$[]1 = [$1], $[]@@ = [$@@]]) | |
| m4_define([a], [A]) | |
| m4_define([mkargs], [1, 2[,] 3]) | |
| m4_define([arg1], [[$1]]) | |
| m4_divert([0])dnl | |
| show(a, b) | |
| show([a, b]) | |
| show(m4_quote(a, b)) | |
| show(m4_dquote(a, b)) | |
| show(m4_expand([a, b])) | |
| arg1(mkargs) | |
| arg1([mkargs]) | |
| arg1(m4_defn([mkargs])) | |
| arg1(m4_quote(mkargs)) | |
| arg1(m4_dquote(mkargs)) | |
| arg1(m4_expand([mkargs])) | |
| $ @kbd{autom4te -l m4sugar example.m4} | |
| $1 = A, $@@ = [A],[b] | |
| $1 = a, b, $@@ = [a, b] | |
| $1 = A,b, $@@ = [A,b] | |
| $1 = [A],[b], $@@ = [[A],[b]] | |
| $1 = A, b, $@@ = [A, b] | |
| 1 | |
| mkargs | |
| 1, 2[,] 3 | |
| 1,2, 3 | |
| [1],[2, 3] | |
| 1, 2, 3 | |
| @end example | |
| @node Text processing Macros | |
| @subsection String manipulation in M4 | |
| The following macros may be used to manipulate strings in M4. Many of | |
| the macros in this section intentionally result in quoted strings as | |
| output, rather than subjecting the arguments to further expansions. As | |
| a result, if you are manipulating text that contains active M4 | |
| characters, the arguments are passed with single quoting rather than | |
| double. | |
| @defmac m4_append (@var{macro-name}, @var{string}, @ovar{separator}) | |
| @defmacx m4_append_uniq (@var{macro-name}, @var{string}, @ovar{separator} @ | |
| @ovar{if-uniq}, @ovar{if-duplicate}) | |
| @msindex{append} | |
| @msindex{append_uniq} | |
| Redefine @var{macro-name} to its former contents with @var{separator} | |
| and @var{string} added at the end. If @var{macro-name} was undefined | |
| before (but not if it was defined but empty), then no @var{separator} is | |
| added. As of Autoconf 2.62, neither @var{string} nor @var{separator} | |
| are expanded during this macro; instead, they are expanded when | |
| @var{macro-name} is invoked. | |
| @code{m4_append} can be used to grow strings, and @code{m4_append_uniq} | |
| to grow strings without duplicating substrings. Additionally, | |
| @code{m4_append_uniq} takes two optional parameters as of Autoconf 2.62; | |
| @var{if-uniq} is expanded if @var{string} was appended, and | |
| @var{if-duplicate} is expanded if @var{string} was already present. | |
| Also, @code{m4_append_uniq} warns if @var{separator} is not empty, but | |
| occurs within @var{string}, since that can lead to duplicates. | |
| Note that @code{m4_append} can scale linearly in the length of the final | |
| string, depending on the quality of the underlying M4 implementation, | |
| while @code{m4_append_uniq} has an inherent quadratic scaling factor. | |
| If an algorithm can tolerate duplicates in the final string, use the | |
| former for speed. If duplicates must be avoided, consider using | |
| @code{m4_set_add} instead (@pxref{Set manipulation Macros}). | |
| @example | |
| m4_define([active], [ACTIVE])dnl | |
| m4_append([sentence], [This is an])dnl | |
| m4_append([sentence], [ active ])dnl | |
| m4_append([sentence], [symbol.])dnl | |
| sentence | |
| @result{}This is an ACTIVE symbol. | |
| m4_undefine([active])dnl | |
| @result{}This is an active symbol. | |
| m4_append_uniq([list], [one], [, ], [new], [existing]) | |
| @result{}new | |
| m4_append_uniq([list], [one], [, ], [new], [existing]) | |
| @result{}existing | |
| m4_append_uniq([list], [two], [, ], [new], [existing]) | |
| @result{}new | |
| m4_append_uniq([list], [three], [, ], [new], [existing]) | |
| @result{}new | |
| m4_append_uniq([list], [two], [, ], [new], [existing]) | |
| @result{}existing | |
| list | |
| @result{}one, two, three | |
| m4_dquote(list) | |
| @result{}[one],[two],[three] | |
| m4_append([list2], [one], [[, ]])dnl | |
| m4_append_uniq([list2], [two], [[, ]])dnl | |
| m4_append([list2], [three], [[, ]])dnl | |
| list2 | |
| @result{}one, two, three | |
| m4_dquote(list2) | |
| @result{}[one, two, three] | |
| @end example | |
| @end defmac | |
| @defmac m4_append_uniq_w (@var{macro-name}, @var{strings}) | |
| @msindex{append_uniq_w} | |
| This macro was introduced in Autoconf 2.62. It is similar to | |
| @code{m4_append_uniq}, but treats @var{strings} as a whitespace | |
| separated list of words to append, and only appends unique words. | |
| @var{macro-name} is updated with a single space between new words. | |
| @example | |
| m4_append_uniq_w([numbers], [1 1 2])dnl | |
| m4_append_uniq_w([numbers], [ 2 3 ])dnl | |
| numbers | |
| @result{}1 2 3 | |
| @end example | |
| @end defmac | |
| @defmac m4_chomp (@var{string}) | |
| @defmacx m4_chomp_all (@var{string}) | |
| @msindex{chomp} | |
| @msindex{chomp_all} | |
| Output @var{string} in quotes, but without a trailing newline. The | |
| macro @code{m4_chomp} is slightly faster, and removes at most one | |
| newline; the macro @code{m4_chomp_all} removes all consecutive trailing | |
| newlines. Unlike @code{m4_flatten}, embedded newlines are left intact, | |
| and backslash does not influence the result. | |
| @end defmac | |
| @defmac m4_combine (@ovar{separator}, @var{prefix-list}, @ovar{infix}, @ | |
| @var{suffix-1}, @ovar{suffix-2}, @dots{}) | |
| @msindex{combine} | |
| This macro produces a quoted string containing the pairwise combination | |
| of every element of the quoted, comma-separated @var{prefix-list}, and | |
| every element from the @var{suffix} arguments. Each pairwise | |
| combination is joined with @var{infix} in the middle, and successive | |
| pairs are joined by @var{separator}. No expansion occurs on any of the | |
| arguments. No output occurs if either the @var{prefix} or @var{suffix} | |
| list is empty, but the lists can contain empty elements. | |
| @example | |
| m4_define([a], [oops])dnl | |
| m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3]) | |
| @result{}a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3 | |
| m4_combine([, ], [[a], [b]], [-]) | |
| @result{} | |
| m4_combine([, ], [[a], [b]], [-], []) | |
| @result{}a-, b- | |
| m4_combine([, ], [], [-], [1], [2]) | |
| @result{} | |
| m4_combine([, ], [[]], [-], [1], [2]) | |
| @result{}-1, -2 | |
| @end example | |
| @end defmac | |
| @defmac m4_escape (@var{string}) | |
| @msindex{escape} | |
| Convert all instances of @samp{[}, @samp{]}, @samp{#}, and @samp{$} | |
| within @var{string} into their respective quadrigraphs. The result is | |
| still a quoted string. | |
| @end defmac | |
| @defmac m4_flatten (@var{string}) | |
| @msindex{flatten} | |
| Flatten @var{string} into a single line. Delete all backslash-newline | |
| pairs, and replace all remaining newlines with a space. The result is | |
| still a quoted string. | |
| @end defmac | |
| @defmac m4_join (@ovar{separator}, @var{args}@dots{}) | |
| @defmacx m4_joinall (@ovar{separator}, @var{args}@dots{}) | |
| @msindex{join} | |
| @msindex{joinall} | |
| Concatenate each @var{arg}, separated by @var{separator}. | |
| @code{joinall} uses every argument, while @code{join} omits empty | |
| arguments so that there are no back-to-back separators in the output. | |
| The result is a quoted string. | |
| @example | |
| m4_define([active], [ACTIVE])dnl | |
| m4_join([|], [one], [], [active], [two]) | |
| @result{}one|active|two | |
| m4_joinall([|], [one], [], [active], [two]) | |
| @result{}one||active|two | |
| @end example | |
| Note that if all you intend to do is join @var{args} with commas between | |
| them, to form a quoted list suitable for @code{m4_foreach}, it is more | |
| efficient to use @code{m4_dquote}. | |
| @end defmac | |
| @defmac m4_newline (@ovar{text}) | |
| @msindex{newline} | |
| This macro was introduced in Autoconf 2.62, and expands to a newline, | |
| followed by any @var{text}. | |
| It is primarily useful for maintaining macro formatting, and ensuring | |
| that M4 does not discard leading whitespace during argument collection. | |
| @end defmac | |
| @defmac m4_normalize (@var{string}) | |
| @msindex{normalize} | |
| Remove leading and trailing spaces and tabs, sequences of | |
| backslash-then-newline, and replace multiple spaces, tabs, and newlines | |
| with a single space. This is a combination of @code{m4_flatten} and | |
| @code{m4_strip}. To determine if @var{string} consists only of bytes | |
| that would be removed by @code{m4_normalize}, you can use | |
| @code{m4_ifblank}. | |
| @end defmac | |
| @defmac m4_re_escape (@var{string}) | |
| @msindex{re_escape} | |
| Backslash-escape all characters in @var{string} that are active in | |
| regexps. | |
| @end defmac | |
| @c We cannot use @dvar because the macro expansion mistreats backslashes. | |
| @defmac m4_split (@var{string}, @r{[}@var{regexp} = @samp{[\t ]+}@r{]}) | |
| @msindex{split} | |
| Split @var{string} into an M4 list of elements quoted by @samp{[} and | |
| @samp{]}, while keeping white space at the beginning and at the end. | |
| If @var{regexp} is given, use it instead of @samp{[\t ]+} for splitting. | |
| If @var{string} is empty, the result is an empty list. | |
| @end defmac | |
| @defmac m4_strip (@var{string}) | |
| @msindex{strip} | |
| Strip whitespace from @var{string}. Sequences of spaces and tabs are | |
| reduced to a single space, then leading and trailing spaces are removed. | |
| The result is still a quoted string. Note that this does not interfere | |
| with newlines; if you want newlines stripped as well, consider | |
| @code{m4_flatten}, or do it all at once with @code{m4_normalize}. To | |
| quickly test if @var{string} has only whitespace, use @code{m4_ifblank}. | |
| @end defmac | |
| @defmac m4_text_box (@var{message}, @dvar{frame, -}) | |
| @msindex{text_box} | |
| Add a text box around @var{message}, using @var{frame} as the border | |
| character above and below the message. The @var{frame} argument must be | |
| a single byte, and does not support quadrigraphs. | |
| The frame correctly accounts for | |
| the subsequent expansion of @var{message}. For example: | |
| @example | |
| m4_define([macro], [abc])dnl | |
| m4_text_box([macro]) | |
| @result{}## --- ## | |
| @result{}## abc ## | |
| @result{}## --- ## | |
| @end example | |
| The @var{message} must contain balanced quotes and parentheses, although | |
| quadrigraphs can be used to work around this. | |
| @end defmac | |
| @defmac m4_text_wrap (@var{string}, @ovar{prefix}, @ | |
| @dvarv{prefix1, prefix}, @dvar{width, 79}) | |
| @msindex{text_wrap} | |
| Break @var{string} into a series of whitespace-separated words, then | |
| output those words separated by spaces, and wrapping lines any time the | |
| output would exceed @var{width} columns. If given, @var{prefix1} begins | |
| the first line, and @var{prefix} begins all wrapped lines. If | |
| @var{prefix1} is longer than @var{prefix}, then the first line consists | |
| of just @var{prefix1}. If @var{prefix} is longer than @var{prefix1}, | |
| padding is inserted so that the first word of @var{string} begins at the | |
| same indentation as all wrapped lines. Note that using literal tab | |
| characters in any of the arguments will interfere with the calculation | |
| of width. No expansions occur on @var{prefix}, @var{prefix1}, or the | |
| words of @var{string}, although quadrigraphs are recognized. | |
| For some examples: | |
| @example | |
| m4_text_wrap([Short string */], [ ], [/* ], [20]) | |
| @result{}/* Short string */ | |
| m4_text_wrap([Much longer string */], [ ], [/* ], [20]) | |
| @result{}/* Much longer | |
| @result{} string */ | |
| m4_text_wrap([Short doc.], [ ], [ --short ], [30]) | |
| @result{} --short Short doc. | |
| m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30]) | |
| @result{} --too-wide | |
| @result{} Short doc. | |
| m4_text_wrap([Super long documentation.], [ ], | |
| [ --too-wide ], 30) | |
| @result{} --too-wide | |
| @result{} Super long | |
| @result{} documentation. | |
| @end example | |
| @end defmac | |
| @defmac m4_tolower (@var{string}) | |
| @defmacx m4_toupper (@var{string}) | |
| @msindex{tolower} | |
| @msindex{toupper} | |
| Return @var{string} with letters converted to upper or lower case, | |
| respectively. | |
| @end defmac | |
| @node Number processing Macros | |
| @subsection Arithmetic computation in M4 | |
| The following macros facilitate integer arithmetic operations. | |
| Where a parameter is documented as taking an arithmetic expression, you | |
| can use anything that can be parsed by @code{m4_eval}. | |
| Any other numeric parameter should consist of an optional sign followed | |
| by one or more decimal digits; it is treated as a decimal integer. | |
| Macros that expand to a number do so as either @samp{0}, or an optional | |
| @samp{-} followed by a nonzero decimal digit followed by zero or more | |
| decimal digits. | |
| Due to @command{m4} limitations, arithmetic expressions and numeric | |
| parameters should use only numbers that fit into a 32-bit signed | |
| integer. | |
| @defmac m4_cmp (@var{expr-1}, @var{expr-2}) | |
| @msindex{cmp} | |
| Compare the arithmetic expressions @var{expr-1} and @var{expr-2}, and | |
| expand to @samp{-1} if @var{expr-1} is smaller, @samp{0} if they are | |
| equal, and @samp{1} if @var{expr-1} is larger. | |
| @end defmac | |
| @defmac m4_list_cmp (@var{list-1}, @var{list-2}) | |
| @msindex{list_cmp} | |
| Compare the two M4 lists consisting of comma-separated arithmetic | |
| expressions, left to right. Expand to @samp{-1} for the first element | |
| pairing where the value from @var{list-1} is smaller, @samp{1} where the | |
| value from @var{list-2} is smaller, or @samp{0} if both lists have the | |
| same values. If one list is shorter than the other, the remaining | |
| elements of the longer list are compared against zero. | |
| @example | |
| m4_list_cmp([1, 0], [1]) | |
| @result{}0 | |
| m4_list_cmp([1, [1 * 0]], [1, 0]) | |
| @result{}0 | |
| m4_list_cmp([1, 2], [1, 0]) | |
| @result{}1 | |
| m4_list_cmp([1, [1+1], 3],[1, 2]) | |
| @result{}1 | |
| m4_list_cmp([1, 2, -3], [1, 2]) | |
| @result{}-1 | |
| m4_list_cmp([1, 0], [1, 2]) | |
| @result{}-1 | |
| m4_list_cmp([1], [1, 2]) | |
| @result{}-1 | |
| @end example | |
| @end defmac | |
| @defmac m4_max (@var{arg}, @dots{}) | |
| @msindex{max} | |
| This macro was introduced in Autoconf 2.62. Expand to the value | |
| of the maximum arithmetic expression among all the arguments. | |
| @end defmac | |
| @defmac m4_min (@var{arg}, @dots{}) | |
| @msindex{min} | |
| This macro was introduced in Autoconf 2.62. Expand to the value | |
| of the minimum arithmetic expression among all the arguments. | |
| @end defmac | |
| @defmac m4_sign (@var{expr}) | |
| @msindex{sign} | |
| Expand to @samp{-1} if the arithmetic expression @var{expr} is negative, | |
| @samp{1} if it is positive, and @samp{0} if it is zero. | |
| @end defmac | |
| @anchor{m4_version_compare} | |
| @defmac m4_version_compare (@var{version-1}, @var{version-2}) | |
| @msindex{version_compare} | |
| This macro was introduced in Autoconf 2.53, but had a number of | |
| usability limitations that were not lifted until Autoconf 2.62. Compare | |
| the version strings @var{version-1} and @var{version-2}, and expand to | |
| @samp{-1} if @var{version-1} is smaller, @samp{0} if they are the same, | |
| or @samp{1} @var{version-2} is smaller. Version strings must be a list | |
| of elements separated by @samp{.}, @samp{,} or @samp{-}, where each | |
| element is a number along with optional case-insensitive letters | |
| designating beta releases. The comparison stops at the leftmost element | |
| that contains a difference, although a 0 element compares equal to a | |
| missing element. | |
| It is permissible to include commit identifiers in @var{version}, such | |
| as an abbreviated SHA1 of the commit, provided there is still a | |
| monotonically increasing prefix to allow for accurate version-based | |
| comparisons. For example, this paragraph was written when the | |
| development snapshot of autoconf claimed to be at version | |
| @samp{2.61a-248-dc51}, or 248 commits after the 2.61a release, with an | |
| abbreviated commit identification of @samp{dc51}. | |
| @example | |
| m4_version_compare([1.1], [2.0]) | |
| @result{}-1 | |
| m4_version_compare([2.0b], [2.0a]) | |
| @result{}1 | |
| m4_version_compare([1.1.1], [1.1.1a]) | |
| @result{}-1 | |
| m4_version_compare([1.2], [1.1.1a]) | |
| @result{}1 | |
| m4_version_compare([1.0], [1]) | |
| @result{}0 | |
| m4_version_compare([1.1pre], [1.1PRE]) | |
| @result{}0 | |
| m4_version_compare([1.1a], [1,10]) | |
| @result{}-1 | |
| m4_version_compare([2.61a], [2.61a-248-dc51]) | |
| @result{}-1 | |
| m4_version_compare([2.61b], [2.61a-248-dc51]) | |
| @result{}1 | |
| @end example | |
| @end defmac | |
| @defmac m4_version_prereq (@var{version}, @ovar{if-new-enough}, @ | |
| @dvar{if-old, m4_fatal}) | |
| @msindex{version_prereq} | |
| Compares @var{version} against the version of Autoconf currently | |
| running. If the running version is at @var{version} or newer, expand | |
| @var{if-new-enough}, but if @var{version} is larger than the version | |
| currently executing, expand @var{if-old}, which defaults to printing an | |
| error message and exiting m4sugar with status 63. When given only one | |
| argument, this behaves like @code{AC_PREREQ} (@pxref{Versioning}). | |
| Remember that the autoconf philosophy favors feature checks over version | |
| checks. | |
| @end defmac | |
| @node Set manipulation Macros | |
| @subsection Set manipulation in M4 | |
| @cindex Set manipulation | |
| @cindex Data structure, set | |
| @cindex Unordered set manipulation | |
| Sometimes, it is necessary to track a set of data, where the order does | |
| not matter and where there are no duplicates in the set. The following | |
| macros facilitate set manipulations. Each set is an opaque object, | |
| which can only be accessed via these basic operations. The underlying | |
| implementation guarantees linear scaling for set creation, which is more | |
| efficient than using the quadratic @code{m4_append_uniq}. Both set | |
| names and values can be arbitrary strings, except for unbalanced quotes. | |
| This implementation ties up memory for removed elements until the next | |
| operation that must traverse all the elements of a set; and although | |
| that may slow down some operations until the memory for removed elements | |
| is pruned, it still guarantees linear performance. | |
| @defmac m4_set_add (@var{set}, @var{value}, @ovar{if-uniq}, @ovar{if-dup}) | |
| @msindex{set_add} | |
| Adds the string @var{value} as a member of set @var{set}. Expand | |
| @var{if-uniq} if the element was added, or @var{if-dup} if it was | |
| previously in the set. Operates in amortized constant time, so that set | |
| creation scales linearly. | |
| @end defmac | |
| @defmac m4_set_add_all (@var{set}, @var{value}@dots{}) | |
| @msindex{set_add_all} | |
| Adds each @var{value} to the set @var{set}. This is slightly more | |
| efficient than repeatedly invoking @code{m4_set_add}. | |
| @end defmac | |
| @defmac m4_set_contains (@var{set}, @var{value}, @ovar{if-present}, @ | |
| @ovar{if-absent}) | |
| @msindex{set_contains} | |
| Expands @var{if-present} if the string @var{value} is a member of | |
| @var{set}, otherwise @var{if-absent}. | |
| @example | |
| m4_set_contains([a], [1], [yes], [no]) | |
| @result{}no | |
| m4_set_add([a], [1], [added], [dup]) | |
| @result{}added | |
| m4_set_add([a], [1], [added], [dup]) | |
| @result{}dup | |
| m4_set_contains([a], [1], [yes], [no]) | |
| @result{}yes | |
| m4_set_remove([a], [1], [removed], [missing]) | |
| @result{}removed | |
| m4_set_contains([a], [1], [yes], [no]) | |
| @result{}no | |
| m4_set_remove([a], [1], [removed], [missing]) | |
| @result{}missing | |
| @end example | |
| @end defmac | |
| @defmac m4_set_contents (@var{set}, @ovar{sep}) | |
| @defmacx m4_set_dump (@var{set}, @ovar{sep}) | |
| @msindex{set_contents} | |
| @msindex{set_dump} | |
| Expands to a single string consisting of all the members of the set | |
| @var{set}, each separated by @var{sep}, which is not expanded. | |
| @code{m4_set_contents} leaves the elements in @var{set} but reclaims any | |
| memory occupied by removed elements, while @code{m4_set_dump} is a | |
| faster one-shot action that also deletes the set. No provision is made | |
| for disambiguating members that contain a non-empty @var{sep} as a | |
| substring; use @code{m4_set_empty} to distinguish between an empty set | |
| and the set containing only the empty string. The order of the output | |
| is unspecified; in the current implementation, part of the speed of | |
| @code{m4_set_dump} results from using a different output order than | |
| @code{m4_set_contents}. These macros scale linearly in the size of the | |
| set before memory pruning, and @code{m4_set_contents([@var{set}], | |
| [@var{sep}])} is faster than | |
| @code{m4_joinall([@var{sep}]m4_set_listc([@var{set}]))}. | |
| @example | |
| m4_set_add_all([a], [1], [2], [3]) | |
| @result{} | |
| m4_set_contents([a], [-]) | |
| @result{}1-2-3 | |
| m4_joinall([-]m4_set_listc([a])) | |
| @result{}1-2-3 | |
| m4_set_dump([a], [-]) | |
| @result{}3-2-1 | |
| m4_set_contents([a]) | |
| @result{} | |
| m4_set_add([a], []) | |
| @result{} | |
| m4_set_contents([a], [-]) | |
| @result{} | |
| @end example | |
| @end defmac | |
| @defmac m4_set_delete (@var{set}) | |
| @msindex{set_delete} | |
| Delete all elements and memory associated with @var{set}. This is | |
| linear in the set size, and faster than removing one element at a time. | |
| @end defmac | |
| @defmac m4_set_difference (@var{seta}, @var{setb}) | |
| @defmacx m4_set_intersection (@var{seta}, @var{setb}) | |
| @defmacx m4_set_union (@var{seta}, @var{setb}) | |
| @msindex{set_difference} | |
| @msindex{set_intersection} | |
| @msindex{set_union} | |
| Compute the relation between @var{seta} and @var{setb}, and output the | |
| result as a list of quoted arguments without duplicates and with a | |
| leading comma. Set difference selects the elements in @var{seta} but | |
| not @var{setb}, intersection selects only elements in both sets, and | |
| union selects elements in either set. These actions are linear in the | |
| sum of the set sizes. The leading comma is necessary to distinguish | |
| between no elements and the empty string as the only element. | |
| @example | |
| m4_set_add_all([a], [1], [2], [3]) | |
| @result{} | |
| m4_set_add_all([b], [3], [], [4]) | |
| @result{} | |
| m4_set_difference([a], [b]) | |
| @result{},1,2 | |
| m4_set_difference([b], [a]) | |
| @result{},,4 | |
| m4_set_intersection([a], [b]) | |
| @result{},3 | |
| m4_set_union([a], [b]) | |
| @result{},1,2,3,,4 | |
| @end example | |
| @end defmac | |
| @defmac m4_set_empty (@var{set}, @ovar{if-empty}, @ovar{if-elements}) | |
| @msindex{set_empty} | |
| Expand @var{if-empty} if the set @var{set} has no elements, otherwise | |
| expand @var{if-elements}. This macro operates in constant time. Using | |
| this macro can help disambiguate output from @code{m4_set_contents} or | |
| @code{m4_set_list}. | |
| @end defmac | |
| @defmac m4_set_foreach (@var{set}, @var{variable}, @var{action}) | |
| @msindex{set_foreach} | |
| For each element in the set @var{set}, expand @var{action} with the | |
| macro @var{variable} defined as the set element. Behavior is | |
| unspecified if @var{action} recursively lists the contents of @var{set} | |
| (although listing other sets is acceptable), or if it modifies the set | |
| in any way other than removing the element currently contained in | |
| @var{variable}. This macro is faster than the corresponding | |
| @code{m4_foreach([@var{variable}], | |
| m4_indir([m4_dquote]m4_set_listc([@var{set}])), [@var{action}])}, | |
| although @code{m4_set_map} might be faster still. | |
| @example | |
| m4_set_add_all([a]m4_for([i], [1], [5], [], [,i])) | |
| @result{} | |
| m4_set_contents([a]) | |
| @result{}12345 | |
| m4_set_foreach([a], [i], | |
| [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])]) | |
| @result{}24 | |
| m4_set_contents([a]) | |
| @result{}135 | |
| @end example | |
| @end defmac | |
| @defmac m4_set_list (@var{set}) | |
| @defmacx m4_set_listc (@var{set}) | |
| @msindex{set_list} | |
| @msindex{set_listc} | |
| Produce a list of arguments, where each argument is a quoted element | |
| from the set @var{set}. The variant @code{m4_set_listc} is unambiguous, | |
| by adding a leading comma if there are any set elements, whereas the | |
| variant @code{m4_set_list} cannot distinguish between an empty set and a | |
| set containing only the empty string. These can be directly used in | |
| macros that take multiple arguments, such as @code{m4_join} or | |
| @code{m4_set_add_all}, or wrapped by @code{m4_dquote} for macros that | |
| take a quoted list, such as @code{m4_map} or @code{m4_foreach}. Any | |
| memory occupied by removed elements is reclaimed during these macros. | |
| @example | |
| m4_set_add_all([a], [1], [2], [3]) | |
| @result{} | |
| m4_set_list([a]) | |
| @result{}1,2,3 | |
| m4_set_list([b]) | |
| @result{} | |
| m4_set_listc([b]) | |
| @result{} | |
| m4_count(m4_set_list([b])) | |
| @result{}1 | |
| m4_set_empty([b], [0], [m4_count(m4_set_list([b]))]) | |
| @result{}0 | |
| m4_set_add([b], []) | |
| @result{} | |
| m4_set_list([b]) | |
| @result{} | |
| m4_set_listc([b]) | |
| @result{}, | |
| m4_count(m4_set_list([b])) | |
| @result{}1 | |
| m4_set_empty([b], [0], [m4_count(m4_set_list([b]))]) | |
| @result{}1 | |
| @end example | |
| @end defmac | |
| @defmac m4_set_map (@var{set}, @var{action}) | |
| @msindex{set_map} | |
| For each element in the set @var{set}, expand @var{action} with a single | |
| argument of the set element. Behavior is unspecified if @var{action} | |
| recursively lists the contents of @var{set} (although listing other sets | |
| is acceptable), or if it modifies the set in any way other than removing | |
| the element passed as an argument. This macro is faster than either | |
| corresponding counterpart of | |
| @code{m4_map_args([@var{action}]m4_set_listc([@var{set}]))} or | |
| @code{m4_set_foreach([@var{set}], [var], | |
| [@var{action}(m4_defn([var]))])}. It is possible to use @code{m4_curry} | |
| if more than one argument is needed for @var{action}, although it is | |
| more efficient to use @code{m4_set_map_sep} in that case. | |
| @end defmac | |
| @defmac m4_set_map_sep (@var{set}, @ovar{pre}, @ovar{post}, @ovar{sep}) | |
| @msindex{set_map_sep} | |
| For each element in the set @var{set}, expand | |
| @code{@var{pre}[element]@var{post}}, additionally expanding @var{sep} | |
| between elements. Behavior is unspecified if the expansion recursively | |
| lists the contents of @var{set} (although listing other sets | |
| is acceptable), or if it modifies the set in any way other than removing | |
| the element visited by the expansion. This macro provides the most | |
| efficient means for non-destructively visiting the elements of a set; in | |
| particular, @code{m4_set_map([@var{set}], [@var{action}])} is equivalent | |
| to @code{m4_set_map_sep([@var{set}], [@var{action}(], [)])}. | |
| @end defmac | |
| @defmac m4_set_remove (@var{set}, @var{value}, @ovar{if-present}, @ | |
| @ovar{if-absent}) | |
| @msindex{set_remove} | |
| If @var{value} is an element in the set @var{set}, then remove it and | |
| expand @var{if-present}. Otherwise expand @var{if-absent}. This macro | |
| operates in constant time so that multiple removals will scale linearly | |
| rather than quadratically; but when used outside of | |
| @code{m4_set_foreach} or @code{m4_set_map}, it leaves memory occupied | |
| until the set is later | |
| compacted by @code{m4_set_contents} or @code{m4_set_list}. Several | |
| other set operations are then less efficient between the time of element | |
| removal and subsequent memory compaction, but still maintain their | |
| guaranteed scaling performance. | |
| @end defmac | |
| @defmac m4_set_size (@var{set}) | |
| @msindex{set_size} | |
| Expand to the size of the set @var{set}. This implementation operates | |
| in constant time, and is thus more efficient than | |
| @code{m4_eval(m4_count(m4_set_listc([set])) - 1)}. | |
| @end defmac | |
| @node Forbidden Patterns | |
| @subsection Forbidden Patterns | |
| @cindex Forbidden patterns | |
| @cindex Patterns, forbidden | |
| M4sugar provides a means to define suspicious patterns, patterns | |
| describing tokens which should not be found in the output. For | |
| instance, if an Autoconf @file{configure} script includes tokens such as | |
| @samp{AC_DEFINE}, or @samp{dnl}, then most probably something went | |
| wrong (typically a macro was not evaluated because of overquotation). | |
| M4sugar forbids all the tokens matching @samp{^_?m4_} and @samp{^dnl$}. | |
| Additional layers, such as M4sh and Autoconf, add additional forbidden | |
| patterns to the list. | |
| @defmac m4_pattern_forbid (@var{pattern}) | |
| @msindex{pattern_forbid} | |
| Declare that no token matching @var{pattern} must be found in the | |
| output. The output file is (temporarily) split into one word per line | |
| as part of the @command{autom4te} post-processing, with each line (and | |
| therefore word) then being checked against the Perl regular expression | |
| @var{pattern}. If the regular expression matches, and | |
| @code{m4_pattern_allow} does not also match, then an error is raised. | |
| Comments are not checked; this can be a problem if, for instance, you | |
| have some macro left unexpanded after an @samp{#include}. No consensus | |
| is currently found in the Autoconf community, as some people consider it | |
| should be valid to name macros in comments (which doesn't make sense to | |
| the authors of this documentation: input, such as macros, should be | |
| documented by @samp{dnl} comments; reserving @samp{#}-comments to | |
| document the output). | |
| As an example, if you define your own macros that begin with @samp{M_} | |
| and are composed from capital letters and underscores, the specification | |
| of @code{m4_pattern_forbid([^M_[A-Z_]+])} will ensure all your macros | |
| are expanded when not used in comments. | |
| As an example of a common use of this macro, consider what happens in | |
| packages that want to use the @command{pkg-config} script via the | |
| third-party @code{PKG_CHECK_MODULES} macro. By default, if a developer | |
| checks out the development tree but has not yet installed the pkg-config | |
| macros locally, they can manage to successfully run @command{autoconf} | |
| on the package, but the resulting @file{configure} file will likely | |
| result in a confusing shell message about a syntax error on the line | |
| mentioning the unexpanded @code{PKG_CHECK_MODULES} macro. On the other hand, | |
| if @file{configure.ac} includes @code{m4_pattern_forbid([^PKG_])}, the | |
| missing pkg-config macros will be detected immediately without allowing | |
| @command{autoconf} to succeed. | |
| @end defmac | |
| Of course, you might encounter exceptions to these generic rules, for | |
| instance you might have to refer to @samp{$m4_flags}. | |
| @defmac m4_pattern_allow (@var{pattern}) | |
| @msindex{pattern_allow} | |
| Any token matching @var{pattern} is allowed, including if it matches an | |
| @code{m4_pattern_forbid} pattern. | |
| For example, Gnulib uses @code{m4_pattern_forbid([^gl_])} to reserve the | |
| @code{gl_} namespace for itself, but also uses | |
| @code{m4_pattern_allow([^gl_ES$])} to avoid a false negative on the | |
| valid locale name. | |
| @end defmac | |
| @node Debugging via autom4te | |
| @section Debugging via autom4te | |
| @cindex debugging tips | |
| @cindex autom4te debugging tips | |
| @cindex m4sugar debugging tips | |
| At times, it is desirable to see what was happening inside m4, to see | |
| why output was not matching expectations. However, post-processing done | |
| by @command{autom4te} means that directly using the m4 builtin | |
| @code{m4_traceon} is likely to interfere with operation. Also, frequent | |
| diversion changes and the concept of forbidden tokens make it difficult | |
| to use @code{m4_defn} to generate inline comments in the final output. | |
| There are a couple of tools to help with this. One is the use of the | |
| @option{--trace} option provided by @command{autom4te} (as well as each | |
| of the programs that wrap @command{autom4te}, such as | |
| @command{autoconf}), in order to inspect when a macro is called and with | |
| which arguments. For example, when this paragraph was written, the | |
| autoconf version could be found by: | |
| @example | |
| $ @kbd{autoconf --trace=AC_INIT} | |
| configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@@gnu.org | |
| $ @kbd{autoconf --trace='AC_INIT:version is $2'} | |
| version is 2.63b.95-3963 | |
| @end example | |
| Another trick is to print out the expansion of various m4 expressions to | |
| standard error or to an independent file, with no further m4 expansion, | |
| and without interfering with diversion changes or the post-processing | |
| done to standard output. @code{m4_errprintn} shows a given expression | |
| on standard error. For example, if you want to see the expansion of an | |
| autoconf primitive or of one of your autoconf macros, you can do it like | |
| this: | |
| @example | |
| $ @kbd{cat <<\EOF > configure.ac} | |
| AC_INIT | |
| m4_errprintn([The definition of AC_DEFINE_UNQUOTED:]) | |
| m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED])) | |
| AC_OUTPUT | |
| EOF | |
| $ @kbd{autoconf} | |
| @error{}The definition of AC_DEFINE_UNQUOTED: | |
| @error{}_AC_DEFINE_Q([], $@@) | |
| @end example | |
| @node Programming in M4sh | |
| @chapter Programming in M4sh | |
| M4sh, pronounced ``mash'', is aiming at producing portable Bourne shell | |
| scripts. This name was coined by Lars J. Aas, who notes that, | |
| according to the Webster's Revised Unabridged Dictionary (1913): | |
| @quotation | |
| Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische, mash, | |
| wash, and prob.@: to AS. miscian to mix. See ``Mix''.] | |
| @enumerate 1 | |
| @item | |
| A mass of mixed ingredients reduced to a soft pulpy state by beating or | |
| pressure@enddots{} | |
| @item | |
| A mixture of meal or bran and water fed to animals. | |
| @item | |
| A mess; trouble. [Obs.] --Beau.@: & Fl. | |
| @end enumerate | |
| @end quotation | |
| M4sh reserves the M4 macro namespace @samp{^_AS_} for internal use, and | |
| the namespace @samp{^AS_} for M4sh macros. It also reserves the shell | |
| and environment variable namespace @samp{^as_}, and the here-document | |
| delimiter namespace @samp{^_AS[A-Z]} in the output file. You should not | |
| define your own macros or output shell code that conflicts with these | |
| namespaces. | |
| @menu | |
| * Common Shell Constructs:: Portability layer for common shell constructs | |
| * Polymorphic Variables:: Support for indirect variable names | |
| * Initialization Macros:: Macros to establish a sane shell environment | |
| * File Descriptor Macros:: File descriptor macros for input and output | |
| @end menu | |
| @node Common Shell Constructs | |
| @section Common Shell Constructs | |
| M4sh provides portable alternatives for some common shell constructs | |
| that unfortunately are not portable in practice. | |
| @c Deprecated, to be replaced by a better API | |
| @ignore | |
| @defmac AS_BASENAME (@var{file-name}) | |
| @asindex{BASENAME} | |
| Output the non-directory portion of @var{file-name}. For example, | |
| if @code{$file} is @samp{/one/two/three}, the command | |
| @code{base=`AS_BASENAME(["$file"])`} sets @code{base} to @samp{three}. | |
| @end defmac | |
| @end ignore | |
| @defmac AS_BOX (@var{text}, @dvar{char, -}) | |
| @asindex{BOX} | |
| Expand into shell code that will output @var{text} surrounded by a box | |
| with @var{char} in the top and bottom border. @var{text} should not | |
| contain a newline, but may contain shell expansions valid for unquoted | |
| here-documents. @var{char} defaults to @samp{-}, but can be any | |
| character except @samp{/}, @samp{'}, @samp{"}, @samp{\}, | |
| @samp{&}, or @samp{`}. This is useful for outputting a comment box into | |
| log files to separate distinct phases of script operation. | |
| @end defmac | |
| @defmac AS_CASE (@var{word}, @ovar{pattern1}, @ovar{if-matched1}, @ | |
| @dots{}, @ovar{default}) | |
| @asindex{CASE} | |
| Expand into a shell @samp{case} statement, where @var{word} is matched | |
| against one or more patterns. @var{if-matched} is run if the | |
| corresponding pattern matched @var{word}, else @var{default} is run. | |
| @xref{Prerequisite Macros} for why | |
| this macro should be used instead of plain @samp{case} in code | |
| outside of an @code{AC_DEFUN} macro, when the contents of the | |
| @samp{case} use @code{AC_REQUIRE} directly or indirectly. | |
| @xref{case, , Limitations of Shell Builtins}, | |
| for how this macro avoids some portability issues. | |
| @xref{Balancing Parentheses} | |
| for how this macro lets you write code with balanced parentheses | |
| even if your code must run on obsolescent shells. | |
| @end defmac | |
| @c Deprecated, to be replaced by a better API | |
| @defmac AS_DIRNAME (@var{file-name}) | |
| @asindex{DIRNAME} | |
| Output the directory portion of @var{file-name}. For example, | |
| if @code{$file} is @samp{/one/two/three}, the command | |
| @code{dir=`AS_DIRNAME(["$file"])`} sets @code{dir} to @samp{/one/two}. | |
| @code{AS_DIRNAME} was designed long ago when | |
| the @command{dirname} command was not universally supported. | |
| Nowadays one can safely use @code{dir=`dirname -- "$file"`} instead. | |
| This interface may be improved in the future to avoid forks and losing | |
| trailing newlines. | |
| @end defmac | |
| @defmac AS_ECHO (@var{word}) | |
| @asindex{ECHO} | |
| Emit @var{word} to the standard output, followed by a newline. | |
| The @var{word} must be a single shell word (typically a quoted string). | |
| Output the shell expansion of @var{word} as-is, | |
| even if it starts with @samp{-} or contains @samp{\}. | |
| Redirections can be placed outside the macro invocation. | |
| If the shell variable @var{foo} could contain @samp{\} or leading @samp{-}. | |
| @code{AS_ECHO(["$foo"])} is more portable than @command{echo "$foo"}. | |
| @xref{echo, , Limitations of Shell Builtins}. | |
| Also, @code{AS_ECHO(["$foo"])} is often easier to read than the | |
| @samp{printf '%s\n' "$foo"} that it stands for. | |
| However, because it employs @samp{'} characters, | |
| in contexts where @samp{'} is not allowed | |
| it is better to use @command{printf} directly. | |
| For example, @samp{`eval 'foo=$@{'AS_ESCAPE([[$1]], [`\])'@};printf | |
| "%s\\n" "$foo")'`} would not work if @command{printf} were replaced | |
| with @code{AS_ECHO}. | |
| @end defmac | |
| @defmac AS_ECHO_N (@var{word}) | |
| @asindex{ECHO_N} | |
| Act like @code{AS_ECHO(@var{word})}, except do not output a following newline. | |
| @end defmac | |
| @c We cannot use @dvar because the macro expansion mistreats backslashes. | |
| @defmac AS_ESCAPE (@var{string}, @r{[}@var{chars} = @samp{`\"$}@r{]}) | |
| @asindex{ESCAPE} | |
| Expands to @var{string}, with any characters in @var{chars} escaped with | |
| a backslash (@samp{\}). @var{chars} should be at most four bytes long, | |
| and only contain characters from the set @samp{`\"$}; however, | |
| characters may be safely listed more than once in @var{chars} for the | |
| sake of syntax highlighting editors. The current implementation expands | |
| @var{string} after adding escapes; if @var{string} contains macro calls | |
| that in turn expand to text needing shell quoting, you can use | |
| @code{AS_ESCAPE(m4_dquote(m4_expand([string])))}. | |
| The default for @var{chars} (@samp{\"$`}) is the set of characters | |
| needing escapes when @var{string} will be used literally within double | |
| quotes. One common variant is the set of characters to protect when | |
| @var{string} will be used literally within back-ticks or an unquoted | |
| here-document (@samp{\$`}). Another common variant is @samp{""}, which can | |
| be used to form a double-quoted string containing the same expansions | |
| that would have occurred if @var{string} were expanded in an unquoted | |
| here-document; however, when using this variant, care must be taken that | |
| @var{string} does not use double quotes within complex variable | |
| expansions (such as @samp{$@{foo-`echo "hi"`@}}) that would be broken | |
| with improper escapes. | |
| This macro is often used with @code{AS_ECHO}. For an example, observe | |
| the output generated by the shell code generated from this snippet: | |
| @example | |
| foo=bar | |
| AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"]) | |
| @result{}"$foo" = "bar" | |
| m4_define([macro], [a, [\b]]) | |
| AS_ECHO(["AS_ESCAPE([[macro]])"]) | |
| @result{}macro | |
| AS_ECHO(["AS_ESCAPE([macro])"]) | |
| @result{}a, b | |
| AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"]) | |
| @result{}a, \b | |
| @end example | |
| @comment Should we add AS_ESCAPE_SINGLE? If we do, we can optimize in | |
| @comment the case of @var{string} that does not contain '. | |
| To escape a string that will be placed within single quotes, use: | |
| @example | |
| m4_bpatsubst([[@var{string}]], ['], ['\\'']) | |
| @end example | |
| @end defmac | |
| @defmac AS_EXECUTABLE_P (@var{file}) | |
| @asindex{EXECUTABLE_P} | |
| Emit code to probe whether @var{file} is a regular file with executable | |
| permissions (and not a directory with search permissions). The caller | |
| is responsible for quoting @var{file}. | |
| @end defmac | |
| @defmac AS_EXIT (@dvar{status, $?}) | |
| @asindex{EXIT} | |
| Emit code to exit the shell with @var{status}, defaulting to @samp{$?}. | |
| This macro | |
| works around shells that see the exit status of the command prior to | |
| @code{exit} inside a @samp{trap 0} handler (@pxref{trap, , Limitations | |
| of Shell Builtins}). | |
| @end defmac | |
| @defmac AS_IF (@var{test1}, @ovar{run-if-true1}, @dots{}, @ovar{run-if-false}) | |
| @asindex{IF} | |
| Run shell code @var{test1}. If @var{test1} exits with a zero status then | |
| run shell code @var{run-if-true1}, else examine further tests. If no test | |
| exits with a zero status, run shell code @var{run-if-false}, with | |
| simplifications if either @var{run-if-true1} or @var{run-if-false} | |
| is empty. For example, | |
| @example | |
| AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])], | |
| [test "x$foo" != xno], [HANDLE_FOO([maybe])], | |
| [echo foo not specified]) | |
| @end example | |
| @noindent | |
| ensures any required macros of @code{HANDLE_FOO} | |
| are expanded before the first test. | |
| This macro should be used instead of plain @samp{if} in code | |
| outside of an @code{AC_DEFUN} macro, when the contents of the @samp{if} | |
| use @code{AC_REQUIRE} directly or indirectly (@pxref{Prerequisite Macros}). | |
| @end defmac | |
| @defmac AS_MKDIR_P (@var{file-name}) | |
| @asindex{MKDIR_P} | |
| Make the directory @var{file-name}, including intervening directories | |
| as necessary. This is equivalent to @samp{mkdir -p -- @var{file-name}}. | |
| If creation of @var{file-name} fails, exit the script. | |
| Also see the @code{AC_PROG_MKDIR_P} macro (@pxref{Particular Programs}). | |
| @end defmac | |
| @defmac AS_SET_STATUS (@var{status}) | |
| @asindex{SET_STATUS} | |
| Emit shell code to set the value of @samp{$?} to @var{status}, as | |
| efficiently as possible. However, this is not guaranteed to abort a | |
| shell running with @code{set -e} (@pxref{set, , Limitations of Shell | |
| Builtins}). This should also be used at the end of a complex shell | |
| function instead of @samp{return} (@pxref{Shell Functions}) to avoid | |
| a DJGPP shell bug. | |
| @end defmac | |
| @defmac AS_TR_CPP (@var{expression}) | |
| @asindex{TR_CPP} | |
| Transform @var{expression} into a valid right-hand side for a C @code{#define}. | |
| For example: | |
| @example | |
| # This outputs "#define HAVE_CHAR_P 1". | |
| # Notice the m4 quoting around #, to prevent an m4 comment | |
| type="char *" | |
| echo "[#]define AS_TR_CPP([HAVE_$type]) 1" | |
| @end example | |
| @end defmac | |
| @defmac AS_TR_SH (@var{expression}) | |
| @asindex{TR_SH} | |
| Transform @var{expression} into shell code that generates a valid shell | |
| variable name. The result is literal when possible at m4 time, but must | |
| be used with @code{eval} if @var{expression} causes shell indirections. | |
| For example: | |
| @example | |
| # This outputs "Have it!". | |
| header="sys/some file.h" | |
| eval AS_TR_SH([HAVE_$header])=yes | |
| if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi | |
| @end example | |
| @end defmac | |
| @defmac AS_SET_CATFILE (@var{var}, @var{dir}, @var{file}) | |
| @asindex{SET_CATFILE} | |
| Set the polymorphic shell variable @var{var} to @var{dir}/@var{file}, | |
| but optimizing the common cases (@var{dir} or @var{file} is @samp{.}, | |
| @var{file} is absolute, etc.). | |
| @end defmac | |
| @defmac AS_UNSET (@var{var}) | |
| @asindex{UNSET} | |
| Unsets the shell variable @var{var}, working around bugs in older | |
| shells (@pxref{unset, , Limitations of Shell | |
| Builtins}). @var{var} can be a literal or indirect variable name. | |
| @end defmac | |
| @defmac AS_VERSION_COMPARE (@var{version-1}, @var{version-2}, @ | |
| @ovar{action-if-less}, @ovar{action-if-equal}, @ovar{action-if-greater}) | |
| @asindex{VERSION_COMPARE} | |
| Compare two strings @var{version-1} and @var{version-2}, possibly | |
| containing shell variables, as version strings, and expand | |
| @var{action-if-less}, @var{action-if-equal}, or @var{action-if-greater} | |
| depending upon the result. | |
| The algorithm to compare is similar to the one used by strverscmp in | |
| glibc (@pxref{String/Array Comparison, , String/Array Comparison, libc, | |
| The GNU C Library}). | |
| @end defmac | |
| @node Polymorphic Variables | |
| @section Support for indirect variable names | |
| @cindex variable name indirection | |
| @cindex polymorphic variable name | |
| @cindex indirection, variable name | |
| Often, it is convenient to write a macro that will emit shell code | |
| operating on a shell variable. The simplest case is when the variable | |
| name is known. But a more powerful idiom is writing shell code that can | |
| work through an indirection, where another variable or command | |
| substitution produces the name of the variable to actually manipulate. | |
| M4sh supports the notion of polymorphic shell variables, making it easy | |
| to write a macro that can deal with either literal or indirect variable | |
| names and output shell code appropriate for both use cases. Behavior is | |
| undefined if expansion of an indirect variable does not result in a | |
| literal variable name. | |
| @defmac AS_LITERAL_IF (@var{expression}, @ovar{if-literal}, @ovar{if-not}, @ | |
| @dvarv{if-simple-ref, if-not}) | |
| @defmacx AS_LITERAL_WORD_IF (@var{expression}, @ovar{if-literal}, @ | |
| @ovar{if-not}, @dvarv{if-simple-ref, if-not}) | |
| @asindex{LITERAL_IF} | |
| @asindex{LITERAL_WORD_IF} | |
| If the expansion of @var{expression} is definitely a shell literal, | |
| expand @var{if-literal}. If the expansion of @var{expression} looks | |
| like it might contain shell indirections (such as @code{$var} or | |
| @code{`expr`}), then @var{if-not} is expanded. Sometimes, it is | |
| possible to output optimized code if @var{expression} consists only of | |
| shell variable expansions (such as @code{$@{var@}}), in which case | |
| @var{if-simple-ref} can be provided; but defaulting to @var{if-not} | |
| should always be safe. @code{AS_LITERAL_WORD_IF} only expands | |
| @var{if-literal} if @var{expression} looks like a single shell word, | |
| containing no whitespace; while @code{AS_LITERAL_IF} allows whitespace | |
| in @var{expression}. | |
| In order to reduce the time spent recognizing whether an | |
| @var{expression} qualifies as a literal or a simple indirection, the | |
| implementation is somewhat conservative: @var{expression} must be a | |
| single shell word (possibly after stripping whitespace), consisting only | |
| of bytes that would have the same meaning whether unquoted or enclosed | |
| in double quotes (for example, @samp{a.b} results in @var{if-literal}, | |
| even though it is not a valid shell variable name; while both @samp{'a'} | |
| and @samp{[$]} result in @var{if-not}, because they behave differently | |
| than @samp{"'a'"} and @samp{"[$]"}). This macro can be used in contexts | |
| for recognizing portable file names (such as in the implementation of | |
| @code{AC_LIBSOURCE}), or coupled with some transliterations for forming | |
| valid variable names (such as in the implementation of @code{AS_TR_SH}, | |
| which uses an additional @code{m4_translit} to convert @samp{.} to | |
| @samp{_}). | |
| This example shows how to read the contents of the shell variable | |
| @code{bar}, exercising all three arguments to @code{AS_LITERAL_IF}. It | |
| results in a script that will output the line @samp{hello} three times. | |
| @example | |
| AC_DEFUN([MY_ACTION], | |
| [AS_LITERAL_IF([$1], | |
| [AS_ECHO(["$$1"])], | |
| @c $$ | |
| [AS_VAR_COPY([var], [$1]) | |
| AS_ECHO(["$var"])], | |
| [AS_ECHO(["$'"$1"\"])])]) | |
| foo=bar bar=hello | |
| MY_ACTION([bar]) | |
| MY_ACTION([`echo bar`]) | |
| MY_ACTION([$foo]) | |
| @end example | |
| @end defmac | |
| @defmac AS_VAR_APPEND (@var{var}, @var{text}) | |
| @asindex{VAR_APPEND} | |
| Emit shell code to append the shell expansion of @var{text} to the end | |
| of the current contents of the polymorphic shell variable @var{var}, | |
| taking advantage of shells that provide the @samp{+=} extension for more | |
| efficient scaling. | |
| For situations where the final contents of @var{var} are relatively | |
| short (less than 256 bytes), it is more efficient to use the simpler | |
| code sequence of @code{@var{var}=$@{@var{var}@}@var{text}} (or its | |
| polymorphic equivalent of @code{AS_VAR_COPY([t], [@var{var}])} and | |
| @code{AS_VAR_SET([@var{var}], ["$t"@var{text}])}). But in the case | |
| when the script will be repeatedly appending text into @code{var}, | |
| issues of scaling start to become apparent. A naive implementation | |
| requires execution time linear to the length of the current contents of | |
| @var{var} as well as the length of @var{text} for a single append, for | |
| an overall quadratic scaling with multiple appends. This macro takes | |
| advantage of shells which provide the extension | |
| @code{@var{var}+=@var{text}}, which can provide amortized constant time | |
| for a single append, for an overall linear scaling with multiple | |
| appends. Note that unlike @code{AS_VAR_SET}, this macro requires that | |
| @var{text} be quoted properly to avoid field splitting and file name | |
| expansion. | |
| @end defmac | |
| @defmac AS_VAR_ARITH (@var{var}, @var{expression}) | |
| @asindex{VAR_ARITH} | |
| Emit shell code to compute the arithmetic expansion of @var{expression}, | |
| assigning the result as the contents of the polymorphic shell variable | |
| @var{var}. The code takes advantage of shells that provide @samp{$(())} | |
| for fewer forks, but uses @command{expr} as a fallback. Therefore, the | |
| syntax for a valid @var{expression} is rather limited: all operators | |
| must occur as separate shell arguments and with proper quoting; | |
| the only operators supported are @samp{*}, @samp{/}, @samp{%}, binary | |
| @samp{+}, binary @samp{-}, @samp{>}, @samp{>=}, @samp{<}, @samp{<=}, | |
| @samp{!=}, @samp{&}, and @samp{|}; | |
| all variables containing numbers must be expanded prior to the computation; | |
| the first shell argument must not start with @samp{-}; | |
| and each number must be an optional @samp{-} followed by one or more | |
| decimal digits, where the first digit is nonzero if there is more than | |
| one digit. In the following example, this snippet | |
| will print @samp{(2+3)*4 == 20}. | |
| @example | |
| bar=3 | |
| AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4]) | |
| echo "(2+$bar)*4 == $foo" | |
| @end example | |
| @end defmac | |
| @defmac AS_VAR_COPY (@var{dest}, @var{source}) | |
| @asindex{VAR_COPY} | |
| Emit shell code to assign the contents of the polymorphic shell variable | |
| @var{source} to the polymorphic shell variable @var{dest}. For example, | |
| executing this M4sh snippet will output @samp{bar hi}: | |
| @example | |
| foo=bar bar=hi | |
| AS_VAR_COPY([a], [foo]) | |
| AS_VAR_COPY([b], [$foo]) | |
| echo "$a $b" | |
| @end example | |
| When it is necessary to access the contents of an indirect variable | |
| inside a shell double-quoted context, the recommended idiom is to first | |
| copy the contents into a temporary literal shell variable. | |
| @smallexample | |
| for header in stdint_h inttypes_h ; do | |
| AS_VAR_COPY([var], [ac_cv_header_$header]) | |
| AS_ECHO(["$header detected: $var"]) | |
| done | |
| @end smallexample | |
| @end defmac | |
| @comment AS_VAR_GET is intentionally undocumented; it can't handle | |
| @comment trailing newlines uniformly, and forks too much. | |
| @defmac AS_VAR_IF (@var{var}, @ovar{word}, @ovar{if-equal}, @ | |
| @ovar{if-not-equal}) | |
| @asindex{VAR_IF} | |
| Output a shell conditional statement. If the contents of the | |
| polymorphic shell variable @var{var} match the string @var{word}, | |
| execute @var{if-equal}; otherwise execute @var{if-not-equal}. @var{word} | |
| must be a single shell word (typically a quoted string). Avoids | |
| shell bugs if an interrupt signal arrives while a command substitution | |
| in @var{var} is being expanded. | |
| @end defmac | |
| @defmac AS_VAR_PUSHDEF (@var{m4-name}, @var{value}) | |
| @defmacx AS_VAR_POPDEF (@var{m4-name}) | |
| @asindex{VAR_PUSHDEF} | |
| @asindex{VAR_POPDEF} | |
| @cindex composing variable names | |
| @cindex variable names, composing | |
| A common M4sh idiom involves composing shell variable names from an m4 | |
| argument (for example, writing a macro that uses a cache variable). | |
| @var{value} can be an arbitrary string, which will be transliterated | |
| into a valid shell name by @code{AS_TR_SH}. In order to access the | |
| composed variable name based on @var{value}, it is easier to declare a | |
| temporary m4 macro @var{m4-name} with @code{AS_VAR_PUSHDEF}, then use | |
| that macro as the argument to subsequent @code{AS_VAR} macros as a | |
| polymorphic variable name, and finally free the temporary macro with | |
| @code{AS_VAR_POPDEF}. These macros are often followed with @code{dnl}, | |
| to avoid excess newlines in the output. | |
| Here is an involved example, that shows the power of writing macros that | |
| can handle composed shell variable names: | |
| @example | |
| m4_define([MY_CHECK_HEADER], | |
| [AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl | |
| AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl | |
| AS_VAR_POPDEF([my_Header])dnl | |
| ]) | |
| MY_CHECK_HEADER([stdint.h]) | |
| for header in inttypes.h stdlib.h ; do | |
| MY_CHECK_HEADER([$header]) | |
| done | |
| @end example | |
| @noindent | |
| In the above example, @code{MY_CHECK_HEADER} can operate on polymorphic | |
| variable names. In the first invocation, the m4 argument is | |
| @code{stdint.h}, which transliterates into a literal @code{stdint_h}. | |
| As a result, the temporary macro @code{my_Header} expands to the literal | |
| shell name @samp{ac_cv_header_stdint_h}. In the second invocation, the | |
| m4 argument to @code{MY_CHECK_HEADER} is @code{$header}, and the | |
| temporary macro @code{my_Header} expands to the indirect shell name | |
| @samp{$as_my_Header}. During the shell execution of the for loop, when | |
| @samp{$header} contains @samp{inttypes.h}, then @samp{$as_my_Header} | |
| contains @samp{ac_cv_header_inttypes_h}. If this script is then run on a | |
| platform where all three headers have been previously detected, the | |
| output of the script will include: | |
| @smallexample | |
| header stdint.h detected | |
| header inttypes.h detected | |
| header stdlib.h detected | |
| @end smallexample | |
| @end defmac | |
| @defmac AS_VAR_SET (@var{var}, @ovar{value}) | |
| @asindex{VAR_SET} | |
| Emit shell code to assign the contents of the polymorphic shell variable | |
| @var{var} to the shell expansion of @var{value}. @var{value} is not | |
| subject to field splitting or file name expansion, so if command | |
| substitution is used, it may be done with @samp{`""`} rather than using | |
| an intermediate variable (@pxref{Shell Substitutions}). However, | |
| @var{value} does undergo rescanning for additional macro names; behavior | |
| is unspecified if late expansion results in any shell meta-characters. | |
| @end defmac | |
| @defmac AS_VAR_SET_IF (@var{var}, @ovar{if-set}, @ovar{if-undef}) | |
| @asindex{VAR_SET_IF} | |
| Emit a shell conditional statement, which executes @var{if-set} if the | |
| polymorphic shell variable @code{var} is set to any value, and | |
| @var{if-undef} otherwise. | |
| @end defmac | |
| @defmac AS_VAR_TEST_SET (@var{var}) | |
| @asindex{VAR_TEST_SET} | |
| Emit a shell statement that results in a successful exit status only if | |
| the polymorphic shell variable @code{var} is set. | |
| @end defmac | |
| @node Initialization Macros | |
| @section Initialization Macros | |
| @defmac AS_BOURNE_COMPATIBLE | |
| @asindex{BOURNE_COMPATIBLE} | |
| Set up the shell to be more compatible with the Bourne shell as | |
| standardized by POSIX, if possible. This may involve setting | |
| environment variables, or setting options, or similar | |
| implementation-specific actions. This macro is deprecated, since | |
| @code{AS_INIT} already invokes it. | |
| @end defmac | |
| @defmac AS_INIT | |
| @asindex{INIT} | |
| @evindex LC_ALL | |
| @evindex SHELL | |
| Initialize the M4sh environment. This macro calls @code{m4_init}, then | |
| outputs the @code{#! /bin/sh} line, a notice about where the output was | |
| generated from, and code to sanitize the environment for the rest of the | |
| script. Among other initializations, this sets @env{SHELL} to the shell | |
| chosen to run the script (@pxref{CONFIG_SHELL}), and @env{LC_ALL} to | |
| ensure the C locale. Finally, it changes the current diversion to | |
| @code{BODY}. @code{AS_INIT} is called automatically by @code{AC_INIT} | |
| and @code{AT_INIT}, so shell code in @file{configure}, | |
| @file{config.status}, and @file{testsuite} all benefit from a sanitized | |
| shell environment. | |
| @end defmac | |
| @defmac AS_INIT_GENERATED (@var{file}, @ovar{comment}) | |
| @asindex{INIT_GENERATED} | |
| Emit shell code to start the creation of a subsidiary shell script in | |
| @var{file}, including changing @var{file} to be executable. This macro | |
| populates the child script with information learned from the parent | |
| (thus, the emitted code is equivalent in effect, but more efficient, | |
| than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and | |
| @code{AS_SHELL_SANITIZE}). If present, @var{comment} is output near the | |
| beginning of the child, prior to the shell initialization code, and is | |
| subject to parameter expansion, command substitution, and backslash | |
| quote removal. The | |
| parent script should check the exit status after this macro, in case | |
| @var{file} could not be properly created (for example, if the disk was | |
| full). If successfully created, the parent script can then proceed to | |
| append additional M4sh constructs into the child script. | |
| Note that the child script starts life without a log file open, so if | |
| the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you | |
| must temporarily disable any attempts to use the log file until after | |
| emitting code to open a log within the child. On the other hand, if the | |
| parent script has @code{AS_MESSAGE_FD} redirected somewhere besides | |
| @samp{1}, then the child script already has code that copies stdout to | |
| that descriptor. Currently, the suggested | |
| idiom for writing a M4sh shell script from within another script is: | |
| @example | |
| AS_INIT_GENERATED([@var{file}], [[# My child script. | |
| ]]) || @{ AS_ECHO(["Failed to create child script"]); AS_EXIT; @} | |
| m4_pushdef([AS_MESSAGE_LOG_FD])dnl | |
| cat >> "@var{file}" <<\__EOF__ | |
| # Code to initialize AS_MESSAGE_LOG_FD | |
| m4_popdef([AS_MESSAGE_LOG_FD])dnl | |
| # Additional code | |
| __EOF__ | |
| @end example | |
| This, however, may change in the future as the M4sh interface is | |
| stabilized further. | |
| Also, be aware that use of @env{LINENO} within the child script may | |
| report line numbers relative to their location in the parent script, | |
| even when using @code{AS_LINENO_PREPARE}, if the parent script was | |
| unable to locate a shell with working @env{LINENO} support. | |
| @end defmac | |
| @defmac AS_LINENO_PREPARE | |
| @asindex{LINENO_PREPARE} | |
| @evindex LINENO | |
| Find a shell that supports the special variable @env{LINENO}, which | |
| contains the number of the currently executing line. This macro is | |
| automatically invoked by @code{AC_INIT} in configure scripts. | |
| @end defmac | |
| @defmac AS_ME_PREPARE | |
| @asindex{ME_PREPARE} | |
| Set up variable @env{as_me} to be the basename of the currently executing | |
| script. This macro is automatically invoked by @code{AC_INIT} in | |
| configure scripts. | |
| @end defmac | |
| @defmac AS_TMPDIR (@var{prefix}, @dvar{dir, $@{TMPDIR:=/tmp@}}) | |
| @asindex{TMPDIR} | |
| @evindex TMPDIR | |
| @ovindex tmp | |
| Create, as safely as possible, a temporary sub-directory within | |
| @var{dir} with a name starting with @var{prefix}. @var{prefix} should | |
| be 2--4 characters, to make it slightly easier to identify the owner of | |
| the directory. If @var{dir} is omitted, then the value of @env{TMPDIR} | |
| will be used (defaulting to @samp{/tmp}). On success, the name of the | |
| newly created directory is stored in the shell variable @code{tmp}. On | |
| error, the script is aborted. | |
| Typically, this macro is coupled with some exit traps to delete the created | |
| directory and its contents on exit or interrupt. However, there is a | |
| slight window between when the directory is created and when the name is | |
| actually known to the shell, so an interrupt at the right moment might | |
| leave the temporary directory behind. Hence it is important to use a | |
| @var{prefix} that makes it easier to determine if a leftover temporary | |
| directory from an interrupted script is safe to delete. | |
| If you set @code{TMPDIR=$tmp} after invoking this macro, you should | |
| reset @code{TMPDIR} before deleting the created directory, to avoid | |
| breaking commands that rely on @code{$TMPDIR}. | |
| The use of the output variable @samp{$tmp} rather than something in the | |
| @samp{as_} namespace is historical; it has the unfortunate consequence | |
| that reusing this otherwise common name for any other purpose inside | |
| your script has the potential to break any cleanup traps designed to | |
| remove the temporary directory. | |
| @end defmac | |
| @defmac AS_SHELL_SANITIZE | |
| @asindex{SHELL_SANITIZE} | |
| Initialize the shell suitably for @command{configure} scripts. This has | |
| the effect of @code{AS_BOURNE_COMPATIBLE}, and sets some other | |
| environment variables for predictable results from configuration tests. | |
| For example, it sets @env{LC_ALL} to change to the default C locale. | |
| @xref{Special Shell Variables}. This macro is deprecated, since | |
| @code{AS_INIT} already invokes it. | |
| @end defmac | |
| @node File Descriptor Macros | |
| @section File Descriptor Macros | |
| @cindex input | |
| @cindex standard input | |
| @cindex file descriptors | |
| @cindex descriptors | |
| @cindex low-level output | |
| @cindex output, low-level | |
| The following macros define file descriptors used to output messages | |
| (or input values) from @file{configure} scripts. | |
| For example: | |
| @example | |
| AS_ECHO(["$wombats found"]) >&AS_MESSAGE_LOG_FD | |
| AS_ECHO_N(['Enter desired kangaroo count: ']) >&AS_MESSAGE_FD | |
| read kangaroos <&AS_ORIGINAL_STDIN_FD | |
| @end example | |
| @noindent | |
| However doing so is seldom needed, because Autoconf provides higher | |
| level macros as described below. | |
| @defmac AS_MESSAGE_FD | |
| @asindex{MESSAGE_FD} | |
| The file descriptor for @samp{checking for...} messages and results. | |
| By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh | |
| clients. However, @code{AC_INIT} shuffles things around to another file | |
| descriptor, in order to allow the @option{-q} option of | |
| @command{configure} to choose whether messages should go to the script's | |
| standard output or be discarded. | |
| If you want to display some messages, consider using one of the printing | |
| macros (@pxref{Printing Messages}) instead. Copies of messages output | |
| via these macros are also recorded in @file{config.log}. | |
| @end defmac | |
| @anchor{AS_MESSAGE_LOG_FD} | |
| @defmac AS_MESSAGE_LOG_FD | |
| @asindex{MESSAGE_LOG_FD} | |
| This must either be empty, or expand to a file descriptor for log | |
| messages. By default, @code{AS_INIT} sets this macro to the empty | |
| string for standalone M4sh clients, thus disabling logging. However, | |
| @code{AC_INIT} shuffles things around so that both @command{configure} | |
| and @command{config.status} use @file{config.log} for log messages. | |
| Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the | |
| Compiler}), redirect all output to this descriptor. You may want to do | |
| so if you develop such a low-level macro. | |
| @end defmac | |
| @defmac AS_ORIGINAL_STDIN_FD | |
| @asindex{ORIGINAL_STDIN_FD} | |
| This must expand to a file descriptor for the original standard input. | |
| By default, @code{AS_INIT} sets this macro to @samp{0} for standalone | |
| M4sh clients. However, @code{AC_INIT} shuffles things around for | |
| safety. | |
| When @command{configure} runs, it may accidentally execute an | |
| interactive command that has the same name as the non-interactive meant | |
| to be used or checked. If the standard input was the terminal, such | |
| interactive programs would cause @command{configure} to stop, pending | |
| some user input. Therefore @command{configure} redirects its standard | |
| input from @file{/dev/null} during its initialization. This is not | |
| normally a problem, since @command{configure} normally does not need | |
| user input. | |
| In the extreme case where your @file{configure} script really needs to | |
| obtain some values from the original standard input, you can read them | |
| explicitly from @code{AS_ORIGINAL_STDIN_FD}. | |
| @end defmac | |
| @c =================================================== Writing Autoconf Macros. | |
| @node Writing Autoconf Macros | |
| @chapter Writing Autoconf Macros | |
| When you write a feature test that could be applicable to more than one | |
| software package, the best thing to do is encapsulate it in a new macro. | |
| Here are some instructions and guidelines for writing Autoconf macros. | |
| You should also familiarize yourself with M4sugar (@pxref{Programming in M4}) | |
| and M4sh (@pxref{Programming in M4sh}). | |
| @menu | |
| * Macro Definitions:: Basic format of an Autoconf macro | |
| * Macro Names:: What to call your new macros | |
| * Dependencies Between Macros:: What to do when macros depend on other macros | |
| * Obsoleting Macros:: Warning about old ways of doing things | |
| * Coding Style:: Writing Autoconf macros à la Autoconf | |
| @end menu | |
| @node Macro Definitions | |
| @section Macro Definitions | |
| @defmac AC_DEFUN (@var{name}, @ovar{body}) | |
| @acindex{DEFUN} | |
| Autoconf macros are defined using the @code{AC_DEFUN} macro, which is | |
| similar to the M4 builtin @code{m4_define} macro; this creates a macro | |
| named @var{name} and with @var{body} as its expansion. In addition to | |
| defining a macro, @code{AC_DEFUN} adds to it some code that is used to | |
| constrain the order in which macros are called, while avoiding redundant | |
| output (@pxref{Prerequisite Macros}). | |
| @end defmac | |
| An Autoconf macro definition looks like this: | |
| @example | |
| AC_DEFUN(@var{macro-name}, @var{macro-body}) | |
| @end example | |
| You can refer to any arguments passed to the macro as @samp{$1}, | |
| @samp{$2}, etc. @xref{Definitions, , How to define new macros, m4, | |
| GNU M4}, for more complete information on writing M4 macros. | |
| Most macros fall in one of two general categories. The first category | |
| includes macros which take arguments, in order to generate output | |
| parameterized by those arguments. Macros in this category are designed | |
| to be directly expanded, often multiple times, and should not be used as | |
| the argument to @code{AC_REQUIRE}. The other category includes macros | |
| which are shorthand for a fixed block of text, and therefore do not take | |
| arguments. For this category of macros, directly expanding the macro | |
| multiple times results in redundant output, so it is more common to use | |
| the macro as the argument to @code{AC_REQUIRE}, or to declare the macro | |
| with @code{AC_DEFUN_ONCE} (@pxref{One-Shot Macros}). | |
| Be sure to properly quote both the @var{macro-body} @emph{and} the | |
| @var{macro-name} to avoid any problems if the macro happens to have | |
| been previously defined. | |
| Each macro should have a header comment that gives its prototype, and a | |
| brief description. When arguments have default values, display them in | |
| the prototype. For example: | |
| @example | |
| # AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1]) | |
| # -------------------------------------- | |
| m4_define([AC_MSG_ERROR], | |
| [@{ AS_MESSAGE([error: $1], [2]) | |
| exit m4_default([$2], [1]); @}]) | |
| @end example | |
| Comments about the macro should be left in the header comment. Most | |
| other comments make their way into @file{configure}, so just keep | |
| using @samp{#} to introduce comments. | |
| @cindex @code{dnl} | |
| If you have some special comments about pure M4 code, comments | |
| that make no sense in @file{configure} and in the header comment, then | |
| use the builtin @code{dnl}: it causes M4 to discard the text | |
| through the next newline. | |
| Keep in mind that @code{dnl} is rarely needed to introduce comments; | |
| @code{dnl} is more useful to get rid of the newlines following macros | |
| that produce no output, such as @code{AC_REQUIRE}. | |
| Public third-party macros need to use @code{AC_DEFUN}, and not | |
| @code{m4_define}, in order to be found by @command{aclocal} | |
| (@pxref{Extending aclocal,,, automake, GNU Automake}). | |
| Additionally, if it is ever determined that a macro should be made | |
| obsolete, it is easy to convert from @code{AC_DEFUN} to @code{AU_DEFUN} | |
| in order to have @command{autoupdate} assist the user in choosing a | |
| better alternative, but there is no corresponding way to make | |
| @code{m4_define} issue an upgrade notice (@pxref{AU_DEFUN}). | |
| There is another subtle, but important, difference between using | |
| @code{m4_define} and @code{AC_DEFUN}: only the former is unaffected by | |
| @code{AC_REQUIRE}. When writing a file, it is always safe to replace a | |
| block of text with a @code{m4_define} macro that will expand to the same | |
| text. But replacing a block of text with an @code{AC_DEFUN} macro with | |
| the same content does not necessarily give the same results, because it | |
| changes the location where any embedded but unsatisfied | |
| @code{AC_REQUIRE} invocations within the block will be expanded. For an | |
| example of this, see @ref{Expanded Before Required}. | |
| @node Macro Names | |
| @section Macro Names | |
| All of the public Autoconf macros have all-uppercase names in the | |
| namespace @samp{^AC_} to prevent them from accidentally conflicting with | |
| other text; Autoconf also reserves the namespace @samp{^_AC_} for | |
| internal macros. All shell variables that they use for internal | |
| purposes have mostly-lowercase names starting with @samp{ac_}. Autoconf | |
| also uses here-document delimiters in the namespace @samp{^_AC[A-Z]}. During | |
| @command{configure}, files produced by Autoconf make heavy use of the | |
| file system namespace @samp{^conf}. | |
| Since Autoconf is built on top of M4sugar (@pxref{Programming in | |
| M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware | |
| of those namespaces (@samp{^_?\(m4\|AS\)_}). And since | |
| @file{configure.ac} is also designed to be scanned by Autoheader, | |
| Autoscan, Autoupdate, and Automake, you should be aware of the | |
| @samp{^_?A[HNUM]_} namespaces. In general, you @emph{should not use} | |
| the namespace of a package that does not own the macro or shell code you | |
| are writing. | |
| To ensure that your macros don't conflict with present or future | |
| Autoconf macros, you should prefix your own macro names and any shell | |
| variables they use with some other sequence. Possibilities include your | |
| initials, or an abbreviation for the name of your organization or | |
| software package. Historically, people have not always followed the | |
| rule of using a namespace appropriate for their package, and this has | |
| made it difficult for determining the origin of a macro (and where to | |
| report bugs about that macro), as well as difficult for the true | |
| namespace owner to add new macros without interference from pre-existing | |
| uses of third-party macros. Perhaps the best example of this confusion | |
| is the @code{AM_GNU_GETTEXT} macro, which belongs, not to Automake, but | |
| to Gettext. | |
| Most of the Autoconf macros' names follow a structured naming convention | |
| that indicates the kind of feature check by the name. The macro names | |
| consist of several words, separated by underscores, going from most | |
| general to most specific. The names of their cache variables use the | |
| same convention (@pxref{Cache Variable Names}, for more information on | |
| them). | |
| The first word of the name after the namespace initials (such as | |
| @samp{AC_}) usually tells the category | |
| of the feature being tested. Here are the categories used in Autoconf for | |
| specific test macros, the kind of macro that you are more likely to | |
| write. They are also used for cache variables, in all-lowercase. Use | |
| them where applicable; where they're not, invent your own categories. | |
| @table @code | |
| @item C | |
| C language builtin features. | |
| @item DECL | |
| Declarations of C variables in header files. | |
| @item FUNC | |
| Functions in libraries. | |
| @item GROUP | |
| POSIX group owners of files. | |
| @item HEADER | |
| Header files. | |
| @item LIB | |
| C libraries. | |
| @item PROG | |
| The base names of programs. | |
| @item MEMBER | |
| Members of aggregates. | |
| @item SYS | |
| Operating system features. | |
| @item TYPE | |
| C builtin or declared types. | |
| @item VAR | |
| C variables in libraries. | |
| @end table | |
| After the category comes the name of the particular feature being | |
| tested. Any further words in the macro name indicate particular aspects | |
| of the feature. For example, @code{AC_PROG_MAKE_SET} checks whether | |
| @command{make} sets a variable to its own name. | |
| An internal macro should have a name that starts with an underscore; | |
| Autoconf internals should therefore start with @samp{_AC_}. | |
| Additionally, a macro that is an internal subroutine of another macro | |
| should have a name that starts with an underscore and the name of that | |
| other macro, followed by one or more words saying what the internal | |
| macro does. For example, @code{AC_PATH_X} has internal macros | |
| @code{_AC_PATH_X_XMKMF} and @code{_AC_PATH_X_DIRECT}. | |
| @node Dependencies Between Macros | |
| @section Dependencies Between Macros | |
| @cindex Dependencies between macros | |
| Some Autoconf macros depend on other macros having been called first in | |
| order to work correctly. Autoconf provides a way to ensure that certain | |
| macros are called if needed and a way to warn the user if macros are | |
| called in an order that might cause incorrect operation. | |
| @menu | |
| * Prerequisite Macros:: Ensuring required information | |
| * Suggested Ordering:: Warning about possible ordering problems | |
| * One-Shot Macros:: Ensuring a macro is called only once | |
| @end menu | |
| @node Prerequisite Macros | |
| @subsection Prerequisite Macros | |
| @cindex Prerequisite macros | |
| @cindex Macros, prerequisites | |
| A macro that you write might need to use values that have previously | |
| been computed by other macros. For example, @code{AC_DECL_YYTEXT} | |
| examines the output of @code{flex} or @code{lex}, so it depends on | |
| @code{AC_PROG_LEX} having been called first to set the shell variable | |
| @code{LEX}. | |
| Rather than forcing the user of the macros to keep track of the | |
| dependencies between them, you can use the @code{AC_REQUIRE} macro to do | |
| it automatically. @code{AC_REQUIRE} can ensure that a macro is only | |
| called if it is needed, and only called once. | |
| @defmac AC_REQUIRE (@var{macro-name}) | |
| @acindex{REQUIRE} | |
| If the M4 macro @var{macro-name} has not already been called, call it | |
| (without any arguments). Make sure to quote @var{macro-name} with | |
| square brackets. @var{macro-name} must have been defined using | |
| @code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate | |
| that it has been called. | |
| @code{AC_REQUIRE} must be used inside a macro defined by @code{AC_DEFUN}; it | |
| must not be called from the top level. Also, it does not make sense to | |
| require a macro that takes parameters. | |
| @end defmac | |
| @code{AC_REQUIRE} is often misunderstood. It really implements | |
| dependencies between macros in the sense that if one macro depends upon | |
| another, the latter is expanded @emph{before} the body of the | |
| former. To be more precise, the required macro is expanded before | |
| the outermost defined macro in the current expansion stack. | |
| In particular, @samp{AC_REQUIRE([FOO])} is not replaced with the body of | |
| @code{FOO}. For instance, this definition of macros: | |
| @example | |
| @group | |
| AC_DEFUN([TRAVOLTA], | |
| [test "$body_temperature_in_Celsius" -gt 38 && | |
| dance_floor=occupied]) | |
| AC_DEFUN([NEWTON_JOHN], | |
| [test "x$hair_style" = xcurly && | |
| dance_floor=occupied]) | |
| @end group | |
| @group | |
| AC_DEFUN([RESERVE_DANCE_FLOOR], | |
| [if test "x`date +%A`" = xSaturday; then | |
| AC_REQUIRE([TRAVOLTA]) | |
| AC_REQUIRE([NEWTON_JOHN]) | |
| fi]) | |
| @end group | |
| @end example | |
| @noindent | |
| with this @file{configure.ac} | |
| @example | |
| AC_INIT([Dance Manager], [1.0], [bug-dance@@example.org]) | |
| RESERVE_DANCE_FLOOR | |
| if test "x$dance_floor" = xoccupied; then | |
| AC_MSG_ERROR([cannot pick up here, let's move]) | |
| fi | |
| @end example | |
| @noindent | |
| does not leave you with a better chance to meet a kindred soul on | |
| days other than Saturday, since the call to @code{RESERVE_DANCE_FLOOR} | |
| expands to: | |
| @example | |
| @group | |
| test "$body_temperature_in_Celsius" -gt 38 && | |
| dance_floor=occupied | |
| test "x$hair_style" = xcurly && | |
| dance_floor=occupied | |
| if test "x`date +%A`" = xSaturday; then | |
| fi | |
| @end group | |
| @end example | |
| This behavior was chosen on purpose: (i) it prevents messages in | |
| required macros from interrupting the messages in the requiring macros; | |
| (ii) it avoids bad surprises when shell conditionals are used, as in: | |
| @example | |
| @group | |
| if @dots{}; then | |
| AC_REQUIRE([SOME_CHECK]) | |
| fi | |
| @dots{} | |
| SOME_CHECK | |
| @end group | |
| @end example | |
| However, this implementation can lead to another class of problems. | |
| Consider the case where an outer macro first expands, then indirectly | |
| requires, an inner macro: | |
| @example | |
| AC_DEFUN([TESTA], [[echo in A | |
| if test -n "$SEEN_A" ; then echo duplicate ; fi | |
| SEEN_A=:]]) | |
| AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B | |
| if test -z "$SEEN_A" ; then echo bug ; fi]]) | |
| AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]]) | |
| AC_DEFUN([OUTER], [[echo in OUTER] | |
| TESTA | |
| TESTC]) | |
| OUTER | |
| @end example | |
| @noindent | |
| Prior to Autoconf 2.64, the implementation of @code{AC_REQUIRE} | |
| recognized that @code{TESTB} needed to be hoisted prior to the expansion | |
| of @code{OUTER}, but because @code{TESTA} had already been directly | |
| expanded, it failed to hoist @code{TESTA}. Therefore, the expansion of | |
| @code{TESTB} occurs prior to its prerequisites, leading to the following | |
| output: | |
| @example | |
| in B | |
| bug | |
| in OUTER | |
| in A | |
| in C | |
| @end example | |
| @noindent | |
| Newer Autoconf is smart enough to recognize this situation, and hoists | |
| @code{TESTA} even though it has already been expanded, but issues a | |
| syntax warning in the process. This is because the hoisted expansion of | |
| @code{TESTA} defeats the purpose of using @code{AC_REQUIRE} to avoid | |
| redundant code, and causes its own set of problems if the hoisted macro | |
| is not idempotent: | |
| @example | |
| in A | |
| in B | |
| in OUTER | |
| in A | |
| duplicate | |
| in C | |
| @end example | |
| The bug is not in Autoconf, but in the macro definitions. If you ever | |
| pass a particular macro name to @code{AC_REQUIRE}, then you are implying | |
| that the macro only needs to be expanded once. But to enforce this, | |
| either the macro must be declared with @code{AC_DEFUN_ONCE} (although | |
| this only helps in Autoconf 2.64 or newer), or all | |
| uses of that macro should be through @code{AC_REQUIRE}; directly | |
| expanding the macro defeats the point of using @code{AC_REQUIRE} to | |
| eliminate redundant expansion. In the example, this rule of thumb was | |
| violated because @code{TESTB} requires @code{TESTA} while @code{OUTER} | |
| directly expands it. One way of fixing the bug is to factor | |
| @code{TESTA} into two macros, the portion designed for direct and | |
| repeated use (here, named @code{TESTA}), and the portion designed for | |
| one-shot output and used only inside @code{AC_REQUIRE} (here, named | |
| @code{TESTA_PREREQ}). Then, by fixing all clients to use the correct | |
| calling convention according to their needs: | |
| @example | |
| AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]]) | |
| AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ | |
| if test -n "$SEEN_A" ; then echo duplicate ; fi | |
| SEEN_A=:]]) | |
| AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B | |
| if test -z "$SEEN_A" ; then echo bug ; fi]]) | |
| AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]]) | |
| AC_DEFUN([OUTER], [[echo in OUTER] | |
| TESTA | |
| TESTC]) | |
| OUTER | |
| @end example | |
| @noindent | |
| the resulting output will then obey all dependency rules and avoid any | |
| syntax warnings, whether the script is built with old or new Autoconf | |
| versions: | |
| @example | |
| in A_PREREQ | |
| in B | |
| in OUTER | |
| in A | |
| in C | |
| @end example | |
| You can use the helper macros @code{AS_IF} and @code{AS_CASE} in | |
| top-level code to enforce expansion of required macros outside of shell | |
| conditional constructs; these helpers are not needed in the bodies of | |
| macros defined by @code{AC_DEFUN}. | |
| You are furthermore encouraged, although not required, to | |
| put all @code{AC_REQUIRE} calls | |
| at the beginning of a macro. You can use @code{dnl} to avoid the empty | |
| lines they leave. | |
| Autoconf will normally warn if an @code{AC_REQUIRE} call refers to a | |
| macro that has not been defined. However, the @command{aclocal} tool | |
| relies on parsing an incomplete set of input files to trace which macros | |
| have been required, in order to then pull in additional files that | |
| provide those macros; for this particular use case, pre-defining the | |
| macro @code{m4_require_silent_probe} will avoid the warnings. | |
| @node Suggested Ordering | |
| @subsection Suggested Ordering | |
| @cindex Macros, ordering | |
| @cindex Ordering macros | |
| Some macros should be run before another macro if both are called, but | |
| neither @emph{requires} that the other be called. For example, a macro | |
| that changes the behavior of the C compiler should be called before any | |
| macros that run the C compiler. Many of these dependencies are noted in | |
| the documentation. | |
| Autoconf provides the @code{AC_BEFORE} macro to warn users when macros | |
| with this kind of dependency appear out of order in a | |
| @file{configure.ac} file. The warning occurs when creating | |
| @command{configure} from @file{configure.ac}, not when running | |
| @command{configure}. | |
| For example, @code{AC_PROG_CPP} checks whether the C compiler | |
| can run the C preprocessor when given the @option{-E} option. It should | |
| therefore be called after any macros that change which C compiler is | |
| being used, such as @code{AC_PROG_CC}. So @code{AC_PROG_CC} contains: | |
| @example | |
| AC_BEFORE([$0], [AC_PROG_CPP])dnl | |
| @end example | |
| @noindent | |
| This warns the user if a call to @code{AC_PROG_CPP} has already occurred | |
| when @code{AC_PROG_CC} is called. | |
| @defmac AC_BEFORE (@var{this-macro-name}, @var{called-macro-name}) | |
| @acindex{BEFORE} | |
| Make M4 print a warning message to the standard error output if | |
| @var{called-macro-name} has already been called. @var{this-macro-name} | |
| should be the name of the macro that is calling @code{AC_BEFORE}. The | |
| macro @var{called-macro-name} must have been defined using | |
| @code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate | |
| that it has been called. | |
| @end defmac | |
| @node One-Shot Macros | |
| @subsection One-Shot Macros | |
| @cindex One-shot macros | |
| @cindex Macros, called once | |
| Some macros should be called only once, either because calling them | |
| multiple time is unsafe, or because it is bad style. For instance | |
| Autoconf ensures that @code{AC_CANONICAL_BUILD} and cousins | |
| (@pxref{Canonicalizing}) are evaluated only once, because it makes no | |
| sense to run these expensive checks more than once. Such one-shot | |
| macros can be defined using @code{AC_DEFUN_ONCE}. | |
| @defmac AC_DEFUN_ONCE (@var{macro-name}, @var{macro-body}) | |
| @acindex{DEFUN_ONCE} | |
| Declare macro @var{macro-name} like @code{AC_DEFUN} would (@pxref{Macro | |
| Definitions}), but add additional logic that guarantees that only the | |
| first use of the macro (whether by direct expansion or | |
| @code{AC_REQUIRE}) causes an expansion of @var{macro-body}; the | |
| expansion will occur before the start of any enclosing macro defined by | |
| @code{AC_DEFUN}. Subsequent expansions are silently ignored. | |
| Generally, it does not make sense for @var{macro-body} to use parameters | |
| such as @code{$1}. | |
| @end defmac | |
| Prior to Autoconf 2.64, a macro defined by @code{AC_DEFUN_ONCE} would | |
| emit a warning if it was directly expanded a second time, so for | |
| portability, it is better to use @code{AC_REQUIRE} than direct | |
| invocation of @var{macro-name} inside a macro defined by @code{AC_DEFUN} | |
| (@pxref{Prerequisite Macros}). | |
| @node Obsoleting Macros | |
| @section Obsoleting Macros | |
| @cindex Obsoleting macros | |
| @cindex Macros, obsoleting | |
| Configuration and portability technology has evolved over the years. | |
| Often better ways of solving a particular problem are developed, or | |
| ad-hoc approaches are systematized. This process has occurred in many | |
| parts of Autoconf. One result is that some of the macros are now | |
| considered @dfn{obsolete}; they still work, but are no longer considered | |
| the best thing to do, hence they should be replaced with more modern | |
| macros. Ideally, @command{autoupdate} should replace the old macro calls | |
| with their modern implementation. | |
| Autoconf provides a simple means to obsolete a macro. | |
| @anchor{AU_DEFUN} | |
| @defmac AU_DEFUN (@var{old-macro}, @var{implementation}, @ovar{message}, @ovar{silent}) | |
| @auindex{DEFUN} | |
| Define @var{old-macro} as @var{implementation}, just like | |
| @code{AC_DEFUN}, but also declare @var{old-macro} to be obsolete. | |
| When @command{autoupdate} is run, occurrences of @var{old-macro} will | |
| be replaced by the text of @var{implementation} in the updated | |
| @file{configure.ac} file. | |
| If a simple textual replacement is not enough to finish the job of | |
| updating a @file{configure.ac} to modern style, provide instructions for | |
| whatever additional manual work is required as @var{message}. These | |
| instructions will be printed by @command{autoupdate}, and embedded in the | |
| updated @file{configure.ac} file, next to the text of @var{implementation}. | |
| Normally, @command{autoconf} will also issue a warning (in the | |
| ``obsolete'' category) when it expands @var{old-macro}. This warning | |
| does not include @var{message}; it only advises the maintainer to run | |
| @command{autoupdate}. If it is inappropriate to issue this warning, set | |
| the @var{silent} argument to the word @code{silent}. One might want to | |
| use a silent @code{AU_DEFUN} when @var{old-macro} is used in a | |
| widely-distributed third-party macro. If that macro's maintainers are | |
| aware of the need to update their code, it's unnecessary to nag all | |
| of the transitive users of @var{old-macro} as well. This capability | |
| was added to @code{AU_DEFUN} in Autoconf 2.70; older versions of | |
| autoconf will ignore the @var{silent} argument and issue the warning | |
| anyway. | |
| @strong{Caution:} If @var{implementation} contains M4 or M4sugar macros, | |
| they will be evaluated when @command{autoupdate} is run, not emitted | |
| verbatim like the rest of @var{implementation}. This cannot be avoided | |
| with extra quotation, because then @var{old-macro} will not work when | |
| it is called normally. See the definition of @code{AC_FOREACH} in | |
| @file{general.m4} for a workaround. | |
| @end defmac | |
| @defmac AU_ALIAS (@var{old-name}, @var{new-name}, @ovar{silent}) | |
| @auindex{ALIAS} | |
| A shorthand version of @code{AU_DEFUN}, to be used when a macro has | |
| simply been renamed. @command{autoupdate} will replace calls to | |
| @var{old-name} with calls to @var{new-name}, keeping any arguments | |
| intact. No instructions for additional manual work will be printed. | |
| The @var{silent} argument works the same as the @var{silent} argument | |
| to @code{AU_DEFUN}. It was added to @code{AU_ALIAS} in Autoconf 2.70. | |
| @strong{Caution:} @code{AU_ALIAS} cannot be used when @var{new-name} is | |
| an M4 or M4sugar macro. See above. | |
| @end defmac | |
| @node Coding Style | |
| @section Coding Style | |
| @cindex Coding style | |
| The Autoconf macros follow a strict coding style. You are encouraged to | |
| follow this style, especially if you intend to distribute your macro, | |
| either by contributing it to Autoconf itself or the | |
| @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro | |
| Archive}, or by other means. | |
| The first requirement is to pay great attention to the quotation. For | |
| more details, see @ref{Autoconf Language}, and @ref{M4 Quotation}. | |
| Do not try to invent new interfaces. It is likely that there is a macro | |
| in Autoconf that resembles the macro you are defining: try to stick to | |
| this existing interface (order of arguments, default values, etc.). We | |
| @emph{are} conscious that some of these interfaces are not perfect; | |
| nevertheless, when harmless, homogeneity should be preferred over | |
| creativity. | |
| Be careful about clashes both between M4 symbols and between shell | |
| variables. | |
| If you stick to the suggested M4 naming scheme (@pxref{Macro Names}), | |
| you are unlikely to generate conflicts. Nevertheless, when you need to | |
| set a special value, @emph{avoid using a regular macro name}; rather, | |
| use an ``impossible'' name. For instance, up to version 2.13, the macro | |
| @code{AC_SUBST} used to remember what @var{symbol} macros were already defined | |
| by setting @code{AC_SUBST_@var{symbol}}, which is a regular macro name. | |
| But since there is a macro named @code{AC_SUBST_FILE}, it was just | |
| impossible to @samp{AC_SUBST(FILE)}! In this case, | |
| @code{AC_SUBST(@var{symbol})} or @code{_AC_SUBST(@var{symbol})} should | |
| have been used (yes, with the parentheses). | |
| @c or better yet, high-level macros such as @code{m4_expand_once} | |
| No Autoconf macro should ever enter the user-variable name space; i.e., | |
| except for the variables that are the actual result of running the | |
| macro, all shell variables should start with @code{ac_}. In | |
| addition, small macros or any macro that is likely to be embedded in | |
| other macros should be careful not to use obvious names. | |
| @cindex @code{dnl} | |
| Do not use @code{dnl} to introduce comments: most of the comments you | |
| are likely to write are either header comments which are not output | |
| anyway, or comments that should make their way into @file{configure}. | |
| There are exceptional cases where you do want to comment special M4 | |
| constructs, in which case @code{dnl} is right, but keep in mind that it | |
| is unlikely. | |
| M4 ignores the leading blanks and newlines before each argument. | |
| Use this feature to | |
| indent in such a way that arguments are (more or less) aligned with the | |
| opening parenthesis of the macro being called. For instance, instead of | |
| @example | |
| AC_CACHE_CHECK(for EMX OS/2 environment, | |
| ac_cv_emxos2, | |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])], | |
| [ac_cv_emxos2=yes], [ac_cv_emxos2=no])]) | |
| @end example | |
| @noindent | |
| write | |
| @example | |
| AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2], | |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])], | |
| [ac_cv_emxos2=yes], | |
| [ac_cv_emxos2=no])]) | |
| @end example | |
| @noindent | |
| or even | |
| @example | |
| AC_CACHE_CHECK([for EMX OS/2 environment], | |
| [ac_cv_emxos2], | |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], | |
| [return __EMX__;])], | |
| [ac_cv_emxos2=yes], | |
| [ac_cv_emxos2=no])]) | |
| @end example | |
| When using @code{AC_RUN_IFELSE} or any macro that cannot work when | |
| cross-compiling, provide a pessimistic value (typically @samp{no}). | |
| Feel free to use various tricks to prevent auxiliary tools, such as | |
| syntax-highlighting editors, from behaving improperly. For instance, | |
| instead of: | |
| @example | |
| m4_bpatsubst([$1], [$"]) | |
| @end example | |
| @noindent | |
| use | |
| @example | |
| m4_bpatsubst([$1], [$""]) | |
| @end example | |
| @noindent | |
| so that Emacsen do not open an endless ``string'' at the first quote. | |
| For the same reasons, avoid: | |
| @example | |
| test $[#] != 0 | |
| @end example | |
| @noindent | |
| and use: | |
| @example | |
| test $[@@%:@@] != 0 | |
| @end example | |
| @noindent | |
| Otherwise, the closing bracket would be hidden inside a @samp{#}-comment, | |
| breaking the bracket-matching highlighting from Emacsen. Note the | |
| preferred style to escape from M4: @samp{$[1]}, @samp{$[@@]}, etc. Do | |
| not escape when it is unnecessary. Common examples of useless quotation | |
| are @samp{[$]$1} (write @samp{$$1}), @samp{[$]var} (use @samp{$var}), | |
| etc. | |
| When using @command{sed}, don't use @option{-e} except for indenting | |
| purposes. With the @code{s} and @code{y} commands, the preferred | |
| separator is @samp{/} unless @samp{/} itself might appear in the pattern | |
| or replacement, in which case you should use @samp{|}, or optionally | |
| @samp{,} if you know the pattern and replacement cannot contain a file | |
| name. If none of these characters will do, choose a printable character | |
| that cannot appear in the pattern or replacement. Characters from the | |
| set @samp{"#$&'()*;<=>?`|~} are good choices if the pattern or | |
| replacement might contain a file name, since they have special meaning | |
| to the shell and are less likely to occur in file names. | |
| @xref{Macro Definitions}, for details on how to define a macro. If a | |
| macro doesn't use @code{AC_REQUIRE}, is expected to never be the object | |
| of an @code{AC_REQUIRE} directive, and macros required by other macros | |
| inside arguments do not need to be expanded before this macro, then | |
| use @code{m4_define}. In case of doubt, use @code{AC_DEFUN}. | |
| Also take into account that public third-party macros need to use | |
| @code{AC_DEFUN} in order to be found by @command{aclocal} | |
| (@pxref{Extending aclocal,,, automake, GNU Automake}). | |
| All the @code{AC_REQUIRE} statements should be at the beginning of the | |
| macro, and each statement should be followed by @code{dnl}. | |
| You should not rely on the number of arguments: instead of checking | |
| whether an argument is missing, test that it is not empty. It provides | |
| both a simpler and a more predictable interface to the user, and saves | |
| room for further arguments. | |
| Unless the macro is short, try to leave the closing @samp{])} at the | |
| beginning of a line, followed by a comment that repeats the name of the | |
| macro being defined. This introduces an additional newline in | |
| @command{configure}; normally, that is not a problem, but if you want to | |
| remove it you can use @samp{[]dnl} on the last line. You can similarly | |
| use @samp{[]dnl} after a macro call to remove its newline. @samp{[]dnl} | |
| is recommended instead of @samp{dnl} to ensure that M4 does not | |
| interpret the @samp{dnl} as being attached to the preceding text or | |
| macro output. For example, instead of: | |
| @example | |
| AC_DEFUN([AC_PATH_X], | |
| [AC_MSG_CHECKING([for X]) | |
| AC_REQUIRE_CPP() | |
| @r{# @dots{}omitted@dots{}} | |
| AC_MSG_RESULT([libraries $x_libraries, headers $x_includes]) | |
| fi]) | |
| @end example | |
| @noindent | |
| you would write: | |
| @example | |
| AC_DEFUN([AC_PATH_X], | |
| [AC_REQUIRE_CPP()[]dnl | |
| AC_MSG_CHECKING([for X]) | |
| @r{# @dots{}omitted@dots{}} | |
| AC_MSG_RESULT([libraries $x_libraries, headers $x_includes]) | |
| fi[]dnl | |
| ])# AC_PATH_X | |
| @end example | |
| If the macro is long, try to split it into logical chunks. Typically, | |
| macros that check for a bug in a function and prepare its | |
| @code{AC_LIBOBJ} replacement should have an auxiliary macro to perform | |
| this setup. Do not hesitate to introduce auxiliary macros to factor | |
| your code. | |
| In order to highlight the recommended coding style, here is a macro | |
| written the old way: | |
| @example | |
| dnl Check for EMX on OS/2. | |
| dnl _AC_EMXOS2 | |
| AC_DEFUN(_AC_EMXOS2, | |
| [AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2, | |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)], | |
| ac_cv_emxos2=yes, ac_cv_emxos2=no)]) | |
| test "x$ac_cv_emxos2" = xyes && EMXOS2=yes]) | |
| @end example | |
| @noindent | |
| and the new way: | |
| @example | |
| # _AC_EMXOS2 | |
| # ---------- | |
| # Check for EMX on OS/2. | |
| m4_define([_AC_EMXOS2], | |
| [AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2], | |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])], | |
| [ac_cv_emxos2=yes], | |
| [ac_cv_emxos2=no])]) | |
| test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl | |
| ])# _AC_EMXOS2 | |
| @end example | |
| @c ============================================= Portable Shell Programming | |
| @node Portable Shell | |
| @chapter Portable Shell Programming | |
| @cindex Portable shell programming | |
| When writing your own checks, there are some shell-script programming | |
| techniques you should avoid in order to make your code portable. The | |
| Bourne shell and upward-compatible shells like the Korn shell and Bash | |
| have evolved over the years, and many features added to the original | |
| System7 shell are now supported on all interesting porting targets. | |
| However, the following discussion between Russ Allbery and Robert Lipe | |
| is worth reading: | |
| @noindent | |
| Russ Allbery: | |
| @quotation | |
| The GNU assumption that @command{/bin/sh} is the one and only shell | |
| leads to a permanent deadlock. Vendors don't want to break users' | |
| existing shell scripts, and there are some corner cases in the Bourne | |
| shell that are not completely compatible with a POSIX shell. Thus, | |
| vendors who have taken this route will @emph{never} (OK@dots{}``never say | |
| never'') replace the Bourne shell (as @command{/bin/sh}) with a | |
| POSIX shell. | |
| @end quotation | |
| @noindent | |
| Robert Lipe: | |
| @quotation | |
| This is exactly the problem. While most (at least most System V's) do | |
| have a Bourne shell that accepts shell functions most vendor | |
| @command{/bin/sh} programs are not the POSIX shell. | |
| So while most modern systems do have a shell @emph{somewhere} that meets the | |
| POSIX standard, the challenge is to find it. | |
| @end quotation | |
| For this reason, part of the job of M4sh (@pxref{Programming in M4sh}) | |
| is to find such a shell. But to prevent trouble, if you're not using | |
| M4sh you should not take advantage of features that were added after Unix | |
| version 7, circa 1977 (@pxref{Systemology}); you should not use aliases, | |
| negated character classes, or even @command{unset}. @code{#} comments, | |
| while not in Unix version 7, were retrofitted in the original Bourne | |
| shell and can be assumed to be part of the least common denominator. | |
| On the other hand, if you're using M4sh you can assume that the shell | |
| has the features that were added in SVR2 (circa 1984), including shell | |
| functions, | |
| @command{return}, @command{unset}, and I/O redirection for builtins. For | |
| more information, refer to @uref{https://@/www.in-ulm.de/@/~mascheck/@/bourne/}. | |
| However, some pitfalls have to be avoided for portable use of these | |
| constructs; these will be documented in the rest of this chapter. | |
| See in particular @ref{Shell Functions} and @ref{Limitations of | |
| Builtins, , Limitations of Shell Builtins}. | |
| The set of external programs you should run in a @command{configure} script | |
| is fairly small. @xref{Utilities in Makefiles, , Utilities in | |
| Makefiles, standards, The GNU Coding Standards}, for the list. This | |
| restriction allows users to start out with a fairly small set of | |
| programs and build the rest, avoiding too many interdependencies between | |
| packages. | |
| Some of these external utilities have a portable subset of features; see | |
| @ref{Limitations of Usual Tools}. | |
| There are other sources of documentation about shells. The | |
| specification for the POSIX | |
| @uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/V3_chap02.html, | |
| Shell Command Language}, though more generous than the restrictive shell | |
| subset described above, is fairly portable nowadays. Also please see | |
| @uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/, the Shell FAQs}. | |
| @menu | |
| * Systemology:: A zoology of operating systems | |
| * Shellology:: A zoology of shells | |
| * Invoking the Shell:: Invoking the shell as a command | |
| * Here-Documents:: Quirks and tricks | |
| * File Descriptors:: FDs and redirections | |
| * Signal Handling:: Shells, signals, and headaches | |
| * File System Conventions:: File names | |
| * Shell Pattern Matching:: Pattern matching | |
| * Shell Substitutions:: Variable and command expansions | |
| * Assignments:: Varying side effects of assignments | |
| * Parentheses:: Parentheses in shell scripts | |
| * Special Shell Variables:: Variables you should not change | |
| * Shell Functions:: What to look out for if you use them | |
| * Limitations of Builtins:: Portable use of not so portable /bin/sh | |
| * Limitations of Usual Tools:: Portable use of portable tools | |
| @end menu | |
| @node Systemology | |
| @section Systemology | |
| @cindex Systemology | |
| This section aims at presenting some systems and pointers to | |
| documentation. It may help you addressing particular problems reported | |
| by users. | |
| @uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX-conforming | |
| systems} are derived from the | |
| @uref{https://@/en.wikipedia.org/@/wiki/@/Unix, Unix operating system}. | |
| The @uref{https://@/bhami.com/@/rosetta.html, Rosetta Stone for Unix} | |
| contains a table correlating the features of various POSIX-conforming | |
| systems. @uref{https://@/www.levenez.com/@/unix/, Unix History} is a | |
| simplified diagram of how many Unix systems were derived from each | |
| other. | |
| @uref{https://@/heirloom.sourceforge.net/, The Heirloom Project} | |
| provides some variants of traditional implementations of Unix utilities. | |
| @table @asis | |
| @item Darwin | |
| @cindex Darwin | |
| @cindex macOS | |
| @cindex Mac OS X | |
| Darwin is a partially proprietary operating system maintained by Apple | |
| Computer and used by most of their products. It is also known as macOS, | |
| iOS, etc.@: depending on the exact variant. Older versions were called | |
| ``Mac OS X.'' | |
| By default the file system will be case insensitive, albeit case | |
| preserving. This can cause nasty problems: for instance, the | |
| installation attempt for a package having an @file{INSTALL} file can | |
| result in @samp{make install} reporting that nothing is to be done! | |
| Darwin does support case-sensitive file systems, but they must be | |
| formatted specially as such, and Apple discourages use of a | |
| case-sensitive volume for the base operating system. To build software | |
| that expects case-sensitive filenames, it is best to create a separate | |
| disk volume or disk image formatted as case sensitive; this can be done | |
| using the @command{diskutil} command or the Disk Utility application. | |
| @item QNX | |
| @cindex QNX | |
| @c FIXME: Please, if you feel like writing something more precise, | |
| @c it'd be great. In particular, I can't understand the difference with | |
| @c QNX Neutrino. | |
| QNX is a realtime operating system running on Intel architecture | |
| meant to be scalable from the small embedded systems to the hundred | |
| processor super-computer. More | |
| information is available on the | |
| @uref{https://@/blackberry.qnx.com/@/en, QNX home page}. | |
| @item Unix version 7 | |
| @cindex Unix version 7 | |
| @cindex V7 | |
| Officially this was called the ``Seventh Edition'' of ``the UNIX | |
| time-sharing system'' but we use the more-common name ``Unix version 7''. | |
| Documentation is available in the | |
| @uref{https://@/s3.amazonaws.com/@/plan9-bell-labs/@/7thEdMan/@/index.html, | |
| Unix Seventh Edition Manual}. | |
| Previous versions of Unix are called ``Unix version 6'', etc., but | |
| they were not as widely used. | |
| @end table | |
| @node Shellology | |
| @section Shellology | |
| @cindex Shellology | |
| There are several families of shells, most prominently the Bourne family | |
| and the C shell family which are deeply incompatible. If you want to | |
| write portable shell scripts, avoid members of the C shell family. The | |
| @uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/@/shell-differences/, the | |
| Shell difference FAQ} includes a small history of POSIX shells, and a | |
| comparison between several of them. | |
| Below we describe some of the members of the Bourne shell family. | |
| @table @asis | |
| @item Ash | |
| @cindex Ash | |
| Ash is often used on GNU/Linux and BSD | |
| systems as a light-weight Bourne-compatible shell. Ash 0.2 has some | |
| bugs that are fixed in the 0.3.x series, but portable shell scripts | |
| should work around them, since version 0.2 is still shipped with many | |
| GNU/Linux distributions. | |
| To be compatible with Ash 0.2: | |
| @itemize @minus | |
| @item | |
| don't use @samp{$?} after expanding empty or unset variables, | |
| or at the start of an @command{eval}: | |
| @example | |
| foo= | |
| false | |
| $foo | |
| echo "Do not use it: $?" | |
| false | |
| eval 'echo "Do not use it: $?"' | |
| @end example | |
| @item | |
| don't use command substitution within variable expansion: | |
| @example | |
| cat $@{FOO=`bar`@} | |
| @end example | |
| @item | |
| beware that single builtin substitutions are not performed by a | |
| subshell, hence their effect applies to the current shell! @xref{Shell | |
| Substitutions}, item ``Command Substitution''. | |
| @end itemize | |
| @item Bash | |
| @cindex Bash | |
| To detect whether you are running Bash, test whether | |
| @code{BASH_VERSION} is set. To require | |
| POSIX compatibility, run @samp{set -o posix}. @xref{Bash POSIX | |
| Mode, , Bash POSIX Mode, bash, The GNU Bash Reference | |
| Manual}, for details. | |
| @item Bash 2.05 and later | |
| @cindex Bash 2.05 and later | |
| Versions 2.05 and later of Bash use a different format for the | |
| output of the @command{set} builtin, designed to make evaluating its | |
| output easier. However, this output is not compatible with earlier | |
| versions of Bash (or with many other shells, probably). So if | |
| you use Bash 2.05 or higher to execute @command{configure}, | |
| you'll need to use Bash 2.05 for all other build tasks as well. | |
| @item Ksh | |
| @cindex Ksh | |
| @cindex Korn shell | |
| @prindex @samp{ksh} | |
| @prindex @samp{ksh88} | |
| @prindex @samp{ksh93} | |
| The Korn shell is compatible with the Bourne family and it mostly | |
| conforms to POSIX@. It has two major variants commonly | |
| called @samp{ksh88} and @samp{ksh93}, named after the years of initial | |
| release. It is usually called @command{ksh}, but is called @command{sh} | |
| on some hosts if you set your path appropriately. | |
| On Solaris 11, @command{/bin/sh} and @command{/usr/bin/ksh} are both | |
| @samp{ksh93}. On Solaris 10 and earlier, @command{/bin/sh} is a | |
| pre-POSIX Bourne shell and the Korn shell is found elsewhere: | |
| @prindex @command{/usr/bin/ksh} on Solaris | |
| @command{/usr/bin/ksh} is @samp{ksh88} on Solaris 10, | |
| @prindex @command{/usr/xpg4/bin/sh} on Solaris | |
| @command{/usr/xpg4/bin/sh} is a POSIX-compliant variant of | |
| @samp{ksh88} on Solaris 10 and later, | |
| @prindex @command{/usr/dt/bin/dtksh} on Solaris | |
| and @command{/usr/dt/bin/dtksh} is @samp{ksh93}. | |
| Variants that are not standard may be parts of optional | |
| packages. There is no extra charge for these packages, but they are | |
| not part of a minimal OS install and therefore some installations may | |
| not have it. | |
| @item Pdksh | |
| @prindex @samp{pdksh} | |
| A public-domain clone of the Korn shell called @command{pdksh} is widely | |
| available: it has most of the @samp{ksh88} features along with a few of | |
| its own. It usually sets @code{KSH_VERSION}, except if invoked as | |
| @command{/bin/sh} on OpenBSD, and similarly to Bash you can require | |
| POSIX compatibility by running @samp{set -o posix}. Unfortunately, with | |
| @command{pdksh} 5.2.14 (the latest stable version as of 2025) | |
| POSIX mode is buggy and causes @command{pdksh} to depart from POSIX in | |
| at least one respect, see @ref{Shell Substitutions}. | |
| @item Zsh | |
| @cindex Zsh | |
| To detect whether you are running @command{zsh}, test whether | |
| @code{ZSH_VERSION} is set. By default @command{zsh} is @emph{not} | |
| compatible with the Bourne shell: you must execute @samp{emulate sh}, | |
| and for @command{zsh} versions before 3.1.6-dev-18 you must also | |
| set @code{NULLCMD} to @samp{:}. @xref{Compatibility, , Compatibility, | |
| zsh, The Z Shell Manual}, for details. | |
| The default Mac OS X @command{sh} was originally Zsh; it was changed to | |
| Bash in Mac OS X 10.2 (2002) and changed back to Zsh in macOS 10.15 (2019). | |
| @end table | |
| @node Invoking the Shell | |
| @section Invoking the Shell | |
| @cindex invoking the shell | |
| @cindex shell invocation | |
| The Korn shell (up to at least version M-12/28/93d) has a bug when | |
| invoked on a file whose name does not contain a slash. It first | |
| searches for the file's name in @env{PATH}, and if found it executes | |
| that rather than the original file. For example, assuming there is a | |
| binary executable @file{/usr/bin/script} in your @env{PATH}, the last | |
| command in the following example fails because the Korn shell finds | |
| @file{/usr/bin/script} and refuses to execute it as a shell script: | |
| @example | |
| $ @kbd{touch xxyzzyz script} | |
| $ @kbd{ksh xxyzzyz} | |
| $ @kbd{ksh ./script} | |
| $ @kbd{ksh script} | |
| ksh: script: cannot execute | |
| @end example | |
| Bash 2.03 has a bug when invoked with the @option{-c} option: if the | |
| option-argument ends in backslash-newline, Bash incorrectly reports a | |
| syntax error. The problem does not occur if a character follows the | |
| backslash: | |
| @example | |
| $ @kbd{$ bash -c 'echo foo \} | |
| > @kbd{'} | |
| bash: -c: line 2: syntax error: unexpected end of file | |
| $ @kbd{bash -c 'echo foo \} | |
| > @kbd{ '} | |
| foo | |
| @end example | |
| @noindent | |
| @xref{Backslash-Newline-Empty}, for how this can cause problems in makefiles. | |
| @node Here-Documents | |
| @section Here-Documents | |
| @cindex Here-documents | |
| @cindex Shell here-documents | |
| Because unquoted here-documents are subject to parameter expansion and | |
| command substitution, the characters @samp{$} and @samp{`} are special | |
| in unquoted here-documents and should be escaped by @samp{\} if you want | |
| them as-is. Also, @samp{\} is special if it precedes @samp{$}, | |
| @samp{`}, newline or @samp{\} itself, so @samp{\} should be doubled if | |
| it appears before these characters and you want it as-is. | |
| Using command substitutions in a here-document that is fed to a shell | |
| function is not portable. For example, with Solaris 10 @command{/bin/sh}: | |
| @example | |
| $ @kbd{kitty () @{ cat; @}} | |
| $ @kbd{kitty <<EOF | |
| > `echo ok` | |
| > EOF} | |
| /tmp/sh199886: cannot open | |
| $ @kbd{echo $?} | |
| 1 | |
| @end example | |
| Some shells mishandle large here-documents: for example, | |
| Solaris 10 @command{dtksh} and the UnixWare 7.1.1 POSIX shell, which are | |
| derived from Korn shell version M-12/28/93d, mishandle braced variable | |
| expansion that crosses a 1024- or 4096-byte buffer boundary | |
| within a here-document. Only the part of the variable name after the boundary | |
| is used. For example, @code{$@{variable@}} could be replaced by the expansion | |
| of @code{$@{ble@}}. If the end of the variable name is aligned with the block | |
| boundary, the shell reports an error, as if you used @code{$@{@}}. | |
| Instead of @code{$@{variable-default@}}, the shell may expand | |
| @code{$@{riable-default@}}, or even @code{$@{fault@}}. This bug can often | |
| be worked around by omitting the braces: @code{$variable}. The bug was | |
| fixed in | |
| @samp{ksh93g} (1998-04-30) but as of 2006 many operating systems were | |
| still shipping older versions with the bug. | |
| Empty here-documents are not portable either; with the following code, | |
| @command{zsh} up to at least version 4.3.10 creates a file with a single | |
| newline, whereas other shells create an empty file: | |
| @example | |
| cat >file <<EOF | |
| EOF | |
| @end example | |
| Many shells (including the Bourne shell) implement here-documents | |
| inefficiently. In particular, some shells can be extremely inefficient when | |
| a single statement contains many here-documents. For instance if your | |
| @file{configure.ac} includes something like: | |
| @example | |
| @group | |
| AS_IF([<cross_compiling>], | |
| [assume this and that], | |
| [check this | |
| check that | |
| check something else | |
| @dots{} | |
| on and on forever | |
| @dots{}]) | |
| @end group | |
| @end example | |
| A shell parses the whole @code{if}/@code{fi} construct generated by | |
| @code{AS_IF}, creating | |
| temporary files for each here-document in it. Some shells create links | |
| for such here-documents on every @code{fork}, so that the clean-up code | |
| they had installed correctly removes them. It is creating the links | |
| that can take the shell forever. | |
| Moving the tests out of the @code{if}/@code{fi}, or creating multiple | |
| @code{if}/@code{fi} constructs, would improve the performance | |
| significantly. Anyway, this kind of construct is not exactly the | |
| typical use of Autoconf. In fact, it's even not recommended, because M4 | |
| macros can't look into shell conditionals, so we may fail to expand a | |
| macro when it was expanded before in a conditional path, and the | |
| condition turned out to be false at runtime, and we end up not | |
| executing the macro at all. | |
| Be careful with the use of @samp{<<-} to unindent here-documents. The | |
| behavior is only portable for stripping leading @key{TAB}s, and things | |
| can silently break if an overzealous editor converts to using leading | |
| spaces (not all shells are nice enough to warn about unterminated | |
| here-documents). | |
| @example | |
| $ @kbd{printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done} | |
| 1 | |
| 2 | |
| done | |
| $ @kbd{printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done} | |
| 1 | |
| 2 | |
| x | |
| done | |
| @end example | |
| @node File Descriptors | |
| @section File Descriptors | |
| @cindex Descriptors | |
| @cindex File descriptors | |
| @cindex Shell file descriptors | |
| Most shells, if not all (including Bash, Zsh, Ash), output traces on | |
| stderr, even for subshells. This might result in undesirable content | |
| if you meant to capture the standard-error output of the inner command: | |
| @example | |
| $ @kbd{ash -x -c '(eval "echo foo >&2") 2>stderr'} | |
| $ @kbd{cat stderr} | |
| + eval echo foo >&2 | |
| + echo foo | |
| foo | |
| $ @kbd{bash -x -c '(eval "echo foo >&2") 2>stderr'} | |
| $ @kbd{cat stderr} | |
| + eval 'echo foo >&2' | |
| ++ echo foo | |
| foo | |
| $ @kbd{zsh -x -c '(eval "echo foo >&2") 2>stderr'} | |
| @i{# Traces on startup files deleted here.} | |
| $ @kbd{cat stderr} | |
| +zsh:1> eval echo foo >&2 | |
| +zsh:1> echo foo | |
| foo | |
| @end example | |
| @noindent | |
| One workaround is to grep out uninteresting lines, hoping not to remove | |
| good ones. | |
| If you intend to redirect both standard error and standard output, | |
| redirect standard output first. This works better with AIX, | |
| since its shell mishandles tracing if standard error is redirected | |
| first: | |
| @example | |
| $ @kbd{sh -x -c ': 2>err >out'} | |
| + : | |
| + 2> err $ @kbd{cat err} | |
| 1> out | |
| @end example | |
| Don't try to redirect the standard error of a command substitution. It | |
| must be done @emph{inside} the command substitution. When running | |
| @samp{: `cd /zorglub` 2>/dev/null} expect the error message to | |
| escape, while @samp{: `cd /zorglub 2>/dev/null`} works properly. | |
| On the other hand, some shells, such as Solaris or FreeBSD | |
| @command{/bin/sh}, warn about missing programs before performing | |
| redirections. Therefore, to silently check whether a program exists, it | |
| is necessary to perform redirections on a subshell or brace group: | |
| @example | |
| $ @kbd{/bin/sh -c 'nosuch 2>/dev/null'} | |
| nosuch: not found | |
| $ @kbd{/bin/sh -c '(nosuch) 2>/dev/null'} | |
| $ @kbd{/bin/sh -c '@{ nosuch; @} 2>/dev/null'} | |
| $ @kbd{bash -c 'nosuch 2>/dev/null'} | |
| @end example | |
| FreeBSD 6.2 sh may mix the trace output lines from the statements in a | |
| shell pipeline. | |
| It is worth noting that Zsh (but not Ash nor Bash) makes it possible | |
| in assignments though: @samp{foo=`cd /zorglub` 2>/dev/null}. | |
| Some shells, like @command{ash}, don't recognize bi-directional | |
| redirection (@samp{<>}). And even on shells that recognize it, it is | |
| not portable to use on fifos: POSIX does not require read-write support | |
| for named pipes, and Cygwin does not support it: | |
| @example | |
| $ @kbd{mkfifo fifo} | |
| $ @kbd{exec 5<>fifo} | |
| $ @kbd{echo hi >&5} | |
| bash: echo: write error: Communication error on send | |
| @end example | |
| @noindent | |
| Furthermore, versions of @command{dash} before 0.5.6 mistakenly truncate | |
| regular files when using @samp{<>}: | |
| @example | |
| $ @kbd{echo a > file} | |
| $ @kbd{bash -c ': 1<>file'; cat file} | |
| a | |
| $ @kbd{dash -c ': 1<>file'; cat file} | |
| $ rm a | |
| @end example | |
| Solaris 10 @code{/bin/sh} executes redirected compound commands | |
| in a subshell, while other shells don't: | |
| @example | |
| $ @kbd{/bin/sh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} | |
| 0 | |
| $ @kbd{ksh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} | |
| 1 | |
| $ @kbd{bash -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} | |
| 1 | |
| @end example | |
| Solaris 10 @command{sh} will try to optimize away a @command{:} command | |
| (even if it is redirected) in a loop after the first iteration, or in a | |
| shell function after the first call: | |
| @example | |
| $ @kbd{for i in 1 2 3 ; do : >x$i; done} | |
| $ @kbd{ls x*} | |
| x1 | |
| $ @kbd{f () @{ : >$1; @}; f y1; f y2; f y3;} | |
| $ @kbd{ls y*} | |
| y1 | |
| @end example | |
| @noindent | |
| As a workaround, @command{echo} or @command{eval} can be used. | |
| When running a subsidiary program be careful if descriptor 0 is not open | |
| for reading or decriptors 1 and 2 are not open for writing, | |
| as the subsidiary program might not behave as expected. | |
| In particular, don't rely on file descriptors 0, 1, and 2 remaining closed in a | |
| subsidiary program. If any of these descriptors is closed, the | |
| operating system may open an unspecified file for the descriptor in the | |
| newly created process. | |
| If you want a file descriptor above 2 to be inherited into a child | |
| process, then you must use redirections specific to that command or a | |
| containing subshell or command group, rather than relying on | |
| @command{exec} in the shell. In @command{ksh} as well as HP-UX | |
| @command{sh}, file descriptors above 2 which are opened using | |
| @samp{exec @var{n}>file} are closed by a subsequent @samp{exec} (such as | |
| that involved in the fork-and-exec which runs a program or script): | |
| @example | |
| $ @kbd{echo 'echo hello >&5' >k} | |
| $ @kbd{/bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} | |
| hello | |
| $ @kbd{bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} | |
| hello | |
| $ @kbd{ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} | |
| ./k[1]: 5: cannot open [Bad file number] | |
| $ @kbd{ksh -c '(ksh ./k) 5>t; cat t'} | |
| hello | |
| $ @kbd{ksh -c '@{ ksh ./k; @} 5>t; cat t'} | |
| hello | |
| $ @kbd{ksh -c '5>t ksh ./k; cat t} | |
| hello | |
| @end example | |
| Don't rely on duplicating a closed file descriptor to cause an | |
| error. With Solaris 10 @command{/bin/sh}, failed duplication is silently | |
| ignored, which can cause unintended leaks to the original file | |
| descriptor. In this example, observe the leak to standard output: | |
| @example | |
| $ @kbd{bash -c 'echo hi >&3' 3>&-; echo $?} | |
| bash: 3: Bad file descriptor | |
| 1 | |
| $ @kbd{/bin/sh -c 'echo hi >&3' 3>&-; echo $?} | |
| hi | |
| 0 | |
| @end example | |
| Fortunately, an attempt to close an already closed file descriptor will | |
| portably succeed. Likewise, it is safe to use either style of | |
| @samp{@var{n}<&-} or @samp{@var{n}>&-} for closing a file descriptor, | |
| even if it doesn't match the read/write mode that the file descriptor | |
| was opened with. | |
| DOS variants cannot rename or remove open files, such as in | |
| @samp{mv foo bar >foo} or @samp{rm foo >foo}, even though this is | |
| perfectly portable among POSIX hosts. | |
| A few ancient systems reserved some file descriptors. By convention, | |
| file descriptor 3 was opened to @file{/dev/tty} when you logged into | |
| Eighth Edition (1985) through Tenth Edition Unix (1989). File | |
| descriptor 4 had a special use on the Stardent/Kubota Titan (circa | |
| 1990), though we don't now remember what it was. Both these systems are | |
| obsolete, so it's now safe to treat file descriptors 3 and 4 like any | |
| other file descriptors. | |
| On the other hand, you can't portably use multi-digit file descriptors. | |
| @command{dash} and Solaris @command{ksh} don't understand any file | |
| descriptor larger than @samp{9}: | |
| @example | |
| $ @kbd{bash -c 'exec 10>&-'; echo $?} | |
| 0 | |
| $ @kbd{ksh -c 'exec 9>&-'; echo $?} | |
| 0 | |
| $ @kbd{ksh -c 'exec 10>&-'; echo $?} | |
| ksh[1]: exec: 10: not found | |
| 127 | |
| $ @kbd{dash -c 'exec 9>&-'; echo $?} | |
| 0 | |
| $ @kbd{dash -c 'exec 10>&-'; echo $?} | |
| exec: 1: 10: not found | |
| 2 | |
| @end example | |
| @c <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html> | |
| @node Signal Handling | |
| @section Signal Handling | |
| @cindex Signal handling in the shell | |
| @cindex Signals, shells and | |
| Portable handling of signals within the shell is another major source of | |
| headaches. This is worsened by the fact that various different, mutually | |
| incompatible approaches are possible in this area, each with its | |
| distinctive merits and demerits. A detailed description of these possible | |
| approaches, as well as of their pros and cons, can be found in | |
| @uref{https://www.cons.org/cracauer/sigint.html, this article}. | |
| Solaris 10 @command{/bin/sh} automatically traps most signals by default; | |
| the shell still exits with error upon termination by one of those signals, | |
| but in such a case the exit status might be somewhat unexpected (even if | |
| allowed by POSIX, strictly speaking): | |
| @c FIXME: We had a reference for this behavior but the website no longer | |
| @c exists and the page is not in the Internet Archive. --zw 2020-07-10. | |
| @example | |
| $ @kbd{bash -c 'kill -1 $$'; echo $?} # Will exit 128 + (signal number). | |
| Hangup | |
| 129 | |
| $ @kbd{/bin/ksh -c 'kill -15 $$'; echo $?} # Likewise. | |
| Terminated | |
| 143 | |
| $ @kbd{for sig in 1 2 3 15; do} | |
| > @kbd{ echo $sig:} | |
| > @kbd{ /bin/sh -c "kill -$s \$\$"; echo $?} | |
| > @kbd{done} | |
| signal 1: | |
| Hangup | |
| 129 | |
| signal 2: | |
| 208 | |
| signal 3: | |
| 208 | |
| signal 15: | |
| 208 | |
| @end example | |
| This gets even worse if one is using the POSIX ``wait'' interface to get | |
| details about the shell process terminations: it will result in the shell | |
| having exited normally, rather than by receiving a signal. | |
| @example | |
| $ @kbd{cat > foo.c <<'END'} | |
| #include <stdio.h> /* for printf */ | |
| #include <stdlib.h> /* for system */ | |
| #include <sys/wait.h> /* for WIF* macros */ | |
| int main(void) | |
| @{ | |
| int status = system ("kill -15 $$"); | |
| printf ("Terminated by signal: %s\n", | |
| WIFSIGNALED (status) ? "yes" : "no"); | |
| printf ("Exited normally: %s\n", | |
| WIFEXITED (status) ? "yes" : "no"); | |
| return 0; | |
| @} | |
| END | |
| @c $$ font-lock | |
| $ @kbd{cc -o foo foo.c} | |
| $ @kbd{./a.out} # On GNU/Linux | |
| Terminated by signal: no | |
| Exited normally: yes | |
| $ @kbd{./a.out} # On Solaris 10 | |
| Terminated by signal: yes | |
| Exited normally: no | |
| @end example | |
| Various shells seem to handle @code{SIGQUIT} specially: they ignore it even | |
| if it is not blocked, and even if the shell is not running interactively | |
| (in fact, even if the shell has no attached tty); among these shells | |
| are at least Bash (from version 2 onward), Zsh 4.3.12, Solaris 10 | |
| @code{/bin/ksh} and @code{/usr/xpg4/bin/sh}, and AT&T @code{ksh93} (2011). | |
| Still, @code{SIGQUIT} seems to be trappable quite portably within all | |
| these shells. OTOH, some other shells doesn't special-case the handling | |
| of @code{SIGQUIT}; among these shells are at least @code{pdksh} 5.2.14, | |
| Solaris 10 and NetBSD 5.1 @code{/bin/sh}, and the Almquist Shell 0.5.5.1. | |
| Some shells (especially Korn shells and derivatives) might try to | |
| propagate to themselves a signal that has killed a child process; this is | |
| not a bug, but a conscious design choice (although its overall value might | |
| be debatable). The exact details of how this is attained vary from shell | |
| to shell. For example, upon running @code{perl -e 'kill 2, $$'}, after | |
| the perl process has been interrupted, AT&T @code{ksh93} (2011) will | |
| proceed to send itself a @code{SIGINT}, while Solaris 10 @code{/bin/ksh} | |
| and @code{/usr/xpg4/bin/sh} will proceed to exit with status 130 (i.e., | |
| 128 + 2). In any case, if there is an active trap associated with | |
| @code{SIGINT}, those shells will correctly execute it. | |
| @c See: <https://www.austingroupbugs.net/view.php?id=51> | |
| Some Korn shells, when a child process die due receiving a signal with | |
| signal number @var{n}, can leave in @samp{$?} an exit status of | |
| 256+@var{n} instead of the more common 128+@var{n}. Observe the | |
| difference between AT&T @code{ksh93} (2011) and @code{bash} 4.1.5 on | |
| Debian: | |
| @example | |
| $ @kbd{/bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'} | |
| /bin/ksh: line 1: 7837: Hangup | |
| 257 | |
| $ @kbd{/bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'} | |
| /bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$") | |
| 129 | |
| @end example | |
| @noindent | |
| This @command{ksh} behavior is allowed by POSIX, if implemented with | |
| due care; see this @uref{https://www.austingroupbugs.net/view.php?id=51, | |
| Austin Group discussion} for more background. However, if it is not | |
| implemented with proper care, such a behavior might cause problems | |
| in some corner cases. To see why, assume we have a ``wrapper'' script | |
| like this: | |
| @example | |
| #!/bin/sh | |
| # Ignore some signals in the shell only, not in its child processes. | |
| trap : 1 2 13 15 | |
| wrapped_command "$@@" | |
| ret=$? | |
| other_command | |
| exit $ret | |
| @end example | |
| @noindent | |
| If @command{wrapped_command} is interrupted by a @code{SIGHUP} (which | |
| has signal number 1), @code{ret} will be set to 257. Unless the | |
| @command{exit} shell builtin is smart enough to understand that such | |
| a value can only have originated from a signal, and adjust the final | |
| wait status of the shell appropriately, the value 257 will just get | |
| truncated to 1 by the closing @code{exit} call, so that a caller of | |
| the script will have no way to determine that termination by a signal | |
| was involved. Observe the different behavior of AT&T @code{ksh93} | |
| (2011) and @code{bash} 4.1.5 on Debian: | |
| @example | |
| $ @kbd{cat foo.sh} | |
| #!/bin/sh | |
| sh -c 'kill -1 $$' | |
| ret=$? | |
| echo $ret | |
| exit $ret | |
| $ @kbd{/bin/ksh foo.sh; echo $?} | |
| foo.sh: line 2: 12479: Hangup | |
| 257 | |
| 1 | |
| $ @kbd{/bin/bash foo.sh; echo $?} | |
| foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$') | |
| 129 | |
| 129 | |
| @end example | |
| @node File System Conventions | |
| @section File System Conventions | |
| @cindex File system conventions | |
| Autoconf uses shell-script processing extensively, so the file names | |
| that it processes should not contain characters that are special to the | |
| shell. Special characters include space, tab, newline, NUL, and | |
| the following: | |
| @example | |
| " # $ & ' ( ) * ; < = > ? [ \ ` | | |
| @end example | |
| Also, file names should not begin with @samp{~} or @samp{-}, and should | |
| contain neither @samp{-} immediately after @samp{/} nor @samp{~} | |
| immediately after @samp{:}. On POSIX-like platforms, directory names | |
| should not contain @samp{:}, as this runs afoul of @samp{:} used as the | |
| path separator. | |
| These restrictions apply not only to the files that you distribute, but | |
| also to the absolute file names of your source, build, and destination | |
| directories. | |
| On some POSIX-like platforms, @samp{!} and @samp{^} are special too, so | |
| they should be avoided. | |
| POSIX lets implementations treat leading @file{//} specially, but | |
| requires leading @file{///} and beyond to be equivalent to @file{/}. | |
| Most Unix variants treat @file{//} like @file{/}. However, some treat | |
| @file{//} as a ``super-root'' that can provide access to files that are | |
| not otherwise reachable from @file{/}. The super-root tradition began | |
| with Apollo Domain/OS, which died out long ago, but unfortunately Cygwin | |
| has revived it. | |
| While @command{autoconf} and friends are usually run on some POSIX | |
| variety, they can be used on other systems, most notably DOS | |
| variants. This impacts several assumptions regarding file names. | |
| @noindent | |
| For example, the following code: | |
| @example | |
| case $foo_dir in | |
| /*) # Absolute | |
| ;; | |
| *) | |
| foo_dir=$dots$foo_dir ;; | |
| esac | |
| @end example | |
| @noindent | |
| fails to properly detect absolute file names on those systems, because | |
| they can use a drivespec, and usually use a backslash as directory | |
| separator. If you want to be portable to DOS variants (at the | |
| price of rejecting valid but oddball POSIX file names like @file{a:\b}), | |
| you can check for absolute file names like this: | |
| @cindex absolute file names, detect | |
| @example | |
| case $foo_dir in | |
| [\\/]* | ?:[\\/]* ) # Absolute | |
| ;; | |
| *) | |
| foo_dir=$dots$foo_dir ;; | |
| esac | |
| @end example | |
| @noindent | |
| Make sure you quote the brackets if appropriate and keep the backslash as | |
| first character. @xref{case, , Limitations of Shell Builtins}. | |
| Also, because the colon is used as part of a drivespec, these systems don't | |
| use it as path separator. When creating or accessing paths, you can use the | |
| @code{PATH_SEPARATOR} output variable instead. @command{configure} sets this | |
| to the appropriate value for the build system (@samp{:} or @samp{;}) when it | |
| starts up. | |
| File names need extra care as well. While DOS variants | |
| that are POSIXy enough to run @command{autoconf} (such as DJGPP) | |
| are usually able to handle long file names properly, there are still | |
| limitations that can seriously break packages. Several of these issues | |
| can be easily detected by the | |
| @uref{https://@/ftp.gnu.org/@/gnu/@/non-gnu/@/doschk/@/doschk-1.1.tar.gz, doschk} | |
| package. | |
| A short overview follows; problems are marked with SFN/LFN to | |
| indicate where they apply: SFN means the issues are only relevant to | |
| plain DOS, not to DOS under Microsoft Windows | |
| variants, while LFN identifies problems that exist even under | |
| Microsoft Windows variants. | |
| @table @asis | |
| @item No multiple dots (SFN) | |
| DOS cannot handle multiple dots in file names. This is an especially | |
| important thing to remember when building a portable configure script, | |
| as @command{autoconf} uses a .in suffix for template files. | |
| This is perfectly OK on POSIX variants: | |
| @example | |
| AC_CONFIG_HEADERS([config.h]) | |
| AC_CONFIG_FILES([source.c foo.bar]) | |
| AC_OUTPUT | |
| @end example | |
| @noindent | |
| but it causes problems on DOS, as it requires @samp{config.h.in}, | |
| @samp{source.c.in} and @samp{foo.bar.in}. To make your package more portable | |
| to DOS-based environments, you should use this instead: | |
| @example | |
| AC_CONFIG_HEADERS([config.h:config.hin]) | |
| AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in]) | |
| AC_OUTPUT | |
| @end example | |
| @item No leading dot (SFN) | |
| DOS cannot handle file names that start with a dot. This is usually | |
| not important for @command{autoconf}. | |
| @item Case insensitivity (LFN) | |
| DOS is case insensitive, so you cannot, for example, have both a | |
| file called @samp{INSTALL} and a directory called @samp{install}. This | |
| also affects @command{make}; if there's a file called @samp{INSTALL} in | |
| the directory, @samp{make install} does nothing (unless the | |
| @samp{install} target is marked as PHONY). | |
| @item The 8+3 limit (SFN) | |
| Because the DOS file system only stores the first 8 characters of | |
| the file name and the first 3 of the extension, those must be unique. | |
| That means that @file{foobar-part1.c}, @file{foobar-part2.c} and | |
| @file{foobar-prettybird.c} all resolve to the same file name | |
| (@file{FOOBAR-P.C}). The same goes for @file{foo.bar} and | |
| @file{foo.bartender}. | |
| The 8+3 limit is not usually a problem under Microsoft Windows, as it | |
| uses numeric | |
| tails in the short version of file names to make them unique. However, a | |
| registry setting can turn this behavior off. While this makes it | |
| possible to share file trees containing long file names between SFN | |
| and LFN environments, it also means the above problem applies there | |
| as well. | |
| @item Invalid characters (LFN) | |
| Some characters are invalid in DOS file names, and should therefore | |
| be avoided. In a LFN environment, these are @samp{/}, @samp{\}, | |
| @samp{?}, @samp{*}, @samp{:}, @samp{<}, @samp{>}, @samp{|} and @samp{"}. | |
| In a SFN environment, other characters are also invalid. These | |
| include @samp{+}, @samp{,}, @samp{[} and @samp{]}. | |
| @item Invalid names (LFN) | |
| Some DOS file names are reserved, and cause problems if you | |
| try to use files with those names. These names include @file{CON}, | |
| @file{AUX}, @file{COM1}, @file{COM2}, @file{COM3}, @file{COM4}, | |
| @file{LPT1}, @file{LPT2}, @file{LPT3}, @file{NUL}, and @file{PRN}. | |
| File names are case insensitive, so even names like | |
| @file{aux/config.guess} are disallowed. | |
| @end table | |
| @node Shell Pattern Matching | |
| @section Shell Pattern Matching | |
| @cindex Shell pattern matching | |
| Portable patterns should avoid the following constructs: | |
| @itemize @bullet | |
| @item | |
| A bracket expression like @samp{[a-z]} outside the C locale. | |
| This pattern may match characters that are not lower-case letters. | |
| Outside the C locale, use @samp{[[:lower:]]} instead, | |
| or to match just lower-case ASCII letters use | |
| @samp{[abcdefghijklmnopqrstuvwxyz]}. | |
| @item | |
| A bracket expression starting with @samp{^}. | |
| For example, @samp{[!-aeiou]} is portable, but @samp{[^-aeiou]} is not. | |
| @item | |
| When matching file names, a pattern containing @samp{*}, @samp{?} or | |
| @samp{[...]} that might match the file names @samp{.} or @samp{..}. | |
| For example @samp{.*} might match @samp{.} and @samp{..}, but it might not. | |
| @item | |
| Any of the following characters, | |
| unless quoted or escaped or in a bracket expression: | |
| @example | |
| ! # % = [ ] ^ @{ @} ~ | |
| @end example | |
| An unescaped @samp{[} that does not introduce a bracket expression is | |
| problematic because, for example, @samp{a*[} might match the file name | |
| @samp{abc[}, but it might not. | |
| Curly braces are problematic because POSIX allows but does not require | |
| brace expansion. For example, the shell command @samp{echo a@{b,c,d@}e} | |
| outputs @samp{abe ace ade} with Bash, but @samp{a@{b,c,d@}e} with Dash. | |
| @item | |
| Backlashes in bracket expressions, unless doubled. | |
| For example, @samp{[\\^]} is portable, but @samp{[\^]} is not. | |
| @item | |
| An unescaped backslash at pattern end. | |
| @item | |
| A NUL byte. | |
| More generally, a NUL byte should never appear anywhere | |
| in a portable shell script. | |
| @end itemize | |
| @node Shell Substitutions | |
| @section Shell Substitutions | |
| @cindex Shell substitutions | |
| Contrary to a persistent urban legend, the Bourne shell does not | |
| systematically split variables and back-quoted expressions, in particular | |
| on the right-hand side of assignments and in the argument of @code{case}. | |
| For instance, the following code: | |
| @example | |
| case "$given_srcdir" in | |
| .) top_srcdir="`printf '%s\n' "$dots" | sed 's|/$||'`" ;; | |
| *) top_srcdir="$dots$given_srcdir" ;; | |
| esac | |
| @end example | |
| @noindent | |
| is more readable when written as: | |
| @example | |
| case $given_srcdir in | |
| .) top_srcdir=`printf '%s\n' "$dots" | sed 's|/$||'` ;; | |
| *) top_srcdir=$dots$given_srcdir ;; | |
| esac | |
| @end example | |
| @noindent | |
| and in fact it is even @emph{more} portable: in the first case of the | |
| first attempt, the computation of @code{top_srcdir} is not portable, | |
| since not all shells properly understand @code{"`@dots{}"@dots{}"@dots{}`"}, | |
| for example Solaris 10 @command{ksh}: | |
| @example | |
| $ @kbd{foo="`echo " bar" | sed 's, ,,'`"} | |
| ksh: : cannot execute | |
| ksh: bar | sed 's, ,,': cannot execute | |
| @end example | |
| @noindent | |
| POSIX does not specify behavior for this sequence. On the other hand, | |
| behavior for @code{"`@dots{}\"@dots{}\"@dots{}`"} is specified by POSIX, | |
| but in practice, not all shells understand it the same way: pdksh 5.2.14 | |
| prints spurious quotes when in POSIX mode: | |
| @example | |
| $ @kbd{echo "`echo \"hello\"`"} | |
| hello | |
| $ @kbd{set -o posix} | |
| $ @kbd{echo "`echo \"hello\"`"} | |
| "hello" | |
| @end example | |
| @noindent | |
| There is just no portable way to use double-quoted strings inside | |
| double-quoted back-quoted expressions (pfew!). | |
| Bash 4.1 has a bug where quoted empty strings adjacent to unquoted | |
| parameter expansions are elided during word splitting. Meanwhile, zsh | |
| does not perform word splitting except when in Bourne compatibility | |
| mode. In the example below, the correct behavior is to have five | |
| arguments to the function, and exactly two spaces on either side of the | |
| middle @samp{-}, since word splitting collapses multiple spaces in | |
| @samp{$f} but leaves empty arguments intact. | |
| @example | |
| $ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} | |
| 3- - - | |
| $ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} | |
| 5- - - | |
| $ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} | |
| 3- - - | |
| $ @kbd{zsh -c 'emulate sh;} | |
| > @kbd{n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} | |
| 5- - - | |
| @end example | |
| @noindent | |
| You can work around this by doing manual word splitting, such as using | |
| @samp{"$str" $list} rather than @samp{"$str"$list}. | |
| There are also portability pitfalls with particular expansions: | |
| @table @code | |
| @item $@@ | |
| @cindex @code{"$@@"} | |
| Autoconf macros often use the @command{set} command to update | |
| @samp{$@@}, so if you are writing shell code intended for | |
| @command{configure} you should not assume that the value of @samp{$@@} | |
| persists for any length of time. | |
| You may see usages like @samp{$@{1+"$@@"@}} in older shell scripts | |
| designed to work around a portability problem in ancient shells. | |
| Unfortunately this runs afoul of bugs in more-recent shells, and | |
| nowadays it is better to use plain @samp{"$@@"} instead. | |
| The portability problem with ancient shells was significant. | |
| When there are no positional arguments @samp{"$@@"} should be discarded, | |
| but the original Unix version 7 Bourne shell mistakenly treated it as | |
| equivalent to @samp{""} instead, and many ancient shells followed its lead. | |
| For many years shell scripts worked around this portability problem by | |
| using @samp{$@{1+"$@@"@}} instead of @samp{"$@@"}, and you may see this | |
| usage in older scripts. Unfortunately, @samp{$@{1+"$@@"@}} does not | |
| work with @command{ksh93} M 93t+ (2009) as shipped in AIX 7.2 (2015), | |
| as this shell drops a trailing empty argument: | |
| @example | |
| $ @kbd{set a b c ""} | |
| $ @kbd{set $@{1+"$@@"@}} | |
| $ @kbd{echo $#} | |
| 3 | |
| @end example | |
| Also, @samp{$@{1+"$@@"@}} does not work with Zsh 4.2.6 (2005) and | |
| earlier, as shipped in Mac OS X releases before 10.5, as this old Zsh | |
| incorrectly word splits the result: | |
| @example | |
| zsh $ @kbd{emulate sh} | |
| zsh $ @kbd{for i in "$@@"; do echo $i; done} | |
| Hello World | |
| ! | |
| zsh $ @kbd{for i in $@{1+"$@@"@}; do echo $i; done} | |
| Hello | |
| World | |
| ! | |
| @end example | |
| To work around these problems Autoconf does two things. First, in the | |
| shell code that it generates Autoconf avoids @samp{"$@@"} if it is | |
| possible that there may be no positional arguments. You can use this | |
| workaround in your own code, too, if you want it to be portable to | |
| ancient shells. For example, instead of: | |
| @example | |
| cat conftest.c "$@@" | |
| @end example | |
| you can use this: | |
| @example | |
| case $# in | |
| 0) cat conftest.c;; | |
| *) cat conftest.c "$@@";; | |
| esac | |
| @end example | |
| @noindent | |
| Second, Autoconf-generated @command{configure} scripts work around most | |
| of the old Zsh problem by using Zsh's ``global aliases'' to convert | |
| @samp{$@{1+"$@@"@}} into @samp{"$@@"} by itself: | |
| @example | |
| test $@{ZSH_VERSION+y@} && alias -g '$@{1+"$@@"@}'='"$@@"' | |
| @end example | |
| This workaround is for the benefit of any instances of | |
| @samp{$@{1+"$@@"@}} in user-written code appearing in | |
| @command{configure} scripts. However, it is not a complete solution, as | |
| Zsh recognizes the alias only when a shell word matches it exactly, | |
| which means older Zsh still mishandles more-complicated cases like | |
| @samp{"foo"$@{1+"$@@"@}}. | |
| @item $@{10@} | |
| @cindex positional parameters | |
| The 10th, 11th, @dots{} positional parameters can be accessed only after | |
| a @code{shift}. The 7th Edition shell reported an error if given | |
| @code{$@{10@}}, and | |
| Solaris 10 @command{/bin/sh} still acts that way: | |
| @example | |
| $ @kbd{set 1 2 3 4 5 6 7 8 9 10} | |
| $ @kbd{echo $@{10@}} | |
| bad substitution | |
| @end example | |
| Conversely, not all shells obey the POSIX rule that when braces are | |
| omitted, multiple digits beyond a @samp{$} imply the single-digit | |
| positional parameter expansion concatenated with the remaining literal | |
| digits. To work around the issue, you must use braces. | |
| @example | |
| $ @kbd{bash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'} | |
| a0 a0 | |
| $ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'} | |
| j a0 | |
| @end example | |
| @item $@{@var{var}-@var{value}@} | |
| @itemx $@{@var{var}:-@var{value}@} | |
| @itemx $@{@var{var}=@var{value}@} | |
| @itemx $@{@var{var}:=@var{value}@} | |
| @itemx $@{@var{var}?@var{value}@} | |
| @itemx $@{@var{var}:?@var{value}@} | |
| @itemx $@{@var{var}+@var{value}@} | |
| @itemx $@{@var{var}:+@var{value}@} | |
| @cindex @code{$@{@var{var}-@var{value}@}} | |
| @cindex @code{$@{@var{var}=@var{value}@}} | |
| @cindex @code{$@{@var{var}?@var{value}@}} | |
| @cindex @code{$@{@var{var}+@var{value}@}} | |
| @c Info cannot handle ':' in index entries. | |
| @ifnotinfo | |
| @cindex @code{$@{@var{var}:-@var{value}@}} | |
| @cindex @code{$@{@var{var}:=@var{value}@}} | |
| @cindex @code{$@{@var{var}:?@var{value}@}} | |
| @cindex @code{$@{@var{var}:+@var{value}@}} | |
| @end ifnotinfo | |
| When using @samp{$@{@var{var}-@var{value}@}} or | |
| similar notations that modify a parameter expansion, | |
| POSIX requires that @var{value} must be a single shell word, | |
| which can contain quoted strings but cannot contain unquoted spaces. | |
| If this requirement is not met Solaris 10 @command{/bin/sh} | |
| sometimes complains, and anyway the behavior is not portable. | |
| @example | |
| $ @kbd{/bin/sh -c 'echo $@{a-b c@}'} | |
| /bin/sh: bad substitution | |
| $ @kbd{/bin/sh -c 'echo $@{a-'\''b c'\''@}'} | |
| b c | |
| $ @kbd{/bin/sh -c 'echo "$@{a-b c@}"'} | |
| b c | |
| $ @kbd{/bin/sh -c 'cat <<EOF | |
| $@{a-b c@} | |
| EOF} | |
| b c | |
| @end example | |
| Most shells treat the special parameters @code{*} and @code{@@} as being | |
| unset if there are no positional parameters. However, some shells treat | |
| them as being set to the empty string. POSIX does not clearly specify | |
| either behavior. | |
| @example | |
| $ @kbd{bash -c 'echo "* is $@{*-unset@}."'} | |
| * is unset. | |
| $ @kbd{dash -c 'echo "* is $@{*-unset@}."'} | |
| * is . | |
| @end example | |
| According to POSIX, if an expansion occurs inside double quotes, then | |
| the use of unquoted double quotes within @var{value} is unspecified, and | |
| any single quotes become literal characters; in that case, escaping must | |
| be done with backslash. Likewise, the use of unquoted here-documents is | |
| a case where double quotes have unspecified results: | |
| @example | |
| $ @kbd{/bin/sh -c 'echo "$@{a-"b c"@}"'} | |
| /bin/sh: bad substitution | |
| $ @kbd{ksh -c 'echo "$@{a-"b c"@}"'} | |
| b c | |
| $ @kbd{bash -c 'echo "$@{a-"b c"@}"'} | |
| b c | |
| $ @kbd{/bin/sh -c 'a=; echo $@{a+'\''b c'\''@}'} | |
| b c | |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+'\''b c'\''@}"'} | |
| 'b c' | |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+\"b c\"@}"'} | |
| "b c" | |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+b c@}"'} | |
| b c | |
| $ @kbd{/bin/sh -c 'cat <<EOF | |
| $@{a-"b c"@} | |
| EOF'} | |
| "b c" | |
| $ @kbd{/bin/sh -c 'cat <<EOF | |
| $@{a-'b c'@} | |
| EOF'} | |
| 'b c' | |
| $ @kbd{bash -c 'cat <<EOF | |
| $@{a-"b c"@} | |
| EOF'} | |
| b c | |
| $ @kbd{bash -c 'cat <<EOF | |
| $@{a-'b c'@} | |
| EOF'} | |
| 'b c' | |
| @end example | |
| Perhaps the easiest way to work around quoting issues in a manner | |
| portable to all shells is to place the results in a temporary variable, | |
| then use @samp{$t} as the @var{value}, rather than trying to inline | |
| the expression needing quoting. | |
| @example | |
| $ @kbd{/bin/sh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} | |
| b c"'@}\ | |
| $ @kbd{ksh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} | |
| b c"'@}\ | |
| $ @kbd{bash -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} | |
| b c"'@}\ | |
| @end example | |
| @item $@{@var{var}=@var{value}@} | |
| @cindex @code{$@{@var{var}=@var{value}@}} | |
| When using @samp{$@{@var{var}=@var{value}@}} to assign a default value | |
| to @var{var}, remember that even though the assignment to @var{var} does | |
| not undergo file name expansion, the result of the variable expansion | |
| does unless the expansion occurred within double quotes. In particular, | |
| when using @command{:} followed by unquoted variable expansion for the | |
| side effect of setting a default value, if the final value of | |
| @samp{$var} contains any globbing characters (either from @var{value} or | |
| from prior contents), the shell has to spend time performing file name | |
| expansion and field splitting even though those results will not be | |
| used. Therefore, it is a good idea to consider double quotes when performing | |
| default initialization; while remembering how this impacts any quoting | |
| characters appearing in @var{value}. | |
| @example | |
| $ @kbd{time bash -c ': "$@{a=/usr/bin/*@}"; echo "$a"'} | |
| /usr/bin/* | |
| real 0m0.005s | |
| user 0m0.002s | |
| sys 0m0.003s | |
| $ @kbd{time bash -c ': $@{a=/usr/bin/*@}; echo "$a"'} | |
| /usr/bin/* | |
| real 0m0.039s | |
| user 0m0.026s | |
| sys 0m0.009s | |
| $ @kbd{time bash -c 'a=/usr/bin/*; : $@{a=noglob@}; echo "$a"'} | |
| /usr/bin/* | |
| real 0m0.031s | |
| user 0m0.020s | |
| sys 0m0.010s | |
| $ @kbd{time bash -c 'a=/usr/bin/*; : "$@{a=noglob@}"; echo "$a"'} | |
| /usr/bin/* | |
| real 0m0.006s | |
| user 0m0.002s | |
| sys 0m0.003s | |
| @end example | |
| As with @samp{+} and @samp{-}, @var{value} must be a single shell word, | |
| otherwise some shells, such as Solaris 10 @command{/bin/sh} or on Digital | |
| Unix V 5.0, die because of a ``bad substitution''. Meanwhile, POSIX | |
| requires that with @samp{=}, quote removal happens prior to the | |
| assignment, and the expansion be the final contents of @var{var} without | |
| quoting (and thus subject to field splitting), in contrast to the | |
| behavior with @samp{-} passing the quoting through to the final | |
| expansion. However, @command{bash} 4.1 does not obey this rule. | |
| @example | |
| $ @kbd{ksh -c 'echo $@{var-a\ \ b@}'} | |
| a b | |
| $ @kbd{ksh -c 'echo $@{var=a\ \ b@}'} | |
| a b | |
| $ @kbd{bash -c 'echo $@{var=a\ \ b@}'} | |
| a b | |
| @end example | |
| Finally, POSIX states that when mixing @samp{$@{a=b@}} with regular | |
| commands, it is unspecified whether the assignments affect the parent | |
| shell environment. It is best to perform assignments independently from | |
| commands, to avoid the problems demonstrated in this example running on | |
| Solaris 10: | |
| @example | |
| $ @kbd{cmd='x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";printf "%s\\n" -$x-'} | |
| $ @kbd{bash -c "$cmd"} | |
| +b+b+ | |
| -b- | |
| $ @kbd{/bin/sh -c "$cmd"} | |
| ++b+ | |
| -- | |
| $ @kbd{ksh -c "$cmd"} | |
| +b+b+ | |
| -- | |
| @end example | |
| @item $@{@var{var}=@var{value}@} | |
| @cindex @code{$@{@var{var}=@var{literal}@}} | |
| Solaris 10 @command{/bin/sh} has a frightening bug in its handling of | |
| literal assignments. Imagine you need set a variable to a string containing | |
| @samp{@}}. This @samp{@}} character confuses Solaris 10 @command{/bin/sh} | |
| when the affected variable was already set. This bug can be exercised | |
| by running: | |
| @example | |
| $ @kbd{unset foo} | |
| $ @kbd{foo=$@{foo='@}'@}} | |
| $ @kbd{echo $foo} | |
| @} | |
| $ @kbd{foo=$@{foo='@}' # no error; this hints to what the bug is} | |
| $ @kbd{echo $foo} | |
| @} | |
| $ @kbd{foo=$@{foo='@}'@}} | |
| $ @kbd{echo $foo} | |
| @}@} | |
| ^ ugh! | |
| @end example | |
| It seems that @samp{@}} is interpreted as matching @samp{$@{}, even | |
| though it is enclosed in single quotes. The problem doesn't happen | |
| using double quotes, or when using a temporary variable holding the | |
| problematic string. | |
| @item $@{@var{var}=@var{expanded-value}@} | |
| @cindex @code{$@{@var{var}=@var{expanded-value}@}} | |
| On shells so old that they are no longer relevant, the command | |
| @example | |
| # Set the shell variable to a default value | |
| # if it is not already set. | |
| : $@{var="$default"@} | |
| @end example | |
| @noindent | |
| misbehaved badly in some cases. Older scripts worked around the bugs by | |
| using one of following two lines, the latter of which was more portable: | |
| @example | |
| var=$@{var="$default"@} | |
| test $@{var+y@} || var=$default | |
| @end example | |
| @noindent | |
| However, these workarounds are no longer needed. | |
| @item $@{#@var{var}@} | |
| @itemx $@{@var{var}%@var{word}@} | |
| @itemx $@{@var{var}%%@var{word}@} | |
| @itemx $@{@var{var}#@var{word}@} | |
| @itemx $@{@var{var}##@var{word}@} | |
| @cindex @code{$@{#@var{var}@}} | |
| @cindex @code{$@{@var{var}%@var{word}@}} | |
| @cindex @code{$@{@var{var}%%@var{word}@}} | |
| @cindex @code{$@{@var{var}#@var{word}@}} | |
| @cindex @code{$@{@var{var}##@var{word}@}} | |
| POSIX requires support for these usages, but they do not work with many | |
| traditional shells, e.g., Solaris 10 @command{/bin/sh}. | |
| Also, @command{pdksh} 5.2.14 mishandles some @var{word} forms. For | |
| example if @samp{$1} is @samp{a/b} and @samp{$2} is @samp{a}, then | |
| @samp{$@{1#$2@}} should yield @samp{/b}, but with @command{pdksh} it | |
| yields the empty string. | |
| @item `@var{commands}` | |
| @cindex @code{`@var{commands}`} | |
| @cindex Command Substitution | |
| POSIX requires shells to trim all trailing newlines from command | |
| output before substituting it, so assignments like | |
| @samp{dir=`printf '%s\n' "$file" | tr a A`} do not work as expected if | |
| @samp{$file} ends in a newline. | |
| While in general it makes no sense, do not substitute a single builtin | |
| with side effects, because Ash 0.2, trying to optimize, does not fork a | |
| subshell to perform the command. | |
| For instance, if you wanted to check that @command{cd} is silent, do not | |
| use @samp{test -z "`cd /`"} because the following can happen: | |
| @example | |
| $ @kbd{pwd} | |
| /tmp | |
| $ @kbd{test -z "`cd /`" && pwd} | |
| / | |
| @end example | |
| @noindent | |
| The result of @samp{foo=`exit 1`} is left as an exercise to the reader. | |
| The MSYS shell leaves a stray byte in the expansion of a double-quoted | |
| command substitution of a native program, if the end of the substitution | |
| is not aligned with the end of the double quote. This may be worked | |
| around by inserting another pair of quotes: | |
| @example | |
| $ @kbd{echo "`printf 'foo\r\n'` bar" > broken} | |
| $ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken} | |
| - broken differ: char 4, line 1 | |
| @end example | |
| Upon interrupt or SIGTERM, some shells may abort a command substitution, | |
| replace it with a null string, and wrongly evaluate the enclosing | |
| command before entering the trap or ending the script. This can lead to | |
| spurious errors: | |
| @example | |
| $ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'} | |
| $ @kbd{^C} | |
| sh: test: hi: unexpected operator/operand | |
| @end example | |
| @noindent | |
| You can avoid this by assigning the command substitution to a temporary | |
| variable: | |
| @example | |
| $ @kbd{sh -c 'res=`sleep 5; echo hi` | |
| if test "x$res" = xhi; then echo yes; fi'} | |
| $ @kbd{^C} | |
| @end example | |
| @item $(@var{commands}) | |
| @cindex @code{$(@var{commands})} | |
| This construct is meant to replace @samp{`@var{commands}`}, | |
| and it has most of the problems listed under @code{`@var{commands}`}. | |
| This construct can be | |
| nested while this is impossible to do portably with back quotes. | |
| Although it is almost universally supported, unfortunately Solaris 10 | |
| and earlier releases lack it: | |
| @example | |
| $ @kbd{showrev -c /bin/sh | grep version} | |
| Command version: SunOS 5.10 Generic 142251-02 Sep 2010 | |
| $ @kbd{echo $(echo blah)} | |
| syntax error: `(' unexpected | |
| @end example | |
| If you do use @samp{$(@var{commands})}, make sure that the commands | |
| do not start with a parenthesis, as that would cause confusion with | |
| a different notation @samp{$((@var{expression}))} that in modern | |
| shells is an arithmetic expression not a command. To avoid the | |
| confusion, insert a space between the two opening parentheses. | |
| Avoid @var{commands} that contain unbalanced parentheses in | |
| here-documents, comments, or case statement patterns, as many shells | |
| mishandle them. For example, Bash 3.1, @samp{ksh88}, @command{pdksh} | |
| 5.2.14, and Zsh 4.2.6 all mishandle the following valid command: | |
| @example | |
| echo $(case x in x) echo hello;; esac) | |
| @end example | |
| @item $((@var{expression})) | |
| @cindex @code{$((@var{expression}))} | |
| Arithmetic expansion is not portable as some shells (most | |
| notably Solaris 10 @command{/bin/sh}) don't support it. | |
| Among shells that do support @samp{$(( ))}, not all of them obey the | |
| POSIX rule that octal and hexadecimal constants must be recognized: | |
| @example | |
| $ @kbd{bash -c 'echo $(( 010 + 0x10 ))'} | |
| 24 | |
| $ @kbd{zsh -c 'echo $(( 010 + 0x10 ))'} | |
| 26 | |
| $ @kbd{zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'} | |
| 24 | |
| $ @kbd{pdksh -c 'echo $(( 010 + 0x10 ))'} | |
| pdksh: 010 + 0x10 : bad number `0x10' | |
| $ @kbd{pdksh -c 'echo $(( 010 ))'} | |
| 10 | |
| @end example | |
| When it is available, using arithmetic expansion provides a noticeable | |
| speedup in script execution; but testing for support requires | |
| @command{eval} to avoid syntax errors. The following construct is used | |
| by @code{AS_VAR_ARITH} to provide arithmetic computation when all | |
| arguments are decimal integers without leading zeros, and all | |
| operators are properly quoted and appear as distinct arguments: | |
| @example | |
| if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then | |
| eval 'func_arith () | |
| @{ | |
| func_arith_result=$(( $* )) | |
| @}' | |
| else | |
| func_arith () | |
| @{ | |
| func_arith_result=`expr "$@@"` | |
| @} | |
| fi | |
| func_arith 1 + 1 | |
| foo=$func_arith_result | |
| @end example | |
| @item ^ | |
| @cindex @code{^} quoting | |
| Always quote @samp{^}, otherwise traditional shells such as | |
| @command{/bin/sh} on Solaris 10 treat this like @samp{|}. | |
| @end table | |
| @node Assignments | |
| @section Assignments | |
| @cindex Shell assignments | |
| When setting several variables in a row, be aware that the order of the | |
| evaluation is undefined. For instance @samp{foo=1 foo=2; echo $foo} | |
| gives @samp{1} with Solaris 10 @command{/bin/sh}, but @samp{2} with Bash. | |
| You must use | |
| @samp{;} to enforce the order: @samp{foo=1; foo=2; echo $foo}. | |
| Don't rely on the following to find @file{subdir/program}: | |
| @example | |
| PATH=subdir$PATH_SEPARATOR$PATH program | |
| @end example | |
| @noindent | |
| as this does not work with Zsh 3.0.6. Use something like this | |
| instead: | |
| @example | |
| (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program) | |
| @end example | |
| Don't rely on the exit status of an assignment: Ash 0.2 does not change | |
| the status and propagates that of the last statement: | |
| @example | |
| $ @kbd{false || foo=bar; echo $?} | |
| 1 | |
| $ @kbd{false || foo=`:`; echo $?} | |
| 0 | |
| @end example | |
| @noindent | |
| and to make things even worse, QNX 4.25 just sets the exit status | |
| to 0 in any case: | |
| @example | |
| $ @kbd{foo=`exit 1`; echo $?} | |
| 0 | |
| @end example | |
| To assign default values, follow this algorithm: | |
| @enumerate | |
| @item | |
| If the default value is a literal and does not contain any closing | |
| brace, use: | |
| @example | |
| : "$@{var='my literal'@}" | |
| @end example | |
| @item | |
| If the default value contains no closing brace, has to be expanded, and | |
| the variable being initialized is not intended to be IFS-split | |
| (i.e., it's not a list), then use: | |
| @example | |
| : $@{var="$default"@} | |
| @end example | |
| @item | |
| If the default value contains no closing brace, has to be expanded, and | |
| the variable being initialized is intended to be IFS-split (i.e., it's a list), | |
| then use: | |
| @example | |
| var=$@{var="$default"@} | |
| @end example | |
| @item | |
| If the default value contains a closing brace, then use: | |
| @example | |
| test $@{var+y@} || var="has a '@}'" | |
| @end example | |
| @end enumerate | |
| In most cases @samp{var=$@{var="$default"@}} is fine, but in case of | |
| doubt, just use the last form. @xref{Shell Substitutions}, items | |
| @samp{$@{@var{var}:-@var{value}@}} and @samp{$@{@var{var}=@var{value}@}} | |
| for the rationale. | |
| @node Parentheses | |
| @section Parentheses in Shell Scripts | |
| @cindex Shell parentheses | |
| Beware of two opening parentheses in a row, as many shell | |
| implementations treat them specially, and POSIX says that a portable | |
| script cannot use @samp{((} outside the @samp{$((} form used for shell | |
| arithmetic. In traditional shells, @samp{((cat))} behaves like | |
| @samp{(cat)}; but many shells, including | |
| Bash and the Korn shell, treat @samp{((cat))} as an arithmetic | |
| expression equivalent to @samp{let "cat"}, and may or may not report an | |
| error when they detect that @samp{cat} is not a number. As another | |
| example, @samp{pdksh} 5.2.14 does not treat the following code | |
| as a traditional shell would: | |
| @example | |
| if ((true) || false); then | |
| echo ok | |
| fi | |
| @end example | |
| @noindent | |
| To work around this problem, insert a space between the two opening | |
| parentheses. There is a similar problem and workaround with | |
| @samp{$((}; see @ref{Shell Substitutions}. | |
| @node Special Shell Variables | |
| @section Special Shell Variables | |
| @cindex Shell variables | |
| @cindex Special shell variables | |
| Some shell variables should not be used, since they can have a deep | |
| influence on the behavior of the shell. In order to recover a sane | |
| behavior from the shell, some variables should be unset; M4sh takes | |
| care of this and provides fallback values, whenever needed, to cater | |
| for a very old @file{/bin/sh} that does not support @command{unset}. | |
| (@pxref{Portable Shell, , Portable Shell Programming}). | |
| As a general rule, shell variable names containing a lower-case letter | |
| are safe; you can define and use these variables without worrying about | |
| their effect on the underlying system, and without worrying about | |
| whether the shell changes them unexpectedly. (The exception is the | |
| shell variable @code{status}, as described below.) | |
| Here is a list of names that are known to cause trouble. This list is | |
| not exhaustive, but you should be safe if you avoid the name | |
| @code{status} and names containing only upper-case letters and | |
| underscores. | |
| @c Alphabetical order, case insensitive, 'A' before 'a'. | |
| @table @code | |
| @item ? | |
| Not all shells correctly reset @samp{$?} after conditionals (@pxref{if, | |
| , Limitations of Shell Builtins}). Not all shells manage @samp{$?} | |
| correctly in shell functions (@pxref{Shell Functions}) or in traps | |
| (@pxref{trap, , Limitations of Shell Builtins}). Not all shells reset | |
| @samp{$?} to zero after an empty command. | |
| @example | |
| $ @kbd{bash -c 'false; $empty; echo $?'} | |
| 0 | |
| $ @kbd{zsh -c 'false; $empty; echo $?'} | |
| 1 | |
| @end example | |
| @item _ | |
| @evindex _ | |
| Many shells reserve @samp{$_} for various purposes, e.g., the name of | |
| the last command executed. | |
| @item CDPATH | |
| @evindex CDPATH | |
| When this variable is set it specifies a list of directories to search | |
| when invoking @code{cd} with a relative file name that did not start | |
| with @samp{./} or @samp{../}. POSIX | |
| says that if a nonempty directory name from @env{CDPATH} | |
| is used successfully, @code{cd} prints the resulting absolute | |
| file name. Unfortunately this output can break idioms like | |
| @samp{abs=`cd src && pwd`} because @code{abs} receives the name twice. | |
| Also, many shells do not conform to this part of POSIX; for | |
| example, @command{zsh} prints the result only if a directory name | |
| other than @file{.} was chosen from @env{CDPATH}. | |
| In practice the shells that have this problem also support | |
| @command{unset}, so you can work around the problem as follows: | |
| @example | |
| (unset CDPATH) >/dev/null 2>&1 && unset CDPATH | |
| @end example | |
| You can also avoid output by ensuring that your directory name is | |
| absolute or anchored at @samp{./}, as in @samp{abs=`cd ./src && pwd`}. | |
| Configure scripts use M4sh, which automatically unsets @env{CDPATH} if | |
| possible, so you need not worry about this problem in those scripts. | |
| @item CLICOLOR_FORCE | |
| @evindex CLICOLOR_FORCE | |
| When this variable is set, some implementations of tools like | |
| @command{ls} attempt to add color to their output via terminal escape | |
| sequences, even when the output is not directed to a terminal, and can | |
| thus cause spurious failures in scripts. Configure scripts use M4sh, | |
| which automatically unsets this variable. | |
| @item DUALCASE | |
| @evindex DUALCASE | |
| In the MKS shell, case statements and file name generation are | |
| case-insensitive unless @env{DUALCASE} is nonzero. | |
| Autoconf-generated scripts export this variable when they start up. | |
| @item ENV | |
| @itemx MAIL | |
| @itemx MAILPATH | |
| @itemx PS1 | |
| @itemx PS2 | |
| @itemx PS4 | |
| @evindex ENV | |
| @evindex MAIL | |
| @evindex MAILPATH | |
| @evindex PS1 | |
| @evindex PS2 | |
| @evindex PS4 | |
| These variables should not matter for shell scripts, since they are | |
| supposed to affect only interactive shells. However, at least one | |
| shell (the pre-3.0 UWIN Korn shell) gets confused about | |
| whether it is interactive, which means that (for example) a @env{PS1} | |
| with a side effect can unexpectedly modify @samp{$?}. To work around | |
| this bug, M4sh scripts (including @file{configure} scripts) do something | |
| like this: | |
| @example | |
| (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH | |
| PS1='$ ' | |
| PS2='> ' | |
| PS4='+ ' | |
| @end example | |
| @noindent | |
| (actually, there is some complication due to bugs in @command{unset}; | |
| @pxref{unset, , Limitations of Shell Builtins}). | |
| @item FPATH | |
| @evindex FPATH | |
| The Korn shell uses @env{FPATH} to find shell functions, so avoid | |
| @env{FPATH} in portable scripts. @env{FPATH} is consulted after | |
| @env{PATH}, but you still need to be wary of tests that use @env{PATH} | |
| to find whether a command exists, since they might report the wrong | |
| result if @env{FPATH} is also set. | |
| @item GREP_OPTIONS | |
| @evindex GREP_OPTIONS | |
| When this variable is set, some implementations of @command{grep} honor | |
| these options, even if the options include direction to enable colored | |
| output via terminal escape sequences, and the result can cause spurious | |
| failures when the output is not directed to a terminal. Configure | |
| scripts use M4sh, which automatically unsets this variable. | |
| @item HOME | |
| @evindex HOME | |
| Strange things can happen if @env{HOME} is unset or empty. | |
| For example, plain @command{cd} (with no arguments) has unspecified behavior. | |
| Also, @env{HOME} should be absolute, not relative. | |
| @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 OLDPWD | |
| @evindex OLDPWD | |
| POSIX requires that @command{cd} must update the @env{OLDPWD} | |
| environment variable, if set, to point to the name of the previous | |
| directory, but Solaris 10 @command{/bin/sh} does not support this. | |
| @item options | |
| @evindex options | |
| For @command{zsh} 4.3.10, @env{options} is treated as an associative | |
| array even after @code{emulate sh}, so it should not be used. | |
| @item PATH_SEPARATOR | |
| @evindex PATH_SEPARATOR | |
| On DJGPP systems, the @env{PATH_SEPARATOR} environment | |
| variable can be set to either @samp{:} or @samp{;} to control the path | |
| separator Bash uses to set up certain environment variables (such as | |
| @env{PATH}). You can set this variable to @samp{;} if you want | |
| @command{configure} to use @samp{;} as a separator; this might be useful | |
| if you plan to use non-POSIX shells to execute files. @xref{File System | |
| Conventions}, for more information about @code{PATH_SEPARATOR}. | |
| @item POSIXLY_CORRECT | |
| @evindex POSIXLY_CORRECT | |
| In the GNU environment, exporting @env{POSIXLY_CORRECT} with any value | |
| (even empty) causes programs to try harder to conform to POSIX@. | |
| Autoconf does not directly manipulate this variable, but @command{bash} | |
| ties the shell variable @env{POSIXLY_CORRECT} to whether the script is | |
| running in POSIX mode. Therefore, take care when exporting or unsetting | |
| this variable, so as not to change whether @command{bash} is in POSIX | |
| mode. | |
| @example | |
| $ @kbd{bash --posix -c 'set -o | grep posix} | |
| > @kbd{unset POSIXLY_CORRECT} | |
| > @kbd{set -o | grep posix'} | |
| posix on | |
| posix off | |
| @end example | |
| @item PWD | |
| @evindex PWD | |
| POSIX requires that @command{cd} | |
| must update the @env{PWD} environment variable to point | |
| to the name of the current directory, but traditional shells | |
| do not support this. This can cause confusion if one shell instance | |
| maintains @env{PWD} but a subsidiary and different shell does not know | |
| about @env{PWD} and executes @command{cd}; in this case @env{PWD} | |
| points to the wrong directory. Use @samp{`pwd`} rather than | |
| @samp{$PWD}. | |
| @item RANDOM | |
| @evindex RANDOM | |
| Many shells provide @code{RANDOM}, a variable that returns a different | |
| integer each time it is used. It is common | |
| practice to use @code{$RANDOM} as part of a file name, but code | |
| shouldn't rely on @code{$RANDOM} expanding to a nonempty string. | |
| @item status | |
| @evindex status | |
| This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6), | |
| hence read-only. Do not use it. | |
| @end table | |
| @node Shell Functions | |
| @section Shell Functions | |
| @cindex Shell Functions | |
| Nowadays, it is difficult to find a shell that does not support | |
| shell functions at all. However, some differences should be expected. | |
| When declaring a shell function, you must include whitespace between the | |
| @samp{)} after the function name and the start of the compound | |
| expression, to avoid upsetting @command{ksh}. While it is possible to | |
| use any compound command, most scripts use @samp{@{@dots{}@}}. | |
| @example | |
| $ @kbd{/bin/sh -c 'a()@{ echo hi;@}; a'} | |
| hi | |
| $ @kbd{ksh -c 'a()@{ echo hi;@}; a'} | |
| ksh: syntax error at line 1: `@}' unexpected | |
| $ @kbd{ksh -c 'a() @{ echo hi;@}; a'} | |
| hi | |
| @end example | |
| Inside a shell function, you should not rely on the error status of a | |
| subshell if the last command of that subshell was @code{exit} or | |
| @code{trap}, as this triggers bugs in zsh 4.x; while Autoconf tries to | |
| find a shell that does not exhibit the bug, zsh might be the only shell | |
| present on the user's machine. | |
| Likewise, the state of @samp{$?} is not reliable when entering a shell | |
| function. This has the effect that using a function as the first | |
| command in a @command{trap} handler can cause problems. | |
| @example | |
| $ @kbd{bash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?} | |
| 2 | |
| 2 | |
| $ @kbd{ash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?} | |
| 0 | |
| 2 | |
| @end example | |
| DJGPP bash 2.04 has a bug in that @command{return} from a | |
| shell function which also used a command substitution causes a | |
| segmentation fault. To work around the issue, you can use | |
| @command{return} from a subshell, or @samp{AS_SET_STATUS} as last command | |
| in the execution flow of the function (@pxref{Common Shell Constructs}). | |
| Not all shells treat shell functions as simple commands impacted by | |
| @samp{set -e}, for example with Solaris 10 @command{/bin/sh}: | |
| @example | |
| $ @kbd{bash -c 'f() @{ return 1; @}; set -e; f; echo oops'} | |
| $ @kbd{/bin/sh -c 'f() @{ return 1; @}; set -e; f; echo oops'} | |
| oops | |
| @end example | |
| Shell variables and functions may share the same namespace, for example | |
| with Solaris 10 @command{/bin/sh}: | |
| @example | |
| $ @kbd{f () @{ :; @}; f=; f} | |
| f: not found | |
| @end example | |
| @noindent | |
| For this reason, Autoconf (actually M4sh, @pxref{Programming in M4sh}) | |
| uses the prefix @samp{as_fn_} for its functions. | |
| Handling of positional parameters and shell options varies among shells. | |
| For example, Korn shells reset and restore trace output (@samp{set -x}) | |
| and other options upon function entry and exit. | |
| It is not portable to pass temporary environment variables to shell | |
| functions. Solaris 10 @command{/bin/sh} does not see the variable. | |
| Meanwhile, not all shells follow the POSIX rule that the assignment must | |
| affect the current environment in the same manner as special built-ins. | |
| @example | |
| $ @kbd{/bin/sh -c 'func() @{ echo $a;@}; a=1 func; echo $a'} | |
| @result{} | |
| @result{} | |
| $ @kbd{ash -c 'func() @{ echo $a;@}; a=1 func; echo $a'} | |
| @result{}1 | |
| @result{} | |
| $ @kbd{bash -c 'set -o posix; func() @{ echo $a;@}; a=1 func; echo $a'} | |
| @result{}1 | |
| @result{}1 | |
| @end example | |
| Some ancient Bourne shell variants with function support did not reset | |
| @samp{$@var{i}, @var{i} >= 0}, upon function exit, so effectively the | |
| arguments of the script were lost after the first function invocation. | |
| It is probably not worth worrying about these shells any more. | |
| With AIX sh, a @command{trap} on 0 installed in a shell function | |
| triggers at function exit rather than at script exit. @xref{trap, , | |
| Limitations of Shell Builtins}. | |
| @node Limitations of Builtins | |
| @section Limitations of Shell Builtins | |
| @cindex Shell builtins | |
| @cindex Limitations of shell builtins | |
| No, no, we are serious: some shells do have limitations! :) | |
| You should always keep in mind that any builtin or command may support | |
| options, and therefore differ in behavior with arguments | |
| starting with a dash. For instance, even the innocent @samp{echo "$word"} | |
| can give unexpected results when @code{word} starts with a dash. To avoid | |
| this problem, use @samp{printf '%s\n' "$word"}. Many of these limitations | |
| can be worked around using M4sh (@pxref{Programming in M4sh}). | |
| @c This table includes things like '@command{test} (files)', so we can't | |
| @c use @table @command. | |
| @table @asis | |
| @item @command{.} | |
| @c -------------- | |
| @prindex @command{.} | |
| Use @command{.} only with regular files (use @samp{test -f}). Bash | |
| 2.03, for instance, chokes on @samp{. /dev/null}. Remember that | |
| @command{.} uses @env{PATH} if its argument contains no slashes. Also, | |
| some shells, including bash 3.2, implicitly append the current directory | |
| to this @env{PATH} search, even though POSIX forbids it. So if you want | |
| to use @command{.} on a file @file{foo} in the current directory, you | |
| must use @samp{. ./foo}. | |
| Not all shells gracefully handle syntax errors within a sourced file. | |
| On one extreme, some non-interactive shells abort the entire script. On | |
| the other, @command{zsh} 4.3.10 has a bug where it fails to react to the | |
| syntax error. | |
| @example | |
| $ @kbd{echo 'fi' > syntax} | |
| $ @kbd{bash -c '. ./syntax; echo $?'} | |
| ./syntax: line 1: syntax error near unexpected token `fi' | |
| ./syntax: line 1: `fi' | |
| 2 | |
| $ @kbd{ash -c '. ./syntax; echo $?'} | |
| ./syntax: 1: Syntax error: "fi" unexpected | |
| $ @kbd{zsh -c '. ./syntax; echo $?'} | |
| ./syntax:1: parse error near `fi' | |
| 0 | |
| @end example | |
| @anchor{!} | |
| @item @command{!} | |
| @c -------------- | |
| @prindex @command{!} | |
| The Unix version 7 shell did not support | |
| negating the exit status of commands with @command{!}, and this feature | |
| is still absent from some shells (e.g., Solaris 10 @command{/bin/sh}). | |
| Other shells, such as FreeBSD @command{/bin/sh} or @command{ash}, have | |
| bugs when using @command{!}: | |
| @example | |
| $ @kbd{sh -c '! : | :'; echo $?} | |
| 1 | |
| $ @kbd{ash -c '! : | :'; echo $?} | |
| 0 | |
| $ @kbd{sh -c '! @{ :; @}'; echo $?} | |
| 1 | |
| $ @kbd{ash -c '! @{ :; @}'; echo $?} | |
| @{: not found | |
| Syntax error: "@}" unexpected | |
| 2 | |
| @end example | |
| Shell code like this: | |
| @example | |
| if ! cmp file1 file2 >/dev/null 2>&1; then | |
| echo files differ or trouble | |
| fi | |
| @end example | |
| is therefore not portable in practice. Typically it is easy to rewrite | |
| such code, e.g.: | |
| @example | |
| cmp file1 file2 >/dev/null 2>&1 || | |
| echo files differ or trouble | |
| @end example | |
| In M4sh, the @code{AS_IF} macro provides an easy way to write these kinds | |
| of conditionals: | |
| @example | |
| AS_IF([cmp -s file file.new], [], | |
| [echo files differ or trouble]) | |
| @end example | |
| This kind of rewriting is needed in code outside macro definitions that | |
| calls other macros. @xref{Common Shell Constructs}. It is also useful | |
| inside macro definitions, where the @dfn{then} and @dfn{else} branches | |
| might contain macro arguments. | |
| More generally, one can always rewrite @samp{! @var{command}} as: | |
| @example | |
| AS_IF([@var{command}], [(exit 1)]) | |
| @end example | |
| @item @command{&&} and @command{||} | |
| @c -------------------------------- | |
| @prindex @command{&&} | |
| @prindex @command{||} | |
| If an AND-OR list is not inside @code{AC_DEFUN}, and it contains | |
| calls to Autoconf macros, it should be rewritten using @code{AS_IF}. | |
| @xref{Common Shell Constructs}. The operators @code{&&} and @code{||} | |
| have equal precedence and are left associative, so instead of: | |
| @example | |
| # This is dangerous outside AC_DEFUN. | |
| cmp a b >/dev/null 2>&1 && | |
| AS_ECHO([files are same]) >$tmpfile || | |
| AC_MSG_NOTICE([files differ, or echo failed]) | |
| @end example | |
| you can use: | |
| @example | |
| # This is OK outside AC_DEFUN. | |
| AS_IF([AS_IF([cmp a b >/dev/null 2>&1], | |
| [AS_ECHO([files are same]) >$tmpfile], | |
| [false])], | |
| [AC_MSG_NOTICE([files differ, or echo failed])]) | |
| @end example | |
| @item @command{@{...@}} | |
| @c -------------------- | |
| @prindex @command{@{...@}} | |
| Bash 3.2 (and earlier versions) sometimes does not properly set | |
| @samp{$?} when failing to write redirected output of a compound command. | |
| This problem is most commonly observed with @samp{@{@dots{}@}}; it does | |
| not occur with @samp{(@dots{})}. For example: | |
| @example | |
| $ @kbd{bash -c '@{ echo foo; @} >/bad; echo $?'} | |
| bash: line 1: /bad: Permission denied | |
| 0 | |
| $ @kbd{bash -c 'while :; do echo; done >/bad; echo $?'} | |
| bash: line 1: /bad: Permission denied | |
| 0 | |
| @end example | |
| To work around the bug, prepend @samp{:;}: | |
| @example | |
| $ @kbd{bash -c ':;@{ echo foo; @} >/bad; echo $?'} | |
| bash: line 1: /bad: Permission denied | |
| 1 | |
| @end example | |
| POSIX requires a syntax error if a brace list has no contents. However, | |
| not all shells obey this rule; and on shells where empty lists are | |
| permitted, the effect on @samp{$?} is inconsistent. To avoid problems, | |
| ensure that a brace list is never empty. | |
| @example | |
| $ @kbd{bash -c 'false; @{ @}; echo $?' || echo $?} | |
| bash: line 1: syntax error near unexpected token `@}' | |
| bash: line 1: `false; @{ @}; echo $?' | |
| 2 | |
| $ @kbd{zsh -c 'false; @{ @}; echo $?' || echo $?} | |
| 1 | |
| $ @kbd{pdksh -c 'false; @{ @}; echo $?' || echo $?} | |
| 0 | |
| @end example | |
| @item @command{break} | |
| @c ------------------ | |
| @prindex @command{break} | |
| The use of @samp{break 2} etc.@: is safe. | |
| @anchor{case} | |
| @item @command{case} | |
| @c ----------------- | |
| @prindex @command{case} | |
| If a @code{case} command is not inside @code{AC_DEFUN}, and it contains | |
| calls to Autoconf macros, it should be rewritten using @code{AS_CASE}. | |
| @xref{Common Shell Constructs}. Instead of: | |
| @example | |
| # This is dangerous outside AC_DEFUN. | |
| case $filename in | |
| *.[ch]) AC_MSG_NOTICE([C source file]);; | |
| esac | |
| @end example | |
| @noindent | |
| use: | |
| @example | |
| # This is OK outside AC_DEFUN. | |
| AS_CASE([$filename], | |
| [[*.[ch]]], [AC_MSG_NOTICE([C source file])]) | |
| @end example | |
| You don't need to quote the argument; no splitting is performed. | |
| You don't need the final @samp{;;}, but you should use it. | |
| POSIX requires support for @code{case} patterns with opening | |
| parentheses like this: | |
| @example | |
| case $file_name in | |
| (*.c) echo "C source code";; | |
| esac | |
| @end example | |
| @noindent | |
| but the @code{(} in this example is not portable to a few obsolescent Bourne | |
| shell implementations, which is a pity for those of us using tools that | |
| rely on balanced parentheses. For instance, with Solaris 10 | |
| @command{/bin/sh}: | |
| @example | |
| $ @kbd{case foo in (foo) echo foo;; esac} | |
| @error{}syntax error: `(' unexpected | |
| @end example | |
| @noindent | |
| The leading @samp{(} can be omitted safely. Unfortunately, there are | |
| contexts where unbalanced parentheses cause other problems, such as when | |
| using a syntax-highlighting editor that searches for the balancing | |
| counterpart, or more importantly, when using a case statement as an | |
| underquoted argument to an Autoconf macro. @xref{Balancing | |
| Parentheses}, for trade-offs involved in various styles of dealing with | |
| unbalanced @samp{)}. | |
| Zsh handles pattern fragments derived from parameter expansions or | |
| command substitutions as though quoted: | |
| @example | |
| $ pat=\?; case aa in ?$pat) echo match;; esac | |
| $ pat=\?; case a? in ?$pat) echo match;; esac | |
| match | |
| @end example | |
| @noindent | |
| Because of a bug in its @code{fnmatch}, Bash fails to properly | |
| handle backslashes in character classes: | |
| @example | |
| bash-2.02$ @kbd{case /tmp in [/\\]*) echo OK;; esac} | |
| bash-2.02$ | |
| @end example | |
| @noindent | |
| This is extremely unfortunate, since you are likely to use this code to | |
| handle POSIX or MS-DOS absolute file names. To work around this | |
| bug, always put the backslash first: | |
| @example | |
| bash-2.02$ @kbd{case '\TMP' in [\\/]*) echo OK;; esac} | |
| OK | |
| bash-2.02$ @kbd{case /tmp in [\\/]*) echo OK;; esac} | |
| OK | |
| @end example | |
| Many Bourne shells cannot handle closing brackets in character classes | |
| correctly. | |
| Some shells also have problems with backslash escaping in case you do not want | |
| to match the backslash: both a backslash and the escaped character match this | |
| pattern. To work around this, specify the character class in a variable, so | |
| that quote removal does not apply afterwards, and the special characters don't | |
| have to be backslash-escaped: | |
| @example | |
| $ @kbd{case '\' in [\<]) echo OK;; esac} | |
| OK | |
| $ @kbd{scanset='[<]'; case '\' in $scanset) echo OK;; esac} | |
| $ | |
| @end example | |
| Even with this, Solaris @command{ksh} matches a backslash if the set | |
| contains any | |
| of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}. | |
| Some shells, such as Ash 0.3.8, are confused by an empty | |
| @code{case}/@code{esac}: | |
| @example | |
| ash-0.3.8 $ @kbd{case foo in esac;} | |
| @error{}Syntax error: ";" unexpected (expecting ")") | |
| @end example | |
| POSIX requires @command{case} to give an exit status of 0 if no cases | |
| match. However, @command{/bin/sh} in Solaris 10 does not obey this | |
| rule. Meanwhile, it is unclear whether a case that matches, but | |
| contains no statements, must also change the exit status to 0. The M4sh | |
| macro @code{AS_CASE} works around these inconsistencies. | |
| @example | |
| $ @kbd{bash -c 'case `false` in ?) ;; esac; echo $?'} | |
| 0 | |
| $ @kbd{/bin/sh -c 'case `false` in ?) ;; esac; echo $?'} | |
| 255 | |
| @end example | |
| @item @command{cd} | |
| @c --------------- | |
| @prindex @command{cd} | |
| POSIX requires that @command{cd} must support | |
| the @option{-L} (``logical'') and @option{-P} (``physical'') options, | |
| with @option{-L} being the default. However, traditional shells do | |
| not support these options, and their @command{cd} command has the | |
| @option{-P} behavior. | |
| Portable scripts should assume neither option is supported, and should | |
| assume neither behavior is the default. This can be a bit tricky, | |
| since the POSIX default behavior means that, for example, | |
| @samp{ls ..} and @samp{cd ..} may refer to different directories if | |
| the current logical directory is a symbolic link. It is safe to use | |
| @code{cd @var{dir}} if @var{dir} contains no @file{..} components. | |
| Also, Autoconf-generated scripts check for this problem when computing | |
| variables like @code{ac_top_srcdir} (@pxref{Configuration Actions}), | |
| so it is safe to @command{cd} to these variables. | |
| POSIX specifies an @option{-e} option that affects the exit status | |
| when the @option{-P} option is in effect. Portable scripts should | |
| avoid it for the same reason they avoid @option{-P}. | |
| @evindex OLDPWD | |
| @evindex PWD | |
| POSIX says that a successful @command{cd} updates the values of the | |
| @env{OLDPWD} and @env{PWD} variables, and that @command{cd -} acts like | |
| @command{cd "$OLDPWD"}. Older shells, such as Solaris 10 | |
| @command{/bin/sh}, do not support this and portable scripts should not | |
| rely on it. | |
| @evindex HOME | |
| If @env{HOME} is unset or empty, the behavior of @command{cd} with no | |
| arguments is implementation-defined, so portable scripts should avoid it | |
| in that case. | |
| POSIX 1003.1-2024 states that @command{cd} must fail if given an | |
| explicit empty argument. However, earlier POSIX editions did not | |
| specify the behavior and 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. | |
| If @command{cd} fails, POSIX requires the invoking shell to behave as if | |
| @command{cd} exited with status 1, which means the invoking shell can continue. | |
| However, Solaris 10 @command{/bin/sh} aborts the containing command if | |
| interactive, and exits otherwise. | |
| @xref{Special Shell Variables}, for portability problems involving | |
| @command{cd} and the @env{CDPATH} environment variable. | |
| Also please see the discussion of the @command{pwd} command. | |
| @anchor{echo} | |
| @item @command{echo} | |
| @c ----------------- | |
| @prindex @command{echo} | |
| The simple @command{echo} is probably the most surprising source of | |
| portability troubles. It is not possible to use @samp{echo} portably | |
| unless both options and escape sequences are omitted. | |
| Do not use options, as some shells support them and others do not. | |
| For example, POSIX says that the behavior of @samp{echo -n foo} is | |
| implementation-defined. On some platforms the output is @samp{foo} | |
| without a trailing newline, on others it is @samp{-n foo} with a | |
| trailing newline, and POSIX allows even other behavior. | |
| Do not use backslashes in the arguments, as there is no consensus on | |
| their handling. For @samp{echo '\n' | wc -l}, the @command{sh} of | |
| Solaris 10 outputs 2, | |
| but Bash and Zsh (in @command{sh} emulation mode) output 1. | |
| The problem is truly @command{echo}: all the shells | |
| understand @samp{'\n'} as the string composed of a backslash and an | |
| @samp{n}. | |
| Because of these problems, do not pass a string containing arbitrary | |
| characters to @command{echo}. For example, @samp{echo "$foo"} is safe | |
| only if you know that @var{foo}'s value cannot contain backslashes and | |
| cannot start with @samp{-}. | |
| Normally, @command{printf} is safer and easier to use than @command{echo} | |
| and @command{echo -n}. Thus, you should use @command{printf '%s\n'} | |
| instead of @command{echo}, and similarly use @command{printf %s} instead | |
| of @command{echo -n}. | |
| Older scripts, written before @command{printf} was portable, | |
| sometimes used a here-document as a safer alternative to @command{echo}, | |
| like this: | |
| @example | |
| cat <<EOF | |
| $foo | |
| EOF | |
| @end example | |
| @noindent | |
| However, this usage is problematic, as even some modern shells have | |
| hard-to-reproduce bugs when dealing with here-documents. | |
| @item @command{eval} | |
| @c ----------------- | |
| @prindex @command{eval} | |
| The @command{eval} command is useful in limited circumstances, e.g., | |
| using commands like @samp{eval table_$key=\$value} and @samp{eval | |
| value=table_$key} to simulate a hash table when the key is known to be | |
| alphanumeric. | |
| You should also be wary of common bugs in @command{eval} implementations. | |
| In some shell implementations (e.g., older @command{ash}, OpenBSD 3.8 | |
| @command{sh}, @command{pdksh} v5.2.14 99/07/13.2, and @command{zsh} | |
| 4.2.5), the arguments of @samp{eval} are evaluated in a context where | |
| @samp{$?} is 0, so they exhibit behavior like this: | |
| @example | |
| $ @kbd{false; eval 'echo $?'} | |
| 0 | |
| @end example | |
| The correct behavior here is to output a nonzero value, | |
| but portable scripts should not rely on this. | |
| You should not rely on @code{LINENO} within @command{eval}. | |
| @xref{Special Shell Variables}. | |
| Note that, even though these bugs are easily avoided, | |
| @command{eval} is tricky to use on arbitrary arguments. | |
| It is obviously unwise to use @samp{eval $cmd} if the string value of | |
| @samp{cmd} was derived from an untrustworthy source. But even if the | |
| string value is valid, @samp{eval $cmd} might not work as intended, | |
| since it causes field splitting and file name expansion to occur twice, | |
| once for the @command{eval} and once for the command itself. It is | |
| therefore safer to use @samp{eval "$cmd"}. For example, if @var{cmd} | |
| has the value @samp{cat test?.c}, @samp{eval $cmd} might expand to the | |
| equivalent of @samp{cat test;.c} if there happens to be a file named | |
| @file{test;.c} in the current directory; and this in turn | |
| mistakenly attempts to invoke @command{cat} on the file @file{test} and | |
| then execute the command @command{.c}. To avoid this problem, use | |
| @samp{eval "$cmd"} rather than @samp{eval $cmd}. | |
| However, suppose that you want to output the text of the evaluated | |
| command just before executing it. Assuming the previous example, | |
| @samp{printf '%s\n' "Executing: $cmd"} outputs @samp{Executing: cat test?.c}, | |
| but this output doesn't show the user that @samp{test;.c} is the actual | |
| name of the copied file. | |
| Conversely, @samp{printf 'Executing:'; eval "printf ' %s' $cmd"; printf '\n'} | |
| works on this example, but it fails with @samp{cmd='cat foo >bar'}, | |
| since it mistakenly replaces the contents of @file{bar} by the | |
| string @samp{ cat foo}. No simple, general, and portable solution to | |
| this problem is known. | |
| @item @command{exec} | |
| @c ----------------- | |
| @prindex @command{exec} | |
| POSIX describes several categories of shell built-ins. Special | |
| built-ins (such as @command{exit}) must impact the environment of the | |
| current shell, and need not be available through @command{exec}. All | |
| other built-ins are regular, and must not propagate variable assignments | |
| to the environment of the current shell. However, the group of regular | |
| built-ins is further distinguished by commands that do not require a | |
| @env{PATH} search (such as @command{cd}), in contrast to built-ins that | |
| are offered as a more efficient version of something that must still be | |
| found in a @env{PATH} search (such as @command{echo}). POSIX is not | |
| clear on whether @command{exec} must work with the list of 17 utilities | |
| that are invoked without a @env{PATH} search, and many platforms lack an | |
| executable for some of those built-ins: | |
| @example | |
| $ @kbd{sh -c 'exec cd /tmp'} | |
| sh: line 0: exec: cd: not found | |
| @end example | |
| All other built-ins that provide utilities specified by POSIX must have | |
| a counterpart executable that exists on @env{PATH}, although POSIX | |
| allows @command{exec} to use the built-in instead of the executable. | |
| For example, contrast @command{bash} 3.2 and @command{pdksh} 5.2.14: | |
| @example | |
| $ @kbd{bash -c 'pwd --version' | head -n1} | |
| bash: line 0: pwd: --: invalid option | |
| pwd: usage: pwd [-LP] | |
| $ @kbd{bash -c 'exec pwd --version' | head -n1} | |
| pwd (GNU coreutils) 6.10 | |
| $ @kbd{pdksh -c 'exec pwd --version' | head -n1} | |
| pdksh: pwd: --: unknown option | |
| @end example | |
| When it is desired to avoid a regular shell built-in, the workaround is | |
| to use some other forwarding command, such as @command{env} or | |
| @command{nice}, that will ensure a path search: | |
| @example | |
| $ @kbd{pdksh -c 'exec true --version' | head -n1} | |
| $ @kbd{pdksh -c 'nice true --version' | head -n1} | |
| true (GNU coreutils) 6.10 | |
| $ @kbd{pdksh -c 'env true --version' | head -n1} | |
| true (GNU coreutils) 6.10 | |
| @end example | |
| @item @command{exit} | |
| @c ----------------- | |
| @prindex @command{exit} | |
| The default value of @command{exit} is supposed to be @code{$?}; | |
| unfortunately, some shells, such as the DJGPP port of Bash 2.04, just | |
| perform @samp{exit 0}. | |
| @example | |
| bash-2.04$ @kbd{foo=`exit 1` || echo fail} | |
| fail | |
| bash-2.04$ @kbd{foo=`(exit 1)` || echo fail} | |
| fail | |
| bash-2.04$ @kbd{foo=`(exit 1); exit` || echo fail} | |
| bash-2.04$ | |
| @end example | |
| Using @samp{exit $?} restores the expected behavior. | |
| Some shell scripts, such as those generated by @command{autoconf}, use a | |
| trap to clean up before exiting. If the last shell command exited with | |
| nonzero status, the trap also exits with nonzero status so that the | |
| invoker can tell that an error occurred. | |
| Unfortunately, in some shells, such as Solaris 10 @command{/bin/sh}, an exit | |
| trap ignores the @code{exit} command's argument. In these shells, a trap | |
| cannot determine whether it was invoked by plain @code{exit} or by | |
| @code{exit 1}. Instead of calling @code{exit} directly, use the | |
| @code{AC_MSG_ERROR} macro that has a workaround for this problem. | |
| @anchor{export} | |
| @item @command{export} | |
| @c ------------------- | |
| @prindex @command{export} | |
| The builtin @command{export} dubs a shell variable @dfn{environment | |
| variable}. Each update of exported variables corresponds to an update | |
| of the environment variables. Conversely, each environment variable | |
| received by the shell when it is launched should be imported as a shell | |
| variable marked as exported. | |
| Alas, some older shells, such as Solaris 10 @command{/bin/sh}, forget to | |
| @command{export} the environment variables they receive. As a result, | |
| two variables coexist: the environment variable and the shell | |
| variable. The following code demonstrates this failure: | |
| @example | |
| #!/bin/sh | |
| echo $FOO | |
| FOO=bar | |
| echo $FOO | |
| exec /bin/sh $0 | |
| @end example | |
| @noindent | |
| when run with @samp{FOO=foo} in the environment, these shells print | |
| alternately @samp{foo} and @samp{bar}, although they should print only | |
| @samp{foo} and then a sequence of @samp{bar}s. | |
| Therefore you should @command{export} again each environment variable | |
| that you update; the export can occur before or after the assignment. | |
| POSIX is not clear on whether the @command{export} of an undefined | |
| variable causes the variable to be defined with the value of an empty | |
| string, or merely marks any future definition of a variable by that name | |
| for export. Various shells behave differently in this regard: | |
| @example | |
| $ @kbd{sh -c 'export foo; env | grep foo'} | |
| $ @kbd{ash -c 'export foo; env | grep foo'} | |
| foo= | |
| @end example | |
| POSIX requires @command{export} to honor assignments made as arguments, | |
| but older shells do not support this, including @command{/bin/sh} in | |
| Solaris 10. Portable scripts should separate assignments and exports | |
| into different statements. | |
| @example | |
| $ @kbd{bash -c 'export foo=bar; echo $foo'} | |
| bar | |
| $ @kbd{/bin/sh -c 'export foo=bar; echo $foo'} | |
| /bin/sh: foo=bar: is not an identifier | |
| $ @kbd{/bin/sh -c 'export foo; foo=bar; echo $foo'} | |
| bar | |
| @end example | |
| POSIX requires @command{export} to work with any arbitrary value for the | |
| contents of the variable being exported, as long as the total size of | |
| the environment combined with arguments doesn't exceed @code{ARG_MAX} | |
| when executing a child process. However, some shells have extensions | |
| that involve interpreting some environment values specially, regardless | |
| of the variable name. We currently know of one case: all versions of | |
| Bash released prior to 27 September 2014 interpret an environment | |
| variable with an initial content substring of @code{() @{} as an | |
| exported function definition (this is the ``Shellshock'' remote | |
| execution bug, CVE-2014-6271 and friends, where it was possible to | |
| exploit the function parser to cause remote code execution on child bash | |
| startup; newer versions of Bash use special environment variable | |
| @emph{names} instead of values to implement the same feature). | |
| There may be entries inherited into the environment that are not valid | |
| as shell variable names; POSIX states that processes should be tolerant | |
| of these names. Some shells such as @command{dash} do this by removing | |
| those names from the environment at startup, while others such as | |
| @command{bash} hide the entry from shell access but still pass it on to | |
| child processes. While you can set such names using @command{env} for a | |
| direct child process, you cannot rely on them being preserved through an | |
| intermediate pass through the shell. | |
| @item @command{false} | |
| @c ------------------ | |
| @prindex @command{false} | |
| Don't expect @command{false} to exit with status 1: in native | |
| Solaris @file{/bin/false} exits with status 255. | |
| @item @command{for} | |
| @c ---------------- | |
| @prindex @command{for} | |
| To loop over positional arguments, use: | |
| @example | |
| for arg | |
| do | |
| printf '%s\n' "$arg" | |
| done | |
| @end example | |
| @noindent | |
| You may @emph{not} leave the @code{do} on the same line as @code{for}, | |
| since some shells improperly grok: | |
| @example | |
| for arg; do | |
| printf '%s\n' "$arg" | |
| done | |
| @end example | |
| If you want to explicitly refer to the positional arguments, use: | |
| @example | |
| for arg in "$@@"; do | |
| printf '%s\n' "$arg" | |
| done | |
| @end example | |
| POSIX requires support for a @command{for} loop with no list after | |
| @code{in}. However, Solaris 10 @command{/bin/sh} treats that as a syntax | |
| error. It is possible to work around this by providing any shell word | |
| that expands to nothing, or by ignoring an obvious sentinel. | |
| @example | |
| $ @kbd{/bin/sh -c 'for a in $empty; do echo hi; done'} | |
| $ @kbd{/bin/sh -c 'for a in ; do echo hi; done'} | |
| /bin/sh: syntax error at line 1: `;' unexpected | |
| @end example | |
| This syntax problem is most frequently encountered in code that goes | |
| through several layers of expansion, such as an m4 macro or makefile | |
| variable used as a list body, where the first layer of expansion (m4 or | |
| make) can end up expanding to nothing in the version handed to the | |
| shell. In the makefile context, one common workaround is to use a shell | |
| variable rather than a make variable as the source of the list. | |
| @example | |
| $ @kbd{cat Makefile} | |
| list = | |
| bad: | |
| @@for arg in $(list); do \ | |
| printf '%s\n' $$arg; \ | |
| done | |
| good: | |
| @@list='$(list)'; \ | |
| for arg in $$list; do \ | |
| printf '%s\n' $$arg; \ | |
| done | |
| $ @kbd{make bad 2&>1 | head -n1} | |
| sh: syntax error at line 1: `;' unexpected | |
| $ @kbd{make bad list='a b'} | |
| a | |
| b | |
| $ @kbd{make good} | |
| $ @kbd{make good list='a b'} | |
| a | |
| b | |
| @end example | |
| In Solaris 10 @command{/bin/sh}, when the list of arguments of a | |
| @command{for} loop starts with @emph{unquoted} tokens looking like | |
| variable assignments, the loop is not executed on those tokens: | |
| @example | |
| $ @kbd{/bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'} | |
| x | |
| e=f | |
| @end example | |
| @noindent | |
| Thankfully, quoting the assignment-like tokens, or starting the list | |
| with other tokens (including unquoted variable expansion that results in | |
| an assignment-like result), avoids the problem, so it is easy to work | |
| around: | |
| @example | |
| $ @kbd{/bin/sh -c 'for v in "a=b"; do echo $v; done'} | |
| a=b | |
| $ @kbd{/bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'} | |
| a=b | |
| c=d | |
| @end example | |
| @anchor{if} | |
| @item @command{if} | |
| @c --------------- | |
| @prindex @command{if} | |
| If an @code{if} command is not inside @code{AC_DEFUN}, and it contains | |
| calls to Autoconf macros, it should be rewritten using @code{AS_IF}. | |
| @xref{Common Shell Constructs}. | |
| Using @code{if ! @dots{}} is not portable. @xref{!,,@command{!} notes}. | |
| Some very old shells did not reset the exit status from an @command{if} | |
| with no @command{else}: | |
| @example | |
| $ @kbd{if (exit 42); then true; fi; echo $?} | |
| 42 | |
| @end example | |
| @noindent | |
| whereas a proper shell should have printed @samp{0}. Although this is no | |
| longer a portability problem, as any shell that supports functions gets it | |
| correct, it explains why some makefiles have lengthy | |
| constructs: | |
| @example | |
| if test -f "$file"; then | |
| install "$file" "$dest" | |
| else | |
| : | |
| fi | |
| @end example | |
| @item @command{printf} | |
| @c ------------------ | |
| @prindex @command{printf} | |
| A format string starting with a @samp{-} can cause problems. | |
| Bash interprets it as an option and | |
| gives an error. And @samp{--} to mark the end of options is not good | |
| in the NetBSD Almquist shell (e.g., 0.4.6) which takes that | |
| literally as the format string. Putting the @samp{-} in a @samp{%c} | |
| or @samp{%s} is probably easiest: | |
| @example | |
| printf %s -foo | |
| @end example | |
| AIX 7.2 @command{sh} mishandles octal escapes in multi-byte locales by | |
| treating them as characters instead of bytes. For example, in a locale | |
| using the UTF-8 encoding, @samp{printf '\351'} outputs the two bytes C3, | |
| A9 (the UTF-8 encoding for U+00E9) instead of the desired single byte E9. | |
| To work around the bug, use the C locale. | |
| Bash 2.03 mishandles an escape sequence that happens to evaluate to @samp{%}: | |
| @example | |
| $ @kbd{printf '\045'} | |
| bash: printf: `%': missing format character | |
| @end example | |
| Large outputs may cause trouble. On Solaris 10, for | |
| example, @file{/usr/bin/printf} is buggy, so when using | |
| @command{/bin/sh} the command @samp{printf %010000x 123} normally dumps | |
| core. | |
| Since @command{printf} is not always a shell builtin, there is a | |
| potential speed penalty for using @code{printf '%s\n'} as a replacement | |
| for an @command{echo} that does not interpret @samp{\} or leading | |
| @samp{-}. With Solaris @command{ksh}, it is possible to use @code{print | |
| -r --} for this role instead. | |
| @xref{echo, , Limitations of Shell Builtins}, for a discussion of | |
| portable alternatives to both @command{printf} and @command{echo}. | |
| @item @command{pwd} | |
| @c ---------------- | |
| @prindex @command{pwd} | |
| With modern shells, plain @command{pwd} outputs a ``logical'' | |
| directory name, some of whose components may be symbolic links. These | |
| directory names are in contrast to ``physical'' directory names, whose | |
| components are all directories. | |
| POSIX requires that @command{pwd} must support | |
| the @option{-L} (``logical'') and @option{-P} (``physical'') options, | |
| with @option{-L} being the default. However, traditional shells do | |
| not support these options, and their @command{pwd} command has the | |
| @option{-P} behavior. | |
| Portable scripts should assume neither option is supported, and should | |
| assume neither behavior is the default. Also, on many hosts | |
| @samp{/bin/pwd} is equivalent to @samp{pwd -P}, but POSIX | |
| does not require this behavior and portable scripts should not rely on | |
| it. | |
| Typically it's best to use plain @command{pwd}. On modern hosts this | |
| outputs logical directory names, which have the following advantages: | |
| @itemize @bullet | |
| @item | |
| Logical names are what the user specified. | |
| @item | |
| Physical names may not be portable from one installation | |
| host to another due to network file system gymnastics. | |
| @item | |
| On modern hosts @samp{pwd -P} may fail due to lack of permissions to | |
| some parent directory, but plain @command{pwd} cannot fail for this | |
| reason. | |
| @end itemize | |
| Also please see the discussion of the @command{cd} command. | |
| @item @command{read} | |
| @c ----------------- | |
| @prindex @command{read} | |
| No options are portable, not even support @option{-r} (Solaris 10 | |
| @command{/bin/sh} for example). | |
| @anchor{set} | |
| @item @command{set} | |
| @c ---------------- | |
| @prindex @command{set} | |
| With the FreeBSD 6.0 shell, the @command{set} command (without | |
| any options) does not sort its output. | |
| The @command{set} builtin faces the usual problem with arguments | |
| starting with a | |
| dash. Modern shells understand @option{--} to specify | |
| the end of the options (any argument after @option{--} is a parameter, | |
| even @samp{-x} for instance), but some ancient shells stop option | |
| processing only after a non-option argument is found. Therefore, use | |
| @samp{dummy} or simply @samp{x} to end the option processing, and use | |
| @command{shift} to pop it out: | |
| @example | |
| set x $my_list; shift | |
| @end example | |
| Avoid @samp{set -}, e.g., @samp{set - $my_list}. POSIX no | |
| longer requires support for this command, and in traditional shells | |
| @samp{set - $my_list} resets the @option{-v} and @option{-x} options, which | |
| makes scripts harder to debug. | |
| Some nonstandard shells do not recognize more than one option | |
| (e.g., @samp{set -e -x} assigns @samp{-x} to the command line). It is | |
| better to combine them: | |
| @example | |
| set -ex | |
| @end example | |
| @cindex @command{set -e} | |
| The @option{-e} option has historically been under-specified, with enough | |
| ambiguities to cause numerous differences across various shell | |
| implementations; see for example | |
| @uref{https://www.in-ulm.de/@/~mascheck/@/various/@/set-e/, this overview}, | |
| or @uref{https://www.austingroupbugs.net/@/view.php?id=52, this link}, | |
| documenting a change to POSIX 2008 to match @command{ksh88} behavior. | |
| Note that mixing @code{set -e} and shell functions is asking for surprises: | |
| @example | |
| set -e | |
| doit() | |
| @{ | |
| rm file | |
| echo one | |
| @} | |
| doit || echo two | |
| @end example | |
| @noindent | |
| According to the recommendation, @samp{one} should always be output | |
| regardless of whether the @command{rm} failed, because it occurs within | |
| the body of the shell function @samp{doit} invoked on the left side of | |
| @samp{||}, where the effects of @samp{set -e} are not enforced. | |
| Likewise, @samp{two} should never be printed, since the failure of | |
| @command{rm} does not abort the function, such that the status of | |
| @samp{doit} is 0. | |
| The BSD shell has had several problems with the @option{-e} | |
| option. Older versions of the BSD | |
| shell (circa 1990) mishandled @samp{&&}, @samp{||}, @samp{if}, and | |
| @samp{case} when @option{-e} was in effect, causing the shell to exit | |
| unexpectedly in some cases. This was particularly a problem with | |
| makefiles, and led to circumlocutions like @samp{sh -c 'test -f file || | |
| touch file'}, where the seemingly-unnecessary @samp{sh -c '@dots{}'} | |
| wrapper works around the bug (@pxref{Failure in Make Rules}). | |
| Even relatively-recent versions of the BSD shell (e.g., OpenBSD 3.4) | |
| wrongly exit with @option{-e} if the last command within a compound | |
| statement fails and is guarded by an @samp{&&} only. For example: | |
| @example | |
| #! /bin/sh | |
| set -e | |
| foo='' | |
| test -n "$foo" && exit 1 | |
| echo one | |
| if :; then | |
| test -n "$foo" && exit 1 | |
| echo two | |
| test -n "$foo" && exit 1 | |
| fi | |
| echo three | |
| @end example | |
| @noindent | |
| does not print @samp{three}. One workaround is to change the last | |
| instance of @samp{test -n "$foo" && exit 1} to be @samp{if test -n | |
| "$foo"; then exit 1; fi} instead. Another possibility is to warn BSD | |
| users not to use @samp{sh -e}. | |
| When @samp{set -e} is in effect, a failed command substitution in | |
| Solaris 10 @command{/bin/sh} cannot be ignored, even with @samp{||}. | |
| @example | |
| $ @kbd{/bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'} | |
| $ @kbd{bash -c 'set -e; foo=`false` || echo foo; echo bar'} | |
| foo | |
| bar | |
| @end example | |
| @noindent | |
| Moreover, a command substitution, successful or not, causes this shell to | |
| exit from a failing outer command even in presence of an @samp{&&} list: | |
| @example | |
| $ @kbd{bash -c 'set -e; false `true` && echo notreached; echo ok'} | |
| ok | |
| $ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'} | |
| $ | |
| @end example | |
| @cindex @command{set -b} | |
| @cindex @command{set -m} | |
| Job control is not provided by all shells, so the use of @samp{set -m} | |
| or @samp{set -b} must be done with care. When using @command{zsh} in | |
| native mode, asynchronous notification (@samp{set -b}) is enabled by | |
| default, and using @samp{emulate sh} to switch to POSIX mode does not | |
| clear this setting (although asynchronous notification has no impact | |
| unless job monitoring is also enabled). Also, @command{zsh} 4.3.10 and | |
| earlier have a bug where job control can be manipulated in interactive | |
| shells, but not in subshells or scripts. Furthermore, some shells, like | |
| @command{pdksh}, fail to treat subshells as interactive, even though the | |
| parent shell was. | |
| @example | |
| $ @kbd{echo $ZSH_VERSION} | |
| 4.3.10 | |
| $ @kbd{set -m; echo $?} | |
| 0 | |
| $ @kbd{zsh -c 'set -m; echo $?'} | |
| set: can't change option: -m | |
| $ @kbd{(set -m); echo $?} | |
| set: can't change option: -m | |
| 1 | |
| $ @kbd{pdksh -ci 'echo $-; (echo $-)'} | |
| cim | |
| c | |
| @end example | |
| @cindex @command{set -n} | |
| Use of @command{set -n} (typically via @command{sh -n script}) to | |
| validate a script is not foolproof. Modern @command{ksh93} tries to be | |
| helpful by informing you about better syntax, but switching the script | |
| to use the suggested syntax in order to silence the warnings would | |
| render the script no longer portable to older shells: | |
| @example | |
| $ @kbd{ksh -nc '``'} | |
| ksh: warning: line 1: `...` obsolete, use $(...) | |
| 0 | |
| @end example | |
| Autoconf | |
| itself uses @command{sh -n} within its testsuite to check that correct | |
| scripts were generated, but only after first probing for other shell | |
| features (such as @code{test $@{BASH_VERSION+y@}}) that indicate | |
| a reasonably fast and working implementation. | |
| @item @command{shift} | |
| @c ------------------ | |
| @prindex @command{shift} | |
| Not only is @command{shift}ing a bad idea when there is nothing left to | |
| shift, but in addition it is not portable: the shell of MIPS | |
| RISC/OS 4.52 refuses to do it. | |
| Don't use @samp{shift 2} etc.; while it in the SVR1 shell (1983), | |
| it is also absent in many pre-POSIX shells. | |
| @item @command{source} | |
| @c ------------------- | |
| @prindex @command{source} | |
| This command is not portable, as POSIX does not require it; use | |
| @command{.} instead. | |
| @item @command{test} | |
| @c ----------------- | |
| @prindex @command{test} | |
| The @code{test} program is the way to perform many file and string | |
| tests. It is often invoked by the alternate name @samp{[}, but using | |
| that name in Autoconf code is asking for trouble since it is an M4 quote | |
| character. | |
| The @option{-a}, @option{-o}, @samp{(}, and @samp{)} operands are not | |
| present in all implementations, and have been marked obsolete by POSIX | |
| 2008. This is because there are inherent ambiguities in using them. | |
| For example, @samp{test "$1" -a "$2"} looks like a binary operator to | |
| check whether two strings are both non-empty, but if @samp{$1} is the | |
| literal @samp{!}, then some implementations of @command{test} treat it | |
| as a negation of the unary operator @option{-a}. | |
| Thus, portable uses of @command{test} should never have more than four | |
| arguments, and scripts should use shell constructs like @samp{&&} and | |
| @samp{||} instead. If you combine @samp{&&} and @samp{||} in the same | |
| statement, keep in mind that they have equal precedence, so it is often | |
| better to parenthesize even when this is redundant. For example: | |
| @smallexample | |
| # Not portable: | |
| test "X$a" = "X$b" -a \ | |
| '(' "X$c" != "X$d" -o "X$e" = "X$f" ')' | |
| # Portable: | |
| test "X$a" = "X$b" && | |
| @{ test "X$c" != "X$d" || test "X$e" = "X$f"; @} | |
| @end smallexample | |
| @command{test} does not process options like most other commands do; for | |
| example, it does not recognize the @option{--} argument as marking the | |
| end of options. | |
| It is safe to use @samp{!} as a @command{test} operator. For example, | |
| @samp{if test ! -d foo; @dots{}} is portable even though @samp{if ! test | |
| -d foo; @dots{}} is not. | |
| @item @command{test} (files) | |
| @c ------------------------- | |
| To enable @command{configure} scripts to support cross-compilation, they | |
| shouldn't do anything that tests features of the build system instead of | |
| the host system. But occasionally you may find it necessary to check | |
| whether some arbitrary file exists. To do so, use @samp{test -f}, | |
| @samp{test -r}, or @samp{test -x}. Do not use @samp{test -e}, because | |
| Solaris 10 @command{/bin/sh} | |
| lacks it. | |
| To test for symbolic links on systems that have them, use | |
| @samp{test -h} rather than @samp{test -L}; either form conforms to | |
| POSIX, but @option{-h} has been around longer. | |
| The commands @samp{test A -ot B} and @samp{test A -nt B} are not reliable | |
| on macOS @command{sh} through at least macOS Sequoia 15.1.1 (2024), | |
| where @samp{test} ignores the subsecond part of file timestamps. | |
| To work around this bug, arrange for the timestamps to be at least one | |
| second apart. | |
| For historical reasons, POSIX reluctantly allows implementations of | |
| @samp{test -x} that will succeed for the root user, even if no execute | |
| permissions are present. Furthermore, shells do not all agree on | |
| whether Access Control Lists should affect @samp{test -r}, @samp{test | |
| -w}, and @samp{test -x}; some shells base test results strictly on the | |
| current user id compared to file owner and mode, as if by | |
| @code{stat(2)}; while other shells base test results on whether the | |
| current user has the given right, even if that right is only granted by | |
| an ACL, as if by @code{faccessat(2)}. Furthermore, there is a classic | |
| time of check to time of use race between any use of @command{test} | |
| followed by operating on the just-checked file. Therefore, it is a good | |
| idea to write scripts that actually attempt an operation, and are | |
| prepared for the resulting failure if permission is denied, rather than | |
| trying to avoid an operation based solely on whether @command{test} | |
| guessed that it might not be permitted. | |
| @item @command{test} (strings) | |
| @c --------------------------- | |
| POSIX says that @samp{test "@var{string}"} succeeds if @var{string} is | |
| not null, but this usage is not portable to traditional platforms like | |
| Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and | |
| @samp{-n}. However, it @emph{is} portable to test if a variable is set | |
| to a non-empty value, by using @samp{test $@{var+y@}}, since all known | |
| implementations properly distinguish between no arguments and a | |
| known-safe string of @samp{y}. | |
| POSIX also says that @samp{test ! "@var{string}"}, | |
| @samp{test -n "@var{string}"} and | |
| @samp{test -z "@var{string}"} work with any string, but some | |
| shells (such as Solaris 10) 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 7.3 @command{/bin/sh} | |
| will invoke the trap at the end of this function. | |
| POSIX says that @samp{trap - 1 2 13 15} resets the traps for the | |
| specified signals to their default values, but many common shells (e.g., | |
| Solaris 10 @command{/bin/sh}) misinterpret this and attempt to execute a | |
| ``command'' named @command{-} when the specified conditions arise. | |
| POSIX 2008 also added a requirement to support @samp{trap 1 2 13 15} to | |
| reset traps, as this is supported by a larger set of shells, but there | |
| are still shells like @command{dash} that mistakenly try to execute | |
| @command{1} instead of resetting the traps. Therefore, there is no | |
| portable workaround, except for @samp{trap - 0}, for which | |
| @samp{trap '' 0} is a portable substitute. | |
| Although POSIX is not absolutely clear on this point, it is widely | |
| admitted that when entering the trap @samp{$?} should be set to the exit | |
| status of the last command run before the trap. The ambiguity can be | |
| summarized as: ``when the trap is launched by an @command{exit}, what is | |
| the @emph{last} command run: that before @command{exit}, or | |
| @command{exit} itself?'' | |
| Bash considers @command{exit} to be the last command, while Zsh and | |
| Solaris 10 @command{/bin/sh} consider that when the trap is run it is | |
| @emph{still} in the @command{exit}, hence it is the previous exit status | |
| that the trap receives: | |
| @example | |
| $ @kbd{cat trap.sh} | |
| trap 'echo $?' 0 | |
| (exit 42); exit 0 | |
| $ @kbd{zsh trap.sh} | |
| 42 | |
| $ @kbd{bash trap.sh} | |
| 0 | |
| @end example | |
| The portable solution is then simple: when you want to @samp{exit 42}, | |
| run @samp{(exit 42); exit 42}, the first @command{exit} being used to | |
| set the exit status to 42 for Zsh, and the second to trigger the trap | |
| and pass 42 as exit status for Bash. In M4sh, this is covered by using | |
| @code{AS_EXIT}. | |
| The shell in FreeBSD 4.0 has the following bug: @samp{$?} is | |
| reset to 0 by empty lines if the code is inside @command{trap}. | |
| @example | |
| $ @kbd{trap 'false} | |
| echo $?' 0 | |
| $ @kbd{exit} | |
| 0 | |
| @end example | |
| @noindent | |
| Fortunately, this bug only affects @command{trap}. | |
| Several shells fail to execute an exit trap that is defined inside a | |
| subshell, when the last command of that subshell is not a builtin. A | |
| workaround is to use @samp{exit $?} as the shell builtin. | |
| @example | |
| $ @kbd{bash -c '(trap "echo hi" 0; /bin/true)'} | |
| hi | |
| $ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true)'} | |
| $ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'} | |
| hi | |
| @end example | |
| @noindent | |
| Likewise, older implementations of @command{bash} failed to preserve | |
| @samp{$?} across an exit trap consisting of a single cleanup command. | |
| @example | |
| $ @kbd{bash -c 'trap "/bin/true" 0; exit 2'; echo $?} | |
| 2 | |
| $ @kbd{bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?} | |
| 0 | |
| $ @kbd{bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?} | |
| 2 | |
| @end example | |
| Be aware that a trap can be called from any number of places in your | |
| script, and therefore the trap handler should not make assumptions about | |
| shell state. For some examples, if your script temporarily modifies | |
| @env{IFS}, then the trap should include an initialization back to its | |
| typical value of space-tab-newline (autoconf does this for generated | |
| @file{configure} files). Likewise, if your script changes the current | |
| working directory at some point after the trap is installed, then your | |
| trap cannot assume which directory it is in, and should begin by | |
| changing directories to an absolute path if that is important to the | |
| cleanup efforts (autotest does this for generated @file{testsuite} | |
| files). | |
| @item @command{true} | |
| @c ----------------- | |
| @prindex @command{true} | |
| @c Info cannot handle ':' in index entries. | |
| @c @prindex @command{:} | |
| Don't worry: as far as we know @command{true} is portable. | |
| Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the | |
| portable shell community tends to prefer using @command{:}. This has a | |
| funny side effect: when asked whether @command{false} is more portable | |
| than @command{true} Alexandre Oliva answered: | |
| @quotation | |
| In a sense, yes, because if it doesn't exist, the shell will produce an | |
| exit status of failure, which is correct for @command{false}, but not | |
| for @command{true}. | |
| @end quotation | |
| Remember that even though @samp{:} ignores its arguments, it still takes | |
| time to compute those arguments. It is a good idea to use double quotes | |
| around any arguments to @samp{:} to avoid time spent in field splitting | |
| and file name expansion. | |
| @anchor{unset} | |
| @item @command{unset} | |
| @c ------------------ | |
| @prindex @command{unset} | |
| In some nonconforming shells (e.g., Solaris 10 @command{/bin/ksh} and | |
| @command{/usr/xpg4/bin/sh}, NetBSD 5.99.43 sh, or Bash 2.05a), | |
| @code{unset FOO} fails when @code{FOO} is not set. This can interfere | |
| with @code{set -e} operation. You can use | |
| @smallexample | |
| FOO=; unset FOO | |
| @end smallexample | |
| @noindent | |
| if you are not sure that @code{FOO} is set. | |
| A few ancient shells lack @command{unset} entirely. For some variables | |
| such as @code{PS1}, you can use a neutralizing value instead: | |
| @smallexample | |
| PS1='$ ' | |
| @end smallexample | |
| Usually, shells that do not support @command{unset} need less effort to | |
| make the environment sane, so for example is not a problem if you cannot | |
| unset @command{CDPATH} on those shells. However, Bash 2.01 mishandles | |
| @code{unset MAIL} and @code{unset MAILPATH} in some cases and dumps core. | |
| So, you should do something like | |
| @smallexample | |
| ( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || : | |
| @end smallexample | |
| @noindent | |
| @xref{Special Shell Variables}, for some neutralizing values. Also, see | |
| @ref{export, , Limitations of Builtins}, for | |
| the case of environment variables. | |
| @item @command{wait} | |
| @c ----------------- | |
| @prindex @command{wait} | |
| The exit status of @command{wait} is not always reliable. | |
| @end table | |
| @node Limitations of Usual Tools | |
| @section Limitations of Usual Tools | |
| @cindex Limitations of usual tools | |
| The small set of tools you can expect to find on any machine can still | |
| include some limitations you should be aware of. | |
| @comment Between this list and the list of builtins above, we should | |
| @comment mention all the tools in GNU Coding Standards ``Utilities in | |
| @comment Makefiles''. | |
| @c This table includes things like '@command{expr} (|)', so we can't | |
| @c use @table @command. | |
| @table @asis | |
| @anchor{awk} | |
| @item @command{awk} | |
| @c ---------------- | |
| @prindex @command{awk} | |
| Don't leave white space before the opening parenthesis in a user function call. | |
| POSIX does not allow this and GNU Awk rejects it: | |
| @example | |
| $ @kbd{gawk 'function die () @{ print "Aaaaarg!" @} | |
| BEGIN @{ die () @}'} | |
| gawk: cmd. line:2: BEGIN @{ die () @} | |
| gawk: cmd. line:2: ^ parse error | |
| $ @kbd{gawk 'function die () @{ print "Aaaaarg!" @} | |
| BEGIN @{ die() @}'} | |
| Aaaaarg! | |
| @end example | |
| POSIX says that if a program contains only @samp{BEGIN} actions, and | |
| contains no instances of @code{getline}, then the program merely | |
| executes the actions without reading input. However, traditional Awk | |
| implementations (such as Solaris 10 @command{awk}) read and discard | |
| input in this case. Portable scripts can redirect input from | |
| @file{/dev/null} to work around the problem. For example: | |
| @example | |
| awk 'BEGIN @{print "hello world"@}' </dev/null | |
| @end example | |
| POSIX says that in an @samp{END} action, @samp{$NF} (and presumably, | |
| @samp{$1}) retain their value from the last record read, if no | |
| intervening @samp{getline} occurred. However, some implementations | |
| (such as Solaris 10 @samp{/usr/bin/awk}, @samp{nawk}, or Darwin | |
| @samp{awk}) reset these variables. A workaround is to use an | |
| intermediate variable prior to the @samp{END} block. For example: | |
| @example | |
| $ @kbd{cat end.awk} | |
| @{ tmp = $1 @} | |
| END @{ print "a", $1, $NF, "b", tmp @} | |
| $ @kbd{echo 1 | awk -f end.awk} | |
| a b 1 | |
| $ @kbd{echo 1 | gawk -f end.awk} | |
| a 1 1 b 1 | |
| @end example | |
| If you want your program to be deterministic, don't depend on @code{for} | |
| on arrays: | |
| @example | |
| $ @kbd{cat for.awk} | |
| END @{ | |
| arr["foo"] = 1 | |
| arr["bar"] = 1 | |
| for (i in arr) | |
| print i | |
| @} | |
| $ @kbd{gawk -f for.awk </dev/null} | |
| foo | |
| bar | |
| $ @kbd{nawk -f for.awk </dev/null} | |
| bar | |
| foo | |
| @end example | |
| Some Awk implementations, such as HP-UX 11.0's native one, | |
| mishandle anchors: | |
| @example | |
| $ @kbd{echo xfoo | $AWK '/foo|^bar/ @{ print @}'} | |
| $ @kbd{echo bar | $AWK '/foo|^bar/ @{ print @}'} | |
| bar | |
| $ @kbd{echo xfoo | $AWK '/^bar|foo/ @{ print @}'} | |
| xfoo | |
| $ @kbd{echo bar | $AWK '/^bar|foo/ @{ print @}'} | |
| bar | |
| @end example | |
| @noindent | |
| Either do not depend on such patterns (i.e., use @samp{/^(.*foo|bar)/}, | |
| or use a simple test to reject such implementations. | |
| On @samp{ia64-hp-hpux11.23}, Awk mishandles @code{printf} conversions | |
| after @code{%u}: | |
| @example | |
| $ @kbd{awk 'BEGIN @{ printf "%u %d\n", 0, -1 @}'} | |
| 0 0 | |
| @end example | |
| AIX version 5.2 has an arbitrary limit of 399 on the | |
| length of regular expressions and literal strings in an Awk program. | |
| Traditional Awk implementations derived from Unix version 7, such as | |
| Solaris @command{/bin/awk}, have many limitations and do not | |
| conform to POSIX@. Nowadays @code{AC_PROG_AWK} (@pxref{Particular | |
| Programs}) finds you an Awk that doesn't have these problems, but if | |
| for some reason you prefer not to use @code{AC_PROG_AWK} you may need to | |
| address them. For more detailed descriptions, see @ref{Language | |
| History, , @command{awk} language history, gawk, GNU Awk User's Guide}. | |
| Traditional Awk does not support multidimensional arrays or user-defined | |
| functions. | |
| Traditional Awk does not support the @option{-v} option. You can use | |
| assignments after the program instead, e.g., @code{$AWK '@{print v | |
| $1@}' v=x}; however, don't forget that such assignments are not | |
| evaluated until they are encountered (e.g., after any @code{BEGIN} | |
| action). | |
| Traditional Awk does not support the keywords @code{delete} or @code{do}. | |
| Traditional Awk does not support the expressions | |
| @code{@var{a}?@var{b}:@var{c}}, @code{!@var{a}}, @code{@var{a}^@var{b}}, | |
| or @code{@var{a}^=@var{b}}. | |
| Traditional Awk does not support the predefined @code{CONVFMT} or | |
| @code{ENVIRON} variables. | |
| Traditional Awk supports only the predefined functions @code{exp}, @code{index}, | |
| @code{int}, @code{length}, @code{log}, @code{split}, @code{sprintf}, | |
| @code{sqrt}, and @code{substr}. | |
| Traditional Awk @code{getline} is not at all compatible with POSIX; | |
| avoid it. | |
| Traditional Awk has @code{for (i in a) @dots{}} but no other uses of the | |
| @code{in} keyword. For example, it lacks @code{if (i in a) @dots{}}. | |
| In code portable to both traditional and modern Awk, @code{FS} must be a | |
| string containing just one ordinary character, and similarly for the | |
| field-separator argument to @code{split}. | |
| Traditional Awk has a limit of 99 fields in a record | |
| and splits the input even if you don't refer to any field in the script. | |
| To circumvent this problem, set @samp{FS} | |
| to an unusual character and use @code{split}. | |
| Traditional Awk has a limit of at most 99 bytes in a number formatted by | |
| @code{OFMT}; for example, @code{OFMT="%.300e"; print 0.1;} typically | |
| dumps core. | |
| The original version of Awk had a limit of at most 99 bytes per | |
| @code{split} field, 99 bytes per @code{substr} substring, and 99 bytes | |
| per run of non-special characters in a @code{printf} format, but these | |
| bugs have been fixed on all practical hosts that we know of. | |
| HP-UX 11.00 Awk requires that input files have a line length | |
| of at most 3070 bytes. | |
| @item @command{basename} | |
| @c --------------------- | |
| @prindex @command{basename} | |
| Long ago some hosts lacked a working @command{basename}, | |
| and portable scripts needed to use @command{expr} instead. | |
| Nowadays it is safe to use @command{basename}. For example: | |
| @example | |
| base=`basename -- "$file"` | |
| @end example | |
| @c AS_BASENAME is to be replaced by a better API. | |
| @ignore | |
| Not all hosts have a working @command{basename}, and you should instead | |
| use @code{AS_BASENAME} (@pxref{Programming in M4sh}), followed by | |
| @command{expr} if you need to strip a suffix. For example: | |
| @example | |
| a=`basename "$aname"` # This is not portable. | |
| a=`AS_BASENAME(["$aname"])` # This is more portable. | |
| # This is not portable. | |
| c=`basename "$cname" .c` | |
| # This is more portable. | |
| c=`AS_BASENAME(["$cname"])` | |
| case $c in | |
| ?*.c) c=`expr "X$c" : 'X\(.*\)\.c'`;; | |
| esac | |
| @end example | |
| @end ignore | |
| @item @command{cat} | |
| @c ---------------- | |
| @prindex @command{cat} | |
| Don't rely on any option. | |
| @item @command{cc} | |
| @c --------------- | |
| @prindex @command{cc} | |
| The command @samp{cc -c foo.c} traditionally produces an object file | |
| named @file{foo.o}. Most compilers allow @option{-c} to be combined | |
| with @option{-o} to specify a different object file name, but | |
| POSIX does not require this combination and a few compilers | |
| lack support for it. @xref{C Compiler}, for how GNU Make | |
| tests for this feature with @code{AC_PROG_CC_C_O}. | |
| When a compilation such as @samp{cc -o foo foo.c} fails, some compilers | |
| (such as CDS on Reliant Unix) leave a @file{foo.o}. | |
| HP-UX @command{cc} doesn't accept @file{.S} files to preprocess and | |
| assemble. @samp{cc -c foo.S} appears to succeed, but in fact does | |
| nothing. | |
| The default executable, produced by @samp{cc foo.c}, can be | |
| @itemize | |
| @item @file{a.out} -- usual POSIX convention. | |
| @item @file{b.out} -- i960 compilers (including @command{gcc}). | |
| @item @file{a.exe} -- DJGPP port of @command{gcc}. | |
| @item @file{a_out.exe} -- GNV @command{cc} wrapper for DEC C on OpenVMS. | |
| @item @file{foo.exe} -- various MS-DOS compilers. | |
| @end itemize | |
| The C compiler's traditional name is @command{cc}, but other names like | |
| @command{gcc} are common. POSIX 1003.1-2024 specifies the | |
| name @command{c17}, but older POSIX editions specified | |
| @command{c99} or @command{c89}, future POSIX standards will likely specify | |
| other commands, and anyway these standard names are rarely used in | |
| practice. Typically the C compiler is invoked from makefiles that use | |
| @samp{$(CC)}, so the value of the @samp{CC} make variable selects the | |
| compiler name. | |
| @item @command{chgrp} | |
| @itemx @command{chown} | |
| @c ------------------- | |
| @prindex @command{chgrp} | |
| @prindex @command{chown} | |
| It is not portable to change a file's group to a group that the owner | |
| does not belong to. | |
| @item @command{chmod} | |
| @c ------------------ | |
| @prindex @command{chmod} | |
| Avoid usages like @samp{chmod -w file}; use @samp{chmod a-w file} | |
| instead, for two reasons. First, plain @option{-w} does not necessarily | |
| make the file unwritable, since it does not affect mode bits that | |
| correspond to bits in the file mode creation mask. Second, | |
| POSIX says that the @option{-w} might be interpreted as an | |
| implementation-specific option, not as a mode; POSIX suggests | |
| using @samp{chmod -- -w file} to avoid this confusion, but unfortunately | |
| @samp{--} does not work on some older hosts. | |
| @item @command{cmp} | |
| @c ---------------- | |
| @prindex @command{cmp} | |
| @command{cmp} performs a raw data comparison of two files, while | |
| @command{diff} compares two text files. Therefore, if you might compare | |
| DOS files, even if only checking whether two files are different, use | |
| @command{diff} to avoid spurious differences due to differences of | |
| newline encoding. | |
| @item @command{cp} | |
| @c --------------- | |
| @prindex @command{cp} | |
| The @option{-i}, @option{-f}, @option{-p} and @option{-R} options are | |
| widely used. POSIX also specifies @option{-H}, @option{-L}, and | |
| @option{-P}. Avoid other options in portable scripts. | |
| @cindex timestamp resolution | |
| Traditionally, file timestamps had 1-second resolution, and @samp{cp | |
| -p} copied the timestamps exactly. However, many modern file systems | |
| have timestamps with 1-nanosecond resolution. Unfortunately, some older | |
| @samp{cp -p} implementations truncate timestamps when copying files, | |
| which can cause the destination file to appear to be older than the | |
| source. The exact amount of truncation depends on the resolution of | |
| the system calls that @command{cp} uses. Traditionally this was | |
| @code{utime}, which has 1-second resolution. Since | |
| GNU Core Utilities 6.12 (2008), GNU @command{cp} can set timestamps to | |
| the full nanosecond resolution, using the system calls | |
| @code{futimens} and @code{utimensat} when they are available. As of | |
| 2024, though, some platforms (such as AIX 7.3) still have @samp{cp -p} | |
| that supports only 1-second resolution, and some operating systems | |
| and file systems have similar limitations even when running | |
| GNU @command{cp}. | |
| Although @samp{cp -p} always @emph{tries} to copy | |
| ownerships, whether it actually does so is a | |
| system dependent policy decision implemented by the kernel. If the | |
| kernel allows it then it happens. If the kernel does not allow it then | |
| it does not happen. It is not something @command{cp} itself has control | |
| over. | |
| In Unix System V any user can chown files to any other user, and System | |
| V also has a non-sticky @file{/tmp}. That probably derives from the | |
| heritage of System V in a business environment without hostile users. | |
| BSD changed this | |
| to be a more secure model where only root can @command{chown} files and | |
| a sticky @file{/tmp} is used. That undoubtedly derives from the heritage | |
| of BSD in a campus environment. | |
| GNU/Linux and Solaris by default follow BSD, but | |
| can be configured to allow a System V style @command{chown}. On the | |
| other hand, HP-UX follows System V, but can | |
| be configured to use the modern security model and disallow | |
| @command{chown}. Since it is an administrator-configurable parameter | |
| you can't use the name of the kernel as an indicator of the behavior. | |
| @item @command{date} | |
| @c ----------------- | |
| @prindex @command{date} | |
| When most versions of @command{date} do not recognize a @samp{%} | |
| conversion specification, they quietly pass it through, | |
| and exit with success: | |
| @example | |
| $ @kbd{date --version | head -n 1} | |
| date (GNU coreutils) 9.5 | |
| $ @kbd{date +'%H:%M %Q'} | |
| 17:25 %Q | |
| @end example | |
| @noindent | |
| However, this behavior is not required by POSIX. | |
| @item @command{dirname} | |
| @c -------------------- | |
| @prindex @command{dirname} | |
| Long ago some hosts lacked a working @command{dirname} and portable | |
| scripts needed to use use @code{AS_DIRNAME} (@pxref{Programming in M4sh}). | |
| Nowadays @command{dirname} suffices and the following are equivalent: | |
| @example | |
| dir=`dirname -- "$file"` | |
| dir=`AS_DIRNAME(["$file"])` | |
| @end example | |
| @item @command{egrep} | |
| @c ------------------ | |
| @prindex @command{egrep} | |
| Although POSIX stopped requiring @command{egrep} in 2001, | |
| a few traditional hosts (notably Solaris 11) 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{@}}. | |
| In particular, even though POSIX.1-2024 says @samp{\]} matches @samp{]}, | |
| earlier editions of POSIX say that the meaning of @samp{\]} is undefined. | |
| 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 11) do not support the POSIX | |
| replacement @code{grep -F}. Also, some traditional implementations do | |
| not work on long input lines. To work around these problems, invoke | |
| @code{AC_PROG_FGREP} and then use @code{$FGREP}. | |
| @item @command{find} | |
| @c ----------------- | |
| @prindex @command{find} | |
| Many operands of GNU @command{find} are not standardized by POSIX and | |
| are missing on many platforms. These nonportable operands include | |
| @option{-follow}, @option{-maxdepth}, @option{-mindepth}, | |
| @option{-printf}, and @option{,}. See the | |
| @uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/find.html, | |
| POSIX spec for @command{find}} for @command{find} operands that | |
| should be portable nowadays. | |
| The replacement of @samp{@{@}} is guaranteed only if the argument is | |
| exactly @samp{@{@}}, not if @samp{@{@}} only a part of a larger argument. | |
| For instance, on AIX 7.3: | |
| @example | |
| $ @kbd{touch foo} | |
| $ @kbd{find . -name foo -exec echo '@{@}-@{@}' \;} | |
| @{@}-@{@} | |
| @end example | |
| @noindent | |
| while GNU @command{find} reports @samp{./foo-./foo}. | |
| POSIX allows either behavior. | |
| AIX 7.3 @samp{find ... -exec @var{command} +} incorrectly fails if | |
| @var{command} is not executed. For example, @samp{find . -name '*.tmp' | |
| -exec rm @{@} +} incorrectly outputs a diagnostic and fails if no file | |
| names end in @samp{.tmp}. To work around this problem you can use a | |
| circumlocution like @samp{find . -name '*.tmp' -exec rm -f @{@} + -o | |
| -exec true ';'}. | |
| @anchor{grep} | |
| @item @command{grep} | |
| @c ----------------- | |
| @prindex @command{grep} | |
| Portable scripts can rely on the @command{grep} options @option{-c}, | |
| @option{-l}, @option{-n}, and @option{-v}, but should avoid other | |
| options. For example, don't use @option{-w}, as POSIX does not require it. | |
| Also, portable scripts should not combine @option{-c} with @option{-l}, | |
| as POSIX does not allow this. | |
| Some of the options required by POSIX are not portable in practice. | |
| Don't use @samp{grep -q} to suppress output, because traditional @command{grep} | |
| implementations (e.g., Solaris 10) do not support @option{-q}. | |
| Don't use @samp{grep -s} to suppress output either, because POSIX | |
| says @option{-s} does not suppress output, only some error messages; | |
| also, the @option{-s} option of traditional @command{grep} behaved | |
| like @option{-q} does in most modern implementations. Instead, | |
| redirect the standard output and standard error (in case the file | |
| doesn't exist) of @code{grep} to @file{/dev/null}. Check the exit | |
| status of @code{grep} to determine whether it found a match. | |
| The QNX4 implementation fails to count lines with @code{grep -c '$'}, | |
| but works with @code{grep -c '^'}. Other alternatives for counting | |
| lines are to use @code{sed -n '$='} or @code{wc -l}. | |
| Some traditional @command{grep} implementations do not work on long | |
| input lines. On AIX the default @code{grep} silently truncates long | |
| lines on the input before matching. | |
| Also, Solaris 11 @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 11) 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}. | |
| Also, even though POSIX.1-2024 says @samp{\]} matches @samp{]}, | |
| earlier editions of POSIX say that the meaning of @samp{\]} is undefined. | |
| 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} | |
| The portable options are @option{-e}, @option{-f}, and @option{-n}. | |
| POSIX standardized @option{-E} in 2024 but some older implementations lack it. | |
| Although GNU @command{sed} supports other options like @option{-i}, | |
| these can be missing or have different meanings elsewhere. | |
| Patterns should not include the separator (unless escaped), even as part | |
| of a character class. | |
| 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, such as the parenthesized empty pattern in @samp{\(\)} | |
| or the empty pattern followed by an interval expression in @samp{\@{2\@}}. | |
| POSIX does not require support for empty patterns. | |
| Comments in Sed scripts should not contain @samp{n} immediately after | |
| the leading @samp{#}. Although POSIX.1-2024 says this is equivalent to the | |
| @option{-n} option, earlier POSIX editions said that | |
| the equivalence occurs only if the comment is the first line of the script, | |
| and many @command{sed} implementations are confused about this. | |
| It is more portable to use @option{-n}. | |
| 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 10 @command{/usr/ucb/sed} rejects usages that exceed a limit of | |
| about 6000 bytes for the internal representation of commands. | |
| 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. | |
| 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. Although | |
| this practice was disallowed by recent releases of POSIX, it means that | |
| in the @samp{C} locale 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 | |
| Anchors (@samp{^} and @samp{$}) inside groups are not portable. | |
| Some @command{sed} implementations, e.g., Solaris 11.4, 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 | |
| In the normal case when @option{-E} is not used, | |
| portable @command{sed} regular expressions should use @samp{\} only to escape | |
| characters in the string @samp{$*.123456789[\^n}. For example, | |
| POSIX.1-2024 says it is implementation-defined | |
| whether @samp{\|} means alternation or simply matches @samp{|}, | |
| 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. | |
| Portable @command{sed} replacement strings should use @samp{\} only to | |
| escape the delimiter character, newline, and characters in the string | |
| @samp{&123456789\}. For example, although in GNU @command{sed} | |
| the command @samp{s/AB/\n/} replaces the first @samp{AB} with a newline, | |
| in OpenBSD and Solaris @command{sed} it acts like @samp{s/AB/n/}. | |
| To be portable, escape a newline instead: | |
| @example | |
| # This is portable; "sed 's/AB/\n/'" is not. | |
| sed 's/AB/\ | |
| /' | |
| @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} or @samp{:}, | |
| or if @var{command-1} is an @samp{s} with the @samp{w} option, so you | |
| should use semicolon only with simple scripts that do not use these | |
| constructs. | |
| 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 | |
| POSIX requires each @option{-e} and @option{-f} option to specify a | |
| syntactically complete script. Although GNU @command{sed} also allows | |
| @option{-e} and @option{-f} options to specify script fragments | |
| that it assembles into a full script, this is not portable. For | |
| example, the @command{sed} programs on Solaris 11, HP-UX 11, and AIX | |
| do not allow script fragments: | |
| @example | |
| $ @kbd{sed -e 'i\' -e ouch} | |
| Unrecognized command: ouch | |
| @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 should not be followed by white space. | |
| Although trailing white space often works, | |
| it can be dicey in some situations and | |
| it is simpler to avoid it entirely. | |
| Commands inside @{ @} brackets are further restricted. POSIX.1-2004 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. Although these | |
| restrictions were lifted in POSIX.1-2008, it is more portable to | |
| respect them. | |
| 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{;}. | |
| 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. Branch labels should contain at most 8 bytes, | |
| each of which should be an ASCII graphical character. | |
| Do not put trailing white space after a branch label. | |
| 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 11 | |
| @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 a missing regular expression, the last | |
| regular expression from either an address specification or substitution | |
| command is used. However, busybox 1.6.1 complains when using a | |
| substitution command with a replacement containing a back-reference to | |
| a missing 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 11 yes no no | |
| Solaris XPG4 yes no error | |
| NetBSD 5.1 no no yes | |
| FreeBSD 9.1 no no yes | |
| GNU yes yes error | |
| busybox yes yes error | |
| @end example | |
| @item @command{sed} (@samp{t}) | |
| @c --------------------------- | |
| @prindex @command{sed} (@samp{t}) | |
| There are two things one should remember about @samp{t} in @command{sed}. | |
| First, @samp{t} jumps if @emph{some} substitution | |
| succeeded, not only the immediately preceding substitution. Therefore, | |
| always use a fake @samp{t clear} followed by a @samp{:clear} on the next | |
| line, to reset the @samp{t} flag where needed. | |
| Second, do not rely on @command{sed} to clear the flag at each new cycle. | |
| For example, the following script replaces all instances of ``keep me'' | |
| with ``kept'', and replaces the contents of all lines that did not | |
| contain ``keep me'' with ``deleted''. | |
| @example | |
| t clear | |
| :clear | |
| s/keep me/kept/g | |
| t end | |
| s/.*/deleted/g | |
| :end | |
| @end example | |
| @item @command{sed} (@samp{w}) | |
| @c --------------------------- | |
| @prindex @command{sed} (@samp{w}) | |
| When a script contains multiple commands to write lines to the same | |
| output file, BusyBox @command{sed} mistakenly opens a separate output | |
| stream for each command. This can cause one of the commands to ``win'' | |
| and the others to ``lose'', in the sense that their output is discarded. | |
| For example: | |
| @example | |
| sed -n -e ' | |
| /a/w xxx | |
| /b/w xxx | |
| ' <<EOF | |
| a | |
| b | |
| EOF | |
| @end example | |
| This might output only @samp{a} to @file{xxx}; the @samp{b} is lost. | |
| To avoid the problem, a portable script should contain at most one | |
| @samp{w} or @samp{s/.../.../w} command per output file. | |
| @item @command{sleep} | |
| @c ------------------ | |
| @prindex @command{sleep} | |
| Using @command{sleep} is generally portable. However, remember that | |
| adding a @command{sleep} to work around timestamp issues, with a minimum | |
| granularity of one second, doesn't scale well for parallel builds on | |
| modern machines with sub-second process completion. | |
| @item @command{sort} | |
| @c ----------------- | |
| @prindex @command{sort} | |
| Remember that sort order is influenced by the current locale. Inside | |
| @file{configure}, the C locale is in effect, but in Makefile snippets, | |
| you may need to specify @code{LC_ALL=C sort}. | |
| @item @command{tar} | |
| @c ---------------- | |
| @prindex @command{tar} | |
| There are multiple file formats for @command{tar}; if you use Automake, | |
| the macro @code{AM_INIT_AUTOMAKE} has some options controlling which | |
| level of portability to use. | |
| @anchor{touch} | |
| @item @command{touch} | |
| @c ------------------ | |
| @prindex @command{touch} | |
| @cindex timestamp resolution | |
| If you specify the desired timestamp (e.g., with the @option{-r} | |
| option), older @command{touch} implementations use the @code{utime} or | |
| @code{utimes} system call, which can result in the same kind of | |
| timestamp truncation problems that @samp{cp -p} has. | |
| @item @command{tr} | |
| @c --------------- | |
| @prindex @command{tr} | |
| Many @command{tr} implementations do not support multi-byte locales | |
| well. For example, Solaris 10 @command{tr} rejects character classes in | |
| multi-byte locales. Also, ranges have well-defined behavior only in the | |
| @samp{C} (or @samp{POSIX}) locale, so if you cannot guarantee the | |
| setting of @env{LC_ALL} it is better to spell out a range | |
| @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]} than to rely on @samp{[A-Z]}. | |
| @cindex carriage return, deleting | |
| @cindex newline, deleting | |
| @cindex deleting carriage return | |
| Not all versions of @command{tr} handle all backslash character escapes. | |
| For example, Solaris 10 @command{/usr/ucb/tr} falls over, even though | |
| Solaris contains more modern @command{tr} in other locations. | |
| Using octal escapes is more portable for carriage returns, since | |
| @samp{\015} is the same for both ASCII and EBCDIC, and since use of | |
| literal carriage returns in scripts causes a number of other problems. | |
| But for other characters, like newline, using octal escapes ties the | |
| operation to ASCII, so it is better to use literal characters. | |
| @example | |
| $ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\n' ; echo} | |
| moo | |
| light | |
| $ @kbd{@{ echo moon; echo light; @} | /usr/bin/tr -d '\n' ; echo} | |
| moonlight | |
| $ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\012' ; echo} | |
| moonlight | |
| $ @kbd{nl='} | |
| @kbd{'; @{ echo moon; echo light; @} | /usr/ucb/tr -d "$nl" ; echo} | |
| moonlight | |
| @end example | |
| Not all versions of @command{tr} recognize direct ranges of characters: at | |
| least Solaris @command{/usr/bin/tr} still fails to do so. But you can | |
| use @command{/usr/xpg4/bin/tr} instead, or add brackets (which in POSIX | |
| transliterate to themselves). | |
| @example | |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z} | |
| HAZy FAntAZy | |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'} | |
| HAZY FANTAZY | |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z} | |
| HAZY FANTAZY | |
| @end example | |
| When providing two arguments, be sure the second string is at least as | |
| long as the first. | |
| @example | |
| $ @kbd{echo abc | /usr/xpg4/bin/tr bc d} | |
| adc | |
| $ @kbd{echo abc | coreutils/tr bc d} | |
| add | |
| @end example | |
| On platforms with the BusyBox tools, @command{tr} does not support the | |
| @code{[@var{x}*@var{n}]} option syntax. | |
| @example | |
| $ @kbd{echo abc | tr 'abcd' '[A*4]'} | |
| [A* | |
| $ @kbd{echo abc | coreutils/tr 'abcd' '[A*4]'} | |
| AAA | |
| $ @kbd{echo xyz | tr 'a-z' '[A*]'} | |
| ]]] | |
| $ @kbd{echo xyz | coreutils/tr 'a-z' '[A*]'} | |
| AAA | |
| @end example | |
| POSIX requires @command{tr} to operate on binary files. But at least | |
| Solaris @command{/usr/ucb/tr} and @command{/usr/bin/tr} silently discard | |
| @code{NUL} in the input prior to doing any translation. When using | |
| @command{tr} to process a binary file that may contain @code{NUL} bytes, | |
| it is necessary to use @command{/usr/xpg4/bin/tr} instead, or | |
| @command{/usr/xpg6/bin/tr} if that is available. | |
| @example | |
| $ @kbd{printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1} | |
| 61 62 | |
| $ @kbd{printf 'a\0b' | /usr/bin/tr x x | od -An -tx1} | |
| 61 62 | |
| $ @kbd{printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1} | |
| 61 00 62 | |
| @end example | |
| Solaris @command{/usr/ucb/tr} additionally fails to handle @samp{\0} as the | |
| octal escape for @code{NUL}. | |
| @example | |
| $ @kbd{printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1} | |
| 61 62 63 | |
| $ @kbd{printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1} | |
| 61 00 64 | |
| $ @kbd{printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1} | |
| 61 00 64 | |
| @end example | |
| @end table | |
| @node Portable Make | |
| @chapter Portable Make Programming | |
| @prindex @command{make} | |
| @cindex Limitations of @command{make} | |
| Writing portable makefiles is an art. Since a makefile's commands are | |
| executed by the shell, you must consider the shell portability issues | |
| already mentioned. However, other issues are specific to @command{make} | |
| itself. | |
| @menu | |
| * $< in Ordinary Make Rules:: $< in ordinary rules | |
| * Failure in Make Rules:: Failing portably in rules | |
| * Command Line Prefixes:: What's at the start of makefile command lines | |
| * Special Chars in Names:: Special characters in macro names | |
| * Backslash-Newline-Empty:: Empty lines after backslash-newline | |
| * Backslash-Newline Comments:: Spanning comments across line boundaries | |
| * Macros and Submakes:: @code{make macro=value} and submakes | |
| * The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues | |
| * The Make Macro SHELL:: @code{$(SHELL)} portability issues | |
| * Parallel Make:: Parallel @command{make} quirks | |
| * Comments in Make Rules:: Other problems with Make comments | |
| * Newlines in Make Rules:: Using literal newlines in rules | |
| * Comments in Make Macros:: Other problems with Make comments in macros | |
| * Trailing whitespace in Make Macros:: Macro substitution problems | |
| * Command-line Macros and whitespace:: Whitespace trimming of values | |
| * obj/ and Make:: Don't name a subdirectory @file{obj} | |
| * make -k Status:: Exit status of @samp{make -k} | |
| * VPATH and Make:: @code{VPATH} woes | |
| * Single Suffix Rules:: Single suffix rules and separated dependencies | |
| * Timestamps and Make:: Sub-second timestamp resolution | |
| @end menu | |
| @node $< in Ordinary Make Rules | |
| @section @code{$<} in Ordinary Make Rules | |
| POSIX says that the @samp{$<} construct in makefiles can be | |
| used only in inference rules and in the @samp{.DEFAULT} rule; its | |
| meaning in ordinary rules is unspecified. Solaris @command{make} | |
| for instance replaces it with the empty string. OpenBSD (3.0 and | |
| later) @command{make} diagnoses these uses and errors out. | |
| @node Failure in Make Rules | |
| @section Failure in Make Rules | |
| Unless errors are being ignored | |
| (e.g., because a makefile command line is preceded by a @samp{-} prefix), | |
| POSIX 2008 requires that @command{make} must invoke each command with | |
| the equivalent of a @samp{sh -e -c} subshell, which causes the | |
| subshell to exit immediately if a subsidiary simple-command fails, | |
| with some complicated exceptions. | |
| Historically not all @command{make} implementations | |
| followed this rule. For | |
| example, the command @samp{touch T; rm -f U} may attempt to | |
| remove @file{U} even if the @command{touch} fails, although this is not | |
| permitted with POSIX make. One way to work around failures in simple | |
| commands is to reword them so that they always succeed, e.g., @samp{touch | |
| T || :; rm -f U}. | |
| However, even this approach can run into common bugs in BSD | |
| implementations of the @option{-e} option of @command{sh} and | |
| @command{set} (@pxref{set, , Limitations of Shell Builtins}), so if you | |
| are worried | |
| about porting to buggy BSD shells it may be simpler to migrate | |
| complicated @command{make} actions into separate scripts. | |
| @node Command Line Prefixes | |
| @section Makefile Command Line Prefixes | |
| Makefile command lines can be preceded by zero or more of | |
| the command line prefixes @samp{-}, @samp{@@}, and @samp{+}, | |
| which modify how @command{make} processes the command. | |
| Although POSIX says these are the only command line prefixes, | |
| some @command{make} implementations, such as Solaris @command{make}, | |
| support the additional prefixes @samp{!} and @samp{?}. | |
| Portable makefiles should therefore avoid using these two characters at | |
| the start of a makefile command line. | |
| For example: | |
| @example | |
| mishandled-by-Solaris-make:; ! grep FIXME foo.c | |
| portable-to-Solaris-make:; :;! grep FIXME foo.c | |
| @end example | |
| @node Special Chars in Names | |
| @section Special Characters in Make Macro Names | |
| POSIX limits macro names to nonempty strings containing only | |
| ASCII letters and digits, @samp{.}, and @samp{_}. Many | |
| @command{make} implementations allow a wider variety of characters, but | |
| portable makefiles should avoid them. It is portable to start a name | |
| with a special character, e.g., @samp{$(.FOO)}. | |
| Some ancient @command{make} implementations don't support leading | |
| underscores in macro names. An example is NEWS-OS 4.2R. | |
| @example | |
| $ @kbd{cat Makefile} | |
| _am_include = # | |
| _am_quote = | |
| all:; @@echo this is test | |
| $ @kbd{make} | |
| Make: Must be a separator on rules line 2. Stop. | |
| $ @kbd{cat Makefile2} | |
| am_include = # | |
| am_quote = | |
| all:; @@echo this is test | |
| $ @kbd{make -f Makefile2} | |
| this is test | |
| @end example | |
| @noindent | |
| However, this problem is no longer of practical concern. | |
| @node Backslash-Newline-Empty | |
| @section Backslash-Newline Before Empty Lines | |
| @c This has been seen on ia64 hpux 11.20, and on one hppa hpux 10.20, | |
| @c but another hppa hpux 10.20 didn't have it. Bob Proulx | |
| @c <bob@proulx.com> thinks it was in hpux 8.0 too. | |
| On some versions of HP-UX, @command{make} reads multiple newlines | |
| following a backslash, continuing to the next non-empty line. For | |
| example, | |
| @example | |
| FOO = one \ | |
| BAR = two | |
| test: | |
| : FOO is "$(FOO)" | |
| : BAR is "$(BAR)" | |
| @end example | |
| @noindent | |
| shows @code{FOO} equal to @code{one BAR = two}. Other implementations | |
| sensibly let a backslash continue only to the immediately following | |
| line. | |
| @node Backslash-Newline Comments | |
| @section Backslash-Newline in Make Comments | |
| According to POSIX, Make comments start with @code{#} | |
| and continue until an unescaped newline is reached. | |
| @example | |
| $ @kbd{cat Makefile} | |
| # A = foo \ | |
| bar \ | |
| baz | |
| all: | |
| @@echo ok | |
| $ @kbd{make} # GNU make | |
| ok | |
| @end example | |
| @noindent | |
| However this is not always the case. Some implementations | |
| discard everything from @code{#} through the end of the line, ignoring any | |
| trailing backslash. | |
| @example | |
| $ @kbd{pmake} # BSD make | |
| "Makefile", line 3: Need an operator | |
| Fatal errors encountered -- cannot continue | |
| @end example | |
| @noindent | |
| Therefore, if you want to comment out a multi-line definition, prefix each | |
| line with @code{#}, not only the first. | |
| @example | |
| # A = foo \ | |
| # bar \ | |
| # baz | |
| @end example | |
| @node Macros and Submakes | |
| @section @code{make macro=value} and Submakes | |
| A command-line variable definition such as @code{foo=bar} overrides any | |
| definition of @code{foo} in a makefile. Some @command{make} | |
| implementations (such as GNU @command{make}) propagate this | |
| override to subsidiary invocations of @command{make}. Some other | |
| implementations do not pass the substitution along to submakes. | |
| @example | |
| $ @kbd{cat Makefile} | |
| foo = foo | |
| one: | |
| @@printf '%s\n' $(foo) | |
| $(MAKE) two | |
| two: | |
| @@printf '%s\n' $(foo) | |
| $ @kbd{make foo=bar} # GNU make 3.79.1 | |
| bar | |
| make two | |
| make[1]: Entering directory `/home/adl' | |
| bar | |
| make[1]: Leaving directory `/home/adl' | |
| $ @kbd{pmake foo=bar} # BSD make | |
| bar | |
| pmake two | |
| foo | |
| @end example | |
| You have a few possibilities if you do want the @code{foo=bar} override | |
| to propagate to submakes. One is to use the @option{-e} | |
| option, which causes all environment variables to have precedence over | |
| the makefile macro definitions, and declare foo as an environment | |
| variable: | |
| @example | |
| $ @kbd{env foo=bar make -e} | |
| @end example | |
| The @option{-e} option is propagated to submakes automatically, | |
| and since the environment is inherited between @command{make} | |
| invocations, the @code{foo} macro is overridden in | |
| submakes as expected. | |
| This syntax (@code{foo=bar make -e}) is portable only when used | |
| outside of a makefile, for instance from a script or from the | |
| command line. When run inside a @command{make} rule, GNU | |
| @command{make} 3.80 and prior versions forget to propagate the | |
| @option{-e} option to submakes. | |
| Moreover, using @option{-e} could have unexpected side effects if your | |
| environment contains some other macros usually defined by the | |
| makefile. (See also the note about @code{make -e} and @code{SHELL} | |
| below.) | |
| If you can foresee all macros that a user might want to override, then | |
| you can propagate them to submakes manually, from your makefile: | |
| @example | |
| foo = foo | |
| one: | |
| @@printf '%s\n' $(foo) | |
| $(MAKE) foo=$(foo) two | |
| two: | |
| @@printf '%s\n' $(foo) | |
| @end example | |
| Another way to propagate a variable to submakes in a portable way is to | |
| expand an extra variable in every invocation of @samp{$(MAKE)} within | |
| your makefile: | |
| @example | |
| foo = foo | |
| one: | |
| @@printf '%s\n' $(foo) | |
| $(MAKE) $(SUBMAKEFLAGS) two | |
| two: | |
| @@printf '%s\n' $(foo) | |
| @end example | |
| Users must be aware that this technique is in use to take advantage of | |
| it, e.g.@: with @code{make foo=bar SUBMAKEFLAGS='foo=bar'}, but it | |
| allows any macro to be overridden. Makefiles generated by | |
| @command{automake} use this technique, expanding @code{$(AM_MAKEFLAGS)} | |
| on the command lines of submakes (@pxref{Subdirectories, , Automake, | |
| automake, GNU Automake}). | |
| @node The Make Macro MAKEFLAGS | |
| @section The Make Macro MAKEFLAGS | |
| @cindex @code{MAKEFLAGS} and @command{make} | |
| @cindex @command{make} and @code{MAKEFLAGS} | |
| POSIX requires @command{make} to use @code{MAKEFLAGS} to affect the | |
| current and recursive invocations of make, but allows implementations | |
| several formats for the variable. It is tricky to parse | |
| @code{$MAKEFLAGS} to determine whether @option{-s} for silent execution | |
| or @option{-k} for continued execution are in effect. For example, you | |
| cannot assume that the first space-separated word in @code{$MAKEFLAGS} | |
| contains single-letter options, since in the Cygwin version of | |
| GNU @command{make} it is either @option{--unix} or | |
| @option{--win32} with the second word containing single-letter options. | |
| @example | |
| $ @kbd{cat Makefile} | |
| all: | |
| @@printf 'MAKEFLAGS = %s\n' '$(MAKEFLAGS)' | |
| $ @kbd{make} | |
| MAKEFLAGS = --unix | |
| $ @kbd{make -k} | |
| MAKEFLAGS = --unix -k | |
| @end example | |
| @node The Make Macro SHELL | |
| @section The Make Macro @code{SHELL} | |
| @cindex @code{SHELL} and @command{make} | |
| @cindex @command{make} and @code{SHELL} | |
| Many @command{make} implementations use the @code{$(SHELL)} | |
| macro to spawn shell processes and execute Make rules. This | |
| is a builtin macro with a default value upplied by @command{make}; | |
| the default can be overridden by a makefile or by a command-line argument, | |
| though not by the environment. | |
| Other @command{make} implementations use other ways to spawn shell | |
| processes, and the POSIX standard for @command{make} says that portable | |
| makefiles should neither define nor use the @code{$(SHELL)} macro. | |
| Despite this prohibition, in practice it does not hurt to define and | |
| then possibly use @code{SHELL} in your makefiles and in some cases it | |
| can help your builds use a better shell to spawn shell processes. | |
| So it's a good idea to define @code{SHELL} in | |
| your makefiles. If you use Autoconf, you can use | |
| its standard output variable @code{SHELL} as follows: | |
| @example | |
| SHELL = @@SHELL@@ | |
| @end example | |
| @noindent | |
| If you use Automake, this is done for you. | |
| Do not force @code{SHELL = /bin/sh} because that is not correct | |
| everywhere. Remember, @file{/bin/sh} is not POSIX compliant on some | |
| systems, such as Solaris 10. | |
| Additionally, DJGPP lacks @code{/bin/sh}, and when its | |
| GNU @command{make} port sees such a setting it enters a | |
| special emulation mode where features like pipes and redirections are | |
| emulated on top of DOS's @command{command.com}. Unfortunately this | |
| emulation is incomplete; for instance it does not handle command | |
| substitutions. Using @code{@@SHELL@@} means that your makefile will | |
| benefit from the same improved shell, such as @command{bash} or | |
| @command{ksh}, that was discovered during @command{configure}, so that | |
| you aren't fighting two different sets of shell bugs between the two | |
| contexts. | |
| Do not rely on whether @command{make}'s @code{SHELL} settings are | |
| exported to subprocesses, as implementations differ: | |
| @example | |
| $ @kbd{cat Makefile} | |
| all: | |
| @@printf '%s\n' '$(SHELL)' | |
| @@printenv SHELL | |
| $ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # BSD make, AIX make | |
| /bin/ksh | |
| /bin/ksh | |
| $ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # GNU make | |
| /bin/ksh | |
| sh | |
| @end example | |
| @node Parallel Make | |
| @section Parallel Make | |
| @cindex Parallel @command{make} | |
| Support for parallel execution in @command{make} implementation varies. | |
| Generally, using GNU make is your best bet. | |
| When NetBSD or FreeBSD @command{make} are run in parallel mode, they will | |
| reuse the same shell for multiple commands within one recipe. This can | |
| have various unexpected consequences. For example, changes of directories | |
| or variables persist between recipes, so that: | |
| @example | |
| all: | |
| @@var=value; cd /; pwd; echo $$var; echo $$$$ | |
| @@pwd; echo $$var; echo $$$$ | |
| @end example | |
| @noindent | |
| may output the following with @code{make -j1}, at least on NetBSD up to | |
| 5.1 and FreeBSD up to 8.2: | |
| @example | |
| / | |
| value | |
| 32235 | |
| / | |
| value | |
| 32235 | |
| @end example | |
| @noindent | |
| while without @option{-j1}, or with @option{-B}, the output looks less | |
| surprising: | |
| @example | |
| / | |
| value | |
| 32238 | |
| /tmp | |
| 32239 | |
| @end example | |
| @noindent | |
| Another consequence is that, if one command in a recipe uses @code{exit 0} | |
| to indicate a successful exit, the shell will be gone and the remaining | |
| commands of this recipe will not be executed. | |
| The BSD @command{make} implementations, when run in parallel mode, | |
| will also pass the @command{Makefile} recipes to the shell through | |
| its standard input, thus making it unusable from the recipes: | |
| @example | |
| $ @kbd{cat Makefile} | |
| read: | |
| @@read line; echo LINE: $$line | |
| @c $$ @c restore font-lock | |
| $ @kbd{echo foo | make read} | |
| LINE: foo | |
| $ @kbd{echo foo | make -j1 read} # NetBSD 5.1 and FreeBSD 8.2 | |
| LINE: | |
| @end example | |
| @noindent | |
| Moreover, when FreeBSD @command{make} (up at least to 8.2) is run in | |
| parallel mode, it implements the @code{@@} and @code{-} ``recipe | |
| modifiers'' by dynamically modifying the active shell flags. This | |
| behavior has the effects of potentially clobbering the exit status | |
| of recipes silenced with the @code{@@} modifier if they also unset | |
| the @option{errexit} shell flag, and of mangling the output in | |
| unexpected ways: | |
| @example | |
| $ @kbd{cat Makefile} | |
| a: | |
| @@echo $$-; set +e; false | |
| b: | |
| -echo $$-; false; echo set - | |
| $ @kbd{make a; echo status: $?} | |
| ehBc | |
| *** Error code 1 | |
| status: 1 | |
| $ @kbd{make -j1 a; echo status: $?} | |
| ehB | |
| status: 0 | |
| $ @kbd{make b} | |
| echo $-; echo set - | |
| hBc | |
| set - | |
| $ @kbd{make -j1 b} | |
| echo $-; echo hvB | |
| @end example | |
| @noindent | |
| You can avoid all these issues by using the @option{-B} option to enable | |
| compatibility semantics. However, that will effectively also disable | |
| all parallelism as that will cause prerequisites to be updated in the | |
| order they are listed in a rule. | |
| Some make implementations (among them, FreeBSD @command{make}, NetBSD | |
| @command{make}, and Solaris @command{dmake}), when invoked with a | |
| @option{-j@var{N}} option, connect the standard output and standard | |
| error of all their child processes to pipes or temporary regular | |
| files. This can lead to subtly different semantics in the behavior | |
| of the spawned processes. For example, even if the @command{make} | |
| standard output is connected to a tty, the recipe command will not be: | |
| @example | |
| $ @kbd{cat Makefile} | |
| all: | |
| @@test -t 1 && echo "Is a tty" || echo "Is not a tty" | |
| $ @kbd{make -j 2} # FreeBSD 8.2 make | |
| Is not a tty | |
| $ @kbd{make -j 2} # NetBSD 5.1 make | |
| --- all --- | |
| Is not a tty | |
| $ @kbd{dmake -j 2} # Solaris 10 dmake | |
| @var{hostname} --> 1 job | |
| @var{hostname} --> Job output | |
| Is not a tty | |
| @end example | |
| @noindent | |
| On the other hand: | |
| @example | |
| $ @kbd{make -j 2} # GNU make, Heirloom make | |
| Is a tty | |
| @end example | |
| @noindent | |
| The above examples also show additional status output produced in parallel | |
| mode for targets being updated by Solaris @command{dmake} and NetBSD | |
| @command{make} (but @emph{not} by FreeBSD @command{make}). | |
| Furthermore, parallel runs of those @command{make} implementations will | |
| route standard error from commands that they spawn into their own | |
| standard output, and may remove leading whitespace from output lines. | |
| @node Comments in Make Rules | |
| @section Comments in Make Rules | |
| @cindex Comments in @file{Makefile} rules | |
| @cindex @file{Makefile} rules and comments | |
| Do not try to put comments (lines beginning with @samp{#}) in a rule, as | |
| they end the rule. It is OK for a rule line to start with a tab | |
| followed by @samp{#}, as a comment passed to a shell that does nothing. | |
| To use the @samp{#} character in a command, put it in a rule not a | |
| macro, as the character cannot portably appear in macros | |
| (@pxref{Comments in Make Macros}). So for example, assuming the output | |
| variable @code{COMMENT_CHAR} stands for @samp{#}, the following replaces | |
| @samp{@@COMMENT_CHAR@@} by @samp{#} in a generated header: | |
| @example | |
| foo.h: foo.h.in | |
| sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \ | |
| '$(srcdir)/foo.h.in' > $@@ | |
| @end example | |
| The funny shell quoting avoids a substitution at @command{config.status} | |
| run time of the left-hand side of the @command{sed} @samp{s} command. | |
| @node Newlines in Make Rules | |
| @section Newlines in Make Rules | |
| @cindex Newlines in @file{Makefile} rules | |
| @cindex @file{Makefile} rules and newlines | |
| In shell scripts, newlines can be used inside string literals. But in | |
| the shell statements of @file{Makefile} rules, this is not possible: | |
| a newline not preceded by a backslash separates commands, whereas a | |
| newline preceded by a backslash becomes part of the shell statement. | |
| So, how can a newline be used in a string literal? | |
| The trick is to set up a shell variable @code{nl} that contains a newline. | |
| For example, the following uses a multi-line @samp{sed} expression that | |
| appends an empty line after every line of a file: | |
| @example | |
| output: input | |
| eval "$$(printf 'nl="\n"\n')"; \ | |
| sed "a\\$$nl" input >$@@ | |
| @end example | |
| @node Comments in Make Macros | |
| @section Comments in Make Macros | |
| @cindex Comments in @file{Makefile} macros | |
| @cindex @file{Makefile} macros and comments | |
| In macro definitions, text from @samp{#} until line end is ignored, | |
| which has the unfortunate effect of disallowing @samp{#} even in quotes. | |
| Thus, the following does not work: | |
| @example | |
| CPPFLAGS = "-DCOMMENT_CHAR='#'" | |
| @end example | |
| @noindent | |
| as @samp{CPPFLAGS} is expanded to @samp{"-DCOMMENT_CHAR='}. | |
| GNU @command{make}, when not in POSIX mode, lets you put | |
| @samp{#} into a macro value by escaping it with a backslash, i.e., | |
| @samp{\#}. However, this usage is not portable. | |
| @xref{Comments in Make Rules}, for a portable alternative. | |
| Even without quoting involved, comments can have surprising effects, | |
| because the whitespace before them is part of the variable value: | |
| @example | |
| foo = bar # trailing comment | |
| print: ; @@echo "$(foo)." | |
| @end example | |
| @noindent | |
| prints @samp{bar .}, which is usually not intended, and can expose | |
| @command{make} bugs as described below. | |
| @node Trailing whitespace in Make Macros | |
| @section Trailing whitespace in Make Macros | |
| @cindex whitespace in @file{Makefile} macros | |
| @cindex @file{Makefile} macros and whitespace | |
| GNU @command{make} 3.80 mistreats trailing whitespace in macro | |
| substitutions and appends another spurious suffix: | |
| @example | |
| empty = | |
| foo = bar $(empty) | |
| print: ; @@echo $(foo:=.test) | |
| @end example | |
| @noindent | |
| prints @samp{bar.test .test}. | |
| BSD and Solaris @command{make} implementations do not honor trailing | |
| whitespace in macro definitions as POSIX requires: | |
| @example | |
| foo = bar # Note the space after "bar". | |
| print: ; @@echo $(foo)t | |
| @end example | |
| @noindent | |
| prints @samp{bart} instead of @samp{bar t}. To work around this, you | |
| can use a helper macro as in the previous example. | |
| @node Command-line Macros and whitespace | |
| @section Command-line Macros and whitespace | |
| @cindex whitespace in command-line macros | |
| @cindex command-line, macros set on | |
| @cindex environment, macros set from | |
| Some @command{make} implementations may strip trailing whitespace off | |
| of macros set on the command line in addition to leading whitespace. | |
| Further, some may strip leading whitespace off of macros set from | |
| environment variables: | |
| @example | |
| $ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' | | |
| foo=' f f ' make -f - bar=' b b '} | |
| x f f xb b x # AIX, BSD, GNU make | |
| xf f xb b x # HP-UX | |
| x f f xb bx # Solaris make | |
| @end example | |
| @node obj/ and Make | |
| @section The @file{obj/} Subdirectory and Make | |
| @cindex @file{obj/}, subdirectory | |
| @cindex BSD @command{make} and @file{obj/} | |
| Never name one of your subdirectories @file{obj/} if you don't like | |
| surprises. | |
| If an @file{obj/} directory exists, BSD @command{make} enters it | |
| before reading the makefile. Hence the makefile in the | |
| current directory is not read. | |
| @example | |
| $ @kbd{cat Makefile} | |
| all: | |
| echo Hello | |
| $ @kbd{cat obj/Makefile} | |
| all: | |
| echo World | |
| $ @kbd{make} # GNU make | |
| echo Hello | |
| Hello | |
| $ @kbd{pmake} # BSD make | |
| echo World | |
| World | |
| @end example | |
| @node make -k Status | |
| @section Exit Status of @code{make -k} | |
| @cindex @code{make -k} | |
| Do not rely on the exit status of @code{make -k}. Some implementations | |
| reflect whether they encountered an error in their exit status; other | |
| implementations always succeed. | |
| @example | |
| $ @kbd{cat Makefile} | |
| all: | |
| false | |
| $ @kbd{make -k; echo exit status: $?} # GNU make | |
| false | |
| make: *** [all] Error 1 | |
| exit status: 2 | |
| $ @kbd{pmake -k; echo exit status: $?} # BSD make | |
| false | |
| *** Error code 1 (continuing) | |
| exit status: 0 | |
| @end example | |
| @node VPATH and Make | |
| @section @code{VPATH} and Make | |
| @cindex @code{VPATH} | |
| POSIX does not specify the semantics of @code{VPATH}. Typically, | |
| @command{make} supports @code{VPATH}, but its implementation is not | |
| consistent. | |
| Autoconf and Automake support makefiles whose usages of @code{VPATH} are | |
| portable to recent-enough popular implementations of @command{make}, but | |
| to keep the resulting makefiles portable, a package's makefile | |
| prototypes must take the following issues into account. These issues | |
| are complicated and are often poorly understood, and installers who use | |
| @code{VPATH} should expect to find many bugs in this area. If you use | |
| @code{VPATH}, the simplest way to avoid these portability bugs is to | |
| stick with GNU @command{make}, since it is the most | |
| commonly-used @command{make} among Autoconf users. | |
| Here are some known issues with some @code{VPATH} | |
| implementations. | |
| @menu | |
| * Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts | |
| * VPATH and Double-colon:: Problems with @samp{::} on ancient hosts | |
| * $< in Explicit Rules:: @code{$<} does not work in ordinary rules | |
| * Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris | |
| * Make Target Lookup:: More details about @code{VPATH} lookup | |
| @end menu | |
| @node Variables listed in VPATH | |
| @subsection Variables listed in @code{VPATH} | |
| @cindex @code{VPATH} and variables | |
| @cindex variables and @code{VPATH} | |
| Do not set @code{VPATH} to the value of another variable, for example | |
| @samp{VPATH = $(srcdir)}, because some ancient versions of | |
| @command{make} do not do variable substitutions on the value of | |
| @code{VPATH}. For example, use this | |
| @example | |
| srcdir = @@srcdir@@ | |
| VPATH = @@srcdir@@ | |
| @end example | |
| @noindent | |
| rather than @samp{VPATH = $(srcdir)}. Note that with GNU | |
| Automake, there is no need to set this yourself. | |
| @node VPATH and Double-colon | |
| @subsection @code{VPATH} and Double-colon Rules | |
| @cindex @code{VPATH} and double-colon rules | |
| @cindex double-colon rules and @code{VPATH} | |
| With ancient versions of Sun @command{make}, | |
| any assignment to @code{VPATH} causes @command{make} to execute only | |
| the first set of double-colon rules. | |
| However, this problem is no longer of practical concern. | |
| @node $< in Explicit Rules | |
| @subsection @code{$<} Not Supported in Explicit Rules | |
| @cindex explicit rules, @code{$<}, and @code{VPATH} | |
| @cindex @code{$<}, explicit rules, and @code{VPATH} | |
| @cindex @code{VPATH}, explicit rules, and @code{$<} | |
| Using @code{$<} in explicit rules is not portable. | |
| The prerequisite file must be named explicitly in the rule. If you want | |
| to find the prerequisite via a @code{VPATH} search, you have to code the | |
| whole thing manually. @xref{Build Directories}. | |
| @node Automatic Rule Rewriting | |
| @subsection Automatic Rule Rewriting | |
| @cindex @code{VPATH} and automatic rule rewriting | |
| @cindex automatic rule rewriting and @code{VPATH} | |
| Some @command{make} implementations, such as Solaris, | |
| search for prerequisites in @code{VPATH} and | |
| then rewrite each occurrence as a plain word in the rule. | |
| For instance: | |
| @example | |
| # This isn't portable to GNU make. | |
| VPATH = ../pkg/src | |
| f.c: if.c | |
| cp if.c f.c | |
| @end example | |
| @noindent | |
| executes @code{cp ../pkg/src/if.c f.c} if @file{if.c} is | |
| found in @file{../pkg/src}. | |
| However, this rule leads to real problems in practice. For example, if | |
| the source directory contains an ordinary file named @file{test} that is | |
| used in a dependency, Solaris @command{make} rewrites commands like | |
| @samp{if test -r foo; @dots{}} to @samp{if ../pkg/src/test -r foo; | |
| @dots{}}, which is typically undesirable. In fact, @command{make} is | |
| completely unaware of shell syntax used in the rules, so the VPATH | |
| rewrite can potentially apply to @emph{any} whitespace-separated word | |
| in a rule, including shell variables, functions, and keywords. | |
| @example | |
| $ @kbd{mkdir build} | |
| $ @kbd{cd build} | |
| $ @kbd{cat > Makefile <<'END'} | |
| VPATH = .. | |
| all: arg func for echo | |
| func () @{ for arg in "$$@@"; do echo $$arg; done; @}; \ | |
| func "hello world" | |
| END | |
| $ @kbd{touch ../arg ../func ../for ../echo} | |
| $ @kbd{make} | |
| ../func () @{ ../for ../arg in "$@@"; do ../echo $arg; done; @}; \ | |
| ../func "hello world" | |
| sh: syntax error at line 1: `do' unexpected | |
| *** Error code 2 | |
| @end example | |
| @noindent | |
| To avoid this problem, portable makefiles should never mention a source | |
| file or dependency whose name is that of a shell keyword like @file{for} | |
| or @file{until}, a shell command like @command{cat} or @command{gcc} or | |
| @command{test}, or a shell function or variable used in the corresponding | |
| @command{Makefile} recipe. | |
| Because of these problems GNU @command{make} and many other @command{make} | |
| implementations do not rewrite commands, so portable makefiles should | |
| search @code{VPATH} manually. It is tempting to write this: | |
| @smallexample | |
| # This isn't portable to Solaris make. | |
| VPATH = ../pkg/src | |
| f.c: if.c | |
| cp `test -f if.c || echo $(VPATH)/`if.c f.c | |
| @end smallexample | |
| @noindent | |
| However, the ``prerequisite rewriting'' still applies here. So if | |
| @file{if.c} is in @file{../pkg/src}, Solaris @command{make} | |
| executes | |
| @smallexample | |
| cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c | |
| @end smallexample | |
| @noindent | |
| which reduces to | |
| @example | |
| cp if.c f.c | |
| @end example | |
| @noindent | |
| and thus fails. Oops. | |
| A simple workaround, and good practice anyway, is to use @samp{$?} and | |
| @samp{$@@} when possible: | |
| @smallexample | |
| VPATH = ../pkg/src | |
| f.c: if.c | |
| cp $? $@@ | |
| @end smallexample | |
| @noindent | |
| but this does not generalize well to commands with multiple | |
| prerequisites. A more general workaround is to rewrite the rule so that | |
| the prerequisite @file{if.c} never appears as a plain word. For | |
| example, these three rules would be safe, assuming @file{if.c} is in | |
| @file{../pkg/src} and the other files are in the working directory: | |
| @smallexample | |
| VPATH = ../pkg/src | |
| f.c: if.c f1.c | |
| cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@@ | |
| g.c: if.c g1.c | |
| cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@@ | |
| h.c: if.c h1.c | |
| cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@@ | |
| @end smallexample | |
| Things get worse when your prerequisites are in a macro. | |
| @example | |
| VPATH = ../pkg/src | |
| HEADERS = f.h g.h h.h | |
| install-HEADERS: $(HEADERS) | |
| for i in $(HEADERS); do \ | |
| $(INSTALL) -m 644 \ | |
| `test -f $$i || echo $(VPATH)/`$$i \ | |
| $(DESTDIR)$(includedir)/$$i; \ | |
| @c $$ restore font-lock | |
| done | |
| @end example | |
| The above @code{install-HEADERS} rule is not Solaris-proof because @code{for | |
| i in $(HEADERS);} is expanded to @code{for i in f.h g.h h.h;} | |
| where @code{f.h} and @code{g.h} are plain words and are hence | |
| subject to @code{VPATH} adjustments. | |
| If the three files are in @file{../pkg/src}, the rule is run as: | |
| @example | |
| for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \ | |
| install -m 644 \ | |
| `test -f $i || echo ../pkg/src/`$i \ | |
| /usr/local/include/$i; \ | |
| done | |
| @end example | |
| where the two first @command{install} calls fail. For instance, | |
| consider the @code{f.h} installation: | |
| @example | |
| install -m 644 \ | |
| `test -f ../pkg/src/f.h || \ | |
| echo ../pkg/src/ \ | |
| `../pkg/src/f.h \ | |
| /usr/local/include/../pkg/src/f.h; | |
| @end example | |
| @noindent | |
| It reduces to: | |
| @example | |
| install -m 644 \ | |
| ../pkg/src/f.h \ | |
| /usr/local/include/../pkg/src/f.h; | |
| @end example | |
| Note that the manual @code{VPATH} search did not cause any problems here; | |
| however this command installs @file{f.h} in an incorrect directory. | |
| Trying to quote @code{$(HEADERS)} in some way, as we did for | |
| @code{foo.c} a few makefiles ago, does not help: | |
| @example | |
| install-HEADERS: $(HEADERS) | |
| headers='$(HEADERS)'; \ | |
| for i in $$headers; do \ | |
| $(INSTALL) -m 644 \ | |
| `test -f $$i || echo $(VPATH)/`$$i \ | |
| $(DESTDIR)$(includedir)/$$i; \ | |
| done | |
| @end example | |
| Now, @code{headers='$(HEADERS)'} macro-expands to: | |
| @example | |
| headers='f.h g.h h.h' | |
| @end example | |
| @noindent | |
| but @code{g.h} is still a plain word. (As an aside, the idiom | |
| @code{headers='$(HEADERS)'; for i in $$headers;} is a good | |
| idea if @code{$(HEADERS)} can be empty, because some shells diagnose a | |
| syntax error on @code{for i in;}.) | |
| One workaround is to strip this unwanted @file{../pkg/src/} prefix manually: | |
| @example | |
| VPATH = ../pkg/src | |
| HEADERS = f.h g.h h.h | |
| install-HEADERS: $(HEADERS) | |
| headers='$(HEADERS)'; \ | |
| for i in $$headers; do \ | |
| i=`expr "$$i" : '$(VPATH)/\(.*\)'`; | |
| $(INSTALL) -m 644 \ | |
| `test -f $$i || echo $(VPATH)/`$$i \ | |
| $(DESTDIR)$(includedir)/$$i; \ | |
| @c $$ restore font-lock | |
| done | |
| @end example | |
| @noindent | |
| Automake does something similar. | |
| @node Make Target Lookup | |
| @subsection Make Target Lookup | |
| @cindex @code{VPATH}, resolving target pathnames | |
| GNU @command{make} uses a complex algorithm to decide when it | |
| should use files found via a @code{VPATH} search. @xref{Search | |
| Algorithm, , How Directory Searches are Performed, make, The GNU Make | |
| Manual}. | |
| If a target needs to be rebuilt, GNU @command{make} discards the | |
| file name found during the @code{VPATH} search for this target, and | |
| builds the file locally using the file name given in the makefile. | |
| If a target does not need to be rebuilt, GNU @command{make} uses the | |
| file name found during the @code{VPATH} search. | |
| Other @command{make} implementations, like NetBSD @command{make}, are | |
| easier to describe: the file name found during the @code{VPATH} search | |
| is used whether the target needs to be rebuilt or not. Therefore | |
| new files are created locally, but existing files are updated at their | |
| @code{VPATH} location. | |
| OpenBSD and FreeBSD @command{make}, however, | |
| never perform a | |
| @code{VPATH} search for a dependency that has an explicit rule. | |
| This is extremely annoying. | |
| When attempting a @code{VPATH} build for an autoconfiscated package | |
| (e.g., @code{mkdir build && cd build && ../configure}), this means | |
| GNU | |
| @command{make} builds everything locally in the @file{build} | |
| directory, while BSD @command{make} builds new files locally and | |
| updates existing files in the source directory. | |
| @example | |
| $ @kbd{cat Makefile} | |
| VPATH = .. | |
| all: foo.x bar.x | |
| foo.x bar.x: newer.x | |
| @@echo Building $@@ | |
| $ @kbd{touch ../bar.x} | |
| $ @kbd{touch ../newer.x} | |
| $ @kbd{make} # GNU make | |
| Building foo.x | |
| Building bar.x | |
| $ @kbd{pmake} # NetBSD make | |
| Building foo.x | |
| Building ../bar.x | |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make | |
| Building foo.x | |
| Building bar.x | |
| $ @kbd{make} # GNU make | |
| Building foo.x | |
| $ @kbd{pmake} # NetBSD make | |
| Building foo.x | |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make | |
| Building foo.x | |
| Building bar.x | |
| @end example | |
| Note how NetBSD @command{make} updates @file{../bar.x} in its | |
| VPATH location, and how FreeBSD and OpenBSD | |
| @command{make} always | |
| update @file{bar.x}, even when @file{../bar.x} is up to date. | |
| Another point worth mentioning is that once GNU @command{make} has | |
| decided to ignore a @code{VPATH} file name (e.g., it ignored | |
| @file{../bar.x} in the above example) it continues to ignore it when | |
| the target occurs as a prerequisite of another rule. | |
| The following example shows that GNU @command{make} does not look up | |
| @file{bar.x} in @code{VPATH} before performing the @code{.x.y} rule, | |
| because it ignored the @code{VPATH} result of @file{bar.x} while running | |
| the @code{bar.x: newer.x} rule. | |
| @example | |
| $ @kbd{cat Makefile} | |
| VPATH = .. | |
| all: bar.y | |
| bar.x: newer.x | |
| @@echo Building $@@ | |
| .SUFFIXES: .x .y | |
| .x.y: | |
| cp $< $@@ | |
| $ @kbd{touch ../bar.x} | |
| $ @kbd{touch ../newer.x} | |
| $ @kbd{make} # GNU make | |
| Building bar.x | |
| cp bar.x bar.y | |
| cp: cannot stat 'bar.x': No such file or directory | |
| make: *** [bar.y] Error 1 | |
| $ @kbd{pmake} # NetBSD make | |
| Building ../bar.x | |
| cp ../bar.x bar.y | |
| $ @kbd{rm bar.y} | |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make | |
| echo Building bar.x | |
| cp bar.x bar.y | |
| cp: cannot stat 'bar.x': No such file or directory | |
| *** Error code 1 | |
| @end example | |
| Note that if you drop away the command from the @code{bar.x: newer.x} | |
| rule, GNU @command{make} magically starts to work: it | |
| knows that @code{bar.x} hasn't been updated, therefore it doesn't | |
| discard the result from @code{VPATH} (@file{../bar.x}) in succeeding | |
| uses. FreeBSD and OpenBSD still don't work, though. | |
| @example | |
| $ @kbd{cat Makefile} | |
| VPATH = .. | |
| all: bar.y | |
| bar.x: newer.x | |
| .SUFFIXES: .x .y | |
| .x.y: | |
| cp $< $@@ | |
| $ @kbd{touch ../bar.x} | |
| $ @kbd{touch ../newer.x} | |
| $ @kbd{make} # GNU make | |
| cp ../bar.x bar.y | |
| $ @kbd{rm bar.y} | |
| $ @kbd{pmake} # NetBSD make | |
| cp ../bar.x bar.y | |
| $ @kbd{rm bar.y} | |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make | |
| cp bar.x bar.y | |
| cp: cannot stat 'bar.x': No such file or directory | |
| *** Error code 1 | |
| @end example | |
| It seems the sole solution that would please every @command{make} | |
| implementation is to never rely on @code{VPATH} searches for targets. | |
| In other words, @code{VPATH} should be reserved to sources that are not built. | |
| @node Single Suffix Rules | |
| @section Single Suffix Rules and Separated Dependencies | |
| @cindex Single Suffix Inference Rule | |
| @cindex Rule, Single Suffix Inference | |
| A @dfn{Single Suffix Rule} is basically a usual suffix (inference) rule | |
| (@samp{.from.to:}), but which @emph{destination} suffix is empty | |
| (@samp{.from:}). | |
| @cindex Separated Dependencies | |
| @dfn{Separated dependencies} simply refers to listing the prerequisite | |
| of a target, without defining a rule. Usually one can list on the one | |
| hand side, the rules, and on the other hand side, the dependencies. | |
| Solaris @command{make} does not support separated dependencies for | |
| targets defined by single suffix rules: | |
| @example | |
| $ @kbd{cat Makefile} | |
| .SUFFIXES: .in | |
| foo: foo.in | |
| .in: | |
| cp $< $@@ | |
| $ @kbd{touch foo.in} | |
| $ @kbd{make} | |
| $ @kbd{ls} | |
| Makefile foo.in | |
| @end example | |
| @noindent | |
| while GNU Make does: | |
| @example | |
| $ @kbd{gmake} | |
| cp foo.in foo | |
| $ @kbd{ls} | |
| Makefile foo foo.in | |
| @end example | |
| Note it works without the @samp{foo: foo.in} dependency. | |
| @example | |
| $ @kbd{cat Makefile} | |
| .SUFFIXES: .in | |
| .in: | |
| cp $< $@@ | |
| $ @kbd{make foo} | |
| cp foo.in foo | |
| @end example | |
| @noindent | |
| and it works with double suffix inference rules: | |
| @example | |
| $ @kbd{cat Makefile} | |
| foo.out: foo.in | |
| .SUFFIXES: .in .out | |
| .in.out: | |
| cp $< $@@ | |
| $ @kbd{make} | |
| cp foo.in foo.out | |
| @end example | |
| As a result, in such a case, you have to write target rules. | |
| @node Timestamps and Make | |
| @section Timestamp Resolution and Make | |
| @cindex timestamp resolution | |
| Traditionally, file timestamps had 1-second resolution, and | |
| @command{make} used those timestamps to determine whether one file was | |
| newer than the other. However, many modern file systems have | |
| timestamps with 1-nanosecond resolution. Some @command{make} | |
| implementations look at the entire timestamp; others ignore the | |
| fractional part, which can lead to incorrect results. Normally this | |
| is not a problem, but in some extreme cases you may need to use tricks | |
| like @samp{sleep 1} to work around timestamp truncation bugs. | |
| Traditionally, commands like @samp{cp -p} and @samp{touch -r} did not copy | |
| file timestamps to their full resolutions (@pxref{touch, , Limitations of Usual | |
| Tools}). Hence you should be wary of rules like this: | |
| @example | |
| dest: src | |
| cp -p src dest | |
| @end example | |
| as @file{dest} often appears to be older than @file{src} after the | |
| timestamp is truncated, and this can cause @command{make} to do | |
| needless rework the next time it is invoked. To work around this | |
| problem, you can use a timestamp file, e.g.: | |
| @example | |
| dest-stamp: src | |
| cp -p src dest | |
| echo >dest-stamp | |
| @end example | |
| Apart from timestamp resolution, there are also differences in handling | |
| equal timestamps. Although POSIX suggests that @command{make} update a | |
| target with the same timestamp as its newest prerequisite, only | |
| HP-UX @command{make} is known to do so; GNU and other @command{make} | |
| implementations do not update, a behavior that POSIX also allows. | |
| The HP-UX behavior can cause spurious rebuilds | |
| and this in turn can cause @command{make} to fail if it tries to rebuild | |
| generated files in a possibly read-only source tree with tools not | |
| present on the build machine. Conversely, if a source file is updated | |
| immediately after running @command{make} in a file system with | |
| low-resolution timestamps, the GNU behavior can cause a later | |
| @command{make} to neglect rebuilds and quietly generate incorrect results. | |
| To avoid both these problems, use GNU @command{make} on a platform | |
| with high-resolution timestamps. | |
| @c ======================================== Portable C and C++ Programming | |
| @node Portable C and C++ | |
| @chapter Portable C and C++ Programming | |
| @cindex Portable C and C++ programming | |
| C and C++ programs often use low-level features of the underlying | |
| system, and therefore are often more difficult to make portable to other | |
| platforms. | |
| Several standards have been developed to help make your programs more | |
| portable. If you write programs with these standards in mind, you can | |
| have greater confidence that your programs work on a wide variety | |
| of systems. | |
| @ifhtml | |
| @uref{https://@/gcc.gnu.org/@/onlinedocs/@/gcc/@/Standards.html, Language | |
| Standards Supported by GCC} | |
| @end ifhtml | |
| @ifnothtml | |
| @xref{Standards, , Language Standards Supported by | |
| GCC, gcc, Using the GNU Compiler Collection | |
| (GCC)}, | |
| @end ifnothtml | |
| for a list of C-related standards. Many programs also assume the | |
| @uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX standard}. | |
| @cindex K&R C | |
| @cindex C89, C99, C11, C17, and C23 | |
| The first widely used C variant was K&R C, which predates any C | |
| standard. K&R C compilers are no longer of practical interest, though, | |
| and Autoconf assumes at least C89, the first C standard, | |
| which is sometimes called ``C90'' due to a delay in standardization. | |
| C has since gone through the standards C99, C11, C17, and C23, and | |
| Autoconf is compatible with all these standards. | |
| Program portability is a huge topic, and this section can only briefly | |
| introduce common pitfalls. @xref{System Portability, , Portability | |
| between System Types, standards, The GNU Coding Standards}, for | |
| more information. | |
| @menu | |
| * Varieties of Unportability:: How to make your programs unportable | |
| * Integer Overflow:: When integers get too large | |
| * Preprocessor Arithmetic:: @code{#if} expression problems | |
| * Null Pointers:: Properties of null pointers | |
| * Buffer Overruns:: Subscript errors and the like | |
| * Volatile Objects:: @code{volatile} and signals | |
| * Floating Point Portability:: Portable floating-point arithmetic | |
| * Exiting Portably:: Exiting and the exit status | |
| @end menu | |
| @node Varieties of Unportability | |
| @section Varieties of Unportability | |
| @cindex portability | |
| Autoconf tests and ordinary programs often need to test what is allowed | |
| on a system, and therefore they may need to deliberately exceed the | |
| boundaries of what the standards allow, if only to see whether an | |
| optional feature is present. When you write such a program, you should | |
| keep in mind the difference between constraints, unspecified behavior, | |
| and undefined behavior. | |
| In C, a @dfn{constraint} is a rule that the compiler must enforce. An | |
| example constraint is that C programs must not declare a bit-field with | |
| negative width. Tests can therefore reliably assume that programs with | |
| negative-width bit-fields are rejected by a compiler that conforms | |
| to the standard. | |
| @dfn{Unspecified behavior} is valid behavior, where the standard allows | |
| multiple possibilities. For example, the order of evaluation of | |
| function arguments is unspecified. Some unspecified behavior is | |
| @dfn{implementation-defined}, i.e., documented by the implementation, | |
| but since Autoconf tests cannot read the documentation they cannot | |
| distinguish between implementation-defined and other unspecified | |
| behavior. It is common for Autoconf tests to probe implementations to | |
| determine otherwise-unspecified behavior. | |
| @dfn{Undefined behavior} is invalid behavior, where the standard allows | |
| the implementation to do anything it pleases. For example, | |
| dereferencing a null pointer leads to undefined behavior. If possible, | |
| test programs should avoid undefined behavior, since a program with | |
| undefined behavior might succeed on a test that should fail. | |
| The above rules apply to programs that are intended to conform to the | |
| standard. However, strictly-conforming programs are quite rare, since | |
| the standards are so limiting. A major goal of Autoconf is to support | |
| programs that use implementation features not described by the standard, | |
| and it is fairly common for test programs to violate the above rules, if | |
| the programs work well enough in practice. | |
| @node Integer Overflow | |
| @section Integer Overflow | |
| @cindex integer overflow | |
| @cindex overflow, signed integer | |
| @cindex signed integer overflow | |
| @cindex wraparound arithmetic | |
| Although some traditional C programs assume that signed integer overflow | |
| wraps around reliably using two's complement arithmetic, the C standard | |
| says that program behavior is undefined on overflow, and these C | |
| programs may not work on many modern implementations. | |
| @menu | |
| * Integer Overflow Basics:: Why integer overflow is a problem | |
| * Signed Overflow Examples:: Examples of code assuming wraparound | |
| * Optimization and Wraparound:: Optimizations that break uses of wraparound | |
| * Signed Overflow Advice:: Practical advice for signed overflow issues | |
| * Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} | |
| @end menu | |
| @node Integer Overflow Basics | |
| @subsection Basics of Integer Overflow | |
| @cindex integer overflow | |
| @cindex overflow, signed integer | |
| @cindex signed integer overflow | |
| @cindex wraparound arithmetic | |
| In languages like C, integer overflow wraps around for unsigned | |
| integer types that are at least as wide as @code{unsigned int}; | |
| e.g., @code{UINT_MAX + 1} yields zero. | |
| This is guaranteed by the C standard and is | |
| portable in practice, unless you specify aggressive, | |
| nonstandard optimization options | |
| suitable only for special applications. | |
| In contrast, the C standard says that signed integer overflow leads to | |
| undefined behavior where a program can do anything, including dumping | |
| core or overrunning a buffer. The misbehavior can even precede the | |
| overflow. Such an overflow can occur during addition, subtraction, | |
| multiplication, division, and left shift. It can even occur for | |
| unsigned types like @code{unsigned short int} that are narrower | |
| than @code{int}, as values of these types are widened to @code{int} | |
| before computation. | |
| Despite this requirement of the standard, some C programs assume that | |
| signed integer overflow silently wraps around modulo a power of two, | |
| using two's complement arithmetic, so long as you convert the resulting | |
| value to a signed integer type. These programs can have problems, | |
| especially when optimization is enabled. If you assume a GCC-like | |
| compiler, you can work around the problems by compiling with GCC's | |
| @code{-fwrapv} option; however, this is not portable. | |
| For historical reasons C17 and earlier also allowed implementations with | |
| ones' complement or signed magnitude arithmetic, but C23 requires | |
| two's complement and it is safe to assume two's complement nowadays. | |
| Also, overflow can occur when converting an out-of-range value to a | |
| signed integer type. Here a standard implementation must define what | |
| happens, and this can include raising an exception. Although practical | |
| implementations typically wrap around silently in this case, a few | |
| debugging implementations trap instead. | |
| @node Signed Overflow Examples | |
| @subsection Examples of Code Assuming Wraparound Overflow | |
| @cindex integer overflow | |
| @cindex overflow, signed integer | |
| @cindex signed integer overflow | |
| @cindex wraparound arithmetic | |
| There was long a tension between what the C standard requires for signed | |
| integer overflow, and what traditional C programs commonly assumed. The | |
| standard allows aggressive optimizations based on assumptions that | |
| overflow never occurs, but traditionally many C programs relied on overflow | |
| wrapping around. Although these programs did not conform to the standard, | |
| they formerly worked in practice because traditionally compilers did not | |
| optimize in such a way that would break the programs. Nowadays, though, | |
| compilers do perform these optimizations, so portable programs can no | |
| longer assume reliable wraparound on signed integer overflow. | |
| The C Standard says that if a program has signed integer overflow its | |
| behavior is undefined, and the undefined behavior can even precede the | |
| overflow. To take an extreme example: | |
| @c Inspired by Robert Dewar's example in | |
| @c <https://gcc.gnu.org/ml/gcc/2007-01/msg00038.html> (2007-01-01). | |
| @example | |
| if (password == expected_password) | |
| allow_superuser_privileges (); | |
| else if (counter++ == INT_MAX) | |
| abort (); | |
| else | |
| printf ("%d password mismatches\n", counter); | |
| @end example | |
| @noindent | |
| If the @code{int} variable @code{counter} equals @code{INT_MAX}, | |
| @code{counter++} must overflow and the behavior is undefined, so the C | |
| standard allows the compiler to optimize away the test against | |
| @code{INT_MAX} and the @code{abort} call. | |
| Worse, if an earlier bug in the program lets the compiler deduce that | |
| @code{counter == INT_MAX} or that @code{counter} previously overflowed, | |
| the C standard allows the compiler to optimize away the password test | |
| and generate code that allows superuser privileges unconditionally. | |
| Here is an example derived from the 7th Edition Unix implementation of | |
| @code{atoi} (1979-01-10): | |
| @example | |
| char *p; | |
| int f, n; | |
| @dots{} | |
| while (*p >= '0' && *p <= '9') | |
| n = n * 10 + *p++ - '0'; | |
| return (f ? -n : n); | |
| @end example | |
| @noindent | |
| Even if the input string is in range, on most modern machines this has | |
| signed overflow when computing the most negative integer (the @code{-n} | |
| overflows) or a value near an extreme integer (the @code{+} | |
| overflows). | |
| Here is another example, derived from the 7th Edition implementation of | |
| @code{rand} (1979-01-10). Here the programmer expects both | |
| multiplication and addition to wrap on overflow: | |
| @example | |
| static long int randx = 1; | |
| @dots{} | |
| randx = randx * 1103515245 + 12345; | |
| return (randx >> 16) & 077777; | |
| @end example | |
| In the following example, derived from the GNU C Library 2.15 | |
| implementation of @code{mktime} (2012-03-21), the code assumes | |
| wraparound arithmetic in @code{+} to detect signed overflow: | |
| @example | |
| time_t t, t1, t2; | |
| int sec_requested, sec_adjustment; | |
| @dots{} | |
| t1 = t + sec_requested; | |
| t2 = t1 + sec_adjustment; | |
| if (((t1 < t) != (sec_requested < 0)) | |
| | ((t2 < t1) != (sec_adjustment < 0))) | |
| return -1; | |
| @end example | |
| Although some of these examples will likely behave as if signed integer | |
| overflow wraps around reliably, other examples are likely to misbehave | |
| when optimization is enabled. All these examples should be avoided in | |
| portable code because signed integer overflow is not reliable on modern | |
| systems, and it's not worth worrying about which of these examples | |
| happen to work on most platforms and which do not. | |
| @node Optimization and Wraparound | |
| @subsection Optimizations That Break Wraparound Arithmetic | |
| @cindex loop induction | |
| Compilers sometimes generate code that is incompatible with wraparound | |
| integer arithmetic. A simple example is an algebraic simplification: a | |
| compiler might translate @code{(i * 2000) / 1000} to @code{i * 2} | |
| because it assumes that @code{i * 2000} does not overflow. The | |
| translation is not equivalent to the original when overflow occurs: | |
| e.g., in the typical case of 32-bit signed two's complement wraparound | |
| @code{int}, if @code{i} has type @code{int} and value @code{1073742}, | |
| the original expression returns @minus{}2147483 but the optimized | |
| version returns the mathematically correct value 2147484. | |
| More subtly, loop induction optimizations often exploit the undefined | |
| behavior of signed overflow. Consider the following contrived function | |
| @code{sumc}: | |
| @example | |
| int | |
| sumc (int lo, int hi) | |
| @{ | |
| int sum = 0; | |
| for (int i = lo; i <= hi; i++) | |
| sum ^= i * 53; | |
| return sum; | |
| @} | |
| @end example | |
| @noindent | |
| To avoid multiplying by 53 each time through the loop, an optimizing | |
| compiler might internally transform @code{sumc} to the equivalent of the | |
| following: | |
| @example | |
| int | |
| transformed_sumc (int lo, int hi) | |
| @{ | |
| int sum = 0; | |
| int hic = hi * 53; | |
| for (int ic = lo * 53; ic <= hic; ic += 53) | |
| sum ^= ic; | |
| return sum; | |
| @} | |
| @end example | |
| @noindent | |
| This transformation is allowed by the C standard, but it is invalid for | |
| wraparound arithmetic when @code{INT_MAX / 53 < hi}, because then the | |
| overflow in computing expressions like @code{hi * 53} can cause the | |
| expression @code{i <= hi} to yield a different value from the | |
| transformed expression @code{ic <= hic}. | |
| For this reason, compilers that use loop induction and similar | |
| techniques often do not support reliable wraparound arithmetic when a | |
| loop induction variable like @code{ic} is involved. Since loop | |
| induction variables are generated by the compiler, and are not visible | |
| in the source code, it is not always trivial to say whether the problem | |
| affects your code. | |
| Hardly any code actually depends on wraparound arithmetic in cases like | |
| these, so in practice these loop induction optimizations are almost | |
| always useful. However, edge cases in this area can cause problems. | |
| For example: | |
| @example | |
| for (int j = 1; 0 < j; j *= 2) | |
| test (j); | |
| @end example | |
| @noindent | |
| Here, the loop attempts to iterate through all powers of 2 that | |
| @code{int} can represent, but the C standard allows a compiler to | |
| optimize away the comparison and generate an infinite loop, | |
| under the argument that behavior is undefined on overflow. As of this | |
| writing this optimization is done on some platforms by | |
| GCC with @option{-O2}, so this code is not portable in practice. | |
| @node Signed Overflow Advice | |
| @subsection Practical Advice for Signed Overflow Issues | |
| @cindex integer overflow | |
| @cindex overflow, signed integer | |
| @cindex signed integer overflow | |
| @cindex wraparound arithmetic | |
| Ideally the safest approach is to avoid signed integer overflow | |
| entirely. For example, instead of multiplying two signed integers, you | |
| can convert them to double-width integers, multiply the wider values, | |
| then test whether the result is in the narrower range. Or you can use | |
| more-complicated code employing unsigned integers of the same width. | |
| Rewriting code in this way will be inconvenient, though, especially if | |
| the signed values might be negative and no wider type is available. | |
| Using unsigned arithmetic to check for overflow is | |
| particularly painful to do portably and efficiently when dealing with an | |
| integer type like @code{uid_t} whose width and signedness vary from | |
| platform to platform. Also, this approach may hurt performance. | |
| Hence it is often useful to maintain code that needs | |
| wraparound on overflow, instead of rewriting the code. The rest of this | |
| section attempts to give practical advice for this situation. | |
| To detect integer overflow portably when attempting operations like | |
| @code{sum = a + b}, you can use the C23 @code{<stdckdint.h>} macros | |
| @code{ckd_add}, @code{ckd_sub}, and @code{ckd_mul}. | |
| The following code adds two integers with overflow wrapping around | |
| reliably in the sum: | |
| @example | |
| #include <stdckdint.h> | |
| ... | |
| /* Set sum = a + b, with wraparound. */ | |
| if (ckd_add (&sum, a, b)) | |
| /* 'sum' has just the low order bits. */; | |
| else | |
| /* 'sum' is the correct answer. */; | |
| @end example | |
| To be portable to pre-C23 platforms you can use Gnulib's | |
| @code{stdckdint} module, which emulates this part of C23 (@pxref{Gnulib}). | |
| Invoking the @code{stdckdint} macros typically costs just one machine | |
| instruction for the arithmetic and another instruction for the rare | |
| branch on overflow. | |
| If your code uses a signed loop index, make sure that the index cannot | |
| overflow, along with all signed expressions derived from the index. | |
| Here is a contrived example of problematic code with two instances of | |
| overflow. | |
| @example | |
| for (int i = INT_MAX - 10; i <= INT_MAX; i++) | |
| if (i + 1 < 0) | |
| @{ | |
| report_overflow (); | |
| break; | |
| @} | |
| @end example | |
| @noindent | |
| Because of the two overflows, a compiler might optimize away or | |
| transform the two comparisons in a way that is incompatible with the | |
| wraparound assumption. | |
| If your code is intended to be compiled only by GCC and | |
| assumes wraparound behavior, and you want to insulate it | |
| against any GCC optimizations that would fail to support that | |
| behavior, you should use GCC's @option{-fwrapv} option, which | |
| causes signed overflow to wrap around reliably (except for division and | |
| remainder, as discussed in the next section). | |
| If you need to write portable code and therefore cannot assume that | |
| signed integer overflow wraps around reliably, you should consider | |
| debugging with a GCC option that causes signed overflow to raise an | |
| exception. These options include @option{-fsanitize=undefined} and | |
| @option{-ftrapv}. | |
| @node Signed Integer Division | |
| @subsection Signed Integer Division and Integer Overflow | |
| @cindex division, integer | |
| Overflow in signed | |
| integer division is not always harmless: for example, on CPUs of the | |
| i386 family, dividing @code{INT_MIN} by @code{-1} yields a SIGFPE signal | |
| which by default terminates the program. Worse, taking the remainder | |
| of these two values typically yields the same signal on these CPUs, | |
| behavior that the C standard allows. | |
| @node Preprocessor Arithmetic | |
| @section Preprocessor Arithmetic | |
| @cindex preprocessor arithmetic | |
| In C99 and later, preprocessor arithmetic, used for @code{#if} | |
| expressions, must | |
| be evaluated as if all signed values are of type @code{intmax_t} and all | |
| unsigned values of type @code{uintmax_t}. Many compilers are buggy in | |
| this area, though. For example, as of 2007, Sun C mishandles @code{#if | |
| LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit | |
| @code{long long int}. Also, some older preprocessors mishandle | |
| constants ending in @code{LL}. To work around these problems, you can | |
| compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at | |
| @code{configure}-time rather than at @code{#if}-time. | |
| @node Null Pointers | |
| @section Properties of Null Pointers | |
| @cindex null pointers | |
| Most modern hosts reliably fail when you attempt to dereference a null | |
| pointer. | |
| On almost all modern hosts, null pointers use an all-bits-zero internal | |
| representation, so you can reliably use @code{memset} with 0 to set all | |
| the pointers in an array to null values. | |
| If @code{p} is a null pointer to an object type, the C expression | |
| @code{p + 0} always evaluates to @code{p} on modern hosts, even though | |
| the standard says that it has undefined behavior. | |
| @node Buffer Overruns | |
| @section Buffer Overruns and Subscript Errors | |
| @cindex buffer overruns | |
| Buffer overruns and subscript errors are the most common dangerous | |
| errors in C programs. They result in undefined behavior because storing | |
| outside an array typically modifies storage that is used by some other | |
| object, and most modern systems lack runtime checks to catch these | |
| errors. Programs should not rely on buffer overruns being caught. | |
| There is one exception to the usual rule that a portable program cannot | |
| address outside an array. In C, it is valid to compute the address just | |
| past an object, e.g., @code{&a[N]} where @code{a} has @code{N} elements, | |
| so long as you do not dereference the resulting pointer. But it is not | |
| valid to compute the address just before an object, e.g., @code{&a[-1]}; | |
| nor is it valid to compute two past the end, e.g., @code{&a[N+1]}. On | |
| most platforms @code{&a[-1] < &a[0] && &a[N] < &a[N+1]}, but this is not | |
| reliable in general, and it is usually easy enough to avoid the | |
| potential portability problem, e.g., by allocating an extra unused array | |
| element at the start or end. | |
| @uref{https://@/www.valgrind.org/, Valgrind} can catch many overruns. | |
| GCC users might also consider using the @option{-fsanitize=} options to | |
| catch overruns. @xref{Instrumentation Options,,Program Instrumentation | |
| Options,gcc,Using the GNU Compiler Collection (GCC)}. | |
| Buffer overruns are usually caused by off-by-one errors, but there are | |
| more subtle ways to get them. | |
| Using @code{int} values to index into an array or compute array sizes | |
| causes problems on typical 64-bit hosts where an array index might | |
| be @math{2^{31}} or larger. Index values of type @code{size_t} avoid this | |
| problem, but cannot be negative. Index values of type @code{ptrdiff_t} | |
| are signed, and are wide enough in practice. | |
| If you add or multiply two numbers to calculate an array size, e.g., | |
| @code{malloc (x * sizeof y + z)}, havoc ensues if the addition or | |
| multiplication overflows. | |
| Many implementations of the @code{alloca} function silently misbehave | |
| and can generate buffer overflows if given sizes that are too large. | |
| The size limits are implementation dependent, but are at least 4000 | |
| bytes on all platforms that we know about. | |
| The standard functions @code{asctime}, @code{asctime_r}, @code{ctime}, | |
| @code{ctime_r}, and @code{gets} are prone to buffer overflows, and | |
| portable code should not use them unless the inputs are known to be | |
| within certain limits. The time-related functions can overflow their | |
| buffers if given timestamps out of range (e.g., a year less than -999 | |
| or greater than 9999). Time-related buffer overflows cannot happen with | |
| recent-enough versions of the GNU C library, but are possible | |
| with other | |
| implementations. The @code{gets} function is the worst, since it almost | |
| invariably overflows its buffer when presented with an input line larger | |
| than the buffer. | |
| @node Volatile Objects | |
| @section Volatile Objects | |
| @cindex volatile objects | |
| The keyword @code{volatile} is often misunderstood in portable code. | |
| Its use inhibits some memory-access optimizations, but programmers often | |
| wish that it had a different meaning than it actually does. | |
| @code{volatile} was designed for code that accesses special objects like | |
| memory-mapped device registers whose contents spontaneously change. | |
| Such code is inherently low-level, and it is difficult to specify | |
| portably what @code{volatile} means in these cases. The C standard | |
| says, ``What constitutes an access to an object that has | |
| volatile-qualified type is implementation-defined,'' so in theory each | |
| implementation is supposed to fill in the gap by documenting what | |
| @code{volatile} means for that implementation. In practice, though, | |
| this documentation is usually absent or incomplete. | |
| One area of confusion is the distinction between objects defined with | |
| volatile types, and volatile lvalues. From the C standard's point of | |
| view, an object defined with a volatile type has externally visible | |
| behavior. You can think of such objects as having little oscilloscope | |
| probes attached to them, so that the user can observe some properties of | |
| accesses to them, just as the user can observe data written to output | |
| files. However, accesses via volatile lvalues to ordinary objects | |
| are merely side effects (i.e., changes to the state of the execution | |
| environment), and the implementation is not required to document | |
| their visibility any further. For example: | |
| @example | |
| /* Declare and access a volatile object. | |
| Accesses to X are "visible" to users. */ | |
| static int volatile x; | |
| x = 1; | |
| /* Access two ordinary objects via a volatile lvalue. | |
| Although each read and write is a side effect, | |
| the accesses are not directly "visible" to users. */ | |
| int y = 0; | |
| int *z = malloc (sizeof *z); | |
| *z = 7; | |
| int volatile *p; | |
| p = &y; | |
| *p = *p + 1; | |
| p = z; | |
| *p = *p + 1; | |
| @end example | |
| Programmers often wish that @code{volatile} meant ``Perform the memory | |
| access here and now, without merging several memory accesses, without | |
| changing the memory word size, and without reordering.'' But the C | |
| standard does not require this. For objects defined with a volatile | |
| type, accesses must be done before the next sequence point; but | |
| otherwise merging, reordering, and word-size change is allowed. | |
| Even when accessing objects defined with a volatile type, | |
| the C standard allows only | |
| extremely limited signal handlers: in C23 the behavior is undefined if a | |
| signal handler refers to any non-local object that is not a lock-free | |
| atomic object and that is not @code{constexpr} (other than by writing to | |
| a @code{sig_atomic_t volatile} object), or calls any standard library | |
| function other than from a small set that includes @code{abort}, | |
| @code{_Exit}, @code{quick_exit}, some @code{<stdatomic.h>} functions, | |
| and @code{signal}. Hence C compilers need not worry about a signal | |
| handler disturbing ordinary computation. POSIX allows some additional | |
| behavior in a portable signal handler, but is still quite restrictive. | |
| @xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the | |
| GNU Compiler Collection (GCC)}, for some | |
| restrictions imposed by GCC. @xref{Defining Handlers, , | |
| Defining Signal Handlers, libc, The GNU C Library}, for some | |
| restrictions imposed by the GNU C library. Restrictions | |
| differ on other platforms. | |
| If possible, it is best to use a signal handler that fits within the | |
| limits imposed by the C and POSIX standards. | |
| If this is not practical, you can try the following rules of thumb. A | |
| signal handler should access only volatile lvalues, preferably lvalues | |
| that refer to objects defined with a volatile type, and should not | |
| assume that the accessed objects have an internally consistent state | |
| if they are larger than a machine word. Furthermore, installers | |
| should employ compilers and compiler options that are commonly used | |
| for building operating system kernels, because kernels often need more | |
| from @code{volatile} than the C Standard requires, and installers who | |
| compile an application in a similar environment can sometimes benefit | |
| from the extra constraints imposed by kernels on compilers. | |
| Admittedly we are hand-waving somewhat here, as there are few | |
| guarantees in this area; the rules of thumb may help to fix some bugs | |
| but there is a good chance that they will not fix them all. | |
| For @code{volatile}, C++ has the same problems that C does. | |
| Multithreaded applications have even more problems with @code{volatile}, | |
| but they are beyond the scope of this section. | |
| The bottom line is that using @code{volatile} typically hurts | |
| performance but should not hurt correctness. In some cases its use | |
| does help correctness, but these cases are often so poorly understood | |
| that all too often adding @code{volatile} to a data structure merely | |
| alleviates some symptoms of a bug while not fixing the bug in general. | |
| @node Floating Point Portability | |
| @section Floating Point Portability | |
| @cindex floating point | |
| Almost all modern systems use IEEE-754 floating point, and it is safe to | |
| assume IEEE-754 in most portable code these days. For more information, | |
| please see David Goldberg's classic paper | |
| @uref{https://@/www.validlab.com/@/goldberg/@/paper.pdf, What Every Computer | |
| Scientist Should Know About Floating-Point Arithmetic}. | |
| @node Exiting Portably | |
| @section Exiting Portably | |
| @cindex exiting portably | |
| A C or C++ program can exit with status @var{N} by returning | |
| @var{N} from the @code{main} function. Portable programs are supposed | |
| to exit either with status 0 or @code{EXIT_SUCCESS} to succeed, or with | |
| status @code{EXIT_FAILURE} to fail, but in practice it is portable to | |
| fail by exiting with status 1, and test programs that assume POSIX can | |
| fail by exiting with status values from 1 through 255. | |
| A program can also exit with status @var{N} by passing @var{N} to the | |
| @code{exit} function, and a program can fail by calling the @code{abort} | |
| function. If a program is specialized to just some platforms, it can fail | |
| by calling functions specific to those platforms, e.g., @code{_exit} | |
| (POSIX). However, like other functions, an exit | |
| function should be declared, typically by including a header. For | |
| example, if a C program calls @code{exit}, it should include @file{stdlib.h} | |
| either directly or via the default includes (@pxref{Default Includes}). | |
| A program can fail due to undefined behavior such as dereferencing a null | |
| pointer, but this is not recommended as undefined behavior allows an | |
| implementation to do whatever it pleases and this includes exiting | |
| successfully. | |
| @c ================================================== Manual Configuration | |
| @node Manual Configuration | |
| @chapter Manual Configuration | |
| A few kinds of features can't be guessed automatically by running test | |
| programs. For example, the details of the object-file format, or | |
| special options that need to be passed to the compiler or linker. | |
| Autoconf provides a uniform method for handling unguessable features, | |
| by giving each operating system a @dfn{canonical system type}, also | |
| known as a @dfn{canonical name} or @dfn{target triplet}. | |
| @prindex @command{config.guess} | |
| @prindex @command{config.sub} | |
| If you use any of the macros described in this chapter, you must | |
| distribute the helper scripts @command{config.guess} and | |
| @command{config.sub} along with your source code. Some Autoconf macros | |
| use these macros internally, so you may need to distribute these scripts | |
| even if you do not use any of these macros yourself. @xref{Input}, for | |
| information about the @code{AC_CONFIG_AUX_DIR} macro which you can use | |
| to control in which directory @command{configure} looks for helper | |
| scripts, and where to get the scripts from. | |
| @menu | |
| * Specifying Target Triplets:: Specifying target triplets | |
| * Canonicalizing:: Getting the canonical system type | |
| * Using System Type:: What to do with the system type | |
| @end menu | |
| @node Specifying Target Triplets | |
| @section Specifying target triplets | |
| @cindex System type | |
| @cindex Target triplet | |
| @c This node used to be named Specifying Names. The @anchor allows old | |
| @c links to still work. | |
| @anchor{Specifying Names} | |
| Autoconf-generated | |
| @command{configure} scripts can make decisions based on a canonical name | |
| for the system type, or @dfn{target triplet}, which has the form: | |
| @samp{@var{cpu}-@var{vendor}-@var{os}}, where @var{os} can be | |
| @samp{@var{system}} or @samp{@var{kernel}-@var{system}} | |
| @command{configure} can usually guess the canonical name for the type of | |
| system it's running on. To do so it runs a script called | |
| @command{config.guess}, which infers the name using the @code{uname} | |
| command or symbols predefined by the C preprocessor. | |
| Alternately, the user can specify the system type with command line | |
| arguments to @command{configure} (@pxref{System Types}. Doing so is | |
| necessary when | |
| cross-compiling. In the most complex case of cross-compiling, three | |
| system types are involved. The options to specify them are: | |
| @table @option | |
| @item --build=@var{build-type} | |
| the type of system on which the package is being configured and | |
| compiled. It defaults to the result of running @command{config.guess}. | |
| Specifying a @var{build-type} that differs from @var{host-type} enables | |
| cross-compilation mode. | |
| @item --host=@var{host-type} | |
| the type of system on which the package runs. By default it is the | |
| same as the build machine. The tools that get used to build and | |
| manipulate binaries will, by default, all be prefixed with | |
| @code{@var{host-type}-}, such as @code{@var{host-type}-gcc}, | |
| @code{@var{host-type}-g++}, @code{@var{host-type}-ar}, and | |
| @code{@var{host-type}-nm}. If the binaries produced by these tools can | |
| be executed by the build system, the configure script will make use of | |
| it in @code{AC_RUN_IFELSE} invocations; otherwise, cross-compilation | |
| mode is enabled. Specifying a @var{host-type} that differs | |
| from @var{build-type}, when @var{build-type} was also explicitly | |
| specified, equally enables cross-compilation mode. | |
| @item --target=@var{target-type} | |
| the type of system for which any compiler tools in the package | |
| produce code (rarely needed). By default, it is the same as host. | |
| @end table | |
| If you mean to override the result of @command{config.guess} but | |
| still produce binaries for the build machine, use @option{--build}, | |
| not @option{--host}. | |
| So, for example, to produce binaries for 64-bit MinGW, use a command | |
| like this: | |
| @example | |
| ./configure --host=x86_64-w64-mingw64 | |
| @end example | |
| If your system has the ability to execute MinGW binaries but you don't | |
| want to make use of this feature and instead prefer cross-compilation | |
| guesses, use a command like this: | |
| @example | |
| ./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64 | |
| @end example | |
| @noindent | |
| Note that if you do not specify @option{--host}, @command{configure} | |
| fails if it can't run the code generated by the specified compiler. For | |
| example, configuring as follows fails: | |
| @example | |
| ./configure CC=x86_64-w64-mingw64-gcc | |
| @end example | |
| When cross-compiling, @command{configure} will warn about any tools | |
| (compilers, linkers, assemblers) whose name is not prefixed with the | |
| host type. This is an aid to users performing cross-compilation. | |
| Continuing the example above, if a cross-compiler named @command{cc} is | |
| used with a native @command{pkg-config}, then libraries found by | |
| @command{pkg-config} will likely cause subtle build failures; but using | |
| the names @command{x86_64-w64-mingw64-gcc} and | |
| @command{x86_64-w64-mingw64-pkg-config} | |
| avoids any confusion. Avoiding the warning is as simple as creating the | |
| correct symlinks naming the cross tools. | |
| @cindex @command{config.sub} | |
| @command{configure} recognizes short aliases for some system types; for | |
| example, @samp{mingw64} can be used instead of | |
| @samp{x86_64-pc-mingw64}. @command{configure} runs a script called | |
| @command{config.sub} to canonicalize system type aliases. | |
| This section deliberately omits the description of the obsolete | |
| interface; see @ref{Hosts and Cross-Compilation}. | |
| @node Canonicalizing | |
| @section Getting the Canonical System Type | |
| @cindex System type | |
| @cindex Canonical system type | |
| The following macros make the system type available to @command{configure} | |
| scripts. | |
| @ovindex build_alias | |
| @ovindex host_alias | |
| @ovindex target_alias | |
| The variables @samp{build_alias}, @samp{host_alias}, and | |
| @samp{target_alias} are always exactly the arguments of @option{--build}, | |
| @option{--host}, and @option{--target}; in particular, they are left empty | |
| if the user did not use them, even if the corresponding | |
| @code{AC_CANONICAL} macro was run. Any configure script may use these | |
| variables anywhere. These are the variables that should be used when in | |
| interaction with the user. | |
| If you need to recognize some special environments based on their system | |
| type, run the following macros to get canonical system names. These | |
| variables are not set before the macro call. | |
| @defmac AC_CANONICAL_BUILD | |
| @acindex{CANONICAL_BUILD} | |
| @ovindex build | |
| @ovindex build_cpu | |
| @ovindex build_vendor | |
| @ovindex build_os | |
| Compute the canonical build-system type variable, @code{build}, and its | |
| three individual parts @code{build_cpu}, @code{build_vendor}, and | |
| @code{build_os}. | |
| If @option{--build} was specified, then @code{build} is the | |
| canonicalization of @code{build_alias} by @command{config.sub}, | |
| otherwise it is determined by the shell script @command{config.guess}. | |
| @end defmac | |
| @defmac AC_CANONICAL_HOST | |
| @acindex{CANONICAL_HOST} | |
| @ovindex host | |
| @ovindex host_cpu | |
| @ovindex host_vendor | |
| @ovindex host_os | |
| Compute the canonical host-system type variable, @code{host}, and its | |
| three individual parts @code{host_cpu}, @code{host_vendor}, and | |
| @code{host_os}. | |
| If @option{--host} was specified, then @code{host} is the | |
| canonicalization of @code{host_alias} by @command{config.sub}, | |
| otherwise it defaults to @code{build}. | |
| @end defmac | |
| @defmac AC_CANONICAL_TARGET | |
| @acindex{CANONICAL_TARGET} | |
| @ovindex target | |
| @ovindex target_cpu | |
| @ovindex target_vendor | |
| @ovindex target_os | |
| Compute the canonical target-system type variable, @code{target}, and its | |
| three individual parts @code{target_cpu}, @code{target_vendor}, and | |
| @code{target_os}. | |
| If @option{--target} was specified, then @code{target} is the | |
| canonicalization of @code{target_alias} by @command{config.sub}, | |
| otherwise it defaults to @code{host}. | |
| @end defmac | |
| Note that there can be artifacts due to the backward compatibility | |
| code. @xref{Hosts and Cross-Compilation}, for more. | |
| @node Using System Type | |
| @section Using the System Type | |
| In @file{configure.ac} the system type is generally used by one or more | |
| @code{case} statements to select system-specifics. Shell wildcards can | |
| be used to match a group of system types. | |
| For example, an extra assembler code object file could be chosen, giving | |
| access to a CPU cycle counter register. @code{$(CYCLE_OBJ)} in the | |
| following would be used in a makefile to add the object to a | |
| program or library. | |
| @example | |
| AS_CASE([$host], | |
| [aarch64*-*-*], [CYCLE_OBJ=pmccntr.o], | |
| [i?86-*-*], [CYCLE_OBJ=rdtsc.o], | |
| [CYCLE_OBJ=""]) | |
| AC_SUBST([CYCLE_OBJ]) | |
| @end example | |
| @code{AC_CONFIG_LINKS} (@pxref{Configuration Links}) is another good way | |
| to select variant source files, for example optimized code for some | |
| CPUs. The configured CPU type doesn't always indicate exact CPU types, | |
| so some runtime capability checks may be necessary too. | |
| @example | |
| AS_CASE([$host], | |
| [aarch64*-*-*], [AC_CONFIG_LINKS([dither.c:aarch64/dither.c])], | |
| [powerpc*-*-*], [AC_CONFIG_LINKS([dither.c:powerpc/dither.c])], | |
| [AC_CONFIG_LINKS([dither.c:generic/dither.c])]) | |
| @end example | |
| The host system type can also be used to find cross-compilation tools | |
| with @code{AC_CHECK_TOOL} (@pxref{Generic Programs}). | |
| The above examples all show @samp{$host}, since this is where the code | |
| is going to run. Only rarely is it necessary to test @samp{$build} | |
| (which is where the build is being done). | |
| Whenever you're tempted to use @samp{$host} it's worth considering | |
| whether some sort of probe would be better. New system types come along | |
| periodically or previously missing features are added. Well-written | |
| probes can adapt themselves to such things, but hard-coded lists of | |
| names can't. Here are some guidelines, | |
| @itemize @bullet | |
| @item | |
| Availability of libraries and library functions should always be checked | |
| by probing. | |
| @item | |
| Variant behavior of system calls is best identified with runtime tests | |
| if possible, but bug workarounds or obscure difficulties might have to | |
| be driven from @samp{$host}. | |
| @item | |
| Assembler code is inevitably highly CPU-specific and is best selected | |
| according to @samp{$host_cpu}. | |
| @item | |
| Assembler variations like underscore prefix on globals or ELF versus | |
| COFF type directives are however best determined by probing, perhaps | |
| even examining the compiler output. | |
| @end itemize | |
| @samp{$target} is for use by a package creating a compiler or similar. | |
| For ordinary packages it's meaningless and should not be used. It | |
| indicates what the created compiler should generate code for, if it can | |
| cross-compile. @samp{$target} generally selects various hard-coded CPU | |
| and system conventions, since usually the compiler or tools under | |
| construction themselves determine how the target works. | |
| @c ===================================================== Site Configuration. | |
| @node Site Configuration | |
| @chapter Site Configuration | |
| @command{configure} scripts support several kinds of local configuration | |
| decisions. There are ways for users to specify where external software | |
| packages are, include or exclude optional features, install programs | |
| under modified names, and set default values for @command{configure} | |
| options. | |
| @menu | |
| * Help Formatting:: Customizing @samp{configure --help} | |
| * External Software:: Working with other optional software | |
| * Package Options:: Selecting optional features | |
| * Pretty Help Strings:: Formatting help string | |
| * Option Checking:: Controlling checking of @command{configure} options | |
| * Site Details:: Configuring site details | |
| * Transforming Names:: Changing program names when installing | |
| * Site Defaults:: Giving @command{configure} local defaults | |
| @end menu | |
| @node Help Formatting | |
| @section Controlling Help Output | |
| Users consult @samp{configure --help} to learn of configuration | |
| decisions specific to your package. By default, @command{configure} | |
| breaks this output into sections for each type of option; within each | |
| section, help strings appear in the order @file{configure.ac} defines | |
| them: | |
| @example | |
| Optional Features: | |
| @dots{} | |
| --enable-bar include bar | |
| Optional Packages: | |
| @dots{} | |
| --with-foo use foo | |
| @end example | |
| @defmac AC_PRESERVE_HELP_ORDER | |
| @acindex{PRESERVE_HELP_ORDER} | |
| Request an alternate @option{--help} format, in which options of all | |
| types appear together, in the order defined. Call this macro before any | |
| @code{AC_ARG_ENABLE} or @code{AC_ARG_WITH}. | |
| @example | |
| Optional Features and Packages: | |
| @dots{} | |
| --enable-bar include bar | |
| --with-foo use foo | |
| @end example | |
| @end defmac | |
| @node External Software | |
| @section Working With External Software | |
| @cindex External software | |
| Some packages require, or can optionally use, other software packages | |
| that are already installed. The user can give @command{configure} | |
| command line options to specify which such external software to use. | |
| The options have one of these forms: | |
| @c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something | |
| @c awful. | |
| @example | |
| --with-@var{package}@r{[}=@var{arg}@r{]} | |
| --without-@var{package} | |
| @end example | |
| For example, @option{--with-gnu-ld} means work with the GNU linker | |
| instead of some other linker. @option{--with-x} means work with The X | |
| Window System. | |
| The user can give an argument by following the package name with | |
| @samp{=} and the argument. Giving an argument of @samp{no} is for | |
| packages that are used by default; it says to @emph{not} use the | |
| package. An argument that is neither @samp{yes} nor @samp{no} could | |
| include a name or number of a version of the other package, to specify | |
| more precisely which other package this program is supposed to work | |
| with. If no argument is given, it defaults to @samp{yes}. | |
| @option{--without-@var{package}} is equivalent to | |
| @option{--with-@var{package}=no}. | |
| Normally @command{configure} scripts complain about | |
| @option{--with-@var{package}} options that they do not support. | |
| @xref{Option Checking}, for details, and for how to override the | |
| defaults. | |
| For each external software package that may be used, @file{configure.ac} | |
| should call @code{AC_ARG_WITH} to detect whether the @command{configure} | |
| user asked to use it. Whether each package is used or not by default, | |
| and which arguments are valid, is up to you. | |
| @anchor{AC_ARG_WITH} | |
| @defmac AC_ARG_WITH (@var{package}, @var{help-string}, @ | |
| @ovar{action-if-given}, @ovar{action-if-not-given}) | |
| @acindex{ARG_WITH} | |
| If the user gave @command{configure} the option @option{--with-@var{package}} | |
| or @option{--without-@var{package}}, run shell commands | |
| @var{action-if-given}. If neither option was given, run shell commands | |
| @var{action-if-not-given}. The name @var{package} indicates another | |
| software package that this program should work with. It should consist | |
| only of alphanumeric characters, dashes, plus signs, and dots. | |
| The option's argument is available to the shell commands | |
| @var{action-if-given} in the shell variable @code{withval}, which is | |
| actually just the value of the shell variable named | |
| @code{with_@var{package}}, with any non-alphanumeric characters in | |
| @var{package} changed into @samp{_}. You may use that variable instead, | |
| if you wish. | |
| Note that @var{action-if-not-given} is not expanded until the point that | |
| @code{AC_ARG_WITH} was expanded. If you need the value of | |
| @code{with_@var{package}} set to a default value by the time argument | |
| parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS} | |
| diversion (@pxref{m4_divert_text}) (if done as an argument to | |
| @code{AC_ARG_WITH}, also provide non-diverted text to avoid a shell | |
| syntax error). | |
| The argument @var{help-string} is a description of the option that | |
| looks like this: | |
| @example | |
| --with-readline support fancy command line editing | |
| @end example | |
| @noindent | |
| @var{help-string} may be more than one line long, if more detail is | |
| needed. Just make sure the columns line up in @samp{configure | |
| --help}. Avoid tabs in the help string. The easiest way to provide the | |
| proper leading whitespace is to format your @var{help-string} with the macro | |
| @code{AS_HELP_STRING} (@pxref{Pretty Help Strings}). | |
| The following example shows how to use the @code{AC_ARG_WITH} macro in | |
| a common situation. You want to let the user decide whether to enable | |
| support for an external library (e.g., the readline library); if the user | |
| specified neither @option{--with-readline} nor @option{--without-readline}, | |
| you want to enable support for readline only if the library is available | |
| on the system. | |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. | |
| @example | |
| AC_ARG_WITH([readline], | |
| [AS_HELP_STRING([--with-readline], | |
| [support fancy command line editing @@<:@@default=check@@:>@@])], | |
| [], | |
| [: m4_divert_text([DEFAULTS], [with_readline=check])]) | |
| LIBREADLINE= | |
| AS_IF([test "x$with_readline" != xno], | |
| [AC_CHECK_LIB([readline], [main], | |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) | |
| AC_DEFINE([HAVE_LIBREADLINE], [1], | |
| [Define if you have libreadline]) | |
| ], | |
| [if test "x$with_readline" != xcheck; then | |
| AC_MSG_FAILURE( | |
| [--with-readline was given, but test for readline failed]) | |
| fi | |
| ], -lncurses)]) | |
| @end example | |
| The next example shows how to use @code{AC_ARG_WITH} to give the user the | |
| possibility to enable support for the readline library, in case it is still | |
| experimental and not well tested, and is therefore disabled by default. | |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. | |
| @example | |
| AC_ARG_WITH([readline], | |
| [AS_HELP_STRING([--with-readline], | |
| [enable experimental support for readline])], | |
| [], | |
| [with_readline=no]) | |
| LIBREADLINE= | |
| AS_IF([test "x$with_readline" != xno], | |
| [AC_CHECK_LIB([readline], [main], | |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) | |
| AC_DEFINE([HAVE_LIBREADLINE], [1], | |
| [Define if you have libreadline]) | |
| ], | |
| [AC_MSG_FAILURE( | |
| [--with-readline was given, but test for readline failed])], | |
| [-lncurses])]) | |
| @end example | |
| The last example shows how to use @code{AC_ARG_WITH} to give the user the | |
| possibility to disable support for the readline library, given that it is | |
| an important feature and that it should be enabled by default. | |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. | |
| @example | |
| AC_ARG_WITH([readline], | |
| [AS_HELP_STRING([--without-readline], | |
| [disable support for readline])], | |
| [], | |
| [with_readline=yes]) | |
| LIBREADLINE= | |
| AS_IF([test "x$with_readline" != xno], | |
| [AC_CHECK_LIB([readline], [main], | |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) | |
| AC_DEFINE([HAVE_LIBREADLINE], [1], | |
| [Define if you have libreadline]) | |
| ], | |
| [AC_MSG_FAILURE( | |
| [readline test failed (--without-readline to disable)])], | |
| [-lncurses])]) | |
| @end example | |
| These three examples can be easily adapted to the case where | |
| @code{AC_ARG_ENABLE} should be preferred to @code{AC_ARG_WITH} (see | |
| @ref{Package Options}). | |
| @end defmac | |
| @node Package Options | |
| @section Choosing Package Options | |
| @cindex Package options | |
| @cindex Options, package | |
| If a software package has optional compile-time features, the user can | |
| give @command{configure} command line options to specify whether to | |
| compile them. The options have one of these forms: | |
| @c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something | |
| @c awful. | |
| @example | |
| --enable-@var{feature}@r{[}=@var{arg}@r{]} | |
| --disable-@var{feature} | |
| @end example | |
| These options allow users to choose which optional features to build and | |
| install. @option{--enable-@var{feature}} options should never make a | |
| feature behave differently or cause one feature to replace another. | |
| They should only cause parts of the program to be built rather than left | |
| out. | |
| The user can give an argument by following the feature name with | |
| @samp{=} and the argument. Giving an argument of @samp{no} requests | |
| that the feature @emph{not} be made available. A feature with an | |
| argument looks like @option{--enable-debug=stabs}. If no argument is | |
| given, it defaults to @samp{yes}. @option{--disable-@var{feature}} is | |
| equivalent to @option{--enable-@var{feature}=no}. | |
| Normally @command{configure} scripts complain about | |
| @option{--enable-@var{package}} options that they do not support. | |
| @xref{Option Checking}, for details, and for how to override the | |
| defaults. | |
| For each optional feature, @file{configure.ac} should call | |
| @code{AC_ARG_ENABLE} to detect whether the @command{configure} user asked | |
| to include it. Whether each feature is included or not by default, and | |
| which arguments are valid, is up to you. | |
| @anchor{AC_ARG_ENABLE} | |
| @defmac AC_ARG_ENABLE (@var{feature}, @var{help-string}, @ | |
| @ovar{action-if-given}, @ovar{action-if-not-given}) | |
| @acindex{ARG_ENABLE} | |
| If the user gave @command{configure} the option | |
| @option{--enable-@var{feature}} or @option{--disable-@var{feature}}, run | |
| shell commands @var{action-if-given}. If neither option was given, run | |
| shell commands @var{action-if-not-given}. The name @var{feature} | |
| indicates an optional user-level facility. It should consist only of | |
| alphanumeric characters, dashes, plus signs, and dots. | |
| The option's argument is available to the shell commands | |
| @var{action-if-given} in the shell variable @code{enableval}, which is | |
| actually just the value of the shell variable named | |
| @code{enable_@var{feature}}, with any non-alphanumeric characters in | |
| @var{feature} changed into @samp{_}. You may use that variable instead, | |
| if you wish. The @var{help-string} argument is like that of | |
| @code{AC_ARG_WITH} (@pxref{External Software}). | |
| Note that @var{action-if-not-given} is not expanded until the point that | |
| @code{AC_ARG_ENABLE} was expanded. If you need the value of | |
| @code{enable_@var{feature}} set to a default value by the time argument | |
| parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS} | |
| diversion (@pxref{m4_divert_text}) (if done as an argument to | |
| @code{AC_ARG_ENABLE}, also provide non-diverted text to avoid a shell | |
| syntax error). | |
| You should format your @var{help-string} with the macro | |
| @code{AS_HELP_STRING} (@pxref{Pretty Help Strings}). | |
| See the examples suggested with the definition of @code{AC_ARG_WITH} | |
| (@pxref{External Software}) to get an idea of possible applications of | |
| @code{AC_ARG_ENABLE}. | |
| @end defmac | |
| @node Pretty Help Strings | |
| @section Making Your Help Strings Look Pretty | |
| @cindex Help strings | |
| Properly formatting the @samp{help strings} which are used in | |
| @code{AC_ARG_WITH} (@pxref{External Software}) and @code{AC_ARG_ENABLE} | |
| (@pxref{Package Options}) can be challenging. Specifically, you want | |
| your own @samp{help strings} to line up in the appropriate columns of | |
| @samp{configure --help} just like the standard Autoconf @samp{help | |
| strings} do. This is the purpose of the @code{AS_HELP_STRING} macro. | |
| @anchor{AS_HELP_STRING} | |
| @defmac AS_HELP_STRING (@var{left-hand-side}, @var{right-hand-side} @ | |
| @dvar{indent-column, 26}, @dvar{wrap-column, 79}) | |
| @asindex{HELP_STRING} | |
| Expands into a help string that looks pretty when the user executes | |
| @samp{configure --help}. It is typically used in @code{AC_ARG_WITH} | |
| (@pxref{External Software}) or @code{AC_ARG_ENABLE} (@pxref{Package | |
| Options}). The following example makes this clearer. | |
| @example | |
| AC_ARG_WITH([foo], | |
| [AS_HELP_STRING([--with-foo], | |
| [use foo (default is no)])], | |
| [use_foo=$withval], | |
| [use_foo=no]) | |
| @end example | |
| Then the last few lines of @samp{configure --help} appear like | |
| this: | |
| @example | |
| --enable and --with options recognized: | |
| --with-foo use foo (default is no) | |
| @end example | |
| Macro expansion is performed on the first argument. However, the second | |
| argument of @code{AS_HELP_STRING} is treated as a whitespace separated | |
| list of text to be reformatted, and is not subject to macro expansion. | |
| Since it is not expanded, it should not be double quoted. | |
| @xref{Autoconf Language}, for a more detailed explanation. | |
| The @code{AS_HELP_STRING} macro is particularly helpful when the | |
| @var{left-hand-side} and/or @var{right-hand-side} are composed of macro | |
| arguments, as shown in the following example. Be aware that | |
| @var{left-hand-side} may not expand to unbalanced quotes, | |
| although quadrigraphs can be used. | |
| @example | |
| AC_DEFUN([MY_ARG_WITH], | |
| [AC_ARG_WITH(m4_translit([[$1]], [_], [-]), | |
| [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])], | |
| [use $1 (default is $2)])], | |
| [use_[]$1=$withval], | |
| [use_[]$1=$2])]) | |
| MY_ARG_WITH([a_b], [no]) | |
| @end example | |
| @noindent | |
| Here, the last few lines of @samp{configure --help} will include: | |
| @example | |
| --enable and --with options recognized: | |
| --with-a-b use a_b (default is no) | |
| @end example | |
| The parameters @var{indent-column} and @var{wrap-column} were introduced | |
| in Autoconf 2.62. Generally, they should not be specified; they exist | |
| for fine-tuning of the wrapping. | |
| @example | |
| AS_HELP_STRING([--option], [description of option]) | |
| @result{} --option description of option | |
| AS_HELP_STRING([--option], [description of option], [15], [30]) | |
| @result{} --option description of | |
| @result{} option | |
| @end example | |
| @end defmac | |
| @node Option Checking | |
| @section Controlling Checking of @command{configure} Options | |
| @cindex Options, Package | |
| The @command{configure} script checks its command-line options against a | |
| list of known options, like @option{--help} or @option{--config-cache}. | |
| An unknown option ordinarily indicates a mistake by the user and | |
| @command{configure} halts with an error. However, by default unknown | |
| @option{--with-@var{package}} and @option{--enable-@var{feature}} | |
| options elicit only a warning, to support configuring entire source | |
| trees. | |
| Source trees often contain multiple packages with a top-level | |
| @command{configure} script that uses the @code{AC_CONFIG_SUBDIRS} macro | |
| (@pxref{Subdirectories}). Because the packages generally support | |
| different @option{--with-@var{package}} and | |
| @option{--enable-@var{feature}} options, the GNU Coding | |
| Standards say they must accept unrecognized options without halting. | |
| Even a warning message is undesirable here, so @code{AC_CONFIG_SUBDIRS} | |
| automatically disables the warnings. | |
| This default behavior may be modified in two ways. First, the installer | |
| can invoke @code{configure --disable-option-checking} to disable | |
| these warnings, or invoke @code{configure --enable-option-checking=fatal} | |
| options to turn them into fatal errors, respectively. Second, the | |
| maintainer can use @code{AC_DISABLE_OPTION_CHECKING}. | |
| @defmac AC_DISABLE_OPTION_CHECKING | |
| @acindex{DISABLE_OPTION_CHECKING} | |
| By default, disable warnings related to any unrecognized | |
| @option{--with-@var{package}} or @option{--enable-@var{feature}} | |
| options. This is implied by @code{AC_CONFIG_SUBDIRS}. | |
| The installer can override this behavior by passing | |
| @option{--enable-option-checking} (enable warnings) or | |
| @option{--enable-option-checking=fatal} (enable errors) to | |
| @command{configure}. | |
| @end defmac | |
| @node Site Details | |
| @section Configuring Site Details | |
| @cindex Site details | |
| Some software packages require complex site-specific information. Some | |
| examples are host names to use for certain services, company names, and | |
| email addresses to contact. Since some configuration scripts generated | |
| by Metaconfig ask for such information interactively, people sometimes | |
| wonder how to get that information in Autoconf-generated configuration | |
| scripts, which aren't interactive. | |
| Such site configuration information should be put in a file that is | |
| edited @emph{only by users}, not by programs. The location of the file | |
| can either be based on the @code{prefix} variable, or be a standard | |
| location such as the user's home directory. It could even be specified | |
| by an environment variable. The programs should examine that file at | |
| runtime, rather than at compile time. Runtime configuration is more | |
| convenient for users and makes the configuration process simpler than | |
| getting the information while configuring. @xref{Directory Variables, , | |
| Variables for Installation Directories, standards, The GNU Coding | |
| Standards}, for more information on where to put data files. | |
| @node Transforming Names | |
| @section Transforming Program Names When Installing | |
| @cindex Transforming program names | |
| @cindex Program names, transforming | |
| Autoconf supports changing the names of programs when installing them. | |
| In order to use these transformations, @file{configure.ac} must call the | |
| macro @code{AC_ARG_PROGRAM}. | |
| @defmac AC_ARG_PROGRAM | |
| @acindex{ARG_PROGRAM} | |
| @ovindex program_transform_name | |
| Place in output variable @code{program_transform_name} a sequence of | |
| @code{sed} commands for changing the names of installed programs. | |
| If any of the options described below are given to @command{configure}, | |
| program names are transformed accordingly. Otherwise, if | |
| @code{AC_CANONICAL_TARGET} has been called and a @option{--target} value | |
| is given, the target type followed by a dash is used as a prefix. | |
| Otherwise, no program name transformation is done. | |
| @end defmac | |
| @menu | |
| * Transformation Options:: @command{configure} options to transform names | |
| * Transformation Examples:: Sample uses of transforming names | |
| * Transformation Rules:: Makefile uses of transforming names | |
| @end menu | |
| @node Transformation Options | |
| @subsection Transformation Options | |
| You can specify name transformations by giving @command{configure} these | |
| command line options: | |
| @table @option | |
| @item --program-prefix=@var{prefix} | |
| prepend @var{prefix} to the names; | |
| @item --program-suffix=@var{suffix} | |
| append @var{suffix} to the names; | |
| @item --program-transform-name=@var{expression} | |
| perform @code{sed} substitution @var{expression} on the names. | |
| @end table | |
| @node Transformation Examples | |
| @subsection Transformation Examples | |
| These transformations are useful with programs that can be part of a | |
| cross-compilation development environment. For example, a | |
| cross-assembler running on x86-64 configured with | |
| @option{--target=aarch64-linux-gnu} is normally installed as | |
| @file{aarch64-linux-gnu-as}, rather than @file{as}, which could be confused | |
| with a native x86-64 assembler. | |
| You can force a program name to begin with @file{g}, if you don't want | |
| GNU programs installed on your system to shadow other programs with | |
| the same name. For example, if you configure GNU @code{diff} with | |
| @option{--program-prefix=g}, then when you run @samp{make install} it is | |
| installed as @file{/usr/local/bin/gdiff}. | |
| As a more sophisticated example, you could use | |
| @example | |
| --program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/' | |
| @end example | |
| @noindent | |
| to prepend @samp{g} to most of the program names in a source tree, | |
| excepting those like @code{gdb} that already have one and those like | |
| @code{less} and @code{lesskey} that aren't GNU programs. (That is | |
| assuming that you have a source tree containing those programs that is | |
| set up to use this feature.) | |
| One way to install multiple versions of some programs simultaneously is | |
| to append a version number to the name of one or both. For example, if | |
| you want to keep Autoconf version 1 around for awhile, you can configure | |
| Autoconf version 2 using @option{--program-suffix=2} to install the | |
| programs as @file{/usr/local/bin/autoconf2}, | |
| @file{/usr/local/bin/autoheader2}, etc. Nevertheless, pay attention | |
| that only the binaries are renamed, therefore you'd have problems with | |
| the library files which might overlap. | |
| @node Transformation Rules | |
| @subsection Transformation Rules | |
| Here is how to use the variable @code{program_transform_name} in a | |
| @file{Makefile.in}: | |
| @example | |
| PROGRAMS = cp ls rm | |
| transform = @@program_transform_name@@ | |
| install: | |
| for p in $(PROGRAMS); do \ | |
| $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \ | |
| sed '$(transform)'`; \ | |
| done | |
| uninstall: | |
| for p in $(PROGRAMS); do \ | |
| rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \ | |
| @c $$ restore font-lock | |
| done | |
| @end example | |
| It is guaranteed that @code{program_transform_name} is never empty, and | |
| that there are no useless separators. Therefore you may safely embed | |
| @code{program_transform_name} within a sed program using @samp{;}: | |
| @example | |
| transform = @@program_transform_name@@ | |
| transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/ | |
| @end example | |
| Whether to do the transformations on documentation files (Texinfo or | |
| @code{man}) is a tricky question; there seems to be no perfect answer, | |
| due to the several reasons for name transforming. Documentation is not | |
| usually particular to a specific architecture, and Texinfo files do not | |
| conflict with system documentation. But they might conflict with | |
| earlier versions of the same files, and @code{man} pages sometimes do | |
| conflict with system documentation. As a compromise, it is probably | |
| best to do name transformations on @code{man} pages but not on Texinfo | |
| manuals. | |
| @node Site Defaults | |
| @section Setting Site Defaults | |
| @cindex Site defaults | |
| @cindex config.site | |
| Autoconf-generated @command{configure} scripts allow your site to provide | |
| default values for some configuration values. You do this by creating | |
| site- and system-wide initialization files. | |
| @evindex CONFIG_SITE | |
| If the environment variable @code{CONFIG_SITE} is set, @command{configure} | |
| uses its value as a space-separated list of shell scripts to read; | |
| it is recommended that these be absolute file names. Otherwise, it | |
| reads the shell script @file{@var{prefix}/share/config.site} if it exists, | |
| then @file{@var{prefix}/etc/config.site} if it exists. Thus, | |
| settings in machine-specific files override those in machine-independent | |
| ones in case of conflict. | |
| Site files can be arbitrary shell scripts, but only certain kinds of | |
| code are really appropriate to be in them. Because @command{configure} | |
| reads any cache file after it has read any site files, a site file can | |
| define a default cache file to be shared between all Autoconf-generated | |
| @command{configure} scripts run on that system (@pxref{Cache Files}). If | |
| you set a default cache file in a site file, it is a good idea to also | |
| set the output variable @code{CC} in that site file, because the cache | |
| file is only valid for a particular compiler, but many systems have | |
| several available. | |
| You can examine or override the value set by a command line option to | |
| @command{configure} in a site file; options set shell variables that have | |
| the same names as the options, with any dashes turned into underscores. | |
| The exceptions are that @option{--without-} and @option{--disable-} options | |
| are like giving the corresponding @option{--with-} or @option{--enable-} | |
| option and the value @samp{no}. Thus, @option{--cache-file=localcache} | |
| sets the variable @code{cache_file} to the value @samp{localcache}; | |
| @option{--enable-warnings=no} or @option{--disable-warnings} sets the variable | |
| @code{enable_warnings} to the value @samp{no}; @option{--prefix=/usr} sets the | |
| variable @code{prefix} to the value @samp{/usr}; etc. | |
| Site files are also good places to set default values for other output | |
| variables, such as @code{CFLAGS}, if you need to give them non-default | |
| values: anything you would normally do, repetitively, on the command | |
| line. If you use non-default values for @var{prefix} or | |
| @var{exec_prefix} (wherever you locate the site file), you can set them | |
| in the site file if you specify it with the @code{CONFIG_SITE} | |
| environment variable. | |
| You can set some cache values in the site file itself. Doing this is | |
| useful if you are cross-compiling, where it is impossible to check features | |
| that require running a test program. You could ``prime the cache'' by | |
| setting those values correctly for that system in | |
| @file{@var{prefix}/etc/config.site}. To find out the names of the cache | |
| variables you need to set, see the documentation of the respective | |
| Autoconf macro. If the variables or their semantics are undocumented, | |
| you may need to look for shell variables with @samp{_cv_} in their names | |
| in the affected @command{configure} scripts, or in the Autoconf M4 | |
| source code for those macros; but in that case, their name or semantics | |
| may change in a future Autoconf version. | |
| The cache file is careful to not override any variables set in the site | |
| files. Similarly, you should not override command-line options in the | |
| site files. Your code should check that variables such as @code{prefix} | |
| and @code{cache_file} have their default values (as set near the top of | |
| @command{configure}) before changing them. | |
| Here is a sample file @file{/usr/share/local/@/gnu/share/@/config.site}. The | |
| command @samp{configure --prefix=/usr/share/local/gnu} would read this | |
| file (if @code{CONFIG_SITE} is not set to a different file). | |
| @example | |
| # /usr/share/local/gnu/share/config.site for configure | |
| # | |
| # Change some defaults. | |
| test "$prefix" = NONE && prefix=/usr/share/local/gnu | |
| test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu | |
| test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var | |
| test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var | |
| test "$runstatedir" = '$@{localstatedir@}/run' && runstatedir=/run | |
| # Give Autoconf 2.x generated configure scripts a shared default | |
| # cache file for feature test results, architecture-specific. | |
| if test "$cache_file" = /dev/null; then | |
| cache_file="$prefix/var/config.cache" | |
| # A cache file is only valid for one C compiler. | |
| CC=gcc | |
| fi | |
| @end example | |
| @c Leave this use of "File system" rendered as one word, but | |
| @c slightly obfuscated so as not to trigger the syntax-check prohibition. | |
| @cindex File@/system Hierarchy Standard | |
| @cindex FHS | |
| Another use of @file{config.site} is for priming the directory variables | |
| @c "File system", but slightly obfuscated, as above. | |
| in a manner consistent with the File@/system Hierarchy Standard | |
| (FHS). Once the following file is installed at | |
| @file{/usr/share/config.site}, a user can execute simply | |
| @code{./configure --prefix=/usr} to get all the directories chosen in | |
| the locations recommended by FHS. | |
| @example | |
| # /usr/share/config.site for FHS defaults when installing below /usr, | |
| # and the respective settings were not changed on the command line. | |
| if test "$prefix" = /usr; then | |
| test "$sysconfdir" = '$@{prefix@}/etc' && sysconfdir=/etc | |
| test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var | |
| test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var | |
| fi | |
| @end example | |
| @cindex @file{lib64} | |
| @cindex 64-bit libraries | |
| Likewise, on platforms where 64-bit libraries are built by default, then | |
| installed in @file{/usr/local/@/lib64} instead of @file{/usr/local/@/lib}, | |
| it is appropriate to install @file{/usr/local/@/share/config.site}: | |
| @example | |
| # /usr/local/share/config.site for platforms that prefer | |
| # the directory /usr/local/lib64 over /usr/local/lib. | |
| test "$libdir" = '$@{exec_prefix@}/lib' && libdir='$@{exec_prefix@}/lib64' | |
| @end example | |
| @c ============================================== Running configure Scripts. | |
| @node Running configure Scripts | |
| @chapter Running @command{configure} Scripts | |
| @cindex @command{configure} | |
| Below are instructions on how to configure a package that uses a | |
| @command{configure} script, suitable for inclusion as an @file{INSTALL} | |
| file in the package. A plain-text version of @file{INSTALL} which you | |
| may use comes with Autoconf. | |
| @menu | |
| * Basic Installation:: Instructions for typical cases | |
| * Installation Prerequisites:: What you need to install | |
| * Compilers and Options:: Selecting compilers and optimization | |
| * Multiple Architectures:: Compiling for multiple architectures at once | |
| * Installation Names:: Installing in different directories | |
| * Optional Features:: Selecting optional features | |
| * System Types:: Specifying a system type | |
| * Sharing Defaults:: Setting site-wide defaults for @command{configure} | |
| * Defining Variables:: Specifying the compiler etc. | |
| * configure Invocation:: Changing how @command{configure} runs | |
| @end menu | |
| @set autoconf | |
| @include install.texi | |
| @c ============================================== config.status Invocation | |
| @node config.status Invocation | |
| @chapter config.status Invocation | |
| @cindex @command{config.status} | |
| The @command{configure} script creates a file named @file{config.status}, | |
| which actually configures, @dfn{instantiates}, the template files. It | |
| also records the configuration options that were specified when the | |
| package was last configured in case reconfiguring is needed. | |
| Synopsis: | |
| @example | |
| ./config.status @ovar{option}@dots{} @ovar{tag}@dots{} | |
| @end example | |
| It configures each @var{tag}; if none are specified, all the templates | |
| are instantiated. A @var{tag} refers to a file or other tag associated | |
| with a configuration action, as specified by an @code{AC_CONFIG_@var{ITEMS}} | |
| macro (@pxref{Configuration Actions}). The files must be specified | |
| without their dependencies, as in | |
| @example | |
| ./config.status foobar | |
| @end example | |
| @noindent | |
| not | |
| @example | |
| ./config.status foobar:foo.in:bar.in | |
| @end example | |
| The supported options are: | |
| @table @option | |
| @item --help | |
| @itemx -h | |
| Print a summary of the command line options, the list of the template | |
| files, and exit. | |
| @item --version | |
| @itemx -V | |
| Print the version number of Autoconf and the configuration settings, | |
| and exit. | |
| @item --config | |
| Print the configuration settings in reusable way, quoted for the shell, | |
| and exit. For example, for a debugging build that otherwise reuses the | |
| configuration from a different build directory @var{build-dir} of a | |
| package in @var{src-dir}, you could use the following: | |
| @example | |
| args=`@var{build-dir}/config.status --config` | |
| eval @var{src-dir}/configure "$args" CFLAGS=-g --srcdir=@var{src-dir} | |
| @end example | |
| @noindent | |
| Note that it may be necessary to override a @option{--srcdir} setting | |
| that was saved in the configuration, if the arguments are used in a | |
| different build directory. | |
| @item --silent | |
| @itemx --quiet | |
| @itemx -q | |
| Do not print progress messages. | |
| @item --debug | |
| @itemx -d | |
| Don't remove the temporary files. | |
| @item --file=@var{file}[:@var{template}] | |
| Require that @var{file} be instantiated as if | |
| @samp{AC_CONFIG_FILES(@var{file}:@var{template})} was used. Both | |
| @var{file} and @var{template} may be @samp{-} in which case the standard | |
| output and/or standard input, respectively, is used. If a | |
| @var{template} file name is relative, it is first looked for in the build | |
| tree, and then in the source tree. @xref{Configuration Actions}, for | |
| more details. | |
| This option and the following ones provide one way for separately | |
| distributed packages to share the values computed by @command{configure}. | |
| Doing so can be useful if some of the packages need a superset of the | |
| features that one of them, perhaps a common library, does. These | |
| options allow a @file{config.status} file to create files other than the | |
| ones that its @file{configure.ac} specifies, so it can be used for a | |
| different package, or for extracting a subset of values. For example, | |
| @example | |
| echo '@@CC@@' | ./config.status --file=- | |
| @end example | |
| @noindent | |
| provides the value of @code{@@CC@@} on standard output. | |
| @item --header=@var{file}[:@var{template}] | |
| Same as @option{--file} above, but with @samp{AC_CONFIG_HEADERS}. | |
| @item --recheck | |
| Ask @file{config.status} to update itself and exit (no instantiation). | |
| This option is useful if you change @command{configure}, so that the | |
| results of some tests might be different from the previous run. The | |
| @option{--recheck} option reruns @command{configure} with the same arguments | |
| you used before, plus the @option{--no-create} option, which prevents | |
| @command{configure} from running @file{config.status} and creating | |
| @file{Makefile} and other files, and the @option{--no-recursion} option, | |
| which prevents @command{configure} from running other @command{configure} | |
| scripts in subdirectories. (This is so other Make rules can | |
| run @file{config.status} when it changes; @pxref{Automatic Remaking}, | |
| for an example). | |
| @end table | |
| @file{config.status} checks several optional environment variables that | |
| can alter its behavior: | |
| @anchor{CONFIG_SHELL} | |
| @defvar CONFIG_SHELL | |
| @evindex CONFIG_SHELL | |
| The shell with which to run @command{configure}. It must be | |
| Bourne-compatible, and the absolute name of the shell should be passed. | |
| The default is a shell that supports @code{LINENO} if available, and | |
| @file{/bin/sh} otherwise. | |
| @end defvar | |
| @defvar CONFIG_STATUS | |
| @evindex CONFIG_STATUS | |
| The file name to use for the shell script that records the | |
| configuration. The default is @file{./config.status}. This variable is | |
| useful when one package uses parts of another and the @command{configure} | |
| scripts shouldn't be merged because they are maintained separately. | |
| @end defvar | |
| You can use @file{./config.status} in your makefiles. For example, in | |
| the dependencies given above (@pxref{Automatic Remaking}), | |
| @file{config.status} is run twice when @file{configure.ac} has changed. | |
| If that bothers you, you can make each run only regenerate the files for | |
| that rule: | |
| @example | |
| @group | |
| config.h: stamp-h | |
| stamp-h: config.h.in config.status | |
| ./config.status config.h | |
| echo > stamp-h | |
| Makefile: Makefile.in config.status | |
| ./config.status Makefile | |
| @end group | |
| @end example | |
| The calling convention of @file{config.status} has changed; see | |
| @ref{Obsolete config.status Use}, for details. | |
| @c =================================================== Obsolete Constructs | |
| @node Obsolete Constructs | |
| @chapter Obsolete Constructs | |
| @cindex Obsolete constructs | |
| Autoconf changes, and throughout the years some constructs have been | |
| obsoleted. Most of the changes involve the macros, but in some cases | |
| the tools themselves, or even some concepts, are now considered | |
| obsolete. | |
| You may completely skip this chapter if you are new to Autoconf. Its | |
| intention is mainly to help maintainers updating their packages by | |
| understanding how to move to more modern constructs. | |
| @menu | |
| * Obsolete config.status Use:: Obsolete convention for @command{config.status} | |
| * acconfig Header:: Additional entries in @file{config.h.in} | |
| * autoupdate Invocation:: Automatic update of @file{configure.ac} | |
| * Obsolete Macros:: Backward compatibility macros | |
| * Autoconf 1:: Tips for upgrading your files | |
| * Autoconf 2.13:: Some fresher tips | |
| @end menu | |
| @node Obsolete config.status Use | |
| @section Obsolete @file{config.status} Invocation | |
| @file{config.status} now supports arguments to specify the files to | |
| instantiate; see @ref{config.status Invocation}, for more details. | |
| Before, environment variables had to be used. | |
| @defvar CONFIG_COMMANDS | |
| @evindex CONFIG_COMMANDS | |
| The tags of the commands to execute. The default is the arguments given | |
| to @code{AC_OUTPUT} and @code{AC_CONFIG_COMMANDS} in | |
| @file{configure.ac}. | |
| @end defvar | |
| @defvar CONFIG_FILES | |
| @evindex CONFIG_FILES | |
| The files in which to perform @samp{@@@var{variable}@@} substitutions. | |
| The default is the arguments given to @code{AC_OUTPUT} and | |
| @code{AC_CONFIG_FILES} in @file{configure.ac}. | |
| @end defvar | |
| @defvar CONFIG_HEADERS | |
| @evindex CONFIG_HEADERS | |
| The files in which to substitute C @code{#define} statements. The | |
| default is the arguments given to @code{AC_CONFIG_HEADERS}; if that | |
| macro was not called, @file{config.status} ignores this variable. | |
| @end defvar | |
| @defvar CONFIG_LINKS | |
| @evindex CONFIG_LINKS | |
| The symbolic links to establish. The default is the arguments given to | |
| @code{AC_CONFIG_LINKS}; if that macro was not called, | |
| @file{config.status} ignores this variable. | |
| @end defvar | |
| In @ref{config.status Invocation}, using this old interface, the example | |
| would be: | |
| @example | |
| @group | |
| config.h: stamp-h | |
| stamp-h: config.h.in config.status | |
| CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \ | |
| CONFIG_HEADERS=config.h ./config.status | |
| echo > stamp-h | |
| Makefile: Makefile.in config.status | |
| CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \ | |
| CONFIG_FILES=Makefile ./config.status | |
| @end group | |
| @end example | |
| @noindent | |
| (If @file{configure.ac} does not call @code{AC_CONFIG_HEADERS}, there is | |
| no need to set @code{CONFIG_HEADERS} in the @command{make} rules. Equally | |
| for @code{CONFIG_COMMANDS}, etc.) | |
| @node acconfig Header | |
| @section @file{acconfig.h} | |
| @cindex @file{acconfig.h} | |
| @cindex @file{config.h.top} | |
| @cindex @file{config.h.bot} | |
| In order to produce @file{config.h.in}, @command{autoheader} needs to | |
| build or to find templates for each symbol. Modern releases of Autoconf | |
| use @code{AH_VERBATIM} and @code{AH_TEMPLATE} (@pxref{Autoheader | |
| Macros}), but in older releases a file, @file{acconfig.h}, contained the | |
| list of needed templates. @command{autoheader} copied comments and | |
| @code{#define} and @code{#undef} statements from @file{acconfig.h} in | |
| the current directory, if present. This file used to be mandatory if | |
| you @code{AC_DEFINE} any additional symbols. | |
| Modern releases of Autoconf also provide @code{AH_TOP} and | |
| @code{AH_BOTTOM} if you need to prepend/append some information to | |
| @file{config.h.in}. Ancient versions of Autoconf had a similar feature: | |
| if @file{./acconfig.h} contains the string @samp{@@TOP@@}, | |
| @command{autoheader} copies the lines before the line containing | |
| @samp{@@TOP@@} into the top of the file that it generates. Similarly, | |
| if @file{./acconfig.h} contains the string @samp{@@BOTTOM@@}, | |
| @command{autoheader} copies the lines after that line to the end of the | |
| file it generates. Either or both of those strings may be omitted. An | |
| even older alternate way to produce the same effect in ancient versions | |
| of Autoconf is to create the files @file{@var{file}.top} (typically | |
| @file{config.h.top}) and/or @file{@var{file}.bot} in the current | |
| directory. If they exist, @command{autoheader} copies them to the | |
| beginning and end, respectively, of its output. | |
| In former versions of Autoconf, the files used in preparing a software | |
| package for distribution were: | |
| @example | |
| @group | |
| configure.ac --. .------> autoconf* -----> configure | |
| +---+ | |
| [aclocal.m4] --+ `---. | |
| [acsite.m4] ---' | | |
| +--> [autoheader*] -> [config.h.in] | |
| [acconfig.h] ----. | | |
| +-----' | |
| [config.h.top] --+ | |
| [config.h.bot] --' | |
| @end group | |
| @end example | |
| Using only the @code{AH_} macros, @file{configure.ac} should be | |
| self-contained, and should not depend upon @file{acconfig.h} etc. | |
| @node autoupdate Invocation | |
| @section Using @command{autoupdate} to Modernize @file{configure.ac} | |
| @cindex @command{autoupdate} | |
| The @command{autoupdate} program updates a @file{configure.ac} file that | |
| calls Autoconf macros by their old names to use the current macro names. | |
| In version 2 of Autoconf, most of the macros were renamed to use a more | |
| uniform and descriptive naming scheme. @xref{Macro Names}, for a | |
| description of the new scheme. Although the old names still work | |
| (@pxref{Obsolete Macros}, for a list of the old macros and the corresponding | |
| new names), you can make your @file{configure.ac} files more readable | |
| and make it easier to use the current Autoconf documentation if you | |
| update them to use the new macro names. | |
| @evindex SIMPLE_BACKUP_SUFFIX | |
| If given no arguments, @command{autoupdate} updates @file{configure.ac}, | |
| backing up the original version with the suffix @file{~} (or the value | |
| of the environment variable @code{SIMPLE_BACKUP_SUFFIX}, if that is | |
| set). If you give @command{autoupdate} an argument, it reads that file | |
| instead of @file{configure.ac} and writes the updated file to the | |
| standard output. | |
| @noindent | |
| @command{autoupdate} accepts the following options: | |
| @table @option | |
| @item --help | |
| @itemx -h | |
| Print a summary of the command line options and exit. | |
| @item --version | |
| @itemx -V | |
| Print the version number of Autoconf and exit. | |
| @item --verbose | |
| @itemx -v | |
| Report processing steps. | |
| @item --debug | |
| @itemx -d | |
| Don't remove the temporary files. | |
| @item --force | |
| @itemx -f | |
| Force the update even if the file has not changed. Disregard the cache. | |
| @item --include=@var{dir} | |
| @itemx -I @var{dir} | |
| Also look for input files in @var{dir}. Multiple invocations accumulate. | |
| Directories are browsed from last to first. | |
| @item --prepend-include=@var{dir} | |
| @itemx -B @var{dir} | |
| Prepend directory @var{dir} to the search path. This is used to include | |
| the language-specific files before any third-party macros. | |
| @end table | |
| @node Obsolete Macros | |
| @section Obsolete Macros | |
| Several macros are obsoleted in Autoconf, for various reasons (typically | |
| they failed to quote properly, couldn't be extended for more recent | |
| issues, etc.). They are still supported, but deprecated: their use | |
| should be avoided. | |
| During the jump from Autoconf version 1 to version 2, most of the | |
| macros were renamed to use a more uniform and descriptive naming scheme, | |
| but their signature did not change. @xref{Macro Names}, for a | |
| description of the new naming scheme. Below, if there is just the mapping | |
| from old names to new names for these macros, the reader is invited to | |
| refer to the definition of the new macro for the signature and the | |
| description. | |
| @defmac AC_AIX | |
| @acindex{AIX} | |
| @cvindex _ALL_SOURCE | |
| This macro is a platform-specific subset of | |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). | |
| @end defmac | |
| @defmac AC_ALLOCA | |
| @acindex{ALLOCA} | |
| Replaced by @code{AC_FUNC_ALLOCA} (@pxref{AC_FUNC_ALLOCA}). | |
| @end defmac | |
| @defmac AC_ARG_ARRAY | |
| @acindex{ARG_ARRAY} | |
| Removed because of limited usefulness. | |
| @end defmac | |
| @defmac AC_C_CROSS | |
| @acindex{C_CROSS} | |
| This macro is obsolete; it does nothing. | |
| @end defmac | |
| @defmac AC_C_LONG_DOUBLE | |
| @acindex{C_LONG_DOUBLE} | |
| @cvindex HAVE_LONG_DOUBLE | |
| If the C compiler supports a working @code{long double} type with more | |
| range or precision than the @code{double} type, define | |
| @code{HAVE_LONG_DOUBLE}. | |
| You should use @code{AC_TYPE_LONG_DOUBLE} or | |
| @code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}. | |
| @end defmac | |
| @defmac AC_CANONICAL_SYSTEM | |
| @acindex{CANONICAL_SYSTEM} | |
| Determine the system type and set output variables to the names of the | |
| canonical system types. @xref{Canonicalizing}, for details about the | |
| variables this macro sets. | |
| The user is encouraged to use either @code{AC_CANONICAL_BUILD}, or | |
| @code{AC_CANONICAL_HOST}, or @code{AC_CANONICAL_TARGET}, depending on | |
| the needs. Using @code{AC_CANONICAL_TARGET} is enough to run the two | |
| other macros (@pxref{Canonicalizing}). | |
| @end defmac | |
| @defmac AC_CHAR_UNSIGNED | |
| @acindex{CHAR_UNSIGNED} | |
| Replaced by @code{AC_C_CHAR_UNSIGNED} (@pxref{AC_C_CHAR_UNSIGNED}). | |
| @end defmac | |
| @defmac AC_CHECK_TYPE (@var{type}, @var{default}) | |
| @acindex{CHECK_TYPE} | |
| Autoconf, up to 2.13, used to provide this version of | |
| @code{AC_CHECK_TYPE}, deprecated because of its flaws. First, although | |
| it is a member of the @code{CHECK} clan, it does | |
| more than just checking. Secondly, missing types are defined | |
| using @code{#define}, not @code{typedef}, and this can lead to | |
| problems in the case of pointer types. | |
| This use of @code{AC_CHECK_TYPE} is obsolete and discouraged; see | |
| @ref{Generic Types}, for the description of the current macro. | |
| If the type @var{type} is not defined, define it to be the C (or C++) | |
| builtin type @var{default}, e.g., @samp{short int} or @samp{unsigned int}. | |
| This macro is equivalent to: | |
| @example | |
| AC_CHECK_TYPE([@var{type}], [], | |
| [AC_DEFINE_UNQUOTED([@var{type}], [@var{default}], | |
| [Define to '@var{default}' | |
| if <sys/types.h> does not define.])]) | |
| @end example | |
| In order to keep backward compatibility, the two versions of | |
| @code{AC_CHECK_TYPE} are implemented, selected using these heuristics: | |
| @enumerate | |
| @item | |
| If there are three or four arguments, the modern version is used. | |
| @item | |
| If the second argument appears to be a C or C++ type, then the | |
| obsolete version is used. This happens if the argument is a C or C++ | |
| @emph{builtin} type or a C identifier ending in @samp{_t}, optionally | |
| followed by one of @samp{[(* } and then by a string of zero or more | |
| characters taken from the set @samp{[]()* _a-zA-Z0-9}. | |
| @item | |
| If the second argument is spelled with the alphabet of valid C and C++ | |
| types, the user is warned and the modern version is used. | |
| @item | |
| Otherwise, the modern version is used. | |
| @end enumerate | |
| @noindent | |
| You are encouraged either to use a valid builtin type, or to use the | |
| equivalent modern code (see above), or better yet, to use | |
| @code{AC_CHECK_TYPES} together with | |
| @example | |
| #ifndef HAVE_LOFF_T | |
| typedef loff_t off_t; | |
| #endif | |
| @end example | |
| @end defmac | |
| @c end of AC_CHECK_TYPE | |
| @defmac AC_CHECKING (@var{feature-description}) | |
| @acindex{CHECKING} | |
| Same as | |
| @example | |
| AC_MSG_NOTICE([checking @var{feature-description}@dots{}] | |
| @end example | |
| @noindent | |
| @xref{AC_MSG_NOTICE}. | |
| @end defmac | |
| @defmac AC_COMPILE_CHECK (@var{echo-text}, @var{includes}, @ | |
| @var{function-body}, @var{action-if-true}, @ovar{action-if-false}) | |
| @acindex{COMPILE_CHECK} | |
| This is an obsolete version of @code{AC_TRY_COMPILE} itself replaced by | |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}), with the | |
| addition that it prints @samp{checking for @var{echo-text}} to the | |
| standard output first, if @var{echo-text} is non-empty. Use | |
| @code{AC_MSG_CHECKING} and @code{AC_MSG_RESULT} instead to print | |
| messages (@pxref{Printing Messages}). | |
| @end defmac | |
| @defmac AC_CONST | |
| @acindex{CONST} | |
| Replaced by @code{AC_C_CONST} (@pxref{AC_C_CONST}). | |
| @end defmac | |
| @defmac AC_CROSS_CHECK | |
| @acindex{CROSS_CHECK} | |
| Same as @code{AC_C_CROSS}, which is obsolete too, and does nothing | |
| @code{:-)}. | |
| @end defmac | |
| @defmac AC_CYGWIN | |
| @acindex{CYGWIN} | |
| @evindex CYGWIN | |
| Check for the Cygwin environment in which case the shell variable | |
| @code{CYGWIN} is set to @samp{yes}. Don't use this macro, the dignified | |
| means to check the nature of the host is using @code{AC_CANONICAL_HOST} | |
| (@pxref{Canonicalizing}). As a matter of fact this macro is defined as: | |
| @example | |
| AC_REQUIRE([AC_CANONICAL_HOST])[]dnl | |
| case $host_os in | |
| *cygwin* ) CYGWIN=yes;; | |
| * ) CYGWIN=no;; | |
| esac | |
| @end example | |
| Beware that the variable @env{CYGWIN} has a special meaning when | |
| running Cygwin, and should not be changed. That's yet another reason | |
| not to use this macro. | |
| @end defmac | |
| @defmac AC_DECL_SYS_SIGLIST | |
| @acindex{DECL_SYS_SIGLIST} | |
| @cvindex SYS_SIGLIST_DECLARED | |
| Same as: | |
| @example | |
| AC_CHECK_DECLS([sys_siglist], [], [], | |
| [#include <signal.h> | |
| /* NetBSD declares sys_siglist in unistd.h. */ | |
| #ifdef HAVE_UNISTD_H | |
| # include <unistd.h> | |
| #endif | |
| ]) | |
| @end example | |
| @noindent | |
| @xref{AC_CHECK_DECLS}. | |
| @end defmac | |
| @defmac AC_DECL_YYTEXT | |
| @acindex{DECL_YYTEXT} | |
| Does nothing, now integrated in @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}). | |
| @end defmac | |
| @defmac AC_DIAGNOSE (@var{category}, @var{message}) | |
| @acindex{DIAGNOSE} | |
| Replaced by @code{m4_warn} (@pxref{m4_warn}). | |
| @end defmac | |
| @defmac AC_DIR_HEADER | |
| @acindex{DIR_HEADER} | |
| @cvindex DIRENT | |
| @cvindex SYSNDIR | |
| @cvindex SYSDIR | |
| @cvindex NDIR | |
| Like calling @code{AC_FUNC_CLOSEDIR_VOID} | |
| (@pxref{AC_FUNC_CLOSEDIR_VOID}) and @code{AC_HEADER_DIRENT} | |
| (@pxref{AC_HEADER_DIRENT}), | |
| but defines a different set of C preprocessor macros to indicate which | |
| header file is found: | |
| @multitable {@file{sys/ndir.h}} {Old Symbol} {@code{HAVE_SYS_NDIR_H}} | |
| @item Header @tab Old Symbol @tab New Symbol | |
| @item @file{dirent.h} @tab @code{DIRENT} @tab @code{HAVE_DIRENT_H} | |
| @item @file{sys/ndir.h} @tab @code{SYSNDIR} @tab @code{HAVE_SYS_NDIR_H} | |
| @item @file{sys/dir.h} @tab @code{SYSDIR} @tab @code{HAVE_SYS_DIR_H} | |
| @item @file{ndir.h} @tab @code{NDIR} @tab @code{HAVE_NDIR_H} | |
| @end multitable | |
| @end defmac | |
| @defmac AC_DYNIX_SEQ | |
| @acindex{DYNIX_SEQ} | |
| If on DYNIX/ptx, add @option{-lseq} to output variable | |
| @code{LIBS}. This macro used to be defined as | |
| @example | |
| AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"]) | |
| @end example | |
| @noindent | |
| now it is just @code{AC_FUNC_GETMNTENT} (@pxref{AC_FUNC_GETMNTENT}). | |
| @end defmac | |
| @defmac AC_EXEEXT | |
| @acindex{EXEEXT} | |
| @ovindex EXEEXT | |
| Defined the output variable @code{EXEEXT} based on the output of the | |
| compiler, which is now done automatically. Typically set to empty | |
| string if POSIX and @samp{.exe} if a DOS variant. | |
| @end defmac | |
| @defmac AC_EMXOS2 | |
| @acindex{EMXOS2} | |
| Similar to @code{AC_CYGWIN} but checks for the EMX environment on OS/2 | |
| and sets @code{EMXOS2}. Don't use this macro, the dignified means to | |
| check the nature of the host is using @code{AC_CANONICAL_HOST} | |
| (@pxref{Canonicalizing}). | |
| @end defmac | |
| @defmac AC_ENABLE (@var{feature}, @var{action-if-given}, @ | |
| @ovar{action-if-not-given}) | |
| @acindex{ENABLE} | |
| This is an obsolete version of @code{AC_ARG_ENABLE} that does not | |
| support providing a help string (@pxref{AC_ARG_ENABLE}). | |
| @end defmac | |
| @defmac AC_ERROR | |
| @acindex{ERROR} | |
| Replaced by @code{AC_MSG_ERROR} (@pxref{AC_MSG_ERROR}). | |
| @end defmac | |
| @defmac AC_FATAL (@var{message}) | |
| @acindex{FATAL} | |
| Replaced by @code{m4_fatal} (@pxref{m4_fatal}). | |
| @end defmac | |
| @defmac AC_FIND_X | |
| @acindex{FIND_X} | |
| Replaced by @code{AC_PATH_X} (@pxref{AC_PATH_X}). | |
| @end defmac | |
| @defmac AC_FIND_XTRA | |
| @acindex{FIND_XTRA} | |
| Replaced by @code{AC_PATH_XTRA} (@pxref{AC_PATH_XTRA}). | |
| @end defmac | |
| @defmac AC_FOREACH | |
| @acindex{FOREACH} | |
| Replaced by @code{m4_foreach_w} (@pxref{m4_foreach_w}). | |
| @end defmac | |
| @defmac AC_FUNC_CHECK | |
| @acindex{FUNC_CHECK} | |
| Replaced by @code{AC_CHECK_FUNC} (@pxref{AC_CHECK_FUNC}). | |
| @end defmac | |
| @anchor{AC_FUNC_SETVBUF_REVERSED} | |
| @defmac AC_FUNC_SETVBUF_REVERSED | |
| @acindex{FUNC_SETVBUF_REVERSED} | |
| @cvindex SETVBUF_REVERSED | |
| @c @fuindex setvbuf | |
| @prindex @code{setvbuf} | |
| Do nothing. Formerly, this macro checked whether @code{setvbuf} takes | |
| the buffering type as its second argument and the buffer pointer as the | |
| third, instead of the other way around, and defined | |
| @code{SETVBUF_REVERSED}. However, the last systems to have the problem | |
| were those based on SVR2, which became obsolete in 1987, and the macro | |
| is no longer needed. | |
| @end defmac | |
| @defmac AC_FUNC_WAIT3 | |
| @acindex{FUNC_WAIT3} | |
| @cvindex HAVE_WAIT3 | |
| @c @fuindex wait3 | |
| @prindex @code{wait3} | |
| If @code{wait3} is found and fills in the contents of its third argument | |
| (a @samp{struct rusage *}), which HP-UX does not do, define | |
| @code{HAVE_WAIT3}. | |
| These days portable programs should use @code{waitpid}, not | |
| @code{wait3}, as @code{wait3} has been removed from POSIX. | |
| @end defmac | |
| @defmac AC_GCC_TRADITIONAL | |
| @acindex{GCC_TRADITIONAL} | |
| Replaced by @code{AC_PROG_GCC_TRADITIONAL} (@pxref{AC_PROG_GCC_TRADITIONAL}), | |
| which is itself obsolete. | |
| @end defmac | |
| @defmac AC_GETGROUPS_T | |
| @acindex{GETGROUPS_T} | |
| Replaced by @code{AC_TYPE_GETGROUPS} (@pxref{AC_TYPE_GETGROUPS}). | |
| @end defmac | |
| @defmac AC_GETLOADAVG | |
| @acindex{GETLOADAVG} | |
| Replaced by @code{AC_FUNC_GETLOADAVG} (@pxref{AC_FUNC_GETLOADAVG}). | |
| @end defmac | |
| @defmac AC_GNU_SOURCE | |
| @acindex{GNU_SOURCE} | |
| @cvindex _GNU_SOURCE | |
| This macro is a platform-specific subset of | |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). | |
| @end defmac | |
| @defmac AC_HAVE_FUNCS | |
| @acindex{HAVE_FUNCS} | |
| Replaced by @code{AC_CHECK_FUNCS} (@pxref{AC_CHECK_FUNCS}). | |
| @end defmac | |
| @defmac AC_HAVE_HEADERS | |
| @acindex{HAVE_HEADERS} | |
| Replaced by @code{AC_CHECK_HEADERS} (@pxref{AC_CHECK_HEADERS}). | |
| @end defmac | |
| @defmac AC_HAVE_LIBRARY (@var{library}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}, @ovar{other-libraries}) | |
| @acindex{HAVE_LIBRARY} | |
| This macro is equivalent to calling @code{AC_CHECK_LIB} with a | |
| @var{function} argument of @code{main}. In addition, @var{library} can | |
| be written as any of @samp{foo}, @option{-lfoo}, or @samp{libfoo.a}. In | |
| all of those cases, the compiler is passed @option{-lfoo}. However, | |
| @var{library} cannot be a shell variable; it must be a literal name. | |
| @xref{AC_CHECK_LIB}. | |
| @end defmac | |
| @defmac AC_HAVE_POUNDBANG | |
| @acindex{HAVE_POUNDBANG} | |
| Replaced by @code{AC_SYS_INTERPRETER} (@pxref{AC_SYS_INTERPRETER}). | |
| @end defmac | |
| @defmac AC_HEADER_CHECK | |
| @acindex{HEADER_CHECK} | |
| Replaced by @code{AC_CHECK_HEADER} (@pxref{AC_CHECK_HEADER}). | |
| @end defmac | |
| @defmac AC_HEADER_EGREP | |
| @acindex{HEADER_EGREP} | |
| Replaced by @code{AC_EGREP_HEADER} (@pxref{AC_EGREP_HEADER}). | |
| @end defmac | |
| @anchor{AC_HEADER_TIME} | |
| @defmac AC_HEADER_TIME | |
| @acindex{HEADER_TIME} | |
| @cvindex TIME_WITH_SYS_TIME | |
| @hdrindex{time.h} | |
| @hdrindex{sys/time.h} | |
| @caindex header_time | |
| This macro used to check whether it was possible to include | |
| @file{time.h} and @file{sys/time.h} in the same source file, | |
| defining @code{TIME_WITH_SYS_TIME} if so. | |
| Nowadays, it is equivalent to @samp{AC_CHECK_HEADERS([sys/time.h])}, | |
| although it does still define @code{TIME_WITH_SYS_TIME} for | |
| compatibility's sake. @file{time.h} is universally present, and the | |
| systems on which @file{sys/time.h} conflicted with @file{time.h} are | |
| obsolete. | |
| @end defmac | |
| @defmac AC_HELP_STRING | |
| @acindex{HELP_STRING} | |
| Replaced by @code{AS_HELP_STRING} (@pxref{AS_HELP_STRING}). | |
| @end defmac | |
| @defmac AC_INIT (@var{unique-file-in-source-dir}) | |
| @acindex{INIT} | |
| Formerly @code{AC_INIT} used to have a single argument, and was | |
| equivalent to: | |
| @example | |
| AC_INIT | |
| AC_CONFIG_SRCDIR(@var{unique-file-in-source-dir}) | |
| @end example | |
| See @ref{AC_INIT} and @ref{AC_CONFIG_SRCDIR}. | |
| @end defmac | |
| @defmac AC_INLINE | |
| @acindex{INLINE} | |
| Replaced by @code{AC_C_INLINE} (@pxref{AC_C_INLINE}). | |
| @end defmac | |
| @defmac AC_INT_16_BITS | |
| @acindex{INT_16_BITS} | |
| @cvindex INT_16_BITS | |
| If the C type @code{int} is 16 bits wide, define @code{INT_16_BITS}. | |
| Use @samp{AC_CHECK_SIZEOF(int)} instead (@pxref{AC_CHECK_SIZEOF}). | |
| @end defmac | |
| @defmac AC_IRIX_SUN | |
| @acindex{IRIX_SUN} | |
| If on IRIX (Silicon Graphics Unix), add @option{-lsun} to output | |
| @code{LIBS}. If you were using it to get @code{getmntent}, use | |
| @code{AC_FUNC_GETMNTENT} instead. If you used it for the NIS versions | |
| of the password and group functions, use @samp{AC_CHECK_LIB(sun, | |
| getpwnam)}. Up to Autoconf 2.13, it used to be | |
| @example | |
| AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"]) | |
| @end example | |
| @noindent | |
| now it is defined as | |
| @example | |
| AC_FUNC_GETMNTENT | |
| AC_CHECK_LIB([sun], [getpwnam]) | |
| @end example | |
| @noindent | |
| See @ref{AC_FUNC_GETMNTENT} and @ref{AC_CHECK_LIB}. | |
| @end defmac | |
| @defmac AC_ISC_POSIX | |
| @acindex{ISC_POSIX} | |
| @ovindex LIBS | |
| This macro adds @option{-lcposix} to output variable @code{LIBS} if | |
| necessary for POSIX facilities. Sun dropped support for the obsolete | |
| INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs | |
| need not use this macro. It is implemented as | |
| @code{AC_SEARCH_LIBS([strerror], [cposix])} (@pxref{AC_SEARCH_LIBS}). | |
| @end defmac | |
| @defmac AC_LANG_C | |
| @acindex{LANG_C} | |
| Same as @samp{AC_LANG([C])} (@pxref{AC_LANG}). | |
| @end defmac | |
| @defmac AC_LANG_CPLUSPLUS | |
| @acindex{LANG_CPLUSPLUS} | |
| Same as @samp{AC_LANG([C++])} (@pxref{AC_LANG}). | |
| @end defmac | |
| @defmac AC_LANG_FORTRAN77 | |
| @acindex{LANG_FORTRAN77} | |
| Same as @samp{AC_LANG([Fortran 77])} (@pxref{AC_LANG}). | |
| @end defmac | |
| @defmac AC_LANG_RESTORE | |
| @acindex{LANG_RESTORE} | |
| Select the @var{language} that is saved on the top of the stack, as set | |
| by @code{AC_LANG_SAVE}, remove it from the stack, and call | |
| @code{AC_LANG(@var{language})}. @xref{Language Choice}, for the | |
| preferred way to change languages. | |
| @end defmac | |
| @defmac AC_LANG_SAVE | |
| @acindex{LANG_SAVE} | |
| Remember the current language (as set by @code{AC_LANG}) on a stack. | |
| The current language does not change. @code{AC_LANG_PUSH} is preferred | |
| (@pxref{AC_LANG_PUSH}). | |
| @end defmac | |
| @defmac AC_LINK_FILES (@var{source}@dots{}, @var{dest}@dots{}) | |
| @acindex{LINK_FILES} | |
| This is an obsolete version of @code{AC_CONFIG_LINKS} | |
| (@pxref{AC_CONFIG_LINKS}. An updated version of: | |
| @example | |
| AC_LINK_FILES(config/$machine.h config/$obj_format.h, | |
| host.h object.h) | |
| @end example | |
| @noindent | |
| is: | |
| @example | |
| AC_CONFIG_LINKS([host.h:config/$machine.h | |
| object.h:config/$obj_format.h]) | |
| @end example | |
| @end defmac | |
| @defmac AC_LN_S | |
| @acindex{LN_S} | |
| Replaced by @code{AC_PROG_LN_S} (@pxref{AC_PROG_LN_S}). | |
| @end defmac | |
| @defmac AC_LONG_64_BITS | |
| @acindex{LONG_64_BITS} | |
| @cvindex LONG_64_BITS | |
| Define @code{LONG_64_BITS} if the C type @code{long int} is 64 bits wide. | |
| Use the generic macro @samp{AC_CHECK_SIZEOF([long int])} instead | |
| (@pxref{AC_CHECK_SIZEOF}). | |
| @end defmac | |
| @defmac AC_LONG_DOUBLE | |
| @acindex{LONG_DOUBLE} | |
| If the C compiler supports a working @code{long double} type with more | |
| range or precision than the @code{double} type, define | |
| @code{HAVE_LONG_DOUBLE}. | |
| You should use @code{AC_TYPE_LONG_DOUBLE} or | |
| @code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}. | |
| @end defmac | |
| @defmac AC_LONG_FILE_NAMES | |
| @acindex{LONG_FILE_NAMES} | |
| Replaced by | |
| @example | |
| AC_SYS_LONG_FILE_NAMES | |
| @end example | |
| @noindent | |
| @xref{AC_SYS_LONG_FILE_NAMES}. | |
| @end defmac | |
| @defmac AC_MAJOR_HEADER | |
| @acindex{MAJOR_HEADER} | |
| Replaced by @code{AC_HEADER_MAJOR} (@pxref{AC_HEADER_MAJOR}). | |
| @end defmac | |
| @defmac AC_MEMORY_H | |
| @acindex{MEMORY_H} | |
| @cvindex NEED_MEMORY_H | |
| Used to define @code{NEED_MEMORY_H} if the @code{mem} functions were | |
| defined in @file{memory.h}. Today it is equivalent to | |
| @samp{AC_CHECK_HEADERS([memory.h])} (@pxref{AC_CHECK_HEADERS}). Adjust | |
| your code to get the @code{mem} functions from @file{string.h} instead. | |
| @end defmac | |
| @defmac AC_MINGW32 | |
| @acindex{MINGW32} | |
| Similar to @code{AC_CYGWIN} but checks for the MinGW compiler | |
| environment and sets @code{MINGW32}. Don't use this macro, the | |
| dignified means to check the nature of the host is using | |
| @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}). | |
| @end defmac | |
| @defmac AC_MINIX | |
| @acindex{MINIX} | |
| @cvindex _MINIX | |
| @cvindex _POSIX_SOURCE | |
| @cvindex _POSIX_1_SOURCE | |
| This macro is a platform-specific subset of | |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). | |
| @end defmac | |
| @defmac AC_MINUS_C_MINUS_O | |
| @acindex{MINUS_C_MINUS_O} | |
| Replaced by @code{AC_PROG_CC_C_O} (@pxref{AC_PROG_CC_C_O}). | |
| @end defmac | |
| @defmac AC_MMAP | |
| @acindex{MMAP} | |
| Replaced by @code{AC_FUNC_MMAP} (@pxref{AC_FUNC_MMAP}). | |
| @end defmac | |
| @defmac AC_MODE_T | |
| @acindex{MODE_T} | |
| Replaced by @code{AC_TYPE_MODE_T} (@pxref{AC_TYPE_MODE_T}). | |
| @end defmac | |
| @defmac AC_OBJEXT | |
| @acindex{OBJEXT} | |
| @ovindex OBJEXT | |
| Defined the output variable @code{OBJEXT} based on the output of the | |
| compiler, after .c files have been excluded. Typically set to @samp{o} | |
| if POSIX, @samp{obj} if a DOS variant. | |
| Now the compiler checking macros handle | |
| this automatically. | |
| @end defmac | |
| @defmac AC_OBSOLETE (@var{this-macro-name}, @ovar{suggestion}) | |
| @acindex{OBSOLETE} | |
| Make M4 print a message to the standard error output warning that | |
| @var{this-macro-name} is obsolete, and giving the file and line number | |
| where it was called. @var{this-macro-name} should be the name of the | |
| macro that is calling @code{AC_OBSOLETE}. If @var{suggestion} is given, | |
| it is printed at the end of the warning message; for example, it can be | |
| a suggestion for what to use instead of @var{this-macro-name}. | |
| For instance | |
| @example | |
| AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl | |
| @end example | |
| @noindent | |
| You are encouraged to use @code{AU_DEFUN} instead, since it gives better | |
| services to the user (@pxref{AU_DEFUN}). | |
| @end defmac | |
| @defmac AC_OFF_T | |
| @acindex{OFF_T} | |
| Replaced by @code{AC_TYPE_OFF_T} (@pxref{AC_TYPE_OFF_T}). | |
| @end defmac | |
| @defmac AC_OUTPUT (@ovar{file}@dots{}, @ovar{extra-cmds}, @ovar{init-cmds}) | |
| @acindex{OUTPUT} | |
| The use of @code{AC_OUTPUT} with arguments is deprecated. This obsoleted | |
| interface is equivalent to: | |
| @example | |
| @group | |
| AC_CONFIG_FILES(@var{file}@dots{}) | |
| AC_CONFIG_COMMANDS([default], | |
| @var{extra-cmds}, @var{init-cmds}) | |
| AC_OUTPUT | |
| @end group | |
| @end example | |
| @noindent | |
| See @ref{AC_CONFIG_FILES}, @ref{AC_CONFIG_COMMANDS}, and @ref{AC_OUTPUT}. | |
| @end defmac | |
| @defmac AC_OUTPUT_COMMANDS (@var{extra-cmds}, @ovar{init-cmds}) | |
| @acindex{OUTPUT_COMMANDS} | |
| Specify additional shell commands to run at the end of | |
| @file{config.status}, and shell commands to initialize any variables | |
| from @command{configure}. This macro may be called multiple times. It is | |
| obsolete, replaced by @code{AC_CONFIG_COMMANDS} (@pxref{AC_CONFIG_COMMANDS}). | |
| Here is an unrealistic example: | |
| @example | |
| fubar=27 | |
| AC_OUTPUT_COMMANDS( | |
| [AS_ECHO(["this is extra $fubar, and so on."])], | |
| [fubar=$fubar]) | |
| AC_OUTPUT_COMMANDS( | |
| [AS_ECHO(["this is another, extra, bit"])], | |
| [AS_ECHO(["init bit"])]) | |
| @end example | |
| Aside from the fact that @code{AC_CONFIG_COMMANDS} requires an | |
| additional key, an important difference is that | |
| @code{AC_OUTPUT_COMMANDS} is quoting its arguments twice, unlike | |
| @code{AC_CONFIG_COMMANDS}. This means that @code{AC_CONFIG_COMMANDS} | |
| can safely be given macro calls as arguments: | |
| @example | |
| AC_CONFIG_COMMANDS(foo, [my_FOO()]) | |
| @end example | |
| @noindent | |
| Conversely, where one level of quoting was enough for literal strings | |
| with @code{AC_OUTPUT_COMMANDS}, you need two with | |
| @code{AC_CONFIG_COMMANDS}. The following lines are equivalent: | |
| @example | |
| @group | |
| AC_OUTPUT_COMMANDS([echo "Square brackets: []"]) | |
| AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]]) | |
| @end group | |
| @end example | |
| @end defmac | |
| @defmac AC_PID_T | |
| @acindex{PID_T} | |
| Replaced by @code{AC_TYPE_PID_T} (@pxref{AC_TYPE_PID_T}). | |
| @end defmac | |
| @defmac AC_PREFIX | |
| @acindex{PREFIX} | |
| Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}). | |
| @end defmac | |
| @defmac AC_PROG_CC_C89 | |
| @acindex{PROG_CC_C89} | |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). | |
| @end defmac | |
| @defmac AC_PROG_CC_C99 | |
| @acindex{PROG_CC_C99} | |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). | |
| @end defmac | |
| @defmac AC_PROG_CC_STDC | |
| @acindex{PROG_CC_STDC} | |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). | |
| @end defmac | |
| @anchor{AC_PROG_GCC_TRADITIONAL} | |
| @defmac AC_PROG_GCC_TRADITIONAL | |
| @acindex{PROG_GCC_TRADITIONAL} | |
| Used to put GCC into ``traditional'' (pre-ISO C) compilation mode, | |
| on systems with headers that did not work correctly with a | |
| standard-compliant compiler. GCC has not supported traditional | |
| compilation in many years, and all of the systems that required this are | |
| long obsolete themselves. This macro is now a compatibility synonym for | |
| @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). | |
| @end defmac | |
| @defmac AC_PROGRAMS_CHECK | |
| @acindex{PROGRAMS_CHECK} | |
| Replaced by @code{AC_CHECK_PROGS} (@pxref{AC_CHECK_PROGS}). | |
| @end defmac | |
| @defmac AC_PROGRAMS_PATH | |
| @acindex{PROGRAMS_PATH} | |
| Replaced by @code{AC_PATH_PROGS} (@pxref{AC_PATH_PROGS}). | |
| @end defmac | |
| @defmac AC_PROGRAM_CHECK | |
| @acindex{PROGRAM_CHECK} | |
| Replaced by @code{AC_CHECK_PROG} (@pxref{AC_CHECK_PROG}). | |
| @end defmac | |
| @defmac AC_PROGRAM_EGREP | |
| @acindex{PROGRAM_EGREP} | |
| Replaced by @code{AC_EGREP_CPP} (@pxref{AC_EGREP_CPP}). | |
| @end defmac | |
| @defmac AC_PROGRAM_PATH | |
| @acindex{PROGRAM_PATH} | |
| Replaced by @code{AC_PATH_PROG} (@pxref{AC_PATH_PROG}). | |
| @end defmac | |
| @defmac AC_REMOTE_TAPE | |
| @acindex{REMOTE_TAPE} | |
| Removed because of limited usefulness. | |
| @end defmac | |
| @defmac AC_RESTARTABLE_SYSCALLS | |
| @acindex{RESTARTABLE_SYSCALLS} | |
| This macro was renamed @code{AC_SYS_RESTARTABLE_SYSCALLS}. However, | |
| these days portable programs should use @code{sigaction} with | |
| @code{SA_RESTART} if they want restartable system calls. They should | |
| not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a | |
| system call is restartable is a dynamic issue, not a configuration-time | |
| issue. | |
| @end defmac | |
| @defmac AC_RETSIGTYPE | |
| @acindex{RETSIGTYPE} | |
| Replaced by @code{AC_TYPE_SIGNAL} (@pxref{AC_TYPE_SIGNAL}), which itself | |
| is obsolete. | |
| @end defmac | |
| @defmac AC_RSH | |
| @acindex{RSH} | |
| Removed because of limited usefulness. | |
| @end defmac | |
| @defmac AC_SCO_INTL | |
| @acindex{SCO_INTL} | |
| @ovindex LIBS | |
| Equivalent to the obsolescent macro @code{AC_FUNC_STRFTIME}. | |
| @xref{AC_FUNC_STRFTIME}. | |
| @end defmac | |
| @defmac AC_SETVBUF_REVERSED | |
| @acindex{SETVBUF_REVERSED} | |
| Replaced by | |
| @example | |
| AC_FUNC_SETVBUF_REVERSED | |
| @end example | |
| @noindent | |
| @xref{AC_FUNC_SETVBUF_REVERSED}. | |
| @end defmac | |
| @defmac AC_SET_MAKE | |
| @acindex{SET_MAKE} | |
| Replaced by @code{AC_PROG_MAKE_SET} (@pxref{AC_PROG_MAKE_SET}). | |
| @end defmac | |
| @defmac AC_SIZEOF_TYPE | |
| @acindex{SIZEOF_TYPE} | |
| Replaced by @code{AC_CHECK_SIZEOF} (@pxref{AC_CHECK_SIZEOF}). | |
| @end defmac | |
| @defmac AC_SIZE_T | |
| @acindex{SIZE_T} | |
| Replaced by @code{AC_TYPE_SIZE_T} (@pxref{AC_TYPE_SIZE_T}). | |
| @end defmac | |
| @defmac AC_STAT_MACROS_BROKEN | |
| @acindex{STAT_MACROS_BROKEN} | |
| Replaced by @code{AC_HEADER_STAT} (@pxref{AC_HEADER_STAT}). | |
| @end defmac | |
| @defmac AC_STDC_HEADERS | |
| @acindex{STDC_HEADERS} | |
| Replaced by @code{AC_HEADER_STDC} (@pxref{AC_HEADER_STDC}), which | |
| is itself obsolete. Nowadays it is safe to assume the facilities of C89 | |
| exist. | |
| @end defmac | |
| @defmac AC_STRCOLL | |
| @acindex{STRCOLL} | |
| Replaced by @code{AC_FUNC_STRCOLL} (@pxref{AC_FUNC_STRCOLL}). | |
| @end defmac | |
| @defmac AC_STRUCT_ST_BLKSIZE | |
| @acindex{STRUCT_ST_BLKSIZE} | |
| @cvindex HAVE_STRUCT_STAT_ST_BLKSIZE | |
| @cvindex HAVE_ST_BLKSIZE | |
| If @code{struct stat} contains an @code{st_blksize} member, define | |
| @code{HAVE_STRUCT_STAT_ST_BLKSIZE}. The former name, | |
| @code{HAVE_ST_BLKSIZE} is to be avoided, as its support will cease in | |
| the future. This macro is obsoleted, and should be replaced by | |
| @example | |
| AC_CHECK_MEMBERS([struct stat.st_blksize]) | |
| @end example | |
| @noindent | |
| @xref{AC_CHECK_MEMBERS}. | |
| @end defmac | |
| @defmac AC_STRUCT_ST_RDEV | |
| @acindex{STRUCT_ST_RDEV} | |
| @cvindex HAVE_ST_RDEV | |
| @cvindex HAVE_STRUCT_STAT_ST_RDEV | |
| If @code{struct stat} contains an @code{st_rdev} member, define | |
| @code{HAVE_STRUCT_STAT_ST_RDEV}. The former name for this macro, | |
| @code{HAVE_ST_RDEV}, is to be avoided as it will cease to be supported | |
| in the future. Actually, even the new macro is obsolete and should be | |
| replaced by: | |
| @example | |
| AC_CHECK_MEMBERS([struct stat.st_rdev]) | |
| @end example | |
| @noindent | |
| @xref{AC_CHECK_MEMBERS}. | |
| @end defmac | |
| @defmac AC_ST_BLKSIZE | |
| @acindex{ST_BLKSIZE} | |
| Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}). | |
| @end defmac | |
| @defmac AC_ST_BLOCKS | |
| @acindex{ST_BLOCKS} | |
| Replaced by @code{AC_STRUCT_ST_BLOCKS} (@pxref{AC_STRUCT_ST_BLOCKS}). | |
| @end defmac | |
| @defmac AC_ST_RDEV | |
| @acindex{ST_RDEV} | |
| Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}). | |
| @end defmac | |
| @defmac AC_SYS_RESTARTABLE_SYSCALLS | |
| @acindex{SYS_RESTARTABLE_SYSCALLS} | |
| @cvindex HAVE_RESTARTABLE_SYSCALLS | |
| If the system automatically restarts a system call that is interrupted | |
| by a signal, define @code{HAVE_RESTARTABLE_SYSCALLS}. This macro does | |
| not check whether system calls are restarted in general---it checks whether a | |
| signal handler installed with @code{signal} (but not @code{sigaction}) | |
| causes system calls to be restarted. It does not check whether system calls | |
| can be restarted when interrupted by signals that have no handler. | |
| These days portable programs should use @code{sigaction} with | |
| @code{SA_RESTART} if they want restartable system calls. They should | |
| not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a | |
| system call is restartable is a dynamic issue, not a configuration-time | |
| issue. | |
| @end defmac | |
| @defmac AC_SYS_SIGLIST_DECLARED | |
| @acindex{SYS_SIGLIST_DECLARED} | |
| This macro was renamed @code{AC_DECL_SYS_SIGLIST}. However, even that | |
| name is obsolete, as the same functionality is now achieved via | |
| @code{AC_CHECK_DECLS} (@pxref{AC_CHECK_DECLS}). | |
| @end defmac | |
| @defmac AC_TEST_CPP | |
| @acindex{TEST_CPP} | |
| This macro was renamed @code{AC_TRY_CPP}, which in turn was replaced by | |
| @code{AC_PREPROC_IFELSE} (@pxref{AC_PREPROC_IFELSE}). | |
| @end defmac | |
| @defmac AC_TEST_PROGRAM | |
| @acindex{TEST_PROGRAM} | |
| This macro was renamed @code{AC_TRY_RUN}, which in turn was replaced by | |
| @code{AC_RUN_IFELSE} (@pxref{AC_RUN_IFELSE}). | |
| @end defmac | |
| @defmac AC_TIMEZONE | |
| @acindex{TIMEZONE} | |
| Replaced by @code{AC_STRUCT_TIMEZONE} (@pxref{AC_STRUCT_TIMEZONE}). | |
| @end defmac | |
| @defmac AC_TIME_WITH_SYS_TIME | |
| @acindex{TIME_WITH_SYS_TIME} | |
| Replaced by @code{AC_HEADER_TIME} (@pxref{AC_HEADER_TIME}), which is | |
| itself obsolete; nowadays one need only do | |
| @samp{AC_CHECK_HEADERS([sys/time.h])}. | |
| @end defmac | |
| @defmac AC_TRY_COMPILE (@var{includes}, @var{function-body}, @ | |
| @ovar{action-if-true}, @ovar{action-if-false}) | |
| @acindex{TRY_COMPILE} | |
| Same as: | |
| @example | |
| AC_COMPILE_IFELSE( | |
| [AC_LANG_PROGRAM([[@var{includes}]], | |
| [[@var{function-body}]])], | |
| [@var{action-if-true}], | |
| [@var{action-if-false}]) | |
| @end example | |
| @noindent | |
| @xref{Running the Compiler}. | |
| This macro double quotes both @var{includes} and @var{function-body}. | |
| For C and C++, @var{includes} is any @code{#include} statements needed | |
| by the code in @var{function-body} (@var{includes} is ignored if | |
| the currently selected language is Fortran or Fortran 77). The compiler | |
| and compilation flags are determined by the current language | |
| (@pxref{Language Choice}). | |
| @end defmac | |
| @defmac AC_TRY_CPP (@var{input}, @ovar{action-if-true}, @ovar{action-if-false}) | |
| @acindex{TRY_CPP} | |
| Same as: | |
| @example | |
| AC_PREPROC_IFELSE( | |
| [AC_LANG_SOURCE([[@var{input}]])], | |
| [@var{action-if-true}], | |
| [@var{action-if-false}]) | |
| @end example | |
| @noindent | |
| @xref{Running the Preprocessor}. | |
| This macro double quotes the @var{input}. | |
| @end defmac | |
| @defmac AC_TRY_LINK (@var{includes}, @var{function-body}, @ | |
| @ovar{action-if-true}, @ovar{action-if-false}) | |
| @acindex{TRY_LINK} | |
| Same as: | |
| @example | |
| AC_LINK_IFELSE( | |
| [AC_LANG_PROGRAM([[@var{includes}]], | |
| [[@var{function-body}]])], | |
| [@var{action-if-true}], | |
| [@var{action-if-false}]) | |
| @end example | |
| @noindent | |
| @xref{Running the Linker}. | |
| This macro double quotes both @var{includes} and @var{function-body}. | |
| Depending on the current language (@pxref{Language Choice}), create a | |
| test program to see whether a function whose body consists of | |
| @var{function-body} can be compiled and linked. If the file compiles | |
| and links successfully, run shell commands @var{action-if-found}, | |
| otherwise run @var{action-if-not-found}. | |
| This macro double quotes both @var{includes} and @var{function-body}. | |
| For C and C++, @var{includes} is any @code{#include} statements needed | |
| by the code in @var{function-body} (@var{includes} is ignored if | |
| the currently selected language is Fortran or Fortran 77). The compiler | |
| and compilation flags are determined by the current language | |
| (@pxref{Language Choice}), and in addition @code{LDFLAGS} and | |
| @code{LIBS} are used for linking. | |
| @end defmac | |
| @defmac AC_TRY_LINK_FUNC (@var{function}, @ovar{action-if-found}, @ | |
| @ovar{action-if-not-found}) | |
| @acindex{TRY_LINK_FUNC} | |
| This macro is equivalent to | |
| @example | |
| AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])], | |
| [@var{action-if-found}], [@var{action-if-not-found}]) | |
| @end example | |
| @noindent | |
| @xref{Running the Linker}. | |
| @end defmac | |
| @defmac AC_TRY_RUN (@var{program}, @ovar{action-if-true}, @ | |
| @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE}) | |
| @acindex{TRY_RUN} | |
| Same as: | |
| @example | |
| AC_RUN_IFELSE( | |
| [AC_LANG_SOURCE([[@var{program}]])], | |
| [@var{action-if-true}], | |
| [@var{action-if-false}], | |
| [@var{action-if-cross-compiling}]) | |
| @end example | |
| @noindent | |
| @xref{Runtime}. | |
| @end defmac | |
| @anchor{AC_TYPE_SIGNAL} | |
| @defmac AC_TYPE_SIGNAL | |
| @acindex{TYPE_SIGNAL} | |
| @cvindex RETSIGTYPE | |
| @hdrindex{signal.h} | |
| If @file{signal.h} declares @code{signal} as returning a pointer to a | |
| function returning @code{void}, define @code{RETSIGTYPE} to be | |
| @code{void}; otherwise, define it to be @code{int}. These days, it is | |
| portable to assume C89, and that signal handlers return @code{void}, | |
| without needing to use this macro or @code{RETSIGTYPE}. | |
| @end defmac | |
| @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. | |
| Cache the result in the @code{ac_cv_type_size_t} variable. | |
| These days it is portable to assume C89 without using this macro. | |
| @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 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: |