| \input texinfo @c -*-texinfo-*- |
| @comment ======================================================== |
| @comment %**start of header |
| @setfilename autoconf.info |
| @include version.texi |
| @settitle Autoconf |
| @documentencoding UTF-8 |
| @set txicodequoteundirected |
| @set txicodequotebacktick |
| @setchapternewpage odd |
| @finalout |
| |
| @c @ovar(ARG) |
| @c ---------- |
| @c The ARG is an optional argument. To be used for macro arguments in |
| @c their documentation (@defmac). |
| @macro ovar{varname} |
| @r{[}@var{\varname\}@r{]} |
| @end macro |
| |
| @c @dvar(ARG, DEFAULT) |
| @c ------------------- |
| @c The ARG is an optional argument, defaulting to DEFAULT. To be used |
| @c for macro arguments in their documentation (@defmac). |
| @macro dvar{varname, default} |
| @r{[}@var{\varname\} = @samp{\default\}@r{]} |
| @end macro |
| |
| @c @dvarv(ARG, DEFAULT-VAR) |
| @c ------------------------ |
| @c Same as @dvar{ARG, DEFAULT-VAR}, but with @var instead of @samp |
| @c around DEFAULT-VAR. |
| @macro dvarv{varname, default} |
| @r{[}@var{\varname\} = @var{\default\}@r{]} |
| @end macro |
| |
| @c Handling the indexes with Texinfo yields several different problems. |
| @c |
| @c Because we want to drop out the AC_ part of the macro names in the |
| @c printed manual, but not in the other outputs, we need a layer above |
| @c the usual @acindex{} etc. That's why we first define indexes such as |
| @c acx meant to become the macro @acindex. First of all, using 'ac_' |
| @c does not work with makeinfo, and using 'ac1' doesn't work with TeX. |
| @c So use something more regular 'acx'. Then you finish with a printed |
| @c index saying 'index is not existent'. Of course: you ought to use |
| @c two letters :( So you use capitals. |
| @c |
| @c Second, when defining a macro in the TeX world, following spaces are |
| @c eaten. But then, since we embed @acxindex commands that use the end |
| @c of line as an end marker, the whole things wrecks itself. So make |
| @c sure you do *force* an additional end of line, add a '@c'. |
| @c |
| @c Finally, you might want to get rid of TeX expansion, using --expand |
| @c with texi2dvi. But then you wake up an old problem: we use macros |
| @c in @defmac etc. where TeX does perform the expansion, but not makeinfo. |
| |
| @c Define an environment variable index, for variables users may set |
| @c in their environment or on the configure command line. |
| @defcodeindex ev |
| @c Define an output variable index, for commonly AC_SUBST'ed variables. |
| @defcodeindex ov |
| @c Define a cache variable index, for variables matching *_cv_*. |
| @defcodeindex CA |
| @c Other shell variables not fitting the above categories should be |
| @c listed in the predefined vrindex, which we merge in the concept index. |
| @syncodeindex vr cp |
| @c Define a CPP preprocessor macro index, for #define'd strings. |
| @defcodeindex cv |
| @c Define an Autoconf macro index that @defmac doesn't write to. |
| @defcodeindex AC |
| @c Define an Autotest macro index that @defmac doesn't write to. |
| @defcodeindex AT |
| @c Define an M4sugar macro index that @defmac doesn't write to. |
| @defcodeindex MS |
| @c Define an index for *foreign* programs: 'mv' etc. Used for the |
| @c portability sections and so on. |
| @defindex pr |
| |
| @c shortindexflag |
| @c -------------- |
| @c Shall we factor AC_ out of the Autoconf macro index etc.? |
| @iftex |
| @set shortindexflag |
| @end iftex |
| |
| @c @acindex{MACRO} |
| @c --------------- |
| @c Registering an AC_\MACRO\. |
| @ifset shortindexflag |
| @macro acindex{macro} |
| @ACindex \macro\ |
| @c |
| @end macro |
| @end ifset |
| @ifclear shortindexflag |
| @macro acindex{macro} |
| @ACindex AC_\macro\ |
| @end macro |
| @end ifclear |
| |
| @c @ahindex{MACRO} |
| @c --------------- |
| @c Registering an AH_\MACRO\. |
| @macro ahindex{macro} |
| @ACindex AH_\macro\ |
| @c |
| @end macro |
| |
| @c @asindex{MACRO} |
| @c --------------- |
| @c Registering an AS_\MACRO\. |
| @ifset shortindexflag |
| @macro asindex{macro} |
| @MSindex \macro\ |
| @c |
| @end macro |
| @end ifset |
| @ifclear shortindexflag |
| @macro asindex{macro} |
| @MSindex AS_\macro\ |
| @end macro |
| @end ifclear |
| |
| @c @atindex{MACRO} |
| @c --------------- |
| @c Registering an AT_\MACRO\. |
| @ifset shortindexflag |
| @macro atindex{macro} |
| @ATindex \macro\ |
| @c |
| @end macro |
| @end ifset |
| @ifclear shortindexflag |
| @macro atindex{macro} |
| @ATindex AT_\macro\ |
| @end macro |
| @end ifclear |
| |
| @c @auindex{MACRO} |
| @c --------------- |
| @c Registering an AU_\MACRO\. |
| @macro auindex{macro} |
| @ACindex AU_\macro\ |
| @c |
| @end macro |
| |
| @c @hdrindex{MACRO} |
| @c ---------------- |
| @c Indexing a header. |
| @macro hdrindex{macro} |
| @prindex @file{\macro\} |
| @c |
| @end macro |
| |
| @c @msindex{MACRO} |
| @c --------------- |
| @c Registering an m4_\MACRO\. |
| @ifset shortindexflag |
| @macro msindex{macro} |
| @MSindex \macro\ |
| @c |
| @end macro |
| @end ifset |
| @ifclear shortindexflag |
| @macro msindex{macro} |
| @MSindex m4_\macro\ |
| @end macro |
| @end ifclear |
| |
| |
| @c @caindex{VARIABLE} |
| @c ------------------ |
| @c Registering an ac_cv_\VARIABLE\ cache variable. |
| @ifset shortindexflag |
| @macro caindex{macro} |
| @CAindex \macro\ |
| @end macro |
| @end ifset |
| @ifclear shortindexflag |
| @macro caindex{macro} |
| @CAindex ac_cv_\macro\ |
| @end macro |
| @end ifclear |
| |
| @c Define an index for functions: 'alloca' etc. Used for the |
| @c portability sections and so on. We can't use 'fn' (aka 'fnindex'), |
| @c since '@defmac' goes into it => we'd get all the macros too. |
| |
| @c FIXME: Aaarg! It seems there are too many indices for TeX :( |
| @c |
| @c ! No room for a new @write . |
| @c l.112 @defcodeindex fu |
| @c |
| @c so don't define yet another one :( Just put some tags before each |
| @c @prindex which is actually a @funindex. |
| @c |
| @c @defcodeindex fu |
| @c |
| @c |
| @c @c Put the programs and functions into their own index. |
| @c @syncodeindex fu pr |
| |
| @comment %**end of header |
| @comment ======================================================== |
| |
| @copying |
| |
| This manual (@value{UPDATED}) is for GNU Autoconf |
| (version @value{VERSION}), |
| a package for creating scripts to configure source code packages using |
| templates and an M4 macro package. |
| |
| Copyright @copyright{} 1992--1996, 1998--2017, 2020--2025 Free Software |
| Foundation, Inc. |
| |
| @quotation |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, |
| Version 1.3 or any later version published by the Free Software |
| Foundation; with no Invariant Sections, no Front-Cover texts, and |
| no Back-Cover Texts. A copy of the license is included in the section |
| entitled ``GNU Free Documentation License.'' |
| @end quotation |
| @end copying |
| |
| |
| |
| @dircategory Software development |
| @direntry |
| * Autoconf: (autoconf). Create source code configuration scripts. |
| @end direntry |
| |
| @dircategory Individual utilities |
| @direntry |
| * autoscan: (autoconf)autoscan Invocation. |
| Semi-automatic @file{configure.ac} writing |
| * ifnames: (autoconf)ifnames Invocation. Listing conditionals in source. |
| * autoconf-invocation: (autoconf)autoconf Invocation. |
| How to create configuration scripts |
| * autoreconf: (autoconf)autoreconf Invocation. |
| Remaking multiple @command{configure} scripts |
| * autoheader: (autoconf)autoheader Invocation. |
| How to create configuration templates |
| * autom4te: (autoconf)autom4te Invocation. |
| The Autoconf executables backbone |
| * configure: (autoconf)configure Invocation. Configuring a package. |
| * autoupdate: (autoconf)autoupdate Invocation. |
| Automatic update of @file{configure.ac} |
| * config.status: (autoconf)config.status Invocation. Recreating configurations. |
| * testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite. |
| @end direntry |
| |
| @titlepage |
| @title Autoconf |
| @subtitle Creating Automatic Configuration Scripts |
| @subtitle for version @value{VERSION}, @value{UPDATED} |
| @author David MacKenzie |
| @author Ben Elliston |
| @author Akim Demaille |
| @page |
| @vskip 0pt plus 1filll |
| @insertcopying |
| @end titlepage |
| |
| @contents |
| |
| |
| @ifnottex |
| @node Top |
| @top Autoconf |
| @insertcopying |
| @end ifnottex |
| |
| @c The master menu, created with texinfo-master-menu, goes here. |
| |
| @menu |
| * Introduction:: Autoconf's purpose, strengths, and weaknesses |
| * The GNU Build System:: A set of tools for portable software packages |
| * Making configure Scripts:: How to organize and produce Autoconf scripts |
| * Setup:: Initialization and output |
| * Existing Tests:: Macros that check for particular features |
| * Writing Tests:: How to write new feature checks |
| * Results:: What to do with results from feature checks |
| * Programming in M4:: Layers on top of which Autoconf is written |
| * Programming in M4sh:: Shell portability layer |
| * Writing Autoconf Macros:: Adding new macros to Autoconf |
| * Portable Shell:: Shell script portability pitfalls |
| * Portable Make:: Makefile portability pitfalls |
| * Portable C and C++:: C and C++ portability pitfalls |
| * Manual Configuration:: Selecting features that can't be guessed |
| * Site Configuration:: Local defaults for @command{configure} |
| * Running configure Scripts:: How to use the Autoconf output |
| * config.status Invocation:: Recreating a configuration |
| * Obsolete Constructs:: Kept for backward compatibility |
| * Using Autotest:: Creating portable test suites |
| * FAQ:: Frequent Autoconf Questions, with answers |
| * History:: History of Autoconf |
| * GNU Free Documentation License:: License for copying this manual |
| * Indices:: Indices of symbols, concepts, etc. |
| |
| @detailmenu |
| --- The Detailed Node Listing --- |
| |
| The GNU Build System |
| |
| * Automake:: Escaping makefile hell |
| * Gnulib:: The GNU portability library |
| * Libtool:: Building libraries portably |
| * Pointers:: More info on the GNU build system |
| |
| Making @command{configure} Scripts |
| |
| * Writing Autoconf Input:: What to put in an Autoconf input file |
| * autoscan Invocation:: Semi-automatic @file{configure.ac} writing |
| * ifnames Invocation:: Listing the conditionals in source code |
| * autoconf Invocation:: How to create configuration scripts |
| * autoreconf Invocation:: Remaking multiple @command{configure} scripts |
| |
| Writing @file{configure.ac} |
| |
| * Shell Script Compiler:: Autoconf as solution of a problem |
| * Autoconf Language:: Programming in Autoconf |
| * Autoconf Input Layout:: Standard organization of @file{configure.ac} |
| |
| Initialization and Output Files |
| |
| * Initializing configure:: Option processing etc. |
| * Versioning:: Dealing with Autoconf versions |
| * Notices:: Copyright, version numbers in @command{configure} |
| * Input:: Where Autoconf should find files |
| * Output:: Outputting results from the configuration |
| * Configuration Actions:: Preparing the output based on results |
| * Configuration Files:: Creating output files |
| * Makefile Substitutions:: Using output variables in makefiles |
| * Configuration Headers:: Creating a configuration header file |
| * Configuration Commands:: Running arbitrary instantiation commands |
| * Configuration Links:: Links depending on the configuration |
| * Subdirectories:: Configuring independent packages together |
| * Default Prefix:: Changing the default installation prefix |
| |
| Substitutions in Makefiles |
| |
| * Preset Output Variables:: Output variables that are always set |
| * Installation Directory Variables:: Other preset output variables |
| * Changed Directory Variables:: Warnings about @file{datarootdir} |
| * Build Directories:: Supporting multiple concurrent compiles |
| * Automatic Remaking:: Makefile rules for configuring |
| |
| Configuration Header Files |
| |
| * Header Templates:: Input for the configuration headers |
| * autoheader Invocation:: How to create configuration templates |
| * Autoheader Macros:: How to specify CPP templates |
| |
| Existing Tests |
| |
| * Common Behavior:: Macros' standard schemes |
| * Alternative Programs:: Selecting between alternative programs |
| * Files:: Checking for the existence of files |
| * Libraries:: Library archives that might be missing |
| * Library Functions:: C library functions that might be missing |
| * Header Files:: Header files that might be missing |
| * Declarations:: Declarations that may be missing |
| * Structures:: Structures or members that might be missing |
| * Types:: Types that might be missing |
| * Compilers and Preprocessors:: Checking for compiling programs |
| * System Services:: Operating system services |
| * C and POSIX Variants:: Kludges for C and POSIX variants |
| * Erlang Libraries:: Checking for the existence of Erlang libraries |
| |
| Common Behavior |
| |
| * Standard Symbols:: Symbols defined by the macros |
| * Default Includes:: Includes used by the generic macros |
| |
| Alternative Programs |
| |
| * Particular Programs:: Special handling to find certain programs |
| * Generic Programs:: How to find other programs |
| |
| Library Functions |
| |
| * Function Portability:: Pitfalls with usual functions |
| * Particular Functions:: Special handling to find certain functions |
| * Generic Functions:: How to find other functions |
| |
| Header Files |
| |
| * Header Portability:: Collected knowledge on common headers |
| * Particular Headers:: Special handling to find certain headers |
| * Generic Headers:: How to find other headers |
| |
| Declarations |
| |
| * Particular Declarations:: Macros to check for certain declarations |
| * Generic Declarations:: How to find other declarations |
| |
| Structures |
| |
| * Particular Structures:: Macros to check for certain structure members |
| * Generic Structures:: How to find other structure members |
| |
| Types |
| |
| * Particular Types:: Special handling to find certain types |
| * Generic Types:: How to find other types |
| |
| Compilers and Preprocessors |
| |
| * Specific Compiler Characteristics:: Some portability issues |
| * Generic Compiler Characteristics:: Language independent tests and features |
| * C Compiler:: Checking its characteristics |
| * C++ Compiler:: Likewise |
| * Objective C Compiler:: Likewise |
| * Objective C++ Compiler:: Likewise |
| * Erlang Compiler and Interpreter:: Likewise |
| * Fortran Compiler:: Likewise |
| * Go Compiler:: Likewise |
| |
| Writing Tests |
| |
| * Language Choice:: Selecting which language to use for testing |
| * Writing Test Programs:: Forging source files for compilers |
| * Running the Preprocessor:: Detecting preprocessor symbols |
| * Running the Compiler:: Detecting language or header features |
| * Running the Linker:: Detecting library features |
| * Runtime:: Testing for runtime features |
| * Multiple Cases:: Tests for several possible values |
| |
| Writing Test Programs |
| |
| * Guidelines:: General rules for writing test programs |
| * Test Functions:: Avoiding pitfalls in test programs |
| * Generating Sources:: Source program boilerplate |
| |
| Results of Tests |
| |
| * Defining Symbols:: Defining C preprocessor symbols |
| * Setting Output Variables:: Replacing variables in output files |
| * Special Chars in Variables:: Characters to beware of in variables |
| * Caching Results:: Speeding up subsequent @command{configure} runs |
| * Printing Messages:: Notifying @command{configure} users |
| |
| Caching Results |
| |
| * Cache Variable Names:: Shell variables used in caches |
| * Cache Files:: Files @command{configure} uses for caching |
| * Cache Checkpointing:: Loading and saving the cache file |
| |
| Programming in M4 |
| |
| * M4 Quotation:: Protecting macros from unwanted expansion |
| * Using autom4te:: The Autoconf executables backbone |
| * Programming in M4sugar:: Convenient pure M4 macros |
| * Debugging via autom4te:: Figuring out what M4 was doing |
| |
| M4 Quotation |
| |
| * Active Characters:: Characters that change the behavior of M4 |
| * One Macro Call:: Quotation and one macro call |
| * Quoting and Parameters:: M4 vs. shell parameters |
| * Quotation and Nested Macros:: Macros calling macros |
| * Changequote is Evil:: Worse than INTERCAL: M4 + changequote |
| * Quadrigraphs:: Another way to escape special characters |
| * Balancing Parentheses:: Dealing with unbalanced parentheses |
| * Quotation Rule Of Thumb:: One parenthesis, one quote |
| |
| Using @command{autom4te} |
| |
| * autom4te Invocation:: A GNU M4 wrapper |
| * Customizing autom4te:: Customizing the Autoconf package |
| |
| Programming in M4sugar |
| |
| * Redefined M4 Macros:: M4 builtins changed in M4sugar |
| * Diagnostic Macros:: Diagnostic messages from M4sugar |
| * Diversion support:: Diversions in M4sugar |
| * Conditional constructs:: Conditions in M4 |
| * Looping constructs:: Iteration in M4 |
| * Evaluation Macros:: More quotation and evaluation control |
| * Text processing Macros:: String manipulation in M4 |
| * Number processing Macros:: Arithmetic computation in M4 |
| * Set manipulation Macros:: Set manipulation in M4 |
| * Forbidden Patterns:: Catching unexpanded macros |
| |
| Programming in M4sh |
| |
| * Common Shell Constructs:: Portability layer for common shell constructs |
| * Polymorphic Variables:: Support for indirect variable names |
| * Initialization Macros:: Macros to establish a sane shell environment |
| * File Descriptor Macros:: File descriptor macros for input and output |
| |
| Writing Autoconf Macros |
| |
| * Macro Definitions:: Basic format of an Autoconf macro |
| * Macro Names:: What to call your new macros |
| * Dependencies Between Macros:: What to do when macros depend on other macros |
| * Obsoleting Macros:: Warning about old ways of doing things |
| * Coding Style:: Writing Autoconf macros à la Autoconf |
| |
| Dependencies Between Macros |
| |
| * Prerequisite Macros:: Ensuring required information |
| * Suggested Ordering:: Warning about possible ordering problems |
| * One-Shot Macros:: Ensuring a macro is called only once |
| |
| Portable Shell Programming |
| |
| * Systemology:: A zoology of operating systems |
| * Shellology:: A zoology of shells |
| * Invoking the Shell:: Invoking the shell as a command |
| * Here-Documents:: Quirks and tricks |
| * File Descriptors:: FDs and redirections |
| * Signal Handling:: Shells, signals, and headaches |
| * File System Conventions:: File names |
| * Shell Pattern Matching:: Pattern matching |
| * Shell Substitutions:: Variable and command expansions |
| * Assignments:: Varying side effects of assignments |
| * Parentheses:: Parentheses in shell scripts |
| * Special Shell Variables:: Variables you should not change |
| * Shell Functions:: What to look out for if you use them |
| * Limitations of Builtins:: Portable use of not so portable /bin/sh |
| * Limitations of Usual Tools:: Portable use of portable tools |
| |
| Portable Make Programming |
| |
| * $< in Ordinary Make Rules:: $< in ordinary rules |
| * Failure in Make Rules:: Failing portably in rules |
| * Command Line Prefixes:: What's at the start of makefile command lines |
| * Special Chars in Names:: Special characters in macro names |
| * Backslash-Newline-Empty:: Empty lines after backslash-newline |
| * Backslash-Newline Comments:: Spanning comments across line boundaries |
| * Macros and Submakes:: @code{make macro=value} and submakes |
| * The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues |
| * The Make Macro SHELL:: @code{$(SHELL)} portability issues |
| * Parallel Make:: Parallel @command{make} quirks |
| * Comments in Make Rules:: Other problems with Make comments |
| * Newlines in Make Rules:: Using literal newlines in rules |
| * Comments in Make Macros:: Other problems with Make comments in macros |
| * Trailing whitespace in Make Macros:: Macro substitution problems |
| * Command-line Macros and whitespace:: Whitespace trimming of values |
| * obj/ and Make:: Don't name a subdirectory @file{obj} |
| * make -k Status:: Exit status of @samp{make -k} |
| * VPATH and Make:: @code{VPATH} woes |
| * Single Suffix Rules:: Single suffix rules and separated dependencies |
| * Timestamps and Make:: Sub-second timestamp resolution |
| |
| @code{VPATH} and Make |
| |
| * Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts |
| * VPATH and Double-colon:: Problems with @samp{::} on ancient hosts |
| * $< in Explicit Rules:: @code{$<} does not work in ordinary rules |
| * Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris |
| * Make Target Lookup:: More details about @code{VPATH} lookup |
| |
| Portable C and C++ Programming |
| |
| * Varieties of Unportability:: How to make your programs unportable |
| * Integer Overflow:: When integers get too large |
| * Preprocessor Arithmetic:: @code{#if} expression problems |
| * Null Pointers:: Properties of null pointers |
| * Buffer Overruns:: Subscript errors and the like |
| * Volatile Objects:: @code{volatile} and signals |
| * Floating Point Portability:: Portable floating-point arithmetic |
| * Exiting Portably:: Exiting and the exit status |
| |
| Integer Overflow |
| |
| * Integer Overflow Basics:: Why integer overflow is a problem |
| * Signed Overflow Examples:: Examples of code assuming wraparound |
| * Optimization and Wraparound:: Optimizations that break uses of wraparound |
| * Signed Overflow Advice:: Practical advice for signed overflow issues |
| * Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} |
| |
| Manual Configuration |
| |
| * Specifying Target Triplets:: Specifying target triplets |
| * Canonicalizing:: Getting the canonical system type |
| * Using System Type:: What to do with the system type |
| |
| Site Configuration |
| |
| * Help Formatting:: Customizing @samp{configure --help} |
| * External Software:: Working with other optional software |
| * Package Options:: Selecting optional features |
| * Pretty Help Strings:: Formatting help string |
| * Option Checking:: Controlling checking of @command{configure} options |
| * Site Details:: Configuring site details |
| * Transforming Names:: Changing program names when installing |
| * Site Defaults:: Giving @command{configure} local defaults |
| |
| Transforming Program Names When Installing |
| |
| * Transformation Options:: @command{configure} options to transform names |
| * Transformation Examples:: Sample uses of transforming names |
| * Transformation Rules:: Makefile uses of transforming names |
| |
| Running @command{configure} Scripts |
| |
| * Basic Installation:: Instructions for typical cases |
| * Installation Prerequisites:: What you need to install |
| * Compilers and Options:: Selecting compilers and optimization |
| * Multiple Architectures:: Compiling for multiple architectures at once |
| * Installation Names:: Installing in different directories |
| * Optional Features:: Selecting optional features |
| * System Types:: Specifying a system type |
| * Sharing Defaults:: Setting site-wide defaults for @command{configure} |
| * Defining Variables:: Specifying the compiler etc. |
| * configure Invocation:: Changing how @command{configure} runs |
| |
| Obsolete Constructs |
| |
| * Obsolete config.status Use:: Obsolete convention for @command{config.status} |
| * acconfig Header:: Additional entries in @file{config.h.in} |
| * autoupdate Invocation:: Automatic update of @file{configure.ac} |
| * Obsolete Macros:: Backward compatibility macros |
| * Autoconf 1:: Tips for upgrading your files |
| * Autoconf 2.13:: Some fresher tips |
| |
| Upgrading From Version 1 |
| |
| * Changed File Names:: Files you might rename |
| * Changed Makefiles:: New things to put in @file{Makefile.in} |
| * Changed Macros:: Macro calls you might replace |
| * Changed Results:: Changes in how to check test results |
| * Changed Macro Writing:: Better ways to write your own macros |
| |
| Upgrading From Version 2.13 |
| |
| * Changed Quotation:: Broken code which used to work |
| * New Macros:: Interaction with foreign macros |
| * Hosts and Cross-Compilation:: Bugward compatibility kludges |
| * AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token |
| * AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources |
| |
| Generating Test Suites with Autotest |
| |
| * Using an Autotest Test Suite:: Autotest and the user |
| * Writing Testsuites:: Autotest macros |
| * testsuite Invocation:: Running @command{testsuite} scripts |
| * Making testsuite Scripts:: Using autom4te to create @command{testsuite} |
| |
| Using an Autotest Test Suite |
| |
| * testsuite Scripts:: The concepts of Autotest |
| * Autotest Logs:: Their contents |
| |
| Frequent Autoconf Questions, with answers |
| |
| * Distributing:: Distributing @command{configure} scripts |
| * Why GNU M4:: Why not use the standard M4? |
| * Bootstrapping:: Autoconf and GNU M4 require each other? |
| * Why Not Imake:: Why GNU uses @command{configure} instead of Imake |
| * Defining Directories:: Passing @code{datadir} to program |
| * Autom4te Cache:: What is it? Can I remove it? |
| * Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree |
| * Expanded Before Required:: Expanded Before Required |
| * Debugging:: Debugging @command{configure} scripts |
| |
| History of Autoconf |
| |
| * Genesis:: Prehistory and naming of @command{configure} |
| * Exodus:: The plagues of M4 and Perl |
| * Leviticus:: The priestly code of portability arrives |
| * Numbers:: Growth and contributors |
| * Deuteronomy:: Approaching the promises of easy configuration |
| |
| Indices |
| |
| * Environment Variable Index:: Index of environment variables used |
| * Output Variable Index:: Index of variables set in output files |
| * Preprocessor Symbol Index:: Index of C preprocessor symbols defined |
| * Cache Variable Index:: Index of documented cache variables |
| * Autoconf Macro Index:: Index of Autoconf macros |
| * M4 Macro Index:: Index of M4, M4sugar, and M4sh macros |
| * Autotest Macro Index:: Index of Autotest macros |
| * Program & Function Index:: Index of those with portability problems |
| * Concept Index:: General index |
| |
| @end detailmenu |
| @end menu |
| |
| @c ============================================================= Introduction. |
| |
| @node Introduction |
| @chapter Introduction |
| @cindex Introduction |
| |
| @flushright |
| A physicist, an engineer, and a computer scientist were discussing the |
| nature of God. ``Surely a Physicist,'' said the physicist, ``because |
| early in the Creation, God made Light; and you know, Maxwell's |
| equations, the dual nature of electromagnetic waves, the relativistic |
| consequences@enddots{}'' ``An Engineer!,'' said the engineer, ``because |
| before making Light, God split the Chaos into Land and Water; it takes |
| a hell of an engineer to handle that big amount of mud, and orderly |
| separation of solids from liquids@enddots{}'' The computer scientist |
| shouted: ``And the Chaos, where do you think it was coming from, hmm?'' |
| |
| ---Anonymous |
| @end flushright |
| @c (via François Pinard) |
| |
| Autoconf is a tool for producing shell scripts that automatically |
| configure software source code packages to adapt to many kinds of |
| POSIX-like systems. The configuration scripts produced by Autoconf |
| are independent of Autoconf when they are run, so their users do not |
| need to have Autoconf. |
| |
| The configuration scripts produced by Autoconf require no manual user |
| intervention when run; they do not normally even need an argument |
| specifying the system type. Instead, they individually test for the |
| presence of each feature that the software package they are for might need. |
| (Before each check, they print a one-line message stating what they are |
| checking for, so the user doesn't get too bored while waiting for the |
| script to finish.) As a result, they deal well with systems that are |
| hybrids or customized from the more common POSIX variants. There is |
| no need to maintain files that list the features supported by each |
| release of each variant of POSIX. |
| |
| For each software package that Autoconf is used with, it creates a |
| configuration script from a template file that lists the system features |
| that the package needs or can use. After the shell code to recognize |
| and respond to a system feature has been written, Autoconf allows it to |
| be shared by many software packages that can use (or need) that feature. |
| If it later turns out that the shell code needs adjustment for some |
| reason, it needs to be changed in only one place; all of the |
| configuration scripts can be regenerated automatically to take advantage |
| of the updated code. |
| |
| @c "Those who do not understand Unix are condemned to reinvent it, poorly." |
| @c --Henry Spencer, 1987 (see https://en.wikipedia.org/wiki/Unix_philosophy) |
| Those who do not understand Autoconf are condemned to reinvent it, poorly. |
| The primary goal of Autoconf is making the @emph{user's} life easier; |
| making the @emph{maintainer's} life easier is only a secondary goal. |
| Put another way, the primary goal is not to make the generation of |
| @file{configure} automatic for package maintainers (although patches |
| along that front are welcome, since package maintainers form the user |
| base of Autoconf); rather, the goal is to make @file{configure} |
| painless, portable, and predictable for the end user of each |
| @dfn{autoconfiscated} package. And to this degree, Autoconf is highly |
| successful at its goal---most complaints to the Autoconf list are |
| about difficulties in writing Autoconf input, and not in the behavior of |
| the resulting @file{configure}. Even packages that don't use Autoconf |
| will generally provide a @file{configure} script, and the most common |
| complaint about these alternative home-grown scripts is that they fail |
| to meet one or more of the GNU Coding Standards (@pxref{Configuration, , , |
| standards, The GNU Coding Standards}) that users |
| have come to expect from Autoconf-generated @file{configure} scripts. |
| |
| The Metaconfig package is similar in purpose to Autoconf, but the |
| scripts it produces require manual user intervention, which is quite |
| inconvenient when configuring large source trees. Unlike Metaconfig |
| scripts, Autoconf scripts can support cross-compiling, if some care is |
| taken in writing them. |
| |
| Autoconf does not solve all problems related to making portable |
| software packages---for a more complete solution, it should be used in |
| concert with other GNU build tools like Automake and |
| Libtool. These other tools take on jobs like the creation of a |
| portable, recursive makefile with all of the standard targets, |
| linking of shared libraries, and so on. @xref{The GNU Build System}, |
| for more information. |
| |
| Autoconf imposes some restrictions on the names of macros used with |
| @code{#if} in C programs (@pxref{Preprocessor Symbol Index}). |
| |
| Autoconf requires GNU M4 version 1.4.8 or later in order to |
| generate the scripts. It uses features that some versions of M4, |
| including GNU M4 1.3, do not have. Autoconf works better |
| with GNU M4 version 1.4.16 or later, though this is not |
| required. |
| |
| @xref{Autoconf 1}, for information about upgrading from version 1. |
| @xref{History}, for the story of Autoconf's development. @xref{FAQ}, |
| for answers to some common questions about Autoconf. |
| |
| See the @uref{https://@/www.gnu.org/@/software/@/autoconf/, |
| Autoconf web page} for up-to-date information, details on the mailing |
| lists, pointers to a list of known bugs, etc. |
| |
| Mail suggestions to @email{autoconf@@gnu.org, the Autoconf mailing |
| list}. Past suggestions are |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf/, archived}. |
| |
| Mail bug reports to @email{bug-autoconf@@gnu.org, the |
| Autoconf Bugs mailing list}. Past bug reports are |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/bug-autoconf/, archived}. |
| |
| If possible, first check that your bug is |
| not already solved in current development versions, and that it has not |
| been reported yet. Be sure to include all the needed information and a |
| short @file{configure.ac} that demonstrates the problem. |
| |
| Autoconf's development tree is accessible via @command{git}; see the |
| @uref{https://@/savannah.gnu.org/@/projects/@/autoconf/, Autoconf |
| Summary} for details, or view |
| @uref{https://@/git.savannah.gnu.org/@/cgit/@/autoconf.git, the actual |
| repository}. Patches relative to the current @command{git} version can |
| be sent for review to the @email{autoconf-patches@@gnu.org, Autoconf |
| Patches mailing list}, with discussion on prior patches |
| @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-@/patches/, |
| archived}; and all commits are posted in the read-only |
| @email{autoconf-commit@@gnu.org, Autoconf Commit mailing list}, which is |
| also @uref{https://@/lists.gnu.org/@/archive/@/html/@/autoconf-commit/, |
| archived}. |
| |
| Because of its mission, the Autoconf package itself |
| includes only a set of often-used |
| macros that have already demonstrated their usefulness. Nevertheless, |
| if you wish to share your macros, or find existing ones, see the |
| @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro |
| Archive}, which is kindly run by @email{simons@@cryp.to, |
| Peter Simons}. |
| |
| |
| @c ================================================= The GNU Build System |
| |
| @node The GNU Build System |
| @chapter The GNU Build System |
| @cindex GNU build system |
| |
| Autoconf solves an important problem---reliable discovery of |
| system-specific build and runtime information---but this is only one |
| piece of the puzzle for the development of portable software. To this |
| end, the GNU project has developed a suite of integrated |
| utilities to finish the job Autoconf started: the GNU build |
| system, whose most important components are Autoconf, Automake, and |
| Libtool. In this chapter, we introduce you to those tools, point you |
| to sources of more information, and try to convince you to use the |
| entire GNU build system for your software. |
| |
| @menu |
| * Automake:: Escaping makefile hell |
| * Gnulib:: The GNU portability library |
| * Libtool:: Building libraries portably |
| * Pointers:: More info on the GNU build system |
| @end menu |
| |
| @node Automake |
| @section Automake |
| |
| The ubiquity of @command{make} means that a makefile is almost the |
| only viable way to distribute automatic build rules for software, but |
| one quickly runs into its numerous limitations. Its lack of |
| support for automatic dependency tracking, recursive builds in |
| subdirectories, reliable timestamps (e.g., for network file systems), and |
| so on, mean that developers must painfully (and often incorrectly) |
| reinvent the wheel for each project. Portability is non-trivial, thanks |
| to the quirks of @command{make} on many systems. On top of all this is the |
| manual labor required to implement the many standard targets that users |
| have come to expect (@code{make install}, @code{make distclean}, |
| @code{make uninstall}, etc.). Since you are, of course, using Autoconf, |
| you also have to insert repetitive code in your @file{Makefile.in} to |
| recognize @code{@@CC@@}, @code{@@CFLAGS@@}, and other substitutions |
| provided by @command{configure}. Into this mess steps @dfn{Automake}. |
| @cindex Automake |
| |
| Automake allows you to specify your build needs in a @file{Makefile.am} |
| file with a vastly simpler and more powerful syntax than that of a plain |
| makefile, and then generates a portable @file{Makefile.in} for |
| use with Autoconf. For example, the @file{Makefile.am} to build and |
| install a simple ``Hello world'' program might look like: |
| |
| @example |
| bin_PROGRAMS = hello |
| hello_SOURCES = hello.c |
| @end example |
| |
| @noindent |
| The resulting @file{Makefile.in} (~400 lines) automatically supports all |
| the standard targets, the substitutions provided by Autoconf, automatic |
| dependency tracking, @code{VPATH} building, and so on. @command{make} |
| builds the @code{hello} program, and @code{make install} installs it |
| in @file{/usr/local/bin} (or whatever prefix was given to |
| @command{configure}, if not @file{/usr/local}). |
| |
| The benefits of Automake increase for larger packages (especially ones |
| with subdirectories), but even for small programs the added convenience |
| and portability can be substantial. And that's not all@enddots{} |
| |
| @node Gnulib |
| @section Gnulib |
| |
| GNU software has a well-deserved reputation for running on |
| many different types of systems. While our primary goal is to write |
| software for the GNU system, many users and developers have |
| been introduced to us through the systems that they were already using. |
| |
| @cindex Gnulib |
| Gnulib is a central location for common GNU code, intended to |
| be shared among free software packages. Its components are typically |
| shared at the source level, rather than being a library that gets built, |
| installed, and linked against. The idea is to copy files from Gnulib |
| into your own source tree. There is no distribution tarball; developers |
| should just grab source modules from the repository. The source files |
| are available online, under various licenses, mostly GNU |
| GPL or GNU LGPL. |
| |
| Gnulib modules typically contain C source code along with Autoconf |
| macros used to configure the source code. For example, the Gnulib |
| @code{stdckdint} module implements a @file{stdckdint.h} header that nearly |
| conforms to C23, even on older hosts that lack @file{stdckdint.h}. |
| This module contains a source file for the replacement header, along |
| with an Autoconf macro that arranges to use the replacement header on |
| older systems. |
| |
| For more information, consult the Gnulib website, |
| @uref{https://@/www.gnu.org/@/software/@/gnulib/}. |
| |
| @node Libtool |
| @section Libtool |
| |
| Often, one wants to build not only programs, but libraries, so that |
| other programs can benefit from the fruits of your labor. Ideally, one |
| would like to produce @emph{shared} (dynamically linked) libraries, |
| which can be used by multiple programs without duplication on disk or in |
| memory and can be updated independently of the linked programs. |
| Producing shared libraries portably, however, is the stuff of |
| nightmares---each system has its own incompatible tools, compiler flags, |
| and magic incantations. Fortunately, GNU provides a solution: |
| @dfn{Libtool}. |
| @cindex Libtool |
| |
| Libtool handles all the requirements of building shared libraries for |
| you, and at this time seems to be the @emph{only} way to do so with any |
| portability. It also handles many other headaches, such as: the |
| interaction of Make rules with the variable suffixes of |
| shared libraries, linking reliably with shared libraries before they are |
| installed by the superuser, and supplying a consistent versioning system |
| (so that different versions of a library can be installed or upgraded |
| without breaking binary compatibility). Although Libtool, like |
| Autoconf, can be used without Automake, it is most simply utilized in |
| conjunction with Automake---there, Libtool is used automatically |
| whenever shared libraries are needed, and you need not know its syntax. |
| |
| @node Pointers |
| @section Pointers |
| |
| Developers who are used to the simplicity of @command{make} for small |
| projects on a single system might be daunted at the prospect of |
| learning to use Automake and Autoconf. As your software is |
| distributed to more and more users, however, you otherwise |
| quickly find yourself putting lots of effort into reinventing the |
| services that the GNU build tools provide, and making the |
| same mistakes that they once made and overcame. (Besides, since |
| you're already learning Autoconf, Automake is a piece of cake.) |
| |
| There are a number of places that you can go to for more information on |
| the GNU build tools. |
| |
| @itemize @minus |
| |
| @item Web |
| |
| The project home pages for |
| @uref{https://@/www@/.gnu@/.org/@/software/@/autoconf/, Autoconf}, |
| @uref{https://@/www@/.gnu@/.org/@/software/@/automake/, Automake}, |
| @uref{https://@/www@/.gnu@/.org/@/software/@/gnulib/, Gnulib}, and |
| @uref{https://@/www@/.gnu@/.org/@/software/@/libtool/, Libtool}. |
| |
| @item Automake Manual |
| |
| @xref{Top, , Automake, automake, GNU Automake}, for more |
| information on Automake. |
| |
| @item Books |
| |
| The book @cite{GNU Autoconf, Automake and |
| Libtool}@footnote{@cite{GNU Autoconf, Automake and Libtool}, |
| by G. V. Vaughan, B. Elliston, T. Tromey, and I. L. Taylor. SAMS (originally |
| New Riders), 2000, ISBN 1578701902.} describes the complete GNU |
| build environment. You can also find |
| @uref{https://@/www.sourceware.org/@/autobook/, the entire book on-line}. |
| |
| @end itemize |
| |
| @c ================================================= Making configure Scripts. |
| |
| @node Making configure Scripts |
| @chapter Making @command{configure} Scripts |
| @cindex @file{aclocal.m4} |
| @cindex @command{configure} |
| |
| The configuration scripts that Autoconf produces are by convention |
| called @command{configure}. When run, @command{configure} creates several |
| files, replacing configuration parameters in them with appropriate |
| values. The files that @command{configure} creates are: |
| |
| @itemize @minus |
| @item |
| one or more @file{Makefile} files, usually one in each subdirectory of the |
| package (@pxref{Makefile Substitutions}); |
| |
| @item |
| optionally, a C header file, the name of which is configurable, |
| containing @code{#define} directives (@pxref{Configuration Headers}); |
| |
| @item |
| a shell script called @file{config.status} that, when run, recreates |
| the files listed above (@pxref{config.status Invocation}); |
| |
| @item |
| an optional shell script normally called @file{config.cache} |
| (created when using @samp{configure --config-cache}) that |
| saves the results of running many of the tests (@pxref{Cache Files}); |
| |
| @item |
| a file called @file{config.log} containing any messages produced by |
| compilers, to help debugging if @command{configure} makes a mistake. |
| @end itemize |
| |
| @cindex @file{configure.ac} |
| To create a @command{configure} script with Autoconf, you need |
| to write an Autoconf input file @file{configure.ac} and run |
| @command{autoconf} on it. If you write your own feature tests to |
| supplement those that come with Autoconf, you might also write files |
| called @file{aclocal.m4} and @file{acsite.m4}. If you use a C header |
| file to contain @code{#define} directives, you might also run |
| @command{autoheader}, and you can distribute the generated file |
| @file{config.h.in} with the package. |
| |
| Here is a diagram showing how the files that can be used in |
| configuration are produced. Programs that are executed are suffixed by |
| @samp{*}. Optional files are enclosed in square brackets (@samp{[]}). |
| @command{autoconf} and @command{autoheader} also read the installed Autoconf |
| macro files (by reading @file{autoconf.m4}). |
| |
| @noindent |
| Files used in preparing a software package for distribution, when using |
| just Autoconf: |
| @example |
| your source files --> [autoscan*] --> [configure.scan] --> configure.ac |
| |
| @group |
| configure.ac --. |
| | .------> autoconf* -----> configure |
| [aclocal.m4] --+---+ |
| | `-----> [autoheader*] --> [config.h.in] |
| [acsite.m4] ---' |
| @end group |
| |
| Makefile.in |
| @end example |
| |
| @noindent |
| Additionally, if you use Automake, the following additional productions |
| come into play: |
| |
| @example |
| @group |
| [acinclude.m4] --. |
| | |
| [local macros] --+--> aclocal* --> aclocal.m4 |
| | |
| configure.ac ----' |
| @end group |
| |
| @group |
| configure.ac --. |
| +--> automake* --> Makefile.in |
| Makefile.am ---' |
| @end group |
| @end example |
| |
| @noindent |
| Files used in configuring a software package: |
| @example |
| @group |
| .-------------> [config.cache] |
| configure* ------------+-------------> config.log |
| | |
| [config.h.in] -. v .-> [config.h] -. |
| +--> config.status* -+ +--> make* |
| Makefile.in ---' `-> Makefile ---' |
| @end group |
| @end example |
| |
| @menu |
| * Writing Autoconf Input:: What to put in an Autoconf input file |
| * autoscan Invocation:: Semi-automatic @file{configure.ac} writing |
| * ifnames Invocation:: Listing the conditionals in source code |
| * autoconf Invocation:: How to create configuration scripts |
| * autoreconf Invocation:: Remaking multiple @command{configure} scripts |
| @end menu |
| |
| @node Writing Autoconf Input |
| @section Writing @file{configure.ac} |
| |
| To produce a @command{configure} script for a software package, create a |
| file called @file{configure.ac} that contains invocations of the |
| Autoconf macros that test the system features your package needs or can |
| use. Autoconf macros already exist to check for many features; see |
| @ref{Existing Tests}, for their descriptions. For most other features, |
| you can use Autoconf template macros to produce custom checks; see |
| @ref{Writing Tests}, for information about them. For especially tricky |
| or specialized features, @file{configure.ac} might need to contain some |
| hand-crafted shell commands; see @ref{Portable Shell, , Portable Shell |
| Programming}. The @command{autoscan} program can give you a good start |
| in writing @file{configure.ac} (@pxref{autoscan Invocation}, for more |
| information). |
| |
| @cindex @file{configure.in} |
| Previous versions of Autoconf promoted the name @file{configure.in}, |
| which is somewhat ambiguous (the tool needed to process this file is not |
| described by its extension), and introduces a slight confusion with |
| @file{config.h.in} and so on (for which @samp{.in} means ``to be |
| processed by @command{configure}''). Using @file{configure.ac} is now |
| preferred, while the use of @file{configure.in} will cause warnings |
| from @command{autoconf}. |
| |
| @menu |
| * Shell Script Compiler:: Autoconf as solution of a problem |
| * Autoconf Language:: Programming in Autoconf |
| * Autoconf Input Layout:: Standard organization of @file{configure.ac} |
| @end menu |
| |
| @node Shell Script Compiler |
| @subsection A Shell Script Compiler |
| |
| Just as for any other computer language, in order to properly program |
| @file{configure.ac} in Autoconf you must understand @emph{what} problem |
| the language tries to address and @emph{how} it does so. |
| |
| The problem Autoconf addresses is that the world is a mess. After all, |
| you are using Autoconf in order to have your package compile easily on |
| all sorts of different systems, some of them being extremely hostile. |
| Autoconf itself bears the price for these differences: @command{configure} |
| must run on all those systems, and thus @command{configure} must limit itself |
| to their lowest common denominator of features. |
| |
| Naturally, you might then think of shell scripts; who needs |
| @command{autoconf}? A set of properly written shell functions is enough to |
| make it easy to write @command{configure} scripts by hand. Sigh! |
| Unfortunately, even in 2008, where shells without any function support are |
| far and few between, there are pitfalls to avoid when making use of them. |
| Also, finding a Bourne shell that accepts shell functions is not trivial, |
| even though there is almost always one on interesting porting targets. |
| |
| So, what is really needed is some kind of compiler, @command{autoconf}, |
| that takes an Autoconf program, @file{configure.ac}, and transforms it |
| into a portable shell script, @command{configure}. |
| |
| How does @command{autoconf} perform this task? |
| |
| There are two obvious possibilities: creating a brand new language or |
| extending an existing one. The former option is attractive: all |
| sorts of optimizations could easily be implemented in the compiler and |
| many rigorous checks could be performed on the Autoconf program |
| (e.g., rejecting any non-portable construct). Alternatively, you can |
| extend an existing language, such as the @code{sh} (Bourne shell) |
| language. |
| |
| Autoconf does the latter: it is a layer on top of @code{sh}. It was |
| therefore most convenient to implement @command{autoconf} as a macro |
| expander: a program that repeatedly performs @dfn{macro expansions} on |
| text input, replacing macro calls with macro bodies and producing a pure |
| @code{sh} script in the end. Instead of implementing a dedicated |
| Autoconf macro expander, it is natural to use an existing |
| general-purpose macro language, such as M4, and implement the extensions |
| as a set of M4 macros. |
| |
| |
| @node Autoconf Language |
| @subsection The Autoconf Language |
| @cindex quotation |
| |
| The Autoconf language differs from many other computer |
| languages because it treats actual code the same as plain text. Whereas |
| in C, for instance, data and instructions have different syntactic |
| status, in Autoconf their status is rigorously the same. Therefore, we |
| need a means to distinguish literal strings from text to be expanded: |
| quotation. |
| |
| When calling macros that take arguments, there must not be any white |
| space between the macro name and the open parenthesis. |
| |
| @example |
| AC_INIT ([oops], [1.0]) # incorrect |
| AC_INIT([hello], [1.0]) # good |
| @end example |
| |
| Arguments should |
| be enclosed within the quote characters @samp{[} and @samp{]}, and be |
| separated by commas. Any leading blanks or newlines in arguments are ignored, |
| unless they are quoted. You should always quote an argument that |
| might contain a macro name, comma, parenthesis, or a leading blank or |
| newline. This rule applies recursively for every macro |
| call, including macros called from other macros. For more details on |
| quoting rules, see @ref{Programming in M4}. |
| |
| For instance: |
| |
| @example |
| AC_CHECK_HEADER([stdio.h], |
| [AC_DEFINE([HAVE_STDIO_H], [1], |
| [Define to 1 if you have <stdio.h>.])], |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) |
| @end example |
| |
| @noindent |
| is quoted properly. You may safely simplify its quotation to: |
| |
| @example |
| AC_CHECK_HEADER([stdio.h], |
| [AC_DEFINE([HAVE_STDIO_H], 1, |
| [Define to 1 if you have <stdio.h>.])], |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) |
| @end example |
| |
| @noindent |
| because @samp{1} cannot contain a macro call. Here, the argument of |
| @code{AC_MSG_ERROR} must be quoted; otherwise, its comma would be |
| interpreted as an argument separator. Also, the second and third arguments |
| of @samp{AC_CHECK_HEADER} must be quoted, since they contain |
| macro calls. The three arguments @samp{HAVE_STDIO_H}, @samp{stdio.h}, |
| and @samp{Define to 1 if you have <stdio.h>.} do not need quoting, but |
| if you unwisely defined a macro with a name like @samp{Define} or |
| @samp{stdio} then they would need quoting. Cautious Autoconf users |
| would keep the quotes, but many Autoconf users find such precautions |
| annoying, and would rewrite the example as follows: |
| |
| @example |
| AC_CHECK_HEADER(stdio.h, |
| [AC_DEFINE(HAVE_STDIO_H, 1, |
| [Define to 1 if you have <stdio.h>.])], |
| [AC_MSG_ERROR([sorry, can't do anything for you])]) |
| @end example |
| |
| @noindent |
| This is safe, so long as you adopt good naming conventions and do not |
| define macros with names like @samp{HAVE_STDIO_H}, @samp{stdio}, or |
| @samp{h}. Though it is also safe here to omit the quotes around |
| @samp{Define to 1 if you have <stdio.h>.} this is not recommended, as |
| message strings are more likely to inadvertently contain commas. |
| |
| The following example is wrong and dangerous, as it is underquoted: |
| |
| @example |
| AC_CHECK_HEADER(stdio.h, |
| AC_DEFINE(HAVE_STDIO_H, 1, |
| Define to 1 if you have <stdio.h>.), |
| AC_MSG_ERROR([sorry, can't do anything for you])) |
| @end example |
| |
| In other cases, you may want to use text that also resembles a macro |
| call. You must quote that text (whether just the potential problem, or |
| the entire line) even when it is not passed as a macro argument; and you |
| may also have to use @code{m4_pattern_allow} (@pxref{Forbidden |
| Patterns}), to declare your intention that the resulting configure file |
| will have a literal that resembles what would otherwise be reserved for |
| a macro name. For example: |
| |
| @example |
| dnl Simulate a possible future autoconf macro |
| m4_define([AC_DC], [oops]) |
| dnl Underquoted: |
| echo "Hard rock was here! --AC_DC" |
| dnl Correctly quoted: |
| m4_pattern_allow([AC_DC]) |
| echo "Hard rock was here! --[AC_DC]" |
| [echo "Hard rock was here! --AC_DC"] |
| @end example |
| |
| @noindent |
| which results in this text in @file{configure}: |
| |
| @example |
| echo "Hard rock was here! --oops" |
| echo "Hard rock was here! --AC_DC" |
| echo "Hard rock was here! --AC_DC" |
| @end example |
| |
| @noindent |
| When you use the same text in a macro argument, you must therefore have |
| an extra quotation level (since one is stripped away by the macro |
| substitution). In general, then, it is a good idea to @emph{use double |
| quoting for all literal string arguments}, either around just the |
| problematic portions, or over the entire argument: |
| |
| @example |
| m4_pattern_allow([AC_DC]) |
| AC_MSG_WARN([[AC_DC] stinks --Iron Maiden]) |
| AC_MSG_WARN([[AC_DC stinks --Iron Maiden]]) |
| @end example |
| |
| It is also possible to avoid the problematic patterns in the first |
| place, by the use of additional escaping (either a quadrigraph, or |
| creative shell constructs), in which case it is no longer necessary to |
| use @code{m4_pattern_allow}: |
| |
| @example |
| echo "Hard rock was here! --AC""_DC" |
| AC_MSG_WARN([[AC@@&t@@_DC stinks --Iron Maiden]]) |
| @end example |
| |
| You are now able to understand one of the constructs of Autoconf that |
| has been continually misunderstood@enddots{} The rule of thumb is that |
| @emph{whenever you expect macro expansion, expect quote expansion}; |
| i.e., expect one level of quotes to be lost. For instance: |
| |
| @example |
| AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [], |
| [AC_MSG_ERROR([you lose])]) |
| @end example |
| |
| @noindent |
| is incorrect: here, the first argument of @code{AC_LANG_SOURCE} is |
| @samp{char b[10];} and is expanded once, which results in |
| @samp{char b10;}; and the @code{AC_LANG_SOURCE} is also expanded prior |
| to being passed to @code{AC_COMPILE_IFELSE}. (There was an idiom common |
| in Autoconf's past to |
| address this issue via the M4 @code{changequote} primitive, but do not |
| use it!) Let's take a closer look: the author meant the first argument |
| to be understood as a literal, and therefore it must be quoted twice; |
| likewise, the intermediate @code{AC_LANG_SOURCE} macro should be quoted |
| once so that it is only expanded after the rest of the body of |
| @code{AC_COMPILE_IFELSE} is in place: |
| |
| @example |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [], |
| [AC_MSG_ERROR([you lose])]) |
| @end example |
| |
| @noindent |
| Voilà , you actually produce @samp{char b[10];} this time! |
| |
| On the other hand, descriptions (e.g., the last parameter of |
| @code{AC_DEFINE} or @code{AS_HELP_STRING}) are not literals---they |
| are subject to line breaking, for example---and should not be double quoted. |
| Even if these descriptions are short and are not actually broken, double |
| quoting them yields weird results. |
| |
| Some macros take optional arguments, which this documentation represents |
| as @ovar{arg} (not to be confused with the quote characters). You may |
| just leave them empty, or use @samp{[]} to make the emptiness of the |
| argument explicit, or you may simply omit the trailing commas. The |
| three lines below are equivalent: |
| |
| @example |
| AC_CHECK_HEADERS([stdio.h], [], [], []) |
| AC_CHECK_HEADERS([stdio.h],,,) |
| AC_CHECK_HEADERS([stdio.h]) |
| @end example |
| |
| It is best to put each macro call on its own line in |
| @file{configure.ac}. Most of the macros don't add extra newlines; they |
| rely on the newline after the macro call to terminate the commands. |
| This approach makes the generated @command{configure} script a little |
| easier to read by not inserting lots of blank lines. It is generally |
| safe to set shell variables on the same line as a macro call, because |
| the shell allows assignments without intervening newlines. |
| |
| You can include comments in @file{configure.ac} files by starting them |
| with the @samp{#}. For example, it is helpful to begin |
| @file{configure.ac} files with a line like this: |
| |
| @example |
| # Process this file with autoconf to produce a configure script. |
| @end example |
| |
| @node Autoconf Input Layout |
| @subsection Standard @file{configure.ac} Layout |
| |
| The order in which @file{configure.ac} calls the Autoconf macros is not |
| important, with a few exceptions. Every @file{configure.ac} must |
| contain a call to @code{AC_INIT} before the checks, and a call to |
| @code{AC_OUTPUT} at the end (@pxref{Output}). Additionally, some macros |
| rely on other macros having been called first, because they check |
| previously set values of some variables to decide what to do. These |
| macros are noted in the individual descriptions (@pxref{Existing |
| Tests}), and they also warn you when @command{configure} is created if they |
| are called out of order. |
| |
| To encourage consistency, here is a suggested order for calling the |
| Autoconf macros. Generally speaking, the things near the end of this |
| list are those that could depend on things earlier in it. For example, |
| library functions could be affected by types and libraries. |
| |
| @display |
| @group |
| Autoconf requirements |
| @code{AC_INIT(@var{package}, @var{version}, @var{bug-report-address})} |
| information on the package |
| checks for programs |
| checks for libraries |
| checks for header files |
| checks for types |
| checks for structures |
| checks for compiler characteristics |
| checks for library functions |
| checks for system services |
| @code{AC_CONFIG_FILES(@r{[}@var{file@dots{}}@r{]})} |
| @code{AC_OUTPUT} |
| @end group |
| @end display |
| |
| |
| @node autoscan Invocation |
| @section Using @command{autoscan} to Create @file{configure.ac} |
| @cindex @command{autoscan} |
| |
| The @command{autoscan} program can help you create and/or maintain a |
| @file{configure.ac} file for a software package. @command{autoscan} |
| examines source files in the directory tree rooted at a directory given |
| as a command line argument, or the current directory if none is given. |
| It searches the source files for common portability problems and creates |
| a file @file{configure.scan} which is a preliminary @file{configure.ac} |
| for that package, and checks a possibly existing @file{configure.ac} for |
| completeness. |
| |
| When using @command{autoscan} to create a @file{configure.ac}, you |
| should manually examine @file{configure.scan} before renaming it to |
| @file{configure.ac}; it probably needs some adjustments. |
| Occasionally, @command{autoscan} outputs a macro in the wrong order |
| relative to another macro, so that @command{autoconf} produces a warning; |
| you need to move such macros manually. Also, if you want the package to |
| use a configuration header file, you must add a call to |
| @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}). You might |
| also have to change or add some @code{#if} directives to your program in |
| order to make it work with Autoconf (@pxref{ifnames Invocation}, for |
| information about a program that can help with that job). |
| |
| When using @command{autoscan} to maintain a @file{configure.ac}, simply |
| consider adding its suggestions. The file @file{autoscan.log} |
| contains detailed information on why a macro is requested. |
| |
| @command{autoscan} uses several data files (installed along with Autoconf) |
| to determine which macros to output when it finds particular symbols in |
| a package's source files. These data files all have the same format: |
| each line consists of a symbol, one or more blanks, and the Autoconf macro to |
| output if that symbol is encountered. Lines starting with @samp{#} are |
| comments. |
| |
| @command{autoscan} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Print the names of the files it examines and the potentially interesting |
| symbols it finds in them. This output can be voluminous. |
| |
| @item --debug |
| @itemx -d |
| Don't remove temporary files. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Append @var{dir} to the include path. Multiple invocations accumulate. |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. |
| @end table |
| |
| @node ifnames Invocation |
| @section Using @command{ifnames} to List Conditionals |
| @cindex @command{ifnames} |
| |
| @command{ifnames} can help you write @file{configure.ac} for a software |
| package. It prints the identifiers that the package already uses in C |
| preprocessor conditionals. If a package has already been set up to have |
| some portability, @command{ifnames} can thus help you figure out what its |
| @command{configure} needs to check for. It may help fill in some gaps in a |
| @file{configure.ac} generated by @command{autoscan} (@pxref{autoscan |
| Invocation}). |
| |
| @command{ifnames} scans all of the C source files named on the command line |
| (or the standard input, if none are given) and writes to the standard |
| output a sorted list of all the identifiers that appear in those files |
| in @code{#if}, @code{#ifdef}, @code{#ifndef}, @code{#elif}, |
| @code{#elifdef}, or @code{#elifndef} directives. |
| It prints each identifier on a line, followed by a |
| space-separated list of the files in which that identifier occurs. |
| |
| @noindent |
| @command{ifnames} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| @end table |
| |
| @node autoconf Invocation |
| @section Using @command{autoconf} to Create @command{configure} |
| @cindex @command{autoconf} |
| |
| To create @command{configure} from @file{configure.ac}, run the |
| @command{autoconf} program with no arguments. @command{autoconf} processes |
| @file{configure.ac} with the M4 macro processor, using the |
| Autoconf macros. If you give @command{autoconf} an argument, it reads that |
| file instead of @file{configure.ac} and writes the configuration script |
| to the standard output instead of to @command{configure}. If you give |
| @command{autoconf} the argument @option{-}, it reads from the standard |
| input instead of @file{configure.ac} and writes the configuration script |
| to the standard output. |
| |
| The Autoconf macros are defined in several files. Some of the files are |
| distributed with Autoconf; @command{autoconf} reads them first. Then it |
| looks for the optional file @file{acsite.m4} in the directory that |
| contains the distributed Autoconf macro files, and for the optional file |
| @file{aclocal.m4} in the current directory. Those files can contain |
| your site's or the package's own Autoconf macro definitions |
| (@pxref{Writing Autoconf Macros}, for more information). If a macro is |
| defined in more than one of the files that @command{autoconf} reads, the |
| last definition it reads overrides the earlier ones. |
| |
| @command{autoconf} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Report processing steps. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files. |
| |
| @item --force |
| @itemx -f |
| Remake @file{configure} even if newer than its input files. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Append @var{dir} to the include path. Multiple invocations accumulate. |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. |
| |
| @item --output=@var{file} |
| @itemx -o @var{file} |
| Save output (script or trace) to @var{file}. The file @option{-} stands |
| for the standard output. |
| |
| @item --warnings=@var{category}[,@var{category}...] |
| @itemx -W@var{category}[,@var{category}...] |
| @evindex WARNINGS |
| Enable or disable warnings related to each @var{category}. |
| @xref{m4_warn}, for a comprehensive list of categories. |
| Special values include: |
| |
| @table @samp |
| @item all |
| Enable all categories of warnings. |
| |
| @item none |
| Disable all categories of warnings. |
| |
| @item error |
| Treat all warnings as errors. |
| |
| @item no-@var{category} |
| Disable warnings falling into @var{category}. |
| @end table |
| |
| The environment variable @env{WARNINGS} may also be set to a |
| comma-separated list of warning categories to enable or disable. |
| It is interpreted exactly the same way as the argument of |
| @option{--warnings}, but unknown categories are silently ignored. |
| The command line takes precedence; for instance, if @env{WARNINGS} |
| is set to @code{obsolete}, but @option{-Wnone} is given on the |
| command line, no warnings will be issued. |
| |
| Some categories of warnings are on by default. |
| Again, for details see @ref{m4_warn}. |
| |
| @item --trace=@var{macro}[:@var{format}] |
| @itemx -t @var{macro}[:@var{format}] |
| Do not create the @command{configure} script, but list the calls to |
| @var{macro} according to the @var{format}. Multiple @option{--trace} |
| arguments can be used to list several macros. Multiple @option{--trace} |
| arguments for a single macro are not cumulative; instead, you should |
| just make @var{format} as long as needed. |
| |
| The @var{format} is a regular string, with newlines if desired, and |
| several special escape codes. It defaults to @samp{$f:$l:$n:$%}; see |
| @ref{autom4te Invocation}, for details on the @var{format}. |
| |
| @item --initialization |
| @itemx -i |
| By default, @option{--trace} does not trace the initialization of the |
| Autoconf macros (typically the @code{AC_DEFUN} definitions). This |
| results in a noticeable speedup, but can be disabled by this option. |
| @end table |
| |
| |
| It is often necessary to check the content of a @file{configure.ac} |
| file, but parsing it yourself is extremely fragile and error-prone. It |
| is suggested that you rely upon @option{--trace} to scan |
| @file{configure.ac}. For instance, to find the list of variables that |
| are substituted, use: |
| |
| @example |
| @group |
| $ @kbd{autoconf -t AC_SUBST} |
| configure.ac:28:AC_SUBST:SHELL |
| configure.ac:28:AC_SUBST:PATH_SEPARATOR |
| @i{More traces deleted} |
| @end group |
| @end example |
| |
| @noindent |
| The example below highlights the difference between @samp{$@@}, |
| @samp{$*}, and @samp{$%}. |
| |
| @example |
| @group |
| $ @kbd{cat configure.ac} |
| AC_DEFINE(This, is, [an |
| [example]]) |
| $ @kbd{autoconf -t 'AC_DEFINE:@@: $@@} |
| *: $* |
| %: $%' |
| @@: [This],[is],[an |
| [example]] |
| *: This,is,an |
| [example] |
| %: This:is:an [example] |
| @end group |
| @end example |
| |
| @noindent |
| The @var{format} gives you a lot of freedom: |
| |
| @example |
| @group |
| $ @kbd{autoconf -t 'AC_SUBST:$$ac_subst@{"$1"@} = "$f:$l";'} |
| $ac_subst@{"SHELL"@} = "configure.ac:28"; |
| $ac_subst@{"PATH_SEPARATOR"@} = "configure.ac:28"; |
| @i{More traces deleted} |
| @end group |
| @end example |
| |
| @noindent |
| A long @var{separator} can be used to improve the readability of complex |
| structures, and to ease their parsing (for instance when no single |
| character is suitable as a separator): |
| |
| @example |
| @group |
| $ @kbd{autoconf -t 'AM_MISSING_PROG:$@{|:::::|@}*'} |
| ACLOCAL|:::::|aclocal|:::::|$missing_dir |
| AUTOCONF|:::::|autoconf|:::::|$missing_dir |
| AUTOMAKE|:::::|automake|:::::|$missing_dir |
| @i{More traces deleted} |
| @end group |
| @end example |
| |
| @node autoreconf Invocation |
| @section Using @command{autoreconf} to Update @command{configure} Scripts |
| @cindex @command{autoreconf} |
| |
| Installing the various components of the GNU Build System can be |
| tedious: running @command{autopoint} for Gettext, @command{automake} for |
| @file{Makefile.in} etc.@: in each directory. It may be needed either |
| because some tools such as @command{automake} have been updated on your |
| system, or because some of the sources such as @file{configure.ac} have |
| been updated, or finally, simply in order to install the GNU Build |
| System in a fresh tree. |
| |
| @command{autoreconf} runs @command{autoconf}, @command{autoheader}, |
| @command{aclocal}, @command{automake}, @command{libtoolize}, @command{intltoolize}, |
| @command{gtkdocize}, and @command{autopoint} (when appropriate) repeatedly |
| to update the GNU Build System in the specified directories and their |
| subdirectories (@pxref{Subdirectories}). By default, it only remakes |
| those files that are older than their sources. The environment variables |
| @env{AUTOM4TE}, @env{AUTOCONF}, @env{AUTOHEADER}, @env{AUTOMAKE}, @env{ACLOCAL}, |
| @env{AUTOPOINT}, @env{LIBTOOLIZE}, @env{INTLTOOLIZE}, @env{GTKDOCIZE}, @env{M4}, |
| and @env{MAKE} may be used to override the invocation of the respective tools. |
| |
| If you install a new version of some tool, you can make |
| @command{autoreconf} remake @emph{all} of the files by giving it the |
| @option{--force} option. |
| |
| @xref{Automatic Remaking}, for Make rules to automatically |
| rebuild @command{configure} scripts when their source files change. That |
| method handles the timestamps of configuration header templates |
| properly, but does not pass @option{--autoconf-dir=@var{dir}} or |
| @option{--localdir=@var{dir}}. |
| |
| @cindex Gettext |
| @cindex @command{autopoint} |
| Gettext supplies the @command{autopoint} command to add translation |
| infrastructure to a source package. If you use @command{autopoint}, |
| your @file{configure.ac} should invoke @code{AM_GNU_GETTEXT} and |
| one of @code{AM_GNU_GETTEXT_VERSION(@var{gettext-version})} or |
| @code{AM_GNU_GETTEXT_REQUIRE_VERSION(@var{min-gettext-version})}. |
| @xref{autopoint Invocation, , Invoking the @code{autopoint} Program, |
| gettext, GNU @code{gettext} utilities}, for further details. |
| |
| @noindent |
| @command{autoreconf} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Print the name of each directory @command{autoreconf} examines and the |
| commands it runs. If given two or more times, pass @option{--verbose} |
| to subordinate tools that support it. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files. |
| |
| @item --force |
| @itemx -f |
| Consider all generated and standard auxiliary files to be obsolete. |
| This remakes even @file{configure} scripts and configuration headers |
| that are newer than their input files (@file{configure.ac} and, if |
| present, @file{aclocal.m4}). |
| |
| If deemed appropriate, this option triggers calls to @samp{automake |
| --force-missing}. Passing both @option{--force} and @option{--install} |
| to @command{autoreconf} will in turn undo any customizations to standard |
| files. Note that the macro @code{AM_INIT_AUTOMAKE} has some options |
| which change the set of files considered to be standard. |
| |
| @item --install |
| @itemx -i |
| Install any missing standard auxiliary files in the package. By |
| default, files are copied; this can be changed with @option{--symlink}. |
| |
| If deemed appropriate, this option triggers calls to |
| @samp{automake --add-missing}, |
| @samp{libtoolize}, @samp{autopoint}, etc. |
| |
| @item --no-recursive |
| Do not rebuild files in subdirectories to configure (see @ref{Subdirectories}, |
| macro @code{AC_CONFIG_SUBDIRS}). |
| |
| @item --symlink |
| @itemx -s |
| When used with @option{--install}, install symbolic links to the missing |
| auxiliary files instead of copying them. |
| |
| @item --make |
| @itemx -m |
| When the directories were configured, update the configuration by |
| running @samp{./config.status --recheck && ./config.status}, and then |
| run @samp{make}. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Append @var{dir} to the include path. Multiple invocations accumulate. |
| Passed on to @command{aclocal}, @command{autoconf} and |
| @command{autoheader} internally. |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. |
| Passed on to @command{autoconf} and @command{autoheader} internally. |
| |
| @item --warnings=@var{category}[,@var{category}...] |
| @itemx -W@var{category}[,@var{category}...] |
| @evindex WARNINGS |
| Enable or disable warnings related to each @var{category}. |
| @xref{m4_warn}, for a comprehensive list of categories. |
| Special values include: |
| |
| @table @samp |
| @item all |
| Enable all categories of warnings. |
| |
| @item none |
| Disable all categories of warnings. |
| |
| @item error |
| Treat all warnings as errors. |
| |
| @item no-@var{category} |
| Disable warnings falling into @var{category}. |
| @end table |
| |
| The environment variable @env{WARNINGS} may also be set to a |
| comma-separated list of warning categories to enable or disable. |
| It is interpreted exactly the same way as the argument of |
| @option{--warnings}, but unknown categories are silently ignored. |
| The command line takes precedence; for instance, if @env{WARNINGS} |
| is set to @code{obsolete}, but @option{-Wnone} is given on the |
| command line, no warnings will be issued. |
| |
| Some categories of warnings are on by default. |
| Again, for details see @ref{m4_warn}. |
| @end table |
| |
| If you want @command{autoreconf} to pass flags that are not listed here |
| on to @command{aclocal}, set @code{ACLOCAL_AMFLAGS} in your @file{Makefile.am}. |
| Due to a limitation in the Autoconf implementation these flags currently |
| must be set on a single line in @file{Makefile.am}, without any |
| backslash-newlines or makefile comments. |
| Also, be aware that future Automake releases might |
| start flagging @code{ACLOCAL_AMFLAGS} as obsolescent, or even remove |
| support for it. |
| |
| @c ========================================= Initialization and Output Files. |
| |
| @node Setup |
| @chapter Initialization and Output Files |
| |
| Autoconf-generated @command{configure} scripts need some information about |
| how to initialize, such as how to find the package's source files and |
| about the output files to produce. The following sections describe the |
| initialization and the creation of output files. |
| |
| @menu |
| * Initializing configure:: Option processing etc. |
| * Versioning:: Dealing with Autoconf versions |
| * Notices:: Copyright, version numbers in @command{configure} |
| * Input:: Where Autoconf should find files |
| * Output:: Outputting results from the configuration |
| * Configuration Actions:: Preparing the output based on results |
| * Configuration Files:: Creating output files |
| * Makefile Substitutions:: Using output variables in makefiles |
| * Configuration Headers:: Creating a configuration header file |
| * Configuration Commands:: Running arbitrary instantiation commands |
| * Configuration Links:: Links depending on the configuration |
| * Subdirectories:: Configuring independent packages together |
| * Default Prefix:: Changing the default installation prefix |
| @end menu |
| |
| @node Initializing configure |
| @section Initializing @command{configure} |
| |
| Every @command{configure} script must call @code{AC_INIT} before doing |
| anything else that produces output. Calls to silent macros, such as |
| @code{AC_DEFUN}, may also occur prior to @code{AC_INIT}, although these |
| are generally used via @file{aclocal.m4}, since that is implicitly |
| included before the start of @file{configure.ac}. The only other |
| required macro is @code{AC_OUTPUT} (@pxref{Output}). |
| |
| @anchor{AC_INIT} |
| @defmac AC_INIT (@var{package}, @var{version}, @ovar{bug-report}, @ |
| @ovar{tarname}, @ovar{url}) |
| @acindex{INIT} |
| Process any command-line arguments and perform initialization |
| and verification. |
| |
| Set the name of the @var{package} and its @var{version}. These are |
| typically used in @option{--version} support, including that of |
| @command{configure}. The optional argument @var{bug-report} should be |
| the email to which users should send bug reports. The package |
| @var{tarname} differs from @var{package}: the latter designates the full |
| package name (e.g., @samp{GNU Autoconf}), while the former is meant for |
| distribution tar ball names (e.g., @samp{autoconf}). It defaults to |
| @var{package} with @samp{GNU } stripped, lower-cased, and all characters |
| other than alphanumerics and underscores are changed to @samp{-}. If |
| provided, @var{url} should be the home page for the package. |
| |
| Leading and trailing whitespace is stripped from all the arguments to |
| @code{AC_INIT}, and interior whitespace is collapsed to a single space. |
| This means that, for instance, if you want to put several email |
| addresses in @var{bug-report}, you can put each one on its own line: |
| |
| @smallexample |
| @group |
| # We keep having problems with the mail hosting for |
| # gnomovision.example, so give people an alternative. |
| AC_INIT([Gnomovision], [17.0.1], [ |
| bugs@@gnomovision.example |
| or gnomo-bugs@@reliable-email.example |
| ]) |
| @end group |
| @end smallexample |
| |
| The arguments to @code{AC_INIT} may be computed by M4, when |
| @command{autoconf} is run. For instance, if you want to include the |
| package's version number in the @var{tarname}, but you don't want to |
| repeat it, you can use a helper macro: |
| |
| @smallexample |
| @group |
| m4_define([gnomo_VERSION], [17.0.1]) |
| AC_INIT([Gnomovision], |
| m4_defn([gnomo_VERSION]), |
| [bugs@@gnomovision.example], |
| [gnomo-]m4_defn([gnomo_VERSION])) |
| @end group |
| @end smallexample |
| |
| This uses @code{m4_defn} to produce the expansion of |
| @code{gnomo_VERSION} @emph{as a quoted string}, so that if there happen |
| to be any more M4 macro names in @code{gnomo_VERSION}, they will not be |
| expanded. @xref{Defn,,Renaming Macros,m4,GNU m4 macro processor}. |
| |
| Continuing this example, if you don't want to embed the version number |
| in @file{configure.ac} at all, you can use @code{m4_esyscmd} to look it |
| up somewhere else when @command{autoconf} is run: |
| |
| @smallexample |
| @group |
| m4_define([gnomo_VERSION], |
| m4_esyscmd([build-aux/git-version-gen .tarball-version])) |
| AC_INIT([Gnomovision], |
| m4_defn([gnomo_VERSION]), |
| [bugs@@gnomovision.example], |
| [gnomo-]m4_defn([gnomo_VERSION])) |
| @end group |
| @end smallexample |
| |
| This uses the utility script @command{git-version-gen} to look up |
| the package's version in its version control metadata. This script |
| is part of Gnulib (@pxref{Gnulib}). |
| |
| The arguments to @code{AC_INIT} are written into @file{configure} in |
| several different places. Therefore, we strongly recommend that you |
| write any M4 logic in @code{AC_INIT} arguments to be evaluated |
| @emph{before} @code{AC_INIT} itself is evaluated. For instance, in the |
| above example, the second argument to @code{m4_define} is @emph{not} |
| quoted, so the @code{m4_esyscmd} is evaluated only once, and |
| @code{gnomo_VERSION} is defined to the output of the command. If the |
| second argument to @code{m4_define} were quoted, @code{m4_esyscmd} would |
| be evaluated each time the @var{version} or @var{tarname} arguments were |
| written to @file{configure}, and the command would be run repeatedly. |
| |
| In some of the places where the arguments to @code{AC_INIT} are used, |
| within @file{configure}, shell evaluation cannot happen. Therefore, the |
| arguments to @code{AC_INIT} may @emph{not} be computed when |
| @command{configure} is run. If they contain any construct that isn't |
| always treated as literal by the shell (e.g.@: variable expansions), |
| @command{autoconf} will issue an error. |
| |
| The @var{tarname} argument is used to construct filenames. It should |
| not contain wildcard characters, white space, or anything else that |
| could be troublesome as part of a file or directory name. |
| |
| Some of M4's active characters (notably parentheses, square brackets, |
| @samp{,} and @samp{#}) commonly appear in URLs and lists of email |
| addresses. If any of these characters appear in an argument to AC_INIT, |
| that argument will probably need to be double-quoted to avoid errors |
| and mistranscriptions. @xref{M4 Quotation}. |
| |
| The following M4 macros (e.g., @code{AC_PACKAGE_NAME}), output variables |
| (e.g., @code{PACKAGE_NAME}), and preprocessor symbols (e.g., |
| @code{PACKAGE_NAME}), are defined by @code{AC_INIT}: |
| |
| @table @asis |
| @item @code{AC_PACKAGE_NAME}, @code{PACKAGE_NAME} |
| @acindex{PACKAGE_NAME} |
| @ovindex PACKAGE_NAME |
| @cvindex PACKAGE_NAME |
| Exactly @var{package}. |
| |
| @item @code{AC_PACKAGE_TARNAME}, @code{PACKAGE_TARNAME} |
| @acindex{PACKAGE_TARNAME} |
| @ovindex PACKAGE_TARNAME |
| @cvindex PACKAGE_TARNAME |
| Exactly @var{tarname}, possibly generated from @var{package}. |
| |
| @item @code{AC_PACKAGE_VERSION}, @code{PACKAGE_VERSION} |
| @acindex{PACKAGE_VERSION} |
| @ovindex PACKAGE_VERSION |
| @cvindex PACKAGE_VERSION |
| Exactly @var{version}. |
| |
| @item @code{AC_PACKAGE_STRING}, @code{PACKAGE_STRING} |
| @acindex{PACKAGE_STRING} |
| @ovindex PACKAGE_STRING |
| @cvindex PACKAGE_STRING |
| Exactly @samp{@var{package} @var{version}}. |
| |
| @item @code{AC_PACKAGE_BUGREPORT}, @code{PACKAGE_BUGREPORT} |
| @acindex{PACKAGE_BUGREPORT} |
| @ovindex PACKAGE_BUGREPORT |
| @cvindex PACKAGE_BUGREPORT |
| Exactly @var{bug-report}, if one was provided. Typically an email |
| address, or URL to a bug management web page. |
| |
| @item @code{AC_PACKAGE_URL}, @code{PACKAGE_URL} |
| @acindex{PACKAGE_URL} |
| @ovindex PACKAGE_URL |
| @cvindex PACKAGE_URL |
| Exactly @var{url}, if one was provided. If @var{url} was empty, but |
| @var{package} begins with @samp{GNU }, then this defaults to |
| @samp{https://@/www.gnu.org/@/software/@/@var{tarname}/}, otherwise, no URL is |
| assumed. |
| @end table |
| @end defmac |
| |
| If your @command{configure} script does its own option processing, it |
| should inspect @samp{$@@} or @samp{$*} immediately after calling |
| @code{AC_INIT}, because other Autoconf macros liberally use the |
| @command{set} command to process strings, and this has the side effect |
| of updating @samp{$@@} and @samp{$*}. However, we suggest that you use |
| standard macros like @code{AC_ARG_ENABLE} instead of attempting to |
| implement your own option processing. @xref{Site Configuration}. |
| |
| @node Versioning |
| @section Dealing with Autoconf versions |
| @cindex Autoconf version |
| @cindex version, Autoconf |
| |
| The following optional macros can be used to help choose the minimum |
| version of Autoconf that can successfully compile a given |
| @file{configure.ac}. |
| |
| @defmac AC_PREREQ (@var{version}) |
| @acindex{PREREQ} |
| @cindex Version |
| Ensure that a recent enough version of Autoconf is being used. If the |
| version of Autoconf being used to create @command{configure} is |
| earlier than @var{version}, print an error message to the standard |
| error output and exit with failure (exit status is 63). For example: |
| |
| @example |
| AC_PREREQ([@value{VERSION}]) |
| @end example |
| |
| This macro may be used before @code{AC_INIT}. |
| @end defmac |
| |
| @defmac AC_AUTOCONF_VERSION |
| @acindex{AUTOCONF_VERSION} |
| This macro was introduced in Autoconf 2.62. It identifies the version |
| of Autoconf that is currently parsing the input file, in a format |
| suitable for @code{m4_version_compare} (@pxref{m4_version_compare}); in |
| other words, for this release of Autoconf, its value is |
| @samp{@value{VERSION}}. One potential use of this macro is for writing |
| conditional fallbacks based on when a feature was added to Autoconf, |
| rather than using @code{AC_PREREQ} to require the newer version of |
| Autoconf. However, remember that the Autoconf philosophy favors feature |
| checks over version checks. |
| |
| You should not expand this macro directly; use |
| @samp{m4_defn([AC_AUTOCONF_VERSION])} instead. This is because some |
| users might |
| have a beta version of Autoconf installed, with arbitrary letters |
| included in its version string. This means it is possible for the |
| version string to contain the name of a defined macro, such that |
| expanding @code{AC_AUTOCONF_VERSION} would trigger the expansion of that |
| macro during rescanning, and change the version string to be different |
| than what you intended to check. |
| @end defmac |
| |
| @node Notices |
| @section Notices in @command{configure} |
| @cindex Notices in @command{configure} |
| |
| The following macros manage version numbers for @command{configure} |
| scripts. Using them is optional. |
| |
| @defmac AC_COPYRIGHT (@var{copyright-notice}) |
| @acindex{COPYRIGHT} |
| @cindex Copyright Notice |
| State that, in addition to the Free Software Foundation's copyright on |
| the Autoconf macros, parts of your @command{configure} are covered by the |
| @var{copyright-notice}. |
| |
| The @var{copyright-notice} shows up in both the head of |
| @command{configure} and in @samp{configure --version}. |
| @end defmac |
| |
| |
| @defmac AC_REVISION (@var{revision-info}) |
| @acindex{REVISION} |
| @cindex Revision |
| Copy revision stamp @var{revision-info} into the @command{configure} |
| script, with any dollar signs or double-quotes removed. This macro lets |
| you put a revision stamp from @file{configure.ac} into @command{configure} |
| that the traditional version control systems RCS and CVS can update, |
| without these systems changing it again when you check in the resulting |
| @command{configure}. That way, you can determine easily which revision of |
| @file{configure.ac} a particular @command{configure} corresponds to. |
| |
| For example, this line in @file{configure.ac}: |
| |
| @example |
| AC_REVISION([$Revision: 1.30 $]) |
| @end example |
| |
| @noindent |
| produces this in @command{configure}: |
| |
| @example |
| #!/bin/sh |
| # From configure.ac Revision: 1.30 |
| @end example |
| @end defmac |
| |
| |
| @node Input |
| @section Configure Input: Source Code, Macros, and Auxiliary Files |
| |
| The following macros help you manage the contents of your source tree. |
| |
| @anchor{AC_CONFIG_SRCDIR} |
| @defmac AC_CONFIG_SRCDIR (@var{unique-file-in-source-dir}) |
| @acindex{CONFIG_SRCDIR} |
| Distinguish this package's source directory from other source |
| directories that might happen to exist in the file system. |
| @var{unique-file-in-source-dir} should name a file that is unique to |
| this package. @command{configure} will verify that this file exists in |
| @file{@var{srcdir}}, before it runs any other checks. |
| |
| Use of this macro is strongly recommended. It protects against people |
| accidentally specifying the wrong directory with @option{--srcdir}. |
| @xref{configure Invocation}, for more information. |
| @end defmac |
| |
| Packages that use @command{aclocal} to generate @file{aclocal.m4} |
| should declare where local macros can be found using |
| @code{AC_CONFIG_MACRO_DIRS}. |
| |
| @defmac AC_CONFIG_MACRO_DIRS (@var{dir1} [@var{dir2} ... @var{dirN}]) |
| @defmacx AC_CONFIG_MACRO_DIR (@var{dir}) |
| @acindex{CONFIG_MACRO_DIRS} |
| @acindex{CONFIG_MACRO_DIR} |
| @acindex{CONFIG_MACRO_DIR_TRACE} |
| Specify the given directories as the location of additional local Autoconf |
| macros. These macros are intended for use by commands like |
| @command{autoreconf} or @command{aclocal} that trace macro calls; they should |
| be called directly from @file{configure.ac} so that tools that install |
| macros for @command{aclocal} can find the macros' declarations. Tools |
| that want to learn which directories have been selected should trace |
| @code{AC_CONFIG_MACRO_DIR_TRACE}, which will be called once per directory. |
| |
| AC_CONFIG_MACRO_DIRS is the preferred form, and can be called multiple |
| times and with multiple arguments; in such cases, directories in earlier |
| calls are expected to be searched before directories in later calls, and |
| directories appearing in the same call are expected to be searched in |
| the order in which they appear in the call. For historical reasons, the |
| macro AC_CONFIG_MACRO_DIR can also be used once, if it appears first, |
| for tools such as older @command{libtool} that weren't prepared to |
| handle multiple directories. For example, a usage like |
| |
| @smallexample |
| AC_CONFIG_MACRO_DIR([dir1]) |
| AC_CONFIG_MACRO_DIRS([dir2]) |
| AC_CONFIG_MACRO_DIRS([dir3 dir4]) |
| @end smallexample |
| |
| will cause the trace of AC_CONFIG_MACRO_DIR_TRACE to appear four times, |
| and should cause the directories to be searched in this order: |
| @samp{dir1 dir2 dir3 dir4}. |
| |
| Note that if you use @command{aclocal} from an Automake release prior to |
| 1.13 to generate @file{aclocal.m4}, you must also set |
| @code{ACLOCAL_AMFLAGS = -I @var{dir1} [-I @var{dir2} ... -I @var{dirN}]} |
| in your top-level @file{Makefile.am}. Due to a limitation in |
| the Autoconf implementation of @command{autoreconf}, these include |
| directives currently must be set on a single line in @file{Makefile.am}, |
| without any backslash-newlines or makefile comments. |
| @end defmac |
| |
| @prindex @command{config.guess} |
| @prindex @command{config.sub} |
| @prindex @command{install-sh} |
| |
| Some Autoconf macros require auxiliary scripts. @code{AC_PROG_INSTALL} |
| (@pxref{Particular Programs}) requires a |
| fallback implementation of @command{install} called @file{install-sh}, |
| and the @code{AC_CANONICAL} macros (@pxref{Manual Configuration}) |
| require the system-identification scripts @file{config.sub} and |
| @file{config.guess}. Third-party tools, such as Automake and Libtool, |
| may require additional auxiliary scripts. |
| |
| By default, @command{configure} looks for these scripts next to itself, |
| in @file{@var{srcdir}}. For convenience when working with subdirectories |
| with their own configure scripts (@pxref{Subdirectories}), if the |
| scripts are not in @file{@var{srcdir}} it will also look in |
| @file{@var{srcdir}/..} and @file{@var{srcdir}/../..}. All of the |
| scripts must be found in the same directory. |
| |
| If these default locations are not adequate, or simply to reduce clutter |
| at the top level of the source tree, packages can use |
| @code{AC_CONFIG_AUX_DIR} to declare where to look for auxiliary scripts. |
| |
| @defmac AC_CONFIG_AUX_DIR (@var{dir}) |
| @acindex{CONFIG_AUX_DIR} |
| Look for auxiliary scripts in @var{dir}. Normally, @var{dir} should be a |
| relative path, which is taken as relative to @file{@var{srcdir}}. |
| If @var{dir} is an absolute path or contains shell variables, however, |
| it is used as-is. |
| |
| When the goal of using @code{AC_CONFIG_AUX_DIR} is to reduce clutter at |
| the top level of the source tree, the conventional name for @var{dir} is |
| @file{build-aux}. If you need portability to DOS variants, do not name |
| the auxiliary directory @file{aux}. @xref{File System Conventions}. |
| @end defmac |
| |
| @defmac AC_REQUIRE_AUX_FILE (@var{file}) |
| @acindex{REQUIRE_AUX_FILE} |
| @vrindex ac_aux_dir |
| Declare that @var{file} is an auxiliary script needed by this configure |
| script, and set the shell variable @code{ac_aux_dir} to the directory |
| where it can be found. The value of @code{ac_aux_dir} is guaranteed to |
| end with a @samp{/}. |
| |
| Macros that need auxiliary scripts must use this macro to register each |
| script they need. |
| @end defmac |
| |
| @command{configure} checks for all the auxiliary scripts it needs on |
| startup, and exits with an error if any are missing. |
| |
| @command{autoreconf} also detects missing auxiliary scripts. When used |
| with the @option{--install} option, @command{autoreconf} will try to add |
| missing scripts to the directory specified by @code{AC_CONFIG_AUX_DIR}, |
| or to the top level of the source tree if @code{AC_CONFIG_AUX_DIR} was |
| not used. It can always do this for the scripts needed by Autoconf core |
| macros: @file{install-sh}, @file{config.sub}, and @file{config.guess}. |
| Many other commonly-needed scripts are installed by the third-party |
| tools that @command{autoreconf} knows how to run, such as @file{missing} |
| for Automake and @file{ltmain.sh} for Libtool. |
| |
| If you are using Automake, auxiliary scripts will automatically be |
| included in the tarball created by @command{make dist}. If you are |
| not using Automake you will need to arrange for auxiliary scripts to |
| be included in tarballs yourself. Auxiliary scripts should normally |
| @emph{not} be checked into a version control system, for the same |
| reasons that @command{configure} shouldn't be. |
| |
| The scripts needed by Autoconf core macros can be found in |
| @file{$(datadir)/autoconf/build-aux} of the Autoconf installation |
| (@pxref{Installation Directory Variables}). |
| @file{install-sh} can be downloaded from |
| @url{https://git.savannah.gnu.org/cgit/automake.git/plain/lib/install-sh}. |
| @file{config.sub} and @file{config.guess} can be downloaded from |
| @url{https://git.savannah.gnu.org/cgit/config.git/tree/}. |
| |
| @node Output |
| @section Outputting Files |
| @cindex Outputting files |
| |
| Every Autoconf script, e.g., @file{configure.ac}, should finish by |
| calling @code{AC_OUTPUT}. That is the macro that generates and runs |
| @file{config.status}, which in turn creates the makefiles and any |
| other files resulting from configuration. This is the only required |
| macro besides @code{AC_INIT} (@pxref{Input}). |
| |
| @anchor{AC_OUTPUT} |
| @defmac AC_OUTPUT |
| @acindex{OUTPUT} |
| @cindex Instantiation |
| Generate @file{config.status} and launch it. Call this macro once, at |
| the end of @file{configure.ac}. |
| |
| @file{config.status} performs all the configuration actions: all the |
| output files (see @ref{Configuration Files}, macro |
| @code{AC_CONFIG_FILES}), header files (see @ref{Configuration Headers}, |
| macro @code{AC_CONFIG_HEADERS}), commands (see @ref{Configuration |
| Commands}, macro @code{AC_CONFIG_COMMANDS}), links (see |
| @ref{Configuration Links}, macro @code{AC_CONFIG_LINKS}), subdirectories |
| to configure (see @ref{Subdirectories}, macro @code{AC_CONFIG_SUBDIRS}) |
| are honored. |
| |
| The location of your @code{AC_OUTPUT} invocation is the exact point |
| where configuration actions are taken: any code afterwards is |
| executed by @command{configure} once @command{config.status} was run. If |
| you want to bind actions to @command{config.status} itself |
| (independently of whether @command{configure} is being run), see |
| @ref{Configuration Commands, , Running Arbitrary Configuration |
| Commands}. |
| @end defmac |
| |
| Historically, the usage of @code{AC_OUTPUT} was somewhat different. |
| @xref{Obsolete Macros}, for a description of the arguments that |
| @code{AC_OUTPUT} used to support. |
| |
| |
| If you run @command{make} in subdirectories, you should run it using the |
| @command{make} variable @code{MAKE}. Most versions of @command{make} set |
| @code{MAKE} to the name of the @command{make} program plus any options it |
| was given. (But many do not include in it the values of any variables |
| set on the command line, so those are not passed on automatically.) |
| Some old versions of @command{make} do not set this variable. The |
| following macro allows you to use it even with those versions. |
| |
| @anchor{AC_PROG_MAKE_SET} |
| @defmac AC_PROG_MAKE_SET |
| @acindex{PROG_MAKE_SET} |
| @ovindex SET_MAKE |
| If the Make command, @code{$MAKE} if set or else @samp{make}, predefines |
| @code{$(MAKE)}, define output variable @code{SET_MAKE} to be empty. |
| Otherwise, define @code{SET_MAKE} to a macro definition that sets |
| @code{$(MAKE)}, such as @samp{MAKE=make}. Calls @code{AC_SUBST} for |
| @code{SET_MAKE}. |
| @end defmac |
| |
| If you use this macro, place a line like this in each @file{Makefile.in} |
| that runs @command{MAKE} on other directories: |
| |
| @example |
| @@SET_MAKE@@ |
| @end example |
| |
| |
| |
| @node Configuration Actions |
| @section Performing Configuration Actions |
| @cindex Configuration actions |
| |
| @file{configure} is designed so that it appears to do everything itself, |
| but there is actually a hidden slave: @file{config.status}. |
| @file{configure} is in charge of examining your system, but it is |
| @file{config.status} that actually takes the proper actions based on the |
| results of @file{configure}. The most typical task of |
| @file{config.status} is to @emph{instantiate} files. |
| |
| @acindex{CONFIG_@var{ITEMS}} |
| This section describes the common behavior of the four standard |
| instantiating macros: @code{AC_CONFIG_FILES}, @code{AC_CONFIG_HEADERS}, |
| @code{AC_CONFIG_COMMANDS} and @code{AC_CONFIG_LINKS}. They all |
| have this prototype: |
| |
| @c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something |
| @c awful. |
| @example |
| AC_CONFIG_@var{ITEMS}(@var{tag}@dots{}, @r{[}@var{commands}@r{]}, @r{[}@var{init-cmds}@r{]}) |
| @end example |
| |
| @noindent |
| where the arguments are: |
| |
| @table @var |
| @item tag@dots{} |
| A blank-or-newline-separated list of tags, which are typically the names of |
| the files to instantiate. |
| |
| You are encouraged to use literals as @var{tags}. In particular, you |
| should avoid |
| |
| @example |
| AS_IF([@dots{}], [my_foos="$my_foos fooo"]) |
| AS_IF([@dots{}], [my_foos="$my_foos foooo"]) |
| AC_CONFIG_@var{ITEMS}([$my_foos]) |
| @end example |
| |
| @noindent |
| and use this instead: |
| |
| @example |
| AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([fooo])]) |
| AS_IF([@dots{}], [AC_CONFIG_@var{ITEMS}([foooo])]) |
| @end example |
| |
| The macros @code{AC_CONFIG_FILES} and @code{AC_CONFIG_HEADERS} use |
| special @var{tag} values: they may have the form @samp{@var{output}} or |
| @samp{@var{output}:@var{inputs}}. The file @var{output} is instantiated |
| from its templates, @var{inputs} (defaulting to @samp{@var{output}.in}). |
| |
| @samp{AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])}, |
| for example, asks for |
| the creation of the file @file{Makefile} that contains the expansion of the |
| output variables in the concatenation of @file{boiler/top.mk} and |
| @file{boiler/bot.mk}. |
| |
| The special value @samp{-} might be used to denote the standard output |
| when used in @var{output}, or the standard input when used in the |
| @var{inputs}. You most probably don't need to use this in |
| @file{configure.ac}, but it is convenient when using the command line |
| interface of @file{./config.status}, see @ref{config.status Invocation}, |
| for more details. |
| |
| The @var{inputs} may be absolute or relative file names. In the latter |
| case they are first looked for in the build tree, and then in the source |
| tree. Input files should be text files, and a line length below 2000 |
| bytes should be safe. |
| |
| @item commands |
| Shell commands output literally into @file{config.status}, and |
| associated with a tag that the user can use to tell @file{config.status} |
| which commands to run. The commands are run each time a @var{tag} |
| request is given to @file{config.status}, typically each time the file |
| @file{@var{tag}} is created. |
| |
| The variables set during the execution of @command{configure} are |
| @emph{not} available here: you first need to set them via the |
| @var{init-cmds}. Nonetheless the following variables are pre-computed: |
| |
| @table @code |
| @item srcdir |
| @vrindex srcdir |
| The name of the top source directory, assuming that the working |
| directory is the top build directory. This |
| is what @command{configure}'s @option{--srcdir} option sets. |
| |
| @item ac_top_srcdir |
| @vrindex ac_top_srcdir |
| The name of the top source directory, assuming that the working |
| directory is the current build directory. |
| |
| @item ac_top_build_prefix |
| @vrindex ac_top_build_prefix |
| The name of the top build directory, assuming that the working |
| directory is the current build directory. |
| It can be empty, or else ends with a slash, so that you may concatenate |
| it. |
| |
| @item ac_srcdir |
| @vrindex ac_srcdir |
| The name of the corresponding source directory, assuming that the |
| working directory is the current build directory. |
| |
| @item tmp |
| @vrindex tmp |
| The name of a temporary directory within the build tree, which you |
| can use if you need to create additional temporary files. The |
| directory is cleaned up when @command{config.status} is done or |
| interrupted. Please use package-specific file name prefixes to |
| avoid clashing with files that @command{config.status} may use |
| internally. |
| @end table |
| |
| @noindent |
| The @dfn{current} directory refers to the directory (or |
| pseudo-directory) containing the input part of @var{tags}. For |
| instance, running |
| |
| @example |
| AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [@dots{}], [@dots{}]) |
| @end example |
| |
| @noindent |
| with @option{--srcdir=../package} produces the following values: |
| |
| @example |
| # Argument of --srcdir |
| srcdir='../package' |
| # Reversing deep/dir |
| ac_top_build_prefix='../../' |
| # Concatenation of $ac_top_build_prefix and srcdir |
| ac_top_srcdir='../../../package' |
| # Concatenation of $ac_top_srcdir and deep/dir |
| ac_srcdir='../../../package/deep/dir' |
| @end example |
| |
| @noindent |
| independently of @samp{in/in.in}. |
| |
| @item init-cmds |
| Shell commands output @emph{unquoted} near the beginning of |
| @file{config.status}, and executed each time @file{config.status} runs |
| (regardless of the tag). Because they are unquoted, for example, |
| @samp{$var} is output as the value of @code{var}. @var{init-cmds} |
| is typically used by @file{configure} to give @file{config.status} some |
| variables it needs to run the @var{commands}. |
| |
| You should be extremely cautious in your variable names: all the |
| @var{init-cmds} share the same name space and may overwrite each other |
| in unpredictable ways. Sorry@enddots{} |
| @end table |
| |
| All these macros can be called multiple times, with different |
| @var{tag} values, of course! |
| |
| |
| @node Configuration Files |
| @section Creating Configuration Files |
| @cindex Creating configuration files |
| @cindex Configuration file creation |
| |
| Be sure to read the previous section, @ref{Configuration Actions}. |
| |
| @anchor{AC_CONFIG_FILES} |
| @defmac AC_CONFIG_FILES (@var{file}@dots{}, @ovar{cmds}, @ovar{init-cmds}) |
| @acindex{CONFIG_FILES} |
| Make @code{AC_OUTPUT} create each @file{@var{file}} by copying an input |
| file (by default @file{@var{file}.in}), substituting the output variable |
| values. |
| @c Before we used to have this feature, which was later rejected |
| @c because it complicates the writing of makefiles: |
| @c If the file would be unchanged, it is left untouched, to preserve |
| @c timestamp. |
| This macro is one of the instantiating macros; see @ref{Configuration |
| Actions}. @xref{Makefile Substitutions}, for more information on using |
| output variables. @xref{Setting Output Variables}, for more information |
| on creating them. This macro creates the directory that the file is in |
| if it doesn't exist. Usually, makefiles are created this way, |
| but other files, such as @file{.gdbinit}, can be specified as well. |
| |
| Typical calls to @code{AC_CONFIG_FILES} look like this: |
| |
| @example |
| AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile]) |
| AC_CONFIG_FILES([autoconf], [chmod +x autoconf]) |
| @end example |
| |
| You can override an input file name by appending to @var{file} a |
| colon-separated list of input files. Examples: |
| |
| @example |
| AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk] |
| [lib/Makefile:boiler/lib.mk]) |
| @end example |
| |
| @noindent |
| Doing this allows you to keep your file names acceptable to |
| DOS variants, or |
| to prepend and/or append boilerplate to the file. |
| |
| The @var{file} names should not contain shell metacharacters. |
| @xref{Special Chars in Variables}. |
| @end defmac |
| |
| |
| |
| @node Makefile Substitutions |
| @section Substitutions in Makefiles |
| @cindex Substitutions in makefiles |
| @cindex Makefile substitutions |
| |
| Each subdirectory in a distribution that contains something to be |
| compiled or installed should come with a file @file{Makefile.in}, from |
| which @command{configure} creates a file @file{Makefile} in that directory. |
| To create @file{Makefile}, @command{configure} performs a simple variable |
| substitution, replacing occurrences of @samp{@@@var{variable}@@} in |
| @file{Makefile.in} with the value that @command{configure} has determined |
| for that variable. Variables that are substituted into output files in |
| this way are called @dfn{output variables}. They are ordinary shell |
| variables that are set in @command{configure}. To make @command{configure} |
| substitute a particular variable into the output files, the macro |
| @code{AC_SUBST} must be called with that variable name as an argument. |
| Any occurrences of @samp{@@@var{variable}@@} for other variables are |
| left unchanged. @xref{Setting Output Variables}, for more information |
| on creating output variables with @code{AC_SUBST}. |
| |
| A software package that uses a @command{configure} script should be |
| distributed with a file @file{Makefile.in}, but no makefile; that |
| way, the user has to properly configure the package for the local system |
| before compiling it. |
| |
| @xref{Makefile Conventions, , Makefile Conventions, standards, The |
| GNU Coding Standards}, for more information on what to put in |
| makefiles. |
| |
| @menu |
| * Preset Output Variables:: Output variables that are always set |
| * Installation Directory Variables:: Other preset output variables |
| * Changed Directory Variables:: Warnings about @file{datarootdir} |
| * Build Directories:: Supporting multiple concurrent compiles |
| * Automatic Remaking:: Makefile rules for configuring |
| @end menu |
| |
| @node Preset Output Variables |
| @subsection Preset Output Variables |
| @cindex Output variables |
| |
| Some output variables are preset by the Autoconf macros. Some of the |
| Autoconf macros set additional output variables, which are mentioned in |
| the descriptions for those macros. @xref{Output Variable Index}, for a |
| complete list of output variables. @xref{Installation Directory |
| Variables}, for the list of the preset ones related to installation |
| directories. Below are listed the other preset ones, many of which are |
| precious variables (@pxref{Setting Output Variables}, |
| @code{AC_ARG_VAR}). |
| |
| The preset variables which are available during @file{config.status} |
| (@pxref{Configuration Actions}) may also be used during |
| @command{configure} tests. For example, it is permissible to reference |
| @samp{$srcdir} when constructing a list of directories to pass via |
| the @option{-I} option during a compiler feature check. When used in this |
| manner, coupled with the fact that @command{configure} is always run |
| from the top build directory, it is sufficient to use just |
| @samp{$srcdir} instead of @samp{$top_srcdir}. |
| |
| @c Just say no to ASCII sorting! We're humans, not computers. |
| @c These variables are listed as they would be in a dictionary: |
| @c actor |
| @c Actress |
| @c actress |
| |
| @defvar CFLAGS |
| @evindex CFLAGS |
| @ovindex CFLAGS |
| Debugging and optimization options for the C compiler. If it is not set |
| in the environment when @command{configure} runs, the default value is set |
| when you call @code{AC_PROG_CC} (or empty if you don't). @command{configure} |
| uses this variable when compiling or linking programs to test for C features. |
| |
| If a compiler option affects only the behavior of the preprocessor |
| (e.g., @option{-D@var{name}}), it should be put into @code{CPPFLAGS} |
| instead. If it affects only the linker (e.g., @option{-L@var{directory}}), |
| it should be put into @code{LDFLAGS} instead. If it |
| affects only the compiler proper, @code{CFLAGS} is the natural home for |
| it. If an option affects multiple phases of the compiler, though, |
| matters get tricky: |
| |
| @itemize @bullet |
| @item |
| If an option selects a 32-bit or 64-bit build on a bi-arch system, it |
| must be put direcly into @code{CC}, e.g., @code{CC='gcc -m64'}. This is |
| necessary for @code{config.guess} to work right. |
| @item |
| Otherwise one approach is to put the option into @code{CC}. Another is |
| to put it into both @code{CPPFLAGS} and @code{LDFLAGS}, but not into |
| @code{CFLAGS}. |
| @end itemize |
| |
| However, remember that some @file{Makefile} variables are reserved by |
| the GNU Coding Standards for the use of the ``user''---the person |
| building the package. For instance, @code{CFLAGS} is one such variable. |
| |
| Sometimes package developers are tempted to set user variables such as |
| @code{CFLAGS} because it appears to make their job easier. However, the |
| package itself should never set a user variable, particularly not to |
| include switches that are required for proper compilation of the |
| package. Since these variables are documented as being for the package |
| builder, that person rightfully expects to be able to override any of |
| these variables at build time. If the package developer needs to add |
| switches without interfering with the user, the proper way to do that is |
| to introduce an additional variable. Automake makes this easy by |
| introducing @code{AM_CFLAGS} (@pxref{Flag Variables Ordering, , , |
| automake, GNU Automake}), but the concept is the same even if |
| Automake is not used. |
| @end defvar |
| |
| @defvar configure_input |
| @ovindex configure_input |
| A comment saying that the file was generated automatically by |
| @command{configure} and giving the name of the input file. |
| @code{AC_OUTPUT} adds a comment line containing this variable to the top |
| of every makefile it creates. For other files, you should |
| reference this variable in a comment at the top of each input file. For |
| example, an input shell script should begin like this: |
| |
| @example |
| #!/bin/sh |
| # @@configure_input@@ |
| @end example |
| |
| @noindent |
| The presence of that line also reminds people editing the file that it |
| needs to be processed by @command{configure} in order to be used. |
| @end defvar |
| |
| @defvar CPPFLAGS |
| @evindex CPPFLAGS |
| @ovindex CPPFLAGS |
| Preprocessor options for the C, C++, Objective C, and Objective C++ |
| preprocessors and compilers. If |
| it is not set in the environment when @command{configure} runs, the default |
| value is empty. @command{configure} uses this variable when preprocessing |
| or compiling programs to test for C, C++, Objective C, and Objective C++ |
| features. |
| |
| This variable's contents should contain options like @option{-I}, |
| @option{-D}, and @option{-U} that affect only the behavior of the |
| preprocessor. Please see the explanation of @code{CFLAGS} for what you |
| can do if an option affects other phases of the compiler as well. |
| |
| Currently, @command{configure} always links as part of a single |
| invocation of the compiler that also preprocesses and compiles, so it |
| uses this variable also when linking programs. However, it is unwise to |
| depend on this behavior because the GNU Coding Standards do |
| not require it and many packages do not use @code{CPPFLAGS} when linking |
| programs. |
| |
| @xref{Special Chars in Variables}, for limitations that @code{CPPFLAGS} |
| might run into. |
| @end defvar |
| |
| @defvar CXXFLAGS |
| @evindex CXXFLAGS |
| @ovindex CXXFLAGS |
| Debugging and optimization options for the C++ compiler. It acts like |
| @code{CFLAGS}, but for C++ instead of C. |
| @end defvar |
| |
| @defvar DEFS |
| @ovindex DEFS |
| @option{-D} options to pass to the C compiler. If @code{AC_CONFIG_HEADERS} |
| is called, @command{configure} replaces @samp{@@DEFS@@} with |
| @option{-DHAVE_CONFIG_H} instead (@pxref{Configuration Headers}). This |
| variable is not defined while @command{configure} is performing its tests, |
| only when creating the output files. @xref{Setting Output Variables}, for |
| how to check the results of previous tests. |
| @end defvar |
| |
| @defvar ECHO_C |
| @defvarx ECHO_N |
| @defvarx ECHO_T |
| @ovindex ECHO_C |
| @ovindex ECHO_N |
| @ovindex ECHO_T |
| These obsolescent variables let you suppress the trailing newline from |
| @command{echo} for question-answer message pairs. |
| Nowadays it is better to use @code{AS_ECHO_N}. |
| @end defvar |
| |
| @defvar ERLCFLAGS |
| @evindex ERLCFLAGS |
| @ovindex ERLCFLAGS |
| Debugging and optimization options for the Erlang compiler. If it is not set |
| in the environment when @command{configure} runs, the default value is empty. |
| @command{configure} uses this variable when compiling |
| programs to test for Erlang features. |
| @end defvar |
| |
| @defvar FCFLAGS |
| @evindex FCFLAGS |
| @ovindex FCFLAGS |
| Debugging and optimization options for the Fortran compiler. If it |
| is not set in the environment when @command{configure} runs, the default |
| value is set when you call @code{AC_PROG_FC} (or empty if you don't). |
| @command{configure} uses this variable when compiling or linking |
| programs to test for Fortran features. |
| @end defvar |
| |
| @defvar FFLAGS |
| @evindex FFLAGS |
| @ovindex FFLAGS |
| Debugging and optimization options for the Fortran 77 compiler. If it |
| is not set in the environment when @command{configure} runs, the default |
| value is set when you call @code{AC_PROG_F77} (or empty if you don't). |
| @command{configure} uses this variable when compiling or linking |
| programs to test for Fortran 77 features. |
| @end defvar |
| |
| @defvar LDFLAGS |
| @evindex LDFLAGS |
| @ovindex LDFLAGS |
| Options for the linker. If it is not set |
| in the environment when @command{configure} runs, the default value is empty. |
| @command{configure} uses this variable when linking programs to test for |
| C, C++, Objective C, Objective C++, Fortran, and Go features. |
| |
| This variable's contents should contain options like @option{-s} and |
| @option{-L} that affect only the behavior of the linker. Please see the |
| explanation of @code{CFLAGS} for what you can do if an option also |
| affects other phases of the compiler. |
| |
| Don't use this variable to pass library names |
| (@option{-l}) to the linker; use @code{LIBS} instead. |
| @end defvar |
| |
| @defvar LIBS |
| @evindex LIBS |
| @ovindex LIBS |
| @option{-l} options to pass to the linker. The default value is empty, |
| but some Autoconf macros may prepend extra libraries to this variable if |
| those libraries are found and provide necessary functions, see |
| @ref{Libraries}. @command{configure} uses this variable when linking |
| programs to test for C, C++, Objective C, Objective C++, Fortran, and Go |
| features. |
| @end defvar |
| |
| @defvar OBJCFLAGS |
| @evindex OBJCFLAGS |
| @ovindex OBJCFLAGS |
| Debugging and optimization options for the Objective C compiler. It |
| acts like @code{CFLAGS}, but for Objective C instead of C. |
| @end defvar |
| |
| @defvar OBJCXXFLAGS |
| @evindex OBJCXXFLAGS |
| @ovindex OBJCXXFLAGS |
| Debugging and optimization options for the Objective C++ compiler. It |
| acts like @code{CXXFLAGS}, but for Objective C++ instead of C++. |
| @end defvar |
| |
| @defvar GOFLAGS |
| @evindex GOFLAGS |
| @ovindex GOFLAGS |
| Debugging and optimization options for the Go compiler. It acts like |
| @code{CFLAGS}, but for Go instead of C. |
| @end defvar |
| |
| @defvar builddir |
| @ovindex builddir |
| Rigorously equal to @samp{.}. Added for symmetry only. |
| @end defvar |
| |
| @defvar abs_builddir |
| @ovindex abs_builddir |
| Absolute name of @code{builddir}. |
| @end defvar |
| |
| @defvar top_builddir |
| @ovindex top_builddir |
| The relative name of the top level of the current build tree. In the |
| top-level directory, this is the same as @code{builddir}. |
| @end defvar |
| |
| @defvar top_build_prefix |
| @ovindex top_build_prefix |
| The relative name of the top level of the current build tree with final |
| slash if nonempty. This is the same as @code{top_builddir}, except that |
| it contains zero or more runs of @code{../}, so it should not be |
| appended with a slash for concatenation. This helps for @command{make} |
| implementations that otherwise do not treat @file{./file} and @file{file} |
| as equal in the top-level build directory. |
| @end defvar |
| |
| @defvar abs_top_builddir |
| @ovindex abs_top_builddir |
| Absolute name of @code{top_builddir}. |
| @end defvar |
| |
| @defvar srcdir |
| @ovindex srcdir |
| The name of the directory that contains the source code for |
| that makefile. |
| @end defvar |
| |
| @defvar abs_srcdir |
| @ovindex abs_srcdir |
| Absolute name of @code{srcdir}. |
| @end defvar |
| |
| @defvar top_srcdir |
| @ovindex top_srcdir |
| The name of the top-level source code directory for the |
| package. In the top-level directory, this is the same as @code{srcdir}. |
| @end defvar |
| |
| @defvar abs_top_srcdir |
| @ovindex abs_top_srcdir |
| Absolute name of @code{top_srcdir}. |
| @end defvar |
| |
| @node Installation Directory Variables |
| @subsection Installation Directory Variables |
| @cindex Installation directories |
| @cindex Directories, installation |
| |
| The following variables specify the directories for |
| package installation, see @ref{Directory Variables, , Variables for |
| Installation Directories, standards, The GNU Coding |
| Standards}, for more information. Each variable corresponds to an |
| argument of @command{configure}; trailing slashes are stripped so that |
| expressions such as @samp{$@{prefix@}/lib} expand with only one slash |
| between directory names. See the end of this section for |
| details on when and how to use these variables. |
| |
| @defvar bindir |
| @ovindex bindir |
| The directory for installing executables that users run. |
| @end defvar |
| |
| @defvar datadir |
| @ovindex datadir |
| The directory for installing idiosyncratic read-only |
| architecture-independent data. |
| @end defvar |
| |
| @defvar datarootdir |
| @ovindex datarootdir |
| The root of the directory tree for read-only architecture-independent |
| data files. |
| @end defvar |
| |
| @defvar docdir |
| @ovindex docdir |
| The directory for installing documentation files (other than Info and |
| man). |
| @end defvar |
| |
| @defvar dvidir |
| @ovindex dvidir |
| The directory for installing documentation files in DVI format. |
| @end defvar |
| |
| @defvar exec_prefix |
| @ovindex exec_prefix |
| The installation prefix for architecture-dependent files. By default |
| it's the same as @code{prefix}. You should avoid installing anything |
| directly to @code{exec_prefix}. However, the default value for |
| directories containing architecture-dependent files should be relative |
| to @code{exec_prefix}. |
| @end defvar |
| |
| @defvar htmldir |
| @ovindex htmldir |
| The directory for installing HTML documentation. |
| @end defvar |
| |
| @defvar includedir |
| @ovindex includedir |
| The directory for installing C header files. |
| @end defvar |
| |
| @defvar infodir |
| @ovindex infodir |
| The directory for installing documentation in Info format. |
| @end defvar |
| |
| @defvar libdir |
| @ovindex libdir |
| The directory for installing object code libraries. |
| @end defvar |
| |
| @defvar libexecdir |
| @ovindex libexecdir |
| The directory for installing executables that other programs run. |
| @end defvar |
| |
| @defvar localedir |
| @ovindex localedir |
| The directory for installing locale-dependent but |
| architecture-independent data, such as message catalogs. This directory |
| usually has a subdirectory per locale. |
| @end defvar |
| |
| @defvar localstatedir |
| @ovindex localstatedir |
| The directory for installing modifiable single-machine data. Content in |
| this directory typically survives a reboot. |
| @end defvar |
| |
| @defvar runstatedir |
| @ovindex runstatedir |
| The directory for installing temporary modifiable single-machine data. |
| Content in this directory survives as long as the process is running |
| (such as pid files), as contrasted with @file{/tmp} that may be |
| periodically cleaned. Conversely, this directory is typically cleaned |
| on a reboot. By default, this is a subdirectory of |
| @code{localstatedir}. |
| @end defvar |
| |
| @defvar mandir |
| @ovindex mandir |
| The top-level directory for installing documentation in man format. |
| @end defvar |
| |
| @defvar oldincludedir |
| @ovindex oldincludedir |
| The directory for installing C header files for non-GCC compilers. |
| @end defvar |
| |
| @defvar pdfdir |
| @ovindex pdfdir |
| The directory for installing PDF documentation. |
| @end defvar |
| |
| @defvar prefix |
| @ovindex prefix |
| The common installation prefix for all files. If @code{exec_prefix} |
| is defined to a different value, @code{prefix} is used only for |
| architecture-independent files. |
| @end defvar |
| |
| @defvar psdir |
| @ovindex psdir |
| The directory for installing PostScript documentation. |
| @end defvar |
| |
| @defvar sbindir |
| @ovindex sbindir |
| The directory for installing executables that system |
| administrators run. |
| @end defvar |
| |
| @defvar sharedstatedir |
| @ovindex sharedstatedir |
| The directory for installing modifiable architecture-independent data. |
| @end defvar |
| |
| @defvar sysconfdir |
| @ovindex sysconfdir |
| The directory for installing read-only single-machine data. |
| @end defvar |
| |
| |
| Most of these variables have values that rely on @code{prefix} or |
| @code{exec_prefix}. It is deliberate that the directory output |
| variables keep them unexpanded: typically @samp{@@datarootdir@@} is |
| replaced by @samp{$@{prefix@}/share}, not @samp{/usr/local/share}, and |
| @samp{@@datadir@@} is replaced by @samp{$@{datarootdir@}}. |
| |
| This behavior is mandated by the GNU Coding Standards, so that when |
| the user runs: |
| |
| @table @samp |
| @item make |
| she can still specify a different prefix from the one specified to |
| @command{configure}, in which case, if needed, the package should hard |
| code dependencies corresponding to the make-specified prefix. |
| |
| @item make install |
| she can specify a different installation location, in which case the |
| package @emph{must} still depend on the location which was compiled in |
| (i.e., never recompile when @samp{make install} is run). This is an |
| extremely important feature, as many people may decide to install all |
| the files of a package grouped together, and then install links from |
| the final locations to there. |
| @end table |
| |
| In order to support these features, it is essential that |
| @code{datarootdir} remains defined as @samp{$@{prefix@}/share}, |
| so that its value can be expanded based |
| on the current value of @code{prefix}. |
| |
| A corollary is that you should not use these variables except in |
| makefiles. For instance, instead of trying to evaluate @code{datadir} |
| in @file{configure} and hard-coding it in makefiles using |
| e.g., @samp{AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])}, |
| you should add |
| @option{-DDATADIR='$(datadir)'} to your makefile's definition of |
| @code{CPPFLAGS} (@code{AM_CPPFLAGS} if you are also using Automake). |
| |
| Similarly, you should not rely on @code{AC_CONFIG_FILES} to replace |
| @code{bindir} and friends in your shell scripts and other files; instead, |
| let @command{make} manage their replacement. For instance Autoconf |
| ships templates of its shell scripts ending with @samp{.in}, and uses a |
| makefile snippet similar to the following to build scripts like |
| @command{autoheader} and @command{autom4te}: |
| |
| @example |
| @group |
| edit = sed \ |
| -e 's|@@bindir[@@]|$(bindir)|g' \ |
| -e 's|@@pkgdatadir[@@]|$(pkgdatadir)|g' \ |
| -e 's|@@prefix[@@]|$(prefix)|g' |
| @end group |
| |
| @group |
| autoheader autom4te: Makefile |
| rm -f $@@ $@@.tmp |
| srcdir=''; \ |
| test -f ./$@@.in || srcdir=$(srcdir)/; \ |
| $(edit) $$@{srcdir@}$@@.in >$@@.tmp |
| @c $$ restore font-lock |
| chmod +x $@@.tmp |
| chmod a-w $@@.tmp |
| mv $@@.tmp $@@ |
| @end group |
| |
| @group |
| autoheader: $(srcdir)/autoheader.in |
| autom4te: $(srcdir)/autom4te.in |
| @end group |
| @end example |
| |
| Some details are noteworthy: |
| |
| @table @asis |
| @item @samp{@@bindir[@@]} |
| The brackets prevent @command{configure} from replacing |
| @samp{@@bindir@@} in the Sed expression itself. |
| Brackets are preferable to a backslash here, since |
| POSIX says @samp{\@@} is not portable. |
| |
| @item @samp{$(bindir)} |
| Don't use @samp{@@bindir@@}! Use the matching makefile variable |
| instead. |
| |
| @item @samp{$(pkgdatadir)} |
| The example takes advantage of the variable @samp{$(pkgdatadir)} |
| provided by Automake; it is equivalent to @samp{$(datadir)/$(PACKAGE)}. |
| |
| @item @samp{/} |
| Don't use @samp{/} in the Sed expressions that replace file names since |
| most likely the |
| variables you use, such as @samp{$(bindir)}, contain @samp{/}. |
| Use a shell metacharacter instead, such as @samp{|}. |
| |
| @item special characters |
| File names, file name components, and the value of @code{VPATH} should |
| not contain shell metacharacters or white |
| space. @xref{Special Chars in Variables}. |
| |
| @item dependency on @file{Makefile} |
| Since @code{edit} uses values that depend on the configuration specific |
| values (@code{prefix}, etc.)@: and not only on @code{VERSION} and so forth, |
| the output depends on @file{Makefile}, not @file{configure.ac}. |
| |
| @item @samp{$@@} |
| The main rule is generic, and uses @samp{$@@} extensively to |
| avoid the need for multiple copies of the rule. |
| |
| @item Separated dependencies and single suffix rules |
| You can't use them! The above snippet cannot be (portably) rewritten |
| as: |
| |
| @example |
| autoconf autoheader: Makefile |
| @group |
| .in: |
| rm -f $@@ $@@.tmp |
| $(edit) $< >$@@.tmp |
| chmod +x $@@.tmp |
| mv $@@.tmp $@@ |
| @end group |
| @end example |
| |
| @xref{Single Suffix Rules}, for details. |
| |
| @item @samp{$(srcdir)} |
| Be sure to specify the name of the source directory, |
| otherwise the package won't support separated builds. |
| @end table |
| |
| For the more specific installation of Erlang libraries, the following variables |
| are defined: |
| |
| @defvar ERLANG_INSTALL_LIB_DIR |
| @ovindex ERLANG_INSTALL_LIB_DIR |
| @acindex{ERLANG_SUBST_INSTALL_LIB_DIR} |
| The common parent directory of Erlang library installation directories. |
| This variable is set by calling the @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} |
| macro in @file{configure.ac}. |
| @end defvar |
| |
| @defvar ERLANG_INSTALL_LIB_DIR_@var{library} |
| @ovindex ERLANG_INSTALL_LIB_DIR_@var{library} |
| @acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR} |
| The installation directory for Erlang library @var{library}. |
| This variable is set by using the |
| @samp{AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR} |
| macro in @file{configure.ac}. |
| @end defvar |
| |
| @xref{Erlang Libraries}, for details. |
| |
| |
| @node Changed Directory Variables |
| @subsection Changed Directory Variables |
| @cindex @file{datarootdir} |
| |
| In Autoconf 2.60, the set of directory variables has changed, and the |
| defaults of some variables have been adjusted |
| (@pxref{Installation Directory Variables}) to changes in the |
| GNU Coding Standards. Notably, @file{datadir}, @file{infodir}, and |
| @file{mandir} are now expressed in terms of @file{datarootdir}. If you are |
| upgrading from an earlier Autoconf version, you may need to adjust your files |
| to ensure that the directory variables are substituted correctly |
| (@pxref{Defining Directories}), and that a definition of @file{datarootdir} is |
| in place. For example, in a @file{Makefile.in}, adding |
| |
| @example |
| datarootdir = @@datarootdir@@ |
| @end example |
| |
| @noindent |
| is usually sufficient. If you use Automake to create @file{Makefile.in}, |
| it will add this for you. |
| |
| To help with the transition, Autoconf warns about files that seem to use |
| @code{datarootdir} without defining it. In some cases, it then expands |
| the value of @code{$datarootdir} in substitutions of the directory |
| variables. The following example shows such a warning: |
| |
| @example |
| $ @kbd{cat configure.ac} |
| AC_INIT |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| $ @kbd{cat Makefile.in} |
| prefix = @@prefix@@ |
| datadir = @@datadir@@ |
| $ @kbd{autoconf} |
| $ @kbd{configure} |
| configure: creating ./config.status |
| config.status: creating Makefile |
| config.status: WARNING: |
| Makefile.in seems to ignore the --datarootdir setting |
| $ @kbd{cat Makefile} |
| prefix = /usr/local |
| datadir = $@{prefix@}/share |
| @end example |
| |
| Usually one can easily change the file to accommodate both older and newer |
| Autoconf releases: |
| |
| @example |
| $ @kbd{cat Makefile.in} |
| prefix = @@prefix@@ |
| datarootdir = @@datarootdir@@ |
| datadir = @@datadir@@ |
| $ @kbd{configure} |
| configure: creating ./config.status |
| config.status: creating Makefile |
| $ @kbd{cat Makefile} |
| prefix = /usr/local |
| datarootdir = $@{prefix@}/share |
| datadir = $@{datarootdir@} |
| @end example |
| |
| @acindex{DATAROOTDIR_CHECKED} |
| In some cases, however, the checks may not be able to detect that a suitable |
| initialization of @code{datarootdir} is in place, or they may fail to detect |
| that such an initialization is necessary in the output file. If, after |
| auditing your package, there are still spurious @file{configure} warnings about |
| @code{datarootdir}, you may add the line |
| |
| @example |
| AC_DEFUN([AC_DATAROOTDIR_CHECKED]) |
| @end example |
| |
| @noindent |
| to your @file{configure.ac} to disable the warnings. This is an exception |
| to the usual rule that you should not define a macro whose name begins with |
| @code{AC_} (@pxref{Macro Names}). |
| |
| |
| |
| @node Build Directories |
| @subsection Build Directories |
| @cindex Build directories |
| @cindex Directories, build |
| |
| You can support compiling a software package for several architectures |
| simultaneously from the same copy of the source code. The object files |
| for each architecture are kept in their own directory. |
| |
| To support doing this, @command{make} uses the @code{VPATH} variable to |
| find the files that are in the source directory. GNU Make |
| can do this. Most other recent @command{make} programs can do this as |
| well, though they may have difficulties and it is often simpler to |
| recommend GNU @command{make} (@pxref{VPATH and Make}). Older |
| @command{make} programs do not support @code{VPATH}; when using them, the |
| source code must be in the same directory as the object files. |
| |
| If you are using GNU Automake, the remaining details in this |
| section are already covered for you, based on the contents of your |
| @file{Makefile.am}. But if you are using Autoconf in isolation, then |
| supporting @code{VPATH} requires the following in your |
| @file{Makefile.in}: |
| |
| @example |
| srcdir = @@srcdir@@ |
| VPATH = @@srcdir@@ |
| @end example |
| |
| Do not set @code{VPATH} to the value of another variable (@pxref{Variables |
| listed in VPATH}. |
| |
| @command{configure} substitutes the correct value for @code{srcdir} when |
| it produces @file{Makefile}. |
| |
| Do not use the @command{make} variable @code{$<}, which expands to the |
| file name of the file in the source directory (found with @code{VPATH}), |
| except in implicit rules. (An implicit rule is one such as @samp{.c.o}, |
| which tells how to create a @file{.o} file from a @file{.c} file.) Some |
| versions of @command{make} do not set @code{$<} in explicit rules; they |
| expand it to an empty value. |
| |
| Instead, Make command lines should always refer to source |
| files by prefixing them with @samp{$(srcdir)/}. It's safer |
| to quote the source directory name, in case it contains characters that |
| are special to the shell. Because @samp{$(srcdir)} is expanded by Make, |
| single-quoting works and is safer than double-quoting. For example: |
| |
| @example |
| time.info: time.texinfo |
| $(MAKEINFO) '$(srcdir)/time.texinfo' |
| @end example |
| |
| @node Automatic Remaking |
| @subsection Automatic Remaking |
| @cindex Automatic remaking |
| @cindex Remaking automatically |
| |
| You can put rules like the following in the top-level @file{Makefile.in} |
| for a package to automatically update the configuration information when |
| you change the configuration files. This example includes all of the |
| optional files, such as @file{aclocal.m4} and those related to |
| configuration header files. Omit from the @file{Makefile.in} rules for |
| any of these files that your package does not use. |
| |
| The @samp{$(srcdir)/} prefix is included because of limitations in the |
| @code{VPATH} mechanism. |
| |
| The @file{stamp-} files are necessary because the timestamps of |
| @file{config.h.in} and @file{config.h} are not changed if remaking |
| them does not change their contents. This feature avoids unnecessary |
| recompilation. You should include the file @file{stamp-h.in} in your |
| package's distribution, so that @command{make} considers |
| @file{config.h.in} up to date. Don't use @command{touch} |
| (@pxref{touch, , Limitations of Usual Tools}); instead, use |
| @command{echo} (using |
| @command{date} would cause needless output differences). |
| |
| @example |
| @group |
| $(srcdir)/configure: configure.ac aclocal.m4 |
| cd '$(srcdir)' && autoconf |
| |
| # autoheader might not change config.h.in, so touch a stamp file. |
| $(srcdir)/config.h.in: stamp-h.in ; |
| $(srcdir)/stamp-h.in: configure.ac aclocal.m4 |
| cd '$(srcdir)' && autoheader |
| echo timestamp > '$(srcdir)/stamp-h.in' |
| |
| config.h: stamp-h ; |
| stamp-h: config.h.in config.status |
| ./config.status |
| |
| Makefile: Makefile.in config.status |
| ./config.status |
| |
| config.status: configure |
| ./config.status --recheck |
| @end group |
| @end example |
| |
| @noindent |
| (Be careful if you copy these lines directly into your makefile, as you |
| need to convert the indented lines to start with the tab character.) |
| |
| In addition, you should use |
| |
| @example |
| AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) |
| @end example |
| |
| @noindent |
| so @file{config.status} ensures that @file{config.h} is considered up to |
| date. @xref{Output}, for more information about @code{AC_OUTPUT}. |
| |
| @xref{config.status Invocation}, for more examples of handling |
| configuration-related dependencies. |
| |
| @node Configuration Headers |
| @section Configuration Header Files |
| @cindex Configuration Header |
| @cindex @file{config.h} |
| |
| When a package contains more than a few tests that define C preprocessor |
| symbols, the command lines to pass @option{-D} options to the compiler |
| can get quite long. This causes two problems. One is that the |
| @command{make} output is hard to visually scan for errors. More |
| seriously, the command lines can exceed the length limits of some |
| operating systems. As an alternative to passing @option{-D} options to |
| the compiler, @command{configure} scripts can create a C header file |
| containing @samp{#define} directives. The @code{AC_CONFIG_HEADERS} |
| macro selects this kind of output. Though it can be called anywhere |
| between @code{AC_INIT} and @code{AC_OUTPUT}, it is customary to call |
| it right after @code{AC_INIT}. |
| |
| The package should @samp{#include} the configuration header file before |
| any other header files, to prevent inconsistencies in declarations (for |
| example, if it redefines @code{const}, or if it defines a macro like |
| @code{_FILE_OFFSET_BITS} that affects the behavior of system |
| headers). Note that it is okay to only include @file{config.h} from |
| @file{.c} files; the project's @file{.h} files can rely on |
| @file{config.h} already being included first by the corresponding |
| @file{.c} file. |
| |
| To provide for VPATH builds, remember to pass the C compiler a @option{-I.} |
| option (or @option{-I..}; whichever directory contains @file{config.h}). |
| Even if you use @samp{#include "config.h"}, the preprocessor searches only |
| the directory of the currently read file, i.e., the source directory, not |
| the build directory. |
| |
| With the appropriate @option{-I} option, you can use |
| @samp{#include <config.h>}. Actually, it's a good habit to use it, |
| because in the rare case when the source directory contains another |
| @file{config.h}, the build directory should be searched first. |
| |
| |
| @defmac AC_CONFIG_HEADERS (@var{header} @dots{}, @ovar{cmds}, @ovar{init-cmds}) |
| @acindex{CONFIG_HEADERS} |
| @cvindex HAVE_CONFIG_H |
| This macro is one of the instantiating macros; see @ref{Configuration |
| Actions}. Make @code{AC_OUTPUT} create the file(s) in the |
| blank-or-newline-separated list @var{header} containing C preprocessor |
| @code{#define} statements, and replace @samp{@@DEFS@@} in generated |
| files with @option{-DHAVE_CONFIG_H} instead of the value of @code{DEFS}. |
| The usual name for @var{header} is @file{config.h}; |
| @var{header} should not contain shell metacharacters. |
| @xref{Special Chars in Variables}. |
| |
| If @var{header} already exists and its contents are identical to what |
| @code{AC_OUTPUT} would put in it, it is left alone. Doing this allows |
| making some changes in the configuration without needlessly causing |
| object files that depend on the header file to be recompiled. |
| |
| Usually the input file is named @file{@var{header}.in}; however, you can |
| override the input file name by appending to @var{header} a |
| colon-separated list of input files. For example, you might need to make |
| the input file name acceptable to DOS variants: |
| |
| @example |
| AC_CONFIG_HEADERS([config.h:config.hin]) |
| @end example |
| |
| @end defmac |
| |
| @defmac AH_HEADER |
| @ahindex{HEADER} |
| This macro is defined as the name of the first declared config header |
| and undefined if no config headers have been declared up to this point. |
| A third-party macro may, for example, require use of a config header |
| without invoking AC_CONFIG_HEADERS twice, like this: |
| |
| @example |
| AC_CONFIG_COMMANDS_PRE( |
| [m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])]) |
| @end example |
| |
| @end defmac |
| |
| @xref{Configuration Actions}, for more details on @var{header}. |
| |
| @menu |
| * Header Templates:: Input for the configuration headers |
| * autoheader Invocation:: How to create configuration templates |
| * Autoheader Macros:: How to specify CPP templates |
| @end menu |
| |
| @node Header Templates |
| @subsection Configuration Header Templates |
| @cindex Configuration Header Template |
| @cindex Header templates |
| @cindex @file{config.h.in} |
| |
| Your distribution should contain a template file that looks as you want |
| the final header file to look, including comments, with @code{#undef} |
| statements which are used as hooks. For example, suppose your |
| @file{configure.ac} makes these calls: |
| |
| @example |
| AC_CONFIG_HEADERS([conf.h]) |
| AC_CHECK_HEADERS([unistd.h]) |
| @end example |
| |
| @noindent |
| Then you could have code like the following in @file{conf.h.in}. |
| The @file{conf.h} created by @command{configure} defines @samp{HAVE_UNISTD_H} |
| to 1, if and only if the system has @file{unistd.h}. |
| |
| @example |
| @group |
| /* Define as 1 if you have unistd.h. */ |
| #undef HAVE_UNISTD_H |
| @end group |
| @end example |
| |
| The format of the template file is stricter than what the C preprocessor |
| is required to accept. A directive line should contain only whitespace, |
| @samp{#undef}, and @samp{HAVE_UNISTD_H}. The use of @samp{#define} |
| instead of @samp{#undef}, or of comments on the same line as |
| @samp{#undef}, is strongly discouraged. Each hook should only be listed |
| once. Other preprocessor lines, such as @samp{#ifdef} or |
| @samp{#include}, are copied verbatim from the template into the |
| generated header. |
| |
| Since it is a tedious task to keep a template header up to date, you may |
| use @command{autoheader} to generate it, see @ref{autoheader Invocation}. |
| |
| During the instantiation of the header, each @samp{#undef} line in the |
| template file for each symbol defined by @samp{AC_DEFINE} is changed to an |
| appropriate @samp{#define}. If the corresponding @samp{AC_DEFINE} has not |
| been executed during the @command{configure} run, the @samp{#undef} line is |
| commented out. (This is important, e.g., for @samp{_POSIX_SOURCE}: |
| on many systems, it can be implicitly defined by the compiler, and |
| undefining it in the header would then break compilation of subsequent |
| headers.) |
| |
| Currently, @emph{all} remaining @samp{#undef} lines in the header |
| template are commented out, whether or not there was a corresponding |
| @samp{AC_DEFINE} for the macro name; but this behavior is not guaranteed |
| for future releases of Autoconf. |
| |
| Generally speaking, since you should not use @samp{#define}, and you |
| cannot guarantee whether a @samp{#undef} directive in the header |
| template will be converted to a @samp{#define} or commented out in the |
| generated header file, the template file cannot be used for conditional |
| definition effects. Consequently, if you need to use the construct |
| |
| @example |
| @group |
| #ifdef THIS |
| # define THAT |
| #endif |
| @end group |
| @end example |
| |
| @noindent |
| you must place it outside of the template. |
| If you absolutely need to hook it to the config header itself, please put |
| the directives to a separate file, and @samp{#include} that file from the |
| config header template. If you are using @command{autoheader}, you would |
| probably use @samp{AH_BOTTOM} to append the @samp{#include} directive. |
| |
| |
| @node autoheader Invocation |
| @subsection Using @command{autoheader} to Create @file{config.h.in} |
| @cindex @command{autoheader} |
| |
| The @command{autoheader} program can create a template file of C |
| @samp{#define} statements for @command{configure} to use. |
| It searches for the first invocation of @code{AC_CONFIG_HEADERS} in |
| @file{configure} sources to determine the name of the template. |
| (If the first call of @code{AC_CONFIG_HEADERS} specifies more than one |
| input file name, @command{autoheader} uses the first one.) |
| |
| It is recommended that only one input file is used. If you want to append |
| a boilerplate code, it is preferable to use |
| @samp{AH_BOTTOM([#include <conf_post.h>])}. |
| File @file{conf_post.h} is not processed during the configuration then, |
| which make things clearer. Analogically, @code{AH_TOP} can be used to |
| prepend a boilerplate code. |
| |
| In order to do its job, @command{autoheader} needs you to document all |
| of the symbols that you might use. Typically this is done via an |
| @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED} call whose first argument |
| is a literal symbol and whose third argument describes the symbol |
| (@pxref{Defining Symbols}). Alternatively, you can use |
| @code{AH_TEMPLATE} (@pxref{Autoheader Macros}), or you can supply a |
| suitable input file for a subsequent configuration header file. |
| Symbols defined by Autoconf's builtin tests are already documented properly; |
| you need to document only those that you |
| define yourself. |
| |
| You might wonder why @command{autoheader} is needed: after all, why |
| would @command{configure} need to ``patch'' a @file{config.h.in} to |
| produce a @file{config.h} instead of just creating @file{config.h} from |
| scratch? Well, when everything rocks, the answer is just that we are |
| wasting our time maintaining @command{autoheader}: generating |
| @file{config.h} directly is all that is needed. When things go wrong, |
| however, you'll be thankful for the existence of @command{autoheader}. |
| |
| The fact that the symbols are documented is important in order to |
| @emph{check} that @file{config.h} makes sense. The fact that there is a |
| well-defined list of symbols that should be defined (or not) is |
| also important for people who are porting packages to environments where |
| @command{configure} cannot be run: they just have to @emph{fill in the |
| blanks}. |
| |
| But let's come back to the point: the invocation of @command{autoheader}@dots{} |
| |
| If you give @command{autoheader} an argument, it uses that file instead |
| of @file{configure.ac} and writes the header file to the standard output |
| instead of to @file{config.h.in}. If you give @command{autoheader} an |
| argument of @option{-}, it reads the standard input instead of |
| @file{configure.ac} and writes the header file to the standard output. |
| |
| @command{autoheader} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Report processing steps. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files. |
| |
| @item --force |
| @itemx -f |
| Remake the template file even if newer than its input files. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Append @var{dir} to the include path. Multiple invocations accumulate. |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend @var{dir} to the include path. Multiple invocations accumulate. |
| |
| @item --warnings=@var{category}[,@var{category}...] |
| @itemx -W@var{category}[,@var{category}...] |
| @evindex WARNINGS |
| Enable or disable warnings related to each @var{category}. |
| @xref{m4_warn}, for a comprehensive list of categories. |
| Special values include: |
| |
| @table @samp |
| @item all |
| Enable all categories of warnings. |
| |
| @item none |
| Disable all categories of warnings. |
| |
| @item error |
| Treat all warnings as errors. |
| |
| @item no-@var{category} |
| Disable warnings falling into @var{category}. |
| @end table |
| |
| The environment variable @env{WARNINGS} may also be set to a |
| comma-separated list of warning categories to enable or disable. |
| It is interpreted exactly the same way as the argument of |
| @option{--warnings}, but unknown categories are silently ignored. |
| The command line takes precedence; for instance, if @env{WARNINGS} |
| is set to @code{obsolete}, but @option{-Wnone} is given on the |
| command line, no warnings will be issued. |
| |
| Some categories of warnings are on by default. |
| Again, for details see @ref{m4_warn}. |
| @end table |
| |
| |
| |
| @node Autoheader Macros |
| @subsection Autoheader Macros |
| @cindex Autoheader macros |
| |
| @command{autoheader} scans @file{configure.ac} and figures out which C |
| preprocessor symbols it might define. It knows how to generate |
| templates for symbols defined by @code{AC_CHECK_HEADERS}, |
| @code{AC_CHECK_FUNCS} etc., but if you @code{AC_DEFINE} any additional |
| symbol, you must define a template for it. If there are missing |
| templates, @command{autoheader} fails with an error message. |
| |
| The template for a @var{symbol} is created |
| by @command{autoheader} from |
| the @var{description} argument to an @code{AC_DEFINE}; |
| see @ref{Defining Symbols}. |
| |
| For special needs, you can use the following macros. |
| |
| |
| @defmac AH_TEMPLATE (@var{key}, @var{description}) |
| @ahindex{TEMPLATE} |
| Tell @command{autoheader} to generate a template for @var{key}. This macro |
| generates standard templates just like @code{AC_DEFINE} when a |
| @var{description} is given. |
| |
| For example: |
| |
| @example |
| AH_TEMPLATE([NULL_DEVICE], |
| [Name of the file to open to get |
| a null file, or a data sink.]) |
| @end example |
| |
| @noindent |
| generates the following template, with the description properly |
| justified. |
| |
| @example |
| /* Name of the file to open to get a null file, or a data sink. */ |
| #undef NULL_DEVICE |
| @end example |
| @end defmac |
| |
| |
| @defmac AH_VERBATIM (@var{key}, @var{template}) |
| @ahindex{VERBATIM} |
| Tell @command{autoheader} to include the @var{template} as-is in the header |
| template file. This @var{template} is associated with the @var{key}, |
| which is used to sort all the different templates and guarantee their |
| uniqueness. It should be a symbol that can be defined via @code{AC_DEFINE}. |
| @end defmac |
| |
| |
| @defmac AH_TOP (@var{text}) |
| @ahindex{TOP} |
| Include @var{text} at the top of the header template file. |
| @end defmac |
| |
| |
| @defmac AH_BOTTOM (@var{text}) |
| @ahindex{BOTTOM} |
| Include @var{text} at the bottom of the header template file. |
| @end defmac |
| |
| |
| Please note that @var{text} gets included ``verbatim'' to the template file, |
| not to the resulting config header, so it can easily get mangled when the |
| template is processed. There is rarely a need for something other than |
| |
| @example |
| AH_BOTTOM([#include <custom.h>]) |
| @end example |
| |
| |
| |
| @node Configuration Commands |
| @section Running Arbitrary Configuration Commands |
| @cindex Configuration commands |
| @cindex Commands for configuration |
| |
| You can execute arbitrary commands before, during, and after |
| @file{config.status} is run. The three following macros accumulate the |
| commands to run when they are called multiple times. |
| @code{AC_CONFIG_COMMANDS} replaces the obsolete macro |
| @code{AC_OUTPUT_COMMANDS}; see @ref{Obsolete Macros}, for details. |
| |
| @anchor{AC_CONFIG_COMMANDS} |
| @defmac AC_CONFIG_COMMANDS (@var{tag}@dots{}, @ovar{cmds}, @ovar{init-cmds}) |
| @acindex{CONFIG_COMMANDS} |
| Specify additional shell commands to run at the end of |
| @file{config.status}, and shell commands to initialize any variables |
| from @command{configure}. Associate the commands with @var{tag}. |
| Since typically the @var{cmds} create a file, @var{tag} should |
| naturally be the name of that file. If needed, the directory hosting |
| @var{tag} is created. The @var{tag} should not contain shell |
| metacharacters. @xref{Special Chars in Variables}. |
| This macro is one of the instantiating macros; |
| see @ref{Configuration Actions}. |
| |
| Here is an unrealistic example: |
| @example |
| fubar=42 |
| AC_CONFIG_COMMANDS([fubar], |
| [AS_ECHO(["this is extra $fubar, and so on."])], |
| [fubar=$fubar]) |
| @end example |
| |
| Here is a better one: |
| @example |
| AC_CONFIG_COMMANDS([timestamp], [echo >timestamp]) |
| @end example |
| @end defmac |
| |
| The following two macros look similar, but in fact they are not of the same |
| breed: they are executed directly by @file{configure}, so you cannot use |
| @file{config.status} to rerun them. |
| |
| @c Yet it is good to leave them here. The user sees them together and |
| @c decides which best fits their needs. |
| |
| @defmac AC_CONFIG_COMMANDS_PRE (@var{cmds}) |
| @acindex{CONFIG_COMMANDS_PRE} |
| Execute the @var{cmds} right before creating @file{config.status}. |
| |
| This macro presents the last opportunity to call @code{AC_SUBST}, |
| @code{AC_DEFINE}, or @code{AC_CONFIG_@var{ITEMS}} macros. |
| @end defmac |
| |
| @defmac AC_CONFIG_COMMANDS_POST (@var{cmds}) |
| @acindex{CONFIG_COMMANDS_POST} |
| Execute the @var{cmds} right after creating @file{config.status}. |
| @end defmac |
| |
| |
| |
| |
| @node Configuration Links |
| @section Creating Configuration Links |
| @cindex Configuration links |
| @cindex Links for configuration |
| |
| You may find it convenient to create links whose destinations depend upon |
| results of tests. One can use @code{AC_CONFIG_COMMANDS} but the |
| creation of relative symbolic links can be delicate when the package is |
| built in a directory different from the source directory. |
| |
| @anchor{AC_CONFIG_LINKS} |
| @defmac AC_CONFIG_LINKS (@var{dest}:@var{source}@dots{}, @ovar{cmds}, @ |
| @ovar{init-cmds}) |
| @acindex{CONFIG_LINKS} |
| @cindex Links |
| Make @code{AC_OUTPUT} link each of the existing files @var{source} to |
| the corresponding link name @var{dest}. Makes a symbolic link if |
| possible, otherwise a hard link if possible, otherwise a copy. The |
| @var{dest} and @var{source} names should be relative to the top level |
| source or build directory, and should not contain shell metacharacters. |
| @xref{Special Chars in Variables}. |
| |
| This macro is one of the instantiating |
| macros; see @ref{Configuration Actions}. |
| |
| For example, this call: |
| |
| @example |
| AC_CONFIG_LINKS([host.h:config/$machine.h |
| object.h:config/$obj_format.h]) |
| @end example |
| |
| @noindent |
| creates in the current directory @file{host.h} as a link to |
| @file{@var{srcdir}/config/$machine.h}, and @file{object.h} as a |
| link to @file{@var{srcdir}/config/$obj_format.h}. |
| |
| The tempting value @samp{.} for @var{dest} is invalid: it makes it |
| impossible for @samp{config.status} to guess the links to establish. |
| |
| One can then run: |
| @example |
| ./config.status host.h object.h |
| @end example |
| @noindent |
| to create the links. |
| @end defmac |
| |
| |
| |
| @node Subdirectories |
| @section Configuring Other Packages in Subdirectories |
| @cindex Configure subdirectories |
| @cindex Subdirectory configure |
| |
| In most situations, calling @code{AC_OUTPUT} is sufficient to produce |
| makefiles in subdirectories. However, @command{configure} scripts |
| that control more than one independent package can use |
| @code{AC_CONFIG_SUBDIRS} to run @command{configure} scripts for other |
| packages in subdirectories. |
| |
| @defmac AC_CONFIG_SUBDIRS (@var{dir} @dots{}) |
| @acindex{CONFIG_SUBDIRS} |
| @ovindex subdirs |
| Make @code{AC_OUTPUT} run @command{configure} in each subdirectory |
| @var{dir} in the given blank-or-newline-separated list. Each @var{dir} should |
| be a literal, i.e., please do not use: |
| |
| @example |
| @c If you change this example, adjust tests/torture.at:Non-literal AC_CONFIG_SUBDIRS. |
| if test "x$package_foo_enabled" = xyes; then |
| my_subdirs="$my_subdirs foo" |
| fi |
| AC_CONFIG_SUBDIRS([$my_subdirs]) |
| @end example |
| |
| @noindent |
| because this prevents @samp{./configure --help=recursive} from |
| displaying the options of the package @code{foo}. Instead, you should |
| write: |
| |
| @example |
| AS_IF([test "x$package_foo_enabled" = xyes], |
| [AC_CONFIG_SUBDIRS([foo])]) |
| @end example |
| |
| If a given @var{dir} is not found at @command{configure} run time, a |
| warning is reported; if the subdirectory is optional, write: |
| |
| @example |
| AS_IF([test -d "$srcdir/foo"], |
| [AC_CONFIG_SUBDIRS([foo])]) |
| @end example |
| |
| These examples use @code{AS_IF} instead of ordinary shell @code{if} to |
| avoid problems that Autoconf has with macro calls in shell conditionals |
| outside macro definitions. @xref{Common Shell Constructs}. |
| |
| If a given @var{dir} contains @command{configure.gnu}, it is run instead |
| of @command{configure}. This is for packages that might use a |
| non-Autoconf script @command{Configure}, which can't be called through a |
| wrapper @command{configure} since it would be the same file on |
| case-insensitive file systems. |
| |
| The subdirectory @command{configure} scripts are given the same command |
| line options that were given to this @command{configure} script, with minor |
| changes if needed, which include: |
| |
| @itemize @minus |
| @item |
| adjusting a relative name for the cache file; |
| |
| @item |
| adjusting a relative name for the source directory; |
| |
| @item |
| propagating the current value of @code{$prefix}, including if it was |
| defaulted, and if the default values of the top level and of the subdirectory |
| @file{configure} differ. |
| @end itemize |
| |
| This macro also sets the output variable @code{subdirs} to the list of |
| directories @samp{@var{dir} @dots{}}. Make rules can use |
| this variable to determine which subdirectories to recurse into. |
| |
| This macro may be called multiple times. |
| @end defmac |
| |
| @node Default Prefix |
| @section Default Prefix |
| @cindex Install prefix |
| @cindex Prefix for install |
| |
| By default, @command{configure} sets the prefix for files it installs to |
| @file{/usr/local}. The user of @command{configure} can select a different |
| prefix using the @option{--prefix} and @option{--exec-prefix} options. |
| There are two ways to change the default: when creating |
| @command{configure}, and when running it. |
| |
| Some software packages might want to install in a directory other than |
| @file{/usr/local} by default. To accomplish that, use the |
| @code{AC_PREFIX_DEFAULT} macro. |
| |
| @defmac AC_PREFIX_DEFAULT (@var{prefix}) |
| @acindex{PREFIX_DEFAULT} |
| Set the default installation prefix to @var{prefix} instead of |
| @file{/usr/local}. |
| @end defmac |
| |
| It may be convenient for users to have @command{configure} guess the |
| installation prefix from the location of a related program that they |
| have already installed. If you wish to do that, you can call |
| @code{AC_PREFIX_PROGRAM}. |
| |
| @anchor{AC_PREFIX_PROGRAM} |
| @defmac AC_PREFIX_PROGRAM (@var{program}) |
| @acindex{PREFIX_PROGRAM} |
| If the user did not specify an installation prefix (using the |
| @option{--prefix} option), guess a value for it by looking for |
| @var{program} in @env{PATH}, the way the shell does. If @var{program} |
| is found, set the prefix to the parent of the directory containing |
| @var{program}, else default the prefix as described above |
| (@file{/usr/local} or @code{AC_PREFIX_DEFAULT}). For example, if |
| @var{program} is @code{gcc} and the @env{PATH} contains |
| @file{/usr/local/gnu/bin/gcc}, set the prefix to @file{/usr/local/gnu}. |
| @end defmac |
| |
| |
| |
| @c ======================================================== Existing tests |
| |
| @node Existing Tests |
| @chapter Existing Tests |
| |
| These macros test for particular system features that packages might |
| need or want to use. If you need to test for a kind of feature that |
| none of these macros check for, you can probably do it by calling |
| primitive test macros with appropriate arguments (@pxref{Writing |
| Tests}). |
| |
| These tests print messages telling the user which feature they're |
| checking for, and what they find. They cache their results for future |
| @command{configure} runs (@pxref{Caching Results}). |
| |
| Some of these macros set output variables. @xref{Makefile |
| Substitutions}, for how to get their values. The phrase ``define |
| @var{name}'' is used below as a shorthand to mean ``define the C |
| preprocessor symbol @var{name} to the value 1''. @xref{Defining |
| Symbols}, for how to get those symbol definitions into your program. |
| |
| @menu |
| * Common Behavior:: Macros' standard schemes |
| * Alternative Programs:: Selecting between alternative programs |
| * Files:: Checking for the existence of files |
| * Libraries:: Library archives that might be missing |
| * Library Functions:: C library functions that might be missing |
| * Header Files:: Header files that might be missing |
| * Declarations:: Declarations that may be missing |
| * Structures:: Structures or members that might be missing |
| * Types:: Types that might be missing |
| * Compilers and Preprocessors:: Checking for compiling programs |
| * System Services:: Operating system services |
| * C and POSIX Variants:: Kludges for C and POSIX variants |
| * Erlang Libraries:: Checking for the existence of Erlang libraries |
| @end menu |
| |
| @node Common Behavior |
| @section Common Behavior |
| @cindex Common autoconf behavior |
| |
| Much effort has been expended to make Autoconf easy to learn. The most |
| obvious way to reach this goal is simply to enforce standard interfaces |
| and behaviors, avoiding exceptions as much as possible. Because of |
| history and inertia, unfortunately, there are still too many exceptions |
| in Autoconf; nevertheless, this section describes some of the common |
| rules. |
| |
| @menu |
| * Standard Symbols:: Symbols defined by the macros |
| * Default Includes:: Includes used by the generic macros |
| @end menu |
| |
| @node Standard Symbols |
| @subsection Standard Symbols |
| @cindex Standard symbols |
| |
| All the generic macros that @code{AC_DEFINE} a symbol as a result of |
| their test transform their @var{argument} values to a standard alphabet. |
| First, @var{argument} is converted to upper case and any asterisks |
| (@samp{*}) are each converted to @samp{P}. Any remaining characters |
| that are not alphanumeric are converted to underscores. |
| |
| For instance, |
| |
| @example |
| AC_CHECK_TYPES([struct $Expensive*]) |
| @end example |
| |
| @noindent |
| defines the symbol @samp{HAVE_STRUCT__EXPENSIVEP} if the check |
| succeeds. |
| |
| |
| @node Default Includes |
| @subsection Default Includes |
| @cindex Default includes |
| @cindex Includes, default |
| @hdrindex{assert.h} |
| @hdrindex{ctype.h} |
| @hdrindex{errno.h} |
| @hdrindex{float.h} |
| @hdrindex{iso646.h} |
| @hdrindex{limits.h} |
| @hdrindex{locale.h} |
| @hdrindex{math.h} |
| @hdrindex{setjmp.h} |
| @hdrindex{signal.h} |
| @hdrindex{stdarg.h} |
| @hdrindex{stddef.h} |
| @hdrindex{stdio.h} |
| @hdrindex{stdlib.h} |
| @hdrindex{string.h} |
| @hdrindex{time.h} |
| @hdrindex{wchar.h} |
| @hdrindex{wctype.h} |
| |
| Test programs frequently need to include headers that may or may not be |
| available on the system whose features are being tested. Each test can |
| use all the preprocessor macros that have been @code{AC_DEFINE}d by |
| previous tests, so for example one may write |
| |
| @example |
| @group |
| #include <time.h> |
| #ifdef HAVE_SYS_TIME_H |
| # include <sys/time.h> |
| #endif |
| @end group |
| @end example |
| |
| @noindent |
| if @file{sys/time.h} has already been tested for. |
| |
| All hosted environments that are still of interest for portable code |
| provide all of the headers specified in C89 (as amended in 1995): |
| @file{assert.h}, @file{ctype.h}, @file{errno.h}, @file{float.h}, |
| @file{iso646.h}, @file{limits.h}, @file{locale.h}, @file{math.h}, |
| @file{setjmp.h}, @file{signal.h}, @file{stdarg.h}, @file{stddef.h}, |
| @file{stdio.h}, @file{stdlib.h}, @file{string.h}, @file{time.h}, |
| @file{wchar.h}, and @file{wctype.h}. Most programs can safely include |
| these headers unconditionally. A program not intended to be portable to |
| C89 can also safely include the C99-specified header @file{stdbool.h}. |
| Other headers, including headers from C99 and later revisions of the C |
| standard, might need to be tested for (@pxref{Header Files}) or their |
| bugs may need to be worked around (@pxref{Gnulib}). |
| |
| If your program needs to be portable to a @emph{freestanding} |
| environment, such as an embedded OS that doesn't provide all of the |
| facilities of the C89 standard library, you may need to test for some of |
| the above headers as well. Note that many Autoconf macros internally |
| assume that the complete set of C89 headers are available. |
| |
| Most generic macros use the following macro to provide a default set |
| of includes: |
| |
| @defmac AC_INCLUDES_DEFAULT (@ovar{include-directives}) |
| @acindex{INCLUDES_DEFAULT} |
| Expand to @var{include-directives} if present and nonempty, otherwise to: |
| |
| @example |
| @group |
| #include <stddef.h> |
| #ifdef HAVE_STDIO_H |
| # include <stdio.h> |
| #endif |
| #ifdef HAVE_STDLIB_H |
| # include <stdlib.h> |
| #endif |
| #ifdef HAVE_STRING_H |
| # include <string.h> |
| #endif |
| #ifdef HAVE_INTTYPES_H |
| # include <inttypes.h> |
| #endif |
| #ifdef HAVE_STDINT_H |
| # include <stdint.h> |
| #endif |
| #ifdef HAVE_STRINGS_H |
| # include <strings.h> |
| #endif |
| #ifdef HAVE_SYS_TYPES_H |
| # include <sys/types.h> |
| #endif |
| #ifdef HAVE_SYS_STAT_H |
| # include <sys/stat.h> |
| #endif |
| #ifdef HAVE_UNISTD_H |
| # include <unistd.h> |
| #endif |
| @end group |
| @end example |
| |
| Using this macro without @var{include-directives} has the side effect of |
| checking for @file{stdio.h}, @file{stdlib.h}, @file{string.h}, |
| @file{inttypes.h}, @file{stdint.h}, @file{strings.h}, |
| @file{sys/types.h}, @file{sys/stat.h}, and @file{unistd.h}, as if by |
| @code{AC_CHECK_HEADERS_ONCE}. For backward compatibility, the macro |
| @code{STDC_HEADERS} will be defined when both @file{stdlib.h} and |
| @file{string.h} are available. |
| |
| @strong{Portability Note:} It is safe for most programs to assume the |
| presence of all of the headers required by the original 1990 C standard. |
| @code{AC_INCLUDES_DEFAULT} checks for @file{stdio.h}, @file{stdlib.h}, |
| and @file{string.h}, even though they are in that list, because they |
| might not be available when compiling for a ``freestanding environment'' |
| (in which most of the features of the C library are optional). You |
| probably do not need to write @samp{#ifdef HAVE_STDIO_H} in your own |
| code. |
| |
| @file{inttypes.h} and @file{stdint.h} were added to C in the 1999 |
| revision of the standard, and @file{strings.h}, @file{sys/types.h}, |
| @file{sys/stat.h}, and @file{unistd.h} are POSIX extensions. You |
| @emph{should} guard uses of these headers with appropriate conditionals. |
| @end defmac |
| |
| @defmac AC_CHECK_INCLUDES_DEFAULT |
| @acindex{CHECK_INCLUDES_DEFAULT} |
| Check for all the headers that @code{AC_INCLUDES_DEFAULT} would check |
| for as a side-effect, if this has not already happened. |
| |
| This macro mainly exists so that @code{autoupdate} can replace certain |
| obsolete constructs with it. You should not need to use it yourself; in |
| fact, it is likely to be safe to delete it from any script in which it |
| appears. (@code{autoupdate} does not know whether preprocessor macros |
| such as @code{HAVE_STDINT_H} are used in the program, nor whether they |
| would get defined as a side-effect of other checks.) |
| @end defmac |
| |
| @node Alternative Programs |
| @section Alternative Programs |
| @cindex Programs, checking |
| |
| These macros check for the presence or behavior of particular programs. |
| They are used to choose between several alternative programs and to |
| decide what to do once one has been chosen. If there is no macro |
| specifically defined to check for a program you need, and you don't need |
| to check for any special properties of it, then you can use one of the |
| general program-check macros. |
| |
| @menu |
| * Particular Programs:: Special handling to find certain programs |
| * Generic Programs:: How to find other programs |
| @end menu |
| |
| @node Particular Programs |
| @subsection Particular Program Checks |
| |
| These macros check for particular programs---whether they exist, and |
| in some cases whether they support certain features. |
| |
| @defmac AC_PROG_AR |
| @acindex{PROG_AR} |
| @ovindex AR |
| @c @caindex prog_AR |
| @c @caindex prog_ac_ct_AR |
| Set output variable @code{AR} to @samp{ar} if @code{ar} is found, and |
| otherwise to @samp{:} (do nothing). |
| @end defmac |
| |
| @defmac AC_PROG_AWK |
| @acindex{PROG_AWK} |
| @ovindex AWK |
| @caindex prog_AWK |
| Check for the commands @command{gawk}, @command{mawk}, |
| @command{nawk}, @command{awk}, and @code{busybox awk}, in that |
| order, and set output variable @code{AWK} to the first one that is found. |
| Try @code{gawk} first because that is reported to be the |
| best implementation. The result can be overridden by setting the |
| variable @code{AWK} or the cache variable @code{ac_cv_prog_AWK}. |
| |
| Using this macro avoids some pitfalls of older systems that have both |
| traditional @command{awk} (@pxref{awk, , Limitations of Usual Tools}) |
| and better alternatives like @command{gawk}. |
| It also can help port to stripped-down systems that have only |
| @code{busybox awk}, although these systems could well have problems |
| with other build components that use plain @command{awk}. |
| @end defmac |
| |
| @defmac AC_PROG_GREP |
| @acindex{PROG_GREP} |
| @ovindex GREP |
| @caindex prog_GREP |
| Look for the best available @code{grep} or @code{ggrep} that accepts the |
| longest input lines possible, and that supports multiple @option{-e} options. |
| Set the output variable @code{GREP} to whatever is chosen. |
| @xref{grep, , Limitations of Usual Tools}, for more information about |
| portability problems with the @command{grep} command family. The result |
| can be overridden by setting the @code{GREP} variable and is cached in the |
| @code{ac_cv_path_GREP} variable. |
| @end defmac |
| |
| @defmac AC_PROG_EGREP |
| @acindex{PROG_EGREP} |
| @ovindex EGREP |
| @caindex prog_EGREP |
| Check whether @code{$GREP -E} works, or else look for the best available |
| @code{egrep} or @code{gegrep} that accepts the longest input lines possible. |
| Set the output variable @code{EGREP} to whatever is chosen. The result |
| can be overridden by setting the @code{EGREP} variable and is cached in the |
| @code{ac_cv_path_EGREP} variable. |
| @end defmac |
| |
| @defmac AC_PROG_FGREP |
| @acindex{PROG_FGREP} |
| @ovindex FGREP |
| @caindex prog_FGREP |
| Check whether @code{$GREP -F} works, or else look for the best available |
| @code{fgrep} or @code{gfgrep} that accepts the longest input lines possible. |
| Set the output variable @code{FGREP} to whatever is chosen. The result |
| can be overridden by setting the @code{FGREP} variable and is cached in the |
| @code{ac_cv_path_FGREP} variable. |
| @end defmac |
| |
| @defmac AC_PROG_INSTALL |
| @acindex{PROG_INSTALL} |
| @ovindex INSTALL |
| @ovindex INSTALL_PROGRAM |
| @ovindex INSTALL_DATA |
| @ovindex INSTALL_SCRIPT |
| @caindex path_install |
| @prindex @command{install-sh} |
| Set output variable @code{INSTALL} to the name of a BSD-compatible |
| @command{install} program, if one is found in the current @env{PATH}. |
| Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c}, |
| checking the directories specified to @code{AC_CONFIG_AUX_DIR} (or its |
| default directories) to determine @var{dir} (@pxref{Output}). Also set |
| the variables @code{INSTALL_PROGRAM} and @code{INSTALL_SCRIPT} to |
| @samp{$@{INSTALL@}} and @code{INSTALL_DATA} to @samp{$@{INSTALL@} -m 644}. |
| |
| @samp{@@INSTALL@@} is special, as its value may vary for different |
| configuration files. |
| |
| This macro screens out various instances of @command{install} known not to |
| work. It prefers to find a C program rather than a shell script, for |
| speed. Instead of @file{install-sh}, it can also use @file{install.sh}, |
| but that name is obsolete because some @command{make} programs have a rule |
| that creates @file{install} from it if there is no makefile. Further, this |
| macro requires @command{install} to be able to install multiple files into a |
| target directory in a single invocation. |
| |
| Autoconf comes with a copy of @file{install-sh} that you can use. |
| If you use @code{AC_PROG_INSTALL}, you must include @file{install-sh} in |
| your distribution; otherwise @command{autoreconf} and @command{configure} |
| will produce an error message saying they can't find it---even if the |
| system you're on has a good @command{install} program. This check is a |
| safety measure to prevent you from accidentally leaving that file out, |
| which would prevent your package from installing on systems that don't |
| have a BSD-compatible @command{install} program. |
| |
| If you need to use your own installation program because it has features |
| not found in standard @command{install} programs, there is no reason to use |
| @code{AC_PROG_INSTALL}; just put the file name of your program into your |
| @file{Makefile.in} files. |
| |
| The result of the test can be overridden by setting the variable |
| @code{INSTALL} or the cache variable @code{ac_cv_path_install}. |
| @end defmac |
| |
| @defmac AC_PROG_MKDIR_P |
| @acindex{PROG_MKDIR_P} |
| @ovindex MKDIR_P |
| @caindex path_mkdir |
| @prindex @command{install-sh} |
| Set output variable @code{MKDIR_P} to a program that ensures that for |
| each argument, a directory named by this argument exists, creating it |
| and its parent directories if needed, and without race conditions when |
| two instances of the program attempt to make the same directory at |
| nearly the same time. |
| |
| This macro uses the equivalent of the @samp{mkdir -p} command. Ancient |
| versions of @command{mkdir} are vulnerable to race conditions, so if you |
| want to support parallel installs from different packages into the same |
| directory you should use a non-ancient @command{mkdir}. |
| |
| This macro is related to the @code{AS_MKDIR_P} macro (@pxref{Programming |
| in M4sh}), but it sets an output variable intended for use in other |
| files, whereas @code{AS_MKDIR_P} is intended for use in scripts like |
| @command{configure}. Also, @code{AS_MKDIR_P} does not accept options, |
| but @code{MKDIR_P} supports the @option{-m} option, e.g., a makefile |
| might invoke @code{$(MKDIR_P) -m 0 dir} to create an inaccessible |
| directory, and conversely a makefile should use @code{$(MKDIR_P) -- |
| $(FOO)} if @var{FOO} might yield a value that begins with @samp{-}. |
| |
| The result of the test can be overridden by setting the variable |
| @code{MKDIR_P} or the cache variable @code{ac_cv_path_mkdir}. |
| @end defmac |
| |
| @anchor{AC_PROG_LEX} |
| @defmac AC_PROG_LEX (@var{options}) |
| @acindex{PROG_LEX} |
| @ovindex LEX |
| @ovindex LEXLIB |
| @cvindex YYTEXT_POINTER |
| @ovindex LEX_OUTPUT_ROOT |
| @caindex prog_LEX |
| Search for a lexical analyzer generator, preferring @code{flex} |
| to plain @code{lex}. Output variable @code{LEX} is set to whichever |
| program is available. If neither program is available, @code{LEX} |
| is set to @samp{:}; |
| for packages that ship the generated @file{file.yy.c} |
| alongside the source @file{file.l}, this default allows users without a |
| lexer generator to still build the package even if the timestamp for |
| @file{file.l} is inadvertently changed. |
| |
| The name of the program to use can be overridden by setting the |
| output variable @code{LEX} or the cache variable @code{ac_cv_prog_LEX} |
| when running @command{configure}. |
| |
| If a lexical analyzer generator is found, this macro performs additional |
| checks for common portability pitfalls. If these additional checks |
| fail, @code{LEX} is reset to @samp{:}; otherwise the following |
| additional macros and variables are provided. |
| |
| Preprocessor macro @code{YYTEXT_POINTER} is defined if the lexer |
| skeleton, by default, declares @code{yytext} as a @samp{@w{char *}} |
| rather than a @samp{@w{char []}}. |
| |
| Output variable @code{LEX_OUTPUT_ROOT} is set to the base of the file |
| name that the lexer generates; this is usually either @file{lex.yy} or |
| @file{lexyy}. |
| |
| If generated lexers need a library to work, output variable |
| @code{LEXLIB} is set to a link option for that library (e.g., |
| @option{-ll}), otherwise it is set to empty. |
| |
| The @var{options} argument modifies the behavior of @code{AC_PROG_LEX}. |
| It should be a whitespace-separated list of options. Currently there |
| are only two options, and they are mutually exclusive: |
| |
| @table @code |
| @item yywrap |
| Indicate that the library in @code{LEXLIB} needs to define the function |
| @code{yywrap}. If a library that defines this function cannot be found, |
| @code{LEX} will be reset to @samp{:}. |
| |
| @item noyywrap |
| Indicate that the library in @code{LEXLIB} does not need to define the |
| function @code{yywrap}. @command{configure} will not search for it at |
| all. |
| @end table |
| |
| Prior to Autoconf 2.70, @code{AC_PROG_LEX} did not take any arguments, |
| and its behavior was different from either of the above possibilities: |
| it would search for a library that defines @code{yywrap}, and would set |
| @code{LEXLIB} to that library if it finds one. However, if a library |
| that defines this function could not be found, @code{LEXLIB} would be |
| left empty and @code{LEX} would @emph{not} be reset. This behavior was |
| due to a bug, but several packages came to depend on it, so |
| @code{AC_PROG_LEX} still does this if neither the @code{yywrap} nor the |
| @code{noyywrap} option is given. |
| |
| Usage of @code{AC_PROG_LEX} without choosing one of the @code{yywrap} |
| or @code{noyywrap} options is deprecated. It is usually better to |
| use @code{noyywrap} and define the @code{yywrap} function yourself, |
| as this almost always renders the @code{LEXLIB} unnecessary. |
| |
| @strong{Caution:} As a side-effect of the test, this macro may delete |
| any file in the configure script's current working directory named |
| @file{lex.yy.c} or @file{lexyy.c}. |
| |
| @strong{Caution:} Packages that ship a generated @file{lex.yy.c} |
| cannot assume that the definition of @code{YYTEXT_POINTER} matches |
| the code in that file. They also cannot assume that @code{LEXLIB} |
| provides the library routines required by the code in that file. |
| |
| If you use Flex to generate @file{lex.yy.c}, you can work around these |
| limitations by defining @code{yywrap} and @code{main} yourself |
| (rendering @code{-lfl} unnecessary), and by using either the |
| @option{--array} or @option{--pointer} options to control how |
| @code{yytext} is declared. The code generated by Flex is also more |
| portable than the code generated by historical versions of Lex. |
| |
| If you have used Flex to generate @file{lex.yy.c}, and especially if |
| your scanner depends on Flex features, we recommend you use this |
| Autoconf snippet to prevent the scanner being regenerated with |
| historical Lex: |
| |
| @example |
| AC_PROG_LEX |
| AS_IF([test "x$LEX" != xflex], |
| [LEX="$SHELL $missing_dir/missing flex" |
| AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy]) |
| AC_SUBST([LEXLIB], [''])]) |
| @end example |
| |
| The shell script @command{missing} can be found in the Automake |
| distribution. |
| |
| Remember that the user may have supplied an alternate location in |
| @env{LEX}, so if Flex is required, it is better to check that the user |
| provided something sufficient by parsing the output of @samp{$LEX |
| --version} than by simply relying on @code{test "x$LEX" = xflex}. |
| @end defmac |
| |
| @anchor{AC_PROG_LN_S} |
| @defmac AC_PROG_LN_S |
| @acindex{PROG_LN_S} |
| @ovindex LN_S |
| If @samp{ln -s} works on the current file system (the operating system |
| and file system support symbolic links), set the output variable |
| @code{LN_S} to @samp{ln -s}; otherwise, if @samp{ln} works, set |
| @code{LN_S} to @samp{ln}, and otherwise set it to @samp{cp -pR}. |
| |
| If you make a link in a directory other than the current directory, its |
| meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely |
| create links using @samp{$(LN_S)}, either find out which form is used |
| and adjust the arguments, or always invoke @code{ln} in the directory |
| where the link is to be created. |
| |
| In other words, it does not work to do: |
| @example |
| $(LN_S) foo /x/bar |
| @end example |
| |
| Instead, do: |
| |
| @example |
| (cd /x && $(LN_S) foo bar) |
| @end example |
| @end defmac |
| |
| @defmac AC_PROG_RANLIB |
| @acindex{PROG_RANLIB} |
| @ovindex RANLIB |
| @c @caindex prog_RANLIB |
| @c @caindex prog_ac_ct_RANLIB |
| Set output variable @code{RANLIB} to @samp{ranlib} if @code{ranlib} |
| is found, and otherwise to @samp{:} (do nothing). |
| @end defmac |
| |
| @defmac AC_PROG_SED |
| @acindex{PROG_SED} |
| @ovindex SED |
| @caindex path_SED |
| Set output variable @code{SED} to a Sed implementation that conforms to |
| POSIX and does not have arbitrary length limits. Report an error if no |
| acceptable Sed is found. @xref{sed, , Limitations of Usual Tools}, for more |
| information about portability problems with Sed. |
| |
| The result of this test can be overridden by setting the @code{SED} variable |
| and is cached in the @code{ac_cv_path_SED} variable. |
| @end defmac |
| |
| @defmac AC_PROG_YACC |
| @acindex{PROG_YACC} |
| @evindex YACC |
| @evindex YFLAGS |
| @ovindex YACC |
| @caindex prog_YACC |
| If @code{bison} is found, set output variable @code{YACC} to @samp{bison |
| -y}. Otherwise, if @code{byacc} is found, set @code{YACC} to |
| @samp{byacc}. Otherwise set @code{YACC} to @samp{yacc}. |
| The result of this test can be influenced by setting the variable |
| @code{YACC} or the cache variable @code{ac_cv_prog_YACC}. |
| @end defmac |
| |
| @node Generic Programs |
| @subsection Generic Program and File Checks |
| |
| These macros are used to find programs not covered by the ``particular'' |
| test macros. If you need to check the behavior of a program as well as |
| find out whether it is present, you have to write your own test for it |
| (@pxref{Writing Tests}). By default, these macros use the environment |
| variable @env{PATH}. If you need to check for a program that might not |
| be in the user's @env{PATH}, you can pass a modified path to use |
| instead, like this: |
| |
| @example |
| AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd], |
| [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl |
| [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc]) |
| @end example |
| |
| You are strongly encouraged to declare the @var{variable} passed to |
| @code{AC_CHECK_PROG} etc.@: as precious. @xref{Setting Output Variables}, |
| @code{AC_ARG_VAR}, for more details. |
| |
| @anchor{AC_CHECK_PROG} |
| @defmac AC_CHECK_PROG (@var{variable}, @var{prog-to-check-for}, @ |
| @var{value-if-found}, @ovar{value-if-not-found}, @dvar{path, $PATH}, @ |
| @ovar{reject}) |
| @acindex{CHECK_PROG} |
| @caindex prog_@var{variable} |
| Check whether program @var{prog-to-check-for} exists in @var{path}. If |
| it is found, set @var{variable} to @var{value-if-found}, otherwise to |
| @var{value-if-not-found}, if given. Always pass over @var{reject} (an |
| absolute file name) even if it is the first found in the search path; in |
| that case, set @var{variable} using the absolute file name of the |
| @var{prog-to-check-for} found that is not @var{reject}. If |
| @var{variable} was already set, do nothing. Calls @code{AC_SUBST} for |
| @var{variable}. The result of this test can be overridden by setting the |
| @var{variable} variable or the cache variable |
| @code{ac_cv_prog_@var{variable}}. |
| @end defmac |
| |
| @anchor{AC_CHECK_PROGS} |
| @defmac AC_CHECK_PROGS (@var{variable}, @var{progs-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{CHECK_PROGS} |
| @caindex prog_@var{variable} |
| Check for each program in the blank-separated list |
| @var{progs-to-check-for} existing in the @var{path}. If one is found, set |
| @var{variable} to the name of that program. Otherwise, continue |
| checking the next program in the list. If none of the programs in the |
| list are found, set @var{variable} to @var{value-if-not-found}; if |
| @var{value-if-not-found} is not specified, the value of @var{variable} |
| is not changed. Calls @code{AC_SUBST} for @var{variable}. The result of |
| this test can be overridden by setting the @var{variable} variable or the |
| cache variable @code{ac_cv_prog_@var{variable}}. |
| @end defmac |
| |
| @defmac AC_CHECK_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{CHECK_TARGET_TOOL} |
| Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for} |
| with a prefix of the target type as determined by |
| @code{AC_CANONICAL_TARGET}, followed by a dash (@pxref{Canonicalizing}). |
| If the tool cannot be found with a prefix, and if the build and target |
| types are equal, then it is also searched for without a prefix. |
| |
| As noted in @ref{Specifying Target Triplets}, the |
| target is rarely specified, because most of the time it is the same |
| as the host: it is the type of system for which any compiler tool in |
| the package produces code. What this macro looks for is, |
| for example, @emph{a tool @r{(assembler, linker, etc.)}@: that the |
| compiler driver @r{(@command{gcc} for the GNU C Compiler)} |
| uses to produce objects, archives or executables}. |
| @end defmac |
| |
| @defmac AC_CHECK_TOOL (@var{variable}, @var{prog-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{CHECK_TOOL} |
| @c @caindex prog_@var{VARIABLE} |
| @c @caindex prog_ac_ct_@var{VARIABLE} |
| Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for} |
| with a prefix of the host type as specified by @option{--host}, followed by a |
| dash. For example, if the user runs |
| @samp{configure --build=x86_64-gnu --host=aarch64-linux-gnu}, then this call: |
| @example |
| AC_CHECK_TOOL([RANLIB], [ranlib], [:]) |
| @end example |
| @noindent |
| sets @code{RANLIB} to @file{aarch64-linux-gnu-ranlib} if that program exists in |
| @var{path}, or otherwise to @samp{ranlib} if that program exists in |
| @var{path}, or to @samp{:} if neither program exists. |
| |
| When cross-compiling, this macro will issue a warning if no program |
| prefixed with the host type could be found. |
| For more information, see @ref{Specifying Target Triplets}. |
| @end defmac |
| |
| @defmac AC_CHECK_TARGET_TOOLS (@var{variable}, @var{progs-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{CHECK_TARGET_TOOLS} |
| Like @code{AC_CHECK_TARGET_TOOL}, each of the tools in the list |
| @var{progs-to-check-for} are checked with a prefix of the target type as |
| determined by @code{AC_CANONICAL_TARGET}, followed by a dash |
| (@pxref{Canonicalizing}). If none of the tools can be found with a |
| prefix, and if the build and target types are equal, then the first one |
| without a prefix is used. If a tool is found, set @var{variable} to |
| the name of that program. If none of the tools in the list are found, |
| set @var{variable} to @var{value-if-not-found}; if @var{value-if-not-found} |
| is not specified, the value of @var{variable} is not changed. Calls |
| @code{AC_SUBST} for @var{variable}. |
| @end defmac |
| |
| @defmac AC_CHECK_TOOLS (@var{variable}, @var{progs-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{CHECK_TOOLS} |
| Like @code{AC_CHECK_TOOL}, each of the tools in the list |
| @var{progs-to-check-for} are checked with a prefix of the host type as |
| determined by @code{AC_CANONICAL_HOST}, followed by a dash |
| (@pxref{Canonicalizing}). If none of the tools can be found with a |
| prefix, then the first one without a prefix is used. If a tool is found, |
| set @var{variable} to the name of that program. If none of the tools in |
| the list are found, set @var{variable} to @var{value-if-not-found}; if |
| @var{value-if-not-found} is not specified, the value of @var{variable} |
| is not changed. Calls @code{AC_SUBST} for @var{variable}. |
| |
| When cross-compiling, this macro will issue a warning if no program |
| prefixed with the host type could be found. |
| For more information, see @ref{Specifying Target Triplets}. |
| @end defmac |
| |
| @anchor{AC_PATH_PROG} |
| @defmac AC_PATH_PROG (@var{variable}, @var{prog-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{PATH_PROG} |
| @caindex path_@var{variable} |
| Like @code{AC_CHECK_PROG}, but set @var{variable} to the absolute |
| name of @var{prog-to-check-for} if found. The result of this test |
| can be overridden by setting the @var{variable} variable. A positive |
| result of this test is cached in the @code{ac_cv_path_@var{variable}} |
| variable. |
| @end defmac |
| |
| @anchor{AC_PATH_PROGS} |
| @defmac AC_PATH_PROGS (@var{variable}, @var{progs-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{PATH_PROGS} |
| @caindex path_@var{variable} |
| Like @code{AC_CHECK_PROGS}, but if any of @var{progs-to-check-for} |
| are found, set @var{variable} to the absolute name of the program |
| found. The result of this test can be overridden by setting the |
| @var{variable} variable. A positive result of this test is cached in |
| the @code{ac_cv_path_@var{variable}} variable. |
| @end defmac |
| |
| @defmac AC_PATH_PROGS_FEATURE_CHECK (@var{variable}, @ |
| @var{progs-to-check-for}, @var{feature-test}, @ |
| @ovar{action-if-not-found}, @dvar{path, $PATH}) |
| @acindex{PATH_PROGS_FEATURE_CHECK} |
| @caindex path_@var{variable} |
| @vrindex ac_path_@var{variable} |
| @vrindex ac_path_@var{variable}_found |
| This macro was introduced in Autoconf 2.62. If @var{variable} is not |
| empty, then set the cache variable @code{ac_cv_path_@var{variable}} to |
| its value. Otherwise, check for each program in the blank-separated |
| list @var{progs-to-check-for} existing in @var{path}. For each program |
| found, execute @var{feature-test} with @code{ac_path_@var{variable}} |
| set to the absolute name of the candidate program. If no invocation of |
| @var{feature-test} sets the shell variable |
| @code{ac_cv_path_@var{variable}}, then @var{action-if-not-found} is |
| executed. @var{feature-test} will be run even when |
| @code{ac_cv_path_@var{variable}} is set, to provide the ability to |
| choose a better candidate found later in @var{path}; to accept the |
| current setting and bypass all further checks, @var{feature-test} can |
| execute @code{ac_path_@var{variable}_found=:}. |
| |
| Note that this macro has some subtle differences from |
| @code{AC_CHECK_PROGS}. It is designed to be run inside |
| @code{AC_CACHE_VAL}, therefore, it should have no side effects. In |
| particular, @var{variable} is not set to the final value of |
| @code{ac_cv_path_@var{variable}}, nor is @code{AC_SUBST} automatically |
| run. Also, on failure, any action can be performed, whereas |
| @code{AC_CHECK_PROGS} only performs |
| @code{@var{variable}=@var{value-if-not-found}}. |
| |
| Here is an example that searches for an implementation of @command{m4} that |
| supports the @code{indir} builtin, even if it goes by the name |
| @command{gm4} or is not the first implementation on @env{PATH}. |
| |
| @example |
| AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4], |
| [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4], |
| [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4` |
| test "x$m4out" = x0 \ |
| && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]], |
| [AC_MSG_ERROR([could not find m4 that supports indir])])]) |
| AC_SUBST([M4], [$ac_cv_path_M4]) |
| @end example |
| @end defmac |
| |
| @defmac AC_PATH_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{PATH_TARGET_TOOL} |
| Like @code{AC_CHECK_TARGET_TOOL}, but set @var{variable} to the absolute |
| name of the program if it is found. |
| @end defmac |
| |
| @defmac AC_PATH_TOOL (@var{variable}, @var{prog-to-check-for}, @ |
| @ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{PATH_TOOL} |
| Like @code{AC_CHECK_TOOL}, but set @var{variable} to the absolute |
| name of the program if it is found. |
| |
| When cross-compiling, this macro will issue a warning if no program |
| prefixed with the host type could be found. |
| For more information, see @ref{Specifying Target Triplets}. |
| @end defmac |
| |
| |
| @node Files |
| @section Files |
| @cindex File, checking |
| |
| You might also need to check for the existence of files. Before using |
| these macros, ask yourself whether a runtime test might not be a better |
| solution. Be aware that, like most Autoconf macros, they test a feature |
| of the host machine, and therefore, they die when cross-compiling. |
| |
| @defmac AC_CHECK_FILE (@var{file}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{CHECK_FILE} |
| @caindex file_@var{file} |
| Check whether file @var{file} exists on the native system. If it is |
| found, execute @var{action-if-found}, otherwise do |
| @var{action-if-not-found}, if given. Cache the result of this test |
| in the @code{ac_cv_file_@var{file}} variable, with characters not |
| suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| @defmac AC_CHECK_FILES (@var{files}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{CHECK_FILES} |
| @caindex file_@var{file} |
| For each file listed in @var{files}, execute @code{AC_CHECK_FILE} |
| and perform either @var{action-if-found} or @var{action-if-not-found}. |
| Like @code{AC_CHECK_FILE}, this defines @samp{HAVE_@var{file}} |
| (@pxref{Standard Symbols}) for each file found and caches the results of |
| each test in the @code{ac_cv_file_@var{file}} variable, with characters |
| not suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| |
| @node Libraries |
| @section Library Files |
| @cindex Library, checking |
| |
| The following macros check for the presence of certain C, C++, Fortran, |
| or Go library archive files. |
| |
| @anchor{AC_CHECK_LIB} |
| @defmac AC_CHECK_LIB (@var{library}, @var{function}, @ |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) |
| @acindex{CHECK_LIB} |
| @caindex lib_@var{library}_@var{function} |
| Test whether the library @var{library} is available by trying to link |
| a test program that calls function @var{function} with the library. |
| @var{function} should be a function provided by the library. |
| Use the base |
| name of the library; e.g., to check for @option{-lmp}, use @samp{mp} as |
| the @var{library} argument. |
| |
| @var{action-if-found} is a list of shell commands to run if the link |
| with the library succeeds; @var{action-if-not-found} is a list of shell |
| commands to run if the link fails. If @var{action-if-found} is not |
| specified, the default action prepends @option{-l@var{library}} to |
| @code{LIBS} and defines @samp{HAVE_LIB@var{library}} (in all |
| capitals). This macro is intended to support building @code{LIBS} in |
| a right-to-left (least-dependent to most-dependent) fashion such that |
| library dependencies are satisfied as a natural side effect of |
| consecutive tests. Linkers are sensitive to library ordering |
| so the order in which @code{LIBS} is generated is important to reliable |
| detection of libraries. |
| |
| If linking with @var{library} results in unresolved symbols that would |
| be resolved by linking with additional libraries, give those libraries |
| as the @var{other-libraries} argument, separated by spaces: |
| e.g., @option{-lXt -lX11}. Otherwise, this macro may fail to detect |
| that @var{library} is present, because linking the test program can |
| fail with unresolved symbols. The @var{other-libraries} argument |
| should be limited to cases where it is desirable to test for one library |
| in the presence of another that is not already in @code{LIBS}. |
| |
| @code{AC_CHECK_LIB} requires some care in usage, and should be avoided |
| in some common cases. Many standard functions like @code{gethostbyname} |
| appear in the standard C library on some hosts, and in special libraries |
| like @code{nsl} on other hosts. On some hosts the special libraries |
| contain variant implementations that you may not want to use. These |
| days it is normally better to use @code{AC_SEARCH_LIBS([gethostbyname], |
| [nsl])} instead of @code{AC_CHECK_LIB([nsl], [gethostbyname])}. |
| |
| The result of this test is cached in the |
| @code{ac_cv_lib_@var{library}_@var{function}} variable. |
| @end defmac |
| |
| @anchor{AC_SEARCH_LIBS} |
| @defmac AC_SEARCH_LIBS (@var{function}, @var{search-libs}, @ |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries}) |
| @acindex{SEARCH_LIBS} |
| @caindex search_@var{function} |
| Search for a library defining @var{function} if it's not already |
| available. This equates to calling |
| @samp{AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])])} first with |
| no libraries, then for each library listed in @var{search-libs}. |
| |
| Prepend @option{-l@var{library}} to @code{LIBS} for the first library found |
| to contain @var{function}, and run @var{action-if-found}. If the |
| function is not found, run @var{action-if-not-found}. |
| |
| If linking with @var{library} results in unresolved symbols that would |
| be resolved by linking with additional libraries, give those libraries |
| as the @var{other-libraries} argument, separated by spaces: |
| e.g., @option{-lXt -lX11}. Otherwise, this macro fails to detect |
| that @var{function} is present, because linking the test program |
| always fails with unresolved symbols. |
| |
| The result of this test is cached in the |
| @code{ac_cv_search_@var{function}} variable as @samp{none required} if |
| @var{function} is already available, as @samp{no} if no library |
| containing @var{function} was found, otherwise as the |
| @option{-l@var{library}} option that needs to be prepended to @code{LIBS}. |
| @end defmac |
| |
| |
| |
| @node Library Functions |
| @section Library Functions |
| |
| The following macros check for particular C library functions. |
| If there is no macro specifically defined to check for a function you need, |
| and you don't need to check for any special properties of |
| it, then you can use one of the general function-check macros. |
| |
| @menu |
| * Function Portability:: Pitfalls with usual functions |
| * Particular Functions:: Special handling to find certain functions |
| * Generic Functions:: How to find other functions |
| @end menu |
| |
| @node Function Portability |
| @subsection Portability of C Functions |
| @cindex Portability of C functions |
| @cindex C function portability |
| |
| Most usual functions can either be missing, or be buggy, or be limited |
| on some architectures. This section tries to make an inventory of these |
| portability issues. By definition, this list always requires |
| additions. A much more complete list is maintained by the Gnulib |
| project (@pxref{Gnulib}), covering @ref{Function Substitutes, , |
| Current POSIX Functions, gnulib, Gnulib}, @ref{Legacy Function |
| Substitutes, , Legacy Functions, gnulib, Gnulib}, and @ref{Glibc |
| Function Substitutes, , Glibc Functions, gnulib, Gnulib}. Please |
| help us keep the Gnulib list as complete as possible. |
| |
| @table @asis |
| @item @code{exit} |
| @c @fuindex exit |
| @prindex @code{exit} |
| On ancient hosts, @code{exit} returned @code{int}. |
| This is because @code{exit} predates @code{void}, and there was a long |
| tradition of it returning @code{int}. |
| |
| On current hosts, the problem more likely is that @code{exit} is not |
| declared, due to C++ problems of some sort or another. For this reason |
| we suggest that test programs not invoke @code{exit}, but return from |
| @code{main} instead. |
| |
| @item @code{malloc} |
| @c @fuindex malloc |
| @prindex @code{malloc} |
| The C standard says a successful call @code{malloc (0)} is implementation |
| dependent. It can return either @code{NULL} or a new non-null pointer. |
| The latter is more common (e.g., the GNU C Library) but is by |
| no means universal. @code{AC_FUNC_MALLOC} |
| can be used to insist on non-@code{NULL} (@pxref{Particular Functions}). |
| |
| @item @code{putenv} |
| @c @fuindex putenv |
| @prindex @code{putenv} |
| POSIX prefers @code{setenv} to @code{putenv}; among other things, |
| @code{putenv} is not required of all POSIX implementations, but |
| @code{setenv} is. |
| |
| POSIX specifies that @code{putenv} puts the given string directly in |
| @code{environ}, but some systems make a copy of it instead (e.g., |
| glibc 2.0, or BSD). And when a copy is made, @code{unsetenv} might |
| not free it, causing a memory leak (e.g., FreeBSD 4). |
| |
| On some systems @code{putenv ("FOO")} removes @samp{FOO} from the |
| environment, but this is not standard usage and it dumps core |
| on some systems (e.g., AIX). |
| |
| On MinGW, a call @code{putenv ("FOO=")} removes @samp{FOO} from the |
| environment, rather than inserting it with an empty value. |
| |
| @item @code{realloc} |
| @c @fuindex realloc |
| @prindex @code{realloc} |
| It is problematic to call @code{realloc} with a zero size. |
| The C standard says @code{realloc (NULL, 0)} is equivalent to |
| @code{malloc (0)}, which means one cannot portably tell whether the call |
| has succeeded if it returns a null pointer. If @code{ptr} is non-null, |
| the C standard says @code{realloc (ptr, 0)} has undefined behavior. |
| |
| The @code{AC_FUNC_REALLOC} macro avoids some of these portability issues. |
| @xref{Particular Functions}. |
| |
| @item @code{signal} handler |
| @c @fuindex signal |
| @prindex @code{signal} |
| @prindex @code{sigaction} |
| In most cases, it is more robust to use @code{sigaction} when it is |
| available, rather than @code{signal}. |
| |
| @item @code{snprintf} |
| @c @fuindex snprintf |
| @prindex @code{snprintf} |
| @c @fuindex vsnprintf |
| @prindex @code{vsnprintf} |
| In C99 and later, if the output array isn't big enough |
| and if no other errors occur, @code{snprintf} and @code{vsnprintf} |
| truncate the output and return the number of bytes that ought to have |
| been produced. Some older systems, notably Microsoft Windows before |
| Visual Studio 2015 and Windows 10, do not null-terminate the output |
| and return @minus{}1 instead. |
| |
| Portable code can check the return value of @code{snprintf (buf, sizeof |
| buf, ...)}: if the value is negative or is not less than @code{sizeof |
| buf}, an error occurred and the contents of @code{buf} can be ignored. |
| Alternatively, one of the Gnulib modules related to @code{snprintf} can |
| be used. @xref{Gnulib}. |
| |
| @item @code{strerror_r} |
| @c @fuindex strerror_r |
| @prindex @code{strerror_r} |
| POSIX specifies that @code{strerror_r} returns an @code{int}, but many |
| systems (e.g., the GNU C Library) provide a |
| different version returning a @code{char *}. @code{AC_FUNC_STRERROR_R} |
| can detect which is in use (@pxref{Particular Functions}). |
| |
| @item @code{strnlen} |
| @c @fuindex strnlen |
| @prindex @code{strnlen} |
| Android 5.0's strnlen was broken, because it assumed the addressed array |
| always had at least the specified number of bytes. For example, |
| @code{strnlen ("", SIZE_MAX)} should return 0 but on Android 5.0 it |
| crashed. |
| |
| AIX 4.3 provided a broken version which produces the |
| following results: |
| |
| @example |
| strnlen ("foobar", 0) = 0 |
| strnlen ("foobar", 1) = 3 |
| strnlen ("foobar", 2) = 2 |
| strnlen ("foobar", 3) = 1 |
| strnlen ("foobar", 4) = 0 |
| strnlen ("foobar", 5) = 6 |
| strnlen ("foobar", 6) = 6 |
| strnlen ("foobar", 7) = 6 |
| strnlen ("foobar", 8) = 6 |
| strnlen ("foobar", 9) = 6 |
| @end example |
| |
| @item @code{sysconf} |
| @c @fuindex sysconf |
| @prindex @code{sysconf} |
| @code{_SC_PAGESIZE} is standard, but some older systems (e.g., HP-UX |
| 9) have @code{_SC_PAGE_SIZE} instead. This can be tested with |
| @code{#ifdef}. |
| |
| @item @code{unlink} |
| @c @fuindex unlink |
| @prindex @code{unlink} |
| The POSIX spec says that @code{unlink} causes the given file to be |
| removed only after there are no more open file handles for it. Some |
| non-POSIX hosts have trouble with this requirement, though, |
| and some DOS variants even corrupt the file system. |
| |
| @item @code{unsetenv} |
| @c @fuindex unsetenv |
| @prindex @code{unsetenv} |
| On MinGW, @code{unsetenv} is not available, but a variable @samp{FOO} |
| can be removed with a call @code{putenv ("FOO=")}, as described under |
| @code{putenv} above. |
| |
| @item @code{va_copy} |
| @c @fuindex va_copy |
| @prindex @code{va_copy} |
| C99 and later provide @code{va_copy} for copying |
| @code{va_list} variables. It may be available in older environments |
| too, though possibly as @code{__va_copy} (e.g., @command{gcc} in strict |
| pre-C99 mode). These can be tested with @code{#ifdef}. A fallback to |
| @code{memcpy (&dst, &src, sizeof (va_list))} gives maximum |
| portability. |
| |
| @item @code{va_list} |
| @c @fuindex va_list |
| @prindex @code{va_list} |
| @code{va_list} is not necessarily just a pointer. It can be a |
| @code{struct}, which means @code{NULL} is not portable. |
| Or it can be an array, which means as a function parameter it can be |
| effectively call-by-reference and library routines might modify the |
| value back in the caller. |
| |
| @item Signed @code{>>} |
| Normally the C @code{>>} right shift of a signed type replicates the |
| high bit, giving a so-called ``arithmetic'' shift. But care should be |
| taken since Standard C doesn't require that behavior. On a few platforms |
| (e.g., Cray C by default) zero bits are shifted in, the same as a shift of an |
| unsigned type. |
| |
| @item Integer @code{/} |
| C divides signed integers by truncating their quotient toward zero, |
| yielding the same result as Fortran. However, before C99 the standard |
| allowed C implementations to take the floor or ceiling of the quotient |
| in some cases. Hardly any implementations took advantage of this |
| freedom, though, and it's probably not worth worrying about this issue |
| nowadays. |
| @end table |
| |
| |
| @node Particular Functions |
| @subsection Particular Function Checks |
| @cindex Function, checking |
| |
| These macros check for particular C functions---whether they exist, and |
| in some cases how they respond when given certain arguments. |
| |
| @anchor{AC_FUNC_ALLOCA} |
| @defmac AC_FUNC_ALLOCA |
| @acindex{FUNC_ALLOCA} |
| @cvindex C_ALLOCA |
| @cvindex HAVE_ALLOCA_H |
| @ovindex ALLOCA |
| @c @fuindex alloca |
| @prindex @code{alloca} |
| @hdrindex{alloca.h} |
| @c @caindex working_alloca_h |
| Check for the @code{alloca} function. Define @code{HAVE_ALLOCA_H} if |
| @file{alloca.h} defines a working @code{alloca}. If not, look for a |
| builtin alternative. If either method succeeds, define |
| @code{HAVE_ALLOCA}. Otherwise, set the output variable @code{ALLOCA} to |
| @samp{$@{LIBOBJDIR@}alloca.o} and define |
| @code{C_ALLOCA} (so programs can periodically call @samp{alloca (0)} to |
| garbage collect). This variable is separate from @code{LIBOBJS} so |
| multiple programs can share the value of @code{ALLOCA} without needing |
| to create an actual library, in case only some of them use the code in |
| @code{LIBOBJS}. The @samp{$@{LIBOBJDIR@}} prefix serves the same |
| purpose as in @code{LIBOBJS} (@pxref{AC_LIBOBJ vs LIBOBJS}). |
| |
| Source files that use @code{alloca} should start with a piece of code |
| like the following, to declare it properly. |
| |
| @example |
| @group |
| #include <stdlib.h> |
| #include <stddef.h> |
| #ifdef HAVE_ALLOCA_H |
| # include <alloca.h> |
| #elif !defined alloca |
| # ifdef __GNUC__ |
| # define alloca __builtin_alloca |
| # elif defined _MSC_VER |
| # include <malloc.h> |
| # define alloca _alloca |
| # elif !defined HAVE_ALLOCA |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| void *alloca (size_t); |
| # endif |
| #endif |
| @end group |
| @end example |
| |
| If you don't want to maintain this piece of code in your package manually, |
| you can instead use the Gnulib module @code{alloca-opt} or @code{alloca}. |
| @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_CHOWN |
| @acindex{FUNC_CHOWN} |
| @cvindex HAVE_CHOWN |
| @c @fuindex chown |
| @prindex @code{chown} |
| @caindex func_chown_works |
| If the @code{chown} function is available and works (in particular, it |
| should accept @option{-1} for @code{uid} and @code{gid}), define |
| @code{HAVE_CHOWN}. The result of this macro is cached in the |
| @code{ac_cv_func_chown_works} variable. |
| |
| If you want a workaround, that is, a @code{chown} function that is |
| available and works, you can use the Gnulib module @code{chown}. |
| @xref{Gnulib}. |
| @end defmac |
| |
| @anchor{AC_FUNC_CLOSEDIR_VOID} |
| @defmac AC_FUNC_CLOSEDIR_VOID |
| @acindex{FUNC_CLOSEDIR_VOID} |
| @cvindex CLOSEDIR_VOID |
| @c @fuindex closedir |
| @prindex @code{closedir} |
| @caindex func_closedir_void |
| If the @code{closedir} function does not return a meaningful value, |
| define @code{CLOSEDIR_VOID}. Otherwise, callers ought to check its |
| return value for an error indicator. |
| |
| Currently this test is implemented by running a test program. When |
| cross compiling the pessimistic assumption that @code{closedir} does not |
| return a meaningful value is made. |
| |
| The result of this macro is cached in the @code{ac_cv_func_closedir_void} |
| variable. |
| |
| This macro is obsolescent, as @code{closedir} returns a meaningful value |
| on current systems. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_FUNC_ERROR_AT_LINE |
| @acindex{FUNC_ERROR_AT_LINE} |
| @c @fuindex error_at_line |
| @prindex @code{error_at_line} |
| @caindex lib_error_at_line |
| If the @code{error_at_line} function is not found, require an |
| @code{AC_LIBOBJ} replacement of @samp{error}. |
| |
| The result of this macro is cached in the @code{ac_cv_lib_error_at_line} |
| variable. |
| |
| The @code{AC_FUNC_ERROR_AT_LINE} macro is obsolescent. New programs |
| should use Gnulib's @code{error} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_FNMATCH |
| @acindex{FUNC_FNMATCH} |
| @c @fuindex fnmatch |
| @prindex @code{fnmatch} |
| @caindex func_fnmatch_works |
| If the @code{fnmatch} function conforms to POSIX, define |
| @code{HAVE_FNMATCH}. |
| |
| Unlike the other specific |
| @code{AC_FUNC} macros, @code{AC_FUNC_FNMATCH} does not replace a |
| broken/missing @code{fnmatch}. This is for historical reasons. |
| See @code{AC_REPLACE_FNMATCH} below. |
| |
| The result of this macro is cached in the @code{ac_cv_func_fnmatch_works} |
| variable. |
| |
| This macro is obsolescent. New programs should use Gnulib's |
| @code{fnmatch-posix} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_FNMATCH_GNU |
| @acindex{FUNC_FNMATCH_GNU} |
| @c @fuindex fnmatch |
| @prindex @code{fnmatch} |
| @caindex func_fnmatch_gnu |
| Behave like @code{AC_REPLACE_FNMATCH} (@emph{replace}) but also test |
| whether @code{fnmatch} supports GNU extensions. Detect common |
| implementation bugs, for example, the bugs in the GNU C |
| Library 2.1. |
| |
| The result of this macro is cached in the @code{ac_cv_func_fnmatch_gnu} |
| variable. |
| |
| This macro is obsolescent. New programs should use Gnulib's |
| @code{fnmatch-gnu} module. @xref{Gnulib}. |
| @end defmac |
| |
| @anchor{AC_FUNC_FORK} |
| @defmac AC_FUNC_FORK |
| @acindex{FUNC_FORK} |
| @cvindex HAVE_VFORK_H |
| @cvindex HAVE_WORKING_FORK |
| @cvindex HAVE_WORKING_VFORK |
| @cvindex vfork |
| @c @fuindex fork |
| @prindex @code{fork} |
| @c @fuindex vfork |
| @prindex @code{vfork} |
| @hdrindex{vfork.h} |
| @c @caindex func_fork |
| @c @caindex func_fork_works |
| This macro checks for the @code{fork} and @code{vfork} functions. If a |
| working @code{fork} is found, define @code{HAVE_WORKING_FORK}. This macro |
| checks whether @code{fork} is just a stub by trying to run it. |
| |
| If @file{vfork.h} is found, define @code{HAVE_VFORK_H}. If a working |
| @code{vfork} is found, define @code{HAVE_WORKING_VFORK}. Otherwise, |
| define @code{vfork} to be @code{fork} for backward compatibility with |
| previous versions of @command{autoconf}. This macro checks for several known |
| errors in implementations of @code{vfork} and considers the system to not |
| have a working @code{vfork} if it detects any of them. |
| |
| Since this macro defines @code{vfork} only for backward compatibility with |
| previous versions of @command{autoconf} you're encouraged to define it |
| yourself in new code: |
| @example |
| @group |
| #ifndef HAVE_WORKING_VFORK |
| # define vfork fork |
| #endif |
| @end group |
| @end example |
| |
| The results of this macro are cached in the @code{ac_cv_func_fork_works} |
| and @code{ac_cv_func_vfork_works} variables. In order to override the |
| test, you also need to set the @code{ac_cv_func_fork} and |
| @code{ac_cv_func_vfork} variables. |
| @end defmac |
| |
| @anchor{AC_FUNC_FSEEKO} |
| @defmac AC_FUNC_FSEEKO |
| @acindex{FUNC_FSEEKO} |
| @cvindex _LARGEFILE_SOURCE |
| @cvindex HAVE_FSEEKO |
| @c @fuindex fseeko |
| @prindex @code{fseeko} |
| @c @fuindex ftello |
| @prindex @code{ftello} |
| @c @caindex sys_largefile_source |
| If the @code{fseeko} and @code{ftello} functions are available, define |
| @code{HAVE_FSEEKO}. Define @code{_LARGEFILE_SOURCE} if necessary to |
| make the prototype visible. |
| |
| Configure scripts that use @code{AC_FUNC_FSEEKO} should normally also |
| use @code{AC_SYS_LARGEFILE} to ensure that @code{off_t} can represent |
| all supported file sizes. @xref{AC_SYS_LARGEFILE}. |
| |
| The Gnulib module @code{fseeko} invokes @code{AC_FUNC_FSEEKO} |
| and also contains workarounds for other portability problems of |
| @code{fseeko}. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_GETGROUPS |
| @acindex{FUNC_GETGROUPS} |
| @cvindex HAVE_GETGROUPS |
| @ovindex GETGROUPS_LIB |
| @c @fuindex getgroups |
| @prindex @code{getgroups} |
| @caindex func_getgroups_works |
| Perform all the checks performed by @code{AC_TYPE_GETGROUPS} |
| (@pxref{AC_TYPE_GETGROUPS}). |
| Then, if the @code{getgroups} function is available |
| and known to work correctly, define @code{HAVE_GETGROUPS}. |
| Set the output variable @code{GETGROUPS_LIB} to any libraries |
| needed to get that function. |
| |
| This macro relies on a list of systems with known, serious bugs in |
| @code{getgroups}. If this list mis-identifies your system's |
| @code{getgroups} as buggy, or as not buggy, you can override it by |
| setting the cache variable @code{ac_cv_func_getgroups_works} in a |
| @file{config.site} file (@pxref{Site Defaults}). Please also report the |
| error to @email{bug-autoconf@@gnu.org, the Autoconf Bugs mailing list}. |
| |
| The Gnulib module @code{getgroups} provides workarounds for additional, |
| less severe portability problems with this function. |
| @end defmac |
| |
| @anchor{AC_FUNC_GETLOADAVG} |
| @defmac AC_FUNC_GETLOADAVG |
| @acindex{FUNC_GETLOADAVG} |
| @cvindex SVR4 |
| @cvindex DGUX |
| @cvindex UMAX |
| @cvindex UMAX4_3 |
| @cvindex HAVE_NLIST_H |
| @cvindex NLIST_NAME_UNION |
| @cvindex GETLOADAVG_PRIVILEGED |
| @cvindex NEED_SETGID |
| @cvindex C_GETLOADAVG |
| @ovindex LIBOBJS |
| @ovindex NEED_SETGID |
| @ovindex KMEM_GROUP |
| @ovindex GETLOADAVG_LIBS |
| @c @fuindex getloadavg |
| @prindex @code{getloadavg} |
| Check how to get the system load averages. To perform its tests |
| properly, this macro needs the file @file{getloadavg.c}; therefore, be |
| sure to set the @code{AC_LIBOBJ} replacement directory properly (see |
| @ref{Generic Functions}, @code{AC_CONFIG_LIBOBJ_DIR}). |
| |
| If the system has the @code{getloadavg} function, define |
| @code{HAVE_GETLOADAVG}, and set @code{GETLOADAVG_LIBS} to any libraries |
| necessary to get that function. Also add @code{GETLOADAVG_LIBS} to |
| @code{LIBS}. Otherwise, require an @code{AC_LIBOBJ} replacement for |
| @samp{getloadavg} and possibly define several other C preprocessor |
| macros and output variables: |
| |
| @enumerate |
| @item |
| Define @code{C_GETLOADAVG}. |
| |
| @item |
| Define @code{SVR4}, @code{DGUX}, @code{UMAX}, or @code{UMAX4_3} if on |
| those systems. |
| |
| @item |
| @hdrindex{nlist.h} |
| If @file{nlist.h} is found, define @code{HAVE_NLIST_H}. |
| |
| @item |
| If @samp{struct nlist} has an @samp{n_un.n_name} member, define |
| @code{HAVE_STRUCT_NLIST_N_UN_N_NAME}. The obsolete symbol |
| @code{NLIST_NAME_UNION} is still defined, but do not depend upon it. |
| |
| @item |
| Programs may need to be installed set-group-ID (or set-user-ID) for |
| @code{getloadavg} to work. In this case, define |
| @code{GETLOADAVG_PRIVILEGED}, set the output variable @code{NEED_SETGID} |
| to @samp{true} (and otherwise to @samp{false}), and set |
| @code{KMEM_GROUP} to the name of the group that should own the installed |
| program. |
| @end enumerate |
| |
| The @code{AC_FUNC_GETLOADAVG} macro is obsolescent. New programs should |
| use Gnulib's @code{getloadavg} module. @xref{Gnulib}. |
| @end defmac |
| |
| @anchor{AC_FUNC_GETMNTENT} |
| @defmac AC_FUNC_GETMNTENT |
| @acindex{FUNC_GETMNTENT} |
| @cvindex HAVE_GETMNTENT |
| @c @fuindex getmntent |
| @prindex @code{getmntent} |
| @caindex search_getmntent |
| Check for @code{getmntent} in the standard C library, and then in the |
| @file{sun}, @file{seq}, and @file{gen} libraries. Then, if |
| @code{getmntent} is available, define @code{HAVE_GETMNTENT} and set |
| @code{ac_cv_func_getmntent} to @code{yes}. Otherwise set |
| @code{ac_cv_func_getmntent} to @code{no}. |
| |
| The result of this macro can be overridden by setting the cache variable |
| @code{ac_cv_search_getmntent}. |
| |
| The @code{AC_FUNC_GETMNTENT} macro is obsolescent. New programs should |
| use Gnulib's @code{mountlist} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_GETPGRP |
| @acindex{FUNC_GETPGRP} |
| @cvindex GETPGRP_VOID |
| @c @fuindex getpgid |
| @c @fuindex getpgrp |
| @prindex @code{getpgid} |
| @prindex @code{getpgrp} |
| @caindex func_getpgrp_void |
| Define @code{GETPGRP_VOID} if it is an error to pass 0 to |
| @code{getpgrp}; this is the POSIX behavior. On older BSD |
| systems, you must pass 0 to @code{getpgrp}, as it takes an argument and |
| behaves like POSIX's @code{getpgid}. |
| |
| @example |
| #ifdef GETPGRP_VOID |
| pid = getpgrp (); |
| #else |
| pid = getpgrp (0); |
| #endif |
| @end example |
| |
| This macro does not check whether |
| @code{getpgrp} exists at all; if you need to work in that situation, |
| first call @code{AC_CHECK_FUNC} for @code{getpgrp}. |
| |
| The result of this macro is cached in the @code{ac_cv_func_getpgrp_void} |
| variable. |
| |
| This macro is obsolescent, as current systems have a @code{getpgrp} |
| whose signature conforms to POSIX@. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK |
| @acindex{FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} |
| @cvindex LSTAT_FOLLOWS_SLASHED_SYMLINK |
| @c @fuindex lstat |
| @prindex @code{lstat} |
| @caindex func_lstat_dereferences_slashed_symlink |
| If @file{link} is a symbolic link, then @code{lstat} should treat |
| @file{link/} the same as @file{link/.}. However, many older |
| @code{lstat} implementations incorrectly ignore trailing slashes. |
| |
| It is safe to assume that if @code{lstat} incorrectly ignores |
| trailing slashes, then other symbolic-link-aware functions like |
| @code{unlink} also incorrectly ignore trailing slashes. |
| |
| If @code{lstat} behaves properly, define |
| @code{LSTAT_FOLLOWS_SLASHED_SYMLINK}, otherwise require an |
| @code{AC_LIBOBJ} replacement of @code{lstat}. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_lstat_dereferences_slashed_symlink} variable. |
| |
| The @code{AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} macro is obsolescent. |
| New programs should use Gnulib's @code{lstat} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_MALLOC |
| @acindex{FUNC_MALLOC} |
| @cvindex HAVE_MALLOC |
| @cvindex malloc |
| @c @fuindex malloc |
| @prindex @code{malloc} |
| @caindex func_malloc_0_nonnull |
| If the @code{malloc} function is compatible with the GNU C |
| library @code{malloc} (i.e., @samp{malloc (0)} returns a valid |
| pointer), define @code{HAVE_MALLOC} to 1. Otherwise define |
| @code{HAVE_MALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for |
| @samp{malloc}, and define @code{malloc} to @code{rpl_malloc} so that the |
| native @code{malloc} is not used in the main project. |
| |
| Typically, the replacement file @file{malloc.c} should look like (note |
| the @samp{#undef malloc}): |
| |
| @verbatim |
| #include <config.h> |
| #undef malloc |
| |
| #include <stdlib.h> |
| |
| /* Allocate an N-byte block of memory from the heap. |
| If N is zero, allocate a 1-byte block. */ |
| |
| void * |
| rpl_malloc (size_t n) |
| { |
| if (n == 0) |
| n = 1; |
| return malloc (n); |
| } |
| @end verbatim |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_malloc_0_nonnull} variable. |
| The result might contain spaces, e.g., @code{guessing yes}. |
| |
| If you don't want to maintain a @code{malloc.c} file in your package |
| manually, you can instead use the Gnulib module @code{malloc-gnu}. |
| @end defmac |
| |
| @defmac AC_FUNC_MBRTOWC |
| @acindex{FUNC_MBRTOWC} |
| @cvindex HAVE_MBRTOWC |
| @c @fuindex mbrtowc |
| @prindex @code{mbrtowc} |
| @caindex func_mbrtowc |
| Define @code{HAVE_MBRTOWC} to 1 if the function @code{mbrtowc} and the |
| type @code{mbstate_t} are properly declared. |
| |
| The result of this macro is cached in the @code{ac_cv_func_mbrtowc} |
| variable. |
| |
| The Gnulib module @code{mbrtowc} not only ensures that the |
| function is declared, but also works around other portability |
| problems of this function. |
| @end defmac |
| |
| @defmac AC_FUNC_MEMCMP |
| @acindex{FUNC_MEMCMP} |
| @ovindex LIBOBJS |
| @c @fuindex memcmp |
| @prindex @code{memcmp} |
| @caindex func_memcmp_working |
| If the @code{memcmp} function is not available or does not work, require an |
| @code{AC_LIBOBJ} replacement for @samp{memcmp}. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_memcmp_working} variable. |
| |
| This macro is obsolescent, as current systems have a working |
| @code{memcmp}. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_FUNC_MKTIME |
| @acindex{FUNC_MKTIME} |
| @ovindex LIBOBJS |
| @c @fuindex mktime |
| @prindex @code{mktime} |
| @caindex func_working_mktime |
| If the @code{mktime} function is not available, or does not work |
| correctly, require an @code{AC_LIBOBJ} replacement for @samp{mktime}. |
| For the purposes of this test, @code{mktime} should conform to the |
| POSIX standard and should be the inverse of |
| @code{localtime}. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_working_mktime} variable. |
| |
| The @code{AC_FUNC_MKTIME} macro is obsolescent. New programs should |
| use Gnulib's @code{mktime} module. @xref{Gnulib}. |
| @end defmac |
| |
| @anchor{AC_FUNC_MMAP} |
| @defmac AC_FUNC_MMAP |
| @acindex{FUNC_MMAP} |
| @cvindex HAVE_MMAP |
| @c @fuindex mmap |
| @prindex @code{mmap} |
| @caindex func_mmap_fixed_mapped |
| If the @code{mmap} function exists and works correctly, define |
| @code{HAVE_MMAP}. This checks only private fixed mapping of already-mapped |
| memory. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_mmap_fixed_mapped} variable. |
| |
| Note: This macro asks for more than what an average program needs from |
| @code{mmap}. In particular, the use of @code{MAP_FIXED} fails on |
| HP-UX 11, whereas @code{mmap} otherwise works fine on this platform. |
| @end defmac |
| |
| @defmac AC_FUNC_OBSTACK |
| @acindex{FUNC_OBSTACK} |
| @cvindex HAVE_OBSTACK |
| @cindex obstack |
| @caindex func_obstack |
| If the obstacks are found, define @code{HAVE_OBSTACK}, else require an |
| @code{AC_LIBOBJ} replacement for @samp{obstack}. |
| |
| The result of this macro is cached in the @code{ac_cv_func_obstack} |
| variable. |
| |
| The @code{AC_FUNC_OBSTACK} macro is obsolescent. New programs should use |
| Gnulib's @code{obstack} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_REALLOC |
| @acindex{FUNC_REALLOC} |
| @cvindex HAVE_REALLOC |
| @cvindex realloc |
| @c @fuindex realloc |
| @prindex @code{realloc} |
| @caindex func_realloc_0_nonnull |
| If a successful call to @samp{realloc (NULL, 0)} returns a |
| non-null pointer, define @code{HAVE_REALLOC} to 1. Otherwise define |
| @code{HAVE_REALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for |
| @samp{realloc}, and define @code{realloc} to @code{rpl_realloc} so that |
| the native @code{realloc} is not used in the main project. See |
| @code{AC_FUNC_MALLOC} for details. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_realloc_0_nonnull} variable. |
| The result might contain spaces, e.g., @code{guessing yes}. |
| |
| This macro does not check compatibility with glibc @code{realloc (@var{p}, 0)} |
| when @var{p} is non-null, as glibc 1--2.1 behaves differently from glibc |
| 2.1.1--2.40 (at least), and the C standard says behavior is undefined. |
| @end defmac |
| |
| @defmac AC_FUNC_SELECT_ARGTYPES |
| @acindex{FUNC_SELECT_ARGTYPES} |
| @cvindex SELECT_TYPE_ARG1 |
| @cvindex SELECT_TYPE_ARG234 |
| @cvindex SELECT_TYPE_ARG5 |
| @c @fuindex select |
| @prindex @code{select} |
| @c @caindex func_select_args |
| Determines the correct type to be passed for each of the |
| @code{select} function's arguments, and defines those types |
| in @code{SELECT_TYPE_ARG1}, @code{SELECT_TYPE_ARG234}, and |
| @code{SELECT_TYPE_ARG5} respectively. @code{SELECT_TYPE_ARG1} defaults |
| to @samp{int}, @code{SELECT_TYPE_ARG234} defaults to @samp{int *}, |
| and @code{SELECT_TYPE_ARG5} defaults to @samp{struct timeval *}. |
| |
| This macro is obsolescent, as current systems have a @code{select} whose |
| signature conforms to POSIX@. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_FUNC_SETPGRP |
| @acindex{FUNC_SETPGRP} |
| @cvindex SETPGRP_VOID |
| @c @fuindex setpgrp |
| @prindex @code{setpgrp} |
| @caindex func_setpgrp_void |
| If @code{setpgrp} takes no argument (the POSIX version), define |
| @code{SETPGRP_VOID}. Otherwise, it is the BSD version, which takes |
| two process IDs as arguments. This macro does not check whether |
| @code{setpgrp} exists at all; if you need to work in that situation, |
| first call @code{AC_CHECK_FUNC} for @code{setpgrp}. This macro also |
| does not check for the Solaris variant of @code{setpgrp}, which returns |
| a @code{pid_t} instead of an @code{int}; portable code should only use |
| the return value by comparing it against @code{-1} to check for errors. |
| |
| The result of this macro is cached in the @code{ac_cv_func_setpgrp_void} |
| variable. |
| |
| This macro is obsolescent, as all forms of @code{setpgrp} are also |
| obsolescent. New programs should use the POSIX function @code{setpgid}, |
| which takes two process IDs as arguments (like the BSD @code{setpgrp}). |
| @end defmac |
| |
| @defmac AC_FUNC_STAT |
| @defmacx AC_FUNC_LSTAT |
| @acindex{FUNC_STAT} |
| @acindex{FUNC_LSTAT} |
| @cvindex HAVE_STAT_EMPTY_STRING_BUG |
| @cvindex HAVE_LSTAT_EMPTY_STRING_BUG |
| @c @fuindex stat |
| @prindex @code{stat} |
| @c @fuindex lstat |
| @prindex @code{lstat} |
| @caindex func_stat_empty_string_bug |
| @caindex func_lstat_empty_string_bug |
| Determine whether @code{stat} or @code{lstat} have the bug that it |
| succeeds when given the zero-length file name as argument. |
| |
| If it does, then define @code{HAVE_STAT_EMPTY_STRING_BUG} (or |
| @code{HAVE_LSTAT_EMPTY_STRING_BUG}) and ask for an @code{AC_LIBOBJ} |
| replacement of it. |
| |
| The results of these macros are cached in the |
| @code{ac_cv_func_stat_empty_string_bug} and the |
| @code{ac_cv_func_lstat_empty_string_bug} variables, respectively. |
| |
| These macros are obsolescent, as no current systems have the bug. |
| New programs need not use these macros. |
| @end defmac |
| |
| @anchor{AC_FUNC_STRCOLL} |
| @defmac AC_FUNC_STRCOLL |
| @acindex{FUNC_STRCOLL} |
| @cvindex HAVE_STRCOLL |
| @c @fuindex strcoll |
| @prindex @code{strcoll} |
| @caindex func_strcoll_works |
| If the @code{strcoll} function exists and works correctly, define |
| @code{HAVE_STRCOLL}. This does a bit more than |
| @samp{AC_CHECK_FUNCS(strcoll)}, because some systems have incorrect |
| definitions of @code{strcoll} that should not be used. But it does |
| not check against a known bug of this function on Solaris 10. |
| |
| The result of this macro is cached in the @code{ac_cv_func_strcoll_works} |
| variable. |
| @end defmac |
| |
| @defmac AC_FUNC_STRERROR_R |
| @acindex{FUNC_STRERROR_R} |
| @cvindex HAVE_STRERROR_R |
| @cvindex HAVE_DECL_STRERROR_R |
| @cvindex STRERROR_R_CHAR_P |
| @c @fuindex strerror_r |
| @caindex func_strerror_r_char_p |
| @prindex @code{strerror_r} |
| If @code{strerror_r} is available, define @code{HAVE_STRERROR_R}, and if |
| it is declared, define @code{HAVE_DECL_STRERROR_R}. If it returns a |
| @code{char *} message, define @code{STRERROR_R_CHAR_P}; otherwise it |
| returns an @code{int} error number. The Thread-Safe Functions option of |
| POSIX requires @code{strerror_r} to return @code{int}, but |
| many systems (including, for example, the GNU C |
| Library) return a @code{char *} value that is not necessarily equal to |
| the buffer argument. |
| |
| The result of this macro is cached in the |
| @code{ac_cv_func_strerror_r_char_p} variable. |
| |
| The Gnulib module @code{strerror_r} not only ensures that the function |
| has the return type specified by POSIX, but also works around other |
| portability problems of this function. |
| @end defmac |
| |
| @anchor{AC_FUNC_STRFTIME} |
| @defmac AC_FUNC_STRFTIME |
| @acindex{FUNC_STRFTIME} |
| @cvindex HAVE_STRFTIME |
| @c @fuindex strftime |
| @prindex @code{strftime} |
| Check for @code{strftime} in the @file{intl} library. |
| Then, if @code{strftime} is available, define @code{HAVE_STRFTIME}. |
| |
| This macro is obsolescent, as no current systems require the @file{intl} |
| library for @code{strftime}. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_FUNC_STRTOD |
| @acindex{FUNC_STRTOD} |
| @ovindex POW_LIB |
| @c @fuindex strtod |
| @prindex @code{strtod} |
| @caindex func_strtod |
| @caindex func_pow |
| If the @code{strtod} function does not exist or doesn't work correctly, |
| ask for an @code{AC_LIBOBJ} replacement of @samp{strtod}. In this case, |
| because @file{strtod.c} is likely to need @samp{pow}, set the output |
| variable @code{POW_LIB} to the extra library needed. |
| |
| This macro caches its result in the @code{ac_cv_func_strtod} variable |
| and depends upon the result in the @code{ac_cv_func_pow} variable. |
| |
| The @code{AC_FUNC_STRTOD} macro is obsolescent. New programs should |
| use Gnulib's @code{strtod} module. @xref{Gnulib}. |
| @end defmac |
| |
| @defmac AC_FUNC_STRTOLD |
| @acindex{FUNC_STRTOLD} |
| @cvindex HAVE_STRTOLD |
| @prindex @code{strtold} |
| @caindex func_strtold |
| If the @code{strtold} function exists and conforms to C99 or later, define |
| @code{HAVE_STRTOLD}. |
| |
| This macro caches its result in the @code{ac_cv_func_strtold} variable. |
| |
| The Gnulib module @code{strtold} not only ensures that the |
| function exists, but also works around other portability |
| problems of this function. |
| @end defmac |
| |
| @defmac AC_FUNC_STRNLEN |
| @acindex{FUNC_STRNLEN} |
| @cvindex HAVE_STRNLEN |
| @c @fuindex strnlen |
| @prindex @code{strnlen} |
| @caindex func_strnlen_working |
| If the @code{strnlen} function is not available, or is buggy (like the one |
| from Android 5.0 or AIX 4.3), require an @code{AC_LIBOBJ} replacement for it. |
| |
| This macro caches its result in the @code{ac_cv_func_strnlen_working} |
| variable. |
| |
| The @code{AC_FUNC_STRNLEN} macro is obsolescent. New programs should |
| use Gnulib's @code{strnlen} module. @xref{Gnulib}. |
| @end defmac |
| |
| @anchor{AC_FUNC_UTIME_NULL} |
| @defmac AC_FUNC_UTIME_NULL |
| @acindex{FUNC_UTIME_NULL} |
| @cvindex HAVE_UTIME_NULL |
| @c @fuindex utime |
| @prindex @code{utime} |
| @caindex func_utime_null |
| If @samp{utime (@var{file}, NULL)} sets @var{file}'s timestamp to |
| the present, define @code{HAVE_UTIME_NULL}. |
| |
| This macro caches its result in the @code{ac_cv_func_utime_null} |
| variable. |
| |
| This macro is obsolescent, as all current systems have a @code{utime} |
| that behaves this way. New programs need not use this macro. |
| @end defmac |
| |
| @anchor{AC_FUNC_VPRINTF} |
| @defmac AC_FUNC_VPRINTF |
| @acindex{FUNC_VPRINTF} |
| @cvindex HAVE_VPRINTF |
| @cvindex HAVE_DOPRNT |
| @c @fuindex vprintf |
| @prindex @code{vprintf} |
| @c @fuindex vsprintf |
| @prindex @code{vsprintf} |
| If @code{vprintf} is found, define @code{HAVE_VPRINTF}. Otherwise, if |
| @code{_doprnt} is found, define @code{HAVE_DOPRNT}. (If @code{vprintf} |
| is available, you may assume that @code{vfprintf} and @code{vsprintf} |
| are also available.) |
| |
| This macro is obsolescent, as all current systems have @code{vprintf}. |
| New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_REPLACE_FNMATCH |
| @acindex{REPLACE_FNMATCH} |
| @c @fuindex fnmatch |
| @prindex @code{fnmatch} |
| @hdrindex{fnmatch.h} |
| @caindex func_fnmatch_works |
| If the @code{fnmatch} function does not conform to POSIX (see |
| @code{AC_FUNC_FNMATCH}), ask for its @code{AC_LIBOBJ} replacement. |
| |
| The files @file{fnmatch.c}, @file{fnmatch_loop.c}, and @file{fnmatch_.h} |
| in the @code{AC_LIBOBJ} replacement directory are assumed to contain a |
| copy of the source code of GNU @code{fnmatch}. If necessary, |
| this source code is compiled as an @code{AC_LIBOBJ} replacement, and the |
| @file{fnmatch_.h} file is linked to @file{fnmatch.h} so that it can be |
| included in place of the system @code{<fnmatch.h>}. |
| |
| This macro caches its result in the @code{ac_cv_func_fnmatch_works} |
| variable. |
| |
| This macro is obsolescent, as it assumes the use of particular source |
| files. New programs should use Gnulib's @code{fnmatch-posix} module, |
| which provides this macro along with the source files. @xref{Gnulib}. |
| @end defmac |
| |
| |
| |
| @node Generic Functions |
| @subsection Generic Function Checks |
| |
| These macros are used to find functions not covered by the ``particular'' |
| test macros. If the functions might be in libraries other than the |
| default C library, first call @code{AC_CHECK_LIB} for those libraries. |
| If you need to check the behavior of a function as well as find out |
| whether it is present, you have to write your own test for |
| it (@pxref{Writing Tests}). |
| |
| @anchor{AC_CHECK_FUNC} |
| @defmac AC_CHECK_FUNC (@var{function}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{CHECK_FUNC} |
| @caindex func_@var{function} |
| If C function @var{function} is available, run shell commands |
| @var{action-if-found}, otherwise @var{action-if-not-found}. If you just |
| want to define a symbol if the function is available, consider using |
| @code{AC_CHECK_FUNCS} instead. This macro checks for functions with C |
| linkage even when @code{AC_LANG(C++)} has been called, since C is more |
| standardized than C++. (@pxref{Language Choice}, for more information |
| about selecting the language for checks.) |
| |
| This macro caches its result in the @code{ac_cv_func_@var{function}} |
| variable. |
| @end defmac |
| |
| @anchor{AC_CHECK_FUNCS} |
| @defmac AC_CHECK_FUNCS (@var{function}@dots{}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{CHECK_FUNCS} |
| @cvindex HAVE_@var{function} |
| For each @var{function} enumerated in the blank-or-newline-separated argument |
| list, define @code{HAVE_@var{function}} (in all capitals) if it is available. |
| If @var{action-if-found} is given, it is additional shell code to |
| execute when one of the functions is found. You can give it a value of |
| @samp{break} to break out of the loop on the first match. If |
| @var{action-if-not-found} is given, it is executed when one of the |
| functions is not found. |
| |
| Results are cached for each @var{function} as in @code{AC_CHECK_FUNC}. |
| @end defmac |
| |
| @defmac AC_CHECK_FUNCS_ONCE (@var{function}@dots{}) |
| @acindex{CHECK_FUNCS_ONCE} |
| @cvindex HAVE_@var{function} |
| For each @var{function} enumerated in the blank-or-newline-separated argument |
| list, define @code{HAVE_@var{function}} (in all capitals) if it is available. |
| This is a once-only variant of @code{AC_CHECK_FUNCS}. It generates the |
| checking code at most once, so that @command{configure} is smaller and |
| faster; but the checks cannot be conditionalized and are always done once, |
| early during the @command{configure} run. |
| @end defmac |
| |
| @sp 1 |
| |
| Autoconf follows a philosophy that was formed over the years by those |
| who have struggled for portability: isolate the portability issues in |
| specific files, and then program as if you were in a POSIX |
| environment. Some functions may be missing or unfixable, and your |
| package must be ready to replace them. |
| |
| Suitable replacements for many such problem functions are available from |
| Gnulib (@pxref{Gnulib}). |
| |
| @defmac AC_LIBOBJ (@var{function}) |
| @acindex{LIBOBJ} |
| @ovindex LIBOBJS |
| Specify that @samp{@var{function}.c} must be included in the executables |
| to replace a missing or broken implementation of @var{function}. |
| |
| @vrindex ac_objext |
| Technically, it adds @samp{@var{function}.$ac_objext} to the output |
| variable @code{LIBOBJS} if it is not already in, and calls |
| @code{AC_LIBSOURCE} for @samp{@var{function}.c}. You should not |
| directly change @code{LIBOBJS}, since this is not traceable. |
| @end defmac |
| |
| @defmac AC_LIBSOURCE (@var{file}) |
| @acindex{LIBSOURCE} |
| Specify that @var{file} might be needed to compile the project. If you |
| need to know what files might be needed by a @file{configure.ac}, you |
| should trace @code{AC_LIBSOURCE}. @var{file} must be a literal. |
| |
| This macro is called automatically from @code{AC_LIBOBJ}, but you must |
| call it explicitly if you pass a shell variable to @code{AC_LIBOBJ}. In |
| that case, since shell variables cannot be traced statically, you must |
| pass to @code{AC_LIBSOURCE} any possible files that the shell variable |
| might cause @code{AC_LIBOBJ} to need. For example, if you want to pass |
| a variable @code{$foo_or_bar} to @code{AC_LIBOBJ} that holds either |
| @code{"foo"} or @code{"bar"}, you should do: |
| |
| @example |
| AC_LIBSOURCE([foo.c]) |
| AC_LIBSOURCE([bar.c]) |
| AC_LIBOBJ([$foo_or_bar]) |
| @end example |
| |
| @noindent |
| There is usually a way to avoid this, however, and you are encouraged to |
| simply call @code{AC_LIBOBJ} with literal arguments. |
| |
| Note that this macro replaces the obsolete @code{AC_LIBOBJ_DECL}, with |
| slightly different semantics: the old macro took the function name, |
| e.g., @code{foo}, as its argument rather than the file name. |
| @end defmac |
| |
| @defmac AC_LIBSOURCES (@var{files}) |
| @acindex{LIBSOURCES} |
| Like @code{AC_LIBSOURCE}, but accepts one or more @var{files} in a |
| comma-separated M4 list. Thus, the above example might be rewritten: |
| |
| @example |
| AC_LIBSOURCES([foo.c, bar.c]) |
| AC_LIBOBJ([$foo_or_bar]) |
| @end example |
| @end defmac |
| |
| @defmac AC_CONFIG_LIBOBJ_DIR (@var{directory}) |
| @acindex{CONFIG_LIBOBJ_DIR} |
| Specify that @code{AC_LIBOBJ} replacement files are to be found in |
| @var{directory}, a name relative to the top level of the |
| source tree. The replacement directory defaults to @file{.}, the top |
| level directory, and the most typical value is @file{lib}, corresponding |
| to @samp{AC_CONFIG_LIBOBJ_DIR([lib])}. |
| |
| @command{configure} might need to know the replacement directory for the |
| following reasons: (i) some checks use the replacement files, (ii) some |
| macros bypass broken system headers by installing links to the |
| replacement headers (iii) when used in conjunction with Automake, |
| within each makefile, @var{directory} is used as a relative path |
| from @code{$(top_srcdir)} to each object named in @code{LIBOBJS} and |
| @code{LTLIBOBJS}, etc. |
| @end defmac |
| |
| @sp 1 |
| |
| It is common to merely check for the existence of a function, and ask |
| for its @code{AC_LIBOBJ} replacement if missing. The following macro is |
| a convenient shorthand. |
| |
| @defmac AC_REPLACE_FUNCS (@var{function}@dots{}) |
| @acindex{REPLACE_FUNCS} |
| @cvindex HAVE_@var{function} |
| @ovindex LIBOBJS |
| Like @code{AC_CHECK_FUNCS}, but uses @samp{AC_LIBOBJ(@var{function})} as |
| @var{action-if-not-found}. You can declare your replacement function by |
| enclosing the prototype in @samp{#ifndef HAVE_@var{function}}. If the |
| system has the function, it probably declares it in a header file you |
| should be including, so you shouldn't redeclare it lest your declaration |
| conflict. |
| @end defmac |
| |
| @node Header Files |
| @section Header Files |
| @cindex Header, checking |
| |
| The following macros check for the presence of certain C header files. |
| If there is no macro specifically defined to check for a header file you need, |
| and you don't need to check for any special properties of |
| it, then you can use one of the general header-file check macros. |
| |
| @menu |
| * Header Portability:: Collected knowledge on common headers |
| * Particular Headers:: Special handling to find certain headers |
| * Generic Headers:: How to find other headers |
| @end menu |
| |
| @node Header Portability |
| @subsection Portability of Headers |
| @cindex Portability of headers |
| @cindex Header portability |
| |
| This section documents some collected knowledge about common headers, |
| and the problems they cause. By definition, this list always requires |
| additions. A much more complete list is maintained by the Gnulib |
| project (@pxref{Gnulib}), covering @ref{Header File Substitutes, , |
| POSIX Headers, gnulib, Gnulib} and @ref{Glibc Header File |
| Substitutes, , Glibc Headers, gnulib, Gnulib}. Please help us keep |
| the Gnulib list as complete as possible. |
| |
| When we say that a header ``may require'' some set of other headers, we |
| mean that it may be necessary for you to manually include those other |
| headers first, or the contents of the header under test will fail to |
| compile. When checking for these headers, you must provide the |
| potentially-required headers in the @var{includes} argument to |
| @code{AC_CHECK_HEADER} or @code{AC_CHECK_HEADERS}, or the check will |
| fail spuriously. @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}) |
| arranges to include a number of common requirements and should normally |
| come first in your @var{includes}. For example, @file{net/if.h} may |
| require @file{sys/types.h}, @file{sys/socket.h}, or both, and |
| @code{AC_INCLUDES_DEFAULT} handles @file{sys/types.h} but not |
| @file{sys/socket.h}, so you should check for it like this: |
| |
| @example |
| AC_CHECK_HEADERS([sys/socket.h]) |
| AC_CHECK_HEADERS([net/if.h], [], [], |
| [AC_INCLUDES_DEFAULT[ |
| #ifdef HAVE_SYS_SOCKET_H |
| # include <sys/socket.h> |
| #endif |
| ]]) |
| @end example |
| |
| Note that the example mixes single quoting (for@code{AC_INCLUDES_DEFAULT}, |
| so that it gets expanded) and double quoting (to ensure that each |
| preprocessor @code{#} gets treated as a literal string rather than a |
| comment). |
| |
| @table @asis |
| |
| @item @file{limits.h} |
| In C99 and later, @file{limits.h} defines @code{LLONG_MIN}, |
| @code{LLONG_MAX}, and @code{ULLONG_MAX}, but many almost-C99 |
| environments (e.g., default GCC 4.0.2 + glibc 2.4) do not |
| define them. |
| |
| @item @file{memory.h} |
| @hdrindex{memory.h} |
| This header file is obsolete; use @file{string.h} instead. |
| |
| @item @file{strings.h} |
| @hdrindex{strings.h} |
| On some systems, this is the only header that declares |
| @code{strcasecmp}, @code{strncasecmp}, and @code{ffs}. |
| |
| This header may or may not include @file{string.h} for you. However, on |
| all recent systems it is safe to include both @file{string.h} and |
| @file{strings.h}, in either order, in the same source file. |
| |
| @item @file{inttypes.h} vs.@: @file{stdint.h} |
| @hdrindex{inttypes.h} |
| @hdrindex{stdint.h} |
| C99 specifies that @file{inttypes.h} includes @file{stdint.h}, so there's |
| no need to include @file{stdint.h} separately in a standard environment. |
| However, some implementations have @file{stdint.h} but not @file{inttypes.h} |
| (e.g. MSVC 2012). Therefore, it is necessary to check for each and include |
| each only if available. |
| |
| @item @file{linux/irda.h} |
| @hdrindex{linux/irda.h} |
| This header may require @file{linux/types.h} and/or @file{sys/socket.h}. |
| |
| @item @file{linux/random.h} |
| @hdrindex{linux/random.h} |
| This header may require @file{linux/types.h}. |
| |
| @item @file{net/if.h} |
| @hdrindex{net/if.h} |
| This header may require @file{sys/types.h} and/or @file{sys/socket.h}. |
| |
| @item @file{netinet/if_ether.h} |
| @hdrindex{netinet/if_ether.h} |
| This header may require some combination of @file{sys/types.h}, |
| @file{sys/socket.h}, @file{netinet/in.h}, and @file{net/if.h}. |
| |
| @item @file{sys/mount.h} |
| @hdrindex{sys/mount.h} |
| This header may require @file{sys/params.h}. |
| |
| @item @file{sys/ptem.h} |
| @hdrindex{sys/ptem.h} |
| This header may require @file{sys/stream.h}. |
| |
| @item @file{sys/socket.h} |
| @hdrindex{sys/socket.h} |
| This header may require @file{sys/types.h}. |
| |
| @item @file{sys/ucred.h} |
| @hdrindex{sys/ucred.h} |
| This header may require @file{sys/types.h}. |
| |
| @item @file{X11/extensions/scrnsaver.h} |
| @hdrindex{X11/extensions/scrnsaver.h} |
| Using XFree86, this header requires @file{X11/Xlib.h}, which is probably |
| so required that you might not even consider looking for it. |
| |
| @end table |
| |
| |
| @node Particular Headers |
| @subsection Particular Header Checks |
| |
| These macros check for particular system header files---whether they |
| exist, and in some cases whether they declare certain symbols. |
| |
| @defmac AC_CHECK_HEADER_STDBOOL |
| @acindex{CHECK_HEADER_STDBOOL} |
| @cvindex HAVE__BOOL |
| @hdrindex{stdbool.h} |
| @caindex header_stdbool_h |
| Check whether @file{stdbool.h} exists and conforms to C99 or later, |
| and cache the result in the @code{ac_cv_header_stdbool_h} variable. |
| If the type @code{_Bool} is defined, define @code{HAVE__BOOL} to 1. |
| |
| This macro is obsolescent, as all current C compilers have @file{stdbool.h}, |
| a header that is itself obsolescent as of C23. |
| |
| This macro is intended for use by Gnulib (@pxref{Gnulib}) and other |
| packages that supply a substitute @file{stdbool.h} on platforms lacking |
| a conforming one. The @code{AC_HEADER_STDBOOL} macro is better for code |
| that explicitly checks for @file{stdbool.h}. |
| @end defmac |
| |
| @defmac AC_HEADER_ASSERT |
| @acindex{HEADER_ASSERT} |
| @cvindex NDEBUG |
| @hdrindex{assert.h} |
| Check whether to enable assertions in the style of @file{assert.h}. |
| Assertions are enabled by default, but the user can override this by |
| invoking @command{configure} with the @option{--disable-assert} option. |
| @end defmac |
| |
| @anchor{AC_HEADER_DIRENT} |
| @defmac AC_HEADER_DIRENT |
| @acindex{HEADER_DIRENT} |
| @cvindex HAVE_DIRENT_H |
| @cvindex HAVE_NDIR_H |
| @cvindex HAVE_SYS_DIR_H |
| @cvindex HAVE_SYS_NDIR_H |
| @hdrindex{dirent.h} |
| @hdrindex{sys/ndir.h} |
| @hdrindex{sys/dir.h} |
| @hdrindex{ndir.h} |
| Check for the following header files. For the first one that is |
| found and defines @samp{DIR}, define the listed C preprocessor macro: |
| |
| @multitable {@file{sys/ndir.h}} {@code{HAVE_SYS_NDIR_H}} |
| @item @file{dirent.h} @tab @code{HAVE_DIRENT_H} |
| @item @file{sys/ndir.h} @tab @code{HAVE_SYS_NDIR_H} |
| @item @file{sys/dir.h} @tab @code{HAVE_SYS_DIR_H} |
| @item @file{ndir.h} @tab @code{HAVE_NDIR_H} |
| @end multitable |
| |
| The directory-library declarations in your source code should look |
| something like the following: |
| |
| @example |
| @group |
| #include <sys/types.h> |
| #ifdef HAVE_DIRENT_H |
| # include <dirent.h> |
| # define NAMLEN(dirent) strlen ((dirent)->d_name) |
| #else |
| # define dirent direct |
| # define NAMLEN(dirent) ((dirent)->d_namlen) |
| # ifdef HAVE_SYS_NDIR_H |
| # include <sys/ndir.h> |
| # endif |
| # ifdef HAVE_SYS_DIR_H |
| # include <sys/dir.h> |
| # endif |
| # ifdef HAVE_NDIR_H |
| # include <ndir.h> |
| # endif |
| #endif |
| @end group |
| @end example |
| |
| Using the above declarations, the program would declare variables to be |
| of type @code{struct dirent}, not @code{struct direct}, and would access |
| the length of a directory entry name by passing a pointer to a |
| @code{struct dirent} to the @code{NAMLEN} macro. |
| |
| This macro also checks for the obsolete @file{dir} and @file{x} libraries. |
| |
| This macro is obsolescent, as all current systems with directory |
| libraries have @code{<dirent.h>}. New programs need not use this macro. |
| |
| Also see @code{AC_STRUCT_DIRENT_D_INO} and |
| @code{AC_STRUCT_DIRENT_D_TYPE} (@pxref{Particular Structures}). |
| @end defmac |
| |
| @anchor{AC_HEADER_MAJOR} |
| @defmac AC_HEADER_MAJOR |
| @acindex{HEADER_MAJOR} |
| @cvindex MAJOR_IN_MKDEV |
| @cvindex MAJOR_IN_SYSMACROS |
| @hdrindex{sys/mkdev.h} |
| @hdrindex{sys/sysmacros.h} |
| Detect the headers required to use @code{makedev}, @code{major}, and |
| @code{minor}. These functions may be defined by @file{sys/mkdev.h}, |
| @code{sys/sysmacros.h}, or @file{sys/types.h}. |
| |
| @code{AC_HEADER_MAJOR} defines @code{MAJOR_IN_MKDEV} if they are in |
| @file{sys/mkdev.h}, or @code{MAJOR_IN_SYSMACROS} if they are in |
| @file{sys/sysmacros.h}. If neither macro is defined, they are either in |
| @file{sys/types.h} or unavailable. |
| |
| To properly use these functions, your code should contain something |
| like: |
| |
| @verbatim |
| #include <sys/types.h> |
| #ifdef MAJOR_IN_MKDEV |
| # include <sys/mkdev.h> |
| #elif defined MAJOR_IN_SYSMACROS |
| # include <sys/sysmacros.h> |
| #endif |
| @end verbatim |
| |
| Note: Configure scripts built with Autoconf 2.69 or earlier will not |
| detect a problem if @file{sys/types.h} contains definitions of |
| @code{major}, @code{minor}, and/or @code{makedev} that trigger compiler |
| warnings upon use. This is known to occur with GNU libc 2.25, where |
| those definitions are being deprecated to reduce namespace pollution. |
| If it is not practical to use Autoconf 2.70 to regenerate the configure |
| script of affected software, you can work around the problem by setting |
| @samp{ac_cv_header_sys_types_h_makedev=no}, as an argument to |
| @command{configure} or as part of a @file{config.site} site default file |
| (@pxref{Site Defaults}). |
| @end defmac |
| |
| @defmac AC_HEADER_RESOLV |
| @acindex{HEADER_RESOLV} |
| @cvindex HAVE_RESOLV_H |
| @hdrindex{resolv.h} |
| Checks for header @file{resolv.h}, checking for prerequisites first. |
| To properly use @file{resolv.h}, your code should contain something like |
| the following: |
| |
| @verbatim |
| #ifdef HAVE_SYS_TYPES_H |
| # include <sys/types.h> |
| #endif |
| #ifdef HAVE_NETINET_IN_H |
| # include <netinet/in.h> /* inet_ functions / structs */ |
| #endif |
| #ifdef HAVE_ARPA_NAMESER_H |
| # include <arpa/nameser.h> /* DNS HEADER struct */ |
| #endif |
| #ifdef HAVE_NETDB_H |
| # include <netdb.h> |
| #endif |
| #include <resolv.h> |
| @end verbatim |
| @end defmac |
| |
| @anchor{AC_HEADER_STAT} |
| @defmac AC_HEADER_STAT |
| @acindex{HEADER_STAT} |
| @cvindex STAT_MACROS_BROKEN |
| @hdrindex{sys/stat.h} |
| If the macros @code{S_ISDIR}, @code{S_ISREG}, etc.@: defined in |
| @file{sys/stat.h} do not work properly (returning false positives), |
| define @code{STAT_MACROS_BROKEN}. This is the case on Tektronix UTekV, |
| Amdahl UTS and Motorola System V/88. |
| |
| This macro is obsolescent, as no current systems have the bug. |
| New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_HEADER_STDBOOL |
| @acindex{HEADER_STDBOOL} |
| @cvindex HAVE_STDBOOL_H |
| @cvindex HAVE__BOOL |
| @hdrindex{stdbool.h} |
| @caindex header_stdbool_h |
| If @file{stdbool.h} exists and conforms to C99 or later, define |
| @code{HAVE_STDBOOL_H} to 1; if the type @code{_Bool} is defined, define |
| @code{HAVE__BOOL} to 1. |
| |
| This macro is obsolescent, as all current C compilers have |
| @file{stdbool.h}, a header that is itself obsolescent as of C23. |
| Nowadays programs that need @code{bool}, @code{true} and @code{false} |
| can include @file{stdbool.h} unconditionally, without using |
| @code{AC_HEADER_STDBOOL}, and if such a program needs to be portable |
| only to C23 or later it need not even include @file{stdbool.h}. |
| |
| This macro caches its result in the @code{ac_cv_header_stdbool_h} |
| variable. |
| |
| This macro differs from @code{AC_CHECK_HEADER_STDBOOL} only in that it |
| defines @code{HAVE_STDBOOL_H} whereas @code{AC_CHECK_HEADER_STDBOOL} |
| does not. |
| @end defmac |
| |
| @anchor{AC_HEADER_STDC} |
| @defmac AC_HEADER_STDC |
| @acindex{HEADER_STDC} |
| @cvindex STDC_HEADERS |
| @caindex header_stdc |
| |
| This macro is obsolescent. Its sole effect is to make sure that all the |
| headers that are included by @code{AC_INCLUDES_DEFAULT} (@pxref{Default |
| Includes}), but not part of C89, have been checked for. |
| |
| All hosted environments that are still of interest for portable code |
| provide all of the headers specified in C89 (as amended in 1995). |
| @end defmac |
| |
| @defmac AC_HEADER_SYS_WAIT |
| @acindex{HEADER_SYS_WAIT} |
| @cvindex HAVE_SYS_WAIT_H |
| @hdrindex{sys/wait.h} |
| @caindex header_sys_wait_h |
| If @file{sys/wait.h} exists and is compatible with POSIX, define |
| @code{HAVE_SYS_WAIT_H}. Incompatibility can occur if @file{sys/wait.h} |
| does not exist, or if it uses the old BSD @code{union wait} instead |
| of @code{int} to store a status value. If @file{sys/wait.h} is not |
| POSIX compatible, then instead of including it, define the |
| POSIX macros with their usual interpretations. Here is an |
| example: |
| |
| @example |
| @group |
| #include <sys/types.h> |
| #ifdef HAVE_SYS_WAIT_H |
| # include <sys/wait.h> |
| #endif |
| #ifndef WEXITSTATUS |
| # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) |
| #endif |
| #ifndef WIFEXITED |
| # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) |
| #endif |
| @end group |
| @end example |
| |
| @noindent |
| This macro caches its result in the @code{ac_cv_header_sys_wait_h} |
| variable. |
| |
| This macro is obsolescent, as current systems are compatible with POSIX@. |
| New programs need not use this macro. |
| @end defmac |
| |
| @cvindex _POSIX_VERSION |
| @hdrindex{unistd.h} |
| @code{_POSIX_VERSION} is defined when @file{unistd.h} is included on |
| POSIX systems. If there is no @file{unistd.h}, it is definitely |
| not a POSIX system. However, some non-POSIX systems do |
| have @file{unistd.h}. |
| |
| The way to check whether the system says it supports POSIX is: |
| |
| @example |
| @group |
| #ifdef HAVE_UNISTD_H |
| # include <sys/types.h> |
| # include <unistd.h> |
| #endif |
| |
| #ifdef _POSIX_VERSION |
| /* Code for POSIX systems. */ |
| #endif |
| @end group |
| @end example |
| |
| @defmac AC_HEADER_TIOCGWINSZ |
| @acindex{HEADER_TIOCGWINSZ} |
| @cvindex GWINSZ_IN_SYS_IOCTL |
| @hdrindex{sys/ioctl.h} |
| @hdrindex{termios.h} |
| @c FIXME: I need clarifications from Jim. |
| If the use of @code{TIOCGWINSZ} requires @file{<sys/ioctl.h>}, then |
| define @code{GWINSZ_IN_SYS_IOCTL}. Otherwise @code{TIOCGWINSZ} can be |
| found in @file{<termios.h>}. |
| |
| Use: |
| |
| @example |
| @group |
| #ifdef HAVE_TERMIOS_H |
| # include <termios.h> |
| #endif |
| |
| #ifdef GWINSZ_IN_SYS_IOCTL |
| # include <sys/ioctl.h> |
| #endif |
| @end group |
| @end example |
| @end defmac |
| |
| @node Generic Headers |
| @subsection Generic Header Checks |
| |
| These macros are used to find system header files not covered by the |
| ``particular'' test macros. If you need to check the contents of a header |
| as well as find out whether it is present, you have to write your own |
| test for it (@pxref{Writing Tests}). |
| |
| @anchor{AC_CHECK_HEADER} |
| @defmac AC_CHECK_HEADER (@var{header-file}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @ovar{includes}) |
| @acindex{CHECK_HEADER} |
| @caindex header_@var{header-file} |
| If the system header file @var{header-file} is compilable, execute shell |
| commands @var{action-if-found}, otherwise execute |
| @var{action-if-not-found}. If you just want to define a symbol if the |
| header file is available, consider using @code{AC_CHECK_HEADERS} |
| instead. |
| |
| @var{includes} should be the appropriate @dfn{prerequisite} code, i.e.@: |
| whatever might be required to appear above |
| @samp{#include <@var{header-file}>} for it to compile without error. |
| This can be anything, but will normally be additional @samp{#include} |
| directives. If @var{includes} is omitted or empty, @file{configure} will |
| use the contents of the macro @code{AC_INCLUDES_DEFAULT}. |
| @xref{Default Includes}. |
| |
| This macro used to check only for the @emph{presence} of a header, not |
| whether its contents were acceptable to the compiler. Some older |
| @command{configure} scripts rely on this behavior, so it is still |
| available by specifying @samp{-} as @var{includes}. This mechanism is |
| deprecated as of Autoconf 2.70; situations where a preprocessor-only |
| check is required should use @code{AC_PREPROC_IFELSE}. |
| @xref{Running the Preprocessor}. |
| |
| This macro caches its result in the @code{ac_cv_header_@var{header-file}} |
| variable, with characters not suitable for a variable name mapped to |
| underscores. |
| @end defmac |
| |
| @anchor{AC_CHECK_HEADERS} |
| @defmac AC_CHECK_HEADERS (@var{header-file}@dots{}, @ |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ |
| @ovar{includes}) |
| @acindex{CHECK_HEADERS} |
| @cvindex HAVE_@var{header} |
| @caindex header_@var{header-file} |
| For each given system header file @var{header-file} in the |
| blank-separated argument list that exists, define |
| @code{HAVE_@var{header-file}} (in all capitals). If @var{action-if-found} |
| is given, it is additional shell code to execute when one of the header |
| files is found. You can give it a value of @samp{break} to break out of |
| the loop on the first match. If @var{action-if-not-found} is given, it |
| is executed when one of the header files is not found. |
| |
| @var{includes} is interpreted as in @code{AC_CHECK_HEADER}, in order to |
| choose the set of preprocessor directives supplied before the header |
| under test. |
| |
| This macro caches its result in the @code{ac_cv_header_@var{header-file}} |
| variable, with characters not suitable for a variable name mapped to |
| underscores. |
| @end defmac |
| |
| @defmac AC_CHECK_HEADERS_ONCE (@var{header-file}@dots{}) |
| @acindex{CHECK_HEADERS_ONCE} |
| @cvindex HAVE_@var{header} |
| For each given system header file @var{header-file} in the |
| blank-separated argument list that exists, define |
| @code{HAVE_@var{header-file}} (in all capitals). |
| |
| If you do not need the full power of @code{AC_CHECK_HEADERS}, this |
| variant generates smaller, faster @command{configure} files. All |
| headers passed to @code{AC_CHECK_HEADERS_ONCE} are checked for in one |
| pass, early during the @command{configure} run. The checks cannot be |
| conditionalized, you cannot specify an @var{action-if-found} or |
| @var{action-if-not-found}, and @code{AC_INCLUDES_DEFAULT} is always used |
| for the prerequisites. |
| @end defmac |
| |
| In previous versions of Autoconf, these macros merely checked whether |
| the header was accepted by the preprocessor. This was changed because |
| the old test was inappropriate for typical uses. Headers are typically |
| used to compile, not merely to preprocess, and the old behavior |
| sometimes accepted headers that clashed at compile-time |
| (@pxref{Present But Cannot Be Compiled}). If for some reason it is |
| inappropriate to check whether a header is compilable, you should use |
| @code{AC_PREPROC_IFELSE} (@pxref{Running the Preprocessor}) instead of |
| these macros. |
| |
| Requiring each header to compile improves the robustness of the test, |
| but it also requires you to make sure that the @var{includes} are |
| correct. Most system headers nowadays make sure to @code{#include} |
| whatever they require, or else have their dependencies satisfied by |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), but |
| @pxref{Header Portability}, for known exceptions. In general, if you |
| are looking for @file{bar.h}, which requires that @file{foo.h} be |
| included first if it exists, you should do something like this: |
| |
| @example |
| AC_CHECK_HEADERS([foo.h]) |
| AC_CHECK_HEADERS([bar.h], [], [], |
| [#ifdef HAVE_FOO_H |
| # include <foo.h> |
| #endif |
| ]) |
| @end example |
| |
| @node Declarations |
| @section Declarations |
| @cindex Declaration, checking |
| |
| The following macros check for the declaration of variables and |
| functions. If there is no macro specifically defined to check for a |
| symbol you need, then you can use the general macros (@pxref{Generic |
| Declarations}) or, for more complex tests, you may use |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}). |
| |
| @menu |
| * Particular Declarations:: Macros to check for certain declarations |
| * Generic Declarations:: How to find other declarations |
| @end menu |
| |
| @node Particular Declarations |
| @subsection Particular Declaration Checks |
| |
| There are no specific macros for declarations. |
| |
| @node Generic Declarations |
| @subsection Generic Declaration Checks |
| |
| These macros are used to find declarations not covered by the ``particular'' |
| test macros. |
| |
| @defmac AC_CHECK_DECL (@var{symbol}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_DECL} |
| @caindex have_decl_@var{symbol} |
| If @var{symbol} (a function, variable, or constant) is not declared in |
| @var{includes} and a declaration is needed, run the shell commands |
| @var{action-if-not-found}, otherwise @var{action-if-found}. |
| @var{includes} is a series of include directives, defaulting to |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used |
| prior to the declaration under test. |
| |
| This macro actually tests whether @var{symbol} is defined as a macro or |
| can be used as an r-value, not whether it is really declared, because it |
| is much safer to avoid introducing extra declarations when they are not |
| needed. In order to facilitate use of C++ and overloaded function |
| declarations, it is possible to specify function argument types in |
| parentheses for types which can be zero-initialized: |
| |
| @example |
| AC_CHECK_DECL([basename(char *)]) |
| @end example |
| |
| This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}} |
| variable, with characters not suitable for a variable name mapped to |
| underscores. |
| @end defmac |
| |
| @anchor{AC_CHECK_DECLS} |
| @defmac AC_CHECK_DECLS (@var{symbols}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_DECLS} |
| @cvindex HAVE_DECL_@var{symbol} |
| @caindex have_decl_@var{symbol} |
| For each of the @var{symbols} (@emph{comma}-separated list with optional |
| function argument types for C++ overloads), define |
| @code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if |
| @var{symbol} is declared, otherwise to @samp{0}. If |
| @var{action-if-not-found} is given, it is additional shell code to |
| execute when one of the function declarations is needed, otherwise |
| @var{action-if-found} is executed. |
| |
| @var{includes} is a series of include directives, defaulting to |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used |
| prior to the declarations under test. |
| |
| This macro uses an M4 list as first argument: |
| @example |
| AC_CHECK_DECLS([strdup]) |
| AC_CHECK_DECLS([strlen]) |
| AC_CHECK_DECLS([malloc, realloc, calloc, free]) |
| AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]]) |
| AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]]) |
| @end example |
| |
| Unlike the other @samp{AC_CHECK_*S} macros, when a @var{symbol} is not |
| declared, @code{HAVE_DECL_@var{symbol}} is defined to @samp{0} instead |
| of leaving @code{HAVE_DECL_@var{symbol}} undeclared. When you are |
| @emph{sure} that the check was performed, use |
| @code{HAVE_DECL_@var{symbol}} in @code{#if}: |
| |
| @example |
| #if !HAVE_DECL_SYMBOL |
| extern char *symbol; |
| #endif |
| @end example |
| |
| @noindent |
| If the test may have not been performed, however, because it is safer |
| @emph{not} to declare a symbol than to use a declaration that conflicts |
| with the system's one, you should use: |
| |
| @example |
| #if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC |
| void *malloc (size_t *s); |
| #endif |
| @end example |
| |
| @noindent |
| You fall into the second category only in extreme situations: either |
| your files may be used without being configured, or they are used during |
| the configuration. In most cases the traditional approach is enough. |
| |
| This macro caches its results in @code{ac_cv_have_decl_@var{symbol}} |
| variables, with characters not suitable for a variable name mapped to |
| underscores. |
| @end defmac |
| |
| @defmac AC_CHECK_DECLS_ONCE (@var{symbols}) |
| @acindex{CHECK_DECLS_ONCE} |
| @cvindex HAVE_DECL_@var{symbol} |
| For each of the @var{symbols} (@emph{comma}-separated list), define |
| @code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if |
| @var{symbol} is declared in the default include files, otherwise to |
| @samp{0}. This is a once-only variant of @code{AC_CHECK_DECLS}. It |
| generates the checking code at most once, so that @command{configure} is |
| smaller and faster; but the checks cannot be conditionalized and are |
| always done once, early during the @command{configure} run. |
| @end defmac |
| |
| |
| @node Structures |
| @section Structures |
| @cindex Structure, checking |
| |
| The following macros check for the presence of certain members in C |
| structures. If there is no macro specifically defined to check for a |
| member you need, then you can use the general structure-member macros |
| (@pxref{Generic Structures}) or, for more complex tests, you may use |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}). |
| |
| @menu |
| * Particular Structures:: Macros to check for certain structure members |
| * Generic Structures:: How to find other structure members |
| @end menu |
| |
| @node Particular Structures |
| @subsection Particular Structure Checks |
| |
| The following macros check for certain structures or structure members. |
| |
| @defmac AC_STRUCT_DIRENT_D_INO |
| @acindex{STRUCT_DIRENT_D_INO} |
| @cvindex HAVE_STRUCT_DIRENT_D_INO |
| @c @caindex header_dirent_dirent_h |
| @c @caindex member_struct_dirent_d_ino |
| Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular |
| Headers}). Then, if @code{struct dirent} contains a @code{d_ino} |
| member, define @code{HAVE_STRUCT_DIRENT_D_INO}. |
| |
| @code{HAVE_STRUCT_DIRENT_D_INO} indicates only the presence of |
| @code{d_ino}, not whether its contents are always reliable. |
| Traditionally, a zero @code{d_ino} indicated a deleted directory entry, |
| though current systems hide this detail from the user and never return |
| zero @code{d_ino} values. |
| Many current systems report an incorrect @code{d_ino} for a directory |
| entry that is a mount point. |
| @end defmac |
| |
| @defmac AC_STRUCT_DIRENT_D_TYPE |
| @acindex{STRUCT_DIRENT_D_TYPE} |
| @cvindex HAVE_STRUCT_DIRENT_D_TYPE |
| @c @caindex header_dirent_dirent_h |
| @c @caindex member_struct_dirent_d_type |
| Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular |
| Headers}). Then, if @code{struct dirent} contains a @code{d_type} |
| member, define @code{HAVE_STRUCT_DIRENT_D_TYPE}. |
| @end defmac |
| |
| @anchor{AC_STRUCT_ST_BLOCKS} |
| @defmac AC_STRUCT_ST_BLOCKS |
| @acindex{STRUCT_ST_BLOCKS} |
| @cvindex HAVE_STRUCT_STAT_ST_BLOCKS |
| @cvindex HAVE_ST_BLOCKS |
| @ovindex LIBOBJS |
| @caindex member_struct_stat_st_blocks |
| If @code{struct stat} contains an @code{st_blocks} member, define |
| @code{HAVE_STRUCT_STAT_ST_BLOCKS}. Otherwise, require an |
| @code{AC_LIBOBJ} replacement of @samp{fileblocks}. The former name, |
| @code{HAVE_ST_BLOCKS} is to be avoided, as its support will cease in the |
| future. |
| |
| This macro caches its result in the @code{ac_cv_member_struct_stat_st_blocks} |
| variable. |
| @end defmac |
| |
| @defmac AC_STRUCT_TM |
| @acindex{STRUCT_TM} |
| @cvindex TM_IN_SYS_TIME |
| @hdrindex{time.h} |
| @hdrindex{sys/time.h} |
| If @file{time.h} does not define @code{struct tm}, define |
| @code{TM_IN_SYS_TIME}, which means that including @file{sys/time.h} |
| had better define @code{struct tm}. |
| |
| This macro is obsolescent, as @file{time.h} defines @code{struct tm} in |
| current systems. New programs need not use this macro. |
| @end defmac |
| |
| @anchor{AC_STRUCT_TIMEZONE} |
| @defmac AC_STRUCT_TIMEZONE |
| @acindex{STRUCT_TIMEZONE} |
| @cvindex HAVE_DECL_TZNAME |
| @cvindex HAVE_STRUCT_TM_TM_ZONE |
| @cvindex HAVE_TM_ZONE |
| @cvindex HAVE_TZNAME |
| @c @caindex member_struct_tm_tm_zone |
| @c @caindex struct_tm |
| Figure out how to get the current timezone. If @code{struct tm} has a |
| @code{tm_zone} member, define @code{HAVE_STRUCT_TM_TM_ZONE} (and the |
| obsoleted @code{HAVE_TM_ZONE}). Otherwise, if the external array |
| @code{tzname} is found, define @code{HAVE_TZNAME}; if it is declared, |
| define @code{HAVE_DECL_TZNAME}. |
| @end defmac |
| |
| @node Generic Structures |
| @subsection Generic Structure Checks |
| |
| These macros are used to find structure members not covered by the |
| ``particular'' test macros. |
| |
| @defmac AC_CHECK_MEMBER (@var{aggregate}.@var{member}, @ |
| @ovar{action-if-found}, @ovar{action-if-not-found}, @ |
| @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_MEMBER} |
| @caindex member_@var{aggregate}_@var{member} |
| Check whether @var{member} is a member of the aggregate @var{aggregate}. |
| If no @var{includes} are specified, the default includes are used |
| (@pxref{Default Includes}). |
| |
| @example |
| AC_CHECK_MEMBER([struct passwd.pw_gecos], [], |
| [AC_MSG_ERROR([we need 'passwd.pw_gecos'])], |
| [[#include <pwd.h>]]) |
| @end example |
| |
| You can use this macro for submembers: |
| |
| @example |
| AC_CHECK_MEMBER(struct top.middle.bot) |
| @end example |
| |
| This macro caches its result in the |
| @code{ac_cv_member_@var{aggregate}_@var{member}} variable, with |
| characters not suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| @anchor{AC_CHECK_MEMBERS} |
| @defmac AC_CHECK_MEMBERS (@var{members}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_MEMBERS} |
| @cvindex HAVE_@var{aggregate}_@var{member} |
| Check for the existence of each @samp{@var{aggregate}.@var{member}} of |
| @var{members} using the previous macro. When @var{member} belongs to |
| @var{aggregate}, define @code{HAVE_@var{aggregate}_@var{member}} (in all |
| capitals, with spaces and dots replaced by underscores). If |
| @var{action-if-found} is given, it is executed for each of the found |
| members. If @var{action-if-not-found} is given, it is executed for each |
| of the members that could not be found. |
| |
| @var{includes} is a series of include directives, defaulting to |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used |
| prior to the members under test. |
| |
| This macro uses M4 lists: |
| @example |
| AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize]) |
| @end example |
| @end defmac |
| |
| |
| @node Types |
| @section Types |
| @cindex Types |
| @cindex C types |
| |
| The following macros check for C types, either builtin or typedefs. If |
| there is no macro specifically defined to check for a type you need, and |
| you don't need to check for any special properties of it, then you can |
| use a general type-check macro. |
| |
| @menu |
| * Particular Types:: Special handling to find certain types |
| * Generic Types:: How to find other types |
| @end menu |
| |
| @node Particular Types |
| @subsection Particular Type Checks |
| |
| @hdrindex{sys/types.h} |
| @hdrindex{stdlib.h} |
| @hdrindex{stdint.h} |
| @hdrindex{inttypes.h} |
| These macros check for particular C types in @file{sys/types.h}, |
| @file{stdlib.h}, @file{stdint.h}, @file{inttypes.h} and others, if they |
| exist. |
| |
| The Gnulib @code{stdint} module is an alternate way to define many of |
| these symbols; it is useful if you prefer your code to assume a |
| C99-or-better environment. @xref{Gnulib}. |
| |
| @anchor{AC_TYPE_GETGROUPS} |
| @defmac AC_TYPE_GETGROUPS |
| @acindex{TYPE_GETGROUPS} |
| @cvindex GETGROUPS_T |
| @caindex type_getgroups |
| Define @code{GETGROUPS_T} to be whichever of @code{gid_t} or @code{int} |
| is the base type of the array argument to @code{getgroups}. |
| |
| This macro caches the base type in the @code{ac_cv_type_getgroups} |
| variable. |
| @end defmac |
| |
| @defmac AC_TYPE_INT8_T |
| @acindex{TYPE_INT8_T} |
| @cvindex HAVE_INT8_T |
| @cvindex int8_t |
| @caindex c_int8_t |
| If @file{stdint.h} or @file{inttypes.h} does not define the type |
| @code{int8_t}, define @code{int8_t} to a signed |
| integer type that is exactly 8 bits wide and that uses two's complement |
| representation, if such a type exists. |
| If you are worried about porting to hosts that lack such a type, you can |
| use the results of this macro as follows: |
| |
| @example |
| #if HAVE_STDINT_H |
| # include <stdint.h> |
| #endif |
| #if defined INT8_MAX || defined int8_t |
| @emph{code using int8_t} |
| #else |
| @emph{complicated alternative using >8-bit 'signed char'} |
| #endif |
| @end example |
| |
| This macro caches the type in the @code{ac_cv_c_int8_t} variable. |
| @end defmac |
| |
| @defmac AC_TYPE_INT16_T |
| @acindex{TYPE_INT16_T} |
| @cvindex HAVE_INT16_T |
| @cvindex int16_t |
| @caindex c_int16_t |
| This is like @code{AC_TYPE_INT8_T}, except for 16-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_INT32_T |
| @acindex{TYPE_INT32_T} |
| @cvindex HAVE_INT32_T |
| @cvindex int32_t |
| @caindex c_int32_t |
| This is like @code{AC_TYPE_INT8_T}, except for 32-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_INT64_T |
| @acindex{TYPE_INT64_T} |
| @cvindex HAVE_INT64_T |
| @cvindex int64_t |
| @caindex c_int64_t |
| This is like @code{AC_TYPE_INT8_T}, except for 64-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_INTMAX_T |
| @acindex{TYPE_INTMAX_T} |
| @cvindex HAVE_INTMAX_T |
| @cvindex intmax_t |
| @c @caindex type_intmax_t |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{intmax_t}, |
| define @code{HAVE_INTMAX_T}. Otherwise, define @code{intmax_t} to the |
| widest signed integer type. |
| @end defmac |
| |
| @defmac AC_TYPE_INTPTR_T |
| @acindex{TYPE_INTPTR_T} |
| @cvindex HAVE_INTPTR_T |
| @cvindex intptr_t |
| @c @caindex type_intptr_t |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{intptr_t}, |
| define @code{HAVE_INTPTR_T}. Otherwise, define @code{intptr_t} to a |
| signed integer type wide enough to hold a pointer, if such a type |
| exists. |
| @end defmac |
| |
| @defmac AC_TYPE_LONG_DOUBLE |
| @acindex{TYPE_LONG_DOUBLE} |
| @cvindex HAVE_LONG_DOUBLE |
| @caindex type_long_double |
| If the C compiler supports a working @code{long double} type, define |
| @code{HAVE_LONG_DOUBLE}. The @code{long double} type might have the |
| same range and precision as @code{double}. |
| |
| This macro caches its result in the @code{ac_cv_type_long_double} |
| variable. |
| |
| This macro is obsolescent, as current C compilers support @code{long |
| double}. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_TYPE_LONG_DOUBLE_WIDER |
| @acindex{TYPE_LONG_DOUBLE_WIDER} |
| @cvindex HAVE_LONG_DOUBLE_WIDER |
| @caindex type_long_double_wider |
| If the C compiler supports a working @code{long double} type with more |
| range or precision than the @code{double} type, define |
| @code{HAVE_LONG_DOUBLE_WIDER}. |
| |
| This macro caches its result in the @code{ac_cv_type_long_double_wider} |
| variable. |
| @end defmac |
| |
| @defmac AC_TYPE_LONG_LONG_INT |
| @acindex{TYPE_LONG_LONG_INT} |
| @cvindex HAVE_LONG_LONG_INT |
| @caindex type_long_long_int |
| If the C compiler supports a working @code{long long int} type, define |
| @code{HAVE_LONG_LONG_INT}. However, this test does not test |
| @code{long long int} values in preprocessor @code{#if} expressions, |
| because too many compilers mishandle such expressions. |
| @xref{Preprocessor Arithmetic}. |
| |
| This macro caches its result in the @code{ac_cv_type_long_long_int} |
| variable. |
| @end defmac |
| |
| @defmac AC_TYPE_MBSTATE_T |
| @acindex{TYPE_MBSTATE_T} |
| @cvindex mbstate_t |
| @hdrindex{wchar.h} |
| @caindex type_mbstate_t |
| Define @code{HAVE_MBSTATE_T} if @code{<wchar.h>} declares the |
| @code{mbstate_t} type. Also, define @code{mbstate_t} to be a type if |
| @code{<wchar.h>} does not declare it. |
| |
| This macro caches its result in the @code{ac_cv_type_mbstate_t} |
| variable. |
| @end defmac |
| |
| @anchor{AC_TYPE_MODE_T} |
| @defmac AC_TYPE_MODE_T |
| @acindex{TYPE_MODE_T} |
| @cvindex mode_t |
| @caindex type_mode_t |
| Define @code{mode_t} to a suitable type, if standard headers do not |
| define it. |
| |
| This macro caches its result in the @code{ac_cv_type_mode_t} variable. |
| @end defmac |
| |
| @anchor{AC_TYPE_OFF_T} |
| @defmac AC_TYPE_OFF_T |
| @acindex{TYPE_OFF_T} |
| @cvindex off_t |
| @caindex type_off_t |
| Define @code{off_t} to a suitable type, if standard headers do not |
| define it. |
| |
| This macro caches its result in the @code{ac_cv_type_off_t} variable. |
| @end defmac |
| |
| @anchor{AC_TYPE_PID_T} |
| @defmac AC_TYPE_PID_T |
| @acindex{TYPE_PID_T} |
| @cvindex pid_t |
| @caindex type_pid_t |
| Define @code{pid_t} to a suitable type, if standard headers do not |
| define it. |
| |
| This macro caches its result in the @code{ac_cv_type_pid_t} variable. |
| @end defmac |
| |
| @anchor{AC_TYPE_SIZE_T} |
| @defmac AC_TYPE_SIZE_T |
| @acindex{TYPE_SIZE_T} |
| @cvindex size_t |
| @caindex type_size_t |
| Define @code{size_t} to a suitable type, if standard headers do not |
| define it. |
| |
| This macro caches its result in the @code{ac_cv_type_size_t} variable. |
| @end defmac |
| |
| @defmac AC_TYPE_SSIZE_T |
| @acindex{TYPE_SSIZE_T} |
| @cvindex ssize_t |
| @caindex type_ssize_t |
| Define @code{ssize_t} to a suitable type, if standard headers do not |
| define it. |
| |
| This macro caches its result in the @code{ac_cv_type_ssize_t} variable. |
| @end defmac |
| |
| @anchor{AC_TYPE_UID_T} |
| @defmac AC_TYPE_UID_T |
| @acindex{TYPE_UID_T} |
| @cvindex uid_t |
| @cvindex gid_t |
| @caindex type_uid_t |
| Define @code{uid_t} and @code{gid_t} to suitable types, if standard |
| headers do not define them. |
| |
| This macro caches its result in the @code{ac_cv_type_uid_t} variable. |
| @end defmac |
| |
| @defmac AC_TYPE_UINT8_T |
| @acindex{TYPE_UINT8_T} |
| @cvindex HAVE_UINT8_T |
| @cvindex uint8_t |
| @caindex c_uint8_t |
| If @file{stdint.h} or @file{inttypes.h} does not define the type |
| @code{uint8_t}, define @code{uint8_t} to an |
| unsigned integer type that is exactly 8 bits wide, if such a type |
| exists. |
| This is like @code{AC_TYPE_INT8_T}, except for unsigned integers. |
| @end defmac |
| |
| @defmac AC_TYPE_UINT16_T |
| @acindex{TYPE_UINT16_T} |
| @cvindex HAVE_UINT16_T |
| @cvindex uint16_t |
| @caindex c_uint16_t |
| This is like @code{AC_TYPE_UINT8_T}, except for 16-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_UINT32_T |
| @acindex{TYPE_UINT32_T} |
| @cvindex HAVE_UINT32_T |
| @cvindex uint32_t |
| @caindex c_uint32_t |
| This is like @code{AC_TYPE_UINT8_T}, except for 32-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_UINT64_T |
| @acindex{TYPE_UINT64_T} |
| @cvindex HAVE_UINT64_T |
| @cvindex uint64_t |
| @caindex c_uint64_t |
| This is like @code{AC_TYPE_UINT8_T}, except for 64-bit integers. |
| @end defmac |
| |
| @defmac AC_TYPE_UINTMAX_T |
| @acindex{TYPE_UINTMAX_T} |
| @cvindex HAVE_UINTMAX_T |
| @cvindex uintmax_t |
| @c @caindex type_uintmax_t |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintmax_t}, |
| define @code{HAVE_UINTMAX_T}. Otherwise, define @code{uintmax_t} to the |
| widest unsigned integer type. |
| @end defmac |
| |
| @defmac AC_TYPE_UINTPTR_T |
| @acindex{TYPE_UINTPTR_T} |
| @cvindex HAVE_UINTPTR_T |
| @cvindex uintptr_t |
| @c @caindex type_uintptr_t |
| If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintptr_t}, |
| define @code{HAVE_UINTPTR_T}. Otherwise, define @code{uintptr_t} to an |
| unsigned integer type wide enough to hold a pointer, if such a type |
| exists. |
| @end defmac |
| |
| @defmac AC_TYPE_UNSIGNED_LONG_LONG_INT |
| @acindex{TYPE_UNSIGNED_LONG_LONG_INT} |
| @cvindex HAVE_UNSIGNED_LONG_LONG_INT |
| @caindex type_unsigned_long_long_int |
| If the C compiler supports a working @code{unsigned long long int} type, |
| define @code{HAVE_UNSIGNED_LONG_LONG_INT}. However, this test does not test |
| @code{unsigned long long int} values in preprocessor @code{#if} expressions, |
| because too many compilers mishandle such expressions. |
| @xref{Preprocessor Arithmetic}. |
| |
| This macro caches its result in the @code{ac_cv_type_unsigned_long_long_int} |
| variable. |
| @end defmac |
| |
| @node Generic Types |
| @subsection Generic Type Checks |
| |
| These macros are used to check for types not covered by the ``particular'' |
| test macros. |
| |
| @defmac AC_CHECK_TYPE (@var{type}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_TYPE} |
| @caindex type_@var{type} |
| Check whether @var{type} is defined. It may be a compiler builtin type |
| or defined by the @var{includes}. @var{includes} is a series of include |
| directives, defaulting to @code{AC_INCLUDES_DEFAULT} (@pxref{Default |
| Includes}), which are used prior to the type under test. |
| |
| In C, @var{type} must be a type-name, so that the expression @samp{sizeof |
| (@var{type})} is valid (but @samp{sizeof ((@var{type}))} is not). The |
| same test is applied when compiling for C++, which means that in C++ |
| @var{type} should be a type-id and should not be an anonymous |
| @samp{struct} or @samp{union}. |
| |
| This macro caches its result in the @code{ac_cv_type_@var{type}} |
| variable, with @samp{*} mapped to @samp{p} and other characters not |
| suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| |
| @defmac AC_CHECK_TYPES (@var{types}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_TYPES} |
| @cvindex HAVE_@var{type} |
| For each @var{type} of the @var{types} that is defined, define |
| @code{HAVE_@var{type}} (in all capitals). Each @var{type} must follow |
| the rules of @code{AC_CHECK_TYPE}. If no @var{includes} are |
| specified, the default includes are used (@pxref{Default Includes}). If |
| @var{action-if-found} is given, it is additional shell code to execute |
| when one of the types is found. If @var{action-if-not-found} is given, |
| it is executed when one of the types is not found. |
| |
| This macro uses M4 lists: |
| @example |
| AC_CHECK_TYPES([ptrdiff_t]) |
| AC_CHECK_TYPES([unsigned long long int, uintmax_t]) |
| AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]]) |
| @end example |
| |
| @end defmac |
| |
| Autoconf, up to 2.13, used to provide to another version of |
| @code{AC_CHECK_TYPE}, broken by design. In order to keep backward |
| compatibility, a simple heuristic, quite safe but not totally, is |
| implemented. In case of doubt, read the documentation of the former |
| @code{AC_CHECK_TYPE}, see @ref{Obsolete Macros}. |
| |
| |
| @node Compilers and Preprocessors |
| @section Compilers and Preprocessors |
| @cindex Compilers |
| @cindex Preprocessors |
| |
| @ovindex EXEEXT |
| All the tests for compilers (@code{AC_PROG_CC}, @code{AC_PROG_CXX}, |
| @code{AC_PROG_F77}) define the output variable @code{EXEEXT} based on |
| the output of the compiler, typically to the empty string if |
| POSIX and @samp{.exe} if a DOS variant. |
| |
| @ovindex OBJEXT |
| They also define the output variable @code{OBJEXT} based on the |
| output of the compiler, after @file{.c} files have been excluded, typically |
| to @samp{o} if POSIX, @samp{obj} if a DOS variant. |
| |
| If the compiler being used does not produce executables, the tests fail. If |
| the executables can't be run, and cross-compilation is not enabled, they |
| fail too. @xref{Manual Configuration}, for more on support for cross |
| compiling. |
| |
| @menu |
| * Specific Compiler Characteristics:: Some portability issues |
| * Generic Compiler Characteristics:: Language independent tests and features |
| * C Compiler:: Checking its characteristics |
| * C++ Compiler:: Likewise |
| * Objective C Compiler:: Likewise |
| * Objective C++ Compiler:: Likewise |
| * Erlang Compiler and Interpreter:: Likewise |
| * Fortran Compiler:: Likewise |
| * Go Compiler:: Likewise |
| @end menu |
| |
| @node Specific Compiler Characteristics |
| @subsection Specific Compiler Characteristics |
| |
| Some compilers exhibit different behaviors. |
| |
| @table @asis |
| @item Static/Dynamic Expressions |
| Autoconf relies on a trick to extract one bit of information from the C |
| compiler: using negative array sizes. For instance the following |
| excerpt of a C source demonstrates how to test whether @samp{int} objects are 4 |
| bytes wide: |
| |
| @example |
| static int test_array[sizeof (int) == 4 ? 1 : -1]; |
| @end example |
| |
| @noindent |
| To our knowledge, there is a single compiler that does not support this |
| trick: the HP C compilers (the real ones, not only the |
| ``bundled'') on HP-UX 11.00. |
| They incorrectly reject the above program with the diagnostic |
| ``Variable-length arrays cannot have static storage.'' |
| This bug comes from HP compilers' mishandling of @code{sizeof (int)}, |
| not from the @code{? 1 : -1}, and |
| Autoconf works around this problem by casting @code{sizeof (int)} to |
| @code{long int} before comparing it. |
| @end table |
| |
| @node Generic Compiler Characteristics |
| @subsection Generic Compiler Characteristics |
| |
| @anchor{AC_CHECK_SIZEOF} |
| @defmac AC_CHECK_SIZEOF (@var{type-or-expr}, @ovar{unused}, @ |
| @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_SIZEOF} |
| @cvindex SIZEOF_@var{type-or-expr} |
| @caindex sizeof_@var{type-or-expr} |
| Define @code{SIZEOF_@var{type-or-expr}} (@pxref{Standard Symbols}) to be |
| the size in bytes of @var{type-or-expr}, which may be either a type or |
| an expression returning a value that has a size. If the expression |
| @samp{sizeof (@var{type-or-expr})} is invalid, the result is 0. |
| @var{includes} is a series of include directives, defaulting to |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used |
| prior to the expression under test. |
| |
| This macro now works even when cross-compiling. The @var{unused} |
| argument was used when cross-compiling. |
| |
| For example, the call |
| |
| @example |
| @c If you change this example, adjust tests/semantics.at:AC_CHECK_SIZEOF struct. |
| AC_CHECK_SIZEOF([int *]) |
| @end example |
| |
| @noindent |
| defines @code{SIZEOF_INT_P} to be 8 on x86-64 systems. |
| |
| This macro caches its result in the @code{ac_cv_sizeof_@var{type-or-expr}} |
| variable, with @samp{*} mapped to @samp{p} and other characters not |
| suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| @defmac AC_CHECK_ALIGNOF (@var{type}, @dvar{includes, AC_INCLUDES_DEFAULT}) |
| @acindex{CHECK_ALIGNOF} |
| @cvindex ALIGNOF_@var{type} |
| @caindex alignof_@var{type-or-expr} |
| Define @code{ALIGNOF_@var{type}} (@pxref{Standard Symbols}) to be the |
| alignment in bytes of @var{type}. @samp{@var{type} y;} must be valid as |
| a structure member declaration. If @samp{type} is unknown, the result |
| is 0. If no @var{includes} are specified, the default includes are used |
| (@pxref{Default Includes}). |
| |
| This macro caches its result in the @code{ac_cv_alignof_@var{type-or-expr}} |
| variable, with @samp{*} mapped to @samp{p} and other characters not |
| suitable for a variable name mapped to underscores. |
| @end defmac |
| |
| @defmac AC_COMPUTE_INT (@var{var}, @var{expression}, @ |
| @dvar{includes, AC_INCLUDES_DEFAULT}, @ovar{action-if-fails}) |
| @acindex{COMPUTE_INT} |
| Store into the shell variable @var{var} the value of the integer |
| @var{expression}. The |
| value should fit in an initializer in a C variable of type @code{signed |
| long}. To support cross compilation, it should be possible to evaluate |
| the expression at compile-time. If no @var{includes} are specified, the |
| default includes are used (@pxref{Default Includes}). |
| |
| Execute @var{action-if-fails} if the value cannot be determined correctly. |
| @end defmac |
| |
| @defmac AC_LANG_WERROR |
| @acindex{LANG_WERROR} |
| Normally Autoconf ignores warnings generated by the compiler, linker, and |
| preprocessor. If this macro is used, warnings count as fatal |
| errors for the current language. This macro is useful when the |
| results of configuration are used where warnings are unacceptable; for |
| instance, if parts of a program are built with the GCC |
| @option{-Werror} |
| option. If the whole program is built using @option{-Werror} it is |
| often simpler to put @option{-Werror} in the compiler flags (@code{CFLAGS}, |
| etc.). |
| @end defmac |
| |
| @defmac AC_OPENMP |
| @acindex{OPENMP} |
| @cvindex _OPENMP |
| @ovindex OPENMP_CFLAGS |
| @ovindex OPENMP_CXXFLAGS |
| @ovindex OPENMP_FFLAGS |
| @ovindex OPENMP_FCFLAGS |
| @caindex prog_c_openmp |
| @caindex prog_cxx_openmp |
| @caindex prog_f77_openmp |
| @caindex prog_fc_openmp |
| @uref{https://@/www.openmp.org/, OpenMP} specifies extensions of C, C++, |
| and Fortran that simplify optimization of shared memory parallelism, |
| which is a common problem on multi-core CPUs. |
| |
| If the current language is C, the macro @code{AC_OPENMP} sets the |
| variable @code{OPENMP_CFLAGS} to the C compiler flags needed for |
| supporting OpenMP@. @code{OPENMP_CFLAGS} is set to empty if the |
| compiler already supports OpenMP, if it has no way to activate OpenMP |
| support, or if the user rejects OpenMP support by invoking |
| @samp{configure} with the @samp{--disable-openmp} option. |
| |
| @code{OPENMP_CFLAGS} needs to be used when compiling programs, when |
| preprocessing program source, and when linking programs. Therefore you |
| need to add @code{$(OPENMP_CFLAGS)} to the @code{CFLAGS} of C programs |
| that use OpenMP@. If you preprocess OpenMP-specific C code, you also |
| need to add @code{$(OPENMP_CFLAGS)} to @code{CPPFLAGS}. The presence of |
| OpenMP support is revealed at compile time by the preprocessor macro |
| @code{_OPENMP}. |
| |
| Linking a program with @code{OPENMP_CFLAGS} typically adds one more |
| shared library to the program's dependencies, so its use is recommended |
| only on programs that actually require OpenMP. |
| |
| If the current language is C++, @code{AC_OPENMP} sets the variable |
| @code{OPENMP_CXXFLAGS}, suitably for the C++ compiler. The same remarks |
| hold as for C. |
| |
| If the current language is Fortran 77 or Fortran, @code{AC_OPENMP} sets |
| the variable @code{OPENMP_FFLAGS} or @code{OPENMP_FCFLAGS}, |
| respectively. Similar remarks as for C hold, except that |
| @code{CPPFLAGS} is not used for Fortran, and no preprocessor macro |
| signals OpenMP support. |
| |
| For portability, it is best to avoid spaces between @samp{#} and |
| @samp{pragma omp}. That is, write @samp{#pragma omp}, not |
| @samp{# pragma omp}. The Sun WorkShop 6.2 C compiler chokes on the |
| latter. |
| |
| This macro caches its result in the @code{ac_cv_prog_c_openmp}, |
| @code{ac_cv_prog_cxx_openmp}, @code{ac_cv_prog_f77_openmp}, or |
| @code{ac_cv_prog_fc_openmp} variable, depending on the current language. |
| |
| @strong{Caution:} Some of the compiler options that @code{AC_OPENMP} |
| tests, mean ``enable OpenMP'' to one compiler, but ``write output to a |
| file named @file{mp} or @file{penmp}'' to other compilers. We cannot |
| guarantee that the implementation of @code{AC_OPENMP} will not overwrite |
| an existing file with either of these names. |
| |
| Therefore, as a defensive measure, a @command{configure} script that |
| uses @code{AC_OPENMP} will issue an error and stop (before doing any of |
| the operations that might overwrite these files) upon encountering |
| either of these files in its working directory. |
| @command{autoconf} will also issue an error if it finds either of |
| these files in the same directory as a @file{configure.ac} that |
| uses @code{AC_OPENMP}. |
| |
| If you have files with either of these names at the top level of your |
| source tree, and you need to use @code{AC_OPENMP}, we recommend you |
| either change their names or move them into a subdirectory. |
| @end defmac |
| |
| @node C Compiler |
| @subsection C Compiler Characteristics |
| |
| The following macros provide ways to find and exercise a C Compiler. |
| There are a few constructs that ought to be avoided, but do not deserve |
| being checked for, since they can easily be worked around. |
| |
| @table @asis |
| @item Don't use lines containing solitary backslashes |
| They tickle a bug in the HP-UX C compiler (checked on |
| HP-UX 10.20, |
| 11.00, and 11i). When given the following source: |
| |
| @example |
| #ifdef __STDC__ |
| /\ |
| * A comment with backslash-newlines in it. %@{ %@} *\ |
| \ |
| / |
| char str[] = "\\ |
| " A string with backslash-newlines in it %@{ %@} \\ |
| ""; |
| char apostrophe = '\\ |
| \ |
| '\ |
| '; |
| #endif |
| @end example |
| |
| @noindent |
| the compiler incorrectly fails with the diagnostics ``Non-terminating |
| comment at end of file'' and ``Missing @samp{#endif} at end of file.'' |
| Removing the lines with solitary backslashes solves the problem. |
| |
| @item Don't compile several files at once if output matters to you |
| Some compilers, such as HP's, report names of files being |
| compiled when given more than one file operand. For instance: |
| |
| @example |
| $ @kbd{cc a.c b.c} |
| a.c: |
| b.c: |
| @end example |
| |
| @noindent |
| This can cause problems if you observe the output of the compiler to |
| detect failures. Invoking @samp{cc -c a.c && cc -c b.c && cc -o c a.o |
| b.o} solves the issue. |
| |
| @item Don't rely on correct @code{#line} support |
| On Solaris, @command{c89} (at least through Oracle Developer Studio 12.6) |
| diagnoses @code{#line} directives whose line |
| numbers are greater than 32767. Nothing in POSIX |
| makes this invalid. That is why Autoconf stopped issuing |
| @code{#line} directives. |
| @end table |
| |
| @anchor{AC_PROG_CC} |
| @defmac AC_PROG_CC (@ovar{compiler-search-list}) |
| @acindex{PROG_CC} |
| @evindex CC |
| @evindex CFLAGS |
| @ovindex CC |
| @ovindex CFLAGS |
| Determine a C compiler to use. |
| |
| If the environment variable @code{CC} is set, its value will be taken as |
| the name of the C compiler to use. Otherwise, search for a C compiler |
| under a series of likely names, trying @code{gcc} and @code{cc} first. |
| Regardless, the output variable @code{CC} is set to the chosen compiler. |
| |
| If the optional first argument to the macro is used, it must be a |
| whitespace-separated list of potential names for a C compiler, |
| which overrides the built-in list. |
| |
| If no C compiler can be found, @command{configure} will error out. |
| |
| If the selected C compiler is found to be GNU C (regardless of |
| its name), the shell variable @code{GCC} will be set to @samp{yes}. |
| If the shell variable @code{CFLAGS} was not already set, it is set |
| to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems |
| where GCC does not accept @option{-g}), or @option{-g} for other |
| compilers. @code{CFLAGS} is then made an output variable. |
| You can override the default for @code{CFLAGS} by inserting a shell |
| default assignment between @code{AC_INIT} and @code{AC_PROG_CC}: |
| |
| @example |
| : $@{CFLAGS="@var{options}"@} |
| @end example |
| |
| where @var{options} are the appropriate set of options to use by |
| default. (It is important to use this construct rather than a normal |
| assignment, so that @code{CFLAGS} can still be overridden by the |
| person building the package. @xref{Preset Output Variables}.) |
| |
| If necessary, options are added to @code{CC} to enable support for |
| ISO Standard C features with extensions, preferring the newest edition |
| of the C standard for which detection is supported. Currently the |
| newest edition Autoconf knows how to detect support for is C23. After calling |
| this macro you can check whether the C compiler has been set to accept |
| standard C by inspecting the shell variable @code{ac_prog_cc_stdc}. |
| Its value is @samp{c23}, @samp{c11}, @samp{c99}, or @samp{c89}, respectively, |
| if the C compiler has been set to use the 2023, 2011, 1999, or 1990 edition of |
| the C standard, and @samp{no} if the compiler does not support compiling |
| standard C at all. |
| (There is no special value for the 2017 edition of the C standard, |
| as it is a minor revision that does not introduce new language features.) |
| |
| The tests for standard conformance are not comprehensive. They test the |
| value of @code{__STDC_VERSION__}, and a |
| representative sample of the language features added in each version of |
| the C standard. They do not examine @code{__STDC__} |
| because some compilers by default leave it undefined. |
| They do not test for variable-length arrays, |
| a C99 feature that was made optional in C11; |
| if you need to use this feature when available, use @code{AC_C_VARARRAYS}. |
| They do not test the C standard library, because the C |
| compiler might be generating code for a ``freestanding environment'' |
| (in which most of the standard library is optional). If you need to know |
| whether a particular C standard header exists, use @code{AC_CHECK_HEADER}. |
| |
| None of the options that may be added to @code{CC} by this macro |
| enable @emph{strict} conformance to the C standard. In particular, |
| system-specific extensions are not disabled. (For example, for GNU C, |
| the @option{-std=gnu@var{nn}} options may be used, but not the |
| @option{-std=c@var{nn}} options.) |
| |
| Many Autoconf macros use a compiler, and thus call |
| @samp{AC_REQUIRE([AC_PROG_CC])} to ensure that the compiler has been |
| determined before the body of the outermost @code{AC_DEFUN} macro. |
| Although @code{AC_PROG_CC} is safe to directly expand multiple times, it |
| performs certain checks (such as the proper value of @env{EXEEXT}) only |
| on the first invocation. Therefore, care must be used when invoking |
| this macro from within another macro rather than at the top level |
| (@pxref{Expanded Before Required}). |
| @end defmac |
| |
| @anchor{AC_PROG_CC_C_O} |
| @defmac AC_PROG_CC_C_O |
| @acindex{PROG_CC_C_O} |
| @cvindex NO_MINUS_C_MINUS_O |
| @caindex prog_cc_@var{compiler}_c_o |
| If the C compiler does not accept the @option{-c} and @option{-o} options |
| simultaneously, define @code{NO_MINUS_C_MINUS_O}. This macro actually |
| tests both the compiler found by @code{AC_PROG_CC}, and, if different, |
| the first @code{cc} in the path. The test fails if one fails. This |
| macro was created for GNU Make to choose the default C compilation |
| rule. |
| |
| For the compiler @var{compiler}, this macro caches its result in the |
| @code{ac_cv_prog_cc_@var{compiler}_c_o} variable. |
| @end defmac |
| |
| |
| @defmac AC_PROG_CPP |
| @acindex{PROG_CPP} |
| @evindex CPP |
| @ovindex CPP |
| Set output variable @code{CPP} to a command that runs the |
| C preprocessor. If @samp{$CC -E} doesn't work, tries @code{cpp} and |
| @file{/lib/cpp}, in that order. |
| |
| It is only portable to run @code{CPP} on files with a @file{.c} |
| extension. |
| |
| Some preprocessors don't indicate missing include files by the error |
| status. For such preprocessors an internal variable is set that causes |
| other macros to check the standard error from the preprocessor and |
| consider the test failed if any warnings have been reported. |
| For most preprocessors, though, warnings do not cause include-file |
| tests to fail unless @code{AC_PROG_CPP_WERROR} is also specified. |
| @end defmac |
| |
| @defmac AC_PROG_CPP_WERROR |
| @acindex{PROG_CPP_WERROR} |
| @ovindex CPP |
| This acts like @code{AC_PROG_CPP}, except it treats warnings from the |
| preprocessor as errors even if the preprocessor exit status indicates |
| success. This is useful for avoiding headers that generate mandatory |
| warnings, such as deprecation notices. |
| @end defmac |
| |
| |
| The following macros check for C compiler or machine architecture |
| features. To check for characteristics not listed here, use |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or |
| @code{AC_RUN_IFELSE} (@pxref{Runtime}). |
| |
| @defmac AC_C_BACKSLASH_A |
| @acindex{C_BACKSLASH_A} |
| @cvindex HAVE_C_BACKSLASH_A |
| Define @samp{HAVE_C_BACKSLASH_A} to 1 if the C compiler understands |
| @samp{\a}. |
| |
| This macro is obsolescent, as current C compilers understand @samp{\a}. |
| New programs need not use this macro. |
| @end defmac |
| |
| @anchor{AC_C_BIGENDIAN} |
| @defmac AC_C_BIGENDIAN (@ovar{action-if-true}, @ovar{action-if-false}, @ |
| @ovar{action-if-unknown}, @ovar{action-if-universal}) |
| @acindex{C_BIGENDIAN} |
| @cvindex WORDS_BIGENDIAN |
| @cindex Endianness |
| If words are stored with the most significant byte first (like Motorola |
| and SPARC CPUs), execute @var{action-if-true}. If words are stored with |
| the least significant byte first (like Intel and VAX CPUs), execute |
| @var{action-if-false}. |
| |
| This macro runs a test-case if endianness cannot be determined from the |
| system header files. When cross-compiling, the test-case is not run but |
| grep'ed for some magic values. @var{action-if-unknown} is executed if |
| the latter case fails to determine the byte sex of the host system. |
| |
| In some cases a single run of a compiler can generate code for multiple |
| architectures. This can happen, for example, when generating Mac OS X |
| universal binary files, which work on both PowerPC and Intel |
| architectures. In this case, the different variants might be for |
| architectures with differing endianness. If |
| @command{configure} detects this, it executes @var{action-if-universal} |
| instead of @var{action-if-unknown}. |
| |
| The default for @var{action-if-true} is to define |
| @samp{WORDS_BIGENDIAN}. The default for @var{action-if-false} is to do |
| nothing. The default for @var{action-if-unknown} is to |
| abort configure and tell the installer how to bypass this test. |
| And finally, the default for @var{action-if-universal} is to ensure that |
| @samp{WORDS_BIGENDIAN} is defined if and only if a universal build is |
| detected and the current code is big-endian; this default works only if |
| @command{autoheader} is used (@pxref{autoheader Invocation}). |
| |
| If you use this macro without specifying @var{action-if-universal}, you |
| should also use @code{AC_CONFIG_HEADERS}; otherwise |
| @samp{WORDS_BIGENDIAN} may be set incorrectly for Mac OS X universal |
| binary files. |
| @end defmac |
| |
| @anchor{AC_C_CONST} |
| @defmac AC_C_CONST |
| @acindex{C_CONST} |
| @cvindex const |
| @caindex c_const |
| If the C compiler does not fully support the @code{const} keyword, |
| define @code{const} to be empty. Some C compilers that do |
| not define @code{__STDC__} do support @code{const}; some compilers that |
| define @code{__STDC__} do not completely support @code{const}. Programs |
| can simply use @code{const} as if every C compiler supported it; for |
| those that don't, the makefile or configuration header file |
| defines it as empty. |
| |
| Occasionally installers use a C++ compiler to compile C code, typically |
| because they lack a C compiler. This causes problems with @code{const}, |
| because C and C++ treat @code{const} differently. For example: |
| |
| @example |
| const int foo; |
| @end example |
| |
| @noindent |
| is valid in C but not in C++. These differences unfortunately cannot be |
| papered over by defining @code{const} to be empty. |
| |
| If @command{autoconf} detects this situation, it leaves @code{const} alone, |
| as this generally yields better results in practice. However, using a |
| C++ compiler to compile C code is not recommended or supported, and |
| installers who run into trouble in this area should get a C compiler |
| like GCC to compile their C code. |
| |
| This macro caches its result in the @code{ac_cv_c_const} variable. |
| |
| This macro is obsolescent, as current C compilers support @code{const}. |
| New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_C__GENERIC |
| @acindex{C__GENERIC} |
| @cvindex _Generic |
| If the C compiler supports C11-style generic selection using the |
| @code{_Generic} keyword, define @code{HAVE_C__GENERIC}. |
| @end defmac |
| |
| @defmac AC_C_RESTRICT |
| @acindex{C_RESTRICT} |
| @cvindex restrict |
| @caindex c_restrict |
| If the C compiler recognizes a variant spelling for the @code{restrict} |
| keyword (@code{__restrict}, @code{__restrict__}, or @code{_Restrict}), |
| then define @code{restrict} to that; this is more likely to do the right |
| thing with compilers that support language variants where plain |
| @code{restrict} is not a keyword. Otherwise, if the C compiler |
| recognizes the @code{restrict} keyword, don't do anything. |
| Otherwise, define @code{restrict} to be empty. |
| Thus, programs may simply use @code{restrict} as if every C compiler |
| supported it; for those that do not, the makefile |
| or configuration header defines it away. |
| |
| Although support in C++ for the @code{restrict} keyword is not |
| required, several C++ compilers do accept the keyword. |
| This macro works for them, too. |
| |
| This macro caches @samp{no} in the @code{ac_cv_c_restrict} variable |
| if @code{restrict} is not supported, and a supported spelling otherwise. |
| @end defmac |
| |
| @defmac AC_C_VOLATILE |
| @acindex{C_VOLATILE} |
| @cvindex volatile |
| If the C compiler does not understand the keyword @code{volatile}, |
| define @code{volatile} to be empty. Programs can simply use |
| @code{volatile} as if every C compiler supported it; for those that do |
| not, the makefile or configuration header defines it as |
| empty. |
| |
| If the correctness of your program depends on the semantics of |
| @code{volatile}, simply defining it to be empty does, in a sense, break |
| your code. However, given that the compiler does not support |
| @code{volatile}, you are at its mercy anyway. At least your |
| program compiles, when it wouldn't before. |
| @xref{Volatile Objects}, for more about @code{volatile}. |
| |
| This macro is obsolescent, as current C compilers support @code{volatile}. |
| New programs need not use this macro. |
| @end defmac |
| |
| @anchor{AC_C_INLINE} |
| @defmac AC_C_INLINE |
| @acindex{C_INLINE} |
| @cvindex inline |
| If the C compiler supports the keyword @code{inline}, do nothing. |
| Otherwise define @code{inline} to @code{__inline__} or @code{__inline} |
| if it accepts one of those, otherwise define @code{inline} to be empty. |
| @end defmac |
| |
| @anchor{AC_C_CHAR_UNSIGNED} |
| @defmac AC_C_CHAR_UNSIGNED |
| @acindex{C_CHAR_UNSIGNED} |
| @cvindex __CHAR_UNSIGNED__ |
| If the C type @code{char} is unsigned, define @code{__CHAR_UNSIGNED__}, |
| unless the C compiler predefines it. |
| |
| These days, using this macro is not necessary. The same information can |
| be determined by this portable alternative, thus avoiding the use of |
| preprocessor macros in the namespace reserved for the implementation. |
| |
| @example |
| #include <limits.h> |
| #if CHAR_MIN == 0 |
| # define CHAR_UNSIGNED 1 |
| #endif |
| @end example |
| @end defmac |
| |
| @defmac AC_C_STRINGIZE |
| @acindex{C_STRINGIZE} |
| @cvindex HAVE_STRINGIZE |
| If the C preprocessor supports the stringizing operator, define |
| @code{HAVE_STRINGIZE}. The stringizing operator is @samp{#} and is |
| found in macros such as this: |
| |
| @example |
| #define x(y) #y |
| @end example |
| |
| This macro is obsolescent, as current C compilers support the |
| stringizing operator. New programs need not use this macro. |
| @end defmac |
| |
| @defmac AC_C_FLEXIBLE_ARRAY_MEMBER |
| @acindex{C_FLEXIBLE_ARRAY_MEMBER} |
| @cvindex FLEXIBLE_ARRAY_MEMBER |
| If the C compiler supports flexible array members, define |
| @code{FLEXIBLE_ARRAY_MEMBER} to nothing; otherwise define it to 1. |
| That way, a declaration like this: |
| |
| @example |
| struct s |
| @{ |
| size_t n_vals; |
| double val[FLEXIBLE_ARRAY_MEMBER]; |
| @}; |
| @end example |
| |
| @noindent |
| will let applications use the ``struct hack'' even with compilers that |
| do not support flexible array members. To allocate and use such an |
| object, you can use code like this: |
| |
| @example |
| size_t i; |
| size_t n = compute_value_count (); |
| struct s *p = |
| malloc (offsetof (struct s, val) |
| + n * sizeof (double)); |
| p->n_vals = n; |
| for (i = 0; i < n; i++) |
| p->val[i] = compute_value (i); |
| @end example |
| @end defmac |
| |
| @defmac AC_C_VARARRAYS |
| @acindex{C_VARARRAYS} |
| @cvindex __STDC_NO_VLA__ |
| @cvindex HAVE_C_VARARRAYS |
| If the C compiler does not support variable-length arrays, define the |
| macro @code{__STDC_NO_VLA__} to be 1 if it is not already defined. A |
| variable-length array is an array of automatic storage duration whose |
| length is determined at run time, when the array is declared. For |
| backward compatibility this macro also defines @code{HAVE_C_VARARRAYS} |
| if the C compiler supports variable-length arrays, but this usage is |
| obsolescent and new programs should use @code{__STDC_NO_VLA__}. |
| @end defmac |
| |
| @defmac AC_C_TYPEOF |
| @acindex{C_TYPEOF} |
| @cvindex HAVE_TYPEOF |
| @cvindex typeof |
| If the C compiler supports GNU C's @code{typeof} syntax either |
| directly or |
| through a different spelling of the keyword (e.g., @code{__typeof__}), |
| define @code{HAVE_TYPEOF}. If the support is available only through a |
| different spelling, define @code{typeof} to that spelling. |
| @end defmac |
| |
| @defmac AC_C_PROTOTYPES |
| @acindex{C_PROTOTYPES} |
| @cvindex PROTOTYPES |
| @cvindex __PROTOTYPES |
| @cvindex PARAMS |
| If function prototypes are understood by the compiler (as determined by |
| @code{AC_PROG_CC}), define @code{PROTOTYPES} and @code{__PROTOTYPES}. |
| Defining @code{__PROTOTYPES} is for the benefit of |
| header files that cannot use macros that infringe on user name space. |
| |
| This macro is obsolescent, as current C compilers support prototypes. |
| New programs need not use this macro. |
| @end defmac |
| |
| @node C++ Compiler |
| @subsection C++ Compiler Characteristics |
| |
| |
| @defmac AC_PROG_CXX (@ovar{compiler-search-list}) |
| @acindex{PROG_CXX} |
| @evindex CXX |
| @evindex CXXFLAGS |
| @ovindex CXX |
| @ovindex CXXFLAGS |
| Determine a C++ compiler to use. |
| |
| If either the environment variable @code{CXX} or the environment |
| variable @code{CCC} is set, its value will be taken as the name of a |
| C++ compiler. If both are set, @code{CXX} is preferred. If neither |
| are set, search for a C++ compiler under a series of likely names, |
| trying @code{g++} and @code{c++} first. Regardless, the output |
| variable @code{CXX} is set to the chosen compiler. |
| |
| If the optional first argument to the macro is used, it must be a |
| whitespace-separated list of potential names for a C++ compiler, |
| which overrides the built-in list. |
| |
| If no C++ compiler can be found, as a last resort @code{CXX} is set to |
| @code{g++} (and subsequent tests will probably fail). |
| |
| If the selected C++ compiler is found to be GNU C++ (regardless of |
| its name), the shell variable @code{GXX} will be set to @samp{yes}. |
| If the shell variable @code{CXXFLAGS} was not already set, it is set |
| to @option{-g -O2} for the GNU C++ compiler (@option{-O2} on systems |
| where G++ does not accept @option{-g}), or @option{-g} for other |
| compilers. @code{CXXFLAGS} is then made an output variable. |
| You can override the default for @code{CXXFLAGS} by inserting a shell |
| default assignment between @code{AC_INIT} and @code{AC_PROG_CXX}: |
| |
| @example |
| : $@{CXXFLAGS="@var{options}"@} |
| @end example |
| |
| where @var{options} are the appropriate set of options to use by |
| default. (It is important to use this construct rather than a normal |
| assignment, so that @code{CXXFLAGS} can still be overridden by the |
| person building the package. @xref{Preset Output Variables}.) |
| @end defmac |
| |
| @defmac AC_PROG_CXXCPP |
| @acindex{PROG_CXXCPP} |
| @evindex CXXCPP |
| @ovindex CXXCPP |
| Set output variable @code{CXXCPP} to a command that runs the C++ |
| preprocessor. If @samp{$CXX -E} doesn't work, tries @code{cpp} and |
| @file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP} |
| may or may not set C++-specific predefined macros (such as @code{__cplusplus}). |
| |
| It is portable to run @code{CXXCPP} only on files with a @file{.c}, |
| @file{.C}, @file{.cc}, or @file{.cpp} extension. |
| |
| Some preprocessors don't indicate missing include files by the error |
| status. For such preprocessors an internal variable is set that causes |
| other macros to check the standard error from the preprocessor and |
| consider the test failed if any warnings have been reported. However, |
| it is not known whether such broken preprocessors exist for C++. |
| @end defmac |
| |
| @defmac AC_PROG_CXX_C_O |
| @acindex{PROG_CXX_C_O} |
| @cvindex CXX_NO_MINUS_C_MINUS_O |
| Test whether the C++ compiler accepts the options @option{-c} and |
| @option{-o} simultaneously, and define @code{CXX_NO_MINUS_C_MINUS_O}, |
| if it does not. |
| @end defmac |
| |
| |
| @node Objective C Compiler |
| @subsection Objective C Compiler Characteristics |
| |
| |
| @defmac AC_PROG_OBJC (@ovar{compiler-search-list}) |
| @acindex{PROG_OBJC} |
| @evindex OBJC |
| @evindex OBJCFLAGS |
| @ovindex OBJC |
| @ovindex OBJCFLAGS |
| Determine an Objective C compiler to use. If @code{OBJC} is not already |
| set in the environment, check for Objective C compilers. Set output |
| variable @code{OBJC} to the name of the compiler found. |
| |
| This macro may, however, be invoked with an optional first argument |
| which, if specified, must be a blank-separated list of Objective C compilers to |
| search for. This just gives the user an opportunity to specify an |
| alternative search list for the Objective C compiler. For example, if you |
| didn't like the default order, then you could invoke @code{AC_PROG_OBJC} |
| like this: |
| |
| @example |
| AC_PROG_OBJC([gcc objcc objc]) |
| @end example |
| |
| If using a compiler that supports GNU Objective C, set shell variable |
| @code{GOBJC} to @samp{yes}. If output variable @code{OBJCFLAGS} was not |
| already set, set it to @option{-g -O2} for a GNU Objective C |
| compiler (@option{-O2} on systems where the compiler does not accept |
| @option{-g}), or @option{-g} for other compilers. |
| @end defmac |
| |
| @defmac AC_PROG_OBJCPP |
| @acindex{PROG_OBJCPP} |
| @evindex OBJCPP |
| @ovindex OBJCPP |
| Set output variable @code{OBJCPP} to a command that runs the Objective C |
| preprocessor. If @samp{$OBJC -E} doesn't work, tries @code{cpp} and |
| @file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP} |
| may or may not set Objective-C-specific predefined macros (such as |
| @code{__OBJC__}). |
| @end defmac |
| |
| |
| @node Objective C++ Compiler |
| @subsection Objective C++ Compiler Characteristics |
| |
| |
| @defmac AC_PROG_OBJCXX (@ovar{compiler-search-list}) |
| @acindex{PROG_OBJCXX} |
| @evindex OBJCXX |
| @evindex OBJCXXFLAGS |
| @ovindex OBJCXX |
| @ovindex OBJCXXFLAGS |
| Determine an Objective C++ compiler to use. If @code{OBJCXX} is not already |
| set in the environment, check for Objective C++ compilers. Set output |
| variable @code{OBJCXX} to the name of the compiler found. |
| |
| This macro may, however, be invoked with an optional first argument |
| which, if specified, must be a blank-separated list of Objective C++ compilers |
| to search for. This just gives the user an opportunity to specify an |
| alternative search list for the Objective C++ compiler. For example, if you |
| didn't like the default order, then you could invoke @code{AC_PROG_OBJCXX} |
| like this: |
| |
| @example |
| AC_PROG_OBJCXX([gcc g++ objcc++ objcxx]) |
| @end example |
| |
| If using a compiler that supports GNU Objective C++, set shell variable |
| @code{GOBJCXX} to @samp{yes}. If output variable @code{OBJCXXFLAGS} was not |
| already set, set it to @option{-g -O2} for a GNU Objective C++ |
| compiler (@option{-O2} on systems where the compiler does not accept |
| @option{-g}), or @option{-g} for other compilers. |
| @end defmac |
| |
| @defmac AC_PROG_OBJCXXCPP |
| @acindex{PROG_OBJCXXCPP} |
| @evindex OBJCXXCPP |
| @ovindex OBJCXXCPP |
| Set output variable @code{OBJCXXCPP} to a command that runs the Objective C++ |
| preprocessor. If @samp{$OBJCXX -E} doesn't work, tries @code{cpp} and |
| @file{/lib/cpp}, in that order. Because of this fallback, @code{CXXCPP} |
| may or may not set Objective-C++-specific predefined macros (such as |
| @code{__cplusplus} and @code{__OBJC__}). |
| @end defmac |
| |
| |
| @node Erlang Compiler and Interpreter |
| @subsection Erlang Compiler and Interpreter Characteristics |
| @cindex Erlang |
| |
| Autoconf defines the following macros for determining paths to the essential |
| Erlang/OTP programs: |
| |
| @defmac AC_ERLANG_PATH_ERLC (@ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{ERLANG_PATH_ERLC} |
| @evindex ERLC |
| @evindex ERLCFLAGS |
| @ovindex ERLC |
| @ovindex ERLCFLAGS |
| Determine an Erlang compiler to use. If @code{ERLC} is not already set in the |
| environment, check for @command{erlc}. Set output variable @code{ERLC} to the |
| complete path of the compiler command found. In addition, if @code{ERLCFLAGS} |
| is not set in the environment, set it to an empty value. |
| |
| The two optional arguments have the same meaning as the two last arguments of |
| macro @code{AC_PATH_PROG} for looking for the @command{erlc} program. For |
| example, to look for @command{erlc} only in the @file{/usr/lib/erlang/bin} |
| directory: |
| |
| @example |
| AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin]) |
| @end example |
| @end defmac |
| |
| @defmac AC_ERLANG_NEED_ERLC (@dvar{path, $PATH}) |
| @acindex{ERLANG_NEED_ERLC} |
| A simplified variant of the @code{AC_ERLANG_PATH_ERLC} macro, that prints an |
| error message and exits the @command{configure} script if the @command{erlc} |
| program is not found. |
| @end defmac |
| |
| @defmac AC_ERLANG_PATH_ERL (@ovar{value-if-not-found}, @dvar{path, $PATH}) |
| @acindex{ERLANG_PATH_ERL} |
| @evindex ERL |
| @ovindex ERL |
| Determine an Erlang interpreter to use. If @code{ERL} is not already |
| set in the |
| environment, check for @command{erl}. Set output variable @code{ERL} to the |
| complete path of the interpreter command found. |
| |
| The two optional arguments have the same meaning as the two last arguments of |
| macro @code{AC_PATH_PROG} for looking for the @command{erl} program. For |
| example, to look for @command{erl} only in the @file{/usr/lib/erlang/bin} |
| directory: |
| |
| @example |
| AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin]) |
| @end example |
| @end defmac |
| |
| @defmac AC_ERLANG_NEED_ERL (@dvar{path, $PATH}) |
| @acindex{ERLANG_NEED_ERL} |
| A simplified variant of the @code{AC_ERLANG_PATH_ERL} macro, that prints an |
| error message and exits the @command{configure} script if the @command{erl} |
| program is not found. |
| @end defmac |
| |
| |
| @node Fortran Compiler |
| @subsection Fortran Compiler Characteristics |
| @cindex Fortran |
| @cindex F77 |
| |
| The Autoconf Fortran support is divided into two categories: legacy |
| Fortran 77 macros (@code{F77}), and modern Fortran macros (@code{FC}). |
| The former are intended for traditional Fortran 77 code, and have output |
| variables like @code{F77}, @code{FFLAGS}, and @code{FLIBS}. The latter |
| are for newer programs that can (or must) compile under the newer |
| Fortran standards, and have output variables like @code{FC}, |
| @code{FCFLAGS}, and @code{FCLIBS}. |
| |
| Except for the macros @code{AC_FC_SRCEXT}, @code{AC_FC_FREEFORM}, |
| @code{AC_FC_FIXEDFORM}, and @code{AC_FC_LINE_LENGTH} (see below), the |
| @code{FC} and @code{F77} macros behave almost identically, and so they |
| are documented together in this section. |
| |
| |
| @defmac AC_PROG_F77 (@ovar{compiler-search-list}) |
| @acindex{PROG_F77} |
| @evindex F77 |
| @evindex FFLAGS |
| @ovindex F77 |
| @ovindex FFLAGS |
| @caindex f77_compiler_gnu |
| @caindex prog_f77_g |
| Determine a Fortran 77 compiler to use. If @code{F77} is not already |
| set in the environment, then check for @code{g77} and @code{f77}, and |
| then some other names. Set the output variable @code{F77} to the name |
| of the compiler found. |
| |
| This macro may, however, be invoked with an optional first argument |
| which, if specified, must be a blank-separated list of Fortran 77 |
| compilers to search for. This just gives the user an opportunity to |
| specify an alternative search list for the Fortran 77 compiler. For |
| example, if you didn't like the default order, then you could invoke |
| @code{AC_PROG_F77} like this: |
| |
| @example |
| AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90]) |
| @end example |
| |
| If using a compiler that supports GNU Fortran 77, |
| set the shell variable @code{G77} to @samp{yes}. |
| If the output variable @code{FFLAGS} was not already set in the |
| environment, set it to @option{-g -02} for @code{g77} (or @option{-O2} |
| where the GNU Fortran 77 compiler does not accept @option{-g}), or |
| @option{-g} for other compilers. |
| |
| The result of the GNU test is cached in the |
| @code{ac_cv_f77_compiler_gnu} variable, acceptance of @option{-g} in the |
| @code{ac_cv_prog_f77_g} variable. |
| @end defmac |
| |
| @defmac AC_PROG_FC (@ovar{compiler-search-list}, @ovar{dialect}) |
| @acindex{PROG_FC} |
| @evindex FC |
| @evindex FCFLAGS |
| @ovindex FC |
| @ovindex FCFLAGS |
| @caindex fc_compiler_gnu |
| @caindex prog_fc_g |
| Determine a Fortran compiler to use. If @code{FC} is not already set in |
| the environment, then @code{dialect} is a hint to indicate what Fortran |
| dialect to search for; the default is to search for the newest available |
| dialect. Set the output variable @code{FC} to the name of the compiler |
| found. |
| |
| By default, newer dialects are preferred over older dialects, but if |
| @code{dialect} is specified then older dialects are preferred starting |
| with the specified dialect. @code{dialect} can currently be one of |
| Fortran 77, Fortran 90, or Fortran 95. However, this is only a hint of |
| which compiler @emph{name} to prefer (e.g., @code{f90} or @code{f95}), |
| and no attempt is made to guarantee that a particular language standard |
| is actually supported. Thus, it is preferable that you avoid the |
| @code{dialect} option, and use AC_PROG_FC only for code compatible with |
| the latest Fortran standard. |
| |
| This macro may, alternatively, be invoked with an optional first argument |
| which, if specified, must be a blank-separated list of Fortran |
| compilers to search for, just as in @code{AC_PROG_F77}. |
| |
| If using a compiler that supports GNU Fortran, |
| set the shell variable @code{GFC} to @samp{yes}. |
| If the output variable @code{FCFLAGS} was not already set in the |
| environment, then set it to @option{-g -02} for a GNU Fortran compiler (or |
| @option{-O2} where the compiler does not accept @option{-g}), or |
| @option{-g} for other compilers. |
| |
| The result of the GNU test is cached in the @code{ac_cv_fc_compiler_gnu} |
| variable, acceptance of @option{-g} in the @code{ac_cv_prog_fc_g} |
| variable. |
| @end defmac |
| |
| @defmac AC_PROG_F77_C_O |
| @defmacx AC_PROG_FC_C_O |
| @acindex{PROG_F77_C_O} |
| @acindex{PROG_FC_C_O} |
| @cvindex F77_NO_MINUS_C_MINUS_O |
| @cvindex FC_NO_MINUS_C_MINUS_O |
| @caindex prog_f77_c_o |
| @caindex prog_fc_c_o |
| Test whether the Fortran compiler accepts the options @option{-c} and |
| @option{-o} simultaneously, and define @code{F77_NO_MINUS_C_MINUS_O} or |
| @code{FC_NO_MINUS_C_MINUS_O}, respectively, if it does not. |
| |
| The result of the test is cached in the @code{ac_cv_prog_f77_c_o} or |
| @code{ac_cv_prog_fc_c_o} variable, respectively. |
| @end defmac |
| |
| The following macros check for Fortran compiler characteristics. |
| To check for characteristics not listed here, use |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or |
| @code{AC_RUN_IFELSE} (@pxref{Runtime}), making sure to first set the |
| current language to Fortran 77 or Fortran via @code{AC_LANG([Fortran 77])} |
| or @code{AC_LANG(Fortran)} (@pxref{Language Choice}). |
| |
| |
| @defmac AC_F77_LIBRARY_LDFLAGS |
| @defmacx AC_FC_LIBRARY_LDFLAGS |
| @acindex{F77_LIBRARY_LDFLAGS} |
| @ovindex FLIBS |
| @acindex{FC_LIBRARY_LDFLAGS} |
| @ovindex FCLIBS |
| @caindex prog_f77_v |
| @caindex prog_fc_v |
| @caindex f77_libs |
| @caindex fc_libs |
| Determine the linker flags (e.g., @option{-L} and @option{-l}) for the |
| @dfn{Fortran intrinsic and runtime libraries} that are required to |
| successfully link a Fortran program or shared library. The output |
| variable @code{FLIBS} or @code{FCLIBS} is set to these flags (which |
| should be included after @code{LIBS} when linking). |
| |
| This macro is intended to be used in those situations when it is |
| necessary to mix, e.g., C++ and Fortran source code in a single |
| program or shared library (@pxref{Mixing Fortran 77 With C and C++, , , |
| automake, GNU Automake}). |
| |
| For example, if object files from a C++ and Fortran compiler must be |
| linked together, then the C++ compiler/linker must be used for linking |
| (since special C++-ish things need to happen at link time like calling |
| global constructors, instantiating templates, enabling exception |
| support, etc.). |
| |
| However, the Fortran intrinsic and runtime libraries must be linked in |
| as well, but the C++ compiler/linker doesn't know by default how to add |
| these Fortran 77 libraries. Hence, this macro was created to determine |
| these Fortran libraries. |
| |
| The macros @code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or |
| @code{AC_F77_MAIN} and @code{AC_FC_MAIN} are probably also necessary to |
| link C/C++ with Fortran; see below. Further, it is highly recommended |
| that you use @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}) |
| because the complex defines that the function wrapper macros create |
| may not work with C/C++ compiler drivers. |
| |
| These macros internally compute the flag needed to verbose linking |
| output and cache it in @code{ac_cv_prog_f77_v} or @code{ac_cv_prog_fc_v} |
| variables, respectively. The computed linker flags are cached in |
| @code{ac_cv_f77_libs} or @code{ac_cv_fc_libs}, respectively. |
| @end defmac |
| |
| @defmac AC_F77_DUMMY_MAIN (@ovar{action-if-found}, @ |
| @dvar{action-if-not-found, AC_MSG_FAILURE}) |
| @defmacx AC_FC_DUMMY_MAIN (@ovar{action-if-found}, @ |
| @dvar{action-if-not-found, AC_MSG_FAILURE}) |
| @acindex{F77_DUMMY_MAIN} |
| @cvindex F77_DUMMY_MAIN |
| @acindex{FC_DUMMY_MAIN} |
| @cvindex FC_DUMMY_MAIN |
| @caindex f77_dummy_main |
| @caindex fc_dummy_main |
| With many compilers, the Fortran libraries detected by |
| @code{AC_F77_LIBRARY_LDFLAGS} or @code{AC_FC_LIBRARY_LDFLAGS} provide |
| their own @code{main} entry function that initializes things like |
| Fortran I/O, and which then calls a user-provided entry function named |
| (say) @code{MAIN__} to run the user's program. The |
| @code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or |
| @code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros figure out how to deal with |
| this interaction. |
| |
| When using Fortran for purely numerical functions (no I/O, etc.)@: often |
| one prefers to provide one's own @code{main} and skip the Fortran |
| library initializations. In this case, however, one may still need to |
| provide a dummy @code{MAIN__} routine in order to prevent linking errors |
| on some systems. @code{AC_F77_DUMMY_MAIN} or @code{AC_FC_DUMMY_MAIN} |
| detects whether any such routine is @emph{required} for linking, and |
| what its name is; the shell variable @code{F77_DUMMY_MAIN} or |
| @code{FC_DUMMY_MAIN} holds this name, @code{unknown} when no solution |
| was found, and @code{none} when no such dummy main is needed. |
| |
| By default, @var{action-if-found} defines @code{F77_DUMMY_MAIN} or |
| @code{FC_DUMMY_MAIN} to the name of this routine (e.g., @code{MAIN__}) |
| @emph{if} it is required. @var{action-if-not-found} defaults to |
| exiting with an error. |
| |
| In order to link with Fortran routines, the user's C/C++ program should |
| then include the following code to define the dummy main if it is |
| needed: |
| |
| @example |
| @c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage. |
| #ifdef F77_DUMMY_MAIN |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| int F77_DUMMY_MAIN (void) @{ return 1; @} |
| #endif |
| @end example |
| |
| (Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.) |
| |
| Note that this macro is called automatically from @code{AC_F77_WRAPPERS} |
| or @code{AC_FC_WRAPPERS}; there is generally no need to call it |
| explicitly unless one wants to change the default actions. |
| |
| The result of this macro is cached in the @code{ac_cv_f77_dummy_main} or |
| @code{ac_cv_fc_dummy_main} variable, respectively. |
| @end defmac |
| |
| @defmac AC_F77_MAIN |
| @defmacx AC_FC_MAIN |
| @acindex{F77_MAIN} |
| @cvindex F77_MAIN |
| @acindex{FC_MAIN} |
| @cvindex FC_MAIN |
| @caindex f77_main |
| @caindex fc_main |
| As discussed above, many Fortran libraries allow you to provide an entry |
| point called (say) @code{MAIN__} instead of the usual @code{main}, which |
| is then called by a @code{main} function in the Fortran libraries that |
| initializes things like Fortran I/O@. The |
| @code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros detect whether it is |
| @emph{possible} to utilize such an alternate main function, and defines |
| @code{F77_MAIN} and @code{FC_MAIN} to the name of the function. (If no |
| alternate main function name is found, @code{F77_MAIN} and @code{FC_MAIN} are |
| simply defined to @code{main}.) |
| |
| Thus, when calling Fortran routines from C that perform things like I/O, |
| one should use this macro and declare the "main" function like so: |
| |
| @example |
| @c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage. |
| #ifdef __cplusplus |
| extern "C" |
| #endif |
| int F77_MAIN (int argc, char *argv[]); |
| @end example |
| |
| (Again, replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.) |
| |
| The result of this macro is cached in the @code{ac_cv_f77_main} or |
| @code{ac_cv_fc_main} variable, respectively. |
| @end defmac |
| |
| @defmac AC_F77_WRAPPERS |
| @defmacx AC_FC_WRAPPERS |
| @acindex{F77_WRAPPERS} |
| @cvindex F77_FUNC |
| @cvindex F77_FUNC_ |
| @acindex{FC_WRAPPERS} |
| @cvindex FC_FUNC |
| @cvindex FC_FUNC_ |
| @caindex f77_mangling |
| @caindex fc_mangling |
| Defines C macros @code{F77_FUNC (name, NAME)}, @code{FC_FUNC (name, NAME)}, |
| @code{F77_FUNC_(name, NAME)}, and @code{FC_FUNC_(name, NAME)} to properly |
| mangle the names of C/C++ identifiers, and identifiers with underscores, |
| respectively, so that they match the name-mangling scheme used by the |
| Fortran compiler. |
| |
| Fortran is case-insensitive, and in order to achieve this the Fortran |
| compiler converts all identifiers into a canonical case and format. To |
| call a Fortran subroutine from C or to write a C function that is |
| callable from Fortran, the C program must explicitly use identifiers in |
| the format expected by the Fortran compiler. In order to do this, one |
| simply wraps all C identifiers in one of the macros provided by |
| @code{AC_F77_WRAPPERS} or @code{AC_FC_WRAPPERS}. For example, suppose |
| you have the following Fortran 77 subroutine: |
| |
| @example |
| @c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage. |
| subroutine foobar (x, y) |
| double precision x, y |
| y = 3.14159 * x |
| return |
| end |
| @end example |
| |
| You would then declare its prototype in C or C++ as: |
| |
| @example |
| @c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage. |
| #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR) |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void FOOBAR_F77 (double *x, double *y); |
| @end example |
| |
| Note that we pass both the lowercase and uppercase versions of the |
| function name to @code{F77_FUNC} so that it can select the right one. |
| Note also that all parameters to Fortran 77 routines are passed as |
| pointers (@pxref{Mixing Fortran 77 With C and C++, , , automake, GNU |
| Automake}). |
| |
| (Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.) |
| |
| Although Autoconf tries to be intelligent about detecting the |
| name-mangling scheme of the Fortran compiler, there may be Fortran |
| compilers that it doesn't support yet. In this case, the above code |
| generates a compile-time error, but some other behavior |
| (e.g., disabling Fortran-related features) can be induced by checking |
| whether @code{F77_FUNC} or @code{FC_FUNC} is defined. |
| |
| Now, to call that routine from a C program, we would do something like: |
| |
| @example |
| @c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage. |
| @{ |
| double x = 2.7183, y; |
| FOOBAR_F77 (&x, &y); |
| @} |
| @end example |
| |
| If the Fortran identifier contains an underscore (e.g., @code{foo_bar}), |
| you should use @code{F77_FUNC_} or @code{FC_FUNC_} instead of |
| @code{F77_FUNC} or @code{FC_FUNC} (with the same arguments). This is |
| because some Fortran compilers mangle names differently if they contain |
| an underscore. |
| |
| The name mangling scheme is encoded in the @code{ac_cv_f77_mangling} or |
| @code{ac_cv_fc_mangling} cache variable, respectively, and also used for |
| the @code{AC_F77_FUNC} and @code{AC_FC_FUNC} macros described below. |
| @end defmac |
| |
| @defmac AC_F77_FUNC (@var{name}, @ovar{shellvar}) |
| @defmacx AC_FC_FUNC (@var{name}, @ovar{shellvar}) |
| @acindex{F77_FUNC} |
| @acindex{FC_FUNC} |
| Given an identifier @var{name}, set the shell variable @var{shellvar} to |
| hold the mangled version @var{name} according to the rules of the |
| Fortran linker (see also @code{AC_F77_WRAPPERS} or |
| @code{AC_FC_WRAPPERS}). @var{shellvar} is optional; if it is not |
| supplied, the shell variable is simply @var{name}. The purpose of |
| this macro is to give the caller a way to access the name-mangling |
| information other than through the C preprocessor as above, for example, |
| to call Fortran routines from some language other than C/C++. |
| @end defmac |
| |
| @defmac AC_FC_SRCEXT (@var{ext}, @ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @defmacx AC_FC_PP_SRCEXT (@var{ext}, @ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_SRCEXT} |
| @acindex{FC_PP_SRCEXT} |
| @caindex fc_srcext_@var{ext} |
| @caindex fc_pp_srcext_@var{ext} |
| By default, the @code{FC} macros perform their tests using a @file{.f} |
| extension for source-code files. Some compilers, however, only enable |
| newer language features for appropriately named files, e.g., Fortran 90 |
| features only for @file{.f90} files, or preprocessing only with |
| @file{.F} files or maybe other upper-case extensions. On the other |
| hand, some other compilers expect all source files to end in @file{.f} |
| and require special flags to support other file name extensions. The |
| @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros deal with these |
| issues. |
| |
| The @code{AC_FC_SRCEXT} macro tries to get the @code{FC} compiler to |
| accept files ending with the extension @file{.@var{ext}} (i.e., |
| @var{ext} does @emph{not} contain the dot). If any special compiler |
| flags are needed for this, it stores them in the output variable |
| @code{FCFLAGS_@var{ext}}. This extension and these flags are then used |
| for all subsequent @code{FC} tests (until @code{AC_FC_SRCEXT} or |
| @code{AC_FC_PP_SRCEXT} is called another time). |
| |
| For example, you would use @code{AC_FC_SRCEXT(f90)} to employ the |
| @file{.f90} extension in future tests, and it would set the |
| @code{FCFLAGS_f90} output variable with any extra flags that are needed |
| to compile such files. |
| |
| Similarly, the @code{AC_FC_PP_SRCEXT} macro tries to get the @code{FC} |
| compiler to preprocess and compile files with the extension |
| @file{.@var{ext}}. When both @command{fpp} and @command{cpp} style |
| preprocessing are provided, the former is preferred, as the latter may |
| treat continuation lines, @code{//} tokens, and white space differently |
| from what some Fortran dialects expect. Conversely, if you do not want |
| files to be preprocessed, use only lower-case characters in the file |
| name extension. Like with @code{AC_FC_SRCEXT(f90)}, any needed flags |
| are stored in the @code{FCFLAGS_@var{ext}} variable. |
| |
| The @code{FCFLAGS_@var{ext}} flags can @emph{not} be simply absorbed |
| into @code{FCFLAGS}, for two reasons based on the limitations of some |
| compilers. First, only one @code{FCFLAGS_@var{ext}} can be used at a |
| time, so files with different extensions must be compiled separately. |
| Second, @code{FCFLAGS_@var{ext}} must appear @emph{immediately} before |
| the source-code file name when compiling. So, continuing the example |
| above, you might compile a @file{foo.f90} file in your makefile with the |
| command: |
| |
| @example |
| foo.o: foo.f90 |
| $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90' |
| @end example |
| |
| If @code{AC_FC_SRCEXT} or @code{AC_FC_PP_SRCEXT} succeeds in compiling |
| files with the @var{ext} extension, it calls @var{action-if-success} |
| (defaults to nothing). If it fails, and cannot find a way to make the |
| @code{FC} compiler accept such files, it calls @var{action-if-failure} |
| (defaults to exiting with an error message). |
| |
| The @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros cache their |
| results in @code{ac_cv_fc_srcext_@var{ext}} and |
| @code{ac_cv_fc_pp_srcext_@var{ext}} variables, respectively. |
| @end defmac |
| |
| @defmac AC_FC_PP_DEFINE (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_PP_DEFINE} |
| @caindex fc_pp_define |
| |
| Find a flag to specify defines for preprocessed Fortran. Not all |
| Fortran compilers use @option{-D}. Substitute @code{FC_DEFINE} with |
| the result and call @var{action-if-success} (defaults to nothing) if |
| successful, and @var{action-if-failure} (defaults to failing with an |
| error message) if not. |
| |
| This macro calls @code{AC_FC_PP_SRCEXT([F])} in order to learn how to |
| preprocess a @file{conftest.F} file, but restores a previously used |
| Fortran source file extension afterwards again. |
| |
| The result of this test is cached in the @code{ac_cv_fc_pp_define} |
| variable. |
| @end defmac |
| |
| @defmac AC_FC_FREEFORM (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_FREEFORM} |
| @caindex fc_freeform |
| |
| Try to ensure that the Fortran compiler (@code{$FC}) allows free-format |
| source code (as opposed to the older fixed-format style from Fortran |
| 77). If necessary, it may add some additional flags to @code{FCFLAGS}. |
| |
| This macro is most important if you are using the default @file{.f} |
| extension, since many compilers interpret this extension as indicating |
| fixed-format source unless an additional flag is supplied. If you |
| specify a different extension with @code{AC_FC_SRCEXT}, such as |
| @file{.f90}, then @code{AC_FC_FREEFORM} ordinarily succeeds without |
| modifying @code{FCFLAGS}. For extensions which the compiler does not |
| know about, the flag set by the @code{AC_FC_SRCEXT} macro might let |
| the compiler assume Fortran 77 by default, however. |
| |
| If @code{AC_FC_FREEFORM} succeeds in compiling free-form source, it |
| calls @var{action-if-success} (defaults to nothing). If it fails, it |
| calls @var{action-if-failure} (defaults to exiting with an error |
| message). |
| |
| The result of this test, or @samp{none} or @samp{unknown}, is cached in |
| the @code{ac_cv_fc_freeform} variable. |
| @end defmac |
| |
| @defmac AC_FC_FIXEDFORM (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_FIXEDFORM} |
| @caindex fc_fixedform |
| |
| Try to ensure that the Fortran compiler (@code{$FC}) allows the old |
| fixed-format source code (as opposed to free-format style). If |
| necessary, it may add some additional flags to @code{FCFLAGS}. |
| |
| This macro is needed for some compilers alias names like @command{xlf95} |
| which assume free-form source code by default, and in case you want to |
| use fixed-form source with an extension like @file{.f90} which many |
| compilers interpret as free-form by default. If you specify a different |
| extension with @code{AC_FC_SRCEXT}, such as @file{.f}, then |
| @code{AC_FC_FIXEDFORM} ordinarily succeeds without modifying |
| @code{FCFLAGS}. |
| |
| If @code{AC_FC_FIXEDFORM} succeeds in compiling fixed-form source, it |
| calls @var{action-if-success} (defaults to nothing). If it fails, it |
| calls @var{action-if-failure} (defaults to exiting with an error |
| message). |
| |
| The result of this test, or @samp{none} or @samp{unknown}, is cached in |
| the @code{ac_cv_fc_fixedform} variable. |
| @end defmac |
| |
| @defmac AC_FC_LINE_LENGTH (@ovar{length}, @ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_LINE_LENGTH} |
| @caindex fc_line_length |
| |
| Try to ensure that the Fortran compiler (@code{$FC}) accepts long source |
| code lines. The @var{length} argument may be given as 80, 132, or |
| unlimited, and defaults to 132. Note that line lengths above 250 |
| columns are not portable, and some compilers do not accept more than 132 |
| columns at least for fixed format source. If necessary, it may add some |
| additional flags to @code{FCFLAGS}. |
| |
| If @code{AC_FC_LINE_LENGTH} succeeds in compiling fixed-form source, it |
| calls @var{action-if-success} (defaults to nothing). If it fails, it |
| calls @var{action-if-failure} (defaults to exiting with an error |
| message). |
| |
| The result of this test, or @samp{none} or @samp{unknown}, is cached in |
| the @code{ac_cv_fc_line_length} variable. |
| @end defmac |
| |
| @defmac AC_FC_CHECK_BOUNDS (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_CHECK_BOUNDS} |
| @caindex fc_check_bounds |
| |
| The @code{AC_FC_CHECK_BOUNDS} macro tries to enable array bounds checking |
| in the Fortran compiler. If successful, the @var{action-if-success} |
| is called and any needed flags are added to @code{FCFLAGS}. Otherwise, |
| @var{action-if-failure} is called, which defaults to failing with an error |
| message. The macro currently requires Fortran 90 or a newer dialect. |
| |
| The result of the macro is cached in the @code{ac_cv_fc_check_bounds} |
| variable. |
| @end defmac |
| |
| @defmac AC_F77_IMPLICIT_NONE (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @defmacx AC_FC_IMPLICIT_NONE (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{F77_IMPLICIT_NONE} |
| @acindex{FC_IMPLICIT_NONE} |
| @caindex f77_implicit_none |
| @caindex fc_implicit_none |
| |
| Try to disallow implicit declarations in the Fortran compiler. If |
| successful, @var{action-if-success} is called and any needed flags |
| are added to @code{FFLAGS} or @code{FCFLAGS}, respectively. Otherwise, |
| @var{action-if-failure} is called, which defaults to failing with an error |
| message. |
| |
| The result of these macros are cached in the |
| @code{ac_cv_f77_implicit_none} and @code{ac_cv_fc_implicit_none} |
| variables, respectively. |
| @end defmac |
| |
| @defmac AC_FC_MODULE_EXTENSION |
| @acindex{FC_MODULE_EXTENSION} |
| @caindex fc_module_ext |
| @ovindex FC_MODEXT |
| |
| Find the Fortran 90 module file name extension. Most Fortran 90 |
| compilers store module information in files separate from the object |
| files. The module files are usually named after the name of the module |
| rather than the source file name, with characters possibly turned to |
| upper case, plus an extension, often @file{.mod}. |
| |
| Not all compilers use module files at all, or by default. The Cray |
| Fortran compiler requires @option{-e m} in order to store and search |
| module information in @file{.mod} files rather than in object files. |
| Likewise, the Fujitsu Fortran compilers uses the @option{-Am} option to |
| indicate how module information is stored. |
| |
| The @code{AC_FC_MODULE_EXTENSION} macro computes the module extension |
| without the leading dot, and stores that in the @code{FC_MODEXT} |
| variable. If the compiler does not produce module files, or the |
| extension cannot be determined, @code{FC_MODEXT} is empty. Typically, |
| the result of this macro may be used in cleanup @command{make} rules as |
| follows: |
| |
| @example |
| clean-modules: |
| -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) |
| @end example |
| |
| The extension, or @samp{unknown}, is cached in the |
| @code{ac_cv_fc_module_ext} variable. |
| @end defmac |
| |
| @defmac AC_FC_MODULE_FLAG (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_MODULE_FLAG} |
| @caindex fc_module_flag |
| @ovindex FC_MODINC |
| @ovindex ac_empty |
| |
| Find the compiler flag to include Fortran 90 module information from |
| another directory, and store that in the @code{FC_MODINC} variable. |
| Call @var{action-if-success} (defaults to nothing) if successful, and |
| set @code{FC_MODINC} to empty and call @var{action-if-failure} (defaults |
| to exiting with an error message) if not. |
| |
| Most Fortran 90 compilers provide a way to specify module directories. |
| Some have separate flags for the directory to write module files to, |
| and directories to search them in, whereas others only allow writing to |
| the current directory or to the first directory specified in the include |
| path. Further, with some compilers, the module search path and the |
| preprocessor search path can only be modified with the same flag. Thus, |
| for portability, write module files to the current directory only and |
| list that as first directory in the search path. |
| |
| There may be no whitespace between @code{FC_MODINC} and the following |
| directory name, but @code{FC_MODINC} may contain trailing white space. |
| For example, if you use Automake and would like to search @file{../lib} |
| for module files, you can use the following: |
| |
| @example |
| AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib |
| @end example |
| |
| Inside @command{configure} tests, you can use: |
| |
| @example |
| if test -n "$FC_MODINC"; then |
| FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib" |
| fi |
| @end example |
| |
| The flag is cached in the @code{ac_cv_fc_module_flag} variable. |
| The substituted value of @code{FC_MODINC} may refer to the |
| @code{ac_empty} dummy placeholder empty variable, to avoid losing |
| the significant trailing whitespace in a @file{Makefile}. |
| @end defmac |
| |
| @defmac AC_FC_MODULE_OUTPUT_FLAG (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{FC_MODULE_OUTPUT_FLAG} |
| @caindex fc_module_output_flag |
| @ovindex FC_MODOUT |
| |
| Find the compiler flag to write Fortran 90 module information to |
| another directory, and store that in the @code{FC_MODOUT} variable. |
| Call @var{action-if-success} (defaults to nothing) if successful, and |
| set @code{FC_MODOUT} to empty and call @var{action-if-failure} (defaults |
| to exiting with an error message) if not. |
| |
| Not all Fortran 90 compilers write module files, and of those that do, |
| not all allow writing to a directory other than the current one, nor |
| do all have separate flags for writing and reading; see the description |
| of @code{AC_FC_MODULE_FLAG} above. If you need to be able to write to |
| another directory, for maximum portability use @code{FC_MODOUT} before |
| any @code{FC_MODINC} and include both the current directory and the one |
| you write to in the search path: |
| |
| @example |
| AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). @dots{} |
| @end example |
| |
| The flag is cached in the @code{ac_cv_fc_module_output_flag} variable. |
| The substituted value of @code{FC_MODOUT} may refer to the |
| @code{ac_empty} dummy placeholder empty variable, to avoid losing |
| the significant trailing whitespace in a @file{Makefile}. |
| @end defmac |
| |
| @defmac AC_F77_CRAY_POINTERS (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @defmacx AC_FC_CRAY_POINTERS (@ovar{action-if-success}, @ |
| @dvar{action-if-failure, AC_MSG_FAILURE}) |
| @acindex{F77_CRAY_POINTERS} |
| @acindex{FC_CRAY_POINTERS} |
| @caindex fc_cray_pointer |
| |
| Try to ensure that the Fortran compiler (@code{$F77} or @code{$FC}) |
| accepts Cray pointers. If successful, the @var{action-if-success} is |
| called and any needed flags are added to @code{FFLAGS} or |
| @code{FCFLAGS}. Otherwise, @var{action-if-failure} is called, which |
| defaults to failing with an error message. |
| |
| Cray pointers are a non-standard extension supported by many Fortran |
| compilers which allow an integer to be declared as C-like pointer to |
| a target variable. |
| |
| The result of this test, or @samp{none} or @samp{unknown}, is cached in |
| the @code{ac_cv_f77_cray_ptr} or @code{ac_cv_fc_cray_ptr} variable. |
| @end defmac |
| |
| |
| @node Go Compiler |
| @subsection Go Compiler Characteristics |
| @cindex Go |
| |
| Autoconf provides basic support for the Go programming language when |
| using the @code{gccgo} compiler (there is currently no support for the |
| @code{6g} and @code{8g} compilers). |
| |
| @defmac AC_PROG_GO (@ovar{compiler-search-list}) |
| Find the Go compiler to use. Check whether the environment variable |
| @code{GOC} is set; if so, then set output variable @code{GOC} to its |
| value. |
| |
| Otherwise, if the macro is invoked without an argument, then search for |
| a Go compiler named @code{gccgo}. If it is not found, then as a last |
| resort set @code{GOC} to @code{gccgo}. |
| |
| This macro may be invoked with an optional first argument which, if |
| specified, must be a blank-separated list of Go compilers to search for. |
| |
| If output variable @code{GOFLAGS} was not already set, set it to |
| @option{-g -O2}. If your package does not like this default, |
| @code{GOFLAGS} may be set before @code{AC_PROG_GO}. |
| @end defmac |
| |
| |
| @node System Services |
| @section System Services |
| |
| The following macros check for operating system services or capabilities. |
| |
| @anchor{AC_PATH_X} |
| @defmac AC_PATH_X |
| @acindex{PATH_X} |
| @evindex XMKMF |
| @cindex X Window System |
| Try to locate the X Window System include files and libraries. If the |
| user gave the command line options @option{--x-includes=@var{dir}} and |
| @option{--x-libraries=@var{dir}}, use those directories. |
| |
| If either or both were not given, get the missing values by running |
| @code{xmkmf} (or an executable pointed to by the @code{XMKMF} |
| environment variable) on a trivial @file{Imakefile} and examining the |
| makefile that it produces. Setting @code{XMKMF} to @samp{false} |
| disables this method. |
| |
| If this method fails to find the X Window System, @command{configure} |
| looks for the files in several directories where they often reside. |
| If either method is successful, set the shell variables |
| @code{x_includes} and @code{x_libraries} to their locations, unless they |
| are in directories the compiler searches by default. |
| |
| If both methods fail, or the user gave the command line option |
| @option{--without-x}, set the shell variable @code{no_x} to @samp{yes}; |
| otherwise set it to the empty string. |
| @end defmac |
| |
| @anchor{AC_PATH_XTRA} |
| @defmac AC_PATH_XTRA |
| @acindex{PATH_XTRA} |
| @ovindex X_CFLAGS |
| @ovindex X_LIBS |
| @ovindex X_EXTRA_LIBS |
| @ovindex X_PRE_LIBS |
| @cvindex X_DISPLAY_MISSING |
| An enhanced version of @code{AC_PATH_X}. It adds the C compiler flags |
| that X needs to output variable @code{X_CFLAGS}, and the X linker flags |
| to @code{X_LIBS}. Define @code{X_DISPLAY_MISSING} if X is not |
| available. |
| |
| This macro also checks for special libraries that some systems need in |
| order to compile X programs. It adds any that the system needs to |
| output variable @code{X_EXTRA_LIBS}. And it checks for special X11R6 |
| libraries that need to be linked with before @option{-lX11}, and adds |
| any found to the output variable @code{X_PRE_LIBS}. |
| |
| @c This is an incomplete kludge. Make a real way to do it. |
| @c If you need to check for other X functions or libraries yourself, then |
| @c after calling this macro, add the contents of @code{X_EXTRA_LIBS} to |
| @c @code{LIBS} temporarily, like this: (FIXME - add example) |
| @end defmac |
| |
| @anchor{AC_SYS_INTERPRETER} |
| @defmac AC_SYS_INTERPRETER |
| @acindex{SYS_INTERPRETER} |
| Check whether the system supports starting scripts with a line of the |
| form @samp{#!/bin/sh} to select the interpreter to use for the script. |
| After running this macro, shell code in @file{configure.ac} can check |
| the shell variable @code{interpval}; it is set to @samp{yes} |
| if the system supports @samp{#!}, @samp{no} if not. |
| @end defmac |
| |
| @anchor{AC_SYS_LARGEFILE} |
| @defmac AC_SYS_LARGEFILE |
| @acindex{SYS_LARGEFILE} |
| @cvindex _FILE_OFFSET_BITS |
| @cvindex _TIME_BITS |
| @ovindex CC |
| @cindex Large file support |
| @cindex LFS |
| If the default @code{off_t} type is a 32-bit integer, |
| and therefore cannot be used with files 2 GiB or larger, |
| make a wider @code{off_t} available if the system supports it. |
| Similarly, widen other types related to sizes of files and file systems |
| if possible. These types may include @code{blkcnt_t}, @code{dev_t}, |
| @code{ino_t}, @code{fsblkcnt_t}, @code{fsfilcnt_t}, and @code{rlim_t}. |
| |
| Also, arrange for a @command{configure} option @code{--enable-year2038} |
| to request widening the type @code{time_t} as needed to represent file |
| wand other timestamps after mid-January 2038. This widening is possible |
| only on 32-bit GNU/Linux x86 and ARM systems with glibc 2.34 or later. |
| If year-2038 support is requested but @command{configure} fails to find a way |
| to widen @code{time_t} and inspection of the system suggests that |
| this feature is available somehow, @command{configure} will error out. |
| If you want the default to be @code{--enable-year2038}, you can use |
| @code{AC_SYS_YEAR2038} or @code{AC_SYS_YEAR2038_RECOMMENDED} |
| instead of @code{AC_SYS_LARGEFILE}. |
| In other words, older packages that have long used @code{AC_SYS_LARGEFILE} |
| can have year-2038 support on 32-bit GNU/Linux x86 and ARM systems either by |
| regenerating @file{configure} with current Autoconf and configuring with |
| @option{--enable-year2038}, or by using @code{AC_SYS_YEAR2038} or |
| @code{AC_SYS_YEAR2038_RECOMMENDED} and configuring without |
| @option{--disable-year2038}. |
| A future version of Autoconf might change the @code{AC_SYS_LARGEFILE} |
| default to @code{--enable-year2038}; if and when that happens, |
| @code{AC_SYS_LARGEFILE} and @code{AC_SYS_YEAR2038} will become equivalent. |
| @xref{AC_SYS_YEAR2038}. |
| |
| Set the shell variable @code{ac_have_largefile} to @samp{yes} or |
| @code{no} depending on whether a wide @code{off_t} is available, |
| regardless of whether arrangements were necessary. |
| Similarly, set the shell variable @code{ac_have_year2038} to @code{yes} |
| or @code{no} depending on whether a wide-enough @code{time_t} is available. |
| |
| Define preprocessor macros if necessary to make types wider; |
| for example, on GNU/Linux systems the macros @code{_FILE_OFFSET_BITS} |
| and @code{_TIME_BITS} can be defined. Some of these macros work only if |
| defined before the first system header is included; |
| therefore, when using this macro in concert with |
| @code{AC_CONFIG_HEADERS}, make sure that @file{config.h} is included |
| before any system headers. |
| |
| Large-file support can be disabled by configuring with the |
| @option{--disable-largefile} option, and year-2038 support can |
| be enabled and disabled via the @option{--enable-year2038} and |
| @option{--disable-year2038} options. These options have no effect on |
| systems where types are wide enough by default. |
| Large-file support is required for year-2038 support: if you configure |
| with @option{--disable-largefile} on a platform with 32-bit |
| @code{time_t}, then year-2038 support is not available. |
| |
| Disabling large-file or year-2038 support can have surprising effects, |
| such as causing functions like @code{readdir} and @code{stat} to fail |
| even on a small file because its inode number or timestamp is out of range. |
| |
| Regardless of whether you use this macro, portable programs should not |
| assume that any of the types listed above fit into a @code{long int}. |
| For example, it is not portable to print an arbitrary @code{off_t} or |
| @code{time_t} value @code{X} with @code{printf ("%ld", (long int) X)}. |
| |
| The standard C library functions @code{fseek} and @code{ftell} |
| do not use @code{off_t}. If you need to use either of these functions, |
| you should use @code{AC_FUNC_FSEEKO} as well as @code{AC_SYS_LARGEFILE}, |
| and then use their POSIX replacements @code{fseeko} and @code{ftello}. |
| @xref{AC_FUNC_FSEEKO}. |
| |
| When using @code{AC_SYS_LARGEFILE} in different packages that are linked |
| together and that have interfaces that depend on the width of @code{off_t}, |
| @code{time_t} or related types, the simplest thing is to configure all |
| components the same way. For example, if an application uses |
| @code{AC_SYS_LARGEFILE} and is configured with |
| @option{--enable-year2038}, libraries it links to with an @code{off_t}- |
| or @code{time_t}-dependent interface should be configured equivalently. |
| Alternatively, you can modify libraries to support both 32- and 64-bit |
| interfaces though this is more work and few libraries other than the C |
| library itself are modified in this way. |
| |
| Applications and libraries should be configured compatibly. |
| If @code{off_t}, @code{time_t} or related types appear in a library's |
| public interface, enabling or disabling the library's large-file or |
| year-2038 support may break binary compatibility with applications or |
| with other libraries. Similarly, if an application links to a such a |
| library, enabling or disabling the application's large-file support may |
| break binary compatibility with that library. |
| @end defmac |
| |
| @anchor{AC_SYS_LONG_FILE_NAMES} |
| @defmac AC_SYS_LONG_FILE_NAMES |
| @acindex{SYS_LONG_FILE_NAMES} |
| @cvindex HAVE_LONG_FILE_NAMES |
| If the system supports file names longer than 14 characters, define |
| @code{HAVE_LONG_FILE_NAMES}. |
| @end defmac |
| |
| @defmac AC_SYS_POSIX_TERMIOS |
| @acindex{SYS_POSIX_TERMIOS} |
| @cindex POSIX termios headers |
| @cindex termios POSIX headers |
| @caindex sys_posix_termios |
| Check to see if the POSIX termios headers and functions are available on the |
| system. If so, set the shell variable @code{ac_cv_sys_posix_termios} to |
| @samp{yes}. If not, set the variable to @samp{no}. |
| @end defmac |
| |
| @anchor{AC_SYS_YEAR2038} |
| @defmac AC_SYS_YEAR2038 |
| @acindex{SYS_YEAR2038} |
| @cindex Year 2038 |
| This is like @code{AC_SYS_LARGEFILE} except it defaults to enabling |
| instead of disabling year-2038 support. Year-2038 support for |
| applications and libraries should be configured compatibly. |
| @xref{AC_SYS_LARGEFILE}. |
| @end defmac |
| |
| @defmac AC_SYS_YEAR2038_RECOMMENDED |
| @acindex{SYS_YEAR2038_RECOMMENDED} |
| This macro has the same effect as @code{AC_SYS_YEAR2038}, |
| but also declares that the program being configured |
| should support timestamps after mid-January 2038. |
| If a large @code{time_t} is unavailable, @command{configure} will error |
| out unless the @option{--disable-year2038} option is specified. |
| |
| Year-2038 support for applications and libraries should be configured |
| compatibly. @xref{AC_SYS_YEAR2038}. |
| @end defmac |
| |
| @node C and POSIX Variants |
| @section C and POSIX Variants |
| |
| The following macro makes it possible to use C language and library |
| extensions defined by the C standards committee, features of POSIX that |
| are extensions to C, and platform extensions not defined by POSIX. |
| |
| @anchor{AC_USE_SYSTEM_EXTENSIONS} |
| @defmac AC_USE_SYSTEM_EXTENSIONS |
| @acindex{USE_SYSTEM_EXTENSIONS} |
| If possible, enable extensions to C or POSIX on hosts that normally |
| disable the extensions, typically due to standards-conformance namespace |
| issues. This should be called before any macros that run the C |
| compiler. Also, when using this macro in concert with |
| @code{AC_CONFIG_HEADERS}, be sure that @file{config.h} is included |
| before any system header. |
| |
| Define the following preprocessor macros unconditionally: |
| |
| @table @code |
| @item _ALL_SOURCE |
| @cvindex _ALL_SOURCE |
| Enable extensions on AIX and z/OS. |
| @item _COSMO_SOURCE |
| @cvindex _COSMO_SOURCE |
| Enable extensions on Cosmopolitan Libc. |
| @item _DARWIN_C_SOURCE |
| @cvindex _DARWIN_C_SOURCE |
| Enable extensions on macOS. |
| @item _GNU_SOURCE |
| @cvindex _GNU_SOURCE |
| Enable extensions on GNU systems. |
| @item _NETBSD_SOURCE |
| @cvindex _NETBSD_SOURCE |
| Enable general extensions on NetBSD. |
| Enable NetBSD compatibility extensions on Minix. |
| @item _OPENBSD_SOURCE |
| @cvindex _OPENBSD_SOURCE |
| Enable OpenBSD compatibility extensions on NetBSD. |
| Oddly enough, this does nothing on OpenBSD. |
| @item _POSIX_PTHREAD_SEMANTICS |
| @cvindex _POSIX_PTHREAD_SEMANTICS |
| Enable POSIX-compatible threading on Solaris. |
| @item __STDC_WANT_IEC_60559_ATTRIBS_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_ATTRIBS_EXT__ |
| Enable extensions specified by ISO/IEC TS 18661-5:2014. |
| @item __STDC_WANT_IEC_60559_BFP_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_BFP_EXT__ |
| Enable extensions specified by ISO/IEC TS 18661-1:2014. |
| @item __STDC_WANT_IEC_60559_DFP_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_DFP_EXT__ |
| Enable extensions specified by ISO/IEC TS 18661-2:2015. |
| @item __STDC_WANT_IEC_60559_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_EXT__ |
| Enable extensions specified by C23 Annex F. |
| @item __STDC_WANT_IEC_60559_FUNCS_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_FUNCS_EXT__ |
| Enable extensions specified by ISO/IEC TS 18661-4:2015. |
| @item __STDC_WANT_IEC_60559_TYPES_EXT__ |
| @cvindex __STDC_WANT_IEC_60559_TYPES_EXT__ |
| Enable extensions specified by C23 Annex H and by ISO/IEC TS 18661-3:2015. |
| @item __STDC_WANT_LIB_EXT2__ |
| @cvindex __STDC_WANT_LIB_EXT2__ |
| Enable extensions specified by ISO/IEC TR 24731-2:2010. |
| @item __STDC_WANT_MATH_SPEC_FUNCS__ |
| @cvindex __STDC_WANT_MATH_SPEC_FUNCS__ |
| Enable extensions specified by ISO/IEC 24747:2009. |
| @item _TANDEM_SOURCE |
| @cvindex _TANDEM_SOURCE |
| Enable extensions on HP NonStop systems. |
| @end table |
| |
| The following preprocessor macros are defined only when necessary; |
| they enable access to extensions on some operating systems but |
| @emph{disable} extensions on other operating systems. |
| |
| @table @code |
| @item __EXTENSIONS__ |
| @cvindex __EXTENSIONS__ |
| Enable general extensions on Solaris. This macro is defined only if |
| the headers included by @code{AC_INCLUDES_DEFAULT} |
| (@pxref{Default Includes}) work correctly with it defined. |
| |
| @item _MINIX |
| @itemx _POSIX_SOURCE |
| @itemx _POSIX_1_SOURCE |
| @cvindex _MINIX |
| @cvindex _POSIX_SOURCE |
| @cvindex _POSIX_1_SOURCE |
| Defined only on MINIX. @code{_POSIX_SOURCE} and @code{_POSIX_1_SOURCE} |
| are needed to enable a number of POSIX features on this OS. |
| @code{_MINIX} does not affect the system headers' behavior; |
| future versions of Autoconf may stop defining it. |
| Programs that need to recognize Minix should use @code{AC_CANONICAL_HOST}. |
| |
| @item _XOPEN_SOURCE |
| @cvindex _XOPEN_SOURCE |
| Defined (with value 500) only if needed to make @file{wchar.h} declare |
| @code{mbstate_t}. This is known to be necessary on some versions of HP-UX. |
| @end table |
| |
| @cvindex __STDC_WANT_DEC_FP__ |
| The C preprocessor macro @code{__STDC_WANT_DEC_FP__} is not defined. |
| ISO/IEC TR 24732:2009 was superseded by ISO/IEC TS 18661-2:2015. |
| |
| @cvindex __STDC_WANT_LIB_EXT1__ |
| The C preprocessor macro @code{__STDC_WANT_LIB_EXT1__} is not defined, |
| as the C standard's Annex K is problematic. See: O'Donell C, Sebor M. |
| @uref{https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm, Field |
| Experience With Annex K---Bounds Checking Interfaces}. |
| |
| The Autoconf macro @code{AC_USE_SYSTEM_EXTENSIONS} was introduced in |
| Autoconf 2.60. |
| @end defmac |
| |
| |
| @node Erlang Libraries |
| @section Erlang Libraries |
| @cindex Erlang, Library, checking |
| |
| The following macros check for an installation of Erlang/OTP, and for the |
| presence of certain Erlang libraries. All those macros require the |
| configuration of an Erlang interpreter and an Erlang compiler |
| (@pxref{Erlang Compiler and Interpreter}). |
| |
| @defmac AC_ERLANG_SUBST_ERTS_VER |
| @acindex{ERLANG_SUBST_ERTS_VER} |
| @ovindex ERLANG_ERTS_VER |
| Set the output variable @code{ERLANG_ERTS_VER} to the version of the |
| Erlang runtime system (as returned by Erlang's |
| @code{erlang:system_info(version)} function). The result of this test |
| is cached if caching is enabled when running @command{configure}. The |
| @code{ERLANG_ERTS_VER} variable is not intended to be used for testing |
| for features of specific ERTS versions, but to be used for substituting |
| the ERTS version in Erlang/OTP release resource files (@code{.rel} |
| files), as shown below. |
| @end defmac |
| |
| @defmac AC_ERLANG_SUBST_ROOT_DIR |
| @acindex{ERLANG_SUBST_ROOT_DIR} |
| @ovindex ERLANG_ROOT_DIR |
| Set the output variable @code{ERLANG_ROOT_DIR} to the path to the base |
| directory in which Erlang/OTP is installed (as returned by Erlang's |
| @code{code:root_dir/0} function). The result of this test is cached if |
| caching is enabled when running @command{configure}. |
| @end defmac |
| |
| @defmac AC_ERLANG_SUBST_LIB_DIR |
| @acindex{ERLANG_SUBST_LIB_DIR} |
| @ovindex ERLANG_LIB_DIR |
| Set the output variable @code{ERLANG_LIB_DIR} to the path of the library |
| directory of Erlang/OTP (as returned by Erlang's |
| @code{code:lib_dir/0} function), which subdirectories each contain an installed |
| Erlang/OTP library. The result of this test is cached if caching is enabled |
| when running @command{configure}. |
| @end defmac |
| |
| @defmac AC_ERLANG_CHECK_LIB (@var{library}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{ERLANG_CHECK_LIB} |
| @ovindex ERLANG_LIB_DIR_@var{library} |
| @ovindex ERLANG_LIB_VER_@var{library} |
| Test whether the Erlang/OTP library @var{library} is installed by |
| calling Erlang's @code{code:lib_dir/1} function. The result of this |
| test is cached if caching is enabled when running @command{configure}. |
| @var{action-if-found} is a list of shell commands to run if the library |
| is installed; @var{action-if-not-found} is a list of shell commands to |
| run if it is not. Additionally, if the library is installed, the output |
| variable @samp{ERLANG_LIB_DIR_@var{library}} is set to the path to the |
| library installation directory, and the output variable |
| @samp{ERLANG_LIB_VER_@var{library}} is set to the version number that is |
| part of the subdirectory name, if it is in the standard form |
| (@code{@var{library}-@var{version}}). If the directory name does not |
| have a version part, @samp{ERLANG_LIB_VER_@var{library}} is set to the |
| empty string. If the library is not installed, |
| @samp{ERLANG_LIB_DIR_@var{library}} and |
| @samp{ERLANG_LIB_VER_@var{library}} are set to @code{"not found"}. For |
| example, to check if library @code{stdlib} is installed: |
| |
| @example |
| AC_ERLANG_CHECK_LIB([stdlib], |
| [AS_ECHO(["stdlib version \"$ERLANG_LIB_VER_stdlib\""]) |
| AS_ECHO(["is installed in \"$ERLANG_LIB_DIR_stdlib\""])], |
| [AC_MSG_ERROR([stdlib was not found!])]) |
| @end example |
| |
| The @samp{ERLANG_LIB_VER_@var{library}} variables (set by |
| @code{AC_ERLANG_CHECK_LIB}) and the @code{ERLANG_ERTS_VER} variable (set |
| by @code{AC_ERLANG_SUBST_ERTS_VER}) are not intended to be used for |
| testing for features of specific versions of libraries or of the Erlang |
| runtime system. Those variables are intended to be substituted in |
| Erlang release resource files (@code{.rel} files). For instance, to |
| generate a @file{example.rel} file for an application depending on the |
| @code{stdlib} library, @file{configure.ac} could contain: |
| |
| @example |
| AC_ERLANG_SUBST_ERTS_VER |
| AC_ERLANG_CHECK_LIB([stdlib], |
| [], |
| [AC_MSG_ERROR([stdlib was not found!])]) |
| AC_CONFIG_FILES([example.rel]) |
| @end example |
| |
| @noindent |
| The @file{example.rel.in} file used to generate @file{example.rel} |
| should contain: |
| |
| @example |
| @{release, |
| @{"@@PACKAGE@@", "@@VERSION@@"@}, |
| @{erts, "@@ERLANG_ERTS_VER@@"@}, |
| [@{stdlib, "@@ERLANG_LIB_VER_stdlib@@"@}, |
| @{@@PACKAGE@@, "@@VERSION@@"@}]@}. |
| @end example |
| @end defmac |
| |
| In addition to the above macros, which test installed Erlang libraries, the |
| following macros determine the paths to the directories into which newly built |
| Erlang libraries are to be installed: |
| |
| @defmac AC_ERLANG_SUBST_INSTALL_LIB_DIR |
| @acindex{ERLANG_SUBST_INSTALL_LIB_DIR} |
| @ovindex ERLANG_INSTALL_LIB_DIR |
| |
| Set the @code{ERLANG_INSTALL_LIB_DIR} output variable to the directory into |
| which every built Erlang library should be installed in a separate |
| subdirectory. |
| If this variable is not set in the environment when @command{configure} runs, |
| its default value is @code{$@{libdir@}/erlang/lib}. |
| @end defmac |
| |
| @defmac AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (@var{library}, @var{version}) |
| @acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR} |
| @ovindex ERLANG_INSTALL_LIB_DIR_@var{library} |
| |
| Set the @samp{ERLANG_INSTALL_LIB_DIR_@var{library}} output variable to the |
| directory into which the built Erlang library @var{library} version |
| @var{version} should be installed. If this variable is not set in the |
| environment when @command{configure} runs, its default value is |
| @samp{$ERLANG_INSTALL_LIB_DIR/@var{library}-@var{version}}, the value of the |
| @code{ERLANG_INSTALL_LIB_DIR} variable being set by the |
| @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} macro. |
| @end defmac |
| |
| |
| |
| |
| |
| @c ========================================================= Writing Tests |
| |
| @node Writing Tests |
| @chapter Writing Tests |
| |
| If the existing feature tests don't do something you need, you have to |
| write new ones. These macros are the building blocks. They provide |
| ways for other macros to check whether various kinds of features are |
| available and report the results. |
| |
| This chapter contains some suggestions and some of the reasons why the |
| existing tests are written the way they are. You can also learn a lot |
| about how to write Autoconf tests by looking at the existing ones. If |
| something goes wrong in one or more of the Autoconf tests, this |
| information can help you understand the assumptions behind them, which |
| might help you figure out how to best solve the problem. |
| |
| These macros check the output of the compiler system of the current |
| language (@pxref{Language Choice}). They do not cache the results of |
| their tests for future use (@pxref{Caching Results}), because they don't |
| know enough about the information they are checking for to generate a |
| cache variable name. They also do not print any messages, for the same |
| reason. The checks for particular kinds of features call these macros |
| and do cache their results and print messages about what they're |
| checking for. |
| |
| When you write a feature test that could be applicable to more than one |
| software package, the best thing to do is encapsulate it in a new macro. |
| @xref{Writing Autoconf Macros}, for how to do that. |
| |
| @menu |
| * Language Choice:: Selecting which language to use for testing |
| * Writing Test Programs:: Forging source files for compilers |
| * Running the Preprocessor:: Detecting preprocessor symbols |
| * Running the Compiler:: Detecting language or header features |
| * Running the Linker:: Detecting library features |
| * Runtime:: Testing for runtime features |
| * Multiple Cases:: Tests for several possible values |
| @end menu |
| |
| @node Language Choice |
| @section Language Choice |
| @cindex Language |
| |
| Autoconf-generated @command{configure} scripts check for the C compiler and |
| its features by default. Packages that use other programming languages |
| (maybe more than one, e.g., C and C++) need to test features of the |
| compilers for the respective languages. The following macros determine |
| which programming language is used in the subsequent tests in |
| @file{configure.ac}. |
| |
| @anchor{AC_LANG} |
| @defmac AC_LANG (@var{language}) |
| @acindex{LANG} |
| Do compilation tests using the compiler, preprocessor, and file |
| extensions for the specified @var{language}. |
| |
| Supported languages are: |
| |
| @table @samp |
| @item C |
| Do compilation tests using @code{CC} and @code{CPP} and use extension |
| @file{.c} for test programs. Use compilation flags: @code{CPPFLAGS} with |
| @code{CPP}, and both @code{CPPFLAGS} and @code{CFLAGS} with @code{CC}. |
| |
| @item C++ |
| Do compilation tests using @code{CXX} and @code{CXXCPP} and use |
| extension @file{.C} for test programs. Use compilation flags: |
| @code{CPPFLAGS} with @code{CXXCPP}, and both @code{CPPFLAGS} and |
| @code{CXXFLAGS} with @code{CXX}. |
| |
| @item Fortran 77 |
| Do compilation tests using @code{F77} and use extension @file{.f} for |
| test programs. Use compilation flags: @code{FFLAGS}. |
| |
| @item Fortran |
| Do compilation tests using @code{FC} and use extension @file{.f} (or |
| whatever has been set by @code{AC_FC_SRCEXT}) for test programs. Use |
| compilation flags: @code{FCFLAGS}. |
| |
| @item Erlang |
| @ovindex ERLC |
| @ovindex ERL |
| @ovindex ERLCFLAGS |
| Compile and execute tests using @code{ERLC} and @code{ERL} and use extension |
| @file{.erl} for test Erlang modules. Use compilation flags: @code{ERLCFLAGS}. |
| |
| @item Objective C |
| Do compilation tests using @code{OBJC} and @code{OBJCPP} and use |
| extension @file{.m} for test programs. Use compilation flags: |
| @code{CPPFLAGS} with @code{OBJCPP}, and both @code{CPPFLAGS} and |
| @code{OBJCFLAGS} with @code{OBJC}. |
| |
| @item Objective C++ |
| Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use |
| extension @file{.mm} for test programs. Use compilation flags: |
| @code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and |
| @code{OBJCXXFLAGS} with @code{OBJCXX}. |
| |
| @item Go |
| Do compilation tests using @code{GOC} and use extension @file{.go} for |
| test programs. Use compilation flags @code{GOFLAGS}. |
| @end table |
| @end defmac |
| |
| @anchor{AC_LANG_PUSH} |
| @defmac AC_LANG_PUSH (@var{language}) |
| @acindex{LANG_PUSH} |
| Remember the current language (as set by @code{AC_LANG}) on a stack, and |
| then select the @var{language}. Use this macro and @code{AC_LANG_POP} |
| in macros that need to temporarily switch to a particular language. |
| @end defmac |
| |
| @defmac AC_LANG_POP (@ovar{language}) |
| @acindex{LANG_POP} |
| Select the language that is saved on the top of the stack, as set by |
| @code{AC_LANG_PUSH}, and remove it from the stack. |
| |
| If given, @var{language} specifies the language we just @emph{quit}. It |
| is a good idea to specify it when it's known (which should be the |
| case@dots{}), since Autoconf detects inconsistencies. |
| |
| @example |
| AC_LANG_PUSH([Fortran 77]) |
| # Perform some tests on Fortran 77. |
| # @dots{} |
| AC_LANG_POP([Fortran 77]) |
| @end example |
| @end defmac |
| |
| @defmac AC_LANG_ASSERT (@var{language}) |
| @acindex{LANG_ASSERT} |
| Check statically that the current language is @var{language}. |
| You should use this in your language specific macros |
| to avoid that they be called with an inappropriate language. |
| |
| This macro runs only at @command{autoconf} time, and incurs no cost at |
| @command{configure} time. Sadly enough and because Autoconf is a two |
| layer language @footnote{Because M4 is not aware of Sh code, |
| especially conditionals, some optimizations that look nice statically |
| may produce incorrect results at runtime.}, the macros |
| @code{AC_LANG_PUSH} and @code{AC_LANG_POP} cannot be ``optimizing'', |
| therefore as much as possible you ought to avoid using them to wrap |
| your code, rather, require from the user to run the macro with a |
| correct current language, and check it with @code{AC_LANG_ASSERT}. |
| And anyway, that may help the user understand she is running a Fortran |
| macro while expecting a result about her Fortran 77 compiler@enddots{} |
| @end defmac |
| |
| |
| @defmac AC_REQUIRE_CPP |
| @acindex{REQUIRE_CPP} |
| Ensure that whichever preprocessor would currently be used for tests has |
| been found. Calls @code{AC_REQUIRE} (@pxref{Prerequisite Macros}) with an |
| argument of either @code{AC_PROG_CPP} or @code{AC_PROG_CXXCPP}, |
| depending on which language is current. |
| @end defmac |
| |
| |
| @node Writing Test Programs |
| @section Writing Test Programs |
| |
| Autoconf tests follow a common scheme: feed some program with some |
| input, and most of the time, feed a compiler with some source file. |
| This section is dedicated to these source samples. |
| |
| @menu |
| * Guidelines:: General rules for writing test programs |
| * Test Functions:: Avoiding pitfalls in test programs |
| * Generating Sources:: Source program boilerplate |
| @end menu |
| |
| @node Guidelines |
| @subsection Guidelines for Test Programs |
| |
| The most important rule to follow when writing testing samples is: |
| |
| @center @emph{Look for realism.} |
| |
| This motto means that testing samples must be written with the same |
| strictness as real programs are written. In particular, you should |
| avoid ``shortcuts'' and simplifications. |
| |
| Don't just play with the preprocessor if you want to prepare a |
| compilation. For instance, using @command{cpp} to check whether a header is |
| functional might let your @command{configure} accept a header which |
| causes some @emph{compiler} error. Do not hesitate to check a header with |
| other headers included before, especially required headers. |
| |
| Make sure the symbols you use are properly defined, i.e., refrain from |
| simply declaring a function yourself instead of including the proper |
| header. |
| |
| Test programs should not write to standard output. They |
| should exit with status 0 if the test succeeds, and with status 1 |
| otherwise, so that success |
| can be distinguished easily from a core dump or other failure; |
| segmentation violations and other failures produce a nonzero exit |
| status. Unless you arrange for @code{exit} to be declared, test |
| programs should @code{return}, not @code{exit}, from @code{main}, |
| because on many systems @code{exit} is not declared by default. |
| |
| Test programs can use @code{#if} or @code{#ifdef} to check the values of |
| preprocessor macros defined by tests that have already run. For |
| example, if you call @code{AC_HEADER_STDBOOL}, then later on in |
| @file{configure.ac} you can have a test program that includes |
| @file{stdbool.h} conditionally: |
| |
| @example |
| @group |
| #ifdef HAVE_STDBOOL_H |
| # include <stdbool.h> |
| #endif |
| @end group |
| @end example |
| |
| Both @code{#if HAVE_STDBOOL_H} and @code{#ifdef HAVE_STDBOOL_H} will |
| work with any standard C compiler. Some developers prefer @code{#if} |
| because it is easier to read, while others prefer @code{#ifdef} because |
| it avoids diagnostics with picky compilers like GCC with the |
| @option{-Wundef} option. |
| |
| If a test program needs to use or create a data file, give it a name |
| that starts with @file{conftest}, such as @file{conftest.data}. The |
| @command{configure} script cleans up by running @samp{rm -f -r conftest*} |
| after running test programs and if the script is interrupted. |
| |
| @node Test Functions |
| @subsection Test Functions |
| |
| Functions in test code should use function prototypes, introduced in C89 |
| and required in C23. |
| |
| Functions that test programs declare should also be conditionalized for |
| C++, which requires @samp{extern "C"} prototypes. Make sure to not |
| include any header files containing clashing prototypes. |
| |
| @example |
| #ifdef __cplusplus |
| extern "C" |
| #endif |
| void *valloc (size_t); |
| @end example |
| |
| If a test program calls a function with invalid parameters (just to see |
| whether it exists), organize the program to ensure that it never invokes |
| that function. You can do this by calling it in another function that is |
| never invoked. You can't do it by putting it after a call to |
| @code{exit}, because GCC version 2 knows that @code{exit} |
| never returns |
| and optimizes out any code that follows it in the same block. |
| |
| If you include any header files, be sure to call the functions |
| relevant to them with the correct number of arguments, even if they are |
| just 0, to avoid compilation errors due to prototypes. GCC |
| version 2 |
| has internal prototypes for several functions that it automatically |
| inlines; for example, @code{memcpy}. To avoid errors when checking for |
| them, either pass them the correct number of arguments or redeclare them |
| with a different return type (such as @code{char}). |
| |
| |
| @node Generating Sources |
| @subsection Generating Sources |
| |
| Autoconf provides a set of macros that can be used to generate test |
| source files. They are written to be language generic, i.e., they |
| actually depend on the current language (@pxref{Language Choice}) to |
| ``format'' the output properly. |
| |
| |
| @defmac AC_LANG_CONFTEST (@var{source}) |
| @acindex{LANG_CONFTEST} |
| Save the @var{source} text in the current test source file: |
| @file{conftest.@var{extension}} where the @var{extension} depends on the |
| current language. As of Autoconf 2.63b, the source file also contains |
| the results of all of the @code{AC_DEFINE} performed so far. |
| |
| Note that the @var{source} is evaluated exactly once, like regular |
| Autoconf macro arguments, and therefore (i) you may pass a macro |
| invocation, (ii) if not, be sure to double quote if needed. |
| |
| The @var{source} text is expanded as an unquoted here-document, so |
| @samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped. |
| @xref{Here-Documents}. |
| |
| This macro issues a warning during @command{autoconf} processing if |
| @var{source} does not include an expansion of the macro |
| @code{AC_LANG_DEFINES_PROVIDED} (note that both @code{AC_LANG_SOURCE} and |
| @code{AC_LANG_PROGRAM} call this macro, and thus avoid the warning). |
| |
| This macro is seldom called directly, but is used under the hood by more |
| common macros such as @code{AC_COMPILE_IFELSE} and @code{AC_RUN_IFELSE}. |
| @end defmac |
| |
| @defmac AC_LANG_DEFINES_PROVIDED |
| @acindex{LANG_DEFINES_PROVIDED} |
| This macro is called as a witness that the file |
| @file{conftest.@var{extension}} appropriate for the current language is |
| complete, including all previously determined results from |
| @code{AC_DEFINE}. This macro is seldom called directly, but exists if |
| you have a compelling reason to write a conftest file without using |
| @code{AC_LANG_SOURCE}, yet still want to avoid a syntax warning from |
| @code{AC_LANG_CONFTEST}. |
| @end defmac |
| |
| @defmac AC_LANG_SOURCE (@var{source}) |
| @acindex{LANG_SOURCE} |
| Expands into the @var{source}, with the definition of |
| all the @code{AC_DEFINE} performed so far. This macro includes an |
| expansion of @code{AC_LANG_DEFINES_PROVIDED}. |
| |
| In many cases, you may find it more convenient to use the wrapper |
| @code{AC_LANG_PROGRAM}. |
| @end defmac |
| |
| For instance, executing (observe the double quotation!): |
| |
| @example |
| @c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example. |
| AC_INIT([Hello], [1.0], [bug-hello@@example.org], [], |
| [https://www.example.org/]) |
| AC_DEFINE([HELLO_WORLD], ["Hello, World\n"], |
| [Greetings string.]) |
| AC_LANG([C]) |
| AC_LANG_CONFTEST( |
| [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])]) |
| gcc -E -dD conftest.c |
| @end example |
| |
| @noindent |
| on a system with @command{gcc} installed, results in: |
| |
| @example |
| @c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example. |
| @dots{} |
| @asis{#} 1 "conftest.c" |
| |
| #define PACKAGE_NAME "Hello" |
| #define PACKAGE_TARNAME "hello" |
| #define PACKAGE_VERSION "1.0" |
| #define PACKAGE_STRING "Hello 1.0" |
| #define PACKAGE_BUGREPORT "bug-hello@@example.org" |
| #define PACKAGE_URL "https://www.example.org/" |
| #define HELLO_WORLD "Hello, World\n" |
| |
| const char hw[] = "Hello, World\n"; |
| @end example |
| |
| When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE} |
| definitions are not automatically translated into constants in the |
| source code by this macro. |
| |
| @defmac AC_LANG_PROGRAM (@var{prologue}, @var{body}) |
| @acindex{LANG_PROGRAM} |
| Expands into a source file which consists of the @var{prologue}, and |
| then @var{body} as body of the main function (e.g., @code{main} in |
| C). Since it uses @code{AC_LANG_SOURCE}, the features of the latter are |
| available. |
| @end defmac |
| |
| For instance: |
| |
| @example |
| @c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example. |
| AC_INIT([Hello], [1.0], [bug-hello@@example.org], [], |
| [https://www.example.org/]) |
| AC_DEFINE([HELLO_WORLD], ["Hello, World\n"], |
| [Greetings string.]) |
| AC_LANG_CONFTEST( |
| [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]], |
| [[fputs (hw, stdout);]])]) |
| gcc -E -dD conftest.c |
| @end example |
| |
| @noindent |
| on a system with @command{gcc} installed, results in: |
| |
| @example |
| @c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example. |
| @dots{} |
| @asis{#} 1 "conftest.c" |
| |
| #define PACKAGE_NAME "Hello" |
| #define PACKAGE_TARNAME "hello" |
| #define PACKAGE_VERSION "1.0" |
| #define PACKAGE_STRING "Hello 1.0" |
| #define PACKAGE_BUGREPORT "bug-hello@@example.org" |
| #define PACKAGE_URL "https://www.example.org/" |
| #define HELLO_WORLD "Hello, World\n" |
| |
| const char hw[] = "Hello, World\n"; |
| int |
| main (void) |
| @{ |
| fputs (hw, stdout); |
| ; |
| return 0; |
| @} |
| @end example |
| |
| In Erlang tests, the created source file is that of an Erlang module called |
| @code{conftest} (@file{conftest.erl}). This module defines and exports |
| at least |
| one @code{start/0} function, which is called to perform the test. The |
| @var{prologue} is optional code that is inserted between the module header and |
| the @code{start/0} function definition. @var{body} is the body of the |
| @code{start/0} function without the final period (@pxref{Runtime}, about |
| constraints on this function's behavior). |
| |
| For instance: |
| |
| @example |
| AC_INIT([Hello], [1.0], [bug-hello@@example.org]) |
| AC_LANG(Erlang) |
| AC_LANG_CONFTEST( |
| [AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]], |
| [[io:format("~s~n", [?HELLO_WORLD])]])]) |
| cat conftest.erl |
| @end example |
| |
| @noindent |
| results in: |
| |
| @example |
| -module(conftest). |
| -export([start/0]). |
| -define(HELLO_WORLD, "Hello, world!"). |
| start() -> |
| io:format("~s~n", [?HELLO_WORLD]) |
| . |
| @end example |
| |
| @defmac AC_LANG_CALL (@var{prologue}, @var{function}) |
| @acindex{LANG_CALL} |
| Expands into a source file which consists of the @var{prologue}, and |
| then a call to the @var{function} as body of the main function (e.g., |
| @code{main} in C). Since it uses @code{AC_LANG_PROGRAM}, the feature |
| of the latter are available. |
| |
| This function will probably be replaced in the future by a version |
| which would enable specifying the arguments. The use of this macro is |
| not encouraged, as it violates strongly the typing system. |
| |
| This macro cannot be used for Erlang tests. |
| @end defmac |
| |
| @defmac AC_LANG_FUNC_LINK_TRY (@var{function}) |
| @acindex{LANG_FUNC_LINK_TRY} |
| Expands into a source file which uses the @var{function} in the body of |
| the main function (e.g., @code{main} in C). Since it uses |
| @code{AC_LANG_PROGRAM}, the features of the latter are available. |
| |
| As @code{AC_LANG_CALL}, this macro is documented only for completeness. |
| It is considered to be severely broken, and in the future will be |
| removed in favor of actual function calls (with properly typed |
| arguments). |
| |
| This macro cannot be used for Erlang tests. |
| @end defmac |
| |
| @node Running the Preprocessor |
| @section Running the Preprocessor |
| |
| Sometimes one might need to run the preprocessor on some source file. |
| @emph{Usually it is a bad idea}, as you typically need to @emph{compile} |
| your project, not merely run the preprocessor on it; therefore you |
| certainly want to run the compiler, not the preprocessor. Resist the |
| temptation of following the easiest path. |
| |
| Nevertheless, if you need to run the preprocessor, then use |
| @code{AC_PREPROC_IFELSE}. |
| |
| The macros described in this section cannot be used for tests in Erlang, |
| Fortran, or Go, since those languages require no preprocessor. |
| |
| @anchor{AC_PREPROC_IFELSE} |
| @defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @ |
| @ovar{action-if-false}) |
| @acindex{PREPROC_IFELSE} |
| Run the preprocessor of the current language (@pxref{Language Choice}) |
| on the @var{input}, run the shell commands @var{action-if-true} on |
| success, @var{action-if-false} otherwise. |
| |
| If @var{input} is nonempty use the equivalent of |
| @code{AC_LANG_CONFTEST(@var{input})} to generate the current test source |
| file; otherwise reuse the already-existing test source file. |
| The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends. |
| The @var{input} text is expanded as an unquoted here-document, so |
| @samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped. |
| @xref{Here-Documents}. |
| |
| This macro uses @code{CPPFLAGS}, but not @code{CFLAGS}, because |
| @option{-g}, @option{-O}, etc.@: are not valid options to many C |
| preprocessors. |
| |
| It is customary to report unexpected failures with |
| @code{AC_MSG_FAILURE}. If needed, @var{action-if-true} can further access |
| the preprocessed output in the file @file{conftest.i}. |
| @end defmac |
| |
| For instance: |
| |
| @example |
| AC_INIT([Hello], [1.0], [bug-hello@@example.org]) |
| AC_DEFINE([HELLO_WORLD], ["Hello, World\n"], |
| [Greetings string.]) |
| AC_PREPROC_IFELSE( |
| [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]], |
| [[fputs (hw, stdout);]])], |
| [AC_MSG_RESULT([OK])], |
| [AC_MSG_FAILURE([unexpected preprocessor failure])]) |
| @end example |
| |
| @noindent |
| might result in: |
| |
| @example |
| checking for gcc... gcc |
| checking whether the C compiler works... yes |
| checking for C compiler default output file name... a.out |
| checking for suffix of executables... |
| checking whether we are cross compiling... no |
| checking for suffix of object files... o |
| checking whether the compiler supports GNU C... yes |
| checking whether gcc accepts -g... yes |
| checking for gcc option to enable C23 features... -std=gnu23 |
| checking how to run the C preprocessor... gcc -std=gnu23 -E |
| OK |
| @end example |
| |
| @sp 1 |
| |
| The macro @code{AC_TRY_CPP} (@pxref{Obsolete Macros}) used to play the |
| role of @code{AC_PREPROC_IFELSE}, but double quotes its argument, making |
| it impossible to use it to elaborate sources. You are encouraged to |
| get rid of your old use of the macro @code{AC_TRY_CPP} in favor of |
| @code{AC_PREPROC_IFELSE}, but, in the first place, are you sure you need |
| to run the @emph{preprocessor} and not the compiler? |
| |
| @anchor{AC_EGREP_HEADER} |
| @defmac AC_EGREP_HEADER (@var{pattern}, @var{header-file}, @ |
| @var{action-if-found}, @ovar{action-if-not-found}) |
| @acindex{EGREP_HEADER} |
| @var{pattern}, after being expanded as if in a double-quoted shell string, |
| is an extended regular expression. |
| If the output of running the preprocessor on the system header file |
| @var{header-file} contains a line matching |
| @var{pattern}, execute shell commands @var{action-if-found}, otherwise |
| execute @var{action-if-not-found}. |
| |
| See below for some problems involving this macro. |
| @end defmac |
| |
| @anchor{AC_EGREP_CPP} |
| @defmac AC_EGREP_CPP (@var{pattern}, @var{program}, @ |
| @ovar{action-if-found}, @ovar{action-if-not-found}) |
| @acindex{EGREP_CPP} |
| @var{pattern}, after being expanded as if in a double-quoted shell string, |
| is an extended regular expression. |
| @var{program} is the text of a C or C++ program, which is expanded as an |
| unquoted here-document (@pxref{Here-Documents}). If the |
| output of running the preprocessor on @var{program} contains a line |
| matching @var{pattern}, execute shell commands |
| @var{action-if-found}, otherwise execute @var{action-if-not-found}. |
| |
| See below for some problems involving this macro. |
| @end defmac |
| |
| @code{AC_EGREP_CPP} and @code{AC_EGREP_HEADER} should be used with care, |
| as preprocessors can insert line breaks between output tokens. For |
| example, the preprocessor might transform this: |
| |
| @example |
| #define MAJOR 2 |
| #define MINOR 23 |
| Version MAJOR . MINOR |
| @end example |
| |
| @noindent |
| into this: |
| |
| @example |
| Version |
| 2 |
| . |
| 23 |
| @end example |
| |
| @noindent |
| Because preprocessors are allowed to insert white space, change escapes |
| in string constants, insert backlash-newline pairs, or do any of a number |
| of things that do not change the meaning of the preprocessed program, it |
| is better to rely on @code{AC_PREPROC_IFELSE} than to resort to |
| @code{AC_EGREP_CPP} or @code{AC_EGREP_HEADER}. |
| |
| For more information about what can appear in portable extended regular |
| expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}. |
| |
| @node Running the Compiler |
| @section Running the Compiler |
| |
| To check for a syntax feature of the current language's (@pxref{Language |
| Choice}) compiler, such as whether it recognizes a certain keyword, or |
| simply to try some library feature, use @code{AC_COMPILE_IFELSE} to try |
| to compile a small program that uses that feature. |
| |
| @defmac AC_COMPILE_IFELSE (@var{input}, @ovar{action-if-true}, @ |
| @ovar{action-if-false}) |
| @acindex{COMPILE_IFELSE} |
| Run the compiler and compilation flags of the current language |
| (@pxref{Language Choice}) on the @var{input}, run the shell commands |
| @var{action-if-true} on success, @var{action-if-false} otherwise. |
| |
| If @var{input} is nonempty use the equivalent of |
| @code{AC_LANG_CONFTEST(@var{input})} to generate the current test source |
| file; otherwise reuse the already-existing test source file. |
| The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends. |
| The @var{input} text is expanded as an unquoted here-document, so |
| @samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped. |
| @xref{Here-Documents}. |
| |
| It is customary to report unexpected failures with |
| @code{AC_MSG_FAILURE}. This macro does not try to link; use |
| @code{AC_LINK_IFELSE} if you need to do that (@pxref{Running the |
| Linker}). If needed, @var{action-if-true} can further access the |
| just-compiled object file @file{conftest.$OBJEXT}. |
| |
| This macro uses @code{AC_REQUIRE} for the compiler associated with the |
| current language, which means that if the compiler has not yet been |
| determined, the compiler determination will be made prior to the body of |
| the outermost @code{AC_DEFUN} macro that triggered this macro to |
| expand (@pxref{Expanded Before Required}). |
| @end defmac |
| |
| @ovindex ERL |
| For tests in Erlang, the @var{input} must be the source code of a module named |
| @code{conftest}. @code{AC_COMPILE_IFELSE} generates a @file{conftest.beam} |
| file that can be interpreted by the Erlang virtual machine (@code{ERL}). It is |
| recommended to use @code{AC_LANG_PROGRAM} to specify the test program, |
| to ensure that the Erlang module has the right name. |
| |
| @node Running the Linker |
| @section Running the Linker |
| |
| To check for a library, a function, or a global variable, Autoconf |
| @command{configure} scripts try to compile and link a small program that |
| uses it. This is unlike Metaconfig, which by default uses @code{nm} or |
| @code{ar} on the C library to try to figure out which functions are |
| available. Trying to link with the function is usually a more reliable |
| approach because it avoids dealing with the variations in the options |
| and output formats of @code{nm} and @code{ar} and in the location of the |
| standard libraries. It also allows configuring for cross-compilation or |
| checking a function's runtime behavior if needed. On the other hand, |
| it can be slower than scanning the libraries once, but accuracy is more |
| important than speed. |
| |
| @code{AC_LINK_IFELSE} is used to compile test programs to test for |
| functions and global variables. It is also used by @code{AC_CHECK_LIB} |
| to check for libraries (@pxref{Libraries}), by adding the library being |
| checked for to @code{LIBS} temporarily and trying to link a small |
| program. |
| |
| @anchor{AC_LINK_IFELSE} |
| @defmac AC_LINK_IFELSE (@var{input}, @ovar{action-if-true}, @ |
| @ovar{action-if-false}) |
| @acindex{LINK_IFELSE} |
| Run the compiler (and compilation flags) and the linker of the current |
| language (@pxref{Language Choice}) on the @var{input}, run the shell |
| commands @var{action-if-true} on success, @var{action-if-false} |
| otherwise. If needed, @var{action-if-true} can further access the |
| just-linked program file @file{conftest$EXEEXT}. |
| |
| If @var{input} is nonempty use the equivalent of |
| @code{AC_LANG_CONFTEST(@var{input})} to generate the current test source |
| file; otherwise reuse the already-existing test source file. |
| The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends. |
| The @var{input} text is expanded as an unquoted here-document, so |
| @samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped. |
| @xref{Here-Documents}. |
| |
| @code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the |
| current compilation flags. |
| |
| It is customary to report unexpected failures with |
| @code{AC_MSG_FAILURE}. This macro does not try to execute the program; |
| use @code{AC_RUN_IFELSE} if you need to do that (@pxref{Runtime}). |
| @end defmac |
| |
| The @code{AC_LINK_IFELSE} macro cannot be used for Erlang tests, since Erlang |
| programs are interpreted and do not require linking. |
| |
| |
| |
| @node Runtime |
| @section Checking Runtime Behavior |
| |
| Sometimes you need to find out how a system performs at runtime, such |
| as whether a given function has a certain capability or bug. If you |
| can, make such checks when your program runs instead of when it is |
| configured. You can check for things like the machine's endianness when |
| your program initializes itself. |
| |
| If you really need to test for a runtime behavior while configuring, |
| you can write a test program to determine the result, and compile and |
| run it using @code{AC_RUN_IFELSE}. Avoid running test programs if |
| possible, because this prevents people from configuring your package for |
| cross-compiling. |
| |
| @anchor{AC_RUN_IFELSE} |
| @defmac AC_RUN_IFELSE (@var{input}, @ovar{action-if-true}, @ |
| @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE}) |
| @acindex{RUN_IFELSE} |
| Run the compiler (and compilation flags) and the linker of the current |
| language (@pxref{Language Choice}) on the @var{input}, then execute the |
| resulting program. If the program returns an exit |
| status of 0 when executed, run shell commands @var{action-if-true}. |
| Otherwise, run shell commands @var{action-if-false}. |
| |
| If @var{input} is nonempty use the equivalent of |
| @code{AC_LANG_CONFTEST(@var{input})} to generate the current test source |
| file; otherwise reuse the already-existing test source file. |
| The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends. |
| The @var{input} text is expanded as an unquoted here-document, so |
| @samp{$}, @samp{`} and some @samp{\}s should be backslash-escaped. |
| @xref{Here-Documents}. |
| |
| @code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the |
| compilation flags of the current language (@pxref{Language Choice}). |
| Additionally, @var{action-if-true} can run @command{./conftest$EXEEXT} |
| for further testing. |
| |
| In the @var{action-if-false} section, the failing exit status is |
| available in the shell variable @samp{$?}. This exit status might be |
| that of a failed compilation, or it might be that of a failed program |
| execution. |
| |
| If cross-compilation mode is enabled (this is the case if either the |
| compiler being used does not produce executables that run on the system |
| where @command{configure} is being run, or if the options @code{--build} |
| and @code{--host} were both specified and their values are different), |
| then the test program is |
| not run. If the optional shell commands @var{action-if-cross-compiling} |
| are given, those commands are run instead; typically these commands |
| provide pessimistic defaults that allow cross-compilation to work even |
| if the guess was wrong. If the fourth argument is empty or omitted, but |
| cross-compilation is detected, then @command{configure} prints an error |
| message and exits. If you want your package to be useful in a |
| cross-compilation scenario, you @emph{should} provide a non-empty |
| @var{action-if-cross-compiling} clause, as well as wrap the |
| @code{AC_RUN_IFELSE} compilation inside an @code{AC_CACHE_CHECK} |
| (@pxref{Caching Results}) which allows the user to override the |
| pessimistic default if needed. |
| |
| It is customary to report unexpected failures with |
| @code{AC_MSG_FAILURE}. |
| @end defmac |
| |
| @command{autoconf} prints a warning message when creating |
| @command{configure} each time it encounters a call to |
| @code{AC_RUN_IFELSE} with no @var{action-if-cross-compiling} argument |
| given. If you are not concerned about users configuring your package |
| for cross-compilation, you may ignore the warning. A few of the macros |
| distributed with Autoconf produce this warning message; but if this is a |
| problem for you, please report it as a bug, along with an appropriate |
| pessimistic guess to use instead. |
| |
| To configure for cross-compiling you can also choose a value for those |
| parameters based on the canonical system name (@pxref{Manual |
| Configuration}). Alternatively, set up a test results cache file with |
| the correct values for the host system (@pxref{Caching Results}). |
| |
| @ovindex cross_compiling |
| To provide a default for calls of @code{AC_RUN_IFELSE} that are embedded |
| in other macros, including a few of the ones that come with Autoconf, |
| you can test whether the shell variable @code{cross_compiling} is set to |
| @samp{yes}, and then use an alternate method to get the results instead |
| of calling the macros. |
| |
| It is also permissible to temporarily assign to @code{cross_compiling} |
| in order to force tests to behave as though they are in a |
| cross-compilation environment, particularly since this provides a way to |
| test your @var{action-if-cross-compiling} even when you are not using a |
| cross-compiler. |
| |
| @example |
| # We temporarily set cross-compile mode to force AC_COMPUTE_INT |
| # to use the slow link-only method |
| save_cross_compiling=$cross_compiling |
| cross_compiling=yes |
| AC_COMPUTE_INT([@dots{}]) |
| cross_compiling=$save_cross_compiling |
| @end example |
| |
| A C or C++ runtime test should be portable. |
| @xref{Portable C and C++}. |
| |
| Erlang tests must exit themselves the Erlang VM by calling the @code{halt/1} |
| function: the given status code is used to determine the success of the test |
| (status is @code{0}) or its failure (status is different than @code{0}), as |
| explained above. It must be noted that data output through the standard output |
| (e.g., using @code{io:format/2}) may be truncated when halting the VM. |
| Therefore, if a test must output configuration information, it is recommended |
| to create and to output data into the temporary file named @file{conftest.out}, |
| using the functions of module @code{file}. The @code{conftest.out} file is |
| automatically deleted by the @code{AC_RUN_IFELSE} macro. For instance, a |
| simplified implementation of Autoconf's @code{AC_ERLANG_SUBST_LIB_DIR} |
| macro is: |
| |
| @example |
| AC_INIT([LibdirTest], [1.0], [bug-libdirtest@@example.org]) |
| AC_ERLANG_NEED_ERL |
| AC_LANG(Erlang) |
| AC_RUN_IFELSE( |
| [AC_LANG_PROGRAM([], [dnl |
| file:write_file("conftest.out", code:lib_dir()), |
| halt(0)])], |
| [AS_ECHO(["code:lib_dir() returned: `cat conftest.out`"])], |
| [AC_MSG_FAILURE([test Erlang program execution failed])]) |
| @end example |
| |
| |
| @node Multiple Cases |
| @section Multiple Cases |
| |
| Some operations are accomplished in several possible ways, depending on |
| the OS variant. Checking for them essentially requires a ``case |
| statement''. Autoconf does not directly provide one; however, it is |
| easy to simulate by using a shell variable to keep track of whether a |
| way to perform the operation has been found yet. |
| |
| Here is an example that uses the shell variable @code{fstype} to keep |
| track of whether the remaining cases need to be checked. Note that |
| since the value of @code{fstype} is under our control, we don't have to |
| use the longer @samp{test "x$fstype" = xno}. |
| |
| @example |
| @group |
| AC_MSG_CHECKING([how to get file system type]) |
| fstype=no |
| # The order of these tests is important. |
| AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h> |
| #include <sys/fstyp.h> |
| ]])], |
| [AC_DEFINE([FSTYPE_STATVFS], [1], |
| [Define if statvfs exists.]) |
| fstype=SVR4]) |
| AS_IF([test $fstype = no], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h> |
| #include <sys/fstyp.h> |
| ]])], |
| [AC_DEFINE([FSTYPE_USG_STATFS], [1], |
| [Define if USG statfs.]) |
| fstype=SVR3])]) |
| AS_IF([test $fstype = no], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h> |
| #include <sys/vmount.h> |
| ]])], |
| [AC_DEFINE([FSTYPE_AIX_STATFS], [1], |
| [Define if AIX statfs.]) |
| fstype=AIX])]) |
| # (more cases omitted here) |
| AC_MSG_RESULT([$fstype]) |
| @end group |
| @end example |
| |
| @c ====================================================== Results of Tests. |
| |
| @node Results |
| @chapter Results of Tests |
| |
| Once @command{configure} has determined whether a feature exists, what can |
| it do to record that information? There are four sorts of things it can |
| do: define a C preprocessor symbol, set a variable in the output files, |
| save the result in a cache file for future @command{configure} runs, and |
| print a message letting the user know the result of the test. |
| |
| @menu |
| * Defining Symbols:: Defining C preprocessor symbols |
| * Setting Output Variables:: Replacing variables in output files |
| * Special Chars in Variables:: Characters to beware of in variables |
| * Caching Results:: Speeding up subsequent @command{configure} runs |
| * Printing Messages:: Notifying @command{configure} users |
| @end menu |
| |
| @node Defining Symbols |
| @section Defining C Preprocessor Symbols |
| |
| A common action to take in response to a feature test is to define a C |
| preprocessor symbol indicating the results of the test. That is done by |
| calling @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}. |
| |
| By default, @code{AC_OUTPUT} places the symbols defined by these macros |
| into the output variable @code{DEFS}, which contains an option |
| @option{-D@var{symbol}=@var{value}} for each symbol defined. Unlike in |
| Autoconf version 1, there is no variable @code{DEFS} defined while |
| @command{configure} is running. To check whether Autoconf macros have |
| already defined a certain C preprocessor symbol, test the value of the |
| appropriate cache variable, as in this example: |
| |
| @example |
| AC_CHECK_FUNC([vprintf], |
| [AC_DEFINE([HAVE_VPRINTF], [1], |
| [Define if vprintf exists.])]) |
| AS_IF([test "x$ac_cv_func_vprintf" != xyes], |
| [AC_CHECK_FUNC([_doprnt], |
| [AC_DEFINE([HAVE_DOPRNT], [1], |
| [Define if _doprnt exists.])])]) |
| @end example |
| |
| If @code{AC_CONFIG_HEADERS} has been called, then instead of creating |
| @code{DEFS}, @code{AC_OUTPUT} creates a header file by substituting the |
| correct values into @code{#define} statements in a template file. |
| @xref{Configuration Headers}, for more information about this kind of |
| output. |
| |
| @defmac AC_DEFINE (@var{variable}, @var{value}, @ovar{description}) |
| @defmacx AC_DEFINE (@var{variable}) |
| @cvindex @var{variable} |
| @acindex{DEFINE} |
| Define @var{variable} to @var{value} (verbatim), by defining a C |
| preprocessor macro for @var{variable}. @var{variable} should be a C |
| identifier, optionally suffixed by a parenthesized argument list to |
| define a C preprocessor macro with arguments. The macro argument list, |
| if present, should be a comma-separated list of C identifiers, possibly |
| terminated by an ellipsis @samp{...} if C99-or-later syntax is employed. |
| @var{variable} should not contain comments, white space, trigraphs, |
| backslash-newlines, universal character names, or non-ASCII |
| characters. |
| |
| @var{value} may contain backslash-escaped newlines, which will be |
| preserved if you use @code{AC_CONFIG_HEADERS} but flattened if passed |
| via @code{@@DEFS@@} (with no effect on the compilation, since the |
| preprocessor sees only one line in the first place). @var{value} should |
| not contain raw newlines. If you are not using |
| @code{AC_CONFIG_HEADERS}, @var{value} should not contain any @samp{#} |
| characters, as @command{make} tends to eat them. To use a shell |
| variable, use @code{AC_DEFINE_UNQUOTED} instead. |
| |
| @var{description} is only useful if you are using |
| @code{AC_CONFIG_HEADERS}. In this case, @var{description} is put into |
| the generated @file{config.h.in} as the comment before the macro define. |
| The following example defines the C preprocessor variable |
| @code{EQUATION} to be the string constant @samp{"$a > $b"}: |
| |
| @example |
| AC_DEFINE([EQUATION], ["$a > $b"], |
| [Equation string.]) |
| @end example |
| |
| If neither @var{value} nor @var{description} are given, then |
| @var{value} defaults to 1 instead of to the empty string. This is for |
| backwards compatibility with older versions of Autoconf, but this usage |
| is obsolescent and may be withdrawn in future versions of Autoconf. |
| |
| If the @var{variable} is a literal string, it is passed to |
| @code{m4_pattern_allow} (@pxref{Forbidden Patterns}). |
| |
| If multiple @code{AC_DEFINE} statements are executed for the same |
| @var{variable} name (not counting any parenthesized argument list), |
| the last one wins. |
| @end defmac |
| |
| @defmac AC_DEFINE_UNQUOTED (@var{variable}, @var{value}, @ovar{description}) |
| @defmacx AC_DEFINE_UNQUOTED (@var{variable}) |
| @acindex{DEFINE_UNQUOTED} |
| @cvindex @var{variable} |
| Like @code{AC_DEFINE}, but three shell expansions are |
| performed---once---on @var{variable} and @var{value}: variable expansion |
| (@samp{$}), command substitution (@samp{`}), and backslash escaping |
| (@samp{\}), as if in an unquoted here-document. Single and double quote |
| characters in the value have no |
| special meaning. Use this macro instead of @code{AC_DEFINE} when |
| @var{variable} or @var{value} is a shell variable. Examples: |
| |
| @example |
| AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"], |
| [Configuration machine file.]) |
| AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups], |
| [getgroups return type.]) |
| AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1], |
| [Translated header name.]) |
| @end example |
| @end defmac |
| |
| Due to a syntactical oddity of the Bourne shell, do not use |
| semicolons to separate @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED} |
| calls from other macro calls or shell code; that can cause syntax errors |
| in the resulting @command{configure} script. Use either blanks or |
| newlines. That is, do this: |
| |
| @example |
| AC_CHECK_HEADER([elf.h], |
| [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"]) |
| @end example |
| |
| @noindent |
| or this: |
| |
| @example |
| AC_CHECK_HEADER([elf.h], |
| [AC_DEFINE([SVR4], [1], [System V Release 4]) |
| LIBS="-lelf $LIBS"]) |
| @end example |
| |
| @noindent |
| instead of this: |
| |
| @example |
| AC_CHECK_HEADER([elf.h], |
| [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"]) |
| @end example |
| |
| @node Setting Output Variables |
| @section Setting Output Variables |
| @cindex Output variables |
| |
| Another way to record the results of tests is to set @dfn{output |
| variables}, which are shell variables whose values are substituted into |
| files that @command{configure} outputs. The two macros below create new |
| output variables. @xref{Preset Output Variables}, for a list of output |
| variables that are always available. |
| |
| @defmac AC_SUBST (@var{variable}, @ovar{value}) |
| @acindex{SUBST} |
| Create an output variable from a shell variable. Make @code{AC_OUTPUT} |
| substitute the variable @var{variable} into output files (typically one |
| or more makefiles). This means that @code{AC_OUTPUT} |
| replaces instances of @samp{@@@var{variable}@@} in input files with the |
| value that the shell variable @var{variable} has when @code{AC_OUTPUT} |
| is called. The value can contain any non-@code{NUL} character, including |
| newline. If you are using Automake 1.11 or newer, for newlines in values |
| you might want to consider using @code{AM_SUBST_NOTMAKE} to prevent |
| @command{automake} from adding a line @code{@var{variable} = |
| @@@var{variable}@@} to the @file{Makefile.in} files (@pxref{Optional, , |
| Automake, automake, Other things Automake recognizes}). |
| |
| Variable occurrences should not overlap: e.g., an input file should |
| not contain @samp{@@@var{var1}@@@var{var2}@@} if @var{var1} and @var{var2} |
| are variable names. |
| The substituted value is not rescanned for more output variables; |
| occurrences of @samp{@@@var{variable}@@} in the value are inserted |
| literally into the output file. (The algorithm uses the special marker |
| @code{|#_!!_#|} internally, so neither the substituted value nor the |
| output file may contain @code{|#_!!_#|}.) |
| |
| If @var{value} is given, in addition assign it to @var{variable}. |
| |
| The string @var{variable} is passed to @code{m4_pattern_allow} |
| (@pxref{Forbidden Patterns}). @var{variable} is not further expanded, |
| even if there is another macro by the same name. |
| @end defmac |
| |
| @defmac AC_SUBST_FILE (@var{variable}) |
| @acindex{SUBST_FILE} |
| Another way to create an output variable from a shell variable. Make |
| @code{AC_OUTPUT} insert (without substitutions) the contents of the file |
| named by shell variable @var{variable} into output files. This means |
| that @code{AC_OUTPUT} replaces instances of |
| @samp{@@@var{variable}@@} in output files (such as @file{Makefile.in}) |
| with the contents of the file that the shell variable @var{variable} |
| names when @code{AC_OUTPUT} is called. Set the variable to |
| @file{/dev/null} for cases that do not have a file to insert. |
| This substitution occurs only when the @samp{@@@var{variable}@@} is on a |
| line by itself, optionally surrounded by spaces and tabs. The |
| substitution replaces the whole line, including the spaces, tabs, and |
| the terminating newline. |
| |
| This macro is useful for inserting makefile fragments containing |
| special dependencies or other @command{make} directives for particular host |
| or target types into makefiles. For example, @file{configure.ac} |
| could contain: |
| |
| @example |
| AC_SUBST_FILE([host_frag]) |
| host_frag=$srcdir/conf/sun4.mh |
| @end example |
| |
| @noindent |
| and then a @file{Makefile.in} could contain: |
| |
| @example |
| @@host_frag@@ |
| @end example |
| |
| The string @var{variable} is passed to @code{m4_pattern_allow} |
| (@pxref{Forbidden Patterns}). |
| @end defmac |
| |
| @cindex Precious Variable |
| @cindex Variable, Precious |
| Running @command{configure} in varying environments can be extremely |
| dangerous. If for instance the user runs @samp{CC=bizarre-cc |
| ./configure}, then the cache, @file{config.h}, and many other output |
| files depend upon @command{bizarre-cc} being the C compiler. If |
| for some reason the user runs @command{./configure} again, or if it is |
| run via @samp{./config.status --recheck}, (@xref{Automatic Remaking}, |
| and @pxref{config.status Invocation}), then the configuration can be |
| inconsistent, composed of results depending upon two different |
| compilers. |
| |
| Environment variables that affect this situation, such as @samp{CC} |
| above, are called @dfn{precious variables}, and can be declared as such |
| by @code{AC_ARG_VAR}. |
| |
| @defmac AC_ARG_VAR (@var{variable}, @var{description}) |
| @acindex{ARG_VAR} |
| Declare @var{variable} is a precious variable, and include its |
| @var{description} in the variable section of @samp{./configure --help}. |
| |
| Being precious means that |
| @itemize @minus |
| @item |
| @var{variable} is substituted via @code{AC_SUBST}. |
| |
| @item |
| The value of @var{variable} when @command{configure} was launched is |
| saved in the cache, including if it was not specified on the command |
| line but via the environment. Indeed, while @command{configure} can |
| notice the definition of @code{CC} in @samp{./configure CC=bizarre-cc}, |
| it is impossible to notice it in @samp{CC=bizarre-cc ./configure}, |
| which, unfortunately, is what most users do. |
| |
| We emphasize that it is the @emph{initial} value of @var{variable} which |
| is saved, not that found during the execution of @command{configure}. |
| Indeed, specifying @samp{./configure FOO=foo} and letting |
| @samp{./configure} guess that @code{FOO} is @code{foo} can be two |
| different things. |
| |
| @item |
| @var{variable} is checked for consistency between two |
| @command{configure} runs. For instance: |
| |
| @example |
| $ @kbd{./configure --silent --config-cache} |
| $ @kbd{CC=cc ./configure --silent --config-cache} |
| configure: error: 'CC' was not set in the previous run |
| configure: error: changes in the environment can compromise \ |
| the build |
| configure: error: run 'make distclean' and/or \ |
| 'rm config.cache' and start over |
| @end example |
| |
| @noindent |
| and similarly if the variable is unset, or if its content is changed. |
| If the content has white space changes only, then the error is degraded |
| to a warning only, but the old value is reused. |
| |
| @item |
| @var{variable} is kept during automatic reconfiguration |
| (@pxref{config.status Invocation}) as if it had been passed as a command |
| line argument, including when no cache is used: |
| |
| @example |
| $ @kbd{CC=/usr/bin/cc ./configure var=raboof --silent} |
| $ @kbd{./config.status --recheck} |
| running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \ |
| CC=/usr/bin/cc --no-create --no-recursion |
| @end example |
| @end itemize |
| @end defmac |
| |
| @node Special Chars in Variables |
| @section Special Characters in Output Variables |
| @cindex Output variables, special characters in |
| |
| Many output variables are intended to be evaluated both by |
| @command{make} and by the shell. Some characters are expanded |
| differently in these two contexts, so to avoid confusion these |
| variables' values should not contain any of the following characters: |
| |
| @example |
| " # $ & ' ( ) * ; < > ? [ \ ^ ` | |
| @end example |
| |
| Also, these variables' values should neither contain newlines, nor start |
| with @samp{~}, nor contain white space or @samp{:} immediately followed |
| by @samp{~}. The values can contain nonempty sequences of white space |
| characters like tabs and spaces, but each such sequence might |
| arbitrarily be replaced by a single space during substitution. |
| |
| These restrictions apply both to the values that @command{configure} |
| computes, and to the values set directly by the user. For example, the |
| following invocations of @command{configure} are problematic, since they |
| attempt to use special characters within @code{CPPFLAGS} and white space |
| within @code{$(srcdir)}: |
| |
| @example |
| CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure' |
| |
| '../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"' |
| @end example |
| |
| @node Caching Results |
| @section Caching Results |
| @cindex Cache |
| |
| To avoid checking for the same features repeatedly in various |
| @command{configure} scripts (or in repeated runs of one script), |
| @command{configure} can optionally save the results of many checks in a |
| @dfn{cache file} (@pxref{Cache Files}). If a @command{configure} script |
| runs with caching enabled and finds a cache file, it reads the results |
| of previous runs from the cache and avoids rerunning those checks. As a |
| result, @command{configure} can then run much faster than if it had to |
| perform all of the checks every time. |
| |
| @defmac AC_CACHE_VAL (@var{cache-id}, @var{commands-to-set-it}) |
| @acindex{CACHE_VAL} |
| Ensure that the results of the check identified by @var{cache-id} are |
| available. If the results of the check were in the cache file that was |
| read, and @command{configure} was not given the @option{--quiet} or |
| @option{--silent} option, print a message saying that the result was |
| cached; otherwise, run the shell commands @var{commands-to-set-it}. If |
| the shell commands are run to determine the value, the value is |
| saved in the cache file just before @command{configure} creates its output |
| files. @xref{Cache Variable Names}, for how to choose the name of the |
| @var{cache-id} variable. |
| |
| The @var{commands-to-set-it} @emph{must have no side effects} except for |
| setting the variable @var{cache-id}, see below. |
| @end defmac |
| |
| @defmac AC_CACHE_CHECK (@var{message}, @var{cache-id}, @ |
| @var{commands-to-set-it}) |
| @acindex{CACHE_CHECK} |
| A wrapper for @code{AC_CACHE_VAL} that takes care of printing the |
| messages. This macro provides a convenient shorthand for the most |
| common way to use these macros. It calls @code{AC_MSG_CHECKING} for |
| @var{message}, then @code{AC_CACHE_VAL} with the @var{cache-id} and |
| @var{commands} arguments, and @code{AC_MSG_RESULT} with @var{cache-id}. |
| |
| The @var{commands-to-set-it} @emph{must have no side effects} except for |
| setting the variable @var{cache-id}, see below. |
| @end defmac |
| |
| It is common to find buggy macros using @code{AC_CACHE_VAL} or |
| @code{AC_CACHE_CHECK}, because people are tempted to call |
| @code{AC_DEFINE} in the @var{commands-to-set-it}. Instead, the code that |
| @emph{follows} the call to @code{AC_CACHE_VAL} should call |
| @code{AC_DEFINE}, by examining the value of the cache variable. For |
| instance, the following macro is broken: |
| |
| @example |
| @c If you change this example, adjust tests/base.at:AC_CACHE_CHECK. |
| @group |
| AC_DEFUN([AC_SHELL_TRUE], |
| [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works], |
| [my_cv_shell_true_works=no |
| (true) 2>/dev/null && my_cv_shell_true_works=yes |
| if test "x$my_cv_shell_true_works" = xyes; then |
| AC_DEFINE([TRUE_WORKS], [1], |
| [Define if 'true(1)' works properly.]) |
| fi]) |
| ]) |
| @end group |
| @end example |
| |
| @noindent |
| This fails if the cache is enabled: the second time this macro is run, |
| @code{TRUE_WORKS} @emph{will not be defined}. The proper implementation |
| is: |
| |
| @example |
| @c If you change this example, adjust tests/base.at:AC_CACHE_CHECK. |
| @group |
| AC_DEFUN([AC_SHELL_TRUE], |
| [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works], |
| [my_cv_shell_true_works=no |
| (true) 2>/dev/null && my_cv_shell_true_works=yes]) |
| if test "x$my_cv_shell_true_works" = xyes; then |
| AC_DEFINE([TRUE_WORKS], [1], |
| [Define if 'true(1)' works properly.]) |
| fi |
| ]) |
| @end group |
| @end example |
| |
| Also, @var{commands-to-set-it} should not print any messages, for |
| example with @code{AC_MSG_CHECKING}; do that before calling |
| @code{AC_CACHE_VAL}, so the messages are printed regardless of whether |
| the results of the check are retrieved from the cache or determined by |
| running the shell commands. |
| |
| @menu |
| * Cache Variable Names:: Shell variables used in caches |
| * Cache Files:: Files @command{configure} uses for caching |
| * Cache Checkpointing:: Loading and saving the cache file |
| @end menu |
| |
| @node Cache Variable Names |
| @subsection Cache Variable Names |
| @cindex Cache variable |
| |
| The names of cache variables should have the following format: |
| |
| @example |
| @var{package-prefix}_cv_@var{value-type}_@var{specific-value}_@ovar{additional-options} |
| @end example |
| |
| @noindent |
| for example, @samp{ac_cv_header_stat_broken} or |
| @samp{ac_cv_prog_gcc_traditional}. The parts of the variable name are: |
| |
| @table @asis |
| @item @var{package-prefix} |
| An abbreviation for your package or organization; the same prefix you |
| begin local Autoconf macros with, except lowercase by convention. |
| For cache values used by the distributed Autoconf macros, this value is |
| @samp{ac}. |
| |
| @item @code{_cv_} |
| Indicates that this shell variable is a cache value. This string |
| @emph{must} be present in the variable name, including the leading |
| underscore. |
| |
| @item @var{value-type} |
| A convention for classifying cache values, to produce a rational naming |
| system. The values used in Autoconf are listed in @ref{Macro Names}. |
| |
| @item @var{specific-value} |
| Which member of the class of cache values this test applies to. |
| For example, which function (@samp{alloca}), program (@samp{gcc}), or |
| output variable (@samp{INSTALL}). |
| |
| @item @var{additional-options} |
| Any particular behavior of the specific member that this test applies to. |
| For example, @samp{broken} or @samp{set}. This part of the name may |
| be omitted if it does not apply. |
| @end table |
| |
| The values assigned to cache variables may not contain newlines. |
| Usually, their values are Boolean (@samp{yes} or @samp{no}) or the |
| names of files or functions; so this is not an important restriction. |
| @ref{Cache Variable Index} for an index of cache variables with |
| documented semantics. |
| |
| |
| @node Cache Files |
| @subsection Cache Files |
| |
| A cache file is a shell script that caches the results of configure |
| tests run on one system so they can be shared between configure scripts |
| and configure runs. It is not useful on other systems. If its contents |
| are invalid for some reason, the user may delete or edit it, or override |
| documented cache variables on the @command{configure} command line. |
| |
| By default, @command{configure} uses no cache file, |
| to avoid problems caused by accidental |
| use of stale cache files. |
| |
| To enable caching, @command{configure} accepts @option{--config-cache} (or |
| @option{-C}) to cache results in the file @file{config.cache}. |
| Alternatively, @option{--cache-file=@var{file}} specifies that |
| @var{file} be the cache file. The cache file is created if it does not |
| exist already. When @command{configure} calls @command{configure} scripts in |
| subdirectories, it uses the @option{--cache-file} argument so that they |
| share the same cache. @xref{Subdirectories}, for information on |
| configuring subdirectories with the @code{AC_CONFIG_SUBDIRS} macro. |
| |
| @file{config.status} only pays attention to the cache file if it is |
| given the @option{--recheck} option, which makes it rerun |
| @command{configure}. |
| |
| It is wrong to try to distribute cache files for particular system types. |
| There is too much room for error in doing that, and too much |
| administrative overhead in maintaining them. For any features that |
| can't be guessed automatically, use the standard method of the canonical |
| system type and linking files (@pxref{Manual Configuration}). |
| |
| The site initialization script can specify a site-wide cache file to |
| use, instead of the usual per-program cache. In this case, the cache |
| file gradually accumulates information whenever someone runs a new |
| @command{configure} script. (Running @command{configure} merges the new cache |
| results with the existing cache file.) This may cause problems, |
| however, if the system configuration (e.g., the installed libraries or |
| compilers) changes and the stale cache file is not deleted. |
| |
| If @command{configure} is interrupted at the right time when it updates |
| a cache file outside of the build directory where the @command{configure} |
| script is run, it may leave behind a temporary file named after the |
| cache file with digits following it. You may safely delete such a file. |
| |
| |
| @node Cache Checkpointing |
| @subsection Cache Checkpointing |
| |
| If your configure script, or a macro called from @file{configure.ac}, happens |
| to abort the configure process, it may be useful to checkpoint the cache |
| a few times at key points using @code{AC_CACHE_SAVE}. Doing so |
| reduces the amount of time it takes to rerun the configure script with |
| (hopefully) the error that caused the previous abort corrected. |
| |
| @c FIXME: Do we really want to document this guy? |
| @defmac AC_CACHE_LOAD |
| @acindex{CACHE_LOAD} |
| Loads values from existing cache file, or creates a new cache file if a |
| cache file is not found. Called automatically from @code{AC_INIT}. |
| @end defmac |
| |
| @defmac AC_CACHE_SAVE |
| @acindex{CACHE_SAVE} |
| Flushes all cached values to the cache file. Called automatically from |
| @code{AC_OUTPUT}, but it can be quite useful to call |
| @code{AC_CACHE_SAVE} at key points in @file{configure.ac}. |
| @end defmac |
| |
| For instance: |
| |
| @example |
| @r{ @dots{} AC_INIT, etc. @dots{}} |
| @group |
| # Checks for programs. |
| AC_PROG_CC |
| AC_PROG_AWK |
| @r{ @dots{} more program checks @dots{}} |
| AC_CACHE_SAVE |
| @end group |
| |
| @group |
| # Checks for libraries. |
| AC_CHECK_LIB([nsl], [gethostbyname]) |
| AC_CHECK_LIB([socket], [connect]) |
| @r{ @dots{} more lib checks @dots{}} |
| AC_CACHE_SAVE |
| @end group |
| |
| @group |
| # Might abort@dots{} |
| AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])]) |
| AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])]) |
| @end group |
| @r{ @dots{} AC_OUTPUT, etc. @dots{}} |
| @end example |
| |
| @node Printing Messages |
| @section Printing Messages |
| @cindex Messages, from @command{configure} |
| |
| @command{configure} scripts need to give users running them several kinds |
| of information. The following macros print messages in ways appropriate |
| for each kind. The arguments to all of them get enclosed in shell |
| double quotes, so the shell performs variable and back-quote |
| substitution on them. |
| |
| These macros are all wrappers around the @command{printf} shell command. |
| They direct output to the appropriate file descriptor (@pxref{File |
| Descriptor Macros}). |
| @command{configure} scripts should rarely need to run @command{printf} directly |
| to print messages for the user. Using these macros makes it easy to |
| change how and when each kind of message is printed; such changes need |
| only be made to the macro definitions and all the callers change |
| automatically. |
| |
| To diagnose static issues, i.e., when @command{autoconf} is run, see |
| @ref{Diagnostic Macros}. |
| |
| @defmac AC_MSG_CHECKING (@var{feature-description}) |
| @acindex{MSG_CHECKING} |
| Notify the user that @command{configure} is checking for a particular |
| feature. This macro prints a message that starts with @samp{checking } |
| and ends with @samp{...} and no newline. It must be followed by a call |
| to @code{AC_MSG_RESULT} to print the result of the check and the |
| newline. The @var{feature-description} should be something like |
| @samp{whether the Fortran compiler accepts C++ comments} or @samp{for |
| _Alignof}. |
| |
| This macro prints nothing if @command{configure} is run with the |
| @option{--quiet} or @option{--silent} option. |
| @end defmac |
| |
| @anchor{AC_MSG_RESULT} |
| @defmac AC_MSG_RESULT (@var{result-description}) |
| @acindex{MSG_RESULT} |
| Notify the user of the results of a check. @var{result-description} is |
| almost always the value of the cache variable for the check, typically |
| @samp{yes}, @samp{no}, or a file name. This macro should follow a call |
| to @code{AC_MSG_CHECKING}, and the @var{result-description} should be |
| the completion of the message printed by the call to |
| @code{AC_MSG_CHECKING}. |
| |
| This macro prints nothing if @command{configure} is run with the |
| @option{--quiet} or @option{--silent} option. |
| @end defmac |
| |
| @anchor{AC_MSG_NOTICE} |
| @defmac AC_MSG_NOTICE (@var{message}) |
| @acindex{MSG_NOTICE} |
| Deliver the @var{message} to the user. It is useful mainly to print a |
| general description of the overall purpose of a group of feature checks, |
| e.g., |
| |
| @example |
| AC_MSG_NOTICE([checking if stack overflow is detectable]) |
| @end example |
| |
| This macro prints nothing if @command{configure} is run with the |
| @option{--quiet} or @option{--silent} option. |
| @end defmac |
| |
| @anchor{AC_MSG_ERROR} |
| @defmac AC_MSG_ERROR (@var{error-description}, @dvar{exit-status, $?/1}) |
| @acindex{MSG_ERROR} |
| Notify the user of an error that prevents @command{configure} from |
| completing. This macro prints an error message to the standard error |
| output and exits @command{configure} with @var{exit-status} (@samp{$?} |
| by default, except that @samp{0} is converted to @samp{1}). |
| @var{error-description} should be something like @samp{invalid value |
| $HOME for \$HOME}. |
| |
| The @var{error-description} should start with a lower-case letter, and |
| ``cannot'' is preferred to ``can't''. |
| @end defmac |
| |
| @defmac AC_MSG_FAILURE (@var{error-description}, @ovar{exit-status}) |
| @acindex{MSG_FAILURE} |
| This @code{AC_MSG_ERROR} wrapper notifies the user of an error that |
| prevents @command{configure} from completing @emph{and} that additional |
| details are provided in @file{config.log}. This is typically used when |
| abnormal results are found during a compilation. |
| @end defmac |
| |
| @anchor{AC_MSG_WARN} |
| @defmac AC_MSG_WARN (@var{problem-description}) |
| @acindex{MSG_WARN} |
| Notify the @command{configure} user of a possible problem. This macro |
| prints the message to the standard error output; @command{configure} |
| continues running afterward, so macros that call @code{AC_MSG_WARN} should |
| provide a default (back-up) behavior for the situations they warn about. |
| @var{problem-description} should be something like @samp{ln -s seems to |
| make hard links}. |
| @end defmac |
| |
| |
| |
| @c ====================================================== Programming in M4. |
| |
| @node Programming in M4 |
| @chapter Programming in M4 |
| @cindex M4 |
| |
| Autoconf is written on top of two layers: @dfn{M4sugar}, which provides |
| convenient macros for pure M4 programming, and @dfn{M4sh}, which |
| provides macros dedicated to shell script generation. |
| |
| As of this version of Autoconf, these two layers still contain |
| experimental macros, whose interface might change in the future. As a |
| matter of fact, @emph{anything that is not documented must not be used}. |
| |
| @menu |
| * M4 Quotation:: Protecting macros from unwanted expansion |
| * Using autom4te:: The Autoconf executables backbone |
| * Programming in M4sugar:: Convenient pure M4 macros |
| * Debugging via autom4te:: Figuring out what M4 was doing |
| @end menu |
| |
| @node M4 Quotation |
| @section M4 Quotation |
| @cindex M4 quotation |
| @cindex quotation |
| |
| The most common problem with existing macros is an improper quotation. |
| This section, which users of Autoconf can skip, but which macro writers |
| @emph{must} read, first justifies the quotation scheme that was chosen |
| for Autoconf and then ends with a rule of thumb. Understanding the |
| former helps one to follow the latter. |
| |
| @menu |
| * Active Characters:: Characters that change the behavior of M4 |
| * One Macro Call:: Quotation and one macro call |
| * Quoting and Parameters:: M4 vs. shell parameters |
| * Quotation and Nested Macros:: Macros calling macros |
| * Changequote is Evil:: Worse than INTERCAL: M4 + changequote |
| * Quadrigraphs:: Another way to escape special characters |
| * Balancing Parentheses:: Dealing with unbalanced parentheses |
| * Quotation Rule Of Thumb:: One parenthesis, one quote |
| @end menu |
| |
| @node Active Characters |
| @subsection Active Characters |
| |
| To fully understand where proper quotation is important, you first need |
| to know what the special characters are in Autoconf: @samp{#} introduces |
| a comment inside which no macro expansion is performed, @samp{,} |
| separates arguments, @samp{[} and @samp{]} are the quotes |
| themselves@footnote{By itself, M4 uses @samp{`} and @samp{'}; it is the |
| M4sugar layer that sets up the preferred quotes of @samp{[} and @samp{]}.}, |
| @samp{(} and @samp{)} (which M4 tries to match by pairs), and finally |
| @samp{$} inside a macro definition. |
| |
| In order to understand the delicate case of macro calls, we first have |
| to present some obvious failures. Below they are ``obvious-ified'', |
| but when you find them in real life, they are usually in disguise. |
| |
| Comments, introduced by a hash and running up to the newline, are opaque |
| tokens to the top level: active characters are turned off, and there is |
| no macro expansion: |
| |
| @example |
| # define([def], ine) |
| @result{}# define([def], ine) |
| @end example |
| |
| Each time there can be a macro expansion, there is a quotation |
| expansion, i.e., one level of quotes is stripped: |
| |
| @example |
| int tab[10]; |
| @result{}int tab10; |
| [int tab[10];] |
| @result{}int tab[10]; |
| @end example |
| |
| Without this in mind, the reader might try hopelessly to use her macro |
| @code{array}: |
| |
| @example |
| define([array], [int tab[10];]) |
| array |
| @result{}int tab10; |
| [array] |
| @result{}array |
| @end example |
| |
| @noindent |
| How can you correctly output the intended results@footnote{Using |
| @code{defn}.}? |
| |
| |
| @node One Macro Call |
| @subsection One Macro Call |
| |
| Let's proceed on the interaction between active characters and macros |
| with this small macro, which just returns its first argument: |
| |
| @example |
| define([car], [$1]) |
| @end example |
| |
| @noindent |
| The two pairs of quotes above are not part of the arguments of |
| @code{define}; rather, they are understood by the top level when it |
| tries to find the arguments of @code{define}. Therefore, assuming |
| @code{car} is not already defined, it is equivalent to write: |
| |
| @example |
| define(car, $1) |
| @end example |
| |
| @noindent |
| But, while it is acceptable for a @file{configure.ac} to avoid unnecessary |
| quotes, it is bad practice for Autoconf macros which must both be more |
| robust and also advocate perfect style. |
| |
| At the top level, there are only two possibilities: either you |
| quote or you don't: |
| |
| @example |
| car(foo, bar, baz) |
| @result{}foo |
| [car(foo, bar, baz)] |
| @result{}car(foo, bar, baz) |
| @end example |
| |
| Let's pay attention to the special characters: |
| |
| @example |
| car(#) |
| @error{}EOF in argument list |
| @end example |
| |
| The closing parenthesis is hidden in the comment; with a hypothetical |
| quoting, the top level understood it this way: |
| |
| @example |
| car([#)] |
| @end example |
| |
| @noindent |
| Proper quotation, of course, fixes the problem: |
| |
| @example |
| car([#]) |
| @result{}# |
| @end example |
| |
| Here are more examples: |
| |
| @example |
| car(foo, bar) |
| @result{}foo |
| car([foo, bar]) |
| @result{}foo, bar |
| car((foo, bar)) |
| @result{}(foo, bar) |
| car([(foo], [bar)]) |
| @result{}(foo |
| define([a], [b]) |
| @result{} |
| car(a) |
| @result{}b |
| car([a]) |
| @result{}b |
| car([[a]]) |
| @result{}a |
| car([[[a]]]) |
| @result{}[a] |
| @end example |
| |
| @node Quoting and Parameters |
| @subsection Quoting and Parameters |
| |
| When M4 encounters @samp{$} within a macro definition, followed |
| immediately by a character it recognizes (@samp{0}@dots{}@samp{9}, |
| @samp{#}, @samp{@@}, or @samp{*}), it will perform M4 parameter |
| expansion. This happens regardless of how many layers of quotes the |
| parameter expansion is nested within, or even if it occurs in text that |
| will be rescanned as a comment. |
| |
| @example |
| define([none], [$1]) |
| @result{} |
| define([one], [[$1]]) |
| @result{} |
| define([two], [[[$1]]]) |
| @result{} |
| define([comment], [# $1]) |
| @result{} |
| define([active], [ACTIVE]) |
| @result{} |
| none([active]) |
| @result{}ACTIVE |
| one([active]) |
| @result{}active |
| two([active]) |
| @result{}[active] |
| comment([active]) |
| @result{}# active |
| @end example |
| |
| On the other hand, since autoconf generates shell code, you often want |
| to output shell variable expansion, rather than performing M4 parameter |
| expansion. To do this, you must use M4 quoting to separate the @samp{$} |
| from the next character in the definition of your macro. If the macro |
| definition occurs in single-quoted text, then insert another level of |
| quoting; if the usage is already inside a double-quoted string, then |
| split it into concatenated strings. |
| |
| @example |
| define([foo], [a single-quoted $[]1 definition]) |
| @result{} |
| define([bar], [[a double-quoted $][1 definition]]) |
| @result{} |
| foo |
| @result{}a single-quoted $1 definition |
| bar |
| @result{}a double-quoted $1 definition |
| @end example |
| |
| POSIX states that M4 implementations are free to provide implementation |
| extensions when @samp{$@{} is encountered in a macro definition. |
| Autoconf reserves the longer sequence @samp{$@{@{} for use with planned |
| extensions that will be available in the future GNU M4 2.0, |
| but guarantees that all other instances of @samp{$@{} will be output |
| literally. Therefore, this idiom can also be used to output shell code |
| parameter references: |
| |
| @example |
| define([first], [$@{1@}])first |
| @result{}$@{1@} |
| @end example |
| |
| POSIX also states that @samp{$11} should expand to the first parameter |
| concatenated with a literal @samp{1}, although some versions of |
| GNU M4 expand the eleventh parameter instead. For |
| portability, you should only use single-digit M4 parameter expansion. |
| |
| With this in mind, we can explore the cases where macros invoke |
| macros@enddots{} |
| |
| @node Quotation and Nested Macros |
| @subsection Quotation and Nested Macros |
| |
| The examples below use the following macros: |
| |
| @example |
| define([car], [$1]) |
| define([active], [ACT, IVE]) |
| define([array], [int tab[10]]) |
| @end example |
| |
| Each additional embedded macro call introduces other possible |
| interesting quotations: |
| |
| @example |
| car(active) |
| @result{}ACT |
| car([active]) |
| @result{}ACT, IVE |
| car([[active]]) |
| @result{}active |
| @end example |
| |
| In the first case, the top level looks for the arguments of @code{car}, |
| and finds @samp{active}. Because M4 evaluates its arguments |
| before applying the macro, @samp{active} is expanded, which results in: |
| |
| @example |
| car(ACT, IVE) |
| @result{}ACT |
| @end example |
| |
| @noindent |
| In the second case, the top level gives @samp{active} as first and only |
| argument of @code{car}, which results in: |
| |
| @example |
| active |
| @result{}ACT, IVE |
| @end example |
| |
| @noindent |
| i.e., the argument is evaluated @emph{after} the macro that invokes it. |
| In the third case, @code{car} receives @samp{[active]}, which results in: |
| |
| @example |
| [active] |
| @result{}active |
| @end example |
| |
| @noindent |
| exactly as we already saw above. |
| |
| The example above, applied to a more realistic example, gives: |
| |
| @example |
| car(int tab[10];) |
| @result{}int tab10; |
| car([int tab[10];]) |
| @result{}int tab10; |
| car([[int tab[10];]]) |
| @result{}int tab[10]; |
| @end example |
| |
| @noindent |
| Huh? The first case is easily understood, but why is the second wrong, |
| and the third right? To understand that, you must know that after |
| M4 expands a macro, the resulting text is immediately subjected |
| to macro expansion and quote removal. This means that the quote removal |
| occurs twice---first before the argument is passed to the @code{car} |
| macro, and second after the @code{car} macro expands to the first |
| argument. |
| |
| As the author of the Autoconf macro @code{car}, you then consider it to |
| be incorrect that your users have to double-quote the arguments of |
| @code{car}, so you ``fix'' your macro. Let's call it @code{qar} for |
| quoted car: |
| |
| @example |
| define([qar], [[$1]]) |
| @end example |
| |
| @noindent |
| and check that @code{qar} is properly fixed: |
| |
| @example |
| qar([int tab[10];]) |
| @result{}int tab[10]; |
| @end example |
| |
| @noindent |
| Ahhh! That's much better. |
| |
| But note what you've done: now that the result of @code{qar} is always |
| a literal string, the only time a user can use nested macros is if she |
| relies on an @emph{unquoted} macro call: |
| |
| @example |
| qar(active) |
| @result{}ACT |
| qar([active]) |
| @result{}active |
| @end example |
| |
| @noindent |
| leaving no way for her to reproduce what she used to do with @code{car}: |
| |
| @example |
| car([active]) |
| @result{}ACT, IVE |
| @end example |
| |
| @noindent |
| Worse yet: she wants to use a macro that produces a set of @code{cpp} |
| macros: |
| |
| @example |
| define([my_includes], [#include <stdio.h>]) |
| car([my_includes]) |
| @result{}#include <stdio.h> |
| qar(my_includes) |
| @error{}EOF in argument list |
| @end example |
| |
| This macro, @code{qar}, because it double quotes its arguments, forces |
| its users to leave their macro calls unquoted, which is dangerous. |
| Commas and other active symbols are interpreted by M4 before |
| they are given to the macro, often not in the way the users expect. |
| Also, because @code{qar} behaves differently from the other macros, |
| it's an exception that should be avoided in Autoconf. |
| |
| @node Changequote is Evil |
| @subsection @code{changequote} is Evil |
| @cindex @code{changequote} |
| |
| The temptation is often high to bypass proper quotation, in particular |
| when it's late at night. Then, many experienced Autoconf hackers |
| finally surrender to the dark side of the force and use the ultimate |
| weapon: @code{changequote}. |
| |
| The M4 builtin @code{changequote} belongs to a set of primitives that |
| allow one to adjust the syntax of the language to adjust it to one's |
| needs. For instance, by default M4 uses @samp{`} and @samp{'} as |
| quotes, but in the context of shell programming (and actually of most |
| programming languages), that's about the worst choice one can make: |
| because of strings and back-quoted expressions in shell code (such as |
| @samp{'this'} and @samp{`that`}), and because of literal characters in usual |
| programming languages (as in @samp{'0'}), there are many unbalanced |
| @samp{`} and @samp{'}. Proper M4 quotation then becomes a nightmare, if |
| not impossible. In order to make M4 useful in such a context, its |
| designers have equipped it with @code{changequote}, which makes it |
| possible to choose another pair of quotes. M4sugar, M4sh, Autoconf, and |
| Autotest all have chosen to use @samp{[} and @samp{]}. Not especially |
| because they are unlikely characters, but @emph{because they are |
| characters unlikely to be unbalanced}. |
| |
| There are other magic primitives, such as @code{changecom} to specify |
| what syntactic forms are comments (it is common to see |
| @samp{changecom(<!--, -->)} when M4 is used to produce HTML pages), |
| @code{changeword} and @code{changesyntax} to change other syntactic |
| details (such as the character to denote the @var{n}th argument, @samp{$} by |
| default, the parentheses around arguments, etc.). |
| |
| These primitives are really meant to make M4 more useful for specific |
| domains: they should be considered like command line options: |
| @option{--quotes}, @option{--comments}, @option{--words}, and |
| @option{--syntax}. Nevertheless, they are implemented as M4 builtins, as |
| it makes M4 libraries self contained (no need for additional options). |
| |
| There lies the problem@enddots{} |
| |
| @sp 1 |
| |
| The problem is that it is then tempting to use them in the middle of an |
| M4 script, as opposed to its initialization. This, if not carefully |
| thought out, can lead to disastrous effects: @emph{you are changing the |
| language in the middle of the execution}. Changing and restoring the |
| syntax is often not enough: if you happened to invoke macros in between, |
| these macros are lost, as the current syntax is probably not |
| the one they were implemented with. |
| |
| @c FIXME: I've been looking for a short, real case example, but I |
| @c lost them all :( |
| |
| |
| @node Quadrigraphs |
| @subsection Quadrigraphs |
| @cindex quadrigraphs |
| @cindex @samp{@@S|@@} |
| @cindex @samp{@@&t@@} |
| @c Info cannot handle ':' in index entries. |
| @ifnotinfo |
| @cindex @samp{@@<:@@} |
| @cindex @samp{@@:>@@} |
| @cindex @samp{@@%:@@} |
| @cindex @samp{@@@{:@@} |
| @cindex @samp{@@:@}@@} |
| @end ifnotinfo |
| |
| When writing an Autoconf macro you may occasionally need to generate |
| special characters that are difficult to express with the standard |
| Autoconf quoting rules. For example, you may need to output the regular |
| expression @samp{[^[]}, which matches any character other than @samp{[}. |
| This expression contains unbalanced brackets so it cannot be put easily |
| into an M4 macro. |
| |
| Additionally, there are a few m4sugar macros (such as @code{m4_split} |
| and @code{m4_expand}) which internally use special markers in addition |
| to the regular quoting characters. If the arguments to these macros |
| contain the literal strings @samp{-=<@{(} or @samp{)@}>=-}, the macros |
| might behave incorrectly. |
| |
| You can work around these problems by using one of the following |
| @dfn{quadrigraphs}: |
| |
| @table @samp |
| @item @@<:@@ |
| @samp{[} |
| @item @@:>@@ |
| @samp{]} |
| @item @@S|@@ |
| @samp{$} |
| @item @@%:@@ |
| @samp{#} |
| @item @@@{:@@ |
| @samp{(} |
| @item @@:@}@@ |
| @samp{)} |
| @item @@&t@@ |
| Expands to nothing. |
| @end table |
| |
| Quadrigraphs are replaced at a late stage of the translation process, |
| after @command{m4} is run, so they do not get in the way of M4 quoting. |
| For example, the string @samp{^@@<:@@}, independently of its quotation, |
| appears as @samp{^[} in the output. |
| |
| The empty quadrigraph can be used: |
| |
| @itemize @minus |
| @item to mark trailing spaces explicitly |
| |
| Trailing spaces are smashed by @command{autom4te}. This is a feature. |
| |
| @item to produce quadrigraphs and other strings reserved by m4sugar |
| |
| For instance @samp{@@<@@&t@@:@@} produces @samp{@@<:@@}. For a more |
| contrived example: |
| |
| @example |
| m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl |
| m4_split([a )@}>=- b -=<@{( c]) |
| @result{}[a], [], [B], [], [c] |
| m4_split([a )@}@@&t@@>=- b -=<@@&t@@@{( c]) |
| @result{}[a], [)@}>=-], [b], [-=<@{(], [c] |
| @end example |
| |
| @item to escape @emph{occurrences} of forbidden patterns |
| |
| For instance you might want to mention @code{AC_FOO} in a comment, while |
| still being sure that @command{autom4te} still catches unexpanded |
| @samp{AC_*}. Then write @samp{AC@@&t@@_FOO}. |
| @end itemize |
| |
| The name @samp{@@&t@@} was suggested by Paul Eggert: |
| |
| @quotation |
| I should give some credit to the @samp{@@&t@@} pun. The @samp{&} is my |
| own invention, but the @samp{t} came from the source code of the |
| ALGOL68C compiler, written by Steve Bourne (of Bourne shell fame), |
| and which used @samp{mt} to denote the empty string. In C, it would |
| have looked like something like: |
| |
| @example |
| char const mt[] = ""; |
| @end example |
| |
| @noindent |
| but of course the source code was written in Algol 68. |
| |
| I don't know where he got @samp{mt} from: it could have been his own |
| invention, and I suppose it could have been a common pun around the |
| Cambridge University computer lab at the time. |
| @end quotation |
| |
| |
| @node Balancing Parentheses |
| @subsection Dealing with unbalanced parentheses |
| @cindex balancing parentheses |
| @cindex parentheses, balancing |
| @cindex unbalanced parentheses, managing |
| |
| One of the pitfalls of portable shell programming is that |
| if you intend your script to run with obsolescent shells, |
| @command{case} statements require unbalanced parentheses. |
| @xref{case, , Limitations of Shell Builtins}. |
| With syntax highlighting |
| editors, the presence of unbalanced @samp{)} can interfere with editors |
| that perform syntax highlighting of macro contents based on finding the |
| matching @samp{(}. Another concern is how much editing must be done |
| when transferring code snippets between shell scripts and macro |
| definitions. But most importantly, the presence of unbalanced |
| parentheses can introduce expansion bugs. |
| |
| For an example, here is an underquoted attempt to use the macro |
| @code{my_case}, which happens to expand to a portable @command{case} |
| statement: |
| |
| @example |
| AC_DEFUN([my_case], |
| [case $file_name in |
| *.c) file_type='C source code';; |
| esac]) |
| AS_IF(:, my_case) |
| @end example |
| |
| @noindent |
| In the above example, the @code{AS_IF} call under-quotes its arguments. |
| As a result, the unbalanced @samp{)} generated by the premature |
| expansion of @code{my_case} results in expanding @code{AS_IF} with a |
| truncated parameter, and the expansion is syntactically invalid: |
| |
| @example |
| if : |
| then : |
| case $file_name in |
| *.c |
| fi file_type='C source code';; |
| esac) |
| @end example |
| |
| If nothing else, this should emphasize the importance of the quoting |
| arguments to macro calls. On the other hand, there are several |
| variations for defining @code{my_case} to be more robust, even when used |
| without proper quoting, each with some benefits and some drawbacks. |
| |
| @itemize @w{} |
| @item Use left parenthesis before pattern |
| @example |
| AC_DEFUN([my_case], |
| [case $file_name in |
| (*.c) file_type='C source code';; |
| esac]) |
| @end example |
| @noindent |
| This is simple and provides balanced parentheses. Although this is not |
| portable to obsolescent shells (notably Solaris 10 @command{/bin/sh}), |
| platforms with these shells invariably have a more-modern shell |
| available somewhere so this approach typically suffices nowadays. |
| |
| @item Creative literal shell comment |
| @example |
| AC_DEFUN([my_case], |
| [case $file_name in #( |
| *.c) file_type='C source code';; |
| esac]) |
| @end example |
| @noindent |
| This version provides balanced parentheses to several editors, and can |
| be copied and pasted into a terminal as is. Unfortunately, it is still |
| unbalanced as an Autoconf argument, since @samp{#(} is an M4 comment |
| that masks the normal properties of @samp{(}. |
| |
| @item Quadrigraph shell comment |
| @example |
| AC_DEFUN([my_case], |
| [case $file_name in @@%:@@( |
| *.c) file_type='C source code';; |
| esac]) |
| @end example |
| @noindent |
| This version provides balanced parentheses to even more editors, and can |
| be used as a balanced Autoconf argument. Unfortunately, it requires |
| some editing before it can be copied and pasted into a terminal, and the |
| use of the quadrigraph @samp{@@%:@@} for @samp{#} reduces readability. |
| |
| @item Quoting just the parenthesis |
| @example |
| AC_DEFUN([my_case], |
| [case $file_name in |
| *.c[)] file_type='C source code';; |
| esac]) |
| @end example |
| @noindent |
| This version quotes the @samp{)}, so that it can be used as a balanced |
| Autoconf argument. As written, this is not balanced to an editor, but |
| it can be coupled with @samp{[#(]} to meet that need, too. However, it |
| still requires some edits before it can be copied and pasted into a |
| terminal. |
| |
| @item Double-quoting the entire statement |
| @example |
| AC_DEFUN([my_case], |
| [[case $file_name in #( |
| *.c) file_type='C source code';; |
| esac]]) |
| @end example |
| @noindent |
| Since the entire macro is double-quoted, there is no problem with using |
| this as an Autoconf argument; and since the double-quoting is over the |
| entire statement, this code can be easily copied and pasted into a |
| terminal. However, the double quoting prevents the expansion of any |
| macros inside the case statement, which may cause its own set of |
| problems. |
| |
| @item Using @code{AS_CASE} |
| @example |
| AC_DEFUN([my_case], |
| [AS_CASE([$file_name], |
| [*.c], [file_type='C source code'])]) |
| @end example |
| @noindent |
| This version avoids the balancing issue altogether, by relying on |
| @code{AS_CASE} (@pxref{Common Shell Constructs}); it also allows for the |
| expansion of @code{AC_REQUIRE} to occur prior to the entire case |
| statement, rather than within a branch of the case statement that might |
| not be taken. However, the abstraction comes with a penalty that it is |
| no longer a quick copy, paste, and edit to get back to shell code. |
| @end itemize |
| |
| |
| @node Quotation Rule Of Thumb |
| @subsection Quotation Rule Of Thumb |
| |
| To conclude, the quotation rule of thumb is: |
| |
| @center @emph{One pair of quotes per pair of parentheses.} |
| |
| Never over-quote, never under-quote, in particular in the definition of |
| macros. In the few places where the macros need to use brackets |
| (usually in C program text or regular expressions), properly quote |
| @emph{the arguments}! |
| |
| It is common to read Autoconf programs with snippets like: |
| |
| @example |
| AC_TRY_LINK( |
| changequote(<<, >>)dnl |
| <<#include <time.h> |
| #ifndef tzname /* For SGI. */ |
| extern char *tzname[]; /* RS6000 and others reject char **tzname. */ |
| #endif>>, |
| changequote([, ])dnl |
| [atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no) |
| @end example |
| |
| @noindent |
| which is incredibly useless since @code{AC_TRY_LINK} is @emph{already} |
| double quoting, so you just need: |
| |
| @example |
| AC_TRY_LINK( |
| [#include <time.h> |
| #ifndef tzname /* For SGI. */ |
| extern char *tzname[]; /* RS6000 and others reject char **tzname. */ |
| #endif], |
| [atoi (*tzname);], |
| [ac_cv_var_tzname=yes], |
| [ac_cv_var_tzname=no]) |
| @end example |
| |
| @noindent |
| The M4-fluent reader might note that these two examples are rigorously |
| equivalent, since M4 swallows both the @samp{changequote(<<, >>)} |
| and @samp{<<} @samp{>>} when it @dfn{collects} the arguments: these |
| quotes are not part of the arguments! |
| |
| Simplified, the example above is just doing this: |
| |
| @example |
| changequote(<<, >>)dnl |
| <<[]>> |
| changequote([, ])dnl |
| @end example |
| |
| @noindent |
| instead of simply: |
| |
| @example |
| [[]] |
| @end example |
| |
| With macros that do not double quote their arguments (which is the |
| rule), double-quote the (risky) literals: |
| |
| @example |
| AC_LINK_IFELSE([AC_LANG_PROGRAM( |
| [[#include <time.h> |
| #ifndef tzname /* For SGI. */ |
| extern char *tzname[]; /* RS6000 and others reject char **tzname. */ |
| #endif]], |
| [atoi (*tzname);])], |
| [ac_cv_var_tzname=yes], |
| [ac_cv_var_tzname=no]) |
| @end example |
| |
| Please note that the macro @code{AC_TRY_LINK} is obsolete, so you really |
| should be using @code{AC_LINK_IFELSE} instead. |
| |
| @xref{Quadrigraphs}, for what to do if you run into a hopeless case |
| where quoting does not suffice. |
| |
| When you create a @command{configure} script using newly written macros, |
| examine it carefully to check whether you need to add more quotes in |
| your macros. If one or more words have disappeared in the M4 |
| output, you need more quotes. When in doubt, quote. |
| |
| However, it's also possible to put on too many layers of quotes. If |
| this happens, the resulting @command{configure} script may contain |
| unexpanded macros. The @command{autoconf} program checks for this problem |
| by looking for the string @samp{AC_} in @file{configure}. However, this |
| heuristic does not work in general: for example, it does not catch |
| overquoting in @code{AC_DEFINE} descriptions. |
| |
| |
| @c ---------------------------------------- Using autom4te |
| |
| @node Using autom4te |
| @section Using @command{autom4te} |
| |
| The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition |
| to Autoconf per se, heavily rely on M4. All these different uses |
| revealed common needs factored into a layer over M4: |
| @command{autom4te}@footnote{ |
| @c |
| Yet another great name from Lars J. Aas. |
| @c |
| }. |
| |
| @command{autom4te} is a preprocessor that is like @command{m4}. |
| It supports M4 extensions designed for use in tools like Autoconf. |
| |
| @menu |
| * autom4te Invocation:: A GNU M4 wrapper |
| * Customizing autom4te:: Customizing the Autoconf package |
| @end menu |
| |
| @node autom4te Invocation |
| @subsection Invoking @command{autom4te} |
| |
| The command line arguments are modeled after M4's: |
| |
| @example |
| autom4te @var{options} @var{files} |
| @end example |
| |
| @noindent |
| @evindex M4 |
| where the @var{files} are directly passed to @command{m4}. By default, |
| GNU M4 is found during configuration, but the environment |
| variable |
| @env{M4} can be set to tell @command{autom4te} where to look. In addition |
| to the regular expansion, it handles the replacement of the quadrigraphs |
| (@pxref{Quadrigraphs}), and of @samp{__oline__}, the current line in the |
| output. It supports an extended syntax for the @var{files}: |
| |
| @table @file |
| @item @var{file}.m4f |
| This file is an M4 frozen file. Note that @emph{all the previous files |
| are ignored}. See the @option{--melt} option for the rationale. |
| |
| @item @var{file}? |
| If found in the library path, the @var{file} is included for expansion, |
| otherwise it is ignored instead of triggering a failure. |
| @end table |
| |
| @sp 1 |
| |
| Of course, it supports the Autoconf common subset of options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Report processing steps. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files and be even more verbose. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Also look for input files in @var{dir}. Multiple invocations |
| accumulate. |
| |
| @item --output=@var{file} |
| @itemx -o @var{file} |
| Save output (script or trace) to @var{file}. The file @option{-} stands |
| for the standard output. |
| @end table |
| |
| @sp 1 |
| |
| As an extension of @command{m4}, it includes the following options: |
| |
| @table @option |
| |
| @item --warnings=@var{category}[,@var{category}...] |
| @itemx -W@var{category}[,@var{category}...] |
| @evindex WARNINGS |
| Enable or disable warnings related to each @var{category}. |
| @xref{m4_warn}, for a comprehensive list of categories. |
| Special values include: |
| |
| @table @samp |
| @item all |
| Enable all categories of warnings. |
| |
| @item none |
| Disable all categories of warnings. |
| |
| @item error |
| Treat all warnings as errors. |
| |
| @item no-@var{category} |
| Disable warnings falling into @var{category}. |
| @end table |
| |
| The environment variable @env{WARNINGS} may also be set to a |
| comma-separated list of warning categories to enable or disable. |
| It is interpreted exactly the same way as the argument of |
| @option{--warnings}, but unknown categories are silently ignored. |
| The command line takes precedence; for instance, if @env{WARNINGS} |
| is set to @code{obsolete}, but @option{-Wnone} is given on the |
| command line, no warnings will be issued. |
| |
| Some categories of warnings are on by default. |
| Again, for details see @ref{m4_warn}. |
| |
| @item --melt |
| @itemx -M |
| Do not use frozen files. Any argument @code{@var{file}.m4f} is |
| replaced by @code{@var{file}.m4}. This helps tracing the macros which |
| are executed only when the files are frozen, typically |
| @code{m4_define}. For instance, running: |
| |
| @example |
| autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4 |
| @end example |
| |
| @noindent |
| is roughly equivalent to running: |
| |
| @example |
| m4 1.m4 2.m4 3.m4 4.m4 input.m4 |
| @end example |
| |
| @noindent |
| while |
| |
| @example |
| autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4 |
| @end example |
| |
| @noindent |
| is equivalent to: |
| |
| @example |
| m4 --reload-state=4.m4f input.m4 |
| @end example |
| |
| @item --freeze |
| @itemx -F |
| Produce a frozen state file. @command{autom4te} freezing is stricter |
| than M4's: it must produce no warnings, and no output other than empty |
| lines (a line with white space is @emph{not} empty) and comments |
| (starting with @samp{#}). Unlike @command{m4}'s similarly-named option, |
| this option takes no argument: |
| |
| @example |
| autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f |
| @end example |
| |
| @noindent |
| corresponds to |
| |
| @example |
| m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f |
| @end example |
| |
| @item --mode=@var{octal-mode} |
| @itemx -m @var{octal-mode} |
| Set the mode of the non-traces output to @var{octal-mode}; by default |
| @samp{0666}. |
| @end table |
| |
| @sp 1 |
| |
| @cindex @file{autom4te.cache} |
| As another additional feature over @command{m4}, @command{autom4te} |
| caches its results. GNU M4 is able to produce a regular |
| output and traces at the same time. Traces are heavily used in the |
| GNU Build System: @command{autoheader} uses them to build |
| @file{config.h.in}, @command{autoreconf} to determine what |
| GNU Build System components are used, @command{automake} to |
| ``parse'' @file{configure.ac} etc. To avoid recomputation, |
| traces are cached while performing regular expansion, |
| and conversely. This cache is (actually, the caches are) stored in |
| the directory @file{autom4te.cache}. @emph{It can safely be removed} |
| at any moment (especially if for some reason @command{autom4te} |
| considers it trashed). |
| |
| @table @option |
| @item --cache=@var{directory} |
| @itemx -C @var{directory} |
| Specify the name of the directory where the result should be cached. |
| Passing an empty value disables caching. Be sure to pass a relative |
| file name, as for the time being, global caches are not supported. |
| |
| @item --no-cache |
| Don't cache the results. |
| |
| @item --force |
| @itemx -f |
| If a cache is used, consider it obsolete (but update it anyway). |
| @end table |
| |
| @sp 1 |
| |
| Because traces are so important to the GNU Build System, |
| @command{autom4te} provides high level tracing features as compared to |
| M4, and helps exploiting the cache: |
| |
| @table @option |
| @item --trace=@var{macro}[:@var{format}] |
| @itemx -t @var{macro}[:@var{format}] |
| Trace the invocations of @var{macro} according to the @var{format}. |
| Multiple @option{--trace} arguments can be used to list several macros. |
| Multiple @option{--trace} arguments for a single macro are not |
| cumulative; instead, you should just make @var{format} as long as |
| needed. |
| |
| The @var{format} is a regular string, with newlines if desired, and |
| several special escape codes. It defaults to @samp{$f:$l:$n:$%}. It can |
| use the following special escapes: |
| |
| @table @samp |
| @item $$ |
| @c $$ restore font-lock |
| The character @samp{$}. |
| |
| @item $f |
| The file name from which @var{macro} is called. |
| |
| @item $l |
| The line number from which @var{macro} is called. |
| |
| @item $d |
| The depth of the @var{macro} call. This is an M4 technical detail that |
| you probably don't want to know about. |
| |
| @item $n |
| The name of the @var{macro}. |
| |
| @item $@var{num} |
| The @var{num}th argument of the call to @var{macro}. |
| |
| @item $@@ |
| @itemx $@var{sep}@@ |
| @itemx $@{@var{separator}@}@@ |
| All the arguments passed to @var{macro}, separated by the character |
| @var{sep} or the string @var{separator} (@samp{,} by default). Each |
| argument is quoted, i.e., enclosed in a pair of square brackets. |
| |
| @item $* |
| @itemx $@var{sep}* |
| @itemx $@{@var{separator}@}* |
| As above, but the arguments are not quoted. |
| |
| @item $% |
| @itemx $@var{sep}% |
| @itemx $@{@var{separator}@}% |
| As above, but the arguments are not quoted, all new line characters in |
| the arguments are smashed, and the default separator is @samp{:}. |
| |
| The escape @samp{$%} produces single-line trace outputs (unless you put |
| newlines in the @samp{separator}), while @samp{$@@} and @samp{$*} do |
| not. |
| @end table |
| |
| @xref{autoconf Invocation}, for examples of trace uses. |
| |
| @item --preselect=@var{macro} |
| @itemx -p @var{macro} |
| Cache the traces of @var{macro}, but do not enable traces. This is |
| especially important to save CPU cycles in the future. For instance, |
| when invoked, @command{autoconf} pre-selects all the macros that |
| @command{autoheader}, @command{automake}, @command{autoreconf}, etc., |
| trace, so that running @command{m4} is not needed to trace them: the |
| cache suffices. This results in a huge speed-up. |
| @end table |
| |
| @sp 1 |
| |
| @cindex Autom4te Library |
| Finally, @command{autom4te} introduces the concept of @dfn{Autom4te |
| libraries}. They consists in a powerful yet extremely simple feature: |
| sets of combined command line arguments: |
| |
| @table @option |
| @item --language=@var{language} |
| @itemx -l @var{language} |
| Use the @var{language} Autom4te library. Current languages include: |
| |
| @table @code |
| @item M4sugar |
| create M4sugar output. |
| |
| @item M4sh |
| create M4sh executable shell scripts. |
| |
| @item Autotest |
| create Autotest executable test suites. |
| |
| @item Autoconf-without-aclocal-m4 |
| create Autoconf executable configure scripts without |
| reading @file{aclocal.m4}. |
| |
| @item Autoconf |
| create Autoconf executable configure scripts. This language inherits |
| all the characteristics of @code{Autoconf-without-aclocal-m4} and |
| additionally reads @file{aclocal.m4}. |
| @end table |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend directory @var{dir} to the search path. This is used to include |
| the language-specific files before any third-party macros. |
| |
| @end table |
| |
| @cindex @file{autom4te.cfg} |
| As an example, if Autoconf is installed in its default location, |
| @file{/usr/local}, the command @samp{autom4te -l m4sugar foo.m4} is |
| strictly equivalent to the command: |
| |
| @example |
| autom4te --prepend-include /usr/local/share/autoconf \ |
| m4sugar/m4sugar.m4f foo.m4 |
| @end example |
| |
| @noindent |
| Recursive expansion applies here: the command @samp{autom4te -l m4sh foo.m4} |
| is the same as @samp{autom4te --language M4sugar m4sugar/m4sh.m4f |
| foo.m4}, i.e.: |
| |
| @example |
| autom4te --prepend-include /usr/local/share/autoconf \ |
| m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4 |
| @end example |
| |
| @noindent |
| The definition of the languages is stored in @file{autom4te.cfg}. |
| |
| @node Customizing autom4te |
| @subsection Customizing @command{autom4te} |
| |
| One can customize @command{autom4te} via @file{~/.autom4te.cfg} (i.e., |
| as found in the user home directory), and @file{./.autom4te.cfg} (i.e., |
| as found in the directory from which @command{autom4te} is run). The |
| order is first reading @file{autom4te.cfg}, then @file{~/.autom4te.cfg}, |
| then @file{./.autom4te.cfg}, and finally the command line arguments. |
| |
| In these text files, comments are introduced with @code{#}, and empty |
| lines are ignored. Customization is performed on a per-language basis, |
| wrapped in between a @samp{begin-language: "@var{language}"}, |
| @samp{end-language: "@var{language}"} pair. |
| |
| Customizing a language stands for appending options (@pxref{autom4te |
| Invocation}) to the current definition of the language. Options, and |
| more generally arguments, are introduced by @samp{args: |
| @var{arguments}}. You may use the traditional shell syntax to quote the |
| @var{arguments}. |
| |
| As an example, to disable Autoconf caches (@file{autom4te.cache}) |
| globally, include the following lines in @file{~/.autom4te.cfg}: |
| |
| @verbatim |
| ## ------------------ ## |
| ## User Preferences. ## |
| ## ------------------ ## |
| |
| begin-language: "Autoconf-without-aclocal-m4" |
| args: --no-cache |
| end-language: "Autoconf-without-aclocal-m4" |
| @end verbatim |
| |
| |
| @node Programming in M4sugar |
| @section Programming in M4sugar |
| |
| @cindex M4sugar |
| M4 by itself provides only a small, but sufficient, set of all-purpose |
| macros. M4sugar introduces additional generic macros. Its name was |
| coined by Lars J. Aas: ``Readability And Greater Understanding Stands 4 |
| M4sugar''. |
| |
| M4sugar reserves the macro namespace @samp{^_m4_} for internal use, and |
| the macro namespace @samp{^m4_} for M4sugar macros. You should not |
| define your own macros into these namespaces. |
| |
| @menu |
| * Redefined M4 Macros:: M4 builtins changed in M4sugar |
| * Diagnostic Macros:: Diagnostic messages from M4sugar |
| * Diversion support:: Diversions in M4sugar |
| * Conditional constructs:: Conditions in M4 |
| * Looping constructs:: Iteration in M4 |
| * Evaluation Macros:: More quotation and evaluation control |
| * Text processing Macros:: String manipulation in M4 |
| * Number processing Macros:: Arithmetic computation in M4 |
| * Set manipulation Macros:: Set manipulation in M4 |
| * Forbidden Patterns:: Catching unexpanded macros |
| @end menu |
| |
| @node Redefined M4 Macros |
| @subsection Redefined M4 Macros |
| |
| @msindex{builtin} |
| @msindex{changecom} |
| @msindex{changequote} |
| @msindex{debugfile} |
| @msindex{debugmode} |
| @msindex{decr} |
| @msindex{define} |
| @msindex{divnum} |
| @msindex{errprint} |
| @msindex{esyscmd} |
| @msindex{eval} |
| @msindex{format} |
| @msindex{ifdef} |
| @msindex{incr} |
| @msindex{index} |
| @msindex{indir} |
| @msindex{len} |
| @msindex{pushdef} |
| @msindex{shift} |
| @msindex{substr} |
| @msindex{syscmd} |
| @msindex{sysval} |
| @msindex{traceoff} |
| @msindex{traceon} |
| @msindex{translit} |
| With a few exceptions, all the M4 native macros are moved in the |
| @samp{m4_} pseudo-namespace, e.g., M4sugar renames @code{define} as |
| @code{m4_define} etc. |
| |
| The list of macros unchanged from M4, except for their name, is: |
| @itemize @minus |
| @item m4_builtin |
| @item m4_changecom |
| @item m4_changequote |
| @item m4_debugfile |
| @item m4_debugmode |
| @item m4_decr |
| @item m4_define |
| @item m4_divnum |
| @item m4_errprint |
| @item m4_esyscmd |
| @item m4_eval |
| @item m4_format |
| @item m4_ifdef |
| @item m4_incr |
| @item m4_index |
| @item m4_indir |
| @item m4_len |
| @item m4_pushdef |
| @item m4_shift |
| @item m4_substr |
| @item m4_syscmd |
| @item m4_sysval |
| @item m4_traceoff |
| @item m4_traceon |
| @item m4_translit |
| @end itemize |
| |
| Some M4 macros are redefined, and are slightly incompatible with their |
| native equivalent. |
| |
| @defmac __file__ |
| @defmacx __line__ |
| @MSindex __file__ |
| @MSindex __line__ |
| All M4 macros starting with @samp{__} retain their original name: for |
| example, no @code{m4__file__} is defined. |
| @end defmac |
| |
| @defmac __oline__ |
| @MSindex __oline__ |
| This is not technically a macro, but a feature of Autom4te. The |
| sequence @code{__oline__} can be used similarly to the other m4sugar |
| location macros, but rather than expanding to the location of the input |
| file, it is translated to the line number where it appears in the output |
| file after all other M4 expansions. |
| @end defmac |
| |
| @defmac dnl |
| @MSindex dnl |
| This macro kept its original name: no @code{m4_dnl} is defined. |
| @end defmac |
| |
| @defmac m4_bpatsubst (@var{string}, @var{regexp}, @ovar{replacement}) |
| @msindex{bpatsubst} |
| This macro corresponds to @code{patsubst}. The name @code{m4_patsubst} |
| is kept for future versions of M4sugar, once GNU M4 2.0 is |
| released and supports extended regular expression syntax. |
| @end defmac |
| |
| @defmac m4_bregexp (@var{string}, @var{regexp}, @ovar{replacement}) |
| @msindex{bregexp} |
| This macro corresponds to @code{regexp}. The name @code{m4_regexp} |
| is kept for future versions of M4sugar, once GNU M4 2.0 is |
| released and supports extended regular expression syntax. |
| @end defmac |
| |
| @defmac m4_copy (@var{source}, @var{dest}) |
| @defmacx m4_copy_force (@var{source}, @var{dest}) |
| @defmacx m4_rename (@var{source}, @var{dest}) |
| @defmacx m4_rename_force (@var{source}, @var{dest}) |
| @msindex{copy} |
| @msindex{copy_force} |
| @msindex{rename} |
| @msindex{rename_force} |
| These macros aren't directly builtins, but are closely related to |
| @code{m4_pushdef} and @code{m4_defn}. @code{m4_copy} and |
| @code{m4_rename} ensure that @var{dest} is undefined, while |
| @code{m4_copy_force} and @code{m4_rename_force} overwrite any existing |
| definition. All four macros then proceed to copy the entire pushdef |
| stack of definitions of @var{source} over to @var{dest}. @code{m4_copy} |
| and @code{m4_copy_force} preserve the source (including in the special |
| case where @var{source} is undefined), while @code{m4_rename} and |
| @code{m4_rename_force} undefine the original macro name (making it an |
| error to rename an undefined @var{source}). |
| |
| Note that attempting to invoke a renamed macro might not work, since the |
| macro may have a dependence on helper macros accessed via composition of |
| @samp{$0} but that were not also renamed; likewise, other macros may |
| have a hard-coded dependence on @var{source} and could break if |
| @var{source} has been deleted. On the other hand, it is always safe to |
| rename a macro to temporarily move it out of the way, then rename it |
| back later to restore original semantics. |
| @end defmac |
| |
| @defmac m4_defn (@var{macro}@dots{}) |
| @msindex{defn} |
| This macro fails if @var{macro} is not defined, even when using older |
| versions of M4 that did not warn. See @code{m4_undefine}. |
| Unfortunately, in order to support these older versions of M4, there are |
| some situations involving unbalanced quotes where concatenating multiple |
| macros together will work in newer M4 but not in m4sugar; use |
| quadrigraphs to work around this. |
| @end defmac |
| |
| @defmac m4_divert (@var{diversion}) |
| @msindex{divert} |
| M4sugar relies heavily on diversions, so rather than behaving as a |
| primitive, @code{m4_divert} behaves like: |
| @example |
| m4_divert_pop()m4_divert_push([@var{diversion}]) |
| @end example |
| @noindent |
| @xref{Diversion support}, for more details about the use of the |
| diversion stack. In particular, this implies that @var{diversion} |
| should be a named diversion rather than a raw number. But be aware that |
| it is seldom necessary to explicitly change the diversion stack, and |
| that when done incorrectly, it can lead to syntactically invalid |
| scripts. |
| @end defmac |
| |
| @defmac m4_dumpdef (@var{name}@dots{}) |
| @defmacx m4_dumpdefs (@var{name}@dots{}) |
| @msindex{dumpdef} |
| @msindex{dumpdefs} |
| @code{m4_dumpdef} is like the M4 builtin, except that this version |
| requires at least one argument, output always goes to standard error |
| rather than the current debug file, no sorting is done on multiple |
| arguments, and an error is issued if any |
| @var{name} is undefined. @code{m4_dumpdefs} is a convenience macro that |
| calls @code{m4_dumpdef} for all of the |
| @code{m4_pushdef} stack of definitions, starting with the current, and |
| silently does nothing if @var{name} is undefined. |
| |
| Unfortunately, due to a limitation in M4 1.4.x, any macro defined as a |
| builtin is output as the empty string. This behavior is rectified by |
| using M4 1.6 or newer. However, this behavior difference means that |
| @code{m4_dumpdef} should only be used while developing m4sugar macros, |
| and never in the final published form of a macro. |
| @end defmac |
| |
| @defmac m4_esyscmd_s (@var{command}) |
| @msindex{esyscmd_s} |
| Like @code{m4_esyscmd}, this macro expands to the result of running |
| @var{command} in a shell. The difference is that any trailing newlines |
| are removed, so that the output behaves more like shell command |
| substitution. |
| @end defmac |
| |
| @defmac m4_exit (@var{exit-status}) |
| @msindex{exit} |
| This macro corresponds to @code{m4exit}. |
| @end defmac |
| |
| @defmac m4_if (@var{comment}) |
| @defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal}, @ovar{not-equal}) |
| @defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal-1}, @ |
| @var{string-3}, @var{string-4}, @var{equal-2}, @dots{}, @ovar{not-equal}) |
| @msindex{if} |
| This macro corresponds to @code{ifelse}. @var{string-1} and |
| @var{string-2} are compared literally, so usually one of the two |
| arguments is passed unquoted. @xref{Conditional constructs}, for more |
| conditional idioms. |
| @end defmac |
| |
| @defmac m4_include (@var{file}) |
| @defmacx m4_sinclude (@var{file}) |
| @msindex{include} |
| @msindex{sinclude} |
| Like the M4 builtins, but warn against multiple inclusions of @var{file}. |
| @end defmac |
| |
| @defmac m4_mkstemp (@var{template}) |
| @defmacx m4_maketemp (@var{template}) |
| @msindex{maketemp} |
| @msindex{mkstemp} |
| Older versions of POSIX specified a macro @code{maketemp}, |
| which replaced the trailing @samp{X} |
| characters in @var{template} with the process id, without regards to the |
| existence of a file by that name. |
| This was a security hole, so current POSIX instead specifies a macro |
| @code{mkstemp} that always creates a uniquely named file. In M4sugar, |
| @code{m4_maketemp} and @code{m4_mkstemp} are synonyms for each other, |
| and both have the secure semantics regardless of which macro the |
| underlying M4 provides. |
| @end defmac |
| |
| @defmac m4_popdef (@var{macro}@dots{}) |
| @msindex{popdef} |
| This macro fails if @var{macro} is not defined, even when using older |
| versions of M4 that did not warn. See @code{m4_undefine}. |
| @end defmac |
| |
| @defmac m4_undefine (@var{macro}@dots{}) |
| @msindex{undefine} |
| This macro fails if @var{macro} is not defined, even when using older |
| versions of M4 that did not warn. Use |
| |
| @example |
| m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])]) |
| @end example |
| |
| @noindent |
| if you are not sure whether @var{macro} is defined. |
| @end defmac |
| |
| @defmac m4_undivert (@var{diversion}@dots{}) |
| @msindex{undivert} |
| Unlike the M4 builtin, at least one @var{diversion} must be specified. |
| Also, since the M4sugar diversion stack prefers named |
| diversions, the use of @code{m4_undivert} to include files is risky. |
| @xref{Diversion support}, for more details about the use of the |
| diversion stack. But be aware that it is seldom necessary to explicitly |
| change the diversion stack, and that when done incorrectly, it can lead |
| to syntactically invalid scripts. |
| @end defmac |
| |
| @defmac m4_wrap (@var{text}) |
| @defmacx m4_wrap_lifo (@var{text}) |
| @msindex{wrap} |
| @msindex{wrap_lifo} |
| These macros correspond to @code{m4wrap}. POSIX requires arguments of |
| multiple wrap calls to be reprocessed at EOF in the same order |
| as the original calls (first-in, first-out). GNU M4 versions |
| through 1.4.10, however, reprocess them in reverse order (last-in, |
| first-out). Both orders are useful, therefore, you can rely on |
| @code{m4_wrap} to provide FIFO semantics and @code{m4_wrap_lifo} for |
| LIFO semantics, regardless of the underlying GNU M4 version. |
| |
| Unlike the GNU M4 builtin, these macros only recognize one |
| argument, and avoid token pasting between consecutive invocations. On |
| the other hand, nested calls to @code{m4_wrap} from within wrapped text |
| work just as in the builtin. |
| @end defmac |
| |
| |
| @node Diagnostic Macros |
| @subsection Diagnostic messages from M4sugar |
| @cindex Messages, from @command{M4sugar} |
| |
| When macros statically diagnose abnormal situations, benign or fatal, |
| they should report them using these macros. For issuing dynamic issues, |
| i.e., when @command{configure} is run, see @ref{Printing Messages}. |
| |
| @defmac m4_assert (@var{expression}, @dvar{exit-status, 1}) |
| @msindex{assert} |
| Assert that the arithmetic @var{expression} evaluates to non-zero. |
| Otherwise, issue a fatal error, and exit @command{autom4te} with |
| @var{exit-status}. |
| @end defmac |
| |
| @defmac m4_errprintn (@var{message}) |
| @msindex{errprintn} |
| Similar to the builtin @code{m4_errprint}, except that a newline is |
| guaranteed after @var{message}. |
| @end defmac |
| |
| @anchor{m4_fatal} |
| @defmac m4_fatal (@var{message}) |
| @msindex{fatal} |
| Report a severe error @var{message} prefixed with the current location, |
| and have @command{autom4te} die. |
| @end defmac |
| |
| @defmac m4_location |
| @msindex{location} |
| Useful as a prefix in a message line. Short for: |
| @example |
| __file__:__line__ |
| @end example |
| @end defmac |
| |
| @anchor{m4_warn} |
| @defmac m4_warn (@var{category}, @var{message}) |
| @msindex{warn} |
| Report @var{message} as a warning (or as an error if requested by the |
| user) if warnings of the @var{category} are turned on. If the message |
| is emitted, it is prefixed with the current location, and followed by a |
| call trace of all macros defined via @code{AC_DEFUN} used to get to the |
| current expansion. |
| |
| The @var{category} must be one of: |
| |
| @table @samp |
| @item cross |
| Warnings about constructs that may interfere with cross-compilation, |
| such as using @code{AC_RUN_IFELSE} without a default. |
| |
| @item gnu |
| Warnings related to the GNU Coding Standards |
| (@pxref{Top,,, standards, The GNU Coding Standards}). |
| On by default. |
| |
| @item obsolete |
| Warnings about obsolete features. On by default. |
| |
| @item override |
| Warnings about redefinitions of Autoconf internals. |
| |
| @item portability |
| Warnings about non-portable constructs. |
| |
| @item portability-recursive |
| Warnings about recursive Make variable expansions (@code{$(foo$(x))}). |
| |
| @item extra-portability |
| Extra warnings about non-portable constructs, covering rarely-used |
| tools. |
| |
| @item syntax |
| Warnings about questionable syntactic constructs, incorrectly ordered |
| macro calls, typos, etc. On by default. |
| |
| @item unsupported |
| Warnings about unsupported features. On by default. |
| @end table |
| |
| @strong{Hacking Note:} The set of categories is defined by code in |
| @command{autom4te}, not by M4sugar itself. Additions should be |
| coordinated with Automake, so that both sets of tools accept the same |
| options. |
| @end defmac |
| |
| @node Diversion support |
| @subsection Diversion support |
| |
| M4sugar makes heavy use of diversions under the hood, because it is |
| often the case that |
| text that must appear early in the output is not discovered until late |
| in the input. Additionally, some of the topological sorting algorithms |
| used in resolving macro dependencies use diversions. However, most |
| macros should not need to change diversions directly, but rather rely on |
| higher-level M4sugar macros to manage diversions transparently. If you |
| change diversions improperly, you risk generating a syntactically |
| invalid script, because an incorrect diversion will violate assumptions |
| made by many macros about whether prerequisite text has been previously |
| output. In short, if you manually change the diversion, you should not |
| expect any macros provided by the Autoconf package to work until you |
| have restored the diversion stack back to its original state. |
| |
| In the rare case that it is necessary to write a macro that explicitly |
| outputs text to a different diversion, it is important to be aware of an |
| M4 limitation regarding diversions: text only goes to a diversion if it |
| is not part of argument collection. Therefore, any macro that changes |
| the current diversion cannot be used as an unquoted argument to another |
| macro, but must be expanded at the top level. The macro |
| @code{m4_expand} will diagnose any attempt to change diversions, since |
| it is generally useful only as an argument to another macro. The |
| following example shows what happens when diversion manipulation is |
| attempted within macro arguments: |
| |
| @example |
| m4_do([normal text] |
| m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL]) |
| [m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl |
| @result{}normal text |
| @result{}unwanted |
| @end example |
| |
| @noindent |
| Notice that the unquoted text @code{unwanted} is output, even though it |
| was processed while the current diversion was @code{KILL}, because it |
| was collected as part of the argument to @code{m4_do}. However, the |
| text @code{discarded} disappeared as desired, because the diversion |
| changes were single-quoted, and were not expanded until the top-level |
| rescan of the output of @code{m4_do}. |
| |
| To make diversion management easier, M4sugar uses the concept of named |
| diversions. Rather than using diversion numbers directly, it is nicer |
| to associate a name with each diversion. The diversion number associated |
| with a particular diversion name is an implementation detail, and a |
| syntax warning is issued if a diversion number is used instead of a |
| name. In general, you should not output text |
| to a named diversion until after calling the appropriate initialization |
| routine for your language (@code{m4_init}, @code{AS_INIT}, |
| @code{AT_INIT}, @dots{}), although there are some exceptions documented |
| below. |
| |
| M4sugar defines two named diversions. |
| @table @code |
| @item KILL |
| Text written to this diversion is discarded. This is the default |
| diversion once M4sugar is initialized. |
| @item GROW |
| This diversion is used behind the scenes by topological sorting macros, |
| such as @code{AC_REQUIRE}. |
| @end table |
| |
| M4sh adds several more named diversions. |
| @table @code |
| @item BINSH |
| This diversion is reserved for the @samp{#!} interpreter line. |
| @item HEADER-REVISION |
| This diversion holds text from @code{AC_REVISION}. |
| @item HEADER-COMMENT |
| This diversion holds comments about the purpose of a file. |
| @item HEADER-COPYRIGHT |
| This diversion is managed by @code{AC_COPYRIGHT}. |
| @item M4SH-SANITIZE |
| This diversion contains M4sh sanitization code, used to ensure M4sh is |
| executing in a reasonable shell environment. |
| @item M4SH-INIT |
| This diversion contains M4sh initialization code, initializing variables |
| that are required by other M4sh macros. |
| @item BODY |
| This diversion contains the body of the shell code, and is the default |
| diversion once M4sh is initialized. |
| @end table |
| |
| Autotest inherits diversions from M4sh, and changes the default |
| diversion from @code{BODY} back to @code{KILL}. It also adds several |
| more named diversions, with the following subset designed for developer |
| use. |
| @table @code |
| @item PREPARE_TESTS |
| This diversion contains initialization sequences which are executed |
| after @file{atconfig} and @file{atlocal}, and after all command line |
| arguments have been parsed, but prior to running any tests. It can be |
| used to set up state that is required across all tests. This diversion |
| will work even before @code{AT_INIT}. |
| @end table |
| |
| Autoconf inherits diversions from M4sh, and adds the following named |
| diversions which developers can utilize. |
| @table @code |
| @item DEFAULTS |
| This diversion contains shell variable assignments to set defaults that |
| must be in place before arguments are parsed. This diversion is placed |
| early enough in @file{configure} that it is unsafe to expand any |
| autoconf macros into this diversion. |
| @item HELP_ENABLE |
| If @code{AC_PRESERVE_HELP_ORDER} was used, then text placed in this |
| diversion will be included as part of a quoted here-doc providing all of |
| the @option{--help} output of @file{configure} related to options |
| created by @code{AC_ARG_WITH} and @code{AC_ARG_ENABLE}. |
| @item INIT_PREPARE |
| This diversion occurs after all command line options have been parsed, |
| but prior to the main body of the @file{configure} script. This |
| diversion is the last chance to insert shell code such as variable |
| assignments or shell function declarations that will used by the |
| expansion of other macros. |
| @end table |
| |
| For now, the remaining named diversions of Autoconf, Autoheader, and |
| Autotest are not documented. In other words, |
| intentionally outputting text into an undocumented diversion is subject |
| to breakage in a future release of Autoconf. |
| |
| @defmac m4_cleardivert (@var{diversion}@dots{}) |
| @msindex{cleardivert} |
| Permanently discard any text that has been diverted into |
| @var{diversion}. |
| @end defmac |
| |
| @defmac m4_divert_once (@var{diversion}, @ovar{content}) |
| @msindex{divert_once} |
| Similar to @code{m4_divert_text}, except that @var{content} is only |
| output to @var{diversion} if this is the first time that |
| @code{m4_divert_once} has been called with its particular arguments. |
| @end defmac |
| |
| @defmac m4_divert_pop (@ovar{diversion}) |
| @msindex{divert_pop} |
| If provided, check that the current diversion is indeed @var{diversion}. |
| Then change to the diversion located earlier on the stack, giving an |
| error if an attempt is made to pop beyond the initial m4sugar diversion |
| of @code{KILL}. |
| @end defmac |
| |
| @defmac m4_divert_push (@var{diversion}) |
| @msindex{divert_push} |
| Remember the former diversion on the diversion stack, and output |
| subsequent text into @var{diversion}. M4sugar maintains a diversion |
| stack, and issues an error if there is not a matching pop for every |
| push. |
| @end defmac |
| |
| @anchor{m4_divert_text} |
| @defmac m4_divert_text (@var{diversion}, @ovar{content}) |
| @msindex{divert_text} |
| Output @var{content} and a newline into @var{diversion}, without |
| affecting the current diversion. Shorthand for: |
| @example |
| m4_divert_push([@var{diversion}])@var{content} |
| m4_divert_pop([@var{diversion}])dnl |
| @end example |
| |
| One use of @code{m4_divert_text} is to develop two related macros, where |
| macro @samp{MY_A} does the work, but adjusts what work is performed |
| based on whether the optional macro @samp{MY_B} has also been expanded. |
| Of course, it is possible to use @code{AC_BEFORE} within @code{MY_A} to |
| require that @samp{MY_B} occurs first, if it occurs at all. But this |
| imposes an ordering restriction on the user; it would be nicer if macros |
| @samp{MY_A} and @samp{MY_B} can be invoked in either order. The trick |
| is to let @samp{MY_B} leave a breadcrumb in an early diversion, which |
| @samp{MY_A} can then use to determine whether @samp{MY_B} has been |
| expanded. |
| |
| @example |
| AC_DEFUN([MY_A], |
| [# various actions |
| if test -n "$b_was_used"; then |
| # extra action |
| fi]) |
| AC_DEFUN([MY_B], |
| [AC_REQUIRE([MY_A])dnl |
| m4_divert_text([INIT_PREPARE], [b_was_used=true])]) |
| @end example |
| |
| @end defmac |
| |
| @defmac m4_init |
| @msindex{init} |
| Initialize the M4sugar environment, setting up the default named |
| diversion to be @code{KILL}. |
| @end defmac |
| |
| @node Conditional constructs |
| @subsection Conditional constructs |
| |
| The following macros provide additional conditional constructs as |
| convenience wrappers around @code{m4_if}. |
| |
| @defmac m4_bmatch (@var{string}, @var{regex-1}, @var{value-1}, @ |
| @ovar{regex-2}, @ovar{value-2}, @dots{}, @ovar{default}) |
| @msindex{bmatch} |
| The string @var{string} is repeatedly compared against a series of |
| @var{regex} arguments; if a match is found, the expansion is the |
| corresponding @var{value}, otherwise, the macro moves on to the next |
| @var{regex}. If no @var{regex} match, then the result is the optional |
| @var{default}, or nothing. |
| @end defmac |
| |
| @defmac m4_bpatsubsts (@var{string}, @var{regex-1}, @var{subst-1}, @ |
| @ovar{regex-2}, @ovar{subst-2}, @dots{}) |
| @msindex{bpatsubsts} |
| The string @var{string} is altered by @var{regex-1} and @var{subst-1}, |
| as if by: |
| @example |
| m4_bpatsubst([[@var{string}]], [@var{regex}], [@var{subst}]) |
| @end example |
| |
| @noindent |
| The result of the substitution is then passed through the next set of |
| @var{regex} and @var{subst}, and so forth. An empty @var{subst} implies |
| deletion of any matched portions in the current string. Note that this |
| macro over-quotes @var{string}; this behavior is intentional, so that |
| the result of each step of the recursion remains as a quoted string. |
| However, it means that anchors (@samp{^} and @samp{$} in the @var{regex} |
| will line up with the extra quotations, and not the characters of the |
| original string. The overquoting is removed after the final |
| substitution. |
| @end defmac |
| |
| @defmac m4_case (@var{string}, @var{value-1}, @var{if-value-1}, @ |
| @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default}) |
| @msindex{case} |
| Test @var{string} against multiple @var{value} possibilities, resulting |
| in the first @var{if-value} for a match, or in the optional |
| @var{default}. This is shorthand for: |
| @example |
| m4_if([@var{string}], [@var{value-1}], [@var{if-value-1}], |
| [@var{string}], [@var{value-2}], [@var{if-value-2}], @dots{}, |
| [@var{default}]) |
| @end example |
| @end defmac |
| |
| @defmac m4_cond (@var{test-1}, @var{value-1}, @var{if-value-1}, @ |
| @ovar{test-2}, @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default}) |
| @msindex{cond} |
| This macro was introduced in Autoconf 2.62. Similar to @code{m4_if}, |
| except that each @var{test} is expanded only when it is encountered. |
| This is useful for short-circuiting expensive tests; while @code{m4_if} |
| requires all its strings to be expanded up front before doing |
| comparisons, @code{m4_cond} only expands a @var{test} when all earlier |
| tests have failed. |
| |
| For an example, these two sequences give the same result, but in the |
| case where @samp{$1} does not contain a backslash, the @code{m4_cond} |
| version only expands @code{m4_index} once, instead of five times, for |
| faster computation if this is a common case for @samp{$1}. Notice that |
| every third argument is unquoted for @code{m4_if}, and quoted for |
| @code{m4_cond}: |
| |
| @example |
| m4_if(m4_index([$1], [\]), [-1], [$2], |
| m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2], |
| m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2], |
| m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3], |
| m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3], |
| [$2]) |
| m4_cond([m4_index([$1], [\])], [-1], [$2], |
| [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2], |
| [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2], |
| [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3], |
| [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3], |
| [$2]) |
| @end example |
| @end defmac |
| |
| @defmac m4_default (@var{expr-1}, @var{expr-2}) |
| @defmacx m4_default_quoted (@var{expr-1}, @var{expr-2}) |
| @defmacx m4_default_nblank (@var{expr-1}, @ovar{expr-2}) |
| @defmacx m4_default_nblank_quoted (@var{expr-1}, @ovar{expr-2}) |
| @msindex{default} |
| @msindex{default_quoted} |
| @msindex{default_nblank} |
| @msindex{default_nblank_quoted} |
| If @var{expr-1} contains text, use it. Otherwise, select @var{expr-2}. |
| @code{m4_default} expands the result, while @code{m4_default_quoted} |
| does not. Useful for providing a fixed default if the expression that |
| results in @var{expr-1} would otherwise be empty. The difference |
| between @code{m4_default} and @code{m4_default_nblank} is whether an |
| argument consisting of just blanks (space, tab, newline) is |
| significant. When using the expanding versions, note that an argument |
| may contain text but still expand to an empty string. |
| |
| @example |
| m4_define([active], [ACTIVE])dnl |
| m4_define([empty], [])dnl |
| m4_define([demo1], [m4_default([$1], [$2])])dnl |
| m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl |
| m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl |
| m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl |
| demo1([active], [default]) |
| @result{}ACTIVE |
| demo1([], [active]) |
| @result{}ACTIVE |
| demo1([empty], [text]) |
| @result{} |
| -demo1([ ], [active])- |
| @result{}- - |
| demo2([active], [default]) |
| @result{}active |
| demo2([], [active]) |
| @result{}active |
| demo2([empty], [text]) |
| @result{}empty |
| -demo2([ ], [active])- |
| @result{}- - |
| demo3([active], [default]) |
| @result{}ACTIVE |
| demo3([], [active]) |
| @result{}ACTIVE |
| demo3([empty], [text]) |
| @result{} |
| -demo3([ ], [active])- |
| @result{}-ACTIVE- |
| demo4([active], [default]) |
| @result{}active |
| demo4([], [active]) |
| @result{}active |
| demo4([empty], [text]) |
| @result{}empty |
| -demo4([ ], [active])- |
| @result{}-active- |
| @end example |
| @end defmac |
| |
| @defmac m4_define_default (@var{macro}, @ovar{default-definition}) |
| @msindex{define_default} |
| If @var{macro} does not already have a definition, then define it to |
| @var{default-definition}. |
| @end defmac |
| |
| @defmac m4_ifblank (@var{cond}, @ovar{if-blank}, @ovar{if-text}) |
| @defmacx m4_ifnblank (@var{cond}, @ovar{if-text}, @ovar{if-blank}) |
| @msindex{ifblank} |
| @msindex{ifnblank} |
| If @var{cond} is empty or consists only of blanks (space, tab, newline), |
| then expand @var{if-blank}; otherwise, expand @var{if-text}. Two |
| variants exist, in order to make it easier to select the correct logical |
| sense when using only two parameters. Note that this is more efficient |
| than the equivalent behavior of: |
| @example |
| m4_ifval(m4_normalize([@var{cond}]), @var{if-text}, @var{if-blank}) |
| @end example |
| @end defmac |
| |
| @defmac m4_ifndef (@var{macro}, @var{if-not-defined}, @ovar{if-defined}) |
| @msindex{ifndef} |
| This is shorthand for: |
| @example |
| m4_ifdef([@var{macro}], [@var{if-defined}], [@var{if-not-defined}]) |
| @end example |
| @end defmac |
| |
| @defmac m4_ifset (@var{macro}, @ovar{if-true}, @ovar{if-false}) |
| @msindex{ifset} |
| If @var{macro} is undefined, or is defined as the empty string, expand |
| to @var{if-false}. Otherwise, expands to @var{if-true}. Similar to: |
| @example |
| m4_ifval(m4_defn([@var{macro}]), [@var{if-true}], [@var{if-false}]) |
| @end example |
| @noindent |
| except that it is not an error if @var{macro} is undefined. |
| @end defmac |
| |
| @defmac m4_ifval (@var{cond}, @ovar{if-true}, @ovar{if-false}) |
| @msindex{ifval} |
| Expands to @var{if-true} if @var{cond} is not empty, otherwise to |
| @var{if-false}. This is shorthand for: |
| @example |
| m4_if([@var{cond}], [], [@var{if-false}], [@var{if-true}]) |
| @end example |
| @end defmac |
| |
| @defmac m4_ifvaln (@var{cond}, @ovar{if-true}, @ovar{if-false}) |
| @msindex{ifvaln} |
| Similar to @code{m4_ifval}, except guarantee that a newline is present |
| after any non-empty expansion. Often followed by @code{dnl}. |
| @end defmac |
| |
| @defmac m4_n (@var{text}) |
| @msindex{n} |
| Expand to @var{text}, and add a newline if @var{text} is not empty. |
| Often followed by @code{dnl}. |
| @end defmac |
| |
| |
| @node Looping constructs |
| @subsection Looping constructs |
| |
| The following macros are useful in implementing recursive algorithms in |
| M4, including loop operations. An M4 list is formed by quoting a list |
| of quoted elements; generally the lists are comma-separated, although |
| @code{m4_foreach_w} is whitespace-separated. For example, the list |
| @samp{[[a], [b,c]]} contains two elements: @samp{[a]} and @samp{[b,c]}. |
| It is common to see lists with unquoted elements when those elements are |
| not likely to be macro names, as in @samp{[fputc_unlocked, |
| fgetc_unlocked]}. |
| |
| Although not generally recommended, it is possible for quoted lists to |
| have side effects; all side effects are expanded only once, and prior to |
| visiting any list element. On the other hand, the fact that unquoted |
| macros are expanded exactly once means that macros without side effects |
| can be used to generate lists. For example, |
| |
| @example |
| m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i]) |
| @error{}hi |
| @result{}123 |
| m4_define([list], [[1], [2], [3]]) |
| @result{} |
| m4_foreach([i], [list], [i]) |
| @result{}123 |
| @end example |
| |
| @defmac m4_argn (@var{n}, @ovar{arg}@dots{}) |
| @msindex{argn} |
| Extracts argument @var{n} (larger than 0) from the remaining arguments. |
| If there are too few arguments, the empty string is used. For any |
| @var{n} besides 1, this is more efficient than the similar |
| @samp{m4_car(m4_shiftn([@var{n}], [], [@var{arg}@dots{}]))}. |
| @end defmac |
| |
| @defmac m4_car (@var{arg}@dots{}) |
| @msindex{car} |
| Expands to the quoted first @var{arg}. Can be used with @code{m4_cdr} |
| to recursively iterate |
| through a list. Generally, when using quoted lists of quoted elements, |
| @code{m4_car} should be called without any extra quotes. |
| @end defmac |
| |
| @defmac m4_cdr (@var{arg}@dots{}) |
| @msindex{cdr} |
| Expands to a quoted list of all but the first @var{arg}, or the empty |
| string if there was only one argument. Generally, when using quoted |
| lists of quoted elements, @code{m4_cdr} should be called without any |
| extra quotes. |
| |
| For example, this is a simple implementation of @code{m4_map}; note how |
| each iteration checks for the end of recursion, then merely applies the |
| first argument to the first element of the list, then repeats with the |
| rest of the list. (The actual implementation in M4sugar is a bit more |
| involved, to gain some speed and share code with @code{m4_map_sep}, and |
| also to avoid expanding side effects in @samp{$2} twice). |
| @example |
| m4_define([m4_map], [m4_ifval([$2], |
| [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl |
| m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]]) |
| @result{} 1 2 a |
| @end example |
| @end defmac |
| |
| @defmac m4_for (@var{var}, @var{first}, @var{last}, @ovar{step}, @ |
| @var{expression}) |
| @msindex{for} |
| Loop over the numeric values between @var{first} and @var{last} |
| including bounds by increments of @var{step}. For each iteration, |
| expand @var{expression} with the numeric value assigned to @var{var}. |
| If @var{step} is omitted, it defaults to @samp{1} or @samp{-1} depending |
| on the order of the limits. If given, @var{step} has to match this |
| order. The number of iterations is determined independently from |
| definition of @var{var}; iteration cannot be short-circuited or |
| lengthened by modifying @var{var} from within @var{expression}. |
| @end defmac |
| |
| @defmac m4_foreach (@var{var}, @var{list}, @var{expression}) |
| @msindex{foreach} |
| Loop over the comma-separated M4 list @var{list}, assigning each value |
| to @var{var}, and expand @var{expression}. The following example |
| outputs two lines: |
| |
| @example |
| m4_foreach([myvar], [[foo], [bar, baz]], |
| [echo myvar |
| ])dnl |
| @result{}echo foo |
| @result{}echo bar, baz |
| @end example |
| |
| Note that for some forms of @var{expression}, it may be faster to use |
| @code{m4_map_args}. |
| @end defmac |
| |
| @anchor{m4_foreach_w} |
| @defmac m4_foreach_w (@var{var}, @var{list}, @var{expression}) |
| @msindex{foreach_w} |
| Loop over the white-space-separated list @var{list}, assigning each value |
| to @var{var}, and expand @var{expression}. If @var{var} is only |
| referenced once in @var{expression}, it is more efficient to use |
| @code{m4_map_args_w}. |
| |
| The deprecated macro @code{AC_FOREACH} is an alias of |
| @code{m4_foreach_w}. |
| @end defmac |
| |
| @defmac m4_map (@var{macro}, @var{list}) |
| @defmacx m4_mapall (@var{macro}, @var{list}) |
| @defmacx m4_map_sep (@var{macro}, @var{separator}, @var{list}) |
| @defmacx m4_mapall_sep (@var{macro}, @var{separator}, @var{list}) |
| @msindex{map} |
| @msindex{mapall} |
| @msindex{map_sep} |
| @msindex{mapall_sep} |
| Loop over the comma separated quoted list of argument descriptions in |
| @var{list}, and invoke @var{macro} with the arguments. An argument |
| description is in turn a comma-separated quoted list of quoted elements, |
| suitable for @code{m4_apply}. The macros @code{m4_map} and |
| @code{m4_map_sep} ignore empty argument descriptions, while |
| @code{m4_mapall} and @code{m4_mapall_sep} invoke @var{macro} with no |
| arguments. The macros @code{m4_map_sep} and @code{m4_mapall_sep} |
| additionally expand @var{separator} between invocations of @var{macro}. |
| |
| Note that @var{separator} is expanded, unlike in @code{m4_join}. When |
| separating output with commas, this means that the map result can be |
| used as a series of arguments, by using a single-quoted comma as |
| @var{separator}, or as a single string, by using a double-quoted comma. |
| |
| @example |
| m4_map([m4_count], []) |
| @result{} |
| m4_map([ m4_count], [[], |
| [[1]], |
| [[1], [2]]]) |
| @result{} 1 2 |
| m4_mapall([ m4_count], [[], |
| [[1]], |
| [[1], [2]]]) |
| @result{} 0 1 2 |
| m4_map_sep([m4_eval], [,], [[[1+2]], |
| [[10], [16]]]) |
| @result{}3,a |
| m4_map_sep([m4_echo], [,], [[[a]], [[b]]]) |
| @result{}a,b |
| m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]])) |
| @result{}2 |
| m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]) |
| @result{}a,b |
| m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])) |
| @result{}1 |
| @end example |
| @end defmac |
| |
| @defmac m4_map_args (@var{macro}, @var{arg}@dots{}) |
| @msindex{map_args} |
| Repeatedly invoke @var{macro} with each successive @var{arg} as its only |
| argument. In the following example, three solutions are presented with |
| the same expansion; the solution using @code{m4_map_args} is the most |
| efficient. |
| @example |
| m4_define([active], [ACTIVE])dnl |
| m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))]) |
| @result{} plain active |
| m4_map([ m4_echo], [[[plain]], [[active]]]) |
| @result{} plain active |
| m4_map_args([ m4_echo], [plain], [active]) |
| @result{} plain active |
| @end example |
| |
| In cases where it is useful to operate on additional parameters besides |
| the list elements, the macro @code{m4_curry} can be used in @var{macro} |
| to supply the argument currying necessary to generate the desired |
| argument list. In the following example, @code{list_add_n} is more |
| efficient than @code{list_add_x}. On the other hand, using |
| @code{m4_map_args_sep} can be even more efficient. |
| |
| @example |
| m4_define([list], [[1], [2], [3]])dnl |
| m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl |
| dnl list_add_n(N, ARG...) |
| dnl Output a list consisting of each ARG added to N |
| m4_define([list_add_n], |
| [m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@@)))])dnl |
| list_add_n([1], list) |
| @result{}2,3,4 |
| list_add_n([2], list) |
| @result{}3,4,5 |
| m4_define([list_add_x], |
| [m4_shift(m4_foreach([var], m4_dquote(m4_shift($@@)), |
| [,add([$1],m4_defn([var]))]))])dnl |
| list_add_x([1], list) |
| @result{}2,3,4 |
| @end example |
| @end defmac |
| |
| @defmac m4_map_args_pair (@var{macro}, @dvarv{macro-end, macro}, @ |
| @var{arg}@dots{}) |
| @msindex{map_args_pair} |
| For every pair of arguments @var{arg}, invoke @var{macro} with two |
| arguments. If there is an odd number of arguments, invoke |
| @var{macro-end}, which defaults to @var{macro}, with the remaining |
| argument. |
| |
| @example |
| m4_map_args_pair([, m4_reverse], [], [1], [2], [3]) |
| @result{}, 2, 1, 3 |
| m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3]) |
| @result{}, 2, 1, [3] |
| m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4]) |
| @result{}, 2, 1, 4, 3 |
| @end example |
| @end defmac |
| |
| @defmac m4_map_args_sep (@ovar{pre}, @ovar{post}, @ovar{sep}, @var{arg}@dots{}) |
| @msindex{map_args_sep} |
| Expand the sequence @code{@var{pre}[@var{arg}]@var{post}} for each |
| argument, additionally expanding @var{sep} between arguments. One |
| common use of this macro is constructing a macro call, where the opening |
| and closing parentheses are split between @var{pre} and @var{post}; in |
| particular, @code{m4_map_args([@var{macro}], [@var{arg}])} is equivalent |
| to @code{m4_map_args_sep([@var{macro}(], [)], [], [@var{arg}])}. This |
| macro provides the most efficient means for iterating over an arbitrary |
| list of arguments, particularly when repeatedly constructing a macro |
| call with more arguments than @var{arg}. |
| @end defmac |
| |
| @defmac m4_map_args_w (@var{string}, @ovar{pre}, @ovar{post}, @ovar{sep}) |
| @msindex{map_args_w} |
| Expand the sequence @code{@var{pre}[word]@var{post}} for each word in |
| the whitespace-separated @var{string}, additionally expanding @var{sep} |
| between words. This macro provides the most efficient means for |
| iterating over a whitespace-separated string. In particular, |
| @code{m4_map_args_w([@var{string}], [@var{action}(], [)])} is more |
| efficient than @code{m4_foreach_w([var], [@var{string}], |
| [@var{action}(m4_defn([var]))])}. |
| @end defmac |
| |
| @defmac m4_shiftn (@var{count}, @dots{}) |
| @defmacx m4_shift2 (@dots{}) |
| @defmacx m4_shift3 (@dots{}) |
| @msindex{shift2} |
| @msindex{shift3} |
| @msindex{shiftn} |
| @code{m4_shiftn} performs @var{count} iterations of @code{m4_shift}, |
| along with validation that enough arguments were passed in to match the |
| shift count, and that the count is positive. @code{m4_shift2} and |
| @code{m4_shift3} are specializations |
| of @code{m4_shiftn}, introduced in Autoconf 2.62, and are more efficient |
| for two and three shifts, respectively. |
| @end defmac |
| |
| @defmac m4_stack_foreach (@var{macro}, @var{action}) |
| @defmacx m4_stack_foreach_lifo (@var{macro}, @var{action}) |
| @msindex{stack_foreach} |
| @msindex{stack_foreach_lifo} |
| For each of the @code{m4_pushdef} definitions of @var{macro}, expand |
| @var{action} with the single argument of a definition of @var{macro}. |
| @code{m4_stack_foreach} starts with the oldest definition, while |
| @code{m4_stack_foreach_lifo} starts with the current definition. |
| @var{action} should not push or pop definitions of @var{macro}, nor is |
| there any guarantee that the current definition of @var{macro} matches |
| the argument that was passed to @var{action}. The macro @code{m4_curry} |
| can be used if @var{action} needs more than one argument, although in |
| that case it is more efficient to use @var{m4_stack_foreach_sep}. |
| |
| Due to technical limitations, there are a few low-level m4sugar |
| functions, such as @code{m4_pushdef}, that cannot be used as the |
| @var{macro} argument. |
| |
| @example |
| m4_pushdef([a], [1])m4_pushdef([a], [2])dnl |
| m4_stack_foreach([a], [ m4_incr]) |
| @result{} 2 3 |
| m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])]) |
| @result{} cd bcd |
| @end example |
| @end defmac |
| |
| @defmac m4_stack_foreach_sep (@var{macro}, @ovar{pre}, @ovar{post}, @ovar{sep}) |
| @defmacx m4_stack_foreach_sep_lifo (@var{macro}, @ovar{pre}, @ovar{post}, @ |
| @ovar{sep}) |
| @msindex{stack_foreach_sep} |
| @msindex{stack_foreach_sep_lifo} |
| Expand the sequence @code{@var{pre}[definition]@var{post}} for each |
| @code{m4_pushdef} definition of @var{macro}, additionally expanding |
| @var{sep} between definitions. @code{m4_stack_foreach_sep} visits the |
| oldest definition first, while @code{m4_stack_foreach_sep_lifo} visits |
| the current definition first. This macro provides the most efficient |
| means for iterating over a pushdef stack. In particular, |
| @code{m4_stack_foreach([@var{macro}], [@var{action}])} is short for |
| @code{m4_stack_foreach_sep([@var{macro}], [@var{action}(], [)])}. |
| @end defmac |
| |
| @node Evaluation Macros |
| @subsection Evaluation Macros |
| |
| The following macros give some control over the order of the evaluation |
| by adding or removing levels of quotes. |
| |
| @defmac m4_apply (@var{macro}, @var{list}) |
| @msindex{apply} |
| Apply the elements of the quoted, comma-separated @var{list} as the |
| arguments to @var{macro}. If @var{list} is empty, invoke @var{macro} |
| without arguments. Note the difference between @code{m4_indir}, which |
| expects its first argument to be a macro name but can use names that are |
| otherwise invalid, and @code{m4_apply}, where @var{macro} can contain |
| other text, but must end in a valid macro name. |
| @example |
| m4_apply([m4_count], []) |
| @result{}0 |
| m4_apply([m4_count], [[]]) |
| @result{}1 |
| m4_apply([m4_count], [[1], [2]]) |
| @result{}2 |
| m4_apply([m4_join], [[|], [1], [2]]) |
| @result{}1|2 |
| @end example |
| @end defmac |
| |
| @defmac m4_count (@var{arg}, @dots{}) |
| @msindex{count} |
| This macro returns the number of arguments it was passed. |
| @end defmac |
| |
| @defmac m4_curry (@var{macro}, @var{arg}@dots{}) |
| @msindex{curry} |
| This macro performs argument currying. The expansion of this macro is |
| another macro name that expects exactly one argument; that argument is |
| then appended to the @var{arg} list, and then @var{macro} is expanded |
| with the resulting argument list. |
| |
| @example |
| m4_curry([m4_curry], [m4_reverse], [1])([2])([3]) |
| @result{}3, 2, 1 |
| @end example |
| |
| Unfortunately, due to a limitation in M4 1.4.x, it is not possible to |
| pass the definition of a builtin macro as the argument to the output of |
| @code{m4_curry}; the empty string is used instead of the builtin token. |
| This behavior is rectified by using M4 1.6 or newer. |
| @end defmac |
| |
| @defmac m4_do (@var{arg}, @dots{}) |
| @msindex{do} |
| This macro loops over its arguments and expands each @var{arg} in |
| sequence. Its main use is for readability; it allows the use of |
| indentation and fewer @code{dnl} to result in the same expansion. This |
| macro guarantees that no expansion will be concatenated with subsequent |
| text; to achieve full concatenation, use @code{m4_unquote(m4_join([], |
| @var{arg@dots{}}))}. |
| |
| @example |
| m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl |
| m4_do([a],[b])c |
| @result{}abc |
| m4_unquote(m4_join([],[a],[b]))c |
| @result{}3 |
| m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl |
| m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl |
| m4_do([a],[b])c |
| @result{}ABC |
| m4_unquote(m4_join([],[a],[b]))c |
| @result{}3 |
| @end example |
| @end defmac |
| |
| @defmac m4_dquote (@var{arg}, @dots{}) |
| @msindex{dquote} |
| Return the arguments as a quoted list of quoted arguments. |
| Conveniently, if there is just one @var{arg}, this effectively adds a |
| level of quoting. |
| @end defmac |
| |
| @defmac m4_dquote_elt (@var{arg}, @dots{}) |
| @msindex{dquote_elt} |
| Return the arguments as a series of double-quoted arguments. Whereas |
| @code{m4_dquote} returns a single argument, @code{m4_dquote_elt} returns |
| as many arguments as it was passed. |
| @end defmac |
| |
| @defmac m4_echo (@var{arg}, @dots{}) |
| @msindex{echo} |
| Return the arguments, with the same level of quoting. Other than |
| discarding whitespace after unquoted commas, this macro is a no-op. |
| @end defmac |
| |
| @defmac m4_expand (@var{arg}) |
| @msindex{expand} |
| Return the expansion of @var{arg} as a quoted string. Whereas |
| @code{m4_quote} is designed to collect expanded text into a single |
| argument, @code{m4_expand} is designed to perform one level of expansion |
| on quoted text. One distinction is in the treatment of whitespace |
| following a comma in the original @var{arg}. Any time multiple |
| arguments are collected into one with @code{m4_quote}, the M4 argument |
| collection rules discard the whitespace. However, with @code{m4_expand}, |
| whitespace is preserved, even after the expansion of macros contained in |
| @var{arg}. Additionally, @code{m4_expand} is able to expand text that |
| would involve an unterminated comment, whereas expanding that same text |
| as the argument to @code{m4_quote} runs into difficulty in finding the |
| end of the argument. Since manipulating diversions during argument |
| collection is inherently unsafe, @code{m4_expand} issues an error if |
| @var{arg} attempts to change the current diversion (@pxref{Diversion |
| support}). |
| |
| @example |
| m4_define([active], [ACT, IVE])dnl |
| m4_define([active2], [[ACT, IVE]])dnl |
| m4_quote(active, active) |
| @result{}ACT,IVE,ACT,IVE |
| m4_expand([active, active]) |
| @result{}ACT, IVE, ACT, IVE |
| m4_quote(active2, active2) |
| @result{}ACT, IVE,ACT, IVE |
| m4_expand([active2, active2]) |
| @result{}ACT, IVE, ACT, IVE |
| m4_expand([# m4_echo]) |
| @result{}# m4_echo |
| m4_quote(# m4_echo) |
| ) |
| @result{}# m4_echo) |
| @result{} |
| @end example |
| |
| Note that @code{m4_expand} cannot handle an @var{arg} that expands to |
| literal unbalanced quotes, but that quadrigraphs can be used when |
| unbalanced output is necessary. Likewise, unbalanced parentheses should |
| be supplied with double quoting or a quadrigraph. |
| |
| @example |
| m4_define([pattern], [[!@@<:@@]])dnl |
| m4_define([bar], [BAR])dnl |
| m4_expand([case $foo in |
| m4_defn([pattern])@@:@}@@ bar ;; |
| *[)] blah ;; |
| esac]) |
| @result{}case $foo in |
| @result{} [![]) BAR ;; |
| @result{} *) blah ;; |
| @result{}esac |
| @end example |
| @end defmac |
| |
| @defmac m4_ignore (@dots{}) |
| @msindex{ignore} |
| This macro was introduced in Autoconf 2.62. Expands to nothing, |
| ignoring all of its arguments. By itself, this isn't very useful. |
| However, it can be used to conditionally ignore an arbitrary number of |
| arguments, by deciding which macro name to apply to a list of arguments. |
| @example |
| dnl foo outputs a message only if [debug] is defined. |
| m4_define([foo], |
| [m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])]) |
| @end example |
| |
| Note that for earlier versions of Autoconf, the macro @code{__gnu__} can |
| serve the same purpose, although it is less readable. |
| @end defmac |
| |
| @defmac m4_make_list (@var{arg}, @dots{}) |
| @msindex{make_list} |
| This macro exists to aid debugging of M4sugar algorithms. Its net |
| effect is similar to @code{m4_dquote}---it produces a quoted list of |
| quoted arguments, for each @var{arg}. The difference is that this |
| version uses a comma-newline separator instead of just comma, to improve |
| readability of the list; with the result that it is less efficient than |
| @code{m4_dquote}. |
| @example |
| m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl |
| m4_dquote(zero, [one], [[two]]) |
| @result{}[0],[one],[[two]] |
| m4_make_list(zero, [one], [[two]]) |
| @result{}[0], |
| @result{}[one], |
| @result{}[[two]] |
| m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number]) |
| @result{} 0 1 two |
| m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number]) |
| @result{} 0 1 two |
| @end example |
| @end defmac |
| |
| @c m4_noquote is too dangerous to document - it invokes macros that |
| @c probably rely on @samp{[]} nested quoting for proper operation. The |
| @c user should generally prefer m4_unquote instead. |
| |
| @defmac m4_quote (@var{arg}, @dots{}) |
| @msindex{quote} |
| Return the arguments as a single entity, i.e., wrap them into a pair of |
| quotes. This effectively collapses multiple arguments into one, |
| although it loses whitespace after unquoted commas in the process. |
| @end defmac |
| |
| @defmac m4_reverse (@var{arg}, @dots{}) |
| @msindex{reverse} |
| Outputs each argument with the same level of quoting, but in reverse |
| order, and with space following each comma for readability. |
| |
| @example |
| m4_define([active], [ACT,IVE]) |
| @result{} |
| m4_reverse(active, [active]) |
| @result{}active, IVE, ACT |
| @end example |
| @end defmac |
| |
| @defmac m4_unquote (@var{arg}, @dots{}) |
| @msindex{unquote} |
| This macro was introduced in Autoconf 2.62. Expand each argument, |
| separated by commas. For a single @var{arg}, this effectively removes a |
| layer of quoting, and @code{m4_unquote([@var{arg}])} is more efficient |
| than the equivalent @code{m4_do([@var{arg}])}. For multiple arguments, |
| this results in an unquoted list of expansions. This is commonly used |
| with @code{m4_split}, in order to convert a single quoted list into a |
| series of quoted elements. |
| @end defmac |
| |
| The following example aims at emphasizing the difference between several |
| scenarios: not using these macros, using @code{m4_defn}, using |
| @code{m4_quote}, using @code{m4_dquote}, and using @code{m4_expand}. |
| |
| @example |
| $ @kbd{cat example.m4} |
| dnl Overquote, so that quotes are visible. |
| m4_define([show], [$[]1 = [$1], $[]@@ = [$@@]]) |
| m4_define([a], [A]) |
| m4_define([mkargs], [1, 2[,] 3]) |
| m4_define([arg1], [[$1]]) |
| m4_divert([0])dnl |
| show(a, b) |
| show([a, b]) |
| show(m4_quote(a, b)) |
| show(m4_dquote(a, b)) |
| show(m4_expand([a, b])) |
| |
| arg1(mkargs) |
| arg1([mkargs]) |
| arg1(m4_defn([mkargs])) |
| arg1(m4_quote(mkargs)) |
| arg1(m4_dquote(mkargs)) |
| arg1(m4_expand([mkargs])) |
| $ @kbd{autom4te -l m4sugar example.m4} |
| $1 = A, $@@ = [A],[b] |
| $1 = a, b, $@@ = [a, b] |
| $1 = A,b, $@@ = [A,b] |
| $1 = [A],[b], $@@ = [[A],[b]] |
| $1 = A, b, $@@ = [A, b] |
| |
| 1 |
| mkargs |
| 1, 2[,] 3 |
| 1,2, 3 |
| [1],[2, 3] |
| 1, 2, 3 |
| @end example |
| |
| |
| @node Text processing Macros |
| @subsection String manipulation in M4 |
| |
| The following macros may be used to manipulate strings in M4. Many of |
| the macros in this section intentionally result in quoted strings as |
| output, rather than subjecting the arguments to further expansions. As |
| a result, if you are manipulating text that contains active M4 |
| characters, the arguments are passed with single quoting rather than |
| double. |
| |
| @defmac m4_append (@var{macro-name}, @var{string}, @ovar{separator}) |
| @defmacx m4_append_uniq (@var{macro-name}, @var{string}, @ovar{separator} @ |
| @ovar{if-uniq}, @ovar{if-duplicate}) |
| @msindex{append} |
| @msindex{append_uniq} |
| Redefine @var{macro-name} to its former contents with @var{separator} |
| and @var{string} added at the end. If @var{macro-name} was undefined |
| before (but not if it was defined but empty), then no @var{separator} is |
| added. As of Autoconf 2.62, neither @var{string} nor @var{separator} |
| are expanded during this macro; instead, they are expanded when |
| @var{macro-name} is invoked. |
| |
| @code{m4_append} can be used to grow strings, and @code{m4_append_uniq} |
| to grow strings without duplicating substrings. Additionally, |
| @code{m4_append_uniq} takes two optional parameters as of Autoconf 2.62; |
| @var{if-uniq} is expanded if @var{string} was appended, and |
| @var{if-duplicate} is expanded if @var{string} was already present. |
| Also, @code{m4_append_uniq} warns if @var{separator} is not empty, but |
| occurs within @var{string}, since that can lead to duplicates. |
| |
| Note that @code{m4_append} can scale linearly in the length of the final |
| string, depending on the quality of the underlying M4 implementation, |
| while @code{m4_append_uniq} has an inherent quadratic scaling factor. |
| If an algorithm can tolerate duplicates in the final string, use the |
| former for speed. If duplicates must be avoided, consider using |
| @code{m4_set_add} instead (@pxref{Set manipulation Macros}). |
| |
| @example |
| m4_define([active], [ACTIVE])dnl |
| m4_append([sentence], [This is an])dnl |
| m4_append([sentence], [ active ])dnl |
| m4_append([sentence], [symbol.])dnl |
| sentence |
| @result{}This is an ACTIVE symbol. |
| m4_undefine([active])dnl |
| @result{}This is an active symbol. |
| m4_append_uniq([list], [one], [, ], [new], [existing]) |
| @result{}new |
| m4_append_uniq([list], [one], [, ], [new], [existing]) |
| @result{}existing |
| m4_append_uniq([list], [two], [, ], [new], [existing]) |
| @result{}new |
| m4_append_uniq([list], [three], [, ], [new], [existing]) |
| @result{}new |
| m4_append_uniq([list], [two], [, ], [new], [existing]) |
| @result{}existing |
| list |
| @result{}one, two, three |
| m4_dquote(list) |
| @result{}[one],[two],[three] |
| m4_append([list2], [one], [[, ]])dnl |
| m4_append_uniq([list2], [two], [[, ]])dnl |
| m4_append([list2], [three], [[, ]])dnl |
| list2 |
| @result{}one, two, three |
| m4_dquote(list2) |
| @result{}[one, two, three] |
| @end example |
| @end defmac |
| |
| @defmac m4_append_uniq_w (@var{macro-name}, @var{strings}) |
| @msindex{append_uniq_w} |
| This macro was introduced in Autoconf 2.62. It is similar to |
| @code{m4_append_uniq}, but treats @var{strings} as a whitespace |
| separated list of words to append, and only appends unique words. |
| @var{macro-name} is updated with a single space between new words. |
| @example |
| m4_append_uniq_w([numbers], [1 1 2])dnl |
| m4_append_uniq_w([numbers], [ 2 3 ])dnl |
| numbers |
| @result{}1 2 3 |
| @end example |
| @end defmac |
| |
| @defmac m4_chomp (@var{string}) |
| @defmacx m4_chomp_all (@var{string}) |
| @msindex{chomp} |
| @msindex{chomp_all} |
| Output @var{string} in quotes, but without a trailing newline. The |
| macro @code{m4_chomp} is slightly faster, and removes at most one |
| newline; the macro @code{m4_chomp_all} removes all consecutive trailing |
| newlines. Unlike @code{m4_flatten}, embedded newlines are left intact, |
| and backslash does not influence the result. |
| @end defmac |
| |
| @defmac m4_combine (@ovar{separator}, @var{prefix-list}, @ovar{infix}, @ |
| @var{suffix-1}, @ovar{suffix-2}, @dots{}) |
| @msindex{combine} |
| This macro produces a quoted string containing the pairwise combination |
| of every element of the quoted, comma-separated @var{prefix-list}, and |
| every element from the @var{suffix} arguments. Each pairwise |
| combination is joined with @var{infix} in the middle, and successive |
| pairs are joined by @var{separator}. No expansion occurs on any of the |
| arguments. No output occurs if either the @var{prefix} or @var{suffix} |
| list is empty, but the lists can contain empty elements. |
| @example |
| m4_define([a], [oops])dnl |
| m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3]) |
| @result{}a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3 |
| m4_combine([, ], [[a], [b]], [-]) |
| @result{} |
| m4_combine([, ], [[a], [b]], [-], []) |
| @result{}a-, b- |
| m4_combine([, ], [], [-], [1], [2]) |
| @result{} |
| m4_combine([, ], [[]], [-], [1], [2]) |
| @result{}-1, -2 |
| @end example |
| @end defmac |
| |
| @defmac m4_escape (@var{string}) |
| @msindex{escape} |
| Convert all instances of @samp{[}, @samp{]}, @samp{#}, and @samp{$} |
| within @var{string} into their respective quadrigraphs. The result is |
| still a quoted string. |
| @end defmac |
| |
| @defmac m4_flatten (@var{string}) |
| @msindex{flatten} |
| Flatten @var{string} into a single line. Delete all backslash-newline |
| pairs, and replace all remaining newlines with a space. The result is |
| still a quoted string. |
| @end defmac |
| |
| @defmac m4_join (@ovar{separator}, @var{args}@dots{}) |
| @defmacx m4_joinall (@ovar{separator}, @var{args}@dots{}) |
| @msindex{join} |
| @msindex{joinall} |
| Concatenate each @var{arg}, separated by @var{separator}. |
| @code{joinall} uses every argument, while @code{join} omits empty |
| arguments so that there are no back-to-back separators in the output. |
| The result is a quoted string. |
| @example |
| m4_define([active], [ACTIVE])dnl |
| m4_join([|], [one], [], [active], [two]) |
| @result{}one|active|two |
| m4_joinall([|], [one], [], [active], [two]) |
| @result{}one||active|two |
| @end example |
| |
| Note that if all you intend to do is join @var{args} with commas between |
| them, to form a quoted list suitable for @code{m4_foreach}, it is more |
| efficient to use @code{m4_dquote}. |
| @end defmac |
| |
| @defmac m4_newline (@ovar{text}) |
| @msindex{newline} |
| This macro was introduced in Autoconf 2.62, and expands to a newline, |
| followed by any @var{text}. |
| It is primarily useful for maintaining macro formatting, and ensuring |
| that M4 does not discard leading whitespace during argument collection. |
| @end defmac |
| |
| @defmac m4_normalize (@var{string}) |
| @msindex{normalize} |
| Remove leading and trailing spaces and tabs, sequences of |
| backslash-then-newline, and replace multiple spaces, tabs, and newlines |
| with a single space. This is a combination of @code{m4_flatten} and |
| @code{m4_strip}. To determine if @var{string} consists only of bytes |
| that would be removed by @code{m4_normalize}, you can use |
| @code{m4_ifblank}. |
| @end defmac |
| |
| @defmac m4_re_escape (@var{string}) |
| @msindex{re_escape} |
| Backslash-escape all characters in @var{string} that are active in |
| regexps. |
| @end defmac |
| |
| @c We cannot use @dvar because the macro expansion mistreats backslashes. |
| @defmac m4_split (@var{string}, @r{[}@var{regexp} = @samp{[\t ]+}@r{]}) |
| @msindex{split} |
| Split @var{string} into an M4 list of elements quoted by @samp{[} and |
| @samp{]}, while keeping white space at the beginning and at the end. |
| If @var{regexp} is given, use it instead of @samp{[\t ]+} for splitting. |
| If @var{string} is empty, the result is an empty list. |
| @end defmac |
| |
| @defmac m4_strip (@var{string}) |
| @msindex{strip} |
| Strip whitespace from @var{string}. Sequences of spaces and tabs are |
| reduced to a single space, then leading and trailing spaces are removed. |
| The result is still a quoted string. Note that this does not interfere |
| with newlines; if you want newlines stripped as well, consider |
| @code{m4_flatten}, or do it all at once with @code{m4_normalize}. To |
| quickly test if @var{string} has only whitespace, use @code{m4_ifblank}. |
| @end defmac |
| |
| @defmac m4_text_box (@var{message}, @dvar{frame, -}) |
| @msindex{text_box} |
| Add a text box around @var{message}, using @var{frame} as the border |
| character above and below the message. The @var{frame} argument must be |
| a single byte, and does not support quadrigraphs. |
| The frame correctly accounts for |
| the subsequent expansion of @var{message}. For example: |
| @example |
| m4_define([macro], [abc])dnl |
| m4_text_box([macro]) |
| @result{}## --- ## |
| @result{}## abc ## |
| @result{}## --- ## |
| @end example |
| |
| The @var{message} must contain balanced quotes and parentheses, although |
| quadrigraphs can be used to work around this. |
| @end defmac |
| |
| @defmac m4_text_wrap (@var{string}, @ovar{prefix}, @ |
| @dvarv{prefix1, prefix}, @dvar{width, 79}) |
| @msindex{text_wrap} |
| Break @var{string} into a series of whitespace-separated words, then |
| output those words separated by spaces, and wrapping lines any time the |
| output would exceed @var{width} columns. If given, @var{prefix1} begins |
| the first line, and @var{prefix} begins all wrapped lines. If |
| @var{prefix1} is longer than @var{prefix}, then the first line consists |
| of just @var{prefix1}. If @var{prefix} is longer than @var{prefix1}, |
| padding is inserted so that the first word of @var{string} begins at the |
| same indentation as all wrapped lines. Note that using literal tab |
| characters in any of the arguments will interfere with the calculation |
| of width. No expansions occur on @var{prefix}, @var{prefix1}, or the |
| words of @var{string}, although quadrigraphs are recognized. |
| |
| For some examples: |
| @example |
| m4_text_wrap([Short string */], [ ], [/* ], [20]) |
| @result{}/* Short string */ |
| m4_text_wrap([Much longer string */], [ ], [/* ], [20]) |
| @result{}/* Much longer |
| @result{} string */ |
| m4_text_wrap([Short doc.], [ ], [ --short ], [30]) |
| @result{} --short Short doc. |
| m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30]) |
| @result{} --too-wide |
| @result{} Short doc. |
| m4_text_wrap([Super long documentation.], [ ], |
| [ --too-wide ], 30) |
| @result{} --too-wide |
| @result{} Super long |
| @result{} documentation. |
| @end example |
| @end defmac |
| |
| @defmac m4_tolower (@var{string}) |
| @defmacx m4_toupper (@var{string}) |
| @msindex{tolower} |
| @msindex{toupper} |
| Return @var{string} with letters converted to upper or lower case, |
| respectively. |
| @end defmac |
| |
| @node Number processing Macros |
| @subsection Arithmetic computation in M4 |
| |
| The following macros facilitate integer arithmetic operations. |
| |
| Where a parameter is documented as taking an arithmetic expression, you |
| can use anything that can be parsed by @code{m4_eval}. |
| Any other numeric parameter should consist of an optional sign followed |
| by one or more decimal digits; it is treated as a decimal integer. |
| |
| Macros that expand to a number do so as either @samp{0}, or an optional |
| @samp{-} followed by a nonzero decimal digit followed by zero or more |
| decimal digits. |
| |
| Due to @command{m4} limitations, arithmetic expressions and numeric |
| parameters should use only numbers that fit into a 32-bit signed |
| integer. |
| |
| @defmac m4_cmp (@var{expr-1}, @var{expr-2}) |
| @msindex{cmp} |
| Compare the arithmetic expressions @var{expr-1} and @var{expr-2}, and |
| expand to @samp{-1} if @var{expr-1} is smaller, @samp{0} if they are |
| equal, and @samp{1} if @var{expr-1} is larger. |
| @end defmac |
| |
| @defmac m4_list_cmp (@var{list-1}, @var{list-2}) |
| @msindex{list_cmp} |
| Compare the two M4 lists consisting of comma-separated arithmetic |
| expressions, left to right. Expand to @samp{-1} for the first element |
| pairing where the value from @var{list-1} is smaller, @samp{1} where the |
| value from @var{list-2} is smaller, or @samp{0} if both lists have the |
| same values. If one list is shorter than the other, the remaining |
| elements of the longer list are compared against zero. |
| @example |
| m4_list_cmp([1, 0], [1]) |
| @result{}0 |
| m4_list_cmp([1, [1 * 0]], [1, 0]) |
| @result{}0 |
| m4_list_cmp([1, 2], [1, 0]) |
| @result{}1 |
| m4_list_cmp([1, [1+1], 3],[1, 2]) |
| @result{}1 |
| m4_list_cmp([1, 2, -3], [1, 2]) |
| @result{}-1 |
| m4_list_cmp([1, 0], [1, 2]) |
| @result{}-1 |
| m4_list_cmp([1], [1, 2]) |
| @result{}-1 |
| @end example |
| @end defmac |
| |
| @defmac m4_max (@var{arg}, @dots{}) |
| @msindex{max} |
| This macro was introduced in Autoconf 2.62. Expand to the value |
| of the maximum arithmetic expression among all the arguments. |
| @end defmac |
| |
| @defmac m4_min (@var{arg}, @dots{}) |
| @msindex{min} |
| This macro was introduced in Autoconf 2.62. Expand to the value |
| of the minimum arithmetic expression among all the arguments. |
| @end defmac |
| |
| @defmac m4_sign (@var{expr}) |
| @msindex{sign} |
| Expand to @samp{-1} if the arithmetic expression @var{expr} is negative, |
| @samp{1} if it is positive, and @samp{0} if it is zero. |
| @end defmac |
| |
| @anchor{m4_version_compare} |
| @defmac m4_version_compare (@var{version-1}, @var{version-2}) |
| @msindex{version_compare} |
| This macro was introduced in Autoconf 2.53, but had a number of |
| usability limitations that were not lifted until Autoconf 2.62. Compare |
| the version strings @var{version-1} and @var{version-2}, and expand to |
| @samp{-1} if @var{version-1} is smaller, @samp{0} if they are the same, |
| or @samp{1} @var{version-2} is smaller. Version strings must be a list |
| of elements separated by @samp{.}, @samp{,} or @samp{-}, where each |
| element is a number along with optional case-insensitive letters |
| designating beta releases. The comparison stops at the leftmost element |
| that contains a difference, although a 0 element compares equal to a |
| missing element. |
| |
| It is permissible to include commit identifiers in @var{version}, such |
| as an abbreviated SHA1 of the commit, provided there is still a |
| monotonically increasing prefix to allow for accurate version-based |
| comparisons. For example, this paragraph was written when the |
| development snapshot of autoconf claimed to be at version |
| @samp{2.61a-248-dc51}, or 248 commits after the 2.61a release, with an |
| abbreviated commit identification of @samp{dc51}. |
| |
| @example |
| m4_version_compare([1.1], [2.0]) |
| @result{}-1 |
| m4_version_compare([2.0b], [2.0a]) |
| @result{}1 |
| m4_version_compare([1.1.1], [1.1.1a]) |
| @result{}-1 |
| m4_version_compare([1.2], [1.1.1a]) |
| @result{}1 |
| m4_version_compare([1.0], [1]) |
| @result{}0 |
| m4_version_compare([1.1pre], [1.1PRE]) |
| @result{}0 |
| m4_version_compare([1.1a], [1,10]) |
| @result{}-1 |
| m4_version_compare([2.61a], [2.61a-248-dc51]) |
| @result{}-1 |
| m4_version_compare([2.61b], [2.61a-248-dc51]) |
| @result{}1 |
| @end example |
| @end defmac |
| |
| @defmac m4_version_prereq (@var{version}, @ovar{if-new-enough}, @ |
| @dvar{if-old, m4_fatal}) |
| @msindex{version_prereq} |
| Compares @var{version} against the version of Autoconf currently |
| running. If the running version is at @var{version} or newer, expand |
| @var{if-new-enough}, but if @var{version} is larger than the version |
| currently executing, expand @var{if-old}, which defaults to printing an |
| error message and exiting m4sugar with status 63. When given only one |
| argument, this behaves like @code{AC_PREREQ} (@pxref{Versioning}). |
| Remember that the autoconf philosophy favors feature checks over version |
| checks. |
| @end defmac |
| |
| @node Set manipulation Macros |
| @subsection Set manipulation in M4 |
| @cindex Set manipulation |
| @cindex Data structure, set |
| @cindex Unordered set manipulation |
| |
| Sometimes, it is necessary to track a set of data, where the order does |
| not matter and where there are no duplicates in the set. The following |
| macros facilitate set manipulations. Each set is an opaque object, |
| which can only be accessed via these basic operations. The underlying |
| implementation guarantees linear scaling for set creation, which is more |
| efficient than using the quadratic @code{m4_append_uniq}. Both set |
| names and values can be arbitrary strings, except for unbalanced quotes. |
| This implementation ties up memory for removed elements until the next |
| operation that must traverse all the elements of a set; and although |
| that may slow down some operations until the memory for removed elements |
| is pruned, it still guarantees linear performance. |
| |
| @defmac m4_set_add (@var{set}, @var{value}, @ovar{if-uniq}, @ovar{if-dup}) |
| @msindex{set_add} |
| Adds the string @var{value} as a member of set @var{set}. Expand |
| @var{if-uniq} if the element was added, or @var{if-dup} if it was |
| previously in the set. Operates in amortized constant time, so that set |
| creation scales linearly. |
| @end defmac |
| |
| @defmac m4_set_add_all (@var{set}, @var{value}@dots{}) |
| @msindex{set_add_all} |
| Adds each @var{value} to the set @var{set}. This is slightly more |
| efficient than repeatedly invoking @code{m4_set_add}. |
| @end defmac |
| |
| @defmac m4_set_contains (@var{set}, @var{value}, @ovar{if-present}, @ |
| @ovar{if-absent}) |
| @msindex{set_contains} |
| Expands @var{if-present} if the string @var{value} is a member of |
| @var{set}, otherwise @var{if-absent}. |
| |
| @example |
| m4_set_contains([a], [1], [yes], [no]) |
| @result{}no |
| m4_set_add([a], [1], [added], [dup]) |
| @result{}added |
| m4_set_add([a], [1], [added], [dup]) |
| @result{}dup |
| m4_set_contains([a], [1], [yes], [no]) |
| @result{}yes |
| m4_set_remove([a], [1], [removed], [missing]) |
| @result{}removed |
| m4_set_contains([a], [1], [yes], [no]) |
| @result{}no |
| m4_set_remove([a], [1], [removed], [missing]) |
| @result{}missing |
| @end example |
| @end defmac |
| |
| @defmac m4_set_contents (@var{set}, @ovar{sep}) |
| @defmacx m4_set_dump (@var{set}, @ovar{sep}) |
| @msindex{set_contents} |
| @msindex{set_dump} |
| Expands to a single string consisting of all the members of the set |
| @var{set}, each separated by @var{sep}, which is not expanded. |
| @code{m4_set_contents} leaves the elements in @var{set} but reclaims any |
| memory occupied by removed elements, while @code{m4_set_dump} is a |
| faster one-shot action that also deletes the set. No provision is made |
| for disambiguating members that contain a non-empty @var{sep} as a |
| substring; use @code{m4_set_empty} to distinguish between an empty set |
| and the set containing only the empty string. The order of the output |
| is unspecified; in the current implementation, part of the speed of |
| @code{m4_set_dump} results from using a different output order than |
| @code{m4_set_contents}. These macros scale linearly in the size of the |
| set before memory pruning, and @code{m4_set_contents([@var{set}], |
| [@var{sep}])} is faster than |
| @code{m4_joinall([@var{sep}]m4_set_listc([@var{set}]))}. |
| |
| @example |
| m4_set_add_all([a], [1], [2], [3]) |
| @result{} |
| m4_set_contents([a], [-]) |
| @result{}1-2-3 |
| m4_joinall([-]m4_set_listc([a])) |
| @result{}1-2-3 |
| m4_set_dump([a], [-]) |
| @result{}3-2-1 |
| m4_set_contents([a]) |
| @result{} |
| m4_set_add([a], []) |
| @result{} |
| m4_set_contents([a], [-]) |
| @result{} |
| @end example |
| @end defmac |
| |
| @defmac m4_set_delete (@var{set}) |
| @msindex{set_delete} |
| Delete all elements and memory associated with @var{set}. This is |
| linear in the set size, and faster than removing one element at a time. |
| @end defmac |
| |
| @defmac m4_set_difference (@var{seta}, @var{setb}) |
| @defmacx m4_set_intersection (@var{seta}, @var{setb}) |
| @defmacx m4_set_union (@var{seta}, @var{setb}) |
| @msindex{set_difference} |
| @msindex{set_intersection} |
| @msindex{set_union} |
| Compute the relation between @var{seta} and @var{setb}, and output the |
| result as a list of quoted arguments without duplicates and with a |
| leading comma. Set difference selects the elements in @var{seta} but |
| not @var{setb}, intersection selects only elements in both sets, and |
| union selects elements in either set. These actions are linear in the |
| sum of the set sizes. The leading comma is necessary to distinguish |
| between no elements and the empty string as the only element. |
| |
| @example |
| m4_set_add_all([a], [1], [2], [3]) |
| @result{} |
| m4_set_add_all([b], [3], [], [4]) |
| @result{} |
| m4_set_difference([a], [b]) |
| @result{},1,2 |
| m4_set_difference([b], [a]) |
| @result{},,4 |
| m4_set_intersection([a], [b]) |
| @result{},3 |
| m4_set_union([a], [b]) |
| @result{},1,2,3,,4 |
| @end example |
| @end defmac |
| |
| @defmac m4_set_empty (@var{set}, @ovar{if-empty}, @ovar{if-elements}) |
| @msindex{set_empty} |
| Expand @var{if-empty} if the set @var{set} has no elements, otherwise |
| expand @var{if-elements}. This macro operates in constant time. Using |
| this macro can help disambiguate output from @code{m4_set_contents} or |
| @code{m4_set_list}. |
| @end defmac |
| |
| @defmac m4_set_foreach (@var{set}, @var{variable}, @var{action}) |
| @msindex{set_foreach} |
| For each element in the set @var{set}, expand @var{action} with the |
| macro @var{variable} defined as the set element. Behavior is |
| unspecified if @var{action} recursively lists the contents of @var{set} |
| (although listing other sets is acceptable), or if it modifies the set |
| in any way other than removing the element currently contained in |
| @var{variable}. This macro is faster than the corresponding |
| @code{m4_foreach([@var{variable}], |
| m4_indir([m4_dquote]m4_set_listc([@var{set}])), [@var{action}])}, |
| although @code{m4_set_map} might be faster still. |
| |
| @example |
| m4_set_add_all([a]m4_for([i], [1], [5], [], [,i])) |
| @result{} |
| m4_set_contents([a]) |
| @result{}12345 |
| m4_set_foreach([a], [i], |
| [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])]) |
| @result{}24 |
| m4_set_contents([a]) |
| @result{}135 |
| @end example |
| @end defmac |
| |
| @defmac m4_set_list (@var{set}) |
| @defmacx m4_set_listc (@var{set}) |
| @msindex{set_list} |
| @msindex{set_listc} |
| Produce a list of arguments, where each argument is a quoted element |
| from the set @var{set}. The variant @code{m4_set_listc} is unambiguous, |
| by adding a leading comma if there are any set elements, whereas the |
| variant @code{m4_set_list} cannot distinguish between an empty set and a |
| set containing only the empty string. These can be directly used in |
| macros that take multiple arguments, such as @code{m4_join} or |
| @code{m4_set_add_all}, or wrapped by @code{m4_dquote} for macros that |
| take a quoted list, such as @code{m4_map} or @code{m4_foreach}. Any |
| memory occupied by removed elements is reclaimed during these macros. |
| |
| @example |
| m4_set_add_all([a], [1], [2], [3]) |
| @result{} |
| m4_set_list([a]) |
| @result{}1,2,3 |
| m4_set_list([b]) |
| @result{} |
| m4_set_listc([b]) |
| @result{} |
| m4_count(m4_set_list([b])) |
| @result{}1 |
| m4_set_empty([b], [0], [m4_count(m4_set_list([b]))]) |
| @result{}0 |
| m4_set_add([b], []) |
| @result{} |
| m4_set_list([b]) |
| @result{} |
| m4_set_listc([b]) |
| @result{}, |
| m4_count(m4_set_list([b])) |
| @result{}1 |
| m4_set_empty([b], [0], [m4_count(m4_set_list([b]))]) |
| @result{}1 |
| @end example |
| @end defmac |
| |
| @defmac m4_set_map (@var{set}, @var{action}) |
| @msindex{set_map} |
| For each element in the set @var{set}, expand @var{action} with a single |
| argument of the set element. Behavior is unspecified if @var{action} |
| recursively lists the contents of @var{set} (although listing other sets |
| is acceptable), or if it modifies the set in any way other than removing |
| the element passed as an argument. This macro is faster than either |
| corresponding counterpart of |
| @code{m4_map_args([@var{action}]m4_set_listc([@var{set}]))} or |
| @code{m4_set_foreach([@var{set}], [var], |
| [@var{action}(m4_defn([var]))])}. It is possible to use @code{m4_curry} |
| if more than one argument is needed for @var{action}, although it is |
| more efficient to use @code{m4_set_map_sep} in that case. |
| @end defmac |
| |
| @defmac m4_set_map_sep (@var{set}, @ovar{pre}, @ovar{post}, @ovar{sep}) |
| @msindex{set_map_sep} |
| For each element in the set @var{set}, expand |
| @code{@var{pre}[element]@var{post}}, additionally expanding @var{sep} |
| between elements. Behavior is unspecified if the expansion recursively |
| lists the contents of @var{set} (although listing other sets |
| is acceptable), or if it modifies the set in any way other than removing |
| the element visited by the expansion. This macro provides the most |
| efficient means for non-destructively visiting the elements of a set; in |
| particular, @code{m4_set_map([@var{set}], [@var{action}])} is equivalent |
| to @code{m4_set_map_sep([@var{set}], [@var{action}(], [)])}. |
| @end defmac |
| |
| @defmac m4_set_remove (@var{set}, @var{value}, @ovar{if-present}, @ |
| @ovar{if-absent}) |
| @msindex{set_remove} |
| If @var{value} is an element in the set @var{set}, then remove it and |
| expand @var{if-present}. Otherwise expand @var{if-absent}. This macro |
| operates in constant time so that multiple removals will scale linearly |
| rather than quadratically; but when used outside of |
| @code{m4_set_foreach} or @code{m4_set_map}, it leaves memory occupied |
| until the set is later |
| compacted by @code{m4_set_contents} or @code{m4_set_list}. Several |
| other set operations are then less efficient between the time of element |
| removal and subsequent memory compaction, but still maintain their |
| guaranteed scaling performance. |
| @end defmac |
| |
| @defmac m4_set_size (@var{set}) |
| @msindex{set_size} |
| Expand to the size of the set @var{set}. This implementation operates |
| in constant time, and is thus more efficient than |
| @code{m4_eval(m4_count(m4_set_listc([set])) - 1)}. |
| @end defmac |
| |
| |
| @node Forbidden Patterns |
| @subsection Forbidden Patterns |
| @cindex Forbidden patterns |
| @cindex Patterns, forbidden |
| |
| M4sugar provides a means to define suspicious patterns, patterns |
| describing tokens which should not be found in the output. For |
| instance, if an Autoconf @file{configure} script includes tokens such as |
| @samp{AC_DEFINE}, or @samp{dnl}, then most probably something went |
| wrong (typically a macro was not evaluated because of overquotation). |
| |
| M4sugar forbids all the tokens matching @samp{^_?m4_} and @samp{^dnl$}. |
| Additional layers, such as M4sh and Autoconf, add additional forbidden |
| patterns to the list. |
| |
| @defmac m4_pattern_forbid (@var{pattern}) |
| @msindex{pattern_forbid} |
| Declare that no token matching @var{pattern} must be found in the |
| output. The output file is (temporarily) split into one word per line |
| as part of the @command{autom4te} post-processing, with each line (and |
| therefore word) then being checked against the Perl regular expression |
| @var{pattern}. If the regular expression matches, and |
| @code{m4_pattern_allow} does not also match, then an error is raised. |
| |
| Comments are not checked; this can be a problem if, for instance, you |
| have some macro left unexpanded after an @samp{#include}. No consensus |
| is currently found in the Autoconf community, as some people consider it |
| should be valid to name macros in comments (which doesn't make sense to |
| the authors of this documentation: input, such as macros, should be |
| documented by @samp{dnl} comments; reserving @samp{#}-comments to |
| document the output). |
| |
| As an example, if you define your own macros that begin with @samp{M_} |
| and are composed from capital letters and underscores, the specification |
| of @code{m4_pattern_forbid([^M_[A-Z_]+])} will ensure all your macros |
| are expanded when not used in comments. |
| |
| As an example of a common use of this macro, consider what happens in |
| packages that want to use the @command{pkg-config} script via the |
| third-party @code{PKG_CHECK_MODULES} macro. By default, if a developer |
| checks out the development tree but has not yet installed the pkg-config |
| macros locally, they can manage to successfully run @command{autoconf} |
| on the package, but the resulting @file{configure} file will likely |
| result in a confusing shell message about a syntax error on the line |
| mentioning the unexpanded @code{PKG_CHECK_MODULES} macro. On the other hand, |
| if @file{configure.ac} includes @code{m4_pattern_forbid([^PKG_])}, the |
| missing pkg-config macros will be detected immediately without allowing |
| @command{autoconf} to succeed. |
| @end defmac |
| |
| Of course, you might encounter exceptions to these generic rules, for |
| instance you might have to refer to @samp{$m4_flags}. |
| |
| @defmac m4_pattern_allow (@var{pattern}) |
| @msindex{pattern_allow} |
| Any token matching @var{pattern} is allowed, including if it matches an |
| @code{m4_pattern_forbid} pattern. |
| |
| For example, Gnulib uses @code{m4_pattern_forbid([^gl_])} to reserve the |
| @code{gl_} namespace for itself, but also uses |
| @code{m4_pattern_allow([^gl_ES$])} to avoid a false negative on the |
| valid locale name. |
| @end defmac |
| |
| @node Debugging via autom4te |
| @section Debugging via autom4te |
| @cindex debugging tips |
| @cindex autom4te debugging tips |
| @cindex m4sugar debugging tips |
| At times, it is desirable to see what was happening inside m4, to see |
| why output was not matching expectations. However, post-processing done |
| by @command{autom4te} means that directly using the m4 builtin |
| @code{m4_traceon} is likely to interfere with operation. Also, frequent |
| diversion changes and the concept of forbidden tokens make it difficult |
| to use @code{m4_defn} to generate inline comments in the final output. |
| |
| There are a couple of tools to help with this. One is the use of the |
| @option{--trace} option provided by @command{autom4te} (as well as each |
| of the programs that wrap @command{autom4te}, such as |
| @command{autoconf}), in order to inspect when a macro is called and with |
| which arguments. For example, when this paragraph was written, the |
| autoconf version could be found by: |
| |
| @example |
| $ @kbd{autoconf --trace=AC_INIT} |
| configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@@gnu.org |
| $ @kbd{autoconf --trace='AC_INIT:version is $2'} |
| version is 2.63b.95-3963 |
| @end example |
| |
| Another trick is to print out the expansion of various m4 expressions to |
| standard error or to an independent file, with no further m4 expansion, |
| and without interfering with diversion changes or the post-processing |
| done to standard output. @code{m4_errprintn} shows a given expression |
| on standard error. For example, if you want to see the expansion of an |
| autoconf primitive or of one of your autoconf macros, you can do it like |
| this: |
| |
| @example |
| $ @kbd{cat <<\EOF > configure.ac} |
| AC_INIT |
| m4_errprintn([The definition of AC_DEFINE_UNQUOTED:]) |
| m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED])) |
| AC_OUTPUT |
| EOF |
| $ @kbd{autoconf} |
| @error{}The definition of AC_DEFINE_UNQUOTED: |
| @error{}_AC_DEFINE_Q([], $@@) |
| @end example |
| |
| @node Programming in M4sh |
| @chapter Programming in M4sh |
| |
| M4sh, pronounced ``mash'', is aiming at producing portable Bourne shell |
| scripts. This name was coined by Lars J. Aas, who notes that, |
| according to the Webster's Revised Unabridged Dictionary (1913): |
| |
| @quotation |
| Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische, mash, |
| wash, and prob.@: to AS. miscian to mix. See ``Mix''.] |
| |
| @enumerate 1 |
| @item |
| A mass of mixed ingredients reduced to a soft pulpy state by beating or |
| pressure@enddots{} |
| |
| @item |
| A mixture of meal or bran and water fed to animals. |
| |
| @item |
| A mess; trouble. [Obs.] --Beau.@: & Fl. |
| @end enumerate |
| @end quotation |
| |
| M4sh reserves the M4 macro namespace @samp{^_AS_} for internal use, and |
| the namespace @samp{^AS_} for M4sh macros. It also reserves the shell |
| and environment variable namespace @samp{^as_}, and the here-document |
| delimiter namespace @samp{^_AS[A-Z]} in the output file. You should not |
| define your own macros or output shell code that conflicts with these |
| namespaces. |
| |
| @menu |
| * Common Shell Constructs:: Portability layer for common shell constructs |
| * Polymorphic Variables:: Support for indirect variable names |
| * Initialization Macros:: Macros to establish a sane shell environment |
| * File Descriptor Macros:: File descriptor macros for input and output |
| @end menu |
| |
| @node Common Shell Constructs |
| @section Common Shell Constructs |
| |
| M4sh provides portable alternatives for some common shell constructs |
| that unfortunately are not portable in practice. |
| |
| @c Deprecated, to be replaced by a better API |
| @ignore |
| @defmac AS_BASENAME (@var{file-name}) |
| @asindex{BASENAME} |
| Output the non-directory portion of @var{file-name}. For example, |
| if @code{$file} is @samp{/one/two/three}, the command |
| @code{base=`AS_BASENAME(["$file"])`} sets @code{base} to @samp{three}. |
| @end defmac |
| @end ignore |
| |
| @defmac AS_BOX (@var{text}, @dvar{char, -}) |
| @asindex{BOX} |
| Expand into shell code that will output @var{text} surrounded by a box |
| with @var{char} in the top and bottom border. @var{text} should not |
| contain a newline, but may contain shell expansions valid for unquoted |
| here-documents. @var{char} defaults to @samp{-}, but can be any |
| character except @samp{/}, @samp{'}, @samp{"}, @samp{\}, |
| @samp{&}, or @samp{`}. This is useful for outputting a comment box into |
| log files to separate distinct phases of script operation. |
| @end defmac |
| |
| @defmac AS_CASE (@var{word}, @ovar{pattern1}, @ovar{if-matched1}, @ |
| @dots{}, @ovar{default}) |
| @asindex{CASE} |
| Expand into a shell @samp{case} statement, where @var{word} is matched |
| against one or more patterns. @var{if-matched} is run if the |
| corresponding pattern matched @var{word}, else @var{default} is run. |
| @xref{Prerequisite Macros} for why |
| this macro should be used instead of plain @samp{case} in code |
| outside of an @code{AC_DEFUN} macro, when the contents of the |
| @samp{case} use @code{AC_REQUIRE} directly or indirectly. |
| @xref{case, , Limitations of Shell Builtins}, |
| for how this macro avoids some portability issues. |
| @xref{Balancing Parentheses} |
| for how this macro lets you write code with balanced parentheses |
| even if your code must run on obsolescent shells. |
| @end defmac |
| |
| @c Deprecated, to be replaced by a better API |
| @defmac AS_DIRNAME (@var{file-name}) |
| @asindex{DIRNAME} |
| Output the directory portion of @var{file-name}. For example, |
| if @code{$file} is @samp{/one/two/three}, the command |
| @code{dir=`AS_DIRNAME(["$file"])`} sets @code{dir} to @samp{/one/two}. |
| |
| @code{AS_DIRNAME} was designed long ago when |
| the @command{dirname} command was not universally supported. |
| Nowadays one can safely use @code{dir=`dirname -- "$file"`} instead. |
| This interface may be improved in the future to avoid forks and losing |
| trailing newlines. |
| @end defmac |
| |
| @defmac AS_ECHO (@var{word}) |
| @asindex{ECHO} |
| Emit @var{word} to the standard output, followed by a newline. |
| The @var{word} must be a single shell word (typically a quoted string). |
| Output the shell expansion of @var{word} as-is, |
| even if it starts with @samp{-} or contains @samp{\}. |
| Redirections can be placed outside the macro invocation. |
| |
| If the shell variable @var{foo} could contain @samp{\} or leading @samp{-}. |
| @code{AS_ECHO(["$foo"])} is more portable than @command{echo "$foo"}. |
| @xref{echo, , Limitations of Shell Builtins}. |
| |
| Also, @code{AS_ECHO(["$foo"])} is often easier to read than the |
| @samp{printf '%s\n' "$foo"} that it stands for. |
| However, because it employs @samp{'} characters, |
| in contexts where @samp{'} is not allowed |
| it is better to use @command{printf} directly. |
| For example, @samp{`eval 'foo=$@{'AS_ESCAPE([[$1]], [`\])'@};printf |
| "%s\\n" "$foo")'`} would not work if @command{printf} were replaced |
| with @code{AS_ECHO}. |
| |
| @end defmac |
| |
| @defmac AS_ECHO_N (@var{word}) |
| @asindex{ECHO_N} |
| Act like @code{AS_ECHO(@var{word})}, except do not output a following newline. |
| @end defmac |
| |
| @c We cannot use @dvar because the macro expansion mistreats backslashes. |
| @defmac AS_ESCAPE (@var{string}, @r{[}@var{chars} = @samp{`\"$}@r{]}) |
| @asindex{ESCAPE} |
| Expands to @var{string}, with any characters in @var{chars} escaped with |
| a backslash (@samp{\}). @var{chars} should be at most four bytes long, |
| and only contain characters from the set @samp{`\"$}; however, |
| characters may be safely listed more than once in @var{chars} for the |
| sake of syntax highlighting editors. The current implementation expands |
| @var{string} after adding escapes; if @var{string} contains macro calls |
| that in turn expand to text needing shell quoting, you can use |
| @code{AS_ESCAPE(m4_dquote(m4_expand([string])))}. |
| |
| The default for @var{chars} (@samp{\"$`}) is the set of characters |
| needing escapes when @var{string} will be used literally within double |
| quotes. One common variant is the set of characters to protect when |
| @var{string} will be used literally within back-ticks or an unquoted |
| here-document (@samp{\$`}). Another common variant is @samp{""}, which can |
| be used to form a double-quoted string containing the same expansions |
| that would have occurred if @var{string} were expanded in an unquoted |
| here-document; however, when using this variant, care must be taken that |
| @var{string} does not use double quotes within complex variable |
| expansions (such as @samp{$@{foo-`echo "hi"`@}}) that would be broken |
| with improper escapes. |
| |
| This macro is often used with @code{AS_ECHO}. For an example, observe |
| the output generated by the shell code generated from this snippet: |
| |
| @example |
| foo=bar |
| AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"]) |
| @result{}"$foo" = "bar" |
| m4_define([macro], [a, [\b]]) |
| AS_ECHO(["AS_ESCAPE([[macro]])"]) |
| @result{}macro |
| AS_ECHO(["AS_ESCAPE([macro])"]) |
| @result{}a, b |
| AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"]) |
| @result{}a, \b |
| @end example |
| |
| @comment Should we add AS_ESCAPE_SINGLE? If we do, we can optimize in |
| @comment the case of @var{string} that does not contain '. |
| To escape a string that will be placed within single quotes, use: |
| |
| @example |
| m4_bpatsubst([[@var{string}]], ['], ['\\'']) |
| @end example |
| @end defmac |
| |
| @defmac AS_EXECUTABLE_P (@var{file}) |
| @asindex{EXECUTABLE_P} |
| Emit code to probe whether @var{file} is a regular file with executable |
| permissions (and not a directory with search permissions). The caller |
| is responsible for quoting @var{file}. |
| @end defmac |
| |
| @defmac AS_EXIT (@dvar{status, $?}) |
| @asindex{EXIT} |
| Emit code to exit the shell with @var{status}, defaulting to @samp{$?}. |
| This macro |
| works around shells that see the exit status of the command prior to |
| @code{exit} inside a @samp{trap 0} handler (@pxref{trap, , Limitations |
| of Shell Builtins}). |
| @end defmac |
| |
| @defmac AS_IF (@var{test1}, @ovar{run-if-true1}, @dots{}, @ovar{run-if-false}) |
| @asindex{IF} |
| Run shell code @var{test1}. If @var{test1} exits with a zero status then |
| run shell code @var{run-if-true1}, else examine further tests. If no test |
| exits with a zero status, run shell code @var{run-if-false}, with |
| simplifications if either @var{run-if-true1} or @var{run-if-false} |
| is empty. For example, |
| |
| @example |
| AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])], |
| [test "x$foo" != xno], [HANDLE_FOO([maybe])], |
| [echo foo not specified]) |
| @end example |
| |
| @noindent |
| ensures any required macros of @code{HANDLE_FOO} |
| are expanded before the first test. |
| |
| This macro should be used instead of plain @samp{if} in code |
| outside of an @code{AC_DEFUN} macro, when the contents of the @samp{if} |
| use @code{AC_REQUIRE} directly or indirectly (@pxref{Prerequisite Macros}). |
| @end defmac |
| |
| @defmac AS_MKDIR_P (@var{file-name}) |
| @asindex{MKDIR_P} |
| Make the directory @var{file-name}, including intervening directories |
| as necessary. This is equivalent to @samp{mkdir -p -- @var{file-name}}. |
| If creation of @var{file-name} fails, exit the script. |
| |
| Also see the @code{AC_PROG_MKDIR_P} macro (@pxref{Particular Programs}). |
| @end defmac |
| |
| @defmac AS_SET_STATUS (@var{status}) |
| @asindex{SET_STATUS} |
| Emit shell code to set the value of @samp{$?} to @var{status}, as |
| efficiently as possible. However, this is not guaranteed to abort a |
| shell running with @code{set -e} (@pxref{set, , Limitations of Shell |
| Builtins}). This should also be used at the end of a complex shell |
| function instead of @samp{return} (@pxref{Shell Functions}) to avoid |
| a DJGPP shell bug. |
| @end defmac |
| |
| @defmac AS_TR_CPP (@var{expression}) |
| @asindex{TR_CPP} |
| Transform @var{expression} into a valid right-hand side for a C @code{#define}. |
| For example: |
| |
| @example |
| # This outputs "#define HAVE_CHAR_P 1". |
| # Notice the m4 quoting around #, to prevent an m4 comment |
| type="char *" |
| echo "[#]define AS_TR_CPP([HAVE_$type]) 1" |
| @end example |
| @end defmac |
| |
| @defmac AS_TR_SH (@var{expression}) |
| @asindex{TR_SH} |
| Transform @var{expression} into shell code that generates a valid shell |
| variable name. The result is literal when possible at m4 time, but must |
| be used with @code{eval} if @var{expression} causes shell indirections. |
| For example: |
| |
| @example |
| # This outputs "Have it!". |
| header="sys/some file.h" |
| eval AS_TR_SH([HAVE_$header])=yes |
| if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi |
| @end example |
| @end defmac |
| |
| @defmac AS_SET_CATFILE (@var{var}, @var{dir}, @var{file}) |
| @asindex{SET_CATFILE} |
| Set the polymorphic shell variable @var{var} to @var{dir}/@var{file}, |
| but optimizing the common cases (@var{dir} or @var{file} is @samp{.}, |
| @var{file} is absolute, etc.). |
| @end defmac |
| |
| @defmac AS_UNSET (@var{var}) |
| @asindex{UNSET} |
| Unsets the shell variable @var{var}, working around bugs in older |
| shells (@pxref{unset, , Limitations of Shell |
| Builtins}). @var{var} can be a literal or indirect variable name. |
| @end defmac |
| |
| @defmac AS_VERSION_COMPARE (@var{version-1}, @var{version-2}, @ |
| @ovar{action-if-less}, @ovar{action-if-equal}, @ovar{action-if-greater}) |
| @asindex{VERSION_COMPARE} |
| Compare two strings @var{version-1} and @var{version-2}, possibly |
| containing shell variables, as version strings, and expand |
| @var{action-if-less}, @var{action-if-equal}, or @var{action-if-greater} |
| depending upon the result. |
| The algorithm to compare is similar to the one used by strverscmp in |
| glibc (@pxref{String/Array Comparison, , String/Array Comparison, libc, |
| The GNU C Library}). |
| @end defmac |
| |
| @node Polymorphic Variables |
| @section Support for indirect variable names |
| @cindex variable name indirection |
| @cindex polymorphic variable name |
| @cindex indirection, variable name |
| |
| Often, it is convenient to write a macro that will emit shell code |
| operating on a shell variable. The simplest case is when the variable |
| name is known. But a more powerful idiom is writing shell code that can |
| work through an indirection, where another variable or command |
| substitution produces the name of the variable to actually manipulate. |
| M4sh supports the notion of polymorphic shell variables, making it easy |
| to write a macro that can deal with either literal or indirect variable |
| names and output shell code appropriate for both use cases. Behavior is |
| undefined if expansion of an indirect variable does not result in a |
| literal variable name. |
| |
| @defmac AS_LITERAL_IF (@var{expression}, @ovar{if-literal}, @ovar{if-not}, @ |
| @dvarv{if-simple-ref, if-not}) |
| @defmacx AS_LITERAL_WORD_IF (@var{expression}, @ovar{if-literal}, @ |
| @ovar{if-not}, @dvarv{if-simple-ref, if-not}) |
| @asindex{LITERAL_IF} |
| @asindex{LITERAL_WORD_IF} |
| If the expansion of @var{expression} is definitely a shell literal, |
| expand @var{if-literal}. If the expansion of @var{expression} looks |
| like it might contain shell indirections (such as @code{$var} or |
| @code{`expr`}), then @var{if-not} is expanded. Sometimes, it is |
| possible to output optimized code if @var{expression} consists only of |
| shell variable expansions (such as @code{$@{var@}}), in which case |
| @var{if-simple-ref} can be provided; but defaulting to @var{if-not} |
| should always be safe. @code{AS_LITERAL_WORD_IF} only expands |
| @var{if-literal} if @var{expression} looks like a single shell word, |
| containing no whitespace; while @code{AS_LITERAL_IF} allows whitespace |
| in @var{expression}. |
| |
| In order to reduce the time spent recognizing whether an |
| @var{expression} qualifies as a literal or a simple indirection, the |
| implementation is somewhat conservative: @var{expression} must be a |
| single shell word (possibly after stripping whitespace), consisting only |
| of bytes that would have the same meaning whether unquoted or enclosed |
| in double quotes (for example, @samp{a.b} results in @var{if-literal}, |
| even though it is not a valid shell variable name; while both @samp{'a'} |
| and @samp{[$]} result in @var{if-not}, because they behave differently |
| than @samp{"'a'"} and @samp{"[$]"}). This macro can be used in contexts |
| for recognizing portable file names (such as in the implementation of |
| @code{AC_LIBSOURCE}), or coupled with some transliterations for forming |
| valid variable names (such as in the implementation of @code{AS_TR_SH}, |
| which uses an additional @code{m4_translit} to convert @samp{.} to |
| @samp{_}). |
| |
| This example shows how to read the contents of the shell variable |
| @code{bar}, exercising all three arguments to @code{AS_LITERAL_IF}. It |
| results in a script that will output the line @samp{hello} three times. |
| |
| @example |
| AC_DEFUN([MY_ACTION], |
| [AS_LITERAL_IF([$1], |
| [AS_ECHO(["$$1"])], |
| @c $$ |
| [AS_VAR_COPY([var], [$1]) |
| AS_ECHO(["$var"])], |
| [AS_ECHO(["$'"$1"\"])])]) |
| foo=bar bar=hello |
| MY_ACTION([bar]) |
| MY_ACTION([`echo bar`]) |
| MY_ACTION([$foo]) |
| @end example |
| @end defmac |
| |
| @defmac AS_VAR_APPEND (@var{var}, @var{text}) |
| @asindex{VAR_APPEND} |
| Emit shell code to append the shell expansion of @var{text} to the end |
| of the current contents of the polymorphic shell variable @var{var}, |
| taking advantage of shells that provide the @samp{+=} extension for more |
| efficient scaling. |
| |
| For situations where the final contents of @var{var} are relatively |
| short (less than 256 bytes), it is more efficient to use the simpler |
| code sequence of @code{@var{var}=$@{@var{var}@}@var{text}} (or its |
| polymorphic equivalent of @code{AS_VAR_COPY([t], [@var{var}])} and |
| @code{AS_VAR_SET([@var{var}], ["$t"@var{text}])}). But in the case |
| when the script will be repeatedly appending text into @code{var}, |
| issues of scaling start to become apparent. A naive implementation |
| requires execution time linear to the length of the current contents of |
| @var{var} as well as the length of @var{text} for a single append, for |
| an overall quadratic scaling with multiple appends. This macro takes |
| advantage of shells which provide the extension |
| @code{@var{var}+=@var{text}}, which can provide amortized constant time |
| for a single append, for an overall linear scaling with multiple |
| appends. Note that unlike @code{AS_VAR_SET}, this macro requires that |
| @var{text} be quoted properly to avoid field splitting and file name |
| expansion. |
| @end defmac |
| |
| @defmac AS_VAR_ARITH (@var{var}, @var{expression}) |
| @asindex{VAR_ARITH} |
| Emit shell code to compute the arithmetic expansion of @var{expression}, |
| assigning the result as the contents of the polymorphic shell variable |
| @var{var}. The code takes advantage of shells that provide @samp{$(())} |
| for fewer forks, but uses @command{expr} as a fallback. Therefore, the |
| syntax for a valid @var{expression} is rather limited: all operators |
| must occur as separate shell arguments and with proper quoting; |
| the only operators supported are @samp{*}, @samp{/}, @samp{%}, binary |
| @samp{+}, binary @samp{-}, @samp{>}, @samp{>=}, @samp{<}, @samp{<=}, |
| @samp{!=}, @samp{&}, and @samp{|}; |
| all variables containing numbers must be expanded prior to the computation; |
| the first shell argument must not start with @samp{-}; |
| and each number must be an optional @samp{-} followed by one or more |
| decimal digits, where the first digit is nonzero if there is more than |
| one digit. In the following example, this snippet |
| will print @samp{(2+3)*4 == 20}. |
| |
| @example |
| bar=3 |
| AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4]) |
| echo "(2+$bar)*4 == $foo" |
| @end example |
| @end defmac |
| |
| @defmac AS_VAR_COPY (@var{dest}, @var{source}) |
| @asindex{VAR_COPY} |
| Emit shell code to assign the contents of the polymorphic shell variable |
| @var{source} to the polymorphic shell variable @var{dest}. For example, |
| executing this M4sh snippet will output @samp{bar hi}: |
| |
| @example |
| foo=bar bar=hi |
| AS_VAR_COPY([a], [foo]) |
| AS_VAR_COPY([b], [$foo]) |
| echo "$a $b" |
| @end example |
| |
| When it is necessary to access the contents of an indirect variable |
| inside a shell double-quoted context, the recommended idiom is to first |
| copy the contents into a temporary literal shell variable. |
| |
| @smallexample |
| for header in stdint_h inttypes_h ; do |
| AS_VAR_COPY([var], [ac_cv_header_$header]) |
| AS_ECHO(["$header detected: $var"]) |
| done |
| @end smallexample |
| @end defmac |
| |
| @comment AS_VAR_GET is intentionally undocumented; it can't handle |
| @comment trailing newlines uniformly, and forks too much. |
| |
| @defmac AS_VAR_IF (@var{var}, @ovar{word}, @ovar{if-equal}, @ |
| @ovar{if-not-equal}) |
| @asindex{VAR_IF} |
| Output a shell conditional statement. If the contents of the |
| polymorphic shell variable @var{var} match the string @var{word}, |
| execute @var{if-equal}; otherwise execute @var{if-not-equal}. @var{word} |
| must be a single shell word (typically a quoted string). Avoids |
| shell bugs if an interrupt signal arrives while a command substitution |
| in @var{var} is being expanded. |
| @end defmac |
| |
| @defmac AS_VAR_PUSHDEF (@var{m4-name}, @var{value}) |
| @defmacx AS_VAR_POPDEF (@var{m4-name}) |
| @asindex{VAR_PUSHDEF} |
| @asindex{VAR_POPDEF} |
| @cindex composing variable names |
| @cindex variable names, composing |
| A common M4sh idiom involves composing shell variable names from an m4 |
| argument (for example, writing a macro that uses a cache variable). |
| @var{value} can be an arbitrary string, which will be transliterated |
| into a valid shell name by @code{AS_TR_SH}. In order to access the |
| composed variable name based on @var{value}, it is easier to declare a |
| temporary m4 macro @var{m4-name} with @code{AS_VAR_PUSHDEF}, then use |
| that macro as the argument to subsequent @code{AS_VAR} macros as a |
| polymorphic variable name, and finally free the temporary macro with |
| @code{AS_VAR_POPDEF}. These macros are often followed with @code{dnl}, |
| to avoid excess newlines in the output. |
| |
| Here is an involved example, that shows the power of writing macros that |
| can handle composed shell variable names: |
| |
| @example |
| m4_define([MY_CHECK_HEADER], |
| [AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl |
| AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl |
| AS_VAR_POPDEF([my_Header])dnl |
| ]) |
| MY_CHECK_HEADER([stdint.h]) |
| for header in inttypes.h stdlib.h ; do |
| MY_CHECK_HEADER([$header]) |
| done |
| @end example |
| |
| @noindent |
| In the above example, @code{MY_CHECK_HEADER} can operate on polymorphic |
| variable names. In the first invocation, the m4 argument is |
| @code{stdint.h}, which transliterates into a literal @code{stdint_h}. |
| As a result, the temporary macro @code{my_Header} expands to the literal |
| shell name @samp{ac_cv_header_stdint_h}. In the second invocation, the |
| m4 argument to @code{MY_CHECK_HEADER} is @code{$header}, and the |
| temporary macro @code{my_Header} expands to the indirect shell name |
| @samp{$as_my_Header}. During the shell execution of the for loop, when |
| @samp{$header} contains @samp{inttypes.h}, then @samp{$as_my_Header} |
| contains @samp{ac_cv_header_inttypes_h}. If this script is then run on a |
| platform where all three headers have been previously detected, the |
| output of the script will include: |
| |
| @smallexample |
| header stdint.h detected |
| header inttypes.h detected |
| header stdlib.h detected |
| @end smallexample |
| @end defmac |
| |
| @defmac AS_VAR_SET (@var{var}, @ovar{value}) |
| @asindex{VAR_SET} |
| Emit shell code to assign the contents of the polymorphic shell variable |
| @var{var} to the shell expansion of @var{value}. @var{value} is not |
| subject to field splitting or file name expansion, so if command |
| substitution is used, it may be done with @samp{`""`} rather than using |
| an intermediate variable (@pxref{Shell Substitutions}). However, |
| @var{value} does undergo rescanning for additional macro names; behavior |
| is unspecified if late expansion results in any shell meta-characters. |
| @end defmac |
| |
| @defmac AS_VAR_SET_IF (@var{var}, @ovar{if-set}, @ovar{if-undef}) |
| @asindex{VAR_SET_IF} |
| Emit a shell conditional statement, which executes @var{if-set} if the |
| polymorphic shell variable @code{var} is set to any value, and |
| @var{if-undef} otherwise. |
| @end defmac |
| |
| @defmac AS_VAR_TEST_SET (@var{var}) |
| @asindex{VAR_TEST_SET} |
| Emit a shell statement that results in a successful exit status only if |
| the polymorphic shell variable @code{var} is set. |
| @end defmac |
| |
| @node Initialization Macros |
| @section Initialization Macros |
| |
| @defmac AS_BOURNE_COMPATIBLE |
| @asindex{BOURNE_COMPATIBLE} |
| Set up the shell to be more compatible with the Bourne shell as |
| standardized by POSIX, if possible. This may involve setting |
| environment variables, or setting options, or similar |
| implementation-specific actions. This macro is deprecated, since |
| @code{AS_INIT} already invokes it. |
| @end defmac |
| |
| @defmac AS_INIT |
| @asindex{INIT} |
| @evindex LC_ALL |
| @evindex SHELL |
| Initialize the M4sh environment. This macro calls @code{m4_init}, then |
| outputs the @code{#! /bin/sh} line, a notice about where the output was |
| generated from, and code to sanitize the environment for the rest of the |
| script. Among other initializations, this sets @env{SHELL} to the shell |
| chosen to run the script (@pxref{CONFIG_SHELL}), and @env{LC_ALL} to |
| ensure the C locale. Finally, it changes the current diversion to |
| @code{BODY}. @code{AS_INIT} is called automatically by @code{AC_INIT} |
| and @code{AT_INIT}, so shell code in @file{configure}, |
| @file{config.status}, and @file{testsuite} all benefit from a sanitized |
| shell environment. |
| @end defmac |
| |
| @defmac AS_INIT_GENERATED (@var{file}, @ovar{comment}) |
| @asindex{INIT_GENERATED} |
| Emit shell code to start the creation of a subsidiary shell script in |
| @var{file}, including changing @var{file} to be executable. This macro |
| populates the child script with information learned from the parent |
| (thus, the emitted code is equivalent in effect, but more efficient, |
| than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and |
| @code{AS_SHELL_SANITIZE}). If present, @var{comment} is output near the |
| beginning of the child, prior to the shell initialization code, and is |
| subject to parameter expansion, command substitution, and backslash |
| quote removal. The |
| parent script should check the exit status after this macro, in case |
| @var{file} could not be properly created (for example, if the disk was |
| full). If successfully created, the parent script can then proceed to |
| append additional M4sh constructs into the child script. |
| |
| Note that the child script starts life without a log file open, so if |
| the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you |
| must temporarily disable any attempts to use the log file until after |
| emitting code to open a log within the child. On the other hand, if the |
| parent script has @code{AS_MESSAGE_FD} redirected somewhere besides |
| @samp{1}, then the child script already has code that copies stdout to |
| that descriptor. Currently, the suggested |
| idiom for writing a M4sh shell script from within another script is: |
| |
| @example |
| AS_INIT_GENERATED([@var{file}], [[# My child script. |
| ]]) || @{ AS_ECHO(["Failed to create child script"]); AS_EXIT; @} |
| m4_pushdef([AS_MESSAGE_LOG_FD])dnl |
| cat >> "@var{file}" <<\__EOF__ |
| # Code to initialize AS_MESSAGE_LOG_FD |
| m4_popdef([AS_MESSAGE_LOG_FD])dnl |
| # Additional code |
| __EOF__ |
| @end example |
| |
| This, however, may change in the future as the M4sh interface is |
| stabilized further. |
| |
| Also, be aware that use of @env{LINENO} within the child script may |
| report line numbers relative to their location in the parent script, |
| even when using @code{AS_LINENO_PREPARE}, if the parent script was |
| unable to locate a shell with working @env{LINENO} support. |
| @end defmac |
| |
| @defmac AS_LINENO_PREPARE |
| @asindex{LINENO_PREPARE} |
| @evindex LINENO |
| Find a shell that supports the special variable @env{LINENO}, which |
| contains the number of the currently executing line. This macro is |
| automatically invoked by @code{AC_INIT} in configure scripts. |
| @end defmac |
| |
| @defmac AS_ME_PREPARE |
| @asindex{ME_PREPARE} |
| Set up variable @env{as_me} to be the basename of the currently executing |
| script. This macro is automatically invoked by @code{AC_INIT} in |
| configure scripts. |
| @end defmac |
| |
| @defmac AS_TMPDIR (@var{prefix}, @dvar{dir, $@{TMPDIR:=/tmp@}}) |
| @asindex{TMPDIR} |
| @evindex TMPDIR |
| @ovindex tmp |
| Create, as safely as possible, a temporary sub-directory within |
| @var{dir} with a name starting with @var{prefix}. @var{prefix} should |
| be 2--4 characters, to make it slightly easier to identify the owner of |
| the directory. If @var{dir} is omitted, then the value of @env{TMPDIR} |
| will be used (defaulting to @samp{/tmp}). On success, the name of the |
| newly created directory is stored in the shell variable @code{tmp}. On |
| error, the script is aborted. |
| |
| Typically, this macro is coupled with some exit traps to delete the created |
| directory and its contents on exit or interrupt. However, there is a |
| slight window between when the directory is created and when the name is |
| actually known to the shell, so an interrupt at the right moment might |
| leave the temporary directory behind. Hence it is important to use a |
| @var{prefix} that makes it easier to determine if a leftover temporary |
| directory from an interrupted script is safe to delete. |
| |
| If you set @code{TMPDIR=$tmp} after invoking this macro, you should |
| reset @code{TMPDIR} before deleting the created directory, to avoid |
| breaking commands that rely on @code{$TMPDIR}. |
| |
| The use of the output variable @samp{$tmp} rather than something in the |
| @samp{as_} namespace is historical; it has the unfortunate consequence |
| that reusing this otherwise common name for any other purpose inside |
| your script has the potential to break any cleanup traps designed to |
| remove the temporary directory. |
| @end defmac |
| |
| @defmac AS_SHELL_SANITIZE |
| @asindex{SHELL_SANITIZE} |
| Initialize the shell suitably for @command{configure} scripts. This has |
| the effect of @code{AS_BOURNE_COMPATIBLE}, and sets some other |
| environment variables for predictable results from configuration tests. |
| For example, it sets @env{LC_ALL} to change to the default C locale. |
| @xref{Special Shell Variables}. This macro is deprecated, since |
| @code{AS_INIT} already invokes it. |
| @end defmac |
| |
| |
| @node File Descriptor Macros |
| @section File Descriptor Macros |
| @cindex input |
| @cindex standard input |
| @cindex file descriptors |
| @cindex descriptors |
| @cindex low-level output |
| @cindex output, low-level |
| |
| The following macros define file descriptors used to output messages |
| (or input values) from @file{configure} scripts. |
| For example: |
| |
| @example |
| AS_ECHO(["$wombats found"]) >&AS_MESSAGE_LOG_FD |
| AS_ECHO_N(['Enter desired kangaroo count: ']) >&AS_MESSAGE_FD |
| read kangaroos <&AS_ORIGINAL_STDIN_FD |
| @end example |
| |
| @noindent |
| However doing so is seldom needed, because Autoconf provides higher |
| level macros as described below. |
| |
| @defmac AS_MESSAGE_FD |
| @asindex{MESSAGE_FD} |
| The file descriptor for @samp{checking for...} messages and results. |
| By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh |
| clients. However, @code{AC_INIT} shuffles things around to another file |
| descriptor, in order to allow the @option{-q} option of |
| @command{configure} to choose whether messages should go to the script's |
| standard output or be discarded. |
| |
| If you want to display some messages, consider using one of the printing |
| macros (@pxref{Printing Messages}) instead. Copies of messages output |
| via these macros are also recorded in @file{config.log}. |
| @end defmac |
| |
| @anchor{AS_MESSAGE_LOG_FD} |
| @defmac AS_MESSAGE_LOG_FD |
| @asindex{MESSAGE_LOG_FD} |
| This must either be empty, or expand to a file descriptor for log |
| messages. By default, @code{AS_INIT} sets this macro to the empty |
| string for standalone M4sh clients, thus disabling logging. However, |
| @code{AC_INIT} shuffles things around so that both @command{configure} |
| and @command{config.status} use @file{config.log} for log messages. |
| Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the |
| Compiler}), redirect all output to this descriptor. You may want to do |
| so if you develop such a low-level macro. |
| @end defmac |
| |
| @defmac AS_ORIGINAL_STDIN_FD |
| @asindex{ORIGINAL_STDIN_FD} |
| This must expand to a file descriptor for the original standard input. |
| By default, @code{AS_INIT} sets this macro to @samp{0} for standalone |
| M4sh clients. However, @code{AC_INIT} shuffles things around for |
| safety. |
| |
| When @command{configure} runs, it may accidentally execute an |
| interactive command that has the same name as the non-interactive meant |
| to be used or checked. If the standard input was the terminal, such |
| interactive programs would cause @command{configure} to stop, pending |
| some user input. Therefore @command{configure} redirects its standard |
| input from @file{/dev/null} during its initialization. This is not |
| normally a problem, since @command{configure} normally does not need |
| user input. |
| |
| In the extreme case where your @file{configure} script really needs to |
| obtain some values from the original standard input, you can read them |
| explicitly from @code{AS_ORIGINAL_STDIN_FD}. |
| @end defmac |
| |
| |
| @c =================================================== Writing Autoconf Macros. |
| |
| @node Writing Autoconf Macros |
| @chapter Writing Autoconf Macros |
| |
| When you write a feature test that could be applicable to more than one |
| software package, the best thing to do is encapsulate it in a new macro. |
| Here are some instructions and guidelines for writing Autoconf macros. |
| You should also familiarize yourself with M4sugar (@pxref{Programming in M4}) |
| and M4sh (@pxref{Programming in M4sh}). |
| |
| @menu |
| * Macro Definitions:: Basic format of an Autoconf macro |
| * Macro Names:: What to call your new macros |
| * Dependencies Between Macros:: What to do when macros depend on other macros |
| * Obsoleting Macros:: Warning about old ways of doing things |
| * Coding Style:: Writing Autoconf macros à la Autoconf |
| @end menu |
| |
| @node Macro Definitions |
| @section Macro Definitions |
| |
| @defmac AC_DEFUN (@var{name}, @ovar{body}) |
| @acindex{DEFUN} |
| Autoconf macros are defined using the @code{AC_DEFUN} macro, which is |
| similar to the M4 builtin @code{m4_define} macro; this creates a macro |
| named @var{name} and with @var{body} as its expansion. In addition to |
| defining a macro, @code{AC_DEFUN} adds to it some code that is used to |
| constrain the order in which macros are called, while avoiding redundant |
| output (@pxref{Prerequisite Macros}). |
| @end defmac |
| |
| An Autoconf macro definition looks like this: |
| |
| @example |
| AC_DEFUN(@var{macro-name}, @var{macro-body}) |
| @end example |
| |
| You can refer to any arguments passed to the macro as @samp{$1}, |
| @samp{$2}, etc. @xref{Definitions, , How to define new macros, m4, |
| GNU M4}, for more complete information on writing M4 macros. |
| |
| Most macros fall in one of two general categories. The first category |
| includes macros which take arguments, in order to generate output |
| parameterized by those arguments. Macros in this category are designed |
| to be directly expanded, often multiple times, and should not be used as |
| the argument to @code{AC_REQUIRE}. The other category includes macros |
| which are shorthand for a fixed block of text, and therefore do not take |
| arguments. For this category of macros, directly expanding the macro |
| multiple times results in redundant output, so it is more common to use |
| the macro as the argument to @code{AC_REQUIRE}, or to declare the macro |
| with @code{AC_DEFUN_ONCE} (@pxref{One-Shot Macros}). |
| |
| Be sure to properly quote both the @var{macro-body} @emph{and} the |
| @var{macro-name} to avoid any problems if the macro happens to have |
| been previously defined. |
| |
| Each macro should have a header comment that gives its prototype, and a |
| brief description. When arguments have default values, display them in |
| the prototype. For example: |
| |
| @example |
| # AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1]) |
| # -------------------------------------- |
| m4_define([AC_MSG_ERROR], |
| [@{ AS_MESSAGE([error: $1], [2]) |
| exit m4_default([$2], [1]); @}]) |
| @end example |
| |
| Comments about the macro should be left in the header comment. Most |
| other comments make their way into @file{configure}, so just keep |
| using @samp{#} to introduce comments. |
| |
| @cindex @code{dnl} |
| If you have some special comments about pure M4 code, comments |
| that make no sense in @file{configure} and in the header comment, then |
| use the builtin @code{dnl}: it causes M4 to discard the text |
| through the next newline. |
| |
| Keep in mind that @code{dnl} is rarely needed to introduce comments; |
| @code{dnl} is more useful to get rid of the newlines following macros |
| that produce no output, such as @code{AC_REQUIRE}. |
| |
| Public third-party macros need to use @code{AC_DEFUN}, and not |
| @code{m4_define}, in order to be found by @command{aclocal} |
| (@pxref{Extending aclocal,,, automake, GNU Automake}). |
| Additionally, if it is ever determined that a macro should be made |
| obsolete, it is easy to convert from @code{AC_DEFUN} to @code{AU_DEFUN} |
| in order to have @command{autoupdate} assist the user in choosing a |
| better alternative, but there is no corresponding way to make |
| @code{m4_define} issue an upgrade notice (@pxref{AU_DEFUN}). |
| |
| There is another subtle, but important, difference between using |
| @code{m4_define} and @code{AC_DEFUN}: only the former is unaffected by |
| @code{AC_REQUIRE}. When writing a file, it is always safe to replace a |
| block of text with a @code{m4_define} macro that will expand to the same |
| text. But replacing a block of text with an @code{AC_DEFUN} macro with |
| the same content does not necessarily give the same results, because it |
| changes the location where any embedded but unsatisfied |
| @code{AC_REQUIRE} invocations within the block will be expanded. For an |
| example of this, see @ref{Expanded Before Required}. |
| |
| @node Macro Names |
| @section Macro Names |
| |
| All of the public Autoconf macros have all-uppercase names in the |
| namespace @samp{^AC_} to prevent them from accidentally conflicting with |
| other text; Autoconf also reserves the namespace @samp{^_AC_} for |
| internal macros. All shell variables that they use for internal |
| purposes have mostly-lowercase names starting with @samp{ac_}. Autoconf |
| also uses here-document delimiters in the namespace @samp{^_AC[A-Z]}. During |
| @command{configure}, files produced by Autoconf make heavy use of the |
| file system namespace @samp{^conf}. |
| |
| Since Autoconf is built on top of M4sugar (@pxref{Programming in |
| M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware |
| of those namespaces (@samp{^_?\(m4\|AS\)_}). And since |
| @file{configure.ac} is also designed to be scanned by Autoheader, |
| Autoscan, Autoupdate, and Automake, you should be aware of the |
| @samp{^_?A[HNUM]_} namespaces. In general, you @emph{should not use} |
| the namespace of a package that does not own the macro or shell code you |
| are writing. |
| |
| To ensure that your macros don't conflict with present or future |
| Autoconf macros, you should prefix your own macro names and any shell |
| variables they use with some other sequence. Possibilities include your |
| initials, or an abbreviation for the name of your organization or |
| software package. Historically, people have not always followed the |
| rule of using a namespace appropriate for their package, and this has |
| made it difficult for determining the origin of a macro (and where to |
| report bugs about that macro), as well as difficult for the true |
| namespace owner to add new macros without interference from pre-existing |
| uses of third-party macros. Perhaps the best example of this confusion |
| is the @code{AM_GNU_GETTEXT} macro, which belongs, not to Automake, but |
| to Gettext. |
| |
| Most of the Autoconf macros' names follow a structured naming convention |
| that indicates the kind of feature check by the name. The macro names |
| consist of several words, separated by underscores, going from most |
| general to most specific. The names of their cache variables use the |
| same convention (@pxref{Cache Variable Names}, for more information on |
| them). |
| |
| The first word of the name after the namespace initials (such as |
| @samp{AC_}) usually tells the category |
| of the feature being tested. Here are the categories used in Autoconf for |
| specific test macros, the kind of macro that you are more likely to |
| write. They are also used for cache variables, in all-lowercase. Use |
| them where applicable; where they're not, invent your own categories. |
| |
| @table @code |
| @item C |
| C language builtin features. |
| @item DECL |
| Declarations of C variables in header files. |
| @item FUNC |
| Functions in libraries. |
| @item GROUP |
| POSIX group owners of files. |
| @item HEADER |
| Header files. |
| @item LIB |
| C libraries. |
| @item PROG |
| The base names of programs. |
| @item MEMBER |
| Members of aggregates. |
| @item SYS |
| Operating system features. |
| @item TYPE |
| C builtin or declared types. |
| @item VAR |
| C variables in libraries. |
| @end table |
| |
| After the category comes the name of the particular feature being |
| tested. Any further words in the macro name indicate particular aspects |
| of the feature. For example, @code{AC_PROG_MAKE_SET} checks whether |
| @command{make} sets a variable to its own name. |
| |
| An internal macro should have a name that starts with an underscore; |
| Autoconf internals should therefore start with @samp{_AC_}. |
| Additionally, a macro that is an internal subroutine of another macro |
| should have a name that starts with an underscore and the name of that |
| other macro, followed by one or more words saying what the internal |
| macro does. For example, @code{AC_PATH_X} has internal macros |
| @code{_AC_PATH_X_XMKMF} and @code{_AC_PATH_X_DIRECT}. |
| |
| @node Dependencies Between Macros |
| @section Dependencies Between Macros |
| @cindex Dependencies between macros |
| |
| Some Autoconf macros depend on other macros having been called first in |
| order to work correctly. Autoconf provides a way to ensure that certain |
| macros are called if needed and a way to warn the user if macros are |
| called in an order that might cause incorrect operation. |
| |
| @menu |
| * Prerequisite Macros:: Ensuring required information |
| * Suggested Ordering:: Warning about possible ordering problems |
| * One-Shot Macros:: Ensuring a macro is called only once |
| @end menu |
| |
| @node Prerequisite Macros |
| @subsection Prerequisite Macros |
| @cindex Prerequisite macros |
| @cindex Macros, prerequisites |
| |
| A macro that you write might need to use values that have previously |
| been computed by other macros. For example, @code{AC_DECL_YYTEXT} |
| examines the output of @code{flex} or @code{lex}, so it depends on |
| @code{AC_PROG_LEX} having been called first to set the shell variable |
| @code{LEX}. |
| |
| Rather than forcing the user of the macros to keep track of the |
| dependencies between them, you can use the @code{AC_REQUIRE} macro to do |
| it automatically. @code{AC_REQUIRE} can ensure that a macro is only |
| called if it is needed, and only called once. |
| |
| @defmac AC_REQUIRE (@var{macro-name}) |
| @acindex{REQUIRE} |
| If the M4 macro @var{macro-name} has not already been called, call it |
| (without any arguments). Make sure to quote @var{macro-name} with |
| square brackets. @var{macro-name} must have been defined using |
| @code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate |
| that it has been called. |
| |
| @code{AC_REQUIRE} must be used inside a macro defined by @code{AC_DEFUN}; it |
| must not be called from the top level. Also, it does not make sense to |
| require a macro that takes parameters. |
| @end defmac |
| |
| @code{AC_REQUIRE} is often misunderstood. It really implements |
| dependencies between macros in the sense that if one macro depends upon |
| another, the latter is expanded @emph{before} the body of the |
| former. To be more precise, the required macro is expanded before |
| the outermost defined macro in the current expansion stack. |
| In particular, @samp{AC_REQUIRE([FOO])} is not replaced with the body of |
| @code{FOO}. For instance, this definition of macros: |
| |
| @example |
| @group |
| AC_DEFUN([TRAVOLTA], |
| [test "$body_temperature_in_Celsius" -gt 38 && |
| dance_floor=occupied]) |
| AC_DEFUN([NEWTON_JOHN], |
| [test "x$hair_style" = xcurly && |
| dance_floor=occupied]) |
| @end group |
| |
| @group |
| AC_DEFUN([RESERVE_DANCE_FLOOR], |
| [if test "x`date +%A`" = xSaturday; then |
| AC_REQUIRE([TRAVOLTA]) |
| AC_REQUIRE([NEWTON_JOHN]) |
| fi]) |
| @end group |
| @end example |
| |
| @noindent |
| with this @file{configure.ac} |
| |
| @example |
| AC_INIT([Dance Manager], [1.0], [bug-dance@@example.org]) |
| RESERVE_DANCE_FLOOR |
| if test "x$dance_floor" = xoccupied; then |
| AC_MSG_ERROR([cannot pick up here, let's move]) |
| fi |
| @end example |
| |
| @noindent |
| does not leave you with a better chance to meet a kindred soul on |
| days other than Saturday, since the call to @code{RESERVE_DANCE_FLOOR} |
| expands to: |
| |
| @example |
| @group |
| test "$body_temperature_in_Celsius" -gt 38 && |
| dance_floor=occupied |
| test "x$hair_style" = xcurly && |
| dance_floor=occupied |
| if test "x`date +%A`" = xSaturday; then |
| |
| |
| fi |
| @end group |
| @end example |
| |
| This behavior was chosen on purpose: (i) it prevents messages in |
| required macros from interrupting the messages in the requiring macros; |
| (ii) it avoids bad surprises when shell conditionals are used, as in: |
| |
| @example |
| @group |
| if @dots{}; then |
| AC_REQUIRE([SOME_CHECK]) |
| fi |
| @dots{} |
| SOME_CHECK |
| @end group |
| @end example |
| |
| However, this implementation can lead to another class of problems. |
| Consider the case where an outer macro first expands, then indirectly |
| requires, an inner macro: |
| |
| @example |
| AC_DEFUN([TESTA], [[echo in A |
| if test -n "$SEEN_A" ; then echo duplicate ; fi |
| SEEN_A=:]]) |
| AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B |
| if test -z "$SEEN_A" ; then echo bug ; fi]]) |
| AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]]) |
| AC_DEFUN([OUTER], [[echo in OUTER] |
| TESTA |
| TESTC]) |
| OUTER |
| @end example |
| |
| @noindent |
| Prior to Autoconf 2.64, the implementation of @code{AC_REQUIRE} |
| recognized that @code{TESTB} needed to be hoisted prior to the expansion |
| of @code{OUTER}, but because @code{TESTA} had already been directly |
| expanded, it failed to hoist @code{TESTA}. Therefore, the expansion of |
| @code{TESTB} occurs prior to its prerequisites, leading to the following |
| output: |
| |
| @example |
| in B |
| bug |
| in OUTER |
| in A |
| in C |
| @end example |
| |
| @noindent |
| Newer Autoconf is smart enough to recognize this situation, and hoists |
| @code{TESTA} even though it has already been expanded, but issues a |
| syntax warning in the process. This is because the hoisted expansion of |
| @code{TESTA} defeats the purpose of using @code{AC_REQUIRE} to avoid |
| redundant code, and causes its own set of problems if the hoisted macro |
| is not idempotent: |
| |
| @example |
| in A |
| in B |
| in OUTER |
| in A |
| duplicate |
| in C |
| @end example |
| |
| The bug is not in Autoconf, but in the macro definitions. If you ever |
| pass a particular macro name to @code{AC_REQUIRE}, then you are implying |
| that the macro only needs to be expanded once. But to enforce this, |
| either the macro must be declared with @code{AC_DEFUN_ONCE} (although |
| this only helps in Autoconf 2.64 or newer), or all |
| uses of that macro should be through @code{AC_REQUIRE}; directly |
| expanding the macro defeats the point of using @code{AC_REQUIRE} to |
| eliminate redundant expansion. In the example, this rule of thumb was |
| violated because @code{TESTB} requires @code{TESTA} while @code{OUTER} |
| directly expands it. One way of fixing the bug is to factor |
| @code{TESTA} into two macros, the portion designed for direct and |
| repeated use (here, named @code{TESTA}), and the portion designed for |
| one-shot output and used only inside @code{AC_REQUIRE} (here, named |
| @code{TESTA_PREREQ}). Then, by fixing all clients to use the correct |
| calling convention according to their needs: |
| |
| @example |
| AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]]) |
| AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ |
| if test -n "$SEEN_A" ; then echo duplicate ; fi |
| SEEN_A=:]]) |
| AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B |
| if test -z "$SEEN_A" ; then echo bug ; fi]]) |
| AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]]) |
| AC_DEFUN([OUTER], [[echo in OUTER] |
| TESTA |
| TESTC]) |
| OUTER |
| @end example |
| |
| @noindent |
| the resulting output will then obey all dependency rules and avoid any |
| syntax warnings, whether the script is built with old or new Autoconf |
| versions: |
| |
| @example |
| in A_PREREQ |
| in B |
| in OUTER |
| in A |
| in C |
| @end example |
| |
| You can use the helper macros @code{AS_IF} and @code{AS_CASE} in |
| top-level code to enforce expansion of required macros outside of shell |
| conditional constructs; these helpers are not needed in the bodies of |
| macros defined by @code{AC_DEFUN}. |
| You are furthermore encouraged, although not required, to |
| put all @code{AC_REQUIRE} calls |
| at the beginning of a macro. You can use @code{dnl} to avoid the empty |
| lines they leave. |
| |
| Autoconf will normally warn if an @code{AC_REQUIRE} call refers to a |
| macro that has not been defined. However, the @command{aclocal} tool |
| relies on parsing an incomplete set of input files to trace which macros |
| have been required, in order to then pull in additional files that |
| provide those macros; for this particular use case, pre-defining the |
| macro @code{m4_require_silent_probe} will avoid the warnings. |
| |
| @node Suggested Ordering |
| @subsection Suggested Ordering |
| @cindex Macros, ordering |
| @cindex Ordering macros |
| |
| Some macros should be run before another macro if both are called, but |
| neither @emph{requires} that the other be called. For example, a macro |
| that changes the behavior of the C compiler should be called before any |
| macros that run the C compiler. Many of these dependencies are noted in |
| the documentation. |
| |
| Autoconf provides the @code{AC_BEFORE} macro to warn users when macros |
| with this kind of dependency appear out of order in a |
| @file{configure.ac} file. The warning occurs when creating |
| @command{configure} from @file{configure.ac}, not when running |
| @command{configure}. |
| |
| For example, @code{AC_PROG_CPP} checks whether the C compiler |
| can run the C preprocessor when given the @option{-E} option. It should |
| therefore be called after any macros that change which C compiler is |
| being used, such as @code{AC_PROG_CC}. So @code{AC_PROG_CC} contains: |
| |
| @example |
| AC_BEFORE([$0], [AC_PROG_CPP])dnl |
| @end example |
| |
| @noindent |
| This warns the user if a call to @code{AC_PROG_CPP} has already occurred |
| when @code{AC_PROG_CC} is called. |
| |
| @defmac AC_BEFORE (@var{this-macro-name}, @var{called-macro-name}) |
| @acindex{BEFORE} |
| Make M4 print a warning message to the standard error output if |
| @var{called-macro-name} has already been called. @var{this-macro-name} |
| should be the name of the macro that is calling @code{AC_BEFORE}. The |
| macro @var{called-macro-name} must have been defined using |
| @code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate |
| that it has been called. |
| @end defmac |
| |
| @node One-Shot Macros |
| @subsection One-Shot Macros |
| @cindex One-shot macros |
| @cindex Macros, called once |
| |
| Some macros should be called only once, either because calling them |
| multiple time is unsafe, or because it is bad style. For instance |
| Autoconf ensures that @code{AC_CANONICAL_BUILD} and cousins |
| (@pxref{Canonicalizing}) are evaluated only once, because it makes no |
| sense to run these expensive checks more than once. Such one-shot |
| macros can be defined using @code{AC_DEFUN_ONCE}. |
| |
| @defmac AC_DEFUN_ONCE (@var{macro-name}, @var{macro-body}) |
| @acindex{DEFUN_ONCE} |
| Declare macro @var{macro-name} like @code{AC_DEFUN} would (@pxref{Macro |
| Definitions}), but add additional logic that guarantees that only the |
| first use of the macro (whether by direct expansion or |
| @code{AC_REQUIRE}) causes an expansion of @var{macro-body}; the |
| expansion will occur before the start of any enclosing macro defined by |
| @code{AC_DEFUN}. Subsequent expansions are silently ignored. |
| Generally, it does not make sense for @var{macro-body} to use parameters |
| such as @code{$1}. |
| @end defmac |
| |
| Prior to Autoconf 2.64, a macro defined by @code{AC_DEFUN_ONCE} would |
| emit a warning if it was directly expanded a second time, so for |
| portability, it is better to use @code{AC_REQUIRE} than direct |
| invocation of @var{macro-name} inside a macro defined by @code{AC_DEFUN} |
| (@pxref{Prerequisite Macros}). |
| |
| @node Obsoleting Macros |
| @section Obsoleting Macros |
| @cindex Obsoleting macros |
| @cindex Macros, obsoleting |
| |
| Configuration and portability technology has evolved over the years. |
| Often better ways of solving a particular problem are developed, or |
| ad-hoc approaches are systematized. This process has occurred in many |
| parts of Autoconf. One result is that some of the macros are now |
| considered @dfn{obsolete}; they still work, but are no longer considered |
| the best thing to do, hence they should be replaced with more modern |
| macros. Ideally, @command{autoupdate} should replace the old macro calls |
| with their modern implementation. |
| |
| Autoconf provides a simple means to obsolete a macro. |
| |
| @anchor{AU_DEFUN} |
| @defmac AU_DEFUN (@var{old-macro}, @var{implementation}, @ovar{message}, @ovar{silent}) |
| @auindex{DEFUN} |
| Define @var{old-macro} as @var{implementation}, just like |
| @code{AC_DEFUN}, but also declare @var{old-macro} to be obsolete. |
| When @command{autoupdate} is run, occurrences of @var{old-macro} will |
| be replaced by the text of @var{implementation} in the updated |
| @file{configure.ac} file. |
| |
| If a simple textual replacement is not enough to finish the job of |
| updating a @file{configure.ac} to modern style, provide instructions for |
| whatever additional manual work is required as @var{message}. These |
| instructions will be printed by @command{autoupdate}, and embedded in the |
| updated @file{configure.ac} file, next to the text of @var{implementation}. |
| |
| Normally, @command{autoconf} will also issue a warning (in the |
| ``obsolete'' category) when it expands @var{old-macro}. This warning |
| does not include @var{message}; it only advises the maintainer to run |
| @command{autoupdate}. If it is inappropriate to issue this warning, set |
| the @var{silent} argument to the word @code{silent}. One might want to |
| use a silent @code{AU_DEFUN} when @var{old-macro} is used in a |
| widely-distributed third-party macro. If that macro's maintainers are |
| aware of the need to update their code, it's unnecessary to nag all |
| of the transitive users of @var{old-macro} as well. This capability |
| was added to @code{AU_DEFUN} in Autoconf 2.70; older versions of |
| autoconf will ignore the @var{silent} argument and issue the warning |
| anyway. |
| |
| @strong{Caution:} If @var{implementation} contains M4 or M4sugar macros, |
| they will be evaluated when @command{autoupdate} is run, not emitted |
| verbatim like the rest of @var{implementation}. This cannot be avoided |
| with extra quotation, because then @var{old-macro} will not work when |
| it is called normally. See the definition of @code{AC_FOREACH} in |
| @file{general.m4} for a workaround. |
| @end defmac |
| |
| @defmac AU_ALIAS (@var{old-name}, @var{new-name}, @ovar{silent}) |
| @auindex{ALIAS} |
| A shorthand version of @code{AU_DEFUN}, to be used when a macro has |
| simply been renamed. @command{autoupdate} will replace calls to |
| @var{old-name} with calls to @var{new-name}, keeping any arguments |
| intact. No instructions for additional manual work will be printed. |
| |
| The @var{silent} argument works the same as the @var{silent} argument |
| to @code{AU_DEFUN}. It was added to @code{AU_ALIAS} in Autoconf 2.70. |
| |
| @strong{Caution:} @code{AU_ALIAS} cannot be used when @var{new-name} is |
| an M4 or M4sugar macro. See above. |
| @end defmac |
| |
| @node Coding Style |
| @section Coding Style |
| @cindex Coding style |
| |
| The Autoconf macros follow a strict coding style. You are encouraged to |
| follow this style, especially if you intend to distribute your macro, |
| either by contributing it to Autoconf itself or the |
| @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro |
| Archive}, or by other means. |
| |
| The first requirement is to pay great attention to the quotation. For |
| more details, see @ref{Autoconf Language}, and @ref{M4 Quotation}. |
| |
| Do not try to invent new interfaces. It is likely that there is a macro |
| in Autoconf that resembles the macro you are defining: try to stick to |
| this existing interface (order of arguments, default values, etc.). We |
| @emph{are} conscious that some of these interfaces are not perfect; |
| nevertheless, when harmless, homogeneity should be preferred over |
| creativity. |
| |
| Be careful about clashes both between M4 symbols and between shell |
| variables. |
| |
| If you stick to the suggested M4 naming scheme (@pxref{Macro Names}), |
| you are unlikely to generate conflicts. Nevertheless, when you need to |
| set a special value, @emph{avoid using a regular macro name}; rather, |
| use an ``impossible'' name. For instance, up to version 2.13, the macro |
| @code{AC_SUBST} used to remember what @var{symbol} macros were already defined |
| by setting @code{AC_SUBST_@var{symbol}}, which is a regular macro name. |
| But since there is a macro named @code{AC_SUBST_FILE}, it was just |
| impossible to @samp{AC_SUBST(FILE)}! In this case, |
| @code{AC_SUBST(@var{symbol})} or @code{_AC_SUBST(@var{symbol})} should |
| have been used (yes, with the parentheses). |
| @c or better yet, high-level macros such as @code{m4_expand_once} |
| |
| No Autoconf macro should ever enter the user-variable name space; i.e., |
| except for the variables that are the actual result of running the |
| macro, all shell variables should start with @code{ac_}. In |
| addition, small macros or any macro that is likely to be embedded in |
| other macros should be careful not to use obvious names. |
| |
| @cindex @code{dnl} |
| Do not use @code{dnl} to introduce comments: most of the comments you |
| are likely to write are either header comments which are not output |
| anyway, or comments that should make their way into @file{configure}. |
| There are exceptional cases where you do want to comment special M4 |
| constructs, in which case @code{dnl} is right, but keep in mind that it |
| is unlikely. |
| |
| M4 ignores the leading blanks and newlines before each argument. |
| Use this feature to |
| indent in such a way that arguments are (more or less) aligned with the |
| opening parenthesis of the macro being called. For instance, instead of |
| |
| @example |
| AC_CACHE_CHECK(for EMX OS/2 environment, |
| ac_cv_emxos2, |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])], |
| [ac_cv_emxos2=yes], [ac_cv_emxos2=no])]) |
| @end example |
| |
| @noindent |
| write |
| |
| @example |
| AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])], |
| [ac_cv_emxos2=yes], |
| [ac_cv_emxos2=no])]) |
| @end example |
| |
| @noindent |
| or even |
| |
| @example |
| AC_CACHE_CHECK([for EMX OS/2 environment], |
| [ac_cv_emxos2], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], |
| [return __EMX__;])], |
| [ac_cv_emxos2=yes], |
| [ac_cv_emxos2=no])]) |
| @end example |
| |
| When using @code{AC_RUN_IFELSE} or any macro that cannot work when |
| cross-compiling, provide a pessimistic value (typically @samp{no}). |
| |
| Feel free to use various tricks to prevent auxiliary tools, such as |
| syntax-highlighting editors, from behaving improperly. For instance, |
| instead of: |
| |
| @example |
| m4_bpatsubst([$1], [$"]) |
| @end example |
| |
| @noindent |
| use |
| |
| @example |
| m4_bpatsubst([$1], [$""]) |
| @end example |
| |
| @noindent |
| so that Emacsen do not open an endless ``string'' at the first quote. |
| For the same reasons, avoid: |
| |
| @example |
| test $[#] != 0 |
| @end example |
| |
| @noindent |
| and use: |
| |
| @example |
| test $[@@%:@@] != 0 |
| @end example |
| |
| @noindent |
| Otherwise, the closing bracket would be hidden inside a @samp{#}-comment, |
| breaking the bracket-matching highlighting from Emacsen. Note the |
| preferred style to escape from M4: @samp{$[1]}, @samp{$[@@]}, etc. Do |
| not escape when it is unnecessary. Common examples of useless quotation |
| are @samp{[$]$1} (write @samp{$$1}), @samp{[$]var} (use @samp{$var}), |
| etc. |
| |
| When using @command{sed}, don't use @option{-e} except for indenting |
| purposes. With the @code{s} and @code{y} commands, the preferred |
| separator is @samp{/} unless @samp{/} itself might appear in the pattern |
| or replacement, in which case you should use @samp{|}, or optionally |
| @samp{,} if you know the pattern and replacement cannot contain a file |
| name. If none of these characters will do, choose a printable character |
| that cannot appear in the pattern or replacement. Characters from the |
| set @samp{"#$&'()*;<=>?`|~} are good choices if the pattern or |
| replacement might contain a file name, since they have special meaning |
| to the shell and are less likely to occur in file names. |
| |
| @xref{Macro Definitions}, for details on how to define a macro. If a |
| macro doesn't use @code{AC_REQUIRE}, is expected to never be the object |
| of an @code{AC_REQUIRE} directive, and macros required by other macros |
| inside arguments do not need to be expanded before this macro, then |
| use @code{m4_define}. In case of doubt, use @code{AC_DEFUN}. |
| Also take into account that public third-party macros need to use |
| @code{AC_DEFUN} in order to be found by @command{aclocal} |
| (@pxref{Extending aclocal,,, automake, GNU Automake}). |
| All the @code{AC_REQUIRE} statements should be at the beginning of the |
| macro, and each statement should be followed by @code{dnl}. |
| |
| You should not rely on the number of arguments: instead of checking |
| whether an argument is missing, test that it is not empty. It provides |
| both a simpler and a more predictable interface to the user, and saves |
| room for further arguments. |
| |
| Unless the macro is short, try to leave the closing @samp{])} at the |
| beginning of a line, followed by a comment that repeats the name of the |
| macro being defined. This introduces an additional newline in |
| @command{configure}; normally, that is not a problem, but if you want to |
| remove it you can use @samp{[]dnl} on the last line. You can similarly |
| use @samp{[]dnl} after a macro call to remove its newline. @samp{[]dnl} |
| is recommended instead of @samp{dnl} to ensure that M4 does not |
| interpret the @samp{dnl} as being attached to the preceding text or |
| macro output. For example, instead of: |
| |
| @example |
| AC_DEFUN([AC_PATH_X], |
| [AC_MSG_CHECKING([for X]) |
| AC_REQUIRE_CPP() |
| @r{# @dots{}omitted@dots{}} |
| AC_MSG_RESULT([libraries $x_libraries, headers $x_includes]) |
| fi]) |
| @end example |
| |
| @noindent |
| you would write: |
| |
| @example |
| AC_DEFUN([AC_PATH_X], |
| [AC_REQUIRE_CPP()[]dnl |
| AC_MSG_CHECKING([for X]) |
| @r{# @dots{}omitted@dots{}} |
| AC_MSG_RESULT([libraries $x_libraries, headers $x_includes]) |
| fi[]dnl |
| ])# AC_PATH_X |
| @end example |
| |
| If the macro is long, try to split it into logical chunks. Typically, |
| macros that check for a bug in a function and prepare its |
| @code{AC_LIBOBJ} replacement should have an auxiliary macro to perform |
| this setup. Do not hesitate to introduce auxiliary macros to factor |
| your code. |
| |
| In order to highlight the recommended coding style, here is a macro |
| written the old way: |
| |
| @example |
| dnl Check for EMX on OS/2. |
| dnl _AC_EMXOS2 |
| AC_DEFUN(_AC_EMXOS2, |
| [AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2, |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)], |
| ac_cv_emxos2=yes, ac_cv_emxos2=no)]) |
| test "x$ac_cv_emxos2" = xyes && EMXOS2=yes]) |
| @end example |
| |
| @noindent |
| and the new way: |
| |
| @example |
| # _AC_EMXOS2 |
| # ---------- |
| # Check for EMX on OS/2. |
| m4_define([_AC_EMXOS2], |
| [AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])], |
| [ac_cv_emxos2=yes], |
| [ac_cv_emxos2=no])]) |
| test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl |
| ])# _AC_EMXOS2 |
| @end example |
| |
| |
| |
| |
| @c ============================================= Portable Shell Programming |
| |
| @node Portable Shell |
| @chapter Portable Shell Programming |
| @cindex Portable shell programming |
| |
| When writing your own checks, there are some shell-script programming |
| techniques you should avoid in order to make your code portable. The |
| Bourne shell and upward-compatible shells like the Korn shell and Bash |
| have evolved over the years, and many features added to the original |
| System7 shell are now supported on all interesting porting targets. |
| However, the following discussion between Russ Allbery and Robert Lipe |
| is worth reading: |
| |
| @noindent |
| Russ Allbery: |
| |
| @quotation |
| The GNU assumption that @command{/bin/sh} is the one and only shell |
| leads to a permanent deadlock. Vendors don't want to break users' |
| existing shell scripts, and there are some corner cases in the Bourne |
| shell that are not completely compatible with a POSIX shell. Thus, |
| vendors who have taken this route will @emph{never} (OK@dots{}``never say |
| never'') replace the Bourne shell (as @command{/bin/sh}) with a |
| POSIX shell. |
| @end quotation |
| |
| @noindent |
| Robert Lipe: |
| |
| @quotation |
| This is exactly the problem. While most (at least most System V's) do |
| have a Bourne shell that accepts shell functions most vendor |
| @command{/bin/sh} programs are not the POSIX shell. |
| |
| So while most modern systems do have a shell @emph{somewhere} that meets the |
| POSIX standard, the challenge is to find it. |
| @end quotation |
| |
| For this reason, part of the job of M4sh (@pxref{Programming in M4sh}) |
| is to find such a shell. But to prevent trouble, if you're not using |
| M4sh you should not take advantage of features that were added after Unix |
| version 7, circa 1977 (@pxref{Systemology}); you should not use aliases, |
| negated character classes, or even @command{unset}. @code{#} comments, |
| while not in Unix version 7, were retrofitted in the original Bourne |
| shell and can be assumed to be part of the least common denominator. |
| |
| On the other hand, if you're using M4sh you can assume that the shell |
| has the features that were added in SVR2 (circa 1984), including shell |
| functions, |
| @command{return}, @command{unset}, and I/O redirection for builtins. For |
| more information, refer to @uref{https://@/www.in-ulm.de/@/~mascheck/@/bourne/}. |
| However, some pitfalls have to be avoided for portable use of these |
| constructs; these will be documented in the rest of this chapter. |
| See in particular @ref{Shell Functions} and @ref{Limitations of |
| Builtins, , Limitations of Shell Builtins}. |
| |
| The set of external programs you should run in a @command{configure} script |
| is fairly small. @xref{Utilities in Makefiles, , Utilities in |
| Makefiles, standards, The GNU Coding Standards}, for the list. This |
| restriction allows users to start out with a fairly small set of |
| programs and build the rest, avoiding too many interdependencies between |
| packages. |
| |
| Some of these external utilities have a portable subset of features; see |
| @ref{Limitations of Usual Tools}. |
| |
| There are other sources of documentation about shells. The |
| specification for the POSIX |
| @uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/V3_chap02.html, |
| Shell Command Language}, though more generous than the restrictive shell |
| subset described above, is fairly portable nowadays. Also please see |
| @uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/, the Shell FAQs}. |
| |
| @menu |
| * Systemology:: A zoology of operating systems |
| * Shellology:: A zoology of shells |
| * Invoking the Shell:: Invoking the shell as a command |
| * Here-Documents:: Quirks and tricks |
| * File Descriptors:: FDs and redirections |
| * Signal Handling:: Shells, signals, and headaches |
| * File System Conventions:: File names |
| * Shell Pattern Matching:: Pattern matching |
| * Shell Substitutions:: Variable and command expansions |
| * Assignments:: Varying side effects of assignments |
| * Parentheses:: Parentheses in shell scripts |
| * Special Shell Variables:: Variables you should not change |
| * Shell Functions:: What to look out for if you use them |
| * Limitations of Builtins:: Portable use of not so portable /bin/sh |
| * Limitations of Usual Tools:: Portable use of portable tools |
| @end menu |
| |
| |
| @node Systemology |
| @section Systemology |
| @cindex Systemology |
| |
| This section aims at presenting some systems and pointers to |
| documentation. It may help you addressing particular problems reported |
| by users. |
| |
| @uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX-conforming |
| systems} are derived from the |
| @uref{https://@/en.wikipedia.org/@/wiki/@/Unix, Unix operating system}. |
| |
| The @uref{https://@/bhami.com/@/rosetta.html, Rosetta Stone for Unix} |
| contains a table correlating the features of various POSIX-conforming |
| systems. @uref{https://@/www.levenez.com/@/unix/, Unix History} is a |
| simplified diagram of how many Unix systems were derived from each |
| other. |
| |
| @uref{https://@/heirloom.sourceforge.net/, The Heirloom Project} |
| provides some variants of traditional implementations of Unix utilities. |
| |
| @table @asis |
| @item Darwin |
| @cindex Darwin |
| @cindex macOS |
| @cindex Mac OS X |
| Darwin is a partially proprietary operating system maintained by Apple |
| Computer and used by most of their products. It is also known as macOS, |
| iOS, etc.@: depending on the exact variant. Older versions were called |
| ``Mac OS X.'' |
| |
| By default the file system will be case insensitive, albeit case |
| preserving. This can cause nasty problems: for instance, the |
| installation attempt for a package having an @file{INSTALL} file can |
| result in @samp{make install} reporting that nothing is to be done! |
| |
| Darwin does support case-sensitive file systems, but they must be |
| formatted specially as such, and Apple discourages use of a |
| case-sensitive volume for the base operating system. To build software |
| that expects case-sensitive filenames, it is best to create a separate |
| disk volume or disk image formatted as case sensitive; this can be done |
| using the @command{diskutil} command or the Disk Utility application. |
| |
| @item QNX |
| @cindex QNX |
| @c FIXME: Please, if you feel like writing something more precise, |
| @c it'd be great. In particular, I can't understand the difference with |
| @c QNX Neutrino. |
| QNX is a realtime operating system running on Intel architecture |
| meant to be scalable from the small embedded systems to the hundred |
| processor super-computer. More |
| information is available on the |
| @uref{https://@/blackberry.qnx.com/@/en, QNX home page}. |
| |
| @item Unix version 7 |
| @cindex Unix version 7 |
| @cindex V7 |
| Officially this was called the ``Seventh Edition'' of ``the UNIX |
| time-sharing system'' but we use the more-common name ``Unix version 7''. |
| Documentation is available in the |
| @uref{https://@/s3.amazonaws.com/@/plan9-bell-labs/@/7thEdMan/@/index.html, |
| Unix Seventh Edition Manual}. |
| Previous versions of Unix are called ``Unix version 6'', etc., but |
| they were not as widely used. |
| @end table |
| |
| |
| @node Shellology |
| @section Shellology |
| @cindex Shellology |
| |
| There are several families of shells, most prominently the Bourne family |
| and the C shell family which are deeply incompatible. If you want to |
| write portable shell scripts, avoid members of the C shell family. The |
| @uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/@/shell-differences/, the |
| Shell difference FAQ} includes a small history of POSIX shells, and a |
| comparison between several of them. |
| |
| Below we describe some of the members of the Bourne shell family. |
| |
| @table @asis |
| @item Ash |
| @cindex Ash |
| Ash is often used on GNU/Linux and BSD |
| systems as a light-weight Bourne-compatible shell. Ash 0.2 has some |
| bugs that are fixed in the 0.3.x series, but portable shell scripts |
| should work around them, since version 0.2 is still shipped with many |
| GNU/Linux distributions. |
| |
| To be compatible with Ash 0.2: |
| |
| @itemize @minus |
| @item |
| don't use @samp{$?} after expanding empty or unset variables, |
| or at the start of an @command{eval}: |
| |
| @example |
| foo= |
| false |
| $foo |
| echo "Do not use it: $?" |
| false |
| eval 'echo "Do not use it: $?"' |
| @end example |
| |
| @item |
| don't use command substitution within variable expansion: |
| |
| @example |
| cat $@{FOO=`bar`@} |
| @end example |
| |
| @item |
| beware that single builtin substitutions are not performed by a |
| subshell, hence their effect applies to the current shell! @xref{Shell |
| Substitutions}, item ``Command Substitution''. |
| @end itemize |
| |
| @item Bash |
| @cindex Bash |
| To detect whether you are running Bash, test whether |
| @code{BASH_VERSION} is set. To require |
| POSIX compatibility, run @samp{set -o posix}. @xref{Bash POSIX |
| Mode, , Bash POSIX Mode, bash, The GNU Bash Reference |
| Manual}, for details. |
| |
| @item Bash 2.05 and later |
| @cindex Bash 2.05 and later |
| Versions 2.05 and later of Bash use a different format for the |
| output of the @command{set} builtin, designed to make evaluating its |
| output easier. However, this output is not compatible with earlier |
| versions of Bash (or with many other shells, probably). So if |
| you use Bash 2.05 or higher to execute @command{configure}, |
| you'll need to use Bash 2.05 for all other build tasks as well. |
| |
| @item Ksh |
| @cindex Ksh |
| @cindex Korn shell |
| @prindex @samp{ksh} |
| @prindex @samp{ksh88} |
| @prindex @samp{ksh93} |
| The Korn shell is compatible with the Bourne family and it mostly |
| conforms to POSIX@. It has two major variants commonly |
| called @samp{ksh88} and @samp{ksh93}, named after the years of initial |
| release. It is usually called @command{ksh}, but is called @command{sh} |
| on some hosts if you set your path appropriately. |
| |
| On Solaris 11, @command{/bin/sh} and @command{/usr/bin/ksh} are both |
| @samp{ksh93}. On Solaris 10 and earlier, @command{/bin/sh} is a |
| pre-POSIX Bourne shell and the Korn shell is found elsewhere: |
| @prindex @command{/usr/bin/ksh} on Solaris |
| @command{/usr/bin/ksh} is @samp{ksh88} on Solaris 10, |
| @prindex @command{/usr/xpg4/bin/sh} on Solaris |
| @command{/usr/xpg4/bin/sh} is a POSIX-compliant variant of |
| @samp{ksh88} on Solaris 10 and later, |
| @prindex @command{/usr/dt/bin/dtksh} on Solaris |
| and @command{/usr/dt/bin/dtksh} is @samp{ksh93}. |
| Variants that are not standard may be parts of optional |
| packages. There is no extra charge for these packages, but they are |
| not part of a minimal OS install and therefore some installations may |
| not have it. |
| |
| @item Pdksh |
| @prindex @samp{pdksh} |
| A public-domain clone of the Korn shell called @command{pdksh} is widely |
| available: it has most of the @samp{ksh88} features along with a few of |
| its own. It usually sets @code{KSH_VERSION}, except if invoked as |
| @command{/bin/sh} on OpenBSD, and similarly to Bash you can require |
| POSIX compatibility by running @samp{set -o posix}. Unfortunately, with |
| @command{pdksh} 5.2.14 (the latest stable version as of 2025) |
| POSIX mode is buggy and causes @command{pdksh} to depart from POSIX in |
| at least one respect, see @ref{Shell Substitutions}. |
| |
| @item Zsh |
| @cindex Zsh |
| To detect whether you are running @command{zsh}, test whether |
| @code{ZSH_VERSION} is set. By default @command{zsh} is @emph{not} |
| compatible with the Bourne shell: you must execute @samp{emulate sh}, |
| and for @command{zsh} versions before 3.1.6-dev-18 you must also |
| set @code{NULLCMD} to @samp{:}. @xref{Compatibility, , Compatibility, |
| zsh, The Z Shell Manual}, for details. |
| |
| The default Mac OS X @command{sh} was originally Zsh; it was changed to |
| Bash in Mac OS X 10.2 (2002) and changed back to Zsh in macOS 10.15 (2019). |
| @end table |
| |
| @node Invoking the Shell |
| @section Invoking the Shell |
| @cindex invoking the shell |
| @cindex shell invocation |
| |
| The Korn shell (up to at least version M-12/28/93d) has a bug when |
| invoked on a file whose name does not contain a slash. It first |
| searches for the file's name in @env{PATH}, and if found it executes |
| that rather than the original file. For example, assuming there is a |
| binary executable @file{/usr/bin/script} in your @env{PATH}, the last |
| command in the following example fails because the Korn shell finds |
| @file{/usr/bin/script} and refuses to execute it as a shell script: |
| |
| @example |
| $ @kbd{touch xxyzzyz script} |
| $ @kbd{ksh xxyzzyz} |
| $ @kbd{ksh ./script} |
| $ @kbd{ksh script} |
| ksh: script: cannot execute |
| @end example |
| |
| Bash 2.03 has a bug when invoked with the @option{-c} option: if the |
| option-argument ends in backslash-newline, Bash incorrectly reports a |
| syntax error. The problem does not occur if a character follows the |
| backslash: |
| |
| @example |
| $ @kbd{$ bash -c 'echo foo \} |
| > @kbd{'} |
| bash: -c: line 2: syntax error: unexpected end of file |
| $ @kbd{bash -c 'echo foo \} |
| > @kbd{ '} |
| foo |
| @end example |
| |
| @noindent |
| @xref{Backslash-Newline-Empty}, for how this can cause problems in makefiles. |
| |
| @node Here-Documents |
| @section Here-Documents |
| @cindex Here-documents |
| @cindex Shell here-documents |
| |
| Because unquoted here-documents are subject to parameter expansion and |
| command substitution, the characters @samp{$} and @samp{`} are special |
| in unquoted here-documents and should be escaped by @samp{\} if you want |
| them as-is. Also, @samp{\} is special if it precedes @samp{$}, |
| @samp{`}, newline or @samp{\} itself, so @samp{\} should be doubled if |
| it appears before these characters and you want it as-is. |
| |
| Using command substitutions in a here-document that is fed to a shell |
| function is not portable. For example, with Solaris 10 @command{/bin/sh}: |
| |
| @example |
| $ @kbd{kitty () @{ cat; @}} |
| $ @kbd{kitty <<EOF |
| > `echo ok` |
| > EOF} |
| /tmp/sh199886: cannot open |
| $ @kbd{echo $?} |
| 1 |
| @end example |
| |
| Some shells mishandle large here-documents: for example, |
| Solaris 10 @command{dtksh} and the UnixWare 7.1.1 POSIX shell, which are |
| derived from Korn shell version M-12/28/93d, mishandle braced variable |
| expansion that crosses a 1024- or 4096-byte buffer boundary |
| within a here-document. Only the part of the variable name after the boundary |
| is used. For example, @code{$@{variable@}} could be replaced by the expansion |
| of @code{$@{ble@}}. If the end of the variable name is aligned with the block |
| boundary, the shell reports an error, as if you used @code{$@{@}}. |
| Instead of @code{$@{variable-default@}}, the shell may expand |
| @code{$@{riable-default@}}, or even @code{$@{fault@}}. This bug can often |
| be worked around by omitting the braces: @code{$variable}. The bug was |
| fixed in |
| @samp{ksh93g} (1998-04-30) but as of 2006 many operating systems were |
| still shipping older versions with the bug. |
| |
| Empty here-documents are not portable either; with the following code, |
| @command{zsh} up to at least version 4.3.10 creates a file with a single |
| newline, whereas other shells create an empty file: |
| |
| @example |
| cat >file <<EOF |
| EOF |
| @end example |
| |
| Many shells (including the Bourne shell) implement here-documents |
| inefficiently. In particular, some shells can be extremely inefficient when |
| a single statement contains many here-documents. For instance if your |
| @file{configure.ac} includes something like: |
| |
| @example |
| @group |
| AS_IF([<cross_compiling>], |
| [assume this and that], |
| [check this |
| check that |
| check something else |
| @dots{} |
| on and on forever |
| @dots{}]) |
| @end group |
| @end example |
| |
| A shell parses the whole @code{if}/@code{fi} construct generated by |
| @code{AS_IF}, creating |
| temporary files for each here-document in it. Some shells create links |
| for such here-documents on every @code{fork}, so that the clean-up code |
| they had installed correctly removes them. It is creating the links |
| that can take the shell forever. |
| |
| Moving the tests out of the @code{if}/@code{fi}, or creating multiple |
| @code{if}/@code{fi} constructs, would improve the performance |
| significantly. Anyway, this kind of construct is not exactly the |
| typical use of Autoconf. In fact, it's even not recommended, because M4 |
| macros can't look into shell conditionals, so we may fail to expand a |
| macro when it was expanded before in a conditional path, and the |
| condition turned out to be false at runtime, and we end up not |
| executing the macro at all. |
| |
| Be careful with the use of @samp{<<-} to unindent here-documents. The |
| behavior is only portable for stripping leading @key{TAB}s, and things |
| can silently break if an overzealous editor converts to using leading |
| spaces (not all shells are nice enough to warn about unterminated |
| here-documents). |
| |
| @example |
| $ @kbd{printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done} |
| 1 |
| 2 |
| done |
| $ @kbd{printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done} |
| 1 |
| 2 |
| x |
| done |
| @end example |
| |
| @node File Descriptors |
| @section File Descriptors |
| @cindex Descriptors |
| @cindex File descriptors |
| @cindex Shell file descriptors |
| |
| Most shells, if not all (including Bash, Zsh, Ash), output traces on |
| stderr, even for subshells. This might result in undesirable content |
| if you meant to capture the standard-error output of the inner command: |
| |
| @example |
| $ @kbd{ash -x -c '(eval "echo foo >&2") 2>stderr'} |
| $ @kbd{cat stderr} |
| + eval echo foo >&2 |
| + echo foo |
| foo |
| $ @kbd{bash -x -c '(eval "echo foo >&2") 2>stderr'} |
| $ @kbd{cat stderr} |
| + eval 'echo foo >&2' |
| ++ echo foo |
| foo |
| $ @kbd{zsh -x -c '(eval "echo foo >&2") 2>stderr'} |
| @i{# Traces on startup files deleted here.} |
| $ @kbd{cat stderr} |
| +zsh:1> eval echo foo >&2 |
| +zsh:1> echo foo |
| foo |
| @end example |
| |
| @noindent |
| One workaround is to grep out uninteresting lines, hoping not to remove |
| good ones. |
| |
| If you intend to redirect both standard error and standard output, |
| redirect standard output first. This works better with AIX, |
| since its shell mishandles tracing if standard error is redirected |
| first: |
| |
| @example |
| $ @kbd{sh -x -c ': 2>err >out'} |
| + : |
| + 2> err $ @kbd{cat err} |
| 1> out |
| @end example |
| |
| Don't try to redirect the standard error of a command substitution. It |
| must be done @emph{inside} the command substitution. When running |
| @samp{: `cd /zorglub` 2>/dev/null} expect the error message to |
| escape, while @samp{: `cd /zorglub 2>/dev/null`} works properly. |
| |
| On the other hand, some shells, such as Solaris or FreeBSD |
| @command{/bin/sh}, warn about missing programs before performing |
| redirections. Therefore, to silently check whether a program exists, it |
| is necessary to perform redirections on a subshell or brace group: |
| @example |
| $ @kbd{/bin/sh -c 'nosuch 2>/dev/null'} |
| nosuch: not found |
| $ @kbd{/bin/sh -c '(nosuch) 2>/dev/null'} |
| $ @kbd{/bin/sh -c '@{ nosuch; @} 2>/dev/null'} |
| $ @kbd{bash -c 'nosuch 2>/dev/null'} |
| @end example |
| |
| FreeBSD 6.2 sh may mix the trace output lines from the statements in a |
| shell pipeline. |
| |
| It is worth noting that Zsh (but not Ash nor Bash) makes it possible |
| in assignments though: @samp{foo=`cd /zorglub` 2>/dev/null}. |
| |
| Some shells, like @command{ash}, don't recognize bi-directional |
| redirection (@samp{<>}). And even on shells that recognize it, it is |
| not portable to use on fifos: POSIX does not require read-write support |
| for named pipes, and Cygwin does not support it: |
| |
| @example |
| $ @kbd{mkfifo fifo} |
| $ @kbd{exec 5<>fifo} |
| $ @kbd{echo hi >&5} |
| bash: echo: write error: Communication error on send |
| @end example |
| |
| @noindent |
| Furthermore, versions of @command{dash} before 0.5.6 mistakenly truncate |
| regular files when using @samp{<>}: |
| |
| @example |
| $ @kbd{echo a > file} |
| $ @kbd{bash -c ': 1<>file'; cat file} |
| a |
| $ @kbd{dash -c ': 1<>file'; cat file} |
| $ rm a |
| @end example |
| |
| Solaris 10 @code{/bin/sh} executes redirected compound commands |
| in a subshell, while other shells don't: |
| |
| @example |
| $ @kbd{/bin/sh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} |
| 0 |
| $ @kbd{ksh -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} |
| 1 |
| $ @kbd{bash -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'} |
| 1 |
| @end example |
| |
| Solaris 10 @command{sh} will try to optimize away a @command{:} command |
| (even if it is redirected) in a loop after the first iteration, or in a |
| shell function after the first call: |
| |
| @example |
| $ @kbd{for i in 1 2 3 ; do : >x$i; done} |
| $ @kbd{ls x*} |
| x1 |
| $ @kbd{f () @{ : >$1; @}; f y1; f y2; f y3;} |
| $ @kbd{ls y*} |
| y1 |
| @end example |
| |
| @noindent |
| As a workaround, @command{echo} or @command{eval} can be used. |
| |
| When running a subsidiary program be careful if descriptor 0 is not open |
| for reading or decriptors 1 and 2 are not open for writing, |
| as the subsidiary program might not behave as expected. |
| In particular, don't rely on file descriptors 0, 1, and 2 remaining closed in a |
| subsidiary program. If any of these descriptors is closed, the |
| operating system may open an unspecified file for the descriptor in the |
| newly created process. |
| |
| If you want a file descriptor above 2 to be inherited into a child |
| process, then you must use redirections specific to that command or a |
| containing subshell or command group, rather than relying on |
| @command{exec} in the shell. In @command{ksh} as well as HP-UX |
| @command{sh}, file descriptors above 2 which are opened using |
| @samp{exec @var{n}>file} are closed by a subsequent @samp{exec} (such as |
| that involved in the fork-and-exec which runs a program or script): |
| |
| @example |
| $ @kbd{echo 'echo hello >&5' >k} |
| $ @kbd{/bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} |
| hello |
| $ @kbd{bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} |
| hello |
| $ @kbd{ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t} |
| ./k[1]: 5: cannot open [Bad file number] |
| $ @kbd{ksh -c '(ksh ./k) 5>t; cat t'} |
| hello |
| $ @kbd{ksh -c '@{ ksh ./k; @} 5>t; cat t'} |
| hello |
| $ @kbd{ksh -c '5>t ksh ./k; cat t} |
| hello |
| @end example |
| |
| Don't rely on duplicating a closed file descriptor to cause an |
| error. With Solaris 10 @command{/bin/sh}, failed duplication is silently |
| ignored, which can cause unintended leaks to the original file |
| descriptor. In this example, observe the leak to standard output: |
| |
| @example |
| $ @kbd{bash -c 'echo hi >&3' 3>&-; echo $?} |
| bash: 3: Bad file descriptor |
| 1 |
| $ @kbd{/bin/sh -c 'echo hi >&3' 3>&-; echo $?} |
| hi |
| 0 |
| @end example |
| |
| Fortunately, an attempt to close an already closed file descriptor will |
| portably succeed. Likewise, it is safe to use either style of |
| @samp{@var{n}<&-} or @samp{@var{n}>&-} for closing a file descriptor, |
| even if it doesn't match the read/write mode that the file descriptor |
| was opened with. |
| |
| DOS variants cannot rename or remove open files, such as in |
| @samp{mv foo bar >foo} or @samp{rm foo >foo}, even though this is |
| perfectly portable among POSIX hosts. |
| |
| A few ancient systems reserved some file descriptors. By convention, |
| file descriptor 3 was opened to @file{/dev/tty} when you logged into |
| Eighth Edition (1985) through Tenth Edition Unix (1989). File |
| descriptor 4 had a special use on the Stardent/Kubota Titan (circa |
| 1990), though we don't now remember what it was. Both these systems are |
| obsolete, so it's now safe to treat file descriptors 3 and 4 like any |
| other file descriptors. |
| |
| On the other hand, you can't portably use multi-digit file descriptors. |
| @command{dash} and Solaris @command{ksh} don't understand any file |
| descriptor larger than @samp{9}: |
| |
| @example |
| $ @kbd{bash -c 'exec 10>&-'; echo $?} |
| 0 |
| $ @kbd{ksh -c 'exec 9>&-'; echo $?} |
| 0 |
| $ @kbd{ksh -c 'exec 10>&-'; echo $?} |
| ksh[1]: exec: 10: not found |
| 127 |
| $ @kbd{dash -c 'exec 9>&-'; echo $?} |
| 0 |
| $ @kbd{dash -c 'exec 10>&-'; echo $?} |
| exec: 1: 10: not found |
| 2 |
| @end example |
| |
| @c <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html> |
| @node Signal Handling |
| @section Signal Handling |
| @cindex Signal handling in the shell |
| @cindex Signals, shells and |
| |
| Portable handling of signals within the shell is another major source of |
| headaches. This is worsened by the fact that various different, mutually |
| incompatible approaches are possible in this area, each with its |
| distinctive merits and demerits. A detailed description of these possible |
| approaches, as well as of their pros and cons, can be found in |
| @uref{https://www.cons.org/cracauer/sigint.html, this article}. |
| |
| Solaris 10 @command{/bin/sh} automatically traps most signals by default; |
| the shell still exits with error upon termination by one of those signals, |
| but in such a case the exit status might be somewhat unexpected (even if |
| allowed by POSIX, strictly speaking): |
| @c FIXME: We had a reference for this behavior but the website no longer |
| @c exists and the page is not in the Internet Archive. --zw 2020-07-10. |
| |
| @example |
| $ @kbd{bash -c 'kill -1 $$'; echo $?} # Will exit 128 + (signal number). |
| Hangup |
| 129 |
| $ @kbd{/bin/ksh -c 'kill -15 $$'; echo $?} # Likewise. |
| Terminated |
| 143 |
| $ @kbd{for sig in 1 2 3 15; do} |
| > @kbd{ echo $sig:} |
| > @kbd{ /bin/sh -c "kill -$s \$\$"; echo $?} |
| > @kbd{done} |
| signal 1: |
| Hangup |
| 129 |
| signal 2: |
| 208 |
| signal 3: |
| 208 |
| signal 15: |
| 208 |
| @end example |
| |
| This gets even worse if one is using the POSIX ``wait'' interface to get |
| details about the shell process terminations: it will result in the shell |
| having exited normally, rather than by receiving a signal. |
| |
| @example |
| $ @kbd{cat > foo.c <<'END'} |
| #include <stdio.h> /* for printf */ |
| #include <stdlib.h> /* for system */ |
| #include <sys/wait.h> /* for WIF* macros */ |
| int main(void) |
| @{ |
| int status = system ("kill -15 $$"); |
| printf ("Terminated by signal: %s\n", |
| WIFSIGNALED (status) ? "yes" : "no"); |
| printf ("Exited normally: %s\n", |
| WIFEXITED (status) ? "yes" : "no"); |
| return 0; |
| @} |
| END |
| @c $$ font-lock |
| $ @kbd{cc -o foo foo.c} |
| $ @kbd{./a.out} # On GNU/Linux |
| Terminated by signal: no |
| Exited normally: yes |
| $ @kbd{./a.out} # On Solaris 10 |
| Terminated by signal: yes |
| Exited normally: no |
| @end example |
| |
| Various shells seem to handle @code{SIGQUIT} specially: they ignore it even |
| if it is not blocked, and even if the shell is not running interactively |
| (in fact, even if the shell has no attached tty); among these shells |
| are at least Bash (from version 2 onward), Zsh 4.3.12, Solaris 10 |
| @code{/bin/ksh} and @code{/usr/xpg4/bin/sh}, and AT&T @code{ksh93} (2011). |
| Still, @code{SIGQUIT} seems to be trappable quite portably within all |
| these shells. OTOH, some other shells doesn't special-case the handling |
| of @code{SIGQUIT}; among these shells are at least @code{pdksh} 5.2.14, |
| Solaris 10 and NetBSD 5.1 @code{/bin/sh}, and the Almquist Shell 0.5.5.1. |
| |
| Some shells (especially Korn shells and derivatives) might try to |
| propagate to themselves a signal that has killed a child process; this is |
| not a bug, but a conscious design choice (although its overall value might |
| be debatable). The exact details of how this is attained vary from shell |
| to shell. For example, upon running @code{perl -e 'kill 2, $$'}, after |
| the perl process has been interrupted, AT&T @code{ksh93} (2011) will |
| proceed to send itself a @code{SIGINT}, while Solaris 10 @code{/bin/ksh} |
| and @code{/usr/xpg4/bin/sh} will proceed to exit with status 130 (i.e., |
| 128 + 2). In any case, if there is an active trap associated with |
| @code{SIGINT}, those shells will correctly execute it. |
| |
| @c See: <https://www.austingroupbugs.net/view.php?id=51> |
| Some Korn shells, when a child process die due receiving a signal with |
| signal number @var{n}, can leave in @samp{$?} an exit status of |
| 256+@var{n} instead of the more common 128+@var{n}. Observe the |
| difference between AT&T @code{ksh93} (2011) and @code{bash} 4.1.5 on |
| Debian: |
| |
| @example |
| $ @kbd{/bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'} |
| /bin/ksh: line 1: 7837: Hangup |
| 257 |
| $ @kbd{/bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'} |
| /bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$") |
| 129 |
| @end example |
| |
| @noindent |
| This @command{ksh} behavior is allowed by POSIX, if implemented with |
| due care; see this @uref{https://www.austingroupbugs.net/view.php?id=51, |
| Austin Group discussion} for more background. However, if it is not |
| implemented with proper care, such a behavior might cause problems |
| in some corner cases. To see why, assume we have a ``wrapper'' script |
| like this: |
| |
| @example |
| #!/bin/sh |
| # Ignore some signals in the shell only, not in its child processes. |
| trap : 1 2 13 15 |
| wrapped_command "$@@" |
| ret=$? |
| other_command |
| exit $ret |
| @end example |
| |
| @noindent |
| If @command{wrapped_command} is interrupted by a @code{SIGHUP} (which |
| has signal number 1), @code{ret} will be set to 257. Unless the |
| @command{exit} shell builtin is smart enough to understand that such |
| a value can only have originated from a signal, and adjust the final |
| wait status of the shell appropriately, the value 257 will just get |
| truncated to 1 by the closing @code{exit} call, so that a caller of |
| the script will have no way to determine that termination by a signal |
| was involved. Observe the different behavior of AT&T @code{ksh93} |
| (2011) and @code{bash} 4.1.5 on Debian: |
| |
| @example |
| $ @kbd{cat foo.sh} |
| #!/bin/sh |
| sh -c 'kill -1 $$' |
| ret=$? |
| echo $ret |
| exit $ret |
| $ @kbd{/bin/ksh foo.sh; echo $?} |
| foo.sh: line 2: 12479: Hangup |
| 257 |
| 1 |
| $ @kbd{/bin/bash foo.sh; echo $?} |
| foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$') |
| 129 |
| 129 |
| @end example |
| |
| @node File System Conventions |
| @section File System Conventions |
| @cindex File system conventions |
| |
| Autoconf uses shell-script processing extensively, so the file names |
| that it processes should not contain characters that are special to the |
| shell. Special characters include space, tab, newline, NUL, and |
| the following: |
| |
| @example |
| " # $ & ' ( ) * ; < = > ? [ \ ` | |
| @end example |
| |
| Also, file names should not begin with @samp{~} or @samp{-}, and should |
| contain neither @samp{-} immediately after @samp{/} nor @samp{~} |
| immediately after @samp{:}. On POSIX-like platforms, directory names |
| should not contain @samp{:}, as this runs afoul of @samp{:} used as the |
| path separator. |
| |
| These restrictions apply not only to the files that you distribute, but |
| also to the absolute file names of your source, build, and destination |
| directories. |
| |
| On some POSIX-like platforms, @samp{!} and @samp{^} are special too, so |
| they should be avoided. |
| |
| POSIX lets implementations treat leading @file{//} specially, but |
| requires leading @file{///} and beyond to be equivalent to @file{/}. |
| Most Unix variants treat @file{//} like @file{/}. However, some treat |
| @file{//} as a ``super-root'' that can provide access to files that are |
| not otherwise reachable from @file{/}. The super-root tradition began |
| with Apollo Domain/OS, which died out long ago, but unfortunately Cygwin |
| has revived it. |
| |
| While @command{autoconf} and friends are usually run on some POSIX |
| variety, they can be used on other systems, most notably DOS |
| variants. This impacts several assumptions regarding file names. |
| |
| @noindent |
| For example, the following code: |
| |
| @example |
| case $foo_dir in |
| /*) # Absolute |
| ;; |
| *) |
| foo_dir=$dots$foo_dir ;; |
| esac |
| @end example |
| |
| @noindent |
| fails to properly detect absolute file names on those systems, because |
| they can use a drivespec, and usually use a backslash as directory |
| separator. If you want to be portable to DOS variants (at the |
| price of rejecting valid but oddball POSIX file names like @file{a:\b}), |
| you can check for absolute file names like this: |
| |
| @cindex absolute file names, detect |
| @example |
| case $foo_dir in |
| [\\/]* | ?:[\\/]* ) # Absolute |
| ;; |
| *) |
| foo_dir=$dots$foo_dir ;; |
| esac |
| @end example |
| |
| @noindent |
| Make sure you quote the brackets if appropriate and keep the backslash as |
| first character. @xref{case, , Limitations of Shell Builtins}. |
| |
| Also, because the colon is used as part of a drivespec, these systems don't |
| use it as path separator. When creating or accessing paths, you can use the |
| @code{PATH_SEPARATOR} output variable instead. @command{configure} sets this |
| to the appropriate value for the build system (@samp{:} or @samp{;}) when it |
| starts up. |
| |
| File names need extra care as well. While DOS variants |
| that are POSIXy enough to run @command{autoconf} (such as DJGPP) |
| are usually able to handle long file names properly, there are still |
| limitations that can seriously break packages. Several of these issues |
| can be easily detected by the |
| @uref{https://@/ftp.gnu.org/@/gnu/@/non-gnu/@/doschk/@/doschk-1.1.tar.gz, doschk} |
| package. |
| |
| A short overview follows; problems are marked with SFN/LFN to |
| indicate where they apply: SFN means the issues are only relevant to |
| plain DOS, not to DOS under Microsoft Windows |
| variants, while LFN identifies problems that exist even under |
| Microsoft Windows variants. |
| |
| @table @asis |
| @item No multiple dots (SFN) |
| DOS cannot handle multiple dots in file names. This is an especially |
| important thing to remember when building a portable configure script, |
| as @command{autoconf} uses a .in suffix for template files. |
| |
| This is perfectly OK on POSIX variants: |
| |
| @example |
| AC_CONFIG_HEADERS([config.h]) |
| AC_CONFIG_FILES([source.c foo.bar]) |
| AC_OUTPUT |
| @end example |
| |
| @noindent |
| but it causes problems on DOS, as it requires @samp{config.h.in}, |
| @samp{source.c.in} and @samp{foo.bar.in}. To make your package more portable |
| to DOS-based environments, you should use this instead: |
| |
| @example |
| AC_CONFIG_HEADERS([config.h:config.hin]) |
| AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in]) |
| AC_OUTPUT |
| @end example |
| |
| @item No leading dot (SFN) |
| DOS cannot handle file names that start with a dot. This is usually |
| not important for @command{autoconf}. |
| |
| @item Case insensitivity (LFN) |
| DOS is case insensitive, so you cannot, for example, have both a |
| file called @samp{INSTALL} and a directory called @samp{install}. This |
| also affects @command{make}; if there's a file called @samp{INSTALL} in |
| the directory, @samp{make install} does nothing (unless the |
| @samp{install} target is marked as PHONY). |
| |
| @item The 8+3 limit (SFN) |
| Because the DOS file system only stores the first 8 characters of |
| the file name and the first 3 of the extension, those must be unique. |
| That means that @file{foobar-part1.c}, @file{foobar-part2.c} and |
| @file{foobar-prettybird.c} all resolve to the same file name |
| (@file{FOOBAR-P.C}). The same goes for @file{foo.bar} and |
| @file{foo.bartender}. |
| |
| The 8+3 limit is not usually a problem under Microsoft Windows, as it |
| uses numeric |
| tails in the short version of file names to make them unique. However, a |
| registry setting can turn this behavior off. While this makes it |
| possible to share file trees containing long file names between SFN |
| and LFN environments, it also means the above problem applies there |
| as well. |
| |
| @item Invalid characters (LFN) |
| Some characters are invalid in DOS file names, and should therefore |
| be avoided. In a LFN environment, these are @samp{/}, @samp{\}, |
| @samp{?}, @samp{*}, @samp{:}, @samp{<}, @samp{>}, @samp{|} and @samp{"}. |
| In a SFN environment, other characters are also invalid. These |
| include @samp{+}, @samp{,}, @samp{[} and @samp{]}. |
| |
| @item Invalid names (LFN) |
| Some DOS file names are reserved, and cause problems if you |
| try to use files with those names. These names include @file{CON}, |
| @file{AUX}, @file{COM1}, @file{COM2}, @file{COM3}, @file{COM4}, |
| @file{LPT1}, @file{LPT2}, @file{LPT3}, @file{NUL}, and @file{PRN}. |
| File names are case insensitive, so even names like |
| @file{aux/config.guess} are disallowed. |
| |
| @end table |
| |
| @node Shell Pattern Matching |
| @section Shell Pattern Matching |
| @cindex Shell pattern matching |
| |
| Nowadays portable patterns can use negated character classes like |
| @samp{[!-aeiou]}. The older syntax @samp{[^-aeiou]} is supported by |
| some shells but not others; hence portable scripts should never use |
| @samp{^} as the first character of a bracket pattern. |
| |
| Outside the C locale, patterns like @samp{[a-z]} are problematic since |
| they may match characters that are not lower-case letters. |
| |
| @node Shell Substitutions |
| @section Shell Substitutions |
| @cindex Shell substitutions |
| |
| Contrary to a persistent urban legend, the Bourne shell does not |
| systematically split variables and back-quoted expressions, in particular |
| on the right-hand side of assignments and in the argument of @code{case}. |
| For instance, the following code: |
| |
| @example |
| case "$given_srcdir" in |
| .) top_srcdir="`printf '%s\n' "$dots" | sed 's|/$||'`" ;; |
| *) top_srcdir="$dots$given_srcdir" ;; |
| esac |
| @end example |
| |
| @noindent |
| is more readable when written as: |
| |
| @example |
| case $given_srcdir in |
| .) top_srcdir=`printf '%s\n' "$dots" | sed 's|/$||'` ;; |
| *) top_srcdir=$dots$given_srcdir ;; |
| esac |
| @end example |
| |
| @noindent |
| and in fact it is even @emph{more} portable: in the first case of the |
| first attempt, the computation of @code{top_srcdir} is not portable, |
| since not all shells properly understand @code{"`@dots{}"@dots{}"@dots{}`"}, |
| for example Solaris 10 @command{ksh}: |
| |
| @example |
| $ @kbd{foo="`echo " bar" | sed 's, ,,'`"} |
| ksh: : cannot execute |
| ksh: bar | sed 's, ,,': cannot execute |
| @end example |
| |
| @noindent |
| POSIX does not specify behavior for this sequence. On the other hand, |
| behavior for @code{"`@dots{}\"@dots{}\"@dots{}`"} is specified by POSIX, |
| but in practice, not all shells understand it the same way: pdksh 5.2.14 |
| prints spurious quotes when in POSIX mode: |
| |
| @example |
| $ @kbd{echo "`echo \"hello\"`"} |
| hello |
| $ @kbd{set -o posix} |
| $ @kbd{echo "`echo \"hello\"`"} |
| "hello" |
| @end example |
| |
| @noindent |
| There is just no portable way to use double-quoted strings inside |
| double-quoted back-quoted expressions (pfew!). |
| |
| Bash 4.1 has a bug where quoted empty strings adjacent to unquoted |
| parameter expansions are elided during word splitting. Meanwhile, zsh |
| does not perform word splitting except when in Bourne compatibility |
| mode. In the example below, the correct behavior is to have five |
| arguments to the function, and exactly two spaces on either side of the |
| middle @samp{-}, since word splitting collapses multiple spaces in |
| @samp{$f} but leaves empty arguments intact. |
| |
| @example |
| $ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} |
| 3- - - |
| $ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} |
| 5- - - |
| $ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} |
| 3- - - |
| $ @kbd{zsh -c 'emulate sh;} |
| > @kbd{n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} |
| 5- - - |
| @end example |
| |
| @noindent |
| You can work around this by doing manual word splitting, such as using |
| @samp{"$str" $list} rather than @samp{"$str"$list}. |
| |
| There are also portability pitfalls with particular expansions: |
| |
| @table @code |
| @item $@@ |
| @cindex @code{"$@@"} |
| Autoconf macros often use the @command{set} command to update |
| @samp{$@@}, so if you are writing shell code intended for |
| @command{configure} you should not assume that the value of @samp{$@@} |
| persists for any length of time. |
| |
| You may see usages like @samp{$@{1+"$@@"@}} in older shell scripts |
| designed to work around a portability problem in ancient shells. |
| Unfortunately this runs afoul of bugs in more-recent shells, and |
| nowadays it is better to use plain @samp{"$@@"} instead. |
| |
| The portability problem with ancient shells was significant. |
| When there are no positional arguments @samp{"$@@"} should be discarded, |
| but the original Unix version 7 Bourne shell mistakenly treated it as |
| equivalent to @samp{""} instead, and many ancient shells followed its lead. |
| |
| For many years shell scripts worked around this portability problem by |
| using @samp{$@{1+"$@@"@}} instead of @samp{"$@@"}, and you may see this |
| usage in older scripts. Unfortunately, @samp{$@{1+"$@@"@}} does not |
| work with @command{ksh93} M 93t+ (2009) as shipped in AIX 7.2 (2015), |
| as this shell drops a trailing empty argument: |
| |
| @example |
| $ @kbd{set a b c ""} |
| $ @kbd{set $@{1+"$@@"@}} |
| $ @kbd{echo $#} |
| 3 |
| @end example |
| |
| Also, @samp{$@{1+"$@@"@}} does not work with Zsh 4.2.6 (2005) and |
| earlier, as shipped in Mac OS X releases before 10.5, as this old Zsh |
| incorrectly word splits the result: |
| |
| @example |
| zsh $ @kbd{emulate sh} |
| zsh $ @kbd{for i in "$@@"; do echo $i; done} |
| Hello World |
| ! |
| zsh $ @kbd{for i in $@{1+"$@@"@}; do echo $i; done} |
| Hello |
| World |
| ! |
| @end example |
| |
| To work around these problems Autoconf does two things. First, in the |
| shell code that it generates Autoconf avoids @samp{"$@@"} if it is |
| possible that there may be no positional arguments. You can use this |
| workaround in your own code, too, if you want it to be portable to |
| ancient shells. For example, instead of: |
| |
| @example |
| cat conftest.c "$@@" |
| @end example |
| |
| you can use this: |
| |
| @example |
| case $# in |
| 0) cat conftest.c;; |
| *) cat conftest.c "$@@";; |
| esac |
| @end example |
| |
| @noindent |
| Second, Autoconf-generated @command{configure} scripts work around most |
| of the old Zsh problem by using Zsh's ``global aliases'' to convert |
| @samp{$@{1+"$@@"@}} into @samp{"$@@"} by itself: |
| |
| @example |
| test $@{ZSH_VERSION+y@} && alias -g '$@{1+"$@@"@}'='"$@@"' |
| @end example |
| |
| This workaround is for the benefit of any instances of |
| @samp{$@{1+"$@@"@}} in user-written code appearing in |
| @command{configure} scripts. However, it is not a complete solution, as |
| Zsh recognizes the alias only when a shell word matches it exactly, |
| which means older Zsh still mishandles more-complicated cases like |
| @samp{"foo"$@{1+"$@@"@}}. |
| |
| @item $@{10@} |
| @cindex positional parameters |
| The 10th, 11th, @dots{} positional parameters can be accessed only after |
| a @code{shift}. The 7th Edition shell reported an error if given |
| @code{$@{10@}}, and |
| Solaris 10 @command{/bin/sh} still acts that way: |
| |
| @example |
| $ @kbd{set 1 2 3 4 5 6 7 8 9 10} |
| $ @kbd{echo $@{10@}} |
| bad substitution |
| @end example |
| |
| Conversely, not all shells obey the POSIX rule that when braces are |
| omitted, multiple digits beyond a @samp{$} imply the single-digit |
| positional parameter expansion concatenated with the remaining literal |
| digits. To work around the issue, you must use braces. |
| |
| @example |
| $ @kbd{bash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'} |
| a0 a0 |
| $ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'} |
| j a0 |
| @end example |
| |
| @item $@{@var{var}-@var{value}@} |
| @itemx $@{@var{var}:-@var{value}@} |
| @itemx $@{@var{var}=@var{value}@} |
| @itemx $@{@var{var}:=@var{value}@} |
| @itemx $@{@var{var}?@var{value}@} |
| @itemx $@{@var{var}:?@var{value}@} |
| @itemx $@{@var{var}+@var{value}@} |
| @itemx $@{@var{var}:+@var{value}@} |
| @cindex @code{$@{@var{var}-@var{value}@}} |
| @cindex @code{$@{@var{var}=@var{value}@}} |
| @cindex @code{$@{@var{var}?@var{value}@}} |
| @cindex @code{$@{@var{var}+@var{value}@}} |
| @c Info cannot handle ':' in index entries. |
| @ifnotinfo |
| @cindex @code{$@{@var{var}:-@var{value}@}} |
| @cindex @code{$@{@var{var}:=@var{value}@}} |
| @cindex @code{$@{@var{var}:?@var{value}@}} |
| @cindex @code{$@{@var{var}:+@var{value}@}} |
| @end ifnotinfo |
| When using @samp{$@{@var{var}-@var{value}@}} or |
| similar notations that modify a parameter expansion, |
| POSIX requires that @var{value} must be a single shell word, |
| which can contain quoted strings but cannot contain unquoted spaces. |
| If this requirement is not met Solaris 10 @command{/bin/sh} |
| sometimes complains, and anyway the behavior is not portable. |
| |
| @example |
| $ @kbd{/bin/sh -c 'echo $@{a-b c@}'} |
| /bin/sh: bad substitution |
| $ @kbd{/bin/sh -c 'echo $@{a-'\''b c'\''@}'} |
| b c |
| $ @kbd{/bin/sh -c 'echo "$@{a-b c@}"'} |
| b c |
| $ @kbd{/bin/sh -c 'cat <<EOF |
| $@{a-b c@} |
| EOF} |
| b c |
| @end example |
| |
| Most shells treat the special parameters @code{*} and @code{@@} as being |
| unset if there are no positional parameters. However, some shells treat |
| them as being set to the empty string. POSIX does not clearly specify |
| either behavior. |
| |
| @example |
| $ @kbd{bash -c 'echo "* is $@{*-unset@}."'} |
| * is unset. |
| $ @kbd{dash -c 'echo "* is $@{*-unset@}."'} |
| * is . |
| @end example |
| |
| According to POSIX, if an expansion occurs inside double quotes, then |
| the use of unquoted double quotes within @var{value} is unspecified, and |
| any single quotes become literal characters; in that case, escaping must |
| be done with backslash. Likewise, the use of unquoted here-documents is |
| a case where double quotes have unspecified results: |
| |
| @example |
| $ @kbd{/bin/sh -c 'echo "$@{a-"b c"@}"'} |
| /bin/sh: bad substitution |
| $ @kbd{ksh -c 'echo "$@{a-"b c"@}"'} |
| b c |
| $ @kbd{bash -c 'echo "$@{a-"b c"@}"'} |
| b c |
| $ @kbd{/bin/sh -c 'a=; echo $@{a+'\''b c'\''@}'} |
| b c |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+'\''b c'\''@}"'} |
| 'b c' |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+\"b c\"@}"'} |
| "b c" |
| $ @kbd{/bin/sh -c 'a=; echo "$@{a+b c@}"'} |
| b c |
| $ @kbd{/bin/sh -c 'cat <<EOF |
| $@{a-"b c"@} |
| EOF'} |
| "b c" |
| $ @kbd{/bin/sh -c 'cat <<EOF |
| $@{a-'b c'@} |
| EOF'} |
| 'b c' |
| $ @kbd{bash -c 'cat <<EOF |
| $@{a-"b c"@} |
| EOF'} |
| b c |
| $ @kbd{bash -c 'cat <<EOF |
| $@{a-'b c'@} |
| EOF'} |
| 'b c' |
| @end example |
| |
| Perhaps the easiest way to work around quoting issues in a manner |
| portable to all shells is to place the results in a temporary variable, |
| then use @samp{$t} as the @var{value}, rather than trying to inline |
| the expression needing quoting. |
| |
| @example |
| $ @kbd{/bin/sh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} |
| b c"'@}\ |
| $ @kbd{ksh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} |
| b c"'@}\ |
| $ @kbd{bash -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'} |
| b c"'@}\ |
| @end example |
| |
| @item $@{@var{var}=@var{value}@} |
| @cindex @code{$@{@var{var}=@var{value}@}} |
| When using @samp{$@{@var{var}=@var{value}@}} to assign a default value |
| to @var{var}, remember that even though the assignment to @var{var} does |
| not undergo file name expansion, the result of the variable expansion |
| does unless the expansion occurred within double quotes. In particular, |
| when using @command{:} followed by unquoted variable expansion for the |
| side effect of setting a default value, if the final value of |
| @samp{$var} contains any globbing characters (either from @var{value} or |
| from prior contents), the shell has to spend time performing file name |
| expansion and field splitting even though those results will not be |
| used. Therefore, it is a good idea to consider double quotes when performing |
| default initialization; while remembering how this impacts any quoting |
| characters appearing in @var{value}. |
| |
| @example |
| $ @kbd{time bash -c ': "$@{a=/usr/bin/*@}"; echo "$a"'} |
| /usr/bin/* |
| |
| real 0m0.005s |
| user 0m0.002s |
| sys 0m0.003s |
| $ @kbd{time bash -c ': $@{a=/usr/bin/*@}; echo "$a"'} |
| /usr/bin/* |
| |
| real 0m0.039s |
| user 0m0.026s |
| sys 0m0.009s |
| $ @kbd{time bash -c 'a=/usr/bin/*; : $@{a=noglob@}; echo "$a"'} |
| /usr/bin/* |
| |
| real 0m0.031s |
| user 0m0.020s |
| sys 0m0.010s |
| |
| $ @kbd{time bash -c 'a=/usr/bin/*; : "$@{a=noglob@}"; echo "$a"'} |
| /usr/bin/* |
| |
| real 0m0.006s |
| user 0m0.002s |
| sys 0m0.003s |
| @end example |
| |
| As with @samp{+} and @samp{-}, @var{value} must be a single shell word, |
| otherwise some shells, such as Solaris 10 @command{/bin/sh} or on Digital |
| Unix V 5.0, die because of a ``bad substitution''. Meanwhile, POSIX |
| requires that with @samp{=}, quote removal happens prior to the |
| assignment, and the expansion be the final contents of @var{var} without |
| quoting (and thus subject to field splitting), in contrast to the |
| behavior with @samp{-} passing the quoting through to the final |
| expansion. However, @command{bash} 4.1 does not obey this rule. |
| |
| @example |
| $ @kbd{ksh -c 'echo $@{var-a\ \ b@}'} |
| a b |
| $ @kbd{ksh -c 'echo $@{var=a\ \ b@}'} |
| a b |
| $ @kbd{bash -c 'echo $@{var=a\ \ b@}'} |
| a b |
| @end example |
| |
| Finally, POSIX states that when mixing @samp{$@{a=b@}} with regular |
| commands, it is unspecified whether the assignments affect the parent |
| shell environment. It is best to perform assignments independently from |
| commands, to avoid the problems demonstrated in this example running on |
| Solaris 10: |
| |
| @example |
| $ @kbd{cmd='x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";printf "%s\\n" -$x-'} |
| $ @kbd{bash -c "$cmd"} |
| +b+b+ |
| -b- |
| $ @kbd{/bin/sh -c "$cmd"} |
| ++b+ |
| -- |
| $ @kbd{ksh -c "$cmd"} |
| +b+b+ |
| -- |
| @end example |
| |
| @item $@{@var{var}=@var{value}@} |
| @cindex @code{$@{@var{var}=@var{literal}@}} |
| Solaris 10 @command{/bin/sh} has a frightening bug in its handling of |
| literal assignments. Imagine you need set a variable to a string containing |
| @samp{@}}. This @samp{@}} character confuses Solaris 10 @command{/bin/sh} |
| when the affected variable was already set. This bug can be exercised |
| by running: |
| |
| @example |
| $ @kbd{unset foo} |
| $ @kbd{foo=$@{foo='@}'@}} |
| $ @kbd{echo $foo} |
| @} |
| $ @kbd{foo=$@{foo='@}' # no error; this hints to what the bug is} |
| $ @kbd{echo $foo} |
| @} |
| $ @kbd{foo=$@{foo='@}'@}} |
| $ @kbd{echo $foo} |
| @}@} |
| ^ ugh! |
| @end example |
| |
| It seems that @samp{@}} is interpreted as matching @samp{$@{}, even |
| though it is enclosed in single quotes. The problem doesn't happen |
| using double quotes, or when using a temporary variable holding the |
| problematic string. |
| |
| @item $@{@var{var}=@var{expanded-value}@} |
| @cindex @code{$@{@var{var}=@var{expanded-value}@}} |
| On shells so old that they are no longer relevant, the command |
| |
| @example |
| # Set the shell variable to a default value |
| # if it is not already set. |
| : $@{var="$default"@} |
| @end example |
| |
| @noindent |
| misbehaved badly in some cases. Older scripts worked around the bugs by |
| using one of following two lines, the latter of which was more portable: |
| |
| @example |
| var=$@{var="$default"@} |
| test $@{var+y@} || var=$default |
| @end example |
| |
| @noindent |
| However, these workarounds are no longer needed. |
| |
| @item $@{#@var{var}@} |
| @itemx $@{@var{var}%@var{word}@} |
| @itemx $@{@var{var}%%@var{word}@} |
| @itemx $@{@var{var}#@var{word}@} |
| @itemx $@{@var{var}##@var{word}@} |
| @cindex @code{$@{#@var{var}@}} |
| @cindex @code{$@{@var{var}%@var{word}@}} |
| @cindex @code{$@{@var{var}%%@var{word}@}} |
| @cindex @code{$@{@var{var}#@var{word}@}} |
| @cindex @code{$@{@var{var}##@var{word}@}} |
| POSIX requires support for these usages, but they do not work with many |
| traditional shells, e.g., Solaris 10 @command{/bin/sh}. |
| |
| Also, @command{pdksh} 5.2.14 mishandles some @var{word} forms. For |
| example if @samp{$1} is @samp{a/b} and @samp{$2} is @samp{a}, then |
| @samp{$@{1#$2@}} should yield @samp{/b}, but with @command{pdksh} it |
| yields the empty string. |
| |
| |
| @item `@var{commands}` |
| @cindex @code{`@var{commands}`} |
| @cindex Command Substitution |
| POSIX requires shells to trim all trailing newlines from command |
| output before substituting it, so assignments like |
| @samp{dir=`printf '%s\n' "$file" | tr a A`} do not work as expected if |
| @samp{$file} ends in a newline. |
| |
| While in general it makes no sense, do not substitute a single builtin |
| with side effects, because Ash 0.2, trying to optimize, does not fork a |
| subshell to perform the command. |
| For instance, if you wanted to check that @command{cd} is silent, do not |
| use @samp{test -z "`cd /`"} because the following can happen: |
| |
| @example |
| $ @kbd{pwd} |
| /tmp |
| $ @kbd{test -z "`cd /`" && pwd} |
| / |
| @end example |
| |
| @noindent |
| The result of @samp{foo=`exit 1`} is left as an exercise to the reader. |
| |
| The MSYS shell leaves a stray byte in the expansion of a double-quoted |
| command substitution of a native program, if the end of the substitution |
| is not aligned with the end of the double quote. This may be worked |
| around by inserting another pair of quotes: |
| |
| @example |
| $ @kbd{echo "`printf 'foo\r\n'` bar" > broken} |
| $ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken} |
| - broken differ: char 4, line 1 |
| @end example |
| |
| Upon interrupt or SIGTERM, some shells may abort a command substitution, |
| replace it with a null string, and wrongly evaluate the enclosing |
| command before entering the trap or ending the script. This can lead to |
| spurious errors: |
| |
| @example |
| $ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'} |
| $ @kbd{^C} |
| sh: test: hi: unexpected operator/operand |
| @end example |
| |
| @noindent |
| You can avoid this by assigning the command substitution to a temporary |
| variable: |
| |
| @example |
| $ @kbd{sh -c 'res=`sleep 5; echo hi` |
| if test "x$res" = xhi; then echo yes; fi'} |
| $ @kbd{^C} |
| @end example |
| |
| @item $(@var{commands}) |
| @cindex @code{$(@var{commands})} |
| This construct is meant to replace @samp{`@var{commands}`}, |
| and it has most of the problems listed under @code{`@var{commands}`}. |
| |
| This construct can be |
| nested while this is impossible to do portably with back quotes. |
| Although it is almost universally supported, unfortunately Solaris 10 |
| and earlier releases lack it: |
| |
| @example |
| $ @kbd{showrev -c /bin/sh | grep version} |
| Command version: SunOS 5.10 Generic 142251-02 Sep 2010 |
| $ @kbd{echo $(echo blah)} |
| syntax error: `(' unexpected |
| @end example |
| |
| If you do use @samp{$(@var{commands})}, make sure that the commands |
| do not start with a parenthesis, as that would cause confusion with |
| a different notation @samp{$((@var{expression}))} that in modern |
| shells is an arithmetic expression not a command. To avoid the |
| confusion, insert a space between the two opening parentheses. |
| |
| Avoid @var{commands} that contain unbalanced parentheses in |
| here-documents, comments, or case statement patterns, as many shells |
| mishandle them. For example, Bash 3.1, @samp{ksh88}, @command{pdksh} |
| 5.2.14, and Zsh 4.2.6 all mishandle the following valid command: |
| |
| @example |
| echo $(case x in x) echo hello;; esac) |
| @end example |
| |
| |
| @item $((@var{expression})) |
| @cindex @code{$((@var{expression}))} |
| Arithmetic expansion is not portable as some shells (most |
| notably Solaris 10 @command{/bin/sh}) don't support it. |
| |
| Among shells that do support @samp{$(( ))}, not all of them obey the |
| POSIX rule that octal and hexadecimal constants must be recognized: |
| |
| @example |
| $ @kbd{bash -c 'echo $(( 010 + 0x10 ))'} |
| 24 |
| $ @kbd{zsh -c 'echo $(( 010 + 0x10 ))'} |
| 26 |
| $ @kbd{zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'} |
| 24 |
| $ @kbd{pdksh -c 'echo $(( 010 + 0x10 ))'} |
| pdksh: 010 + 0x10 : bad number `0x10' |
| $ @kbd{pdksh -c 'echo $(( 010 ))'} |
| 10 |
| @end example |
| |
| When it is available, using arithmetic expansion provides a noticeable |
| speedup in script execution; but testing for support requires |
| @command{eval} to avoid syntax errors. The following construct is used |
| by @code{AS_VAR_ARITH} to provide arithmetic computation when all |
| arguments are decimal integers without leading zeros, and all |
| operators are properly quoted and appear as distinct arguments: |
| |
| @example |
| if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then |
| eval 'func_arith () |
| @{ |
| func_arith_result=$(( $* )) |
| @}' |
| else |
| func_arith () |
| @{ |
| func_arith_result=`expr "$@@"` |
| @} |
| fi |
| func_arith 1 + 1 |
| foo=$func_arith_result |
| @end example |
| |
| |
| @item ^ |
| @cindex @code{^} quoting |
| Always quote @samp{^}, otherwise traditional shells such as |
| @command{/bin/sh} on Solaris 10 treat this like @samp{|}. |
| |
| @end table |
| |
| |
| @node Assignments |
| @section Assignments |
| @cindex Shell assignments |
| |
| When setting several variables in a row, be aware that the order of the |
| evaluation is undefined. For instance @samp{foo=1 foo=2; echo $foo} |
| gives @samp{1} with Solaris 10 @command{/bin/sh}, but @samp{2} with Bash. |
| You must use |
| @samp{;} to enforce the order: @samp{foo=1; foo=2; echo $foo}. |
| |
| Don't rely on the following to find @file{subdir/program}: |
| |
| @example |
| PATH=subdir$PATH_SEPARATOR$PATH program |
| @end example |
| |
| @noindent |
| as this does not work with Zsh 3.0.6. Use something like this |
| instead: |
| |
| @example |
| (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program) |
| @end example |
| |
| Don't rely on the exit status of an assignment: Ash 0.2 does not change |
| the status and propagates that of the last statement: |
| |
| @example |
| $ @kbd{false || foo=bar; echo $?} |
| 1 |
| $ @kbd{false || foo=`:`; echo $?} |
| 0 |
| @end example |
| |
| @noindent |
| and to make things even worse, QNX 4.25 just sets the exit status |
| to 0 in any case: |
| |
| @example |
| $ @kbd{foo=`exit 1`; echo $?} |
| 0 |
| @end example |
| |
| To assign default values, follow this algorithm: |
| |
| @enumerate |
| @item |
| If the default value is a literal and does not contain any closing |
| brace, use: |
| |
| @example |
| : "$@{var='my literal'@}" |
| @end example |
| |
| @item |
| If the default value contains no closing brace, has to be expanded, and |
| the variable being initialized is not intended to be IFS-split |
| (i.e., it's not a list), then use: |
| |
| @example |
| : $@{var="$default"@} |
| @end example |
| |
| @item |
| If the default value contains no closing brace, has to be expanded, and |
| the variable being initialized is intended to be IFS-split (i.e., it's a list), |
| then use: |
| |
| @example |
| var=$@{var="$default"@} |
| @end example |
| |
| @item |
| If the default value contains a closing brace, then use: |
| |
| @example |
| test $@{var+y@} || var="has a '@}'" |
| @end example |
| @end enumerate |
| |
| In most cases @samp{var=$@{var="$default"@}} is fine, but in case of |
| doubt, just use the last form. @xref{Shell Substitutions}, items |
| @samp{$@{@var{var}:-@var{value}@}} and @samp{$@{@var{var}=@var{value}@}} |
| for the rationale. |
| |
| @node Parentheses |
| @section Parentheses in Shell Scripts |
| @cindex Shell parentheses |
| |
| Beware of two opening parentheses in a row, as many shell |
| implementations treat them specially, and POSIX says that a portable |
| script cannot use @samp{((} outside the @samp{$((} form used for shell |
| arithmetic. In traditional shells, @samp{((cat))} behaves like |
| @samp{(cat)}; but many shells, including |
| Bash and the Korn shell, treat @samp{((cat))} as an arithmetic |
| expression equivalent to @samp{let "cat"}, and may or may not report an |
| error when they detect that @samp{cat} is not a number. As another |
| example, @samp{pdksh} 5.2.14 does not treat the following code |
| as a traditional shell would: |
| |
| @example |
| if ((true) || false); then |
| echo ok |
| fi |
| @end example |
| |
| @noindent |
| To work around this problem, insert a space between the two opening |
| parentheses. There is a similar problem and workaround with |
| @samp{$((}; see @ref{Shell Substitutions}. |
| |
| @node Special Shell Variables |
| @section Special Shell Variables |
| @cindex Shell variables |
| @cindex Special shell variables |
| |
| Some shell variables should not be used, since they can have a deep |
| influence on the behavior of the shell. In order to recover a sane |
| behavior from the shell, some variables should be unset; M4sh takes |
| care of this and provides fallback values, whenever needed, to cater |
| for a very old @file{/bin/sh} that does not support @command{unset}. |
| (@pxref{Portable Shell, , Portable Shell Programming}). |
| |
| As a general rule, shell variable names containing a lower-case letter |
| are safe; you can define and use these variables without worrying about |
| their effect on the underlying system, and without worrying about |
| whether the shell changes them unexpectedly. (The exception is the |
| shell variable @code{status}, as described below.) |
| |
| Here is a list of names that are known to cause trouble. This list is |
| not exhaustive, but you should be safe if you avoid the name |
| @code{status} and names containing only upper-case letters and |
| underscores. |
| |
| @c Alphabetical order, case insensitive, 'A' before 'a'. |
| @table @code |
| @item ? |
| Not all shells correctly reset @samp{$?} after conditionals (@pxref{if, |
| , Limitations of Shell Builtins}). Not all shells manage @samp{$?} |
| correctly in shell functions (@pxref{Shell Functions}) or in traps |
| (@pxref{trap, , Limitations of Shell Builtins}). Not all shells reset |
| @samp{$?} to zero after an empty command. |
| |
| @example |
| $ @kbd{bash -c 'false; $empty; echo $?'} |
| 0 |
| $ @kbd{zsh -c 'false; $empty; echo $?'} |
| 1 |
| @end example |
| |
| @item _ |
| @evindex _ |
| Many shells reserve @samp{$_} for various purposes, e.g., the name of |
| the last command executed. |
| |
| @item CDPATH |
| @evindex CDPATH |
| When this variable is set it specifies a list of directories to search |
| when invoking @code{cd} with a relative file name that did not start |
| with @samp{./} or @samp{../}. POSIX |
| says that if a nonempty directory name from @env{CDPATH} |
| is used successfully, @code{cd} prints the resulting absolute |
| file name. Unfortunately this output can break idioms like |
| @samp{abs=`cd src && pwd`} because @code{abs} receives the name twice. |
| Also, many shells do not conform to this part of POSIX; for |
| example, @command{zsh} prints the result only if a directory name |
| other than @file{.} was chosen from @env{CDPATH}. |
| |
| In practice the shells that have this problem also support |
| @command{unset}, so you can work around the problem as follows: |
| |
| @example |
| (unset CDPATH) >/dev/null 2>&1 && unset CDPATH |
| @end example |
| |
| You can also avoid output by ensuring that your directory name is |
| absolute or anchored at @samp{./}, as in @samp{abs=`cd ./src && pwd`}. |
| |
| Configure scripts use M4sh, which automatically unsets @env{CDPATH} if |
| possible, so you need not worry about this problem in those scripts. |
| |
| @item CLICOLOR_FORCE |
| @evindex CLICOLOR_FORCE |
| When this variable is set, some implementations of tools like |
| @command{ls} attempt to add color to their output via terminal escape |
| sequences, even when the output is not directed to a terminal, and can |
| thus cause spurious failures in scripts. Configure scripts use M4sh, |
| which automatically unsets this variable. |
| |
| @item DUALCASE |
| @evindex DUALCASE |
| In the MKS shell, case statements and file name generation are |
| case-insensitive unless @env{DUALCASE} is nonzero. |
| Autoconf-generated scripts export this variable when they start up. |
| |
| @item ENV |
| @itemx MAIL |
| @itemx MAILPATH |
| @itemx PS1 |
| @itemx PS2 |
| @itemx PS4 |
| @evindex ENV |
| @evindex MAIL |
| @evindex MAILPATH |
| @evindex PS1 |
| @evindex PS2 |
| @evindex PS4 |
| These variables should not matter for shell scripts, since they are |
| supposed to affect only interactive shells. However, at least one |
| shell (the pre-3.0 UWIN Korn shell) gets confused about |
| whether it is interactive, which means that (for example) a @env{PS1} |
| with a side effect can unexpectedly modify @samp{$?}. To work around |
| this bug, M4sh scripts (including @file{configure} scripts) do something |
| like this: |
| |
| @example |
| (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH |
| PS1='$ ' |
| PS2='> ' |
| PS4='+ ' |
| @end example |
| |
| @noindent |
| (actually, there is some complication due to bugs in @command{unset}; |
| @pxref{unset, , Limitations of Shell Builtins}). |
| |
| @item FPATH |
| @evindex FPATH |
| The Korn shell uses @env{FPATH} to find shell functions, so avoid |
| @env{FPATH} in portable scripts. @env{FPATH} is consulted after |
| @env{PATH}, but you still need to be wary of tests that use @env{PATH} |
| to find whether a command exists, since they might report the wrong |
| result if @env{FPATH} is also set. |
| |
| @item GREP_OPTIONS |
| @evindex GREP_OPTIONS |
| When this variable is set, some implementations of @command{grep} honor |
| these options, even if the options include direction to enable colored |
| output via terminal escape sequences, and the result can cause spurious |
| failures when the output is not directed to a terminal. Configure |
| scripts use M4sh, which automatically unsets this variable. |
| |
| @item IFS |
| @evindex IFS |
| Long ago, shell scripts inherited @env{IFS} from the environment, |
| but this caused many problems so modern shells ignore any environment |
| settings for @env{IFS}. |
| |
| Don't set the first character of @env{IFS} to backslash. Indeed, |
| Bourne shells use the first character (backslash) when joining the |
| components in @samp{"$@@"} and some shells then reinterpret (!)@: the |
| backslash escapes, so you can end up with backspace and other strange |
| characters. |
| |
| The proper value for @env{IFS} (in regular code, not when performing |
| splits) is @samp{@key{SPC}@key{TAB}@key{RET}}. The first character is |
| especially important, as it is used to join the arguments in @samp{$*}; |
| however, note that traditional shells, but also bash-2.04, fail to adhere |
| to this and join with a space anyway. |
| |
| M4sh guarantees that @env{IFS} will have the default value at the |
| beginning of a script, and many macros within autoconf rely on this |
| setting. It is okay to use blocks of shell code that temporarily change |
| the value of @env{IFS} in order to split on another character, but |
| remember to restore it before expanding further macros. |
| |
| Unsetting @code{IFS} instead of resetting it to the default sequence |
| is not suggested, since code that tries to save and restore the |
| variable's value will incorrectly reset it to an empty value, thus |
| disabling field splitting: |
| |
| @example |
| unset IFS |
| # default separators used for field splitting |
| |
| save_IFS=$IFS |
| IFS=: |
| # ... |
| IFS=$save_IFS |
| # no field splitting performed |
| @end example |
| |
| @item LANG |
| @itemx LC_ALL |
| @itemx LC_COLLATE |
| @itemx LC_CTYPE |
| @itemx LC_MESSAGES |
| @itemx LC_MONETARY |
| @itemx LC_NUMERIC |
| @itemx LC_TIME |
| @evindex LANG |
| @evindex LC_ALL |
| @evindex LC_COLLATE |
| @evindex LC_CTYPE |
| @evindex LC_MESSAGES |
| @evindex LC_MONETARY |
| @evindex LC_NUMERIC |
| @evindex LC_TIME |
| |
| You should set all these variables to @samp{C} because so much |
| configuration code assumes the C locale and POSIX requires that locale |
| environment variables be set to @samp{C} if the C locale is desired; |
| @file{configure} scripts and M4sh do that for you. |
| Export these variables after setting them. |
| |
| @item LANGUAGE |
| @evindex LANGUAGE |
| |
| @env{LANGUAGE} is not specified by POSIX, but it is a GNU |
| extension that overrides @env{LC_ALL} in some cases, so you (or M4sh) |
| should set it too. |
| |
| @item LC_ADDRESS |
| @itemx LC_IDENTIFICATION |
| @itemx LC_MEASUREMENT |
| @itemx LC_NAME |
| @itemx LC_PAPER |
| @itemx LC_TELEPHONE |
| @evindex LC_ADDRESS |
| @evindex LC_IDENTIFICATION |
| @evindex LC_MEASUREMENT |
| @evindex LC_NAME |
| @evindex LC_PAPER |
| @evindex LC_TELEPHONE |
| |
| These locale environment variables are GNU extensions. They |
| are treated like their POSIX brethren (@env{LC_COLLATE}, |
| etc.)@: as described above. |
| |
| @item LINENO |
| @evindex LINENO |
| Most modern shells provide the current line number in @code{LINENO}. |
| Its value is the line number of the beginning of the current command. |
| M4sh, and hence Autoconf, attempts to execute @command{configure} with |
| a shell that supports @code{LINENO}. If no such shell is available, it |
| attempts to implement @code{LINENO} with a Sed prepass that replaces each |
| instance of the string @code{$LINENO} (not followed by an alphanumeric |
| character) with the line's number. In M4sh scripts you should execute |
| @code{AS_LINENO_PREPARE} so that these workarounds are included in |
| your script; configure scripts do this automatically in @code{AC_INIT}. |
| |
| You should not rely on @code{LINENO} within @command{eval} or shell |
| functions, as the behavior differs in practice. The presence of a |
| quoted newline within simple commands can alter which line number is |
| used as the starting point for @code{$LINENO} substitutions within that |
| command. Also, the possibility of the Sed prepass means that you should |
| not rely on @code{$LINENO} when quoted, when in here-documents, or when |
| line continuations are used. Subshells should be OK, though. In the |
| following example, lines 1, 9, and 14 are portable, but the other |
| instances of @code{$LINENO} do not have deterministic values: |
| |
| @example |
| @group |
| $ @kbd{cat lineno} |
| echo 1. $LINENO |
| echo "2. $LINENO |
| 3. $LINENO" |
| cat <<EOF |
| 5. $LINENO |
| 6. $LINENO |
| 7. \$LINENO |
| EOF |
| ( echo 9. $LINENO ) |
| eval 'echo 10. $LINENO' |
| eval 'echo 11. $LINENO |
| echo 12. $LINENO' |
| echo 13. '$LINENO' |
| echo 14. $LINENO ' |
| 15.' $LINENO |
| f () @{ echo $1 $LINENO; |
| echo $1 $LINENO @} |
| f 18. |
| echo 19. \ |
| $LINENO |
| @end group |
| @group |
| $ @kbd{bash-3.2 ./lineno} |
| 1. 1 |
| 2. 3 |
| 3. 3 |
| 5. 4 |
| 6. 4 |
| 7. $LINENO |
| 9. 9 |
| 10. 10 |
| 11. 12 |
| 12. 13 |
| 13. $LINENO |
| 14. 14 |
| 15. 14 |
| 18. 16 |
| 18. 17 |
| 19. 19 |
| @end group |
| @group |
| $ @kbd{zsh-4.3.4 ./lineno} |
| 1. 1 |
| 2. 2 |
| 3. 2 |
| 5. 4 |
| 6. 4 |
| 7. $LINENO |
| 9. 9 |
| 10. 1 |
| 11. 1 |
| 12. 2 |
| 13. $LINENO |
| 14. 14 |
| 15. 14 |
| 18. 0 |
| 18. 1 |
| 19. 19 |
| @end group |
| @group |
| $ @kbd{pdksh-5.2.14 ./lineno} |
| 1. 1 |
| 2. 2 |
| 3. 2 |
| 5. 4 |
| 6. 4 |
| 7. $LINENO |
| 9. 9 |
| 10. 0 |
| 11. 0 |
| 12. 0 |
| 13. $LINENO |
| 14. 14 |
| 15. 14 |
| 18. 16 |
| 18. 17 |
| 19. 19 |
| @end group |
| @group |
| $ @kbd{sed '=' <lineno |} |
| > @kbd{ sed '} |
| > @kbd{ N} |
| > @kbd{ s,$,-,} |
| > @kbd{ t loop} |
| > @kbd{ :loop} |
| > @kbd{ s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,} |
| > @kbd{ t loop} |
| > @kbd{ s,-$,,} |
| > @kbd{ s,^[0-9]*\n,,} |
| > @kbd{ ' |} |
| > @kbd{ sh} |
| 1. 1 |
| 2. 2 |
| 3. 3 |
| 5. 5 |
| 6. 6 |
| 7. \7 |
| 9. 9 |
| 10. 10 |
| 11. 11 |
| 12. 12 |
| 13. 13 |
| 14. 14 |
| 15. 15 |
| 18. 16 |
| 18. 17 |
| 19. 20 |
| @end group |
| @end example |
| |
| In particular, note that @file{config.status} (and any other subsidiary |
| script created by @code{AS_INIT_GENERATED}) might report line numbers |
| relative to the parent script as a result of the potential Sed pass. |
| |
| @item NULLCMD |
| @evindex NULLCMD |
| When executing the command @samp{>foo}, @command{zsh} executes |
| @samp{$NULLCMD >foo} unless it is operating in Bourne shell |
| compatibility mode and the @command{zsh} version is newer |
| than 3.1.6-dev-18. If you are using an older @command{zsh} |
| and forget to set @env{NULLCMD}, |
| your script might be suspended waiting for data on its standard input. |
| |
| @item options |
| @evindex options |
| For @command{zsh} 4.3.10, @env{options} is treated as an associative |
| array even after @code{emulate sh}, so it should not be used. |
| |
| @item PATH_SEPARATOR |
| @evindex PATH_SEPARATOR |
| On DJGPP systems, the @env{PATH_SEPARATOR} environment |
| variable can be set to either @samp{:} or @samp{;} to control the path |
| separator Bash uses to set up certain environment variables (such as |
| @env{PATH}). You can set this variable to @samp{;} if you want |
| @command{configure} to use @samp{;} as a separator; this might be useful |
| if you plan to use non-POSIX shells to execute files. @xref{File System |
| Conventions}, for more information about @code{PATH_SEPARATOR}. |
| |
| @item POSIXLY_CORRECT |
| @evindex POSIXLY_CORRECT |
| In the GNU environment, exporting @env{POSIXLY_CORRECT} with any value |
| (even empty) causes programs to try harder to conform to POSIX@. |
| Autoconf does not directly manipulate this variable, but @command{bash} |
| ties the shell variable @env{POSIXLY_CORRECT} to whether the script is |
| running in POSIX mode. Therefore, take care when exporting or unsetting |
| this variable, so as not to change whether @command{bash} is in POSIX |
| mode. |
| |
| @example |
| $ @kbd{bash --posix -c 'set -o | grep posix} |
| > @kbd{unset POSIXLY_CORRECT} |
| > @kbd{set -o | grep posix'} |
| posix on |
| posix off |
| @end example |
| |
| @item PWD |
| @evindex PWD |
| POSIX requires that @command{cd} |
| must update the @env{PWD} environment variable to point |
| to the name of the current directory, but traditional shells |
| do not support this. This can cause confusion if one shell instance |
| maintains @env{PWD} but a subsidiary and different shell does not know |
| about @env{PWD} and executes @command{cd}; in this case @env{PWD} |
| points to the wrong directory. Use @samp{`pwd`} rather than |
| @samp{$PWD}. |
| |
| @item RANDOM |
| @evindex RANDOM |
| Many shells provide @code{RANDOM}, a variable that returns a different |
| integer each time it is used. It is common |
| practice to use @code{$RANDOM} as part of a file name, but code |
| shouldn't rely on @code{$RANDOM} expanding to a nonempty string. |
| |
| @item status |
| @evindex status |
| This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6), |
| hence read-only. Do not use it. |
| @end table |
| |
| @node Shell Functions |
| @section Shell Functions |
| @cindex Shell Functions |
| |
| Nowadays, it is difficult to find a shell that does not support |
| shell functions at all. However, some differences should be expected. |
| |
| When declaring a shell function, you must include whitespace between the |
| @samp{)} after the function name and the start of the compound |
| expression, to avoid upsetting @command{ksh}. While it is possible to |
| use any compound command, most scripts use @samp{@{@dots{}@}}. |
| |
| @example |
| $ @kbd{/bin/sh -c 'a()@{ echo hi;@}; a'} |
| hi |
| $ @kbd{ksh -c 'a()@{ echo hi;@}; a'} |
| ksh: syntax error at line 1: `@}' unexpected |
| $ @kbd{ksh -c 'a() @{ echo hi;@}; a'} |
| hi |
| @end example |
| |
| Inside a shell function, you should not rely on the error status of a |
| subshell if the last command of that subshell was @code{exit} or |
| @code{trap}, as this triggers bugs in zsh 4.x; while Autoconf tries to |
| find a shell that does not exhibit the bug, zsh might be the only shell |
| present on the user's machine. |
| |
| Likewise, the state of @samp{$?} is not reliable when entering a shell |
| function. This has the effect that using a function as the first |
| command in a @command{trap} handler can cause problems. |
| |
| @example |
| $ @kbd{bash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?} |
| 2 |
| 2 |
| $ @kbd{ash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?} |
| 0 |
| 2 |
| @end example |
| |
| DJGPP bash 2.04 has a bug in that @command{return} from a |
| shell function which also used a command substitution causes a |
| segmentation fault. To work around the issue, you can use |
| @command{return} from a subshell, or @samp{AS_SET_STATUS} as last command |
| in the execution flow of the function (@pxref{Common Shell Constructs}). |
| |
| Not all shells treat shell functions as simple commands impacted by |
| @samp{set -e}, for example with Solaris 10 @command{/bin/sh}: |
| |
| @example |
| $ @kbd{bash -c 'f() @{ return 1; @}; set -e; f; echo oops'} |
| $ @kbd{/bin/sh -c 'f() @{ return 1; @}; set -e; f; echo oops'} |
| oops |
| @end example |
| |
| Shell variables and functions may share the same namespace, for example |
| with Solaris 10 @command{/bin/sh}: |
| |
| @example |
| $ @kbd{f () @{ :; @}; f=; f} |
| f: not found |
| @end example |
| |
| @noindent |
| For this reason, Autoconf (actually M4sh, @pxref{Programming in M4sh}) |
| uses the prefix @samp{as_fn_} for its functions. |
| |
| Handling of positional parameters and shell options varies among shells. |
| For example, Korn shells reset and restore trace output (@samp{set -x}) |
| and other options upon function entry and exit. |
| |
| It is not portable to pass temporary environment variables to shell |
| functions. Solaris 10 @command{/bin/sh} does not see the variable. |
| Meanwhile, not all shells follow the POSIX rule that the assignment must |
| affect the current environment in the same manner as special built-ins. |
| |
| @example |
| $ @kbd{/bin/sh -c 'func() @{ echo $a;@}; a=1 func; echo $a'} |
| @result{} |
| @result{} |
| $ @kbd{ash -c 'func() @{ echo $a;@}; a=1 func; echo $a'} |
| @result{}1 |
| @result{} |
| $ @kbd{bash -c 'set -o posix; func() @{ echo $a;@}; a=1 func; echo $a'} |
| @result{}1 |
| @result{}1 |
| @end example |
| |
| Some ancient Bourne shell variants with function support did not reset |
| @samp{$@var{i}, @var{i} >= 0}, upon function exit, so effectively the |
| arguments of the script were lost after the first function invocation. |
| It is probably not worth worrying about these shells any more. |
| |
| With AIX sh, a @command{trap} on 0 installed in a shell function |
| triggers at function exit rather than at script exit. @xref{trap, , |
| Limitations of Shell Builtins}. |
| |
| @node Limitations of Builtins |
| @section Limitations of Shell Builtins |
| @cindex Shell builtins |
| @cindex Limitations of shell builtins |
| |
| No, no, we are serious: some shells do have limitations! :) |
| |
| You should always keep in mind that any builtin or command may support |
| options, and therefore differ in behavior with arguments |
| starting with a dash. For instance, even the innocent @samp{echo "$word"} |
| can give unexpected results when @code{word} starts with a dash. To avoid |
| this problem, use @samp{printf '%s\n' "$word"}. Many of these limitations |
| can be worked around using M4sh (@pxref{Programming in M4sh}). |
| |
| @c This table includes things like '@command{test} (files)', so we can't |
| @c use @table @command. |
| @table @asis |
| @item @command{.} |
| @c -------------- |
| @prindex @command{.} |
| Use @command{.} only with regular files (use @samp{test -f}). Bash |
| 2.03, for instance, chokes on @samp{. /dev/null}. Remember that |
| @command{.} uses @env{PATH} if its argument contains no slashes. Also, |
| some shells, including bash 3.2, implicitly append the current directory |
| to this @env{PATH} search, even though POSIX forbids it. So if you want |
| to use @command{.} on a file @file{foo} in the current directory, you |
| must use @samp{. ./foo}. |
| |
| Not all shells gracefully handle syntax errors within a sourced file. |
| On one extreme, some non-interactive shells abort the entire script. On |
| the other, @command{zsh} 4.3.10 has a bug where it fails to react to the |
| syntax error. |
| |
| @example |
| $ @kbd{echo 'fi' > syntax} |
| $ @kbd{bash -c '. ./syntax; echo $?'} |
| ./syntax: line 1: syntax error near unexpected token `fi' |
| ./syntax: line 1: `fi' |
| 2 |
| $ @kbd{ash -c '. ./syntax; echo $?'} |
| ./syntax: 1: Syntax error: "fi" unexpected |
| $ @kbd{zsh -c '. ./syntax; echo $?'} |
| ./syntax:1: parse error near `fi' |
| 0 |
| @end example |
| |
| @anchor{!} |
| @item @command{!} |
| @c -------------- |
| @prindex @command{!} |
| The Unix version 7 shell did not support |
| negating the exit status of commands with @command{!}, and this feature |
| is still absent from some shells (e.g., Solaris 10 @command{/bin/sh}). |
| Other shells, such as FreeBSD @command{/bin/sh} or @command{ash}, have |
| bugs when using @command{!}: |
| |
| @example |
| $ @kbd{sh -c '! : | :'; echo $?} |
| 1 |
| $ @kbd{ash -c '! : | :'; echo $?} |
| 0 |
| $ @kbd{sh -c '! @{ :; @}'; echo $?} |
| 1 |
| $ @kbd{ash -c '! @{ :; @}'; echo $?} |
| @{: not found |
| Syntax error: "@}" unexpected |
| 2 |
| @end example |
| |
| Shell code like this: |
| |
| @example |
| if ! cmp file1 file2 >/dev/null 2>&1; then |
| echo files differ or trouble |
| fi |
| @end example |
| |
| is therefore not portable in practice. Typically it is easy to rewrite |
| such code, e.g.: |
| |
| @example |
| cmp file1 file2 >/dev/null 2>&1 || |
| echo files differ or trouble |
| @end example |
| |
| In M4sh, the @code{AS_IF} macro provides an easy way to write these kinds |
| of conditionals: |
| |
| @example |
| AS_IF([cmp -s file file.new], [], |
| [echo files differ or trouble]) |
| @end example |
| |
| This kind of rewriting is needed in code outside macro definitions that |
| calls other macros. @xref{Common Shell Constructs}. It is also useful |
| inside macro definitions, where the @dfn{then} and @dfn{else} branches |
| might contain macro arguments. |
| |
| More generally, one can always rewrite @samp{! @var{command}} as: |
| |
| @example |
| AS_IF([@var{command}], [(exit 1)]) |
| @end example |
| |
| @item @command{&&} and @command{||} |
| @c -------------------------------- |
| @prindex @command{&&} |
| @prindex @command{||} |
| If an AND-OR list is not inside @code{AC_DEFUN}, and it contains |
| calls to Autoconf macros, it should be rewritten using @code{AS_IF}. |
| @xref{Common Shell Constructs}. The operators @code{&&} and @code{||} |
| have equal precedence and are left associative, so instead of: |
| |
| @example |
| # This is dangerous outside AC_DEFUN. |
| cmp a b >/dev/null 2>&1 && |
| AS_ECHO([files are same]) >$tmpfile || |
| AC_MSG_NOTICE([files differ, or echo failed]) |
| @end example |
| |
| you can use: |
| |
| @example |
| # This is OK outside AC_DEFUN. |
| AS_IF([AS_IF([cmp a b >/dev/null 2>&1], |
| [AS_ECHO([files are same]) >$tmpfile], |
| [false])], |
| [AC_MSG_NOTICE([files differ, or echo failed])]) |
| @end example |
| |
| @item @command{@{...@}} |
| @c -------------------- |
| @prindex @command{@{...@}} |
| Bash 3.2 (and earlier versions) sometimes does not properly set |
| @samp{$?} when failing to write redirected output of a compound command. |
| This problem is most commonly observed with @samp{@{@dots{}@}}; it does |
| not occur with @samp{(@dots{})}. For example: |
| |
| @example |
| $ @kbd{bash -c '@{ echo foo; @} >/bad; echo $?'} |
| bash: line 1: /bad: Permission denied |
| 0 |
| $ @kbd{bash -c 'while :; do echo; done >/bad; echo $?'} |
| bash: line 1: /bad: Permission denied |
| 0 |
| @end example |
| |
| To work around the bug, prepend @samp{:;}: |
| |
| @example |
| $ @kbd{bash -c ':;@{ echo foo; @} >/bad; echo $?'} |
| bash: line 1: /bad: Permission denied |
| 1 |
| @end example |
| |
| POSIX requires a syntax error if a brace list has no contents. However, |
| not all shells obey this rule; and on shells where empty lists are |
| permitted, the effect on @samp{$?} is inconsistent. To avoid problems, |
| ensure that a brace list is never empty. |
| |
| @example |
| $ @kbd{bash -c 'false; @{ @}; echo $?' || echo $?} |
| bash: line 1: syntax error near unexpected token `@}' |
| bash: line 1: `false; @{ @}; echo $?' |
| 2 |
| $ @kbd{zsh -c 'false; @{ @}; echo $?' || echo $?} |
| 1 |
| $ @kbd{pdksh -c 'false; @{ @}; echo $?' || echo $?} |
| 0 |
| @end example |
| |
| |
| @item @command{break} |
| @c ------------------ |
| @prindex @command{break} |
| The use of @samp{break 2} etc.@: is safe. |
| |
| |
| @anchor{case} |
| @item @command{case} |
| @c ----------------- |
| @prindex @command{case} |
| If a @code{case} command is not inside @code{AC_DEFUN}, and it contains |
| calls to Autoconf macros, it should be rewritten using @code{AS_CASE}. |
| @xref{Common Shell Constructs}. Instead of: |
| |
| @example |
| # This is dangerous outside AC_DEFUN. |
| case $filename in |
| *.[ch]) AC_MSG_NOTICE([C source file]);; |
| esac |
| @end example |
| |
| @noindent |
| use: |
| |
| @example |
| # This is OK outside AC_DEFUN. |
| AS_CASE([$filename], |
| [[*.[ch]]], [AC_MSG_NOTICE([C source file])]) |
| @end example |
| |
| You don't need to quote the argument; no splitting is performed. |
| |
| You don't need the final @samp{;;}, but you should use it. |
| |
| POSIX requires support for @code{case} patterns with opening |
| parentheses like this: |
| |
| @example |
| case $file_name in |
| (*.c) echo "C source code";; |
| esac |
| @end example |
| |
| @noindent |
| but the @code{(} in this example is not portable to a few obsolescent Bourne |
| shell implementations, which is a pity for those of us using tools that |
| rely on balanced parentheses. For instance, with Solaris 10 |
| @command{/bin/sh}: |
| |
| @example |
| $ @kbd{case foo in (foo) echo foo;; esac} |
| @error{}syntax error: `(' unexpected |
| @end example |
| |
| @noindent |
| The leading @samp{(} can be omitted safely. Unfortunately, there are |
| contexts where unbalanced parentheses cause other problems, such as when |
| using a syntax-highlighting editor that searches for the balancing |
| counterpart, or more importantly, when using a case statement as an |
| underquoted argument to an Autoconf macro. @xref{Balancing |
| Parentheses}, for trade-offs involved in various styles of dealing with |
| unbalanced @samp{)}. |
| |
| Zsh handles pattern fragments derived from parameter expansions or |
| command substitutions as though quoted: |
| |
| @example |
| $ pat=\?; case aa in ?$pat) echo match;; esac |
| $ pat=\?; case a? in ?$pat) echo match;; esac |
| match |
| @end example |
| |
| @noindent |
| Because of a bug in its @code{fnmatch}, Bash fails to properly |
| handle backslashes in character classes: |
| |
| @example |
| bash-2.02$ @kbd{case /tmp in [/\\]*) echo OK;; esac} |
| bash-2.02$ |
| @end example |
| |
| @noindent |
| This is extremely unfortunate, since you are likely to use this code to |
| handle POSIX or MS-DOS absolute file names. To work around this |
| bug, always put the backslash first: |
| |
| @example |
| bash-2.02$ @kbd{case '\TMP' in [\\/]*) echo OK;; esac} |
| OK |
| bash-2.02$ @kbd{case /tmp in [\\/]*) echo OK;; esac} |
| OK |
| @end example |
| |
| Many Bourne shells cannot handle closing brackets in character classes |
| correctly. |
| |
| Some shells also have problems with backslash escaping in case you do not want |
| to match the backslash: both a backslash and the escaped character match this |
| pattern. To work around this, specify the character class in a variable, so |
| that quote removal does not apply afterwards, and the special characters don't |
| have to be backslash-escaped: |
| |
| @example |
| $ @kbd{case '\' in [\<]) echo OK;; esac} |
| OK |
| $ @kbd{scanset='[<]'; case '\' in $scanset) echo OK;; esac} |
| $ |
| @end example |
| |
| Even with this, Solaris @command{ksh} matches a backslash if the set |
| contains any |
| of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}. |
| |
| Some shells, such as Ash 0.3.8, are confused by an empty |
| @code{case}/@code{esac}: |
| |
| @example |
| ash-0.3.8 $ @kbd{case foo in esac;} |
| @error{}Syntax error: ";" unexpected (expecting ")") |
| @end example |
| |
| POSIX requires @command{case} to give an exit status of 0 if no cases |
| match. However, @command{/bin/sh} in Solaris 10 does not obey this |
| rule. Meanwhile, it is unclear whether a case that matches, but |
| contains no statements, must also change the exit status to 0. The M4sh |
| macro @code{AS_CASE} works around these inconsistencies. |
| |
| @example |
| $ @kbd{bash -c 'case `false` in ?) ;; esac; echo $?'} |
| 0 |
| $ @kbd{/bin/sh -c 'case `false` in ?) ;; esac; echo $?'} |
| 255 |
| @end example |
| |
| |
| @item @command{cd} |
| @c --------------- |
| @prindex @command{cd} |
| POSIX requires that @command{cd} must support |
| the @option{-L} (``logical'') and @option{-P} (``physical'') options, |
| with @option{-L} being the default. However, traditional shells do |
| not support these options, and their @command{cd} command has the |
| @option{-P} behavior. |
| |
| Portable scripts should assume neither option is supported, and should |
| assume neither behavior is the default. This can be a bit tricky, |
| since the POSIX default behavior means that, for example, |
| @samp{ls ..} and @samp{cd ..} may refer to different directories if |
| the current logical directory is a symbolic link. It is safe to use |
| @code{cd @var{dir}} if @var{dir} contains no @file{..} components. |
| Also, Autoconf-generated scripts check for this problem when computing |
| variables like @code{ac_top_srcdir} (@pxref{Configuration Actions}), |
| so it is safe to @command{cd} to these variables. |
| |
| POSIX states that behavior is undefined if @command{cd} is given an |
| explicit empty argument. Some shells do nothing, some change to the |
| first entry in @env{CDPATH}, some change to @env{HOME}, and some exit |
| the shell rather than returning an error. Unfortunately, this means |
| that if @samp{$var} is empty, then @samp{cd "$var"} is less predictable |
| than @samp{cd $var} (at least the latter is well-behaved in all shells |
| at changing to @env{HOME}, although this is probably not what you wanted |
| in a script). You should check that a directory name was supplied |
| before trying to change locations. |
| |
| @xref{Special Shell Variables}, for portability problems involving |
| @command{cd} and the @env{CDPATH} environment variable. |
| Also please see the discussion of the @command{pwd} command. |
| |
| |
| @anchor{echo} |
| @item @command{echo} |
| @c ----------------- |
| @prindex @command{echo} |
| The simple @command{echo} is probably the most surprising source of |
| portability troubles. It is not possible to use @samp{echo} portably |
| unless both options and escape sequences are omitted. |
| |
| Do not use options, as some shells support them and others do not. |
| For example, POSIX says that the behavior of @samp{echo -n foo} is |
| implementation-defined. On some platforms the output is @samp{foo} |
| without a trailing newline, on others it is @samp{-n foo} with a |
| trailing newline, and POSIX allows even other behavior. |
| |
| Do not use backslashes in the arguments, as there is no consensus on |
| their handling. For @samp{echo '\n' | wc -l}, the @command{sh} of |
| Solaris 10 outputs 2, |
| but Bash and Zsh (in @command{sh} emulation mode) output 1. |
| The problem is truly @command{echo}: all the shells |
| understand @samp{'\n'} as the string composed of a backslash and an |
| @samp{n}. |
| |
| Because of these problems, do not pass a string containing arbitrary |
| characters to @command{echo}. For example, @samp{echo "$foo"} is safe |
| only if you know that @var{foo}'s value cannot contain backslashes and |
| cannot start with @samp{-}. |
| |
| Normally, @command{printf} is safer and easier to use than @command{echo} |
| and @command{echo -n}. Thus, you should use @command{printf '%s\n'} |
| instead of @command{echo}, and similarly use @command{printf %s} instead |
| of @command{echo -n}. |
| |
| Older scripts, written before @command{printf} was portable, |
| sometimes used a here-document as a safer alternative to @command{echo}, |
| like this: |
| |
| @example |
| cat <<EOF |
| $foo |
| EOF |
| @end example |
| |
| @noindent |
| However, this usage is problematic, as even some modern shells have |
| hard-to-reproduce bugs when dealing with here-documents. |
| |
| |
| @item @command{eval} |
| @c ----------------- |
| @prindex @command{eval} |
| The @command{eval} command is useful in limited circumstances, e.g., |
| using commands like @samp{eval table_$key=\$value} and @samp{eval |
| value=table_$key} to simulate a hash table when the key is known to be |
| alphanumeric. |
| |
| You should also be wary of common bugs in @command{eval} implementations. |
| In some shell implementations (e.g., older @command{ash}, OpenBSD 3.8 |
| @command{sh}, @command{pdksh} v5.2.14 99/07/13.2, and @command{zsh} |
| 4.2.5), the arguments of @samp{eval} are evaluated in a context where |
| @samp{$?} is 0, so they exhibit behavior like this: |
| |
| @example |
| $ @kbd{false; eval 'echo $?'} |
| 0 |
| @end example |
| |
| The correct behavior here is to output a nonzero value, |
| but portable scripts should not rely on this. |
| |
| You should not rely on @code{LINENO} within @command{eval}. |
| @xref{Special Shell Variables}. |
| |
| Note that, even though these bugs are easily avoided, |
| @command{eval} is tricky to use on arbitrary arguments. |
| It is obviously unwise to use @samp{eval $cmd} if the string value of |
| @samp{cmd} was derived from an untrustworthy source. But even if the |
| string value is valid, @samp{eval $cmd} might not work as intended, |
| since it causes field splitting and file name expansion to occur twice, |
| once for the @command{eval} and once for the command itself. It is |
| therefore safer to use @samp{eval "$cmd"}. For example, if @var{cmd} |
| has the value @samp{cat test?.c}, @samp{eval $cmd} might expand to the |
| equivalent of @samp{cat test;.c} if there happens to be a file named |
| @file{test;.c} in the current directory; and this in turn |
| mistakenly attempts to invoke @command{cat} on the file @file{test} and |
| then execute the command @command{.c}. To avoid this problem, use |
| @samp{eval "$cmd"} rather than @samp{eval $cmd}. |
| |
| However, suppose that you want to output the text of the evaluated |
| command just before executing it. Assuming the previous example, |
| @samp{printf '%s\n' "Executing: $cmd"} outputs @samp{Executing: cat test?.c}, |
| but this output doesn't show the user that @samp{test;.c} is the actual |
| name of the copied file. |
| Conversely, @samp{printf 'Executing:'; eval "printf ' %s' $cmd"; printf '\n'} |
| works on this example, but it fails with @samp{cmd='cat foo >bar'}, |
| since it mistakenly replaces the contents of @file{bar} by the |
| string @samp{ cat foo}. No simple, general, and portable solution to |
| this problem is known. |
| |
| @item @command{exec} |
| @c ----------------- |
| @prindex @command{exec} |
| POSIX describes several categories of shell built-ins. Special |
| built-ins (such as @command{exit}) must impact the environment of the |
| current shell, and need not be available through @command{exec}. All |
| other built-ins are regular, and must not propagate variable assignments |
| to the environment of the current shell. However, the group of regular |
| built-ins is further distinguished by commands that do not require a |
| @env{PATH} search (such as @command{cd}), in contrast to built-ins that |
| are offered as a more efficient version of something that must still be |
| found in a @env{PATH} search (such as @command{echo}). POSIX is not |
| clear on whether @command{exec} must work with the list of 17 utilities |
| that are invoked without a @env{PATH} search, and many platforms lack an |
| executable for some of those built-ins: |
| |
| @example |
| $ @kbd{sh -c 'exec cd /tmp'} |
| sh: line 0: exec: cd: not found |
| @end example |
| |
| All other built-ins that provide utilities specified by POSIX must have |
| a counterpart executable that exists on @env{PATH}, although POSIX |
| allows @command{exec} to use the built-in instead of the executable. |
| For example, contrast @command{bash} 3.2 and @command{pdksh} 5.2.14: |
| |
| @example |
| $ @kbd{bash -c 'pwd --version' | head -n1} |
| bash: line 0: pwd: --: invalid option |
| pwd: usage: pwd [-LP] |
| $ @kbd{bash -c 'exec pwd --version' | head -n1} |
| pwd (GNU coreutils) 6.10 |
| $ @kbd{pdksh -c 'exec pwd --version' | head -n1} |
| pdksh: pwd: --: unknown option |
| @end example |
| |
| When it is desired to avoid a regular shell built-in, the workaround is |
| to use some other forwarding command, such as @command{env} or |
| @command{nice}, that will ensure a path search: |
| |
| @example |
| $ @kbd{pdksh -c 'exec true --version' | head -n1} |
| $ @kbd{pdksh -c 'nice true --version' | head -n1} |
| true (GNU coreutils) 6.10 |
| $ @kbd{pdksh -c 'env true --version' | head -n1} |
| true (GNU coreutils) 6.10 |
| @end example |
| |
| @item @command{exit} |
| @c ----------------- |
| @prindex @command{exit} |
| The default value of @command{exit} is supposed to be @code{$?}; |
| unfortunately, some shells, such as the DJGPP port of Bash 2.04, just |
| perform @samp{exit 0}. |
| |
| @example |
| bash-2.04$ @kbd{foo=`exit 1` || echo fail} |
| fail |
| bash-2.04$ @kbd{foo=`(exit 1)` || echo fail} |
| fail |
| bash-2.04$ @kbd{foo=`(exit 1); exit` || echo fail} |
| bash-2.04$ |
| @end example |
| |
| Using @samp{exit $?} restores the expected behavior. |
| |
| Some shell scripts, such as those generated by @command{autoconf}, use a |
| trap to clean up before exiting. If the last shell command exited with |
| nonzero status, the trap also exits with nonzero status so that the |
| invoker can tell that an error occurred. |
| |
| Unfortunately, in some shells, such as Solaris 10 @command{/bin/sh}, an exit |
| trap ignores the @code{exit} command's argument. In these shells, a trap |
| cannot determine whether it was invoked by plain @code{exit} or by |
| @code{exit 1}. Instead of calling @code{exit} directly, use the |
| @code{AC_MSG_ERROR} macro that has a workaround for this problem. |
| |
| |
| @anchor{export} |
| @item @command{export} |
| @c ------------------- |
| @prindex @command{export} |
| The builtin @command{export} dubs a shell variable @dfn{environment |
| variable}. Each update of exported variables corresponds to an update |
| of the environment variables. Conversely, each environment variable |
| received by the shell when it is launched should be imported as a shell |
| variable marked as exported. |
| |
| Alas, some older shells, such as Solaris 10 @command{/bin/sh}, forget to |
| @command{export} the environment variables they receive. As a result, |
| two variables coexist: the environment variable and the shell |
| variable. The following code demonstrates this failure: |
| |
| @example |
| #!/bin/sh |
| echo $FOO |
| FOO=bar |
| echo $FOO |
| exec /bin/sh $0 |
| @end example |
| |
| @noindent |
| when run with @samp{FOO=foo} in the environment, these shells print |
| alternately @samp{foo} and @samp{bar}, although they should print only |
| @samp{foo} and then a sequence of @samp{bar}s. |
| |
| Therefore you should @command{export} again each environment variable |
| that you update; the export can occur before or after the assignment. |
| |
| POSIX is not clear on whether the @command{export} of an undefined |
| variable causes the variable to be defined with the value of an empty |
| string, or merely marks any future definition of a variable by that name |
| for export. Various shells behave differently in this regard: |
| |
| @example |
| $ @kbd{sh -c 'export foo; env | grep foo'} |
| $ @kbd{ash -c 'export foo; env | grep foo'} |
| foo= |
| @end example |
| |
| POSIX requires @command{export} to honor assignments made as arguments, |
| but older shells do not support this, including @command{/bin/sh} in |
| Solaris 10. Portable scripts should separate assignments and exports |
| into different statements. |
| |
| @example |
| $ @kbd{bash -c 'export foo=bar; echo $foo'} |
| bar |
| $ @kbd{/bin/sh -c 'export foo=bar; echo $foo'} |
| /bin/sh: foo=bar: is not an identifier |
| $ @kbd{/bin/sh -c 'export foo; foo=bar; echo $foo'} |
| bar |
| @end example |
| |
| POSIX requires @command{export} to work with any arbitrary value for the |
| contents of the variable being exported, as long as the total size of |
| the environment combined with arguments doesn't exceed @code{ARG_MAX} |
| when executing a child process. However, some shells have extensions |
| that involve interpreting some environment values specially, regardless |
| of the variable name. We currently know of one case: all versions of |
| Bash released prior to 27 September 2014 interpret an environment |
| variable with an initial content substring of @code{() @{} as an |
| exported function definition (this is the ``Shellshock'' remote |
| execution bug, CVE-2014-6271 and friends, where it was possible to |
| exploit the function parser to cause remote code execution on child bash |
| startup; newer versions of Bash use special environment variable |
| @emph{names} instead of values to implement the same feature). |
| |
| There may be entries inherited into the environment that are not valid |
| as shell variable names; POSIX states that processes should be tolerant |
| of these names. Some shells such as @command{dash} do this by removing |
| those names from the environment at startup, while others such as |
| @command{bash} hide the entry from shell access but still pass it on to |
| child processes. While you can set such names using @command{env} for a |
| direct child process, you cannot rely on them being preserved through an |
| intermediate pass through the shell. |
| |
| @item @command{false} |
| @c ------------------ |
| @prindex @command{false} |
| Don't expect @command{false} to exit with status 1: in native |
| Solaris @file{/bin/false} exits with status 255. |
| |
| |
| @item @command{for} |
| @c ---------------- |
| @prindex @command{for} |
| To loop over positional arguments, use: |
| |
| @example |
| for arg |
| do |
| printf '%s\n' "$arg" |
| done |
| @end example |
| |
| @noindent |
| You may @emph{not} leave the @code{do} on the same line as @code{for}, |
| since some shells improperly grok: |
| |
| @example |
| for arg; do |
| printf '%s\n' "$arg" |
| done |
| @end example |
| |
| If you want to explicitly refer to the positional arguments, use: |
| |
| @example |
| for arg in "$@@"; do |
| printf '%s\n' "$arg" |
| done |
| @end example |
| |
| POSIX requires support for a @command{for} loop with no list after |
| @code{in}. However, Solaris 10 @command{/bin/sh} treats that as a syntax |
| error. It is possible to work around this by providing any shell word |
| that expands to nothing, or by ignoring an obvious sentinel. |
| |
| @example |
| $ @kbd{/bin/sh -c 'for a in $empty; do echo hi; done'} |
| $ @kbd{/bin/sh -c 'for a in ; do echo hi; done'} |
| /bin/sh: syntax error at line 1: `;' unexpected |
| @end example |
| |
| This syntax problem is most frequently encountered in code that goes |
| through several layers of expansion, such as an m4 macro or makefile |
| variable used as a list body, where the first layer of expansion (m4 or |
| make) can end up expanding to nothing in the version handed to the |
| shell. In the makefile context, one common workaround is to use a shell |
| variable rather than a make variable as the source of the list. |
| |
| @example |
| $ @kbd{cat Makefile} |
| list = |
| bad: |
| @@for arg in $(list); do \ |
| printf '%s\n' $$arg; \ |
| done |
| good: |
| @@list='$(list)'; \ |
| for arg in $$list; do \ |
| printf '%s\n' $$arg; \ |
| done |
| $ @kbd{make bad 2&>1 | head -n1} |
| sh: syntax error at line 1: `;' unexpected |
| $ @kbd{make bad list='a b'} |
| a |
| b |
| $ @kbd{make good} |
| $ @kbd{make good list='a b'} |
| a |
| b |
| @end example |
| |
| In Solaris 10 @command{/bin/sh}, when the list of arguments of a |
| @command{for} loop starts with @emph{unquoted} tokens looking like |
| variable assignments, the loop is not executed on those tokens: |
| |
| @example |
| $ @kbd{/bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'} |
| x |
| e=f |
| @end example |
| |
| @noindent |
| Thankfully, quoting the assignment-like tokens, or starting the list |
| with other tokens (including unquoted variable expansion that results in |
| an assignment-like result), avoids the problem, so it is easy to work |
| around: |
| |
| @example |
| $ @kbd{/bin/sh -c 'for v in "a=b"; do echo $v; done'} |
| a=b |
| $ @kbd{/bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'} |
| a=b |
| c=d |
| @end example |
| |
| @anchor{if} |
| @item @command{if} |
| @c --------------- |
| @prindex @command{if} |
| If an @code{if} command is not inside @code{AC_DEFUN}, and it contains |
| calls to Autoconf macros, it should be rewritten using @code{AS_IF}. |
| @xref{Common Shell Constructs}. |
| |
| Using @code{if ! @dots{}} is not portable. @xref{!,,@command{!} notes}. |
| |
| Some very old shells did not reset the exit status from an @command{if} |
| with no @command{else}: |
| |
| @example |
| $ @kbd{if (exit 42); then true; fi; echo $?} |
| 42 |
| @end example |
| |
| @noindent |
| whereas a proper shell should have printed @samp{0}. Although this is no |
| longer a portability problem, as any shell that supports functions gets it |
| correct, it explains why some makefiles have lengthy |
| constructs: |
| |
| @example |
| if test -f "$file"; then |
| install "$file" "$dest" |
| else |
| : |
| fi |
| @end example |
| |
| |
| @item @command{printf} |
| @c ------------------ |
| @prindex @command{printf} |
| A format string starting with a @samp{-} can cause problems. |
| Bash interprets it as an option and |
| gives an error. And @samp{--} to mark the end of options is not good |
| in the NetBSD Almquist shell (e.g., 0.4.6) which takes that |
| literally as the format string. Putting the @samp{-} in a @samp{%c} |
| or @samp{%s} is probably easiest: |
| |
| @example |
| printf %s -foo |
| @end example |
| |
| AIX 7.2 @command{sh} mishandles octal escapes in multi-byte locales by |
| treating them as characters instead of bytes. For example, in a locale |
| using the UTF-8 encoding, @samp{printf '\351'} outputs the two bytes C3, |
| A9 (the UTF-8 encoding for U+00E9) instead of the desired single byte E9. |
| To work around the bug, use the C locale. |
| |
| Bash 2.03 mishandles an escape sequence that happens to evaluate to @samp{%}: |
| |
| @example |
| $ @kbd{printf '\045'} |
| bash: printf: `%': missing format character |
| @end example |
| |
| Large outputs may cause trouble. On Solaris 10, for |
| example, @file{/usr/bin/printf} is buggy, so when using |
| @command{/bin/sh} the command @samp{printf %010000x 123} normally dumps |
| core. |
| |
| Since @command{printf} is not always a shell builtin, there is a |
| potential speed penalty for using @code{printf '%s\n'} as a replacement |
| for an @command{echo} that does not interpret @samp{\} or leading |
| @samp{-}. With Solaris @command{ksh}, it is possible to use @code{print |
| -r --} for this role instead. |
| |
| @xref{echo, , Limitations of Shell Builtins}, for a discussion of |
| portable alternatives to both @command{printf} and @command{echo}. |
| |
| |
| @item @command{pwd} |
| @c ---------------- |
| @prindex @command{pwd} |
| With modern shells, plain @command{pwd} outputs a ``logical'' |
| directory name, some of whose components may be symbolic links. These |
| directory names are in contrast to ``physical'' directory names, whose |
| components are all directories. |
| |
| POSIX requires that @command{pwd} must support |
| the @option{-L} (``logical'') and @option{-P} (``physical'') options, |
| with @option{-L} being the default. However, traditional shells do |
| not support these options, and their @command{pwd} command has the |
| @option{-P} behavior. |
| |
| Portable scripts should assume neither option is supported, and should |
| assume neither behavior is the default. Also, on many hosts |
| @samp{/bin/pwd} is equivalent to @samp{pwd -P}, but POSIX |
| does not require this behavior and portable scripts should not rely on |
| it. |
| |
| Typically it's best to use plain @command{pwd}. On modern hosts this |
| outputs logical directory names, which have the following advantages: |
| |
| @itemize @bullet |
| @item |
| Logical names are what the user specified. |
| @item |
| Physical names may not be portable from one installation |
| host to another due to network file system gymnastics. |
| @item |
| On modern hosts @samp{pwd -P} may fail due to lack of permissions to |
| some parent directory, but plain @command{pwd} cannot fail for this |
| reason. |
| @end itemize |
| |
| Also please see the discussion of the @command{cd} command. |
| |
| |
| @item @command{read} |
| @c ----------------- |
| @prindex @command{read} |
| No options are portable, not even support @option{-r} (Solaris 10 |
| @command{/bin/sh} for example). |
| |
| |
| @anchor{set} |
| @item @command{set} |
| @c ---------------- |
| @prindex @command{set} |
| With the FreeBSD 6.0 shell, the @command{set} command (without |
| any options) does not sort its output. |
| |
| The @command{set} builtin faces the usual problem with arguments |
| starting with a |
| dash. Modern shells such as Bash or Zsh understand @option{--} to specify |
| the end of the options (any argument after @option{--} is a parameter, |
| even @samp{-x} for instance), but many traditional shells (e.g., Solaris |
| 10 @command{/bin/sh}) simply stop option |
| processing as soon as a non-option argument is found. Therefore, use |
| @samp{dummy} or simply @samp{x} to end the option processing, and use |
| @command{shift} to pop it out: |
| |
| @example |
| set x $my_list; shift |
| @end example |
| |
| Avoid @samp{set -}, e.g., @samp{set - $my_list}. POSIX no |
| longer requires support for this command, and in traditional shells |
| @samp{set - $my_list} resets the @option{-v} and @option{-x} options, which |
| makes scripts harder to debug. |
| |
| Some nonstandard shells do not recognize more than one option |
| (e.g., @samp{set -e -x} assigns @samp{-x} to the command line). It is |
| better to combine them: |
| |
| @example |
| set -ex |
| @end example |
| |
| @cindex @command{set -e} |
| The @option{-e} option has historically been under-specified, with enough |
| ambiguities to cause numerous differences across various shell |
| implementations; see for example |
| @uref{https://www.in-ulm.de/@/~mascheck/@/various/@/set-e/, this overview}, |
| or @uref{https://www.austingroupbugs.net/@/view.php?id=52, this link}, |
| documenting a change to POSIX 2008 to match @command{ksh88} behavior. |
| Note that mixing @code{set -e} and shell functions is asking for surprises: |
| |
| @example |
| set -e |
| doit() |
| @{ |
| rm file |
| echo one |
| @} |
| doit || echo two |
| @end example |
| |
| @noindent |
| According to the recommendation, @samp{one} should always be output |
| regardless of whether the @command{rm} failed, because it occurs within |
| the body of the shell function @samp{doit} invoked on the left side of |
| @samp{||}, where the effects of @samp{set -e} are not enforced. |
| Likewise, @samp{two} should never be printed, since the failure of |
| @command{rm} does not abort the function, such that the status of |
| @samp{doit} is 0. |
| |
| The BSD shell has had several problems with the @option{-e} |
| option. Older versions of the BSD |
| shell (circa 1990) mishandled @samp{&&}, @samp{||}, @samp{if}, and |
| @samp{case} when @option{-e} was in effect, causing the shell to exit |
| unexpectedly in some cases. This was particularly a problem with |
| makefiles, and led to circumlocutions like @samp{sh -c 'test -f file || |
| touch file'}, where the seemingly-unnecessary @samp{sh -c '@dots{}'} |
| wrapper works around the bug (@pxref{Failure in Make Rules}). |
| |
| Even relatively-recent versions of the BSD shell (e.g., OpenBSD 3.4) |
| wrongly exit with @option{-e} if the last command within a compound |
| statement fails and is guarded by an @samp{&&} only. For example: |
| |
| @example |
| #! /bin/sh |
| set -e |
| foo='' |
| test -n "$foo" && exit 1 |
| echo one |
| if :; then |
| test -n "$foo" && exit 1 |
| echo two |
| test -n "$foo" && exit 1 |
| fi |
| echo three |
| @end example |
| |
| @noindent |
| does not print @samp{three}. One workaround is to change the last |
| instance of @samp{test -n "$foo" && exit 1} to be @samp{if test -n |
| "$foo"; then exit 1; fi} instead. Another possibility is to warn BSD |
| users not to use @samp{sh -e}. |
| |
| When @samp{set -e} is in effect, a failed command substitution in |
| Solaris 10 @command{/bin/sh} cannot be ignored, even with @samp{||}. |
| |
| @example |
| $ @kbd{/bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'} |
| $ @kbd{bash -c 'set -e; foo=`false` || echo foo; echo bar'} |
| foo |
| bar |
| @end example |
| |
| @noindent |
| Moreover, a command substitution, successful or not, causes this shell to |
| exit from a failing outer command even in presence of an @samp{&&} list: |
| |
| @example |
| $ @kbd{bash -c 'set -e; false `true` && echo notreached; echo ok'} |
| ok |
| $ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'} |
| $ |
| @end example |
| |
| @cindex @command{set -b} |
| @cindex @command{set -m} |
| Job control is not provided by all shells, so the use of @samp{set -m} |
| or @samp{set -b} must be done with care. When using @command{zsh} in |
| native mode, asynchronous notification (@samp{set -b}) is enabled by |
| default, and using @samp{emulate sh} to switch to POSIX mode does not |
| clear this setting (although asynchronous notification has no impact |
| unless job monitoring is also enabled). Also, @command{zsh} 4.3.10 and |
| earlier have a bug where job control can be manipulated in interactive |
| shells, but not in subshells or scripts. Furthermore, some shells, like |
| @command{pdksh}, fail to treat subshells as interactive, even though the |
| parent shell was. |
| |
| @example |
| $ @kbd{echo $ZSH_VERSION} |
| 4.3.10 |
| $ @kbd{set -m; echo $?} |
| 0 |
| $ @kbd{zsh -c 'set -m; echo $?'} |
| set: can't change option: -m |
| $ @kbd{(set -m); echo $?} |
| set: can't change option: -m |
| 1 |
| $ @kbd{pdksh -ci 'echo $-; (echo $-)'} |
| cim |
| c |
| @end example |
| |
| @cindex @command{set -n} |
| Use of @command{set -n} (typically via @command{sh -n script}) to |
| validate a script is not foolproof. Modern @command{ksh93} tries to be |
| helpful by informing you about better syntax, but switching the script |
| to use the suggested syntax in order to silence the warnings would |
| render the script no longer portable to older shells: |
| |
| @example |
| $ @kbd{ksh -nc '``'} |
| ksh: warning: line 1: `...` obsolete, use $(...) |
| 0 |
| @end example |
| |
| Autoconf |
| itself uses @command{sh -n} within its testsuite to check that correct |
| scripts were generated, but only after first probing for other shell |
| features (such as @code{test $@{BASH_VERSION+y@}}) that indicate |
| a reasonably fast and working implementation. |
| |
| @item @command{shift} |
| @c ------------------ |
| @prindex @command{shift} |
| Not only is @command{shift}ing a bad idea when there is nothing left to |
| shift, but in addition it is not portable: the shell of MIPS |
| RISC/OS 4.52 refuses to do it. |
| |
| Don't use @samp{shift 2} etc.; while it in the SVR1 shell (1983), |
| it is also absent in many pre-POSIX shells. |
| |
| |
| @item @command{source} |
| @c ------------------- |
| @prindex @command{source} |
| This command is not portable, as POSIX does not require it; use |
| @command{.} instead. |
| |
| |
| @item @command{test} |
| @c ----------------- |
| @prindex @command{test} |
| The @code{test} program is the way to perform many file and string |
| tests. It is often invoked by the alternate name @samp{[}, but using |
| that name in Autoconf code is asking for trouble since it is an M4 quote |
| character. |
| |
| The @option{-a}, @option{-o}, @samp{(}, and @samp{)} operands are not |
| present in all implementations, and have been marked obsolete by POSIX |
| 2008. This is because there are inherent ambiguities in using them. |
| For example, @samp{test "$1" -a "$2"} looks like a binary operator to |
| check whether two strings are both non-empty, but if @samp{$1} is the |
| literal @samp{!}, then some implementations of @command{test} treat it |
| as a negation of the unary operator @option{-a}. |
| |
| Thus, portable uses of @command{test} should never have more than four |
| arguments, and scripts should use shell constructs like @samp{&&} and |
| @samp{||} instead. If you combine @samp{&&} and @samp{||} in the same |
| statement, keep in mind that they have equal precedence, so it is often |
| better to parenthesize even when this is redundant. For example: |
| |
| @smallexample |
| # Not portable: |
| test "X$a" = "X$b" -a \ |
| '(' "X$c" != "X$d" -o "X$e" = "X$f" ')' |
| |
| # Portable: |
| test "X$a" = "X$b" && |
| @{ test "X$c" != "X$d" || test "X$e" = "X$f"; @} |
| @end smallexample |
| |
| @command{test} does not process options like most other commands do; for |
| example, it does not recognize the @option{--} argument as marking the |
| end of options. |
| |
| It is safe to use @samp{!} as a @command{test} operator. For example, |
| @samp{if test ! -d foo; @dots{}} is portable even though @samp{if ! test |
| -d foo; @dots{}} is not. |
| |
| |
| @item @command{test} (files) |
| @c ------------------------- |
| To enable @command{configure} scripts to support cross-compilation, they |
| shouldn't do anything that tests features of the build system instead of |
| the host system. But occasionally you may find it necessary to check |
| whether some arbitrary file exists. To do so, use @samp{test -f}, |
| @samp{test -r}, or @samp{test -x}. Do not use @samp{test -e}, because |
| Solaris 10 @command{/bin/sh} |
| lacks it. |
| |
| To test for symbolic links on systems that have them, use |
| @samp{test -h} rather than @samp{test -L}; either form conforms to |
| POSIX, but @option{-h} has been around longer. |
| |
| The commands @samp{test A -ot B} and @samp{test A -nt B} are not reliable |
| on macOS @command{sh} through at least macOS Sequoia 15.1.1 (2024), |
| where @samp{test} ignores the subsecond part of file timestamps. |
| To work around this bug, arrange for the timestamps to be at least one |
| second apart. |
| |
| For historical reasons, POSIX reluctantly allows implementations of |
| @samp{test -x} that will succeed for the root user, even if no execute |
| permissions are present. Furthermore, shells do not all agree on |
| whether Access Control Lists should affect @samp{test -r}, @samp{test |
| -w}, and @samp{test -x}; some shells base test results strictly on the |
| current user id compared to file owner and mode, as if by |
| @code{stat(2)}; while other shells base test results on whether the |
| current user has the given right, even if that right is only granted by |
| an ACL, as if by @code{faccessat(2)}. Furthermore, there is a classic |
| time of check to time of use race between any use of @command{test} |
| followed by operating on the just-checked file. Therefore, it is a good |
| idea to write scripts that actually attempt an operation, and are |
| prepared for the resulting failure if permission is denied, rather than |
| trying to avoid an operation based solely on whether @command{test} |
| guessed that it might not be permitted. |
| |
| @item @command{test} (strings) |
| @c --------------------------- |
| POSIX says that @samp{test "@var{string}"} succeeds if @var{string} is |
| not null, but this usage is not portable to traditional platforms like |
| Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and |
| @samp{-n}. However, it @emph{is} portable to test if a variable is set |
| to a non-empty value, by using @samp{test $@{var+y@}}, since all known |
| implementations properly distinguish between no arguments and a |
| known-safe string of @samp{y}. |
| |
| POSIX also says that @samp{test ! "@var{string}"}, |
| @samp{test -n "@var{string}"} and |
| @samp{test -z "@var{string}"} work with any string, but many |
| shells (such as Solaris 10, AIX 3.2, UNICOS 10.0.0.6, |
| Digital Unix 4, etc.)@: get confused if |
| @var{string} looks like an operator: |
| |
| @example |
| $ @kbd{test -n =} |
| test: argument expected |
| $ @kbd{test ! -n} |
| test: argument expected |
| $ @kbd{test -z ")"; echo $?} |
| 0 |
| @end example |
| |
| Similarly, POSIX says that both @samp{test "@var{string1}" = "@var{string2"}} |
| and @samp{test "@var{string1}" != "@var{string2"}} work for any pairs of |
| strings, but in practice this is not true for troublesome strings that |
| look like operators or parentheses, or that begin with @samp{-}. |
| |
| It is best to protect such strings with a leading @samp{X}, e.g., |
| @samp{test "X@var{string}" != X} rather than @samp{test -n |
| "@var{string}"} or @samp{test ! "@var{string}"}. |
| |
| It is common to find variations of the following idiom: |
| |
| @example |
| test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" && |
| @var{action} |
| @end example |
| |
| @noindent |
| to take an action when a token matches a given pattern. Such constructs |
| should be avoided by using: |
| |
| @example |
| AS_CASE([$ac_feature], |
| [[*[!-a-zA-Z0-9_]*]], [@var{action}]) |
| @end example |
| |
| If the pattern is a complicated regular expression that cannot be |
| expressed as a shell pattern, use something like this instead: |
| |
| @example |
| expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null && |
| @var{action} |
| @end example |
| |
| @samp{expr "X@var{foo}" : "X@var{bar}"} is more robust than @samp{echo |
| "X@var{foo}" | grep "^X@var{bar}"}, because it avoids problems when |
| @samp{@var{foo}} contains backslashes. |
| |
| |
| @anchor{trap} |
| @item @command{trap} |
| @c ----------------- |
| @prindex @command{trap} |
| It is safe to trap at least the signals 1, 2, 13, and 15. You can also |
| trap 0, i.e., have the @command{trap} run when the script ends (either via an |
| explicit @command{exit}, or the end of the script). The trap for 0 should be |
| installed outside of a shell function, or AIX 5.3 @command{/bin/sh} |
| will invoke the trap at the end of this function. |
| |
| POSIX says that @samp{trap - 1 2 13 15} resets the traps for the |
| specified signals to their default values, but many common shells (e.g., |
| Solaris 10 @command{/bin/sh}) misinterpret this and attempt to execute a |
| ``command'' named @command{-} when the specified conditions arise. |
| POSIX 2008 also added a requirement to support @samp{trap 1 2 13 15} to |
| reset traps, as this is supported by a larger set of shells, but there |
| are still shells like @command{dash} that mistakenly try to execute |
| @command{1} instead of resetting the traps. Therefore, there is no |
| portable workaround, except for @samp{trap - 0}, for which |
| @samp{trap '' 0} is a portable substitute. |
| |
| Although POSIX is not absolutely clear on this point, it is widely |
| admitted that when entering the trap @samp{$?} should be set to the exit |
| status of the last command run before the trap. The ambiguity can be |
| summarized as: ``when the trap is launched by an @command{exit}, what is |
| the @emph{last} command run: that before @command{exit}, or |
| @command{exit} itself?'' |
| |
| Bash considers @command{exit} to be the last command, while Zsh and |
| Solaris 10 @command{/bin/sh} consider that when the trap is run it is |
| @emph{still} in the @command{exit}, hence it is the previous exit status |
| that the trap receives: |
| |
| @example |
| $ @kbd{cat trap.sh} |
| trap 'echo $?' 0 |
| (exit 42); exit 0 |
| $ @kbd{zsh trap.sh} |
| 42 |
| $ @kbd{bash trap.sh} |
| 0 |
| @end example |
| |
| The portable solution is then simple: when you want to @samp{exit 42}, |
| run @samp{(exit 42); exit 42}, the first @command{exit} being used to |
| set the exit status to 42 for Zsh, and the second to trigger the trap |
| and pass 42 as exit status for Bash. In M4sh, this is covered by using |
| @code{AS_EXIT}. |
| |
| The shell in FreeBSD 4.0 has the following bug: @samp{$?} is |
| reset to 0 by empty lines if the code is inside @command{trap}. |
| |
| @example |
| $ @kbd{trap 'false} |
| |
| echo $?' 0 |
| $ @kbd{exit} |
| 0 |
| @end example |
| |
| @noindent |
| Fortunately, this bug only affects @command{trap}. |
| |
| Several shells fail to execute an exit trap that is defined inside a |
| subshell, when the last command of that subshell is not a builtin. A |
| workaround is to use @samp{exit $?} as the shell builtin. |
| |
| @example |
| $ @kbd{bash -c '(trap "echo hi" 0; /bin/true)'} |
| hi |
| $ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true)'} |
| $ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'} |
| hi |
| @end example |
| |
| @noindent |
| Likewise, older implementations of @command{bash} failed to preserve |
| @samp{$?} across an exit trap consisting of a single cleanup command. |
| |
| @example |
| $ @kbd{bash -c 'trap "/bin/true" 0; exit 2'; echo $?} |
| 2 |
| $ @kbd{bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?} |
| 0 |
| $ @kbd{bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?} |
| 2 |
| @end example |
| |
| Be aware that a trap can be called from any number of places in your |
| script, and therefore the trap handler should not make assumptions about |
| shell state. For some examples, if your script temporarily modifies |
| @env{IFS}, then the trap should include an initialization back to its |
| typical value of space-tab-newline (autoconf does this for generated |
| @file{configure} files). Likewise, if your script changes the current |
| working directory at some point after the trap is installed, then your |
| trap cannot assume which directory it is in, and should begin by |
| changing directories to an absolute path if that is important to the |
| cleanup efforts (autotest does this for generated @file{testsuite} |
| files). |
| |
| @item @command{true} |
| @c ----------------- |
| @prindex @command{true} |
| @c Info cannot handle ':' in index entries. |
| @c @prindex @command{:} |
| Don't worry: as far as we know @command{true} is portable. |
| Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the |
| portable shell community tends to prefer using @command{:}. This has a |
| funny side effect: when asked whether @command{false} is more portable |
| than @command{true} Alexandre Oliva answered: |
| |
| @quotation |
| In a sense, yes, because if it doesn't exist, the shell will produce an |
| exit status of failure, which is correct for @command{false}, but not |
| for @command{true}. |
| @end quotation |
| |
| Remember that even though @samp{:} ignores its arguments, it still takes |
| time to compute those arguments. It is a good idea to use double quotes |
| around any arguments to @samp{:} to avoid time spent in field splitting |
| and file name expansion. |
| |
| |
| @anchor{unset} |
| @item @command{unset} |
| @c ------------------ |
| @prindex @command{unset} |
| In some nonconforming shells (e.g., Solaris 10 @command{/bin/ksh} and |
| @command{/usr/xpg4/bin/sh}, NetBSD 5.99.43 sh, or Bash 2.05a), |
| @code{unset FOO} fails when @code{FOO} is not set. This can interfere |
| with @code{set -e} operation. You can use |
| |
| @smallexample |
| FOO=; unset FOO |
| @end smallexample |
| |
| @noindent |
| if you are not sure that @code{FOO} is set. |
| |
| A few ancient shells lack @command{unset} entirely. For some variables |
| such as @code{PS1}, you can use a neutralizing value instead: |
| |
| @smallexample |
| PS1='$ ' |
| @end smallexample |
| |
| Usually, shells that do not support @command{unset} need less effort to |
| make the environment sane, so for example is not a problem if you cannot |
| unset @command{CDPATH} on those shells. However, Bash 2.01 mishandles |
| @code{unset MAIL} and @code{unset MAILPATH} in some cases and dumps core. |
| So, you should do something like |
| |
| @smallexample |
| ( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || : |
| @end smallexample |
| |
| @noindent |
| @xref{Special Shell Variables}, for some neutralizing values. Also, see |
| @ref{export, , Limitations of Builtins}, for |
| the case of environment variables. |
| |
| @item @command{wait} |
| @c ----------------- |
| @prindex @command{wait} |
| The exit status of @command{wait} is not always reliable. |
| @end table |
| |
| @node Limitations of Usual Tools |
| @section Limitations of Usual Tools |
| @cindex Limitations of usual tools |
| |
| The small set of tools you can expect to find on any machine can still |
| include some limitations you should be aware of. |
| |
| @comment Between this list and the list of builtins above, we should |
| @comment mention all the tools in GNU Coding Standards ``Utilities in |
| @comment Makefiles''. |
| |
| @c This table includes things like '@command{expr} (|)', so we can't |
| @c use @table @command. |
| @table @asis |
| @anchor{awk} |
| @item @command{awk} |
| @c ---------------- |
| @prindex @command{awk} |
| Don't leave white space before the opening parenthesis in a user function call. |
| POSIX does not allow this and GNU Awk rejects it: |
| |
| @example |
| $ @kbd{gawk 'function die () @{ print "Aaaaarg!" @} |
| BEGIN @{ die () @}'} |
| gawk: cmd. line:2: BEGIN @{ die () @} |
| gawk: cmd. line:2: ^ parse error |
| $ @kbd{gawk 'function die () @{ print "Aaaaarg!" @} |
| BEGIN @{ die() @}'} |
| Aaaaarg! |
| @end example |
| |
| POSIX says that if a program contains only @samp{BEGIN} actions, and |
| contains no instances of @code{getline}, then the program merely |
| executes the actions without reading input. However, traditional Awk |
| implementations (such as Solaris 10 @command{awk}) read and discard |
| input in this case. Portable scripts can redirect input from |
| @file{/dev/null} to work around the problem. For example: |
| |
| @example |
| awk 'BEGIN @{print "hello world"@}' </dev/null |
| @end example |
| |
| POSIX says that in an @samp{END} action, @samp{$NF} (and presumably, |
| @samp{$1}) retain their value from the last record read, if no |
| intervening @samp{getline} occurred. However, some implementations |
| (such as Solaris 10 @samp{/usr/bin/awk}, @samp{nawk}, or Darwin |
| @samp{awk}) reset these variables. A workaround is to use an |
| intermediate variable prior to the @samp{END} block. For example: |
| |
| @example |
| $ @kbd{cat end.awk} |
| @{ tmp = $1 @} |
| END @{ print "a", $1, $NF, "b", tmp @} |
| $ @kbd{echo 1 | awk -f end.awk} |
| a b 1 |
| $ @kbd{echo 1 | gawk -f end.awk} |
| a 1 1 b 1 |
| @end example |
| |
| If you want your program to be deterministic, don't depend on @code{for} |
| on arrays: |
| |
| @example |
| $ @kbd{cat for.awk} |
| END @{ |
| arr["foo"] = 1 |
| arr["bar"] = 1 |
| for (i in arr) |
| print i |
| @} |
| $ @kbd{gawk -f for.awk </dev/null} |
| foo |
| bar |
| $ @kbd{nawk -f for.awk </dev/null} |
| bar |
| foo |
| @end example |
| |
| Some Awk implementations, such as HP-UX 11.0's native one, |
| mishandle anchors: |
| |
| @example |
| $ @kbd{echo xfoo | $AWK '/foo|^bar/ @{ print @}'} |
| $ @kbd{echo bar | $AWK '/foo|^bar/ @{ print @}'} |
| bar |
| $ @kbd{echo xfoo | $AWK '/^bar|foo/ @{ print @}'} |
| xfoo |
| $ @kbd{echo bar | $AWK '/^bar|foo/ @{ print @}'} |
| bar |
| @end example |
| |
| @noindent |
| Either do not depend on such patterns (i.e., use @samp{/^(.*foo|bar)/}, |
| or use a simple test to reject such implementations. |
| |
| On @samp{ia64-hp-hpux11.23}, Awk mishandles @code{printf} conversions |
| after @code{%u}: |
| |
| @example |
| $ @kbd{awk 'BEGIN @{ printf "%u %d\n", 0, -1 @}'} |
| 0 0 |
| @end example |
| |
| AIX version 5.2 has an arbitrary limit of 399 on the |
| length of regular expressions and literal strings in an Awk program. |
| |
| Traditional Awk implementations derived from Unix version 7, such as |
| Solaris @command{/bin/awk}, have many limitations and do not |
| conform to POSIX@. Nowadays @code{AC_PROG_AWK} (@pxref{Particular |
| Programs}) finds you an Awk that doesn't have these problems, but if |
| for some reason you prefer not to use @code{AC_PROG_AWK} you may need to |
| address them. For more detailed descriptions, see @ref{Language |
| History, , @command{awk} language history, gawk, GNU Awk User's Guide}. |
| |
| Traditional Awk does not support multidimensional arrays or user-defined |
| functions. |
| |
| Traditional Awk does not support the @option{-v} option. You can use |
| assignments after the program instead, e.g., @code{$AWK '@{print v |
| $1@}' v=x}; however, don't forget that such assignments are not |
| evaluated until they are encountered (e.g., after any @code{BEGIN} |
| action). |
| |
| Traditional Awk does not support the keywords @code{delete} or @code{do}. |
| |
| Traditional Awk does not support the expressions |
| @code{@var{a}?@var{b}:@var{c}}, @code{!@var{a}}, @code{@var{a}^@var{b}}, |
| or @code{@var{a}^=@var{b}}. |
| |
| Traditional Awk does not support the predefined @code{CONVFMT} or |
| @code{ENVIRON} variables. |
| |
| Traditional Awk supports only the predefined functions @code{exp}, @code{index}, |
| @code{int}, @code{length}, @code{log}, @code{split}, @code{sprintf}, |
| @code{sqrt}, and @code{substr}. |
| |
| Traditional Awk @code{getline} is not at all compatible with POSIX; |
| avoid it. |
| |
| Traditional Awk has @code{for (i in a) @dots{}} but no other uses of the |
| @code{in} keyword. For example, it lacks @code{if (i in a) @dots{}}. |
| |
| In code portable to both traditional and modern Awk, @code{FS} must be a |
| string containing just one ordinary character, and similarly for the |
| field-separator argument to @code{split}. |
| |
| Traditional Awk has a limit of 99 fields in a record |
| and splits the input even if you don't refer to any field in the script. |
| To circumvent this problem, set @samp{FS} |
| to an unusual character and use @code{split}. |
| |
| Traditional Awk has a limit of at most 99 bytes in a number formatted by |
| @code{OFMT}; for example, @code{OFMT="%.300e"; print 0.1;} typically |
| dumps core. |
| |
| The original version of Awk had a limit of at most 99 bytes per |
| @code{split} field, 99 bytes per @code{substr} substring, and 99 bytes |
| per run of non-special characters in a @code{printf} format, but these |
| bugs have been fixed on all practical hosts that we know of. |
| |
| HP-UX 11.00 Awk requires that input files have a line length |
| of at most 3070 bytes. |
| |
| @item @command{basename} |
| @c --------------------- |
| @prindex @command{basename} |
| Long ago some hosts lacked a working @command{basename}, |
| and portable scripts needed to use @command{expr} instead. |
| Nowadays it is safe to use @command{basename}. For example: |
| |
| @example |
| base=`basename -- "$file"` |
| @end example |
| |
| @c AS_BASENAME is to be replaced by a better API. |
| @ignore |
| Not all hosts have a working @command{basename}, and you should instead |
| use @code{AS_BASENAME} (@pxref{Programming in M4sh}), followed by |
| @command{expr} if you need to strip a suffix. For example: |
| |
| @example |
| a=`basename "$aname"` # This is not portable. |
| a=`AS_BASENAME(["$aname"])` # This is more portable. |
| |
| # This is not portable. |
| c=`basename "$cname" .c` |
| |
| # This is more portable. |
| c=`AS_BASENAME(["$cname"])` |
| case $c in |
| ?*.c) c=`expr "X$c" : 'X\(.*\)\.c'`;; |
| esac |
| @end example |
| @end ignore |
| |
| |
| @item @command{cat} |
| @c ---------------- |
| @prindex @command{cat} |
| Don't rely on any option. |
| |
| |
| @item @command{cc} |
| @c --------------- |
| @prindex @command{cc} |
| The command @samp{cc -c foo.c} traditionally produces an object file |
| named @file{foo.o}. Most compilers allow @option{-c} to be combined |
| with @option{-o} to specify a different object file name, but |
| POSIX does not require this combination and a few compilers |
| lack support for it. @xref{C Compiler}, for how GNU Make |
| tests for this feature with @code{AC_PROG_CC_C_O}. |
| |
| When a compilation such as @samp{cc -o foo foo.c} fails, some compilers |
| (such as CDS on Reliant Unix) leave a @file{foo.o}. |
| |
| HP-UX @command{cc} doesn't accept @file{.S} files to preprocess and |
| assemble. @samp{cc -c foo.S} appears to succeed, but in fact does |
| nothing. |
| |
| The default executable, produced by @samp{cc foo.c}, can be |
| |
| @itemize |
| @item @file{a.out} -- usual POSIX convention. |
| @item @file{b.out} -- i960 compilers (including @command{gcc}). |
| @item @file{a.exe} -- DJGPP port of @command{gcc}. |
| @item @file{a_out.exe} -- GNV @command{cc} wrapper for DEC C on OpenVMS. |
| @item @file{foo.exe} -- various MS-DOS compilers. |
| @end itemize |
| |
| The C compiler's traditional name is @command{cc}, but other names like |
| @command{gcc} are common. POSIX 1003.1-2024 specifies the |
| name @command{c17}, but older POSIX editions specified |
| @command{c99} or @command{c89}, future POSIX standards will likely specify |
| other commands, and anyway these standard names are rarely used in |
| practice. Typically the C compiler is invoked from makefiles that use |
| @samp{$(CC)}, so the value of the @samp{CC} make variable selects the |
| compiler name. |
| |
| @item @command{chgrp} |
| @itemx @command{chown} |
| @c ------------------- |
| @prindex @command{chgrp} |
| @prindex @command{chown} |
| It is not portable to change a file's group to a group that the owner |
| does not belong to. |
| |
| @item @command{chmod} |
| @c ------------------ |
| @prindex @command{chmod} |
| Avoid usages like @samp{chmod -w file}; use @samp{chmod a-w file} |
| instead, for two reasons. First, plain @option{-w} does not necessarily |
| make the file unwritable, since it does not affect mode bits that |
| correspond to bits in the file mode creation mask. Second, |
| POSIX says that the @option{-w} might be interpreted as an |
| implementation-specific option, not as a mode; POSIX suggests |
| using @samp{chmod -- -w file} to avoid this confusion, but unfortunately |
| @samp{--} does not work on some older hosts. |
| |
| |
| @item @command{cmp} |
| @c ---------------- |
| @prindex @command{cmp} |
| @command{cmp} performs a raw data comparison of two files, while |
| @command{diff} compares two text files. Therefore, if you might compare |
| DOS files, even if only checking whether two files are different, use |
| @command{diff} to avoid spurious differences due to differences of |
| newline encoding. |
| |
| |
| @item @command{cp} |
| @c --------------- |
| @prindex @command{cp} |
| The @option{-i}, @option{-f}, @option{-p} and @option{-R} options are |
| widely used. POSIX also specifies @option{-H}, @option{-L}, and |
| @option{-P}. Avoid other options in portable scripts. |
| |
| @cindex timestamp resolution |
| Traditionally, file timestamps had 1-second resolution, and @samp{cp |
| -p} copied the timestamps exactly. However, many modern file systems |
| have timestamps with 1-nanosecond resolution. Unfortunately, some older |
| @samp{cp -p} implementations truncate timestamps when copying files, |
| which can cause the destination file to appear to be older than the |
| source. The exact amount of truncation depends on the resolution of |
| the system calls that @command{cp} uses. Traditionally this was |
| @code{utime}, which has 1-second resolution. Since |
| GNU Core Utilities 6.12 (2008), GNU @command{cp} can set timestamps to |
| the full nanosecond resolution, using the system calls |
| @code{futimens} and @code{utimensat} when they are available. As of |
| 2024, though, some platforms (such as AIX 7.3) still have @samp{cp -p} |
| that supports only 1-second resolution, and some operating systems |
| and file systems have similar limitations even when running |
| GNU @command{cp}. |
| |
| Although @samp{cp -p} always @emph{tries} to copy |
| ownerships, whether it actually does so is a |
| system dependent policy decision implemented by the kernel. If the |
| kernel allows it then it happens. If the kernel does not allow it then |
| it does not happen. It is not something @command{cp} itself has control |
| over. |
| |
| In Unix System V any user can chown files to any other user, and System |
| V also has a non-sticky @file{/tmp}. That probably derives from the |
| heritage of System V in a business environment without hostile users. |
| BSD changed this |
| to be a more secure model where only root can @command{chown} files and |
| a sticky @file{/tmp} is used. That undoubtedly derives from the heritage |
| of BSD in a campus environment. |
| |
| GNU/Linux and Solaris by default follow BSD, but |
| can be configured to allow a System V style @command{chown}. On the |
| other hand, HP-UX follows System V, but can |
| be configured to use the modern security model and disallow |
| @command{chown}. Since it is an administrator-configurable parameter |
| you can't use the name of the kernel as an indicator of the behavior. |
| |
| |
| |
| @item @command{date} |
| @c ----------------- |
| @prindex @command{date} |
| When most versions of @command{date} do not recognize a @samp{%} |
| conversion specification, they quietly pass it through, |
| and exit with success: |
| |
| @example |
| $ @kbd{date --version | head -n 1} |
| date (GNU coreutils) 9.5 |
| $ @kbd{date +'%H:%M %Q'} |
| 17:25 %Q |
| @end example |
| |
| @noindent |
| However, this behavior is not required by POSIX. |
| |
| |
| @item @command{dirname} |
| @c -------------------- |
| @prindex @command{dirname} |
| Long ago some hosts lacked a working @command{dirname} and portable |
| scripts needed to use use @code{AS_DIRNAME} (@pxref{Programming in M4sh}). |
| Nowadays @command{dirname} suffices and the following are equivalent: |
| |
| @example |
| dir=`dirname -- "$file"` |
| dir=`AS_DIRNAME(["$file"])` |
| @end example |
| |
| |
| @item @command{egrep} |
| @c ------------------ |
| @prindex @command{egrep} |
| Although POSIX stopped requiring @command{egrep} in 2001, |
| a few traditional hosts (notably Solaris 10) do not support the POSIX |
| replacement @code{grep -E}. Also, some traditional implementations do |
| not work on long input lines. To work around these problems, invoke |
| @code{AC_PROG_EGREP} and then use @code{$EGREP}. |
| |
| Portable extended regular expressions should use @samp{\} only to escape |
| characters in the string @samp{$()*+.?[\^@{|}. For example, @samp{\@}} |
| is not portable, even though it typically matches @samp{@}}. |
| |
| The empty alternative is not portable. Use @samp{?} instead. For |
| instance with Digital Unix v5.0: |
| |
| @example |
| > printf 'foo\n|foo\n' | $EGREP '^(|foo|bar)$' |
| |foo |
| > printf 'bar\nbar|\n' | $EGREP '^(foo|bar|)$' |
| bar| |
| > printf 'foo\nfoo|\n|bar\nbar\n' | $EGREP '^(foo||bar)$' |
| foo |
| |bar |
| @end example |
| |
| For more information about what can appear in portable extended regular |
| expressions, @pxref{Problematic Expressions,,,grep, GNU Grep}. |
| |
| @command{$EGREP} also suffers the limitations of @command{grep} |
| (@pxref{grep, , Limitations of Usual Tools}). |
| |
| @item @command{expr} |
| @c ----------------- |
| @prindex @command{expr} |
| Not all implementations obey the POSIX rule that @samp{--} separates |
| options from arguments; likewise, not all implementations provide the |
| extension to POSIX that the first argument can be treated as part of a |
| valid expression rather than an invalid option if it begins with |
| @samp{-}. When performing arithmetic, use @samp{expr 0 + $var} if |
| @samp{$var} might be a negative number, to keep @command{expr} from |
| interpreting it as an option. |
| |
| No @command{expr} keyword starts with @samp{X}, so use @samp{expr |
| X"@var{word}" : 'X@var{regex}'} to keep @command{expr} from |
| misinterpreting @var{word}. |
| |
| Don't use @code{length}, @code{substr}, @code{match} and @code{index}. |
| |
| @item @command{expr} (@samp{|}) |
| @prindex @command{expr} (@samp{|}) |
| You can use @samp{|}. Although POSIX does require that @samp{expr |
| ''} return the empty string, it does not specify the result when you |
| @samp{|} together the empty string (or zero) with the empty string. For |
| example: |
| |
| @example |
| expr '' \| '' |
| @end example |
| |
| POSIX 1003.2-1992 returns the empty string |
| for this case, but traditional Unix returns @samp{0} (Solaris is |
| one such example). In POSIX 1003.1-2001, the specification was |
| changed to match traditional Unix's behavior (which is |
| bizarre, but it's too late to fix this). Please note that the same |
| problem does arise when the empty string results from a computation, |
| as in: |
| |
| @example |
| expr bar : foo \| foo : bar |
| @end example |
| |
| @noindent |
| Avoid this portability problem by avoiding the empty string. |
| |
| |
| @item @command{expr} (@samp{:}) |
| @c ---------------------------- |
| @prindex @command{expr} |
| Portable @command{expr} regular expressions should use @samp{\} to |
| escape only characters in the string @samp{$()*.123456789[\^@{@}}. |
| For example, alternation, @samp{\|}, is common but POSIX does not |
| require its support, so it should be avoided in portable scripts. |
| Similarly, @samp{\+} and @samp{\?} should be avoided. |
| |
| Portable @command{expr} regular expressions should not begin with |
| @samp{^}. Patterns are automatically anchored so leading @samp{^} is |
| not needed anyway. |
| |
| On the other hand, the behavior of the @samp{$} anchor is not portable |
| on multi-line strings. POSIX is ambiguous whether the anchor applies to |
| each line, as was done in older versions of the GNU Core Utilities, or |
| whether it applies only to the end of the overall string, as in |
| Coreutils 6.0 and most other implementations. |
| |
| @example |
| $ @kbd{baz='foo} |
| > @kbd{bar'} |
| $ @kbd{expr "X$baz" : 'X\(foo\)$'} |
| |
| $ @kbd{expr-5.97 "X$baz" : 'X\(foo\)$'} |
| foo |
| @end example |
| |
| The POSIX standard is ambiguous as to whether |
| @samp{expr 'a' : '\(b\)'} outputs @samp{0} or the empty string. |
| In practice, it outputs the empty string on most platforms, but portable |
| scripts should not assume this. For instance, the QNX 4.25 native |
| @command{expr} returns @samp{0}. |
| |
| One might think that a way to get a uniform behavior would be to use |
| the empty string as a default value: |
| |
| @example |
| expr a : '\(b\)' \| '' |
| @end example |
| |
| @noindent |
| Unfortunately this behaves exactly as the original expression; see the |
| @command{expr} (@samp{|}) entry for more information. |
| |
| Some ancient @command{expr} implementations (e.g., |
| Solaris 10 @command{/usr/ucb/expr}) have a silly length limit that causes |
| @command{expr} to fail if the matched substring is longer than 120 |
| bytes. In this case, you might want to fall back on @samp{printf|sed} if |
| @command{expr} fails. Nowadays this is of practical importance only for |
| the rare installer who mistakenly puts @file{/usr/ucb} before |
| @file{/usr/bin} in @env{PATH} on Solaris 10. |
| |
| On Mac OS X 10.4, @command{expr} mishandles the pattern @samp{[^-]} in |
| some cases. For example, the command |
| @example |
| expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)' |
| @end example |
| |
| @noindent |
| outputs @samp{apple-darwin8.1.0} rather than the correct @samp{darwin8.1.0}. |
| This particular case can be worked around by substituting @samp{[^--]} |
| for @samp{[^-]}. |
| |
| Don't leave, there is some more! |
| |
| The QNX 4.25 @command{expr}, in addition of preferring @samp{0} to |
| the empty string, has a funny behavior in its exit status: it's always 1 |
| when parentheses are used! |
| |
| @example |
| $ @kbd{val=`expr 'a' : 'a'`; echo "$?: $val"} |
| 0: 1 |
| $ @kbd{val=`expr 'a' : 'b'`; echo "$?: $val"} |
| 1: 0 |
| |
| $ @kbd{val=`expr 'a' : '\(a\)'`; echo "?: $val"} |
| 1: a |
| $ @kbd{val=`expr 'a' : '\(b\)'`; echo "?: $val"} |
| 1: 0 |
| @end example |
| |
| @noindent |
| In practice this can be a big problem if you are ready to catch failures |
| of @command{expr} programs with some other method (such as using |
| @command{sed}), since you may get twice the result. For instance |
| |
| @example |
| $ @kbd{expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'} |
| @end example |
| |
| @noindent |
| outputs @samp{a} on most hosts, but @samp{aa} on QNX 4.25. A |
| simple workaround consists of testing @command{expr} and using a variable |
| set to @command{expr} or to @command{false} according to the result. |
| |
| On HP-UX 11, @command{expr} supports only a single |
| sub-expression. |
| |
| @example |
| $ @kbd{expr 'Xfoo' : 'X\(f\(oo\)*\)$'} |
| expr: More than one '\(' was used. |
| @end example |
| |
| |
| @item @command{fgrep} |
| @c ------------------ |
| @prindex @command{fgrep} |
| Although POSIX stopped requiring @command{fgrep} in 2001, |
| a few traditional hosts (notably Solaris 10) do not support the POSIX |
| replacement @code{grep -F}. Also, some traditional implementations do |
| not work on long input lines. To work around these problems, invoke |
| @code{AC_PROG_FGREP} and then use @code{$FGREP}. |
| |
| |
| @item @command{find} |
| @c ----------------- |
| @prindex @command{find} |
| Many operands of GNU @command{find} are not standardized by POSIX and |
| are missing on many platforms. These nonportable operands include |
| @option{-follow}, @option{-maxdepth}, @option{-mindepth}, |
| @option{-printf}, and @option{,}. See the |
| @uref{https://@/pubs.opengroup.org/@/onlinepubs/@/9699919799/@/utilities/@/find.html, |
| POSIX spec for @command{find}} for @command{find} operands that |
| should be portable nowadays. |
| |
| The replacement of @samp{@{@}} is guaranteed only if the argument is |
| exactly @samp{@{@}}, not if @samp{@{@}} only a part of a larger argument. |
| For instance, on AIX 7.3: |
| |
| @example |
| $ @kbd{touch foo} |
| $ @kbd{find . -name foo -exec echo '@{@}-@{@}' \;} |
| @{@}-@{@} |
| @end example |
| |
| @noindent |
| while GNU @command{find} reports @samp{./foo-./foo}. |
| POSIX allows either behavior. |
| |
| AIX 7.3 @samp{find ... -exec @var{command} +} incorrectly fails if |
| @var{command} is not executed. For example, @samp{find . -name '*.tmp' |
| -exec rm @{@} +} incorrectly outputs a diagnostic and fails if no file |
| names end in @samp{.tmp}. To work around this problem you can use a |
| circumlocution like @samp{find . -name '*.tmp' -exec rm -f @{@} + -o |
| -exec true ';'}. |
| |
| @anchor{grep} |
| @item @command{grep} |
| @c ----------------- |
| @prindex @command{grep} |
| Portable scripts can rely on the @command{grep} options @option{-c}, |
| @option{-l}, @option{-n}, and @option{-v}, but should avoid other |
| options. For example, don't use @option{-w}, as POSIX does not require it. |
| Also, portable scripts should not combine @option{-c} with @option{-l}, |
| as POSIX does not allow this. |
| |
| Some of the options required by POSIX are not portable in practice. |
| Don't use @samp{grep -q} to suppress output, because traditional @command{grep} |
| implementations (e.g., Solaris 10) do not support @option{-q}. |
| Don't use @samp{grep -s} to suppress output either, because POSIX |
| says @option{-s} does not suppress output, only some error messages; |
| also, the @option{-s} option of traditional @command{grep} behaved |
| like @option{-q} does in most modern implementations. Instead, |
| redirect the standard output and standard error (in case the file |
| doesn't exist) of @code{grep} to @file{/dev/null}. Check the exit |
| status of @code{grep} to determine whether it found a match. |
| |
| The QNX4 implementation fails to count lines with @code{grep -c '$'}, |
| but works with @code{grep -c '^'}. Other alternatives for counting |
| lines are to use @code{sed -n '$='} or @code{wc -l}. |
| |
| Some traditional @command{grep} implementations do not work on long |
| input lines. On AIX the default @code{grep} silently truncates long |
| lines on the input before matching. |
| |
| Also, Solaris 10 @command{grep} does not support @option{-e}. |
| To work around this, invoke @code{AC_PROG_GREP} and then use @code{$GREP}. |
| |
| Another possible workaround for the multiple @option{-e} problem is to |
| separate the patterns by newlines, for example: |
| |
| @example |
| grep 'foo |
| bar' in.txt |
| @end example |
| |
| @noindent |
| except that this fails with traditional @command{grep} |
| implementations and with OpenBSD 3.8 @command{grep}. |
| |
| Traditional @command{grep} implementations (e.g., Solaris 10) do not |
| support the @option{-E} or @option{-F} options. To work around these |
| problems, invoke @code{AC_PROG_EGREP} and then use @code{$EGREP}, and |
| similarly for @code{AC_PROG_FGREP} and @code{$FGREP}. Even if you are |
| willing to require support for POSIX @command{grep}, your script should |
| not use both @option{-E} and @option{-F}, since POSIX does not allow |
| this combination. |
| |
| Portable @command{grep} regular expressions should use @samp{\} only to |
| escape characters in the string @samp{$()*.123456789[\^@{@}}. For example, |
| alternation, @samp{\|}, is common but POSIX does not require its |
| support in basic regular expressions, so it should be avoided in |
| portable scripts. Solaris and HP-UX @command{grep} do not support it. |
| Similarly, the following escape sequences should also be avoided: |
| @samp{\<}, @samp{\>}, @samp{\+}, @samp{\?}, @samp{\`}, @samp{\'}, |
| @samp{\B}, @samp{\b}, @samp{\S}, @samp{\s}, @samp{\W}, and @samp{\w}. |
| For more information about what can appear in portable regular expressions, |
| @pxref{Problematic Expressions,,, grep, GNU Grep}. |
| |
| POSIX does not specify the behavior of @command{grep} on binary files. |
| An example where this matters is using BSD @command{grep} to |
| search text that includes embedded ANSI escape sequences for |
| colored output to terminals (@samp{\033[m} is the sequence to restore |
| normal output); the behavior depends on whether input is seekable: |
| |
| @example |
| $ @kbd{printf 'esc\033[mape\n' > sample} |
| $ @kbd{grep . sample} |
| Binary file sample matches |
| $ @kbd{cat sample | grep .} |
| escape |
| @end example |
| |
| |
| @item @command{join} |
| @c ----------------- |
| @prindex @command{join} |
| On NetBSD, @command{join -a 1 file1 file2} mistakenly behaves like |
| @command{join -a 1 -a 2 1 file1 file2}, resulting in a usage warning; |
| the workaround is to use @command{join -a1 file1 file2} instead. |
| |
| On some circa-2020 BSD-based systems @command{join} mishandles inputs |
| with missing fields. For example, an empty line is not treated as |
| containing an empty join field. As a workaround, input lines should |
| always have a join field. |
| |
| On platforms with the BusyBox tools, the @command{join} command is |
| entirely missing. As a workaround, you can simulate special cases of the |
| @command{join} command using an @command{awk} script. For an example, |
| see @url{https://lists.gnu.org/r/bug-gnulib/2021-04/msg00054.html}. |
| |
| |
| @item @command{ln} |
| @c --------------- |
| @prindex @command{ln} |
| The @option{-f} option is portable nowadays. |
| |
| @cindex Symbolic links |
| Symbolic links are not available on some systems; use @samp{$(LN_S)} as |
| a portable substitute. |
| |
| For versions of the DJGPP before 2.04, |
| @command{ln} emulates symbolic links |
| to executables by generating a stub that in turn calls the real |
| program. This feature also works with nonexistent files like in the |
| POSIX spec. So @samp{ln -s file link} generates @file{link.exe}, |
| which attempts to call @file{file.exe} if run. But this feature only |
| works for executables, so @samp{cp -p} is used instead for these |
| systems. DJGPP versions 2.04 and later have full support |
| for symbolic links. |
| |
| |
| @item @command{ls} |
| @c --------------- |
| @prindex @command{ls} |
| @cindex Listing directories |
| The portable options are @option{-acdilrtu}. Current practice is for |
| @option{-l} to output both owner and group, even though ancient versions |
| of @command{ls} omitted the group. |
| |
| On ancient hosts, @samp{ls foo} sent the diagnostic @samp{foo not found} |
| to standard output if @file{foo} did not exist. Hence a shell command |
| like @samp{sources=`ls *.c 2>/dev/null`} did not always work, since it |
| was equivalent to @samp{sources='*.c not found'} in the absence of |
| @samp{.c} files. This is no longer a practical problem, since current |
| @command{ls} implementations send diagnostics to standard error. |
| |
| The behavior of @command{ls} on a directory that is being concurrently |
| modified is not always predictable, because of a data race where cached |
| information returned by @code{readdir} does not match the current |
| directory state. In fact, Mac OS X 10.5 had an intermittent bug where |
| @code{readdir}, and thus @command{ls}, sometimes lists a file more than |
| once if other files were added or removed from the directory immediately |
| prior to the @command{ls} call. Since @command{ls} already sorts its |
| output, the duplicate entries can be avoided by piping the results |
| through @code{uniq}. |
| |
| @anchor{mkdir} |
| @item @command{mkdir} |
| @c ------------------ |
| @prindex @command{mkdir} |
| @cindex Making directories |
| Combining the @option{-m} and @option{-p} options, as in @samp{mkdir -m |
| go-w -p @var{dir}}, often leads to trouble. FreeBSD |
| @command{mkdir} incorrectly attempts to change the permissions of |
| @var{dir} even if it already exists. HP-UX 11.23 |
| @command{mkdir} often assigns the wrong permissions to |
| any newly-created parents of @var{dir}. |
| |
| POSIX does not clearly specify whether @samp{mkdir -p foo} |
| should succeed when @file{foo} is a symbolic link to an already-existing |
| directory. The GNU @command{mkdir} |
| succeeds, but Solaris 10 @command{mkdir} fails. |
| |
| Traditional @code{mkdir -p} implementations suffer from race conditions. |
| For example, if you invoke @code{mkdir -p a/b} and @code{mkdir -p a/c} |
| at the same time, both processes might detect that @file{a} is missing, |
| one might create @file{a}, then the other might try to create @file{a} |
| and fail with a @code{File exists} diagnostic. Solaris 10 @command{mkdir} |
| is vulnerable, and other traditional Unix systems are |
| probably vulnerable too. This possible race is harmful in parallel |
| builds when several Make rules call @code{mkdir -p} to |
| construct directories. You may use |
| @code{install-sh -d} as a safe replacement, for example by setting |
| @samp{MKDIR_P='/path/to/install-sh -d'} in the environment of |
| @command{configure}, assuming the package distributes @file{install-sh}. |
| |
| @item @command{mkfifo} |
| @itemx @command{mknod} |
| @c ------------------- |
| @prindex @command{mkfifo} |
| @prindex @command{mknod} |
| The GNU Coding Standards state that @command{mknod} is safe to use on |
| platforms where it has been tested to exist; but it is generally portable |
| only for creating named FIFOs, since device numbers are |
| platform-specific. Autotest uses @command{mkfifo} to implement parallel |
| testsuites. POSIX states that behavior is unspecified when opening a |
| named FIFO for both reading and writing; on at least Cygwin, this |
| results in failure on any attempt to read or write to that file |
| descriptor. |
| |
| @item @command{mktemp} |
| @c ------------------- |
| @prindex @command{mktemp} |
| @cindex Creating temporary files |
| Shell scripts can use temporary files safely with @command{mktemp}, but |
| it does not exist on all systems. A portable way to create a safe |
| temporary file name is to create a temporary directory with mode 700 and |
| use a file inside this directory. Both methods prevent attackers from |
| gaining control, though @command{mktemp} is far less likely to fail |
| gratuitously under attack. |
| |
| Here is sample code to create a new temporary directory @samp{$dir} safely: |
| |
| @example |
| # Create a temporary directory $dir in $TMPDIR (default /tmp). |
| # Use mktemp if possible; otherwise fall back on mkdir, |
| # with $RANDOM to make collisions less likely. |
| : "$@{TMPDIR:=/tmp@}" |
| @{ |
| dir=` |
| (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null |
| ` && |
| test -d "$dir" |
| @} || @{ |
| dir=$TMPDIR/foo$$-$RANDOM |
| @c $$ restore font-lock |
| (umask 077 && mkdir "$dir") |
| @} || exit $? |
| @end example |
| |
| |
| @item @command{mv} |
| @c --------------- |
| @prindex @command{mv} |
| @cindex Moving open files |
| The only portable options are @option{-f} and @option{-i}. |
| |
| Moving individual files between file systems is portable (it was in Unix |
| version 6), |
| but it is not always atomic: when doing @samp{mv new existing}, there's |
| a critical section where neither the old nor the new version of |
| @file{existing} actually exists. |
| |
| On some systems moving files from @file{/tmp} can sometimes cause |
| undesirable (but perfectly valid) warnings, even if you created these |
| files. This is because @file{/tmp} belongs to a group that ordinary |
| users are not members of, and files created in @file{/tmp} inherit |
| the group of @file{/tmp}. When the file is copied, @command{mv} issues |
| a diagnostic without failing: |
| |
| @smallexample |
| $ @kbd{touch /tmp/foo} |
| $ @kbd{mv /tmp/foo .} |
| @error{}mv: ./foo: set owner/group (was: 100/0): Operation not permitted |
| $ @kbd{echo $?} |
| 0 |
| $ @kbd{ls foo} |
| foo |
| @end smallexample |
| |
| @noindent |
| This annoying behavior conforms to POSIX, unfortunately. |
| |
| Moving directories across mount points is not portable, use @command{cp} |
| and @command{rm}. |
| |
| DOS variants cannot rename or remove open files, and do not |
| support commands like @samp{mv foo bar >foo}, even though this is |
| perfectly portable among POSIX hosts. |
| |
| |
| @item @command{od} |
| @c --------------- |
| @prindex @command{od} |
| |
| In Mac OS X versions prior to 10.4.3, @command{od} does not support the |
| standard POSIX options @option{-A}, @option{-j}, @option{-N}, or |
| @option{-t}, or the XSI option, @option{-s}. The only |
| supported POSIX option is @option{-v}, and the only supported |
| XSI options are those in @option{-bcdox}. The BSD |
| @command{hexdump} program can be used instead. |
| |
| In some versions of some operating systems derived from Solaris 11, |
| @command{od} prints decimal byte values padded with zeros rather than |
| with spaces: |
| |
| @smallexample |
| $ @kbd{printf '#!' | od -A n -t d1 -N 2} |
| 035 033 |
| @end smallexample |
| |
| @noindent |
| instead of |
| |
| @smallexample |
| $ @kbd{printf '#!' | od -A n -t d1 -N 2} |
| 35 33 |
| @end smallexample |
| |
| We have observed this on both OpenIndiana and OmniOS; |
| Illumos may also be affected. |
| As a workaround, you can use octal output (option @code{-t o1}). |
| |
| |
| @item @command{rm} |
| @c --------------- |
| @prindex @command{rm} |
| The @option{-f} and @option{-r} options are portable. |
| |
| It is not portable to invoke @command{rm} without options or operands. |
| On the other hand, POSIX now requires @command{rm -f} to silently |
| succeed when there are no operands (useful for constructs like |
| @command{rm -rf $filelist} without first checking if @samp{$filelist} |
| was empty). But this was not always portable; at least NetBSD |
| @command{rm} built before 2008 would fail with a diagnostic. |
| |
| A file might not be removed even if its parent directory is writable |
| and searchable. Many POSIX hosts cannot remove a mount point, a named |
| stream, a working directory, or a last link to a file that is being |
| executed. |
| |
| DOS variants cannot rename or remove open files, and do not |
| support commands like @samp{rm foo >foo}, even though this is |
| perfectly portable among POSIX hosts. |
| |
| @item @command{rmdir} |
| @c ------------------ |
| @prindex @command{rmdir} |
| Just as with @command{rm}, some platforms refuse to remove a working |
| directory. |
| |
| @anchor{sed} |
| @item @command{sed} |
| @c ---------------- |
| @prindex @command{sed} |
| Patterns should not include the separator (unless escaped), even as part |
| of a character class. In conformance with POSIX, the Cray |
| @command{sed} rejects @samp{s/[^/]*$//}: use @samp{s%[^/]*$%%}. |
| Even when escaped, patterns should not include separators that are also |
| used as @command{sed} metacharacters. For example, GNU sed 4.0.9 rejects |
| @samp{s,x\@{1\,\@},,}, while sed 4.1 strips the backslash before the comma |
| before evaluating the basic regular expression. |
| |
| Avoid empty patterns within parentheses (i.e., @samp{\(\)}). POSIX does |
| not require support for empty patterns, and Unicos 9 @command{sed} rejects |
| them. |
| |
| Unicos 9 @command{sed} loops endlessly on patterns like @samp{.*\n.*}. |
| |
| Sed scripts should not use branch labels longer than 7 characters and |
| should not contain comments; AIX 5.3 @command{sed} rejects indented comments. |
| HP-UX sed has a limit of 99 commands (not counting @samp{:} commands) and |
| 48 labels, which cannot be circumvented by using more than one script |
| file. It can execute up to 19 reads with the @samp{r} command per cycle. |
| Solaris @command{/usr/ucb/sed} rejects usages that exceed a limit of |
| about 6000 bytes for the internal representation of commands. |
| |
| Avoid redundant @samp{;}, as some @command{sed} implementations, such as |
| NetBSD 1.4.2's, incorrectly try to interpret the second |
| @samp{;} as a command: |
| |
| @example |
| $ @kbd{echo a | sed 's/x/x/;;s/x/x/'} |
| sed: 1: "s/x/x/;;s/x/x/": invalid command code ; |
| @end example |
| |
| Some @command{sed} implementations have a buffer limited to 4000 bytes, |
| and this limits the size of input lines, output lines, and internal |
| buffers that can be processed portably. Likewise, |
| not all @command{sed} implementations can handle embedded @code{NUL} or |
| a missing trailing newline. |
| |
| Remember that ranges within a bracket expression of a regular expression |
| are only well-defined in the @samp{C} (or @samp{POSIX}) locale. |
| Meanwhile, support for character classes like @samp{[[:upper:]]} is not |
| yet universal, so if you cannot guarantee the setting of @env{LC_ALL}, |
| it is better to spell out a range @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]} |
| than to rely on @samp{[A-Z]}. |
| |
| Additionally, POSIX states that regular expressions are only |
| well-defined on characters. Unfortunately, there exist platforms such |
| as Mac OS X 10.5 where not all 8-bit byte values are valid characters, |
| even though that platform has a single-byte @samp{C} locale. And POSIX |
| allows the existence of a multi-byte @samp{C} locale, although that does |
| not yet appear to be a common implementation. At any rate, it means |
| that not all bytes will be matched by the regular expression @samp{.}: |
| |
| @example |
| $ @kbd{printf '\200\n' | LC_ALL=C sed -n /./p | wc -l} |
| 0 |
| $ @kbd{printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l} |
| 1 |
| @end example |
| |
| Portable @command{sed} regular expressions should use @samp{\} only to escape |
| characters in the string @samp{$()*.123456789[\^n@{@}}. For example, |
| alternation, @samp{\|}, is common but POSIX does not require its |
| support, so it should be avoided in portable scripts. Solaris |
| @command{sed} does not support alternation; e.g., @samp{sed '/a\|b/d'} |
| deletes only lines that contain the literal string @samp{a|b}. |
| Similarly, @samp{\+} and @samp{\?} should be avoided. |
| |
| Anchors (@samp{^} and @samp{$}) inside groups are not portable. |
| |
| Nested parentheses in patterns (e.g., @samp{\(\(a*\)b*)\)}) are |
| quite portable to current hosts, but was not supported by some ancient |
| @command{sed} implementations like SVR3. |
| |
| Some @command{sed} implementations, e.g., Solaris, restrict the special |
| role of the asterisk @samp{*} to one-character regular expressions and |
| back-references, and the special role of interval expressions |
| @samp{\@{@var{m}\@}}, @samp{\@{@var{m},\@}}, or @samp{\@{@var{m},@var{n}\@}} |
| to one-character regular expressions. This may lead to unexpected behavior: |
| |
| @example |
| $ @kbd{echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'} |
| x2x4 |
| $ @kbd{echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'} |
| x |
| @end example |
| |
| The @option{-e} option is mostly portable. |
| However, its argument cannot be empty, as this fails on AIX 7.3. |
| Some people prefer to use @samp{-e}: |
| |
| @example |
| sed -e '@var{command-1}' \ |
| -e '@var{command-2}' |
| @end example |
| |
| @noindent |
| as opposed to the equivalent: |
| |
| @example |
| sed ' |
| @var{command-1} |
| @var{command-2} |
| ' |
| @end example |
| |
| @noindent |
| The following usage is sometimes equivalent: |
| |
| @example |
| sed '@var{command-1};@var{command-2}' |
| @end example |
| |
| but POSIX says that this use of a semicolon has undefined effect if |
| @var{command-1}'s verb is @samp{@{}, @samp{a}, @samp{b}, @samp{c}, |
| @samp{i}, @samp{r}, @samp{t}, @samp{w}, @samp{:}, or @samp{#}, so you |
| should use semicolon only with simple scripts that do not use these |
| verbs. |
| |
| POSIX up to the 2008 revision requires the argument of the @option{-e} |
| option to be a syntactically complete script. GNU @command{sed} allows |
| to pass multiple script fragments, each as argument of a separate |
| @option{-e} option, that are then combined, with newlines between the |
| fragments, and a future POSIX revision may allow this as well. This |
| approach is not portable with script fragments ending in backslash; for |
| example, the @command{sed} programs on Solaris 10, HP-UX 11, and AIX |
| don't allow splitting in this case: |
| |
| @example |
| $ @kbd{echo a | sed -n -e 'i\} |
| @kbd{0'} |
| 0 |
| $ @kbd{echo a | sed -n -e 'i\' -e 0} |
| Unrecognized command: 0 |
| @end example |
| |
| @noindent |
| In practice, however, this technique of joining fragments |
| through @option{-e} works for multiple @command{sed} functions within |
| @samp{@{} and @samp{@}}, even if that is not specified by POSIX: |
| |
| @example |
| @c The quote around the closing brace silences interactive zsh. |
| $ @kbd{echo a | sed -n -e '/a/@{' -e s/a/b/ -e p -e '@}'} |
| b |
| @end example |
| |
| Commands inside @{ @} brackets are further restricted. POSIX 2008 says that |
| they cannot be preceded by addresses, @samp{!}, or @samp{;}, and that |
| each command must be followed immediately by a newline, without any |
| intervening blanks or semicolons. The closing bracket must be alone on |
| a line, other than white space preceding or following it. However, a |
| future version of POSIX may standardize the use of addresses within brackets. |
| |
| Contrary to yet another urban legend, you may portably use @samp{&} in |
| the replacement part of the @code{s} command to mean ``what was |
| matched''. All descendants of Unix version 7 @command{sed} |
| (at least; we |
| don't have first hand experience with older @command{sed} implementations) have |
| supported it. |
| |
| POSIX requires that you must not have any white space between |
| @samp{!} and the following command. It is OK to have blanks between |
| the address and the @samp{!}. For instance, on Solaris: |
| |
| @example |
| $ @kbd{echo "foo" | sed -n '/bar/ ! p'} |
| @error{}Unrecognized command: /bar/ ! p |
| $ @kbd{echo "foo" | sed -n '/bar/! p'} |
| @error{}Unrecognized command: /bar/! p |
| $ @kbd{echo "foo" | sed -n '/bar/ !p'} |
| foo |
| @end example |
| |
| POSIX also says that you should not combine @samp{!} and @samp{;}. If |
| you use @samp{!}, it is best to put it on a command that is delimited by |
| newlines rather than @samp{;}. |
| |
| Also note that POSIX requires that the @samp{b}, @samp{t}, @samp{r}, and |
| @samp{w} commands be followed by exactly one space before their argument. |
| On the other hand, no white space is allowed between @samp{:} and the |
| subsequent label name. |
| |
| If a sed script is specified on the command line and ends in an |
| @samp{a}, @samp{c}, or @samp{i} command, the last line of inserted text |
| should be followed by a newline. Otherwise some @command{sed} |
| implementations (e.g., OpenBSD 3.9) do not append a newline to the |
| inserted text. |
| |
| Many @command{sed} implementations (e.g., Mac OS X 10.4, |
| OpenBSD 3.9, Solaris 10 |
| @command{/usr/ucb/sed}) strip leading white space from the text of |
| @samp{a}, @samp{c}, and @samp{i} commands. Prepend a backslash to |
| work around this incompatibility with POSIX: |
| |
| @example |
| $ @kbd{echo flushleft | sed 'a\} |
| > @kbd{ indented} |
| > @kbd{'} |
| flushleft |
| indented |
| $ @kbd{echo foo | sed 'a\} |
| > @kbd{\ indented} |
| > @kbd{'} |
| flushleft |
| indented |
| @end example |
| |
| POSIX requires that with an empty regular expression, the last non-empty |
| regular expression from either an address specification or substitution |
| command is applied. However, busybox 1.6.1 complains when using a |
| substitution command with a replacement containing a back-reference to |
| an empty regular expression; the workaround is repeating the regular |
| expression. |
| |
| @example |
| $ @kbd{echo abc | busybox sed '/a\(b\)c/ s//\1/'} |
| sed: No previous regexp. |
| $ @kbd{echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'} |
| b |
| @end example |
| |
| Portable scripts should be aware of the inconsistencies and options for |
| handling word boundaries, as these are not specified by POSIX. |
| |
| @example |
| \< \b [[:<:]] |
| Solaris 10 yes no no |
| Solaris XPG4 yes no error |
| NetBSD 5.1 no no yes |
| FreeBSD 9.1 no no yes |
| GNU yes yes error |
| busybox yes yes error |
| @end example |
| |
| @item @command{sed} (@samp{t}) |
| @c --------------------------- |
| @prindex @command{sed} (@samp{t}) |
| There are two things one should remember about @samp{t} in @command{sed}. |
| First, @samp{t} jumps if @emph{some} substitution |
| succeeded, not only the immediately preceding substitution. Therefore, |
| always use a fake @samp{t clear} followed by a @samp{:clear} on the next |
| line, to reset the @samp{t} flag where needed. |
| |
| Second, do not rely on @command{sed} to clear the flag at each new cycle. |
| |
| For example, the following script replaces all instances of ``keep me'' |
| with ``kept'', and replaces the contents of all lines that did not |
| contain ``keep me'' with ``deleted''. |
| |
| @example |
| t clear |
| :clear |
| s/keep me/kept/g |
| t end |
| s/.*/deleted/g |
| :end |
| @end example |
| |
| @item @command{sed} (@samp{w}) |
| @c --------------------------- |
| @prindex @command{sed} (@samp{w}) |
| |
| When a script contains multiple commands to write lines to the same |
| output file, BusyBox @command{sed} mistakenly opens a separate output |
| stream for each command. This can cause one of the commands to ``win'' |
| and the others to ``lose'', in the sense that their output is discarded. |
| For example: |
| |
| @example |
| sed -n -e ' |
| /a/w xxx |
| /b/w xxx |
| ' <<EOF |
| a |
| b |
| EOF |
| @end example |
| |
| This might output only @samp{a} to @file{xxx}; the @samp{b} is lost. |
| To avoid the problem, a portable script should contain at most one |
| @samp{w} or @samp{s/.../.../w} command per output file. |
| |
| @item @command{sleep} |
| @c ------------------ |
| @prindex @command{sleep} |
| Using @command{sleep} is generally portable. However, remember that |
| adding a @command{sleep} to work around timestamp issues, with a minimum |
| granularity of one second, doesn't scale well for parallel builds on |
| modern machines with sub-second process completion. |
| |
| @item @command{sort} |
| @c ----------------- |
| @prindex @command{sort} |
| Remember that sort order is influenced by the current locale. Inside |
| @file{configure}, the C locale is in effect, but in Makefile snippets, |
| you may need to specify @code{LC_ALL=C sort}. |
| |
| @item @command{tar} |
| @c ---------------- |
| @prindex @command{tar} |
| There are multiple file formats for @command{tar}; if you use Automake, |
| the macro @code{AM_INIT_AUTOMAKE} has some options controlling which |
| level of portability to use. |
| |
| @anchor{touch} |
| @item @command{touch} |
| @c ------------------ |
| @prindex @command{touch} |
| @cindex timestamp resolution |
| If you specify the desired timestamp (e.g., with the @option{-r} |
| option), older @command{touch} implementations use the @code{utime} or |
| @code{utimes} system call, which can result in the same kind of |
| timestamp truncation problems that @samp{cp -p} has. |
| |
| @item @command{tr} |
| @c --------------- |
| @prindex @command{tr} |
| |
| Many @command{tr} implementations do not support multi-byte locales |
| well. For example, Solaris 10 @command{tr} rejects character classes in |
| multi-byte locales. Also, ranges have well-defined behavior only in the |
| @samp{C} (or @samp{POSIX}) locale, so if you cannot guarantee the |
| setting of @env{LC_ALL} it is better to spell out a range |
| @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]} than to rely on @samp{[A-Z]}. |
| |
| @cindex carriage return, deleting |
| @cindex newline, deleting |
| @cindex deleting carriage return |
| Not all versions of @command{tr} handle all backslash character escapes. |
| For example, Solaris 10 @command{/usr/ucb/tr} falls over, even though |
| Solaris contains more modern @command{tr} in other locations. |
| Using octal escapes is more portable for carriage returns, since |
| @samp{\015} is the same for both ASCII and EBCDIC, and since use of |
| literal carriage returns in scripts causes a number of other problems. |
| But for other characters, like newline, using octal escapes ties the |
| operation to ASCII, so it is better to use literal characters. |
| |
| @example |
| $ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\n' ; echo} |
| moo |
| light |
| $ @kbd{@{ echo moon; echo light; @} | /usr/bin/tr -d '\n' ; echo} |
| moonlight |
| $ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\012' ; echo} |
| moonlight |
| $ @kbd{nl='} |
| @kbd{'; @{ echo moon; echo light; @} | /usr/ucb/tr -d "$nl" ; echo} |
| moonlight |
| @end example |
| |
| Not all versions of @command{tr} recognize direct ranges of characters: at |
| least Solaris @command{/usr/bin/tr} still fails to do so. But you can |
| use @command{/usr/xpg4/bin/tr} instead, or add brackets (which in POSIX |
| transliterate to themselves). |
| |
| @example |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z} |
| HAZy FAntAZy |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'} |
| HAZY FANTAZY |
| $ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z} |
| HAZY FANTAZY |
| @end example |
| |
| When providing two arguments, be sure the second string is at least as |
| long as the first. |
| |
| @example |
| $ @kbd{echo abc | /usr/xpg4/bin/tr bc d} |
| adc |
| $ @kbd{echo abc | coreutils/tr bc d} |
| add |
| @end example |
| |
| On platforms with the BusyBox tools, @command{tr} does not support the |
| @code{[@var{x}*@var{n}]} option syntax. |
| |
| @example |
| $ @kbd{echo abc | tr 'abcd' '[A*4]'} |
| [A* |
| $ @kbd{echo abc | coreutils/tr 'abcd' '[A*4]'} |
| AAA |
| $ @kbd{echo xyz | tr 'a-z' '[A*]'} |
| ]]] |
| $ @kbd{echo xyz | coreutils/tr 'a-z' '[A*]'} |
| AAA |
| @end example |
| |
| POSIX requires @command{tr} to operate on binary files. But at least |
| Solaris @command{/usr/ucb/tr} and @command{/usr/bin/tr} silently discard |
| @code{NUL} in the input prior to doing any translation. When using |
| @command{tr} to process a binary file that may contain @code{NUL} bytes, |
| it is necessary to use @command{/usr/xpg4/bin/tr} instead, or |
| @command{/usr/xpg6/bin/tr} if that is available. |
| |
| @example |
| $ @kbd{printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1} |
| 61 62 |
| $ @kbd{printf 'a\0b' | /usr/bin/tr x x | od -An -tx1} |
| 61 62 |
| $ @kbd{printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1} |
| 61 00 62 |
| @end example |
| |
| Solaris @command{/usr/ucb/tr} additionally fails to handle @samp{\0} as the |
| octal escape for @code{NUL}. |
| |
| @example |
| $ @kbd{printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1} |
| 61 62 63 |
| $ @kbd{printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1} |
| 61 00 64 |
| $ @kbd{printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1} |
| 61 00 64 |
| @end example |
| |
| @end table |
| |
| |
| @node Portable Make |
| @chapter Portable Make Programming |
| @prindex @command{make} |
| @cindex Limitations of @command{make} |
| |
| Writing portable makefiles is an art. Since a makefile's commands are |
| executed by the shell, you must consider the shell portability issues |
| already mentioned. However, other issues are specific to @command{make} |
| itself. |
| |
| @menu |
| * $< in Ordinary Make Rules:: $< in ordinary rules |
| * Failure in Make Rules:: Failing portably in rules |
| * Command Line Prefixes:: What's at the start of makefile command lines |
| * Special Chars in Names:: Special characters in macro names |
| * Backslash-Newline-Empty:: Empty lines after backslash-newline |
| * Backslash-Newline Comments:: Spanning comments across line boundaries |
| * Macros and Submakes:: @code{make macro=value} and submakes |
| * The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues |
| * The Make Macro SHELL:: @code{$(SHELL)} portability issues |
| * Parallel Make:: Parallel @command{make} quirks |
| * Comments in Make Rules:: Other problems with Make comments |
| * Newlines in Make Rules:: Using literal newlines in rules |
| * Comments in Make Macros:: Other problems with Make comments in macros |
| * Trailing whitespace in Make Macros:: Macro substitution problems |
| * Command-line Macros and whitespace:: Whitespace trimming of values |
| * obj/ and Make:: Don't name a subdirectory @file{obj} |
| * make -k Status:: Exit status of @samp{make -k} |
| * VPATH and Make:: @code{VPATH} woes |
| * Single Suffix Rules:: Single suffix rules and separated dependencies |
| * Timestamps and Make:: Sub-second timestamp resolution |
| @end menu |
| |
| @node $< in Ordinary Make Rules |
| @section @code{$<} in Ordinary Make Rules |
| |
| POSIX says that the @samp{$<} construct in makefiles can be |
| used only in inference rules and in the @samp{.DEFAULT} rule; its |
| meaning in ordinary rules is unspecified. Solaris @command{make} |
| for instance replaces it with the empty string. OpenBSD (3.0 and |
| later) @command{make} diagnoses these uses and errors out. |
| |
| @node Failure in Make Rules |
| @section Failure in Make Rules |
| |
| Unless errors are being ignored |
| (e.g., because a makefile command line is preceded by a @samp{-} prefix), |
| POSIX 2008 requires that @command{make} must invoke each command with |
| the equivalent of a @samp{sh -e -c} subshell, which causes the |
| subshell to exit immediately if a subsidiary simple-command fails, |
| with some complicated exceptions. |
| Historically not all @command{make} implementations |
| followed this rule. For |
| example, the command @samp{touch T; rm -f U} may attempt to |
| remove @file{U} even if the @command{touch} fails, although this is not |
| permitted with POSIX make. One way to work around failures in simple |
| commands is to reword them so that they always succeed, e.g., @samp{touch |
| T || :; rm -f U}. |
| However, even this approach can run into common bugs in BSD |
| implementations of the @option{-e} option of @command{sh} and |
| @command{set} (@pxref{set, , Limitations of Shell Builtins}), so if you |
| are worried |
| about porting to buggy BSD shells it may be simpler to migrate |
| complicated @command{make} actions into separate scripts. |
| |
| @node Command Line Prefixes |
| @section Makefile Command Line Prefixes |
| |
| Makefile command lines can be preceded by zero or more of |
| the command line prefixes @samp{-}, @samp{@@}, and @samp{+}, |
| which modify how @command{make} processes the command. |
| Although POSIX says these are the only command line prefixes, |
| some @command{make} implementations, such as Solaris @command{make}, |
| support the additional prefixes @samp{!} and @samp{?}. |
| Portable makefiles should therefore avoid using these two characters at |
| the start of a makefile command line. |
| For example: |
| |
| @example |
| mishandled-by-Solaris-make:; ! grep FIXME foo.c |
| portable-to-Solaris-make:; :;! grep FIXME foo.c |
| @end example |
| |
| @node Special Chars in Names |
| @section Special Characters in Make Macro Names |
| |
| POSIX limits macro names to nonempty strings containing only |
| ASCII letters and digits, @samp{.}, and @samp{_}. Many |
| @command{make} implementations allow a wider variety of characters, but |
| portable makefiles should avoid them. It is portable to start a name |
| with a special character, e.g., @samp{$(.FOO)}. |
| |
| Some ancient @command{make} implementations don't support leading |
| underscores in macro names. An example is NEWS-OS 4.2R. |
| |
| @example |
| $ @kbd{cat Makefile} |
| _am_include = # |
| _am_quote = |
| all:; @@echo this is test |
| $ @kbd{make} |
| Make: Must be a separator on rules line 2. Stop. |
| $ @kbd{cat Makefile2} |
| am_include = # |
| am_quote = |
| all:; @@echo this is test |
| $ @kbd{make -f Makefile2} |
| this is test |
| @end example |
| |
| @noindent |
| However, this problem is no longer of practical concern. |
| |
| @node Backslash-Newline-Empty |
| @section Backslash-Newline Before Empty Lines |
| |
| @c This has been seen on ia64 hpux 11.20, and on one hppa hpux 10.20, |
| @c but another hppa hpux 10.20 didn't have it. Bob Proulx |
| @c <bob@proulx.com> thinks it was in hpux 8.0 too. |
| On some versions of HP-UX, @command{make} reads multiple newlines |
| following a backslash, continuing to the next non-empty line. For |
| example, |
| |
| @example |
| FOO = one \ |
| |
| BAR = two |
| |
| test: |
| : FOO is "$(FOO)" |
| : BAR is "$(BAR)" |
| @end example |
| |
| @noindent |
| shows @code{FOO} equal to @code{one BAR = two}. Other implementations |
| sensibly let a backslash continue only to the immediately following |
| line. |
| |
| @node Backslash-Newline Comments |
| @section Backslash-Newline in Make Comments |
| |
| According to POSIX, Make comments start with @code{#} |
| and continue until an unescaped newline is reached. |
| |
| @example |
| $ @kbd{cat Makefile} |
| # A = foo \ |
| bar \ |
| baz |
| |
| all: |
| @@echo ok |
| $ @kbd{make} # GNU make |
| ok |
| @end example |
| |
| @noindent |
| However this is not always the case. Some implementations |
| discard everything from @code{#} through the end of the line, ignoring any |
| trailing backslash. |
| |
| @example |
| $ @kbd{pmake} # BSD make |
| "Makefile", line 3: Need an operator |
| Fatal errors encountered -- cannot continue |
| @end example |
| |
| @noindent |
| Therefore, if you want to comment out a multi-line definition, prefix each |
| line with @code{#}, not only the first. |
| |
| @example |
| # A = foo \ |
| # bar \ |
| # baz |
| @end example |
| |
| @node Macros and Submakes |
| @section @code{make macro=value} and Submakes |
| |
| A command-line variable definition such as @code{foo=bar} overrides any |
| definition of @code{foo} in a makefile. Some @command{make} |
| implementations (such as GNU @command{make}) propagate this |
| override to subsidiary invocations of @command{make}. Some other |
| implementations do not pass the substitution along to submakes. |
| |
| @example |
| $ @kbd{cat Makefile} |
| foo = foo |
| one: |
| @@printf '%s\n' $(foo) |
| $(MAKE) two |
| two: |
| @@printf '%s\n' $(foo) |
| $ @kbd{make foo=bar} # GNU make 3.79.1 |
| bar |
| make two |
| make[1]: Entering directory `/home/adl' |
| bar |
| make[1]: Leaving directory `/home/adl' |
| $ @kbd{pmake foo=bar} # BSD make |
| bar |
| pmake two |
| foo |
| @end example |
| |
| You have a few possibilities if you do want the @code{foo=bar} override |
| to propagate to submakes. One is to use the @option{-e} |
| option, which causes all environment variables to have precedence over |
| the makefile macro definitions, and declare foo as an environment |
| variable: |
| |
| @example |
| $ @kbd{env foo=bar make -e} |
| @end example |
| |
| The @option{-e} option is propagated to submakes automatically, |
| and since the environment is inherited between @command{make} |
| invocations, the @code{foo} macro is overridden in |
| submakes as expected. |
| |
| This syntax (@code{foo=bar make -e}) is portable only when used |
| outside of a makefile, for instance from a script or from the |
| command line. When run inside a @command{make} rule, GNU |
| @command{make} 3.80 and prior versions forget to propagate the |
| @option{-e} option to submakes. |
| |
| Moreover, using @option{-e} could have unexpected side effects if your |
| environment contains some other macros usually defined by the |
| makefile. (See also the note about @code{make -e} and @code{SHELL} |
| below.) |
| |
| If you can foresee all macros that a user might want to override, then |
| you can propagate them to submakes manually, from your makefile: |
| |
| @example |
| foo = foo |
| one: |
| @@printf '%s\n' $(foo) |
| $(MAKE) foo=$(foo) two |
| two: |
| @@printf '%s\n' $(foo) |
| @end example |
| |
| Another way to propagate a variable to submakes in a portable way is to |
| expand an extra variable in every invocation of @samp{$(MAKE)} within |
| your makefile: |
| |
| @example |
| foo = foo |
| one: |
| @@printf '%s\n' $(foo) |
| $(MAKE) $(SUBMAKEFLAGS) two |
| two: |
| @@printf '%s\n' $(foo) |
| @end example |
| |
| Users must be aware that this technique is in use to take advantage of |
| it, e.g.@: with @code{make foo=bar SUBMAKEFLAGS='foo=bar'}, but it |
| allows any macro to be overridden. Makefiles generated by |
| @command{automake} use this technique, expanding @code{$(AM_MAKEFLAGS)} |
| on the command lines of submakes (@pxref{Subdirectories, , Automake, |
| automake, GNU Automake}). |
| |
| @node The Make Macro MAKEFLAGS |
| @section The Make Macro MAKEFLAGS |
| @cindex @code{MAKEFLAGS} and @command{make} |
| @cindex @command{make} and @code{MAKEFLAGS} |
| |
| POSIX requires @command{make} to use @code{MAKEFLAGS} to affect the |
| current and recursive invocations of make, but allows implementations |
| several formats for the variable. It is tricky to parse |
| @code{$MAKEFLAGS} to determine whether @option{-s} for silent execution |
| or @option{-k} for continued execution are in effect. For example, you |
| cannot assume that the first space-separated word in @code{$MAKEFLAGS} |
| contains single-letter options, since in the Cygwin version of |
| GNU @command{make} it is either @option{--unix} or |
| @option{--win32} with the second word containing single-letter options. |
| |
| @example |
| $ @kbd{cat Makefile} |
| all: |
| @@printf 'MAKEFLAGS = %s\n' '$(MAKEFLAGS)' |
| $ @kbd{make} |
| MAKEFLAGS = --unix |
| $ @kbd{make -k} |
| MAKEFLAGS = --unix -k |
| @end example |
| |
| @node The Make Macro SHELL |
| @section The Make Macro @code{SHELL} |
| @cindex @code{SHELL} and @command{make} |
| @cindex @command{make} and @code{SHELL} |
| |
| Many @command{make} implementations use the the @code{$(SHELL)} |
| macro to spawn shell processes and execute Make rules. This |
| is a builtin macro with a default value upplied by @command{make}; |
| the default can be overridden by a makefile or by a command-line argument, |
| though not by the environment. |
| |
| Other @command{make} implementations use other ways to spawn shell |
| processes, and the POSIX standard for @command{make} says that portable |
| makefiles should neither define nor use the @code{$(SHELL)} macro. |
| |
| Despite this prohibition, in practice it does not hurt to define and |
| then possibly use @code{SHELL} in your makefiles and in some cases it |
| can help your builds use a better shell to spawn shell processes. |
| So it's a good idea to define @code{SHELL} in |
| your makefiles. If you use Autoconf, you can use |
| its standard output variable @code{SHELL} as follows: |
| |
| @example |
| SHELL = @@SHELL@@ |
| @end example |
| |
| @noindent |
| If you use Automake, this is done for you. |
| |
| Do not force @code{SHELL = /bin/sh} because that is not correct |
| everywhere. Remember, @file{/bin/sh} is not POSIX compliant on some |
| systems, such as Solaris 10. |
| Additionally, DJGPP lacks @code{/bin/sh}, and when its |
| GNU @command{make} port sees such a setting it enters a |
| special emulation mode where features like pipes and redirections are |
| emulated on top of DOS's @command{command.com}. Unfortunately this |
| emulation is incomplete; for instance it does not handle command |
| substitutions. Using @code{@@SHELL@@} means that your makefile will |
| benefit from the same improved shell, such as @command{bash} or |
| @command{ksh}, that was discovered during @command{configure}, so that |
| you aren't fighting two different sets of shell bugs between the two |
| contexts. |
| |
| Do not rely on whether @command{make}'s @code{SHELL} settings are |
| exported to subprocesses, as implementations differ: |
| |
| @example |
| $ @kbd{cat Makefile} |
| all: |
| @@printf '%s\n' '$(SHELL)' |
| @@printenv SHELL |
| $ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # BSD make, AIX make |
| /bin/ksh |
| /bin/ksh |
| $ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # GNU make |
| /bin/ksh |
| sh |
| @end example |
| |
| @node Parallel Make |
| @section Parallel Make |
| @cindex Parallel @command{make} |
| |
| Support for parallel execution in @command{make} implementation varies. |
| Generally, using GNU make is your best bet. |
| |
| When NetBSD or FreeBSD @command{make} are run in parallel mode, they will |
| reuse the same shell for multiple commands within one recipe. This can |
| have various unexpected consequences. For example, changes of directories |
| or variables persist between recipes, so that: |
| |
| @example |
| all: |
| @@var=value; cd /; pwd; echo $$var; echo $$$$ |
| @@pwd; echo $$var; echo $$$$ |
| @end example |
| |
| @noindent |
| may output the following with @code{make -j1}, at least on NetBSD up to |
| 5.1 and FreeBSD up to 8.2: |
| |
| @example |
| / |
| value |
| 32235 |
| / |
| value |
| 32235 |
| @end example |
| |
| @noindent |
| while without @option{-j1}, or with @option{-B}, the output looks less |
| surprising: |
| |
| @example |
| / |
| value |
| 32238 |
| /tmp |
| |
| 32239 |
| @end example |
| |
| @noindent |
| Another consequence is that, if one command in a recipe uses @code{exit 0} |
| to indicate a successful exit, the shell will be gone and the remaining |
| commands of this recipe will not be executed. |
| |
| The BSD @command{make} implementations, when run in parallel mode, |
| will also pass the @command{Makefile} recipes to the shell through |
| its standard input, thus making it unusable from the recipes: |
| |
| @example |
| $ @kbd{cat Makefile} |
| read: |
| @@read line; echo LINE: $$line |
| @c $$ @c restore font-lock |
| $ @kbd{echo foo | make read} |
| LINE: foo |
| $ @kbd{echo foo | make -j1 read} # NetBSD 5.1 and FreeBSD 8.2 |
| LINE: |
| @end example |
| |
| @noindent |
| Moreover, when FreeBSD @command{make} (up at least to 8.2) is run in |
| parallel mode, it implements the @code{@@} and @code{-} ``recipe |
| modifiers'' by dynamically modifying the active shell flags. This |
| behavior has the effects of potentially clobbering the exit status |
| of recipes silenced with the @code{@@} modifier if they also unset |
| the @option{errexit} shell flag, and of mangling the output in |
| unexpected ways: |
| |
| @example |
| $ @kbd{cat Makefile} |
| a: |
| @@echo $$-; set +e; false |
| b: |
| -echo $$-; false; echo set - |
| $ @kbd{make a; echo status: $?} |
| ehBc |
| *** Error code 1 |
| status: 1 |
| $ @kbd{make -j1 a; echo status: $?} |
| ehB |
| status: 0 |
| $ @kbd{make b} |
| echo $-; echo set - |
| hBc |
| set - |
| $ @kbd{make -j1 b} |
| echo $-; echo hvB |
| @end example |
| |
| @noindent |
| You can avoid all these issues by using the @option{-B} option to enable |
| compatibility semantics. However, that will effectively also disable |
| all parallelism as that will cause prerequisites to be updated in the |
| order they are listed in a rule. |
| |
| Some make implementations (among them, FreeBSD @command{make}, NetBSD |
| @command{make}, and Solaris @command{dmake}), when invoked with a |
| @option{-j@var{N}} option, connect the standard output and standard |
| error of all their child processes to pipes or temporary regular |
| files. This can lead to subtly different semantics in the behavior |
| of the spawned processes. For example, even if the @command{make} |
| standard output is connected to a tty, the recipe command will not be: |
| |
| @example |
| $ @kbd{cat Makefile} |
| all: |
| @@test -t 1 && echo "Is a tty" || echo "Is not a tty" |
| $ @kbd{make -j 2} # FreeBSD 8.2 make |
| Is not a tty |
| $ @kbd{make -j 2} # NetBSD 5.1 make |
| --- all --- |
| Is not a tty |
| $ @kbd{dmake -j 2} # Solaris 10 dmake |
| @var{hostname} --> 1 job |
| @var{hostname} --> Job output |
| Is not a tty |
| @end example |
| |
| @noindent |
| On the other hand: |
| |
| @example |
| $ @kbd{make -j 2} # GNU make, Heirloom make |
| Is a tty |
| @end example |
| |
| @noindent |
| The above examples also show additional status output produced in parallel |
| mode for targets being updated by Solaris @command{dmake} and NetBSD |
| @command{make} (but @emph{not} by FreeBSD @command{make}). |
| |
| Furthermore, parallel runs of those @command{make} implementations will |
| route standard error from commands that they spawn into their own |
| standard output, and may remove leading whitespace from output lines. |
| |
| |
| @node Comments in Make Rules |
| @section Comments in Make Rules |
| @cindex Comments in @file{Makefile} rules |
| @cindex @file{Makefile} rules and comments |
| |
| Do not try to put comments (lines beginning with @samp{#}) in a rule, as |
| they end the rule. It is OK for a rule line to start with a tab |
| followed by @samp{#}, as a comment passed to a shell that does nothing. |
| |
| To use the @samp{#} character in a command, put it in a rule not a |
| macro, as the character cannot portably appear in macros |
| (@pxref{Comments in Make Macros}). So for example, assuming the output |
| variable @code{COMMENT_CHAR} stands for @samp{#}, the following replaces |
| @samp{@@COMMENT_CHAR@@} by @samp{#} in a generated header: |
| |
| @example |
| foo.h: foo.h.in |
| sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \ |
| '$(srcdir)/foo.h.in' > $@@ |
| @end example |
| |
| The funny shell quoting avoids a substitution at @command{config.status} |
| run time of the left-hand side of the @command{sed} @samp{s} command. |
| |
| @node Newlines in Make Rules |
| @section Newlines in Make Rules |
| @cindex Newlines in @file{Makefile} rules |
| @cindex @file{Makefile} rules and newlines |
| |
| In shell scripts, newlines can be used inside string literals. But in |
| the shell statements of @file{Makefile} rules, this is not possible: |
| a newline not preceded by a backslash separates commands, whereas a |
| newline preceded by a backslash becomes part of the shell statement. |
| So, how can a newline be used in a string literal? |
| |
| The trick is to set up a shell variable @code{nl} that contains a newline. |
| For example, the following uses a multi-line @samp{sed} expression that |
| appends an empty line after every line of a file: |
| |
| @example |
| output: input |
| eval "$$(printf 'nl="\n"\n')"; \ |
| sed "a\\$$nl" input >$@@ |
| @end example |
| |
| @node Comments in Make Macros |
| @section Comments in Make Macros |
| @cindex Comments in @file{Makefile} macros |
| @cindex @file{Makefile} macros and comments |
| |
| In macro definitions, text from @samp{#} until line end is ignored, |
| which has the unfortunate effect of disallowing @samp{#} even in quotes. |
| Thus, the following does not work: |
| |
| @example |
| CPPFLAGS = "-DCOMMENT_CHAR='#'" |
| @end example |
| |
| @noindent |
| as @samp{CPPFLAGS} is expanded to @samp{"-DCOMMENT_CHAR='}. |
| |
| GNU @command{make}, when not in POSIX mode, lets you put |
| @samp{#} into a macro value by escaping it with a backslash, i.e., |
| @samp{\#}. However, this usage is not portable. |
| @xref{Comments in Make Rules}, for a portable alternative. |
| |
| Even without quoting involved, comments can have surprising effects, |
| because the whitespace before them is part of the variable value: |
| |
| @example |
| foo = bar # trailing comment |
| print: ; @@echo "$(foo)." |
| @end example |
| |
| @noindent |
| prints @samp{bar .}, which is usually not intended, and can expose |
| @command{make} bugs as described below. |
| |
| @node Trailing whitespace in Make Macros |
| @section Trailing whitespace in Make Macros |
| @cindex whitespace in @file{Makefile} macros |
| @cindex @file{Makefile} macros and whitespace |
| |
| GNU @command{make} 3.80 mistreats trailing whitespace in macro |
| substitutions and appends another spurious suffix: |
| |
| @example |
| empty = |
| foo = bar $(empty) |
| print: ; @@echo $(foo:=.test) |
| @end example |
| |
| @noindent |
| prints @samp{bar.test .test}. |
| |
| BSD and Solaris @command{make} implementations do not honor trailing |
| whitespace in macro definitions as POSIX requires: |
| |
| @example |
| foo = bar # Note the space after "bar". |
| print: ; @@echo $(foo)t |
| @end example |
| |
| @noindent |
| prints @samp{bart} instead of @samp{bar t}. To work around this, you |
| can use a helper macro as in the previous example. |
| |
| |
| @node Command-line Macros and whitespace |
| @section Command-line Macros and whitespace |
| @cindex whitespace in command-line macros |
| @cindex command-line, macros set on |
| @cindex environment, macros set from |
| |
| Some @command{make} implementations may strip trailing whitespace off |
| of macros set on the command line in addition to leading whitespace. |
| Further, some may strip leading whitespace off of macros set from |
| environment variables: |
| |
| @example |
| $ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' | |
| foo=' f f ' make -f - bar=' b b '} |
| x f f xb b x # AIX, BSD, GNU make |
| xf f xb b x # HP-UX |
| x f f xb bx # Solaris make |
| @end example |
| |
| |
| @node obj/ and Make |
| @section The @file{obj/} Subdirectory and Make |
| @cindex @file{obj/}, subdirectory |
| @cindex BSD @command{make} and @file{obj/} |
| |
| Never name one of your subdirectories @file{obj/} if you don't like |
| surprises. |
| |
| If an @file{obj/} directory exists, BSD @command{make} enters it |
| before reading the makefile. Hence the makefile in the |
| current directory is not read. |
| |
| @example |
| $ @kbd{cat Makefile} |
| all: |
| echo Hello |
| $ @kbd{cat obj/Makefile} |
| all: |
| echo World |
| $ @kbd{make} # GNU make |
| echo Hello |
| Hello |
| $ @kbd{pmake} # BSD make |
| echo World |
| World |
| @end example |
| |
| @node make -k Status |
| @section Exit Status of @code{make -k} |
| @cindex @code{make -k} |
| |
| Do not rely on the exit status of @code{make -k}. Some implementations |
| reflect whether they encountered an error in their exit status; other |
| implementations always succeed. |
| |
| @example |
| $ @kbd{cat Makefile} |
| all: |
| false |
| $ @kbd{make -k; echo exit status: $?} # GNU make |
| false |
| make: *** [all] Error 1 |
| exit status: 2 |
| $ @kbd{pmake -k; echo exit status: $?} # BSD make |
| false |
| *** Error code 1 (continuing) |
| exit status: 0 |
| @end example |
| |
| @node VPATH and Make |
| @section @code{VPATH} and Make |
| @cindex @code{VPATH} |
| |
| POSIX does not specify the semantics of @code{VPATH}. Typically, |
| @command{make} supports @code{VPATH}, but its implementation is not |
| consistent. |
| |
| Autoconf and Automake support makefiles whose usages of @code{VPATH} are |
| portable to recent-enough popular implementations of @command{make}, but |
| to keep the resulting makefiles portable, a package's makefile |
| prototypes must take the following issues into account. These issues |
| are complicated and are often poorly understood, and installers who use |
| @code{VPATH} should expect to find many bugs in this area. If you use |
| @code{VPATH}, the simplest way to avoid these portability bugs is to |
| stick with GNU @command{make}, since it is the most |
| commonly-used @command{make} among Autoconf users. |
| |
| Here are some known issues with some @code{VPATH} |
| implementations. |
| |
| @menu |
| * Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts |
| * VPATH and Double-colon:: Problems with @samp{::} on ancient hosts |
| * $< in Explicit Rules:: @code{$<} does not work in ordinary rules |
| * Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris |
| * Make Target Lookup:: More details about @code{VPATH} lookup |
| @end menu |
| |
| @node Variables listed in VPATH |
| @subsection Variables listed in @code{VPATH} |
| @cindex @code{VPATH} and variables |
| @cindex variables and @code{VPATH} |
| |
| Do not set @code{VPATH} to the value of another variable, for example |
| @samp{VPATH = $(srcdir)}, because some ancient versions of |
| @command{make} do not do variable substitutions on the value of |
| @code{VPATH}. For example, use this |
| |
| @example |
| srcdir = @@srcdir@@ |
| VPATH = @@srcdir@@ |
| @end example |
| |
| @noindent |
| rather than @samp{VPATH = $(srcdir)}. Note that with GNU |
| Automake, there is no need to set this yourself. |
| |
| @node VPATH and Double-colon |
| @subsection @code{VPATH} and Double-colon Rules |
| @cindex @code{VPATH} and double-colon rules |
| @cindex double-colon rules and @code{VPATH} |
| |
| With ancient versions of Sun @command{make}, |
| any assignment to @code{VPATH} causes @command{make} to execute only |
| the first set of double-colon rules. |
| However, this problem is no longer of practical concern. |
| |
| @node $< in Explicit Rules |
| @subsection @code{$<} Not Supported in Explicit Rules |
| @cindex explicit rules, @code{$<}, and @code{VPATH} |
| @cindex @code{$<}, explicit rules, and @code{VPATH} |
| @cindex @code{VPATH}, explicit rules, and @code{$<} |
| |
| Using @code{$<} in explicit rules is not portable. |
| The prerequisite file must be named explicitly in the rule. If you want |
| to find the prerequisite via a @code{VPATH} search, you have to code the |
| whole thing manually. @xref{Build Directories}. |
| |
| @node Automatic Rule Rewriting |
| @subsection Automatic Rule Rewriting |
| @cindex @code{VPATH} and automatic rule rewriting |
| @cindex automatic rule rewriting and @code{VPATH} |
| |
| Some @command{make} implementations, such as Solaris, |
| search for prerequisites in @code{VPATH} and |
| then rewrite each occurrence as a plain word in the rule. |
| For instance: |
| |
| @example |
| # This isn't portable to GNU make. |
| VPATH = ../pkg/src |
| f.c: if.c |
| cp if.c f.c |
| @end example |
| |
| @noindent |
| executes @code{cp ../pkg/src/if.c f.c} if @file{if.c} is |
| found in @file{../pkg/src}. |
| |
| However, this rule leads to real problems in practice. For example, if |
| the source directory contains an ordinary file named @file{test} that is |
| used in a dependency, Solaris @command{make} rewrites commands like |
| @samp{if test -r foo; @dots{}} to @samp{if ../pkg/src/test -r foo; |
| @dots{}}, which is typically undesirable. In fact, @command{make} is |
| completely unaware of shell syntax used in the rules, so the VPATH |
| rewrite can potentially apply to @emph{any} whitespace-separated word |
| in a rule, including shell variables, functions, and keywords. |
| |
| @example |
| $ @kbd{mkdir build} |
| $ @kbd{cd build} |
| $ @kbd{cat > Makefile <<'END'} |
| VPATH = .. |
| all: arg func for echo |
| func () @{ for arg in "$$@@"; do echo $$arg; done; @}; \ |
| func "hello world" |
| END |
| $ @kbd{touch ../arg ../func ../for ../echo} |
| $ @kbd{make} |
| ../func () @{ ../for ../arg in "$@@"; do ../echo $arg; done; @}; \ |
| ../func "hello world" |
| sh: syntax error at line 1: `do' unexpected |
| *** Error code 2 |
| @end example |
| |
| @noindent |
| To avoid this problem, portable makefiles should never mention a source |
| file or dependency whose name is that of a shell keyword like @file{for} |
| or @file{until}, a shell command like @command{cat} or @command{gcc} or |
| @command{test}, or a shell function or variable used in the corresponding |
| @command{Makefile} recipe. |
| |
| Because of these problems GNU @command{make} and many other @command{make} |
| implementations do not rewrite commands, so portable makefiles should |
| search @code{VPATH} manually. It is tempting to write this: |
| |
| @smallexample |
| # This isn't portable to Solaris make. |
| VPATH = ../pkg/src |
| f.c: if.c |
| cp `test -f if.c || echo $(VPATH)/`if.c f.c |
| @end smallexample |
| |
| @noindent |
| However, the ``prerequisite rewriting'' still applies here. So if |
| @file{if.c} is in @file{../pkg/src}, Solaris @command{make} |
| executes |
| |
| @smallexample |
| cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c |
| @end smallexample |
| |
| @noindent |
| which reduces to |
| |
| @example |
| cp if.c f.c |
| @end example |
| |
| @noindent |
| and thus fails. Oops. |
| |
| A simple workaround, and good practice anyway, is to use @samp{$?} and |
| @samp{$@@} when possible: |
| |
| @smallexample |
| VPATH = ../pkg/src |
| f.c: if.c |
| cp $? $@@ |
| @end smallexample |
| |
| @noindent |
| but this does not generalize well to commands with multiple |
| prerequisites. A more general workaround is to rewrite the rule so that |
| the prerequisite @file{if.c} never appears as a plain word. For |
| example, these three rules would be safe, assuming @file{if.c} is in |
| @file{../pkg/src} and the other files are in the working directory: |
| |
| @smallexample |
| VPATH = ../pkg/src |
| f.c: if.c f1.c |
| cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@@ |
| g.c: if.c g1.c |
| cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@@ |
| h.c: if.c h1.c |
| cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@@ |
| @end smallexample |
| |
| Things get worse when your prerequisites are in a macro. |
| |
| @example |
| VPATH = ../pkg/src |
| HEADERS = f.h g.h h.h |
| install-HEADERS: $(HEADERS) |
| for i in $(HEADERS); do \ |
| $(INSTALL) -m 644 \ |
| `test -f $$i || echo $(VPATH)/`$$i \ |
| $(DESTDIR)$(includedir)/$$i; \ |
| @c $$ restore font-lock |
| done |
| @end example |
| |
| The above @code{install-HEADERS} rule is not Solaris-proof because @code{for |
| i in $(HEADERS);} is expanded to @code{for i in f.h g.h h.h;} |
| where @code{f.h} and @code{g.h} are plain words and are hence |
| subject to @code{VPATH} adjustments. |
| |
| If the three files are in @file{../pkg/src}, the rule is run as: |
| |
| @example |
| for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \ |
| install -m 644 \ |
| `test -f $i || echo ../pkg/src/`$i \ |
| /usr/local/include/$i; \ |
| done |
| @end example |
| |
| where the two first @command{install} calls fail. For instance, |
| consider the @code{f.h} installation: |
| |
| @example |
| install -m 644 \ |
| `test -f ../pkg/src/f.h || \ |
| echo ../pkg/src/ \ |
| `../pkg/src/f.h \ |
| /usr/local/include/../pkg/src/f.h; |
| @end example |
| |
| @noindent |
| It reduces to: |
| |
| @example |
| install -m 644 \ |
| ../pkg/src/f.h \ |
| /usr/local/include/../pkg/src/f.h; |
| @end example |
| |
| Note that the manual @code{VPATH} search did not cause any problems here; |
| however this command installs @file{f.h} in an incorrect directory. |
| |
| Trying to quote @code{$(HEADERS)} in some way, as we did for |
| @code{foo.c} a few makefiles ago, does not help: |
| |
| @example |
| install-HEADERS: $(HEADERS) |
| headers='$(HEADERS)'; \ |
| for i in $$headers; do \ |
| $(INSTALL) -m 644 \ |
| `test -f $$i || echo $(VPATH)/`$$i \ |
| $(DESTDIR)$(includedir)/$$i; \ |
| done |
| @end example |
| |
| Now, @code{headers='$(HEADERS)'} macro-expands to: |
| |
| @example |
| headers='f.h g.h h.h' |
| @end example |
| |
| @noindent |
| but @code{g.h} is still a plain word. (As an aside, the idiom |
| @code{headers='$(HEADERS)'; for i in $$headers;} is a good |
| idea if @code{$(HEADERS)} can be empty, because some shells diagnose a |
| syntax error on @code{for i in;}.) |
| |
| One workaround is to strip this unwanted @file{../pkg/src/} prefix manually: |
| |
| @example |
| VPATH = ../pkg/src |
| HEADERS = f.h g.h h.h |
| install-HEADERS: $(HEADERS) |
| headers='$(HEADERS)'; \ |
| for i in $$headers; do \ |
| i=`expr "$$i" : '$(VPATH)/\(.*\)'`; |
| $(INSTALL) -m 644 \ |
| `test -f $$i || echo $(VPATH)/`$$i \ |
| $(DESTDIR)$(includedir)/$$i; \ |
| @c $$ restore font-lock |
| done |
| @end example |
| |
| @noindent |
| Automake does something similar. |
| |
| @node Make Target Lookup |
| @subsection Make Target Lookup |
| @cindex @code{VPATH}, resolving target pathnames |
| |
| GNU @command{make} uses a complex algorithm to decide when it |
| should use files found via a @code{VPATH} search. @xref{Search |
| Algorithm, , How Directory Searches are Performed, make, The GNU Make |
| Manual}. |
| |
| If a target needs to be rebuilt, GNU @command{make} discards the |
| file name found during the @code{VPATH} search for this target, and |
| builds the file locally using the file name given in the makefile. |
| If a target does not need to be rebuilt, GNU @command{make} uses the |
| file name found during the @code{VPATH} search. |
| |
| Other @command{make} implementations, like NetBSD @command{make}, are |
| easier to describe: the file name found during the @code{VPATH} search |
| is used whether the target needs to be rebuilt or not. Therefore |
| new files are created locally, but existing files are updated at their |
| @code{VPATH} location. |
| |
| OpenBSD and FreeBSD @command{make}, however, |
| never perform a |
| @code{VPATH} search for a dependency that has an explicit rule. |
| This is extremely annoying. |
| |
| When attempting a @code{VPATH} build for an autoconfiscated package |
| (e.g., @code{mkdir build && cd build && ../configure}), this means |
| GNU |
| @command{make} builds everything locally in the @file{build} |
| directory, while BSD @command{make} builds new files locally and |
| updates existing files in the source directory. |
| |
| @example |
| $ @kbd{cat Makefile} |
| VPATH = .. |
| all: foo.x bar.x |
| foo.x bar.x: newer.x |
| @@echo Building $@@ |
| $ @kbd{touch ../bar.x} |
| $ @kbd{touch ../newer.x} |
| $ @kbd{make} # GNU make |
| Building foo.x |
| Building bar.x |
| $ @kbd{pmake} # NetBSD make |
| Building foo.x |
| Building ../bar.x |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make |
| Building foo.x |
| Building bar.x |
| $ @kbd{make} # GNU make |
| Building foo.x |
| $ @kbd{pmake} # NetBSD make |
| Building foo.x |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make |
| Building foo.x |
| Building bar.x |
| @end example |
| |
| Note how NetBSD @command{make} updates @file{../bar.x} in its |
| VPATH location, and how FreeBSD and OpenBSD |
| @command{make} always |
| update @file{bar.x}, even when @file{../bar.x} is up to date. |
| |
| Another point worth mentioning is that once GNU @command{make} has |
| decided to ignore a @code{VPATH} file name (e.g., it ignored |
| @file{../bar.x} in the above example) it continues to ignore it when |
| the target occurs as a prerequisite of another rule. |
| |
| The following example shows that GNU @command{make} does not look up |
| @file{bar.x} in @code{VPATH} before performing the @code{.x.y} rule, |
| because it ignored the @code{VPATH} result of @file{bar.x} while running |
| the @code{bar.x: newer.x} rule. |
| |
| @example |
| $ @kbd{cat Makefile} |
| VPATH = .. |
| all: bar.y |
| bar.x: newer.x |
| @@echo Building $@@ |
| .SUFFIXES: .x .y |
| .x.y: |
| cp $< $@@ |
| $ @kbd{touch ../bar.x} |
| $ @kbd{touch ../newer.x} |
| $ @kbd{make} # GNU make |
| Building bar.x |
| cp bar.x bar.y |
| cp: cannot stat 'bar.x': No such file or directory |
| make: *** [bar.y] Error 1 |
| $ @kbd{pmake} # NetBSD make |
| Building ../bar.x |
| cp ../bar.x bar.y |
| $ @kbd{rm bar.y} |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make |
| echo Building bar.x |
| cp bar.x bar.y |
| cp: cannot stat 'bar.x': No such file or directory |
| *** Error code 1 |
| @end example |
| |
| Note that if you drop away the command from the @code{bar.x: newer.x} |
| rule, GNU @command{make} magically starts to work: it |
| knows that @code{bar.x} hasn't been updated, therefore it doesn't |
| discard the result from @code{VPATH} (@file{../bar.x}) in succeeding |
| uses. FreeBSD and OpenBSD still don't work, though. |
| |
| @example |
| $ @kbd{cat Makefile} |
| VPATH = .. |
| all: bar.y |
| bar.x: newer.x |
| .SUFFIXES: .x .y |
| .x.y: |
| cp $< $@@ |
| $ @kbd{touch ../bar.x} |
| $ @kbd{touch ../newer.x} |
| $ @kbd{make} # GNU make |
| cp ../bar.x bar.y |
| $ @kbd{rm bar.y} |
| $ @kbd{pmake} # NetBSD make |
| cp ../bar.x bar.y |
| $ @kbd{rm bar.y} |
| $ @kbd{fmake} # FreeBSD make, OpenBSD make |
| cp bar.x bar.y |
| cp: cannot stat 'bar.x': No such file or directory |
| *** Error code 1 |
| @end example |
| |
| It seems the sole solution that would please every @command{make} |
| implementation is to never rely on @code{VPATH} searches for targets. |
| In other words, @code{VPATH} should be reserved to sources that are not built. |
| |
| |
| @node Single Suffix Rules |
| @section Single Suffix Rules and Separated Dependencies |
| @cindex Single Suffix Inference Rule |
| @cindex Rule, Single Suffix Inference |
| A @dfn{Single Suffix Rule} is basically a usual suffix (inference) rule |
| (@samp{.from.to:}), but which @emph{destination} suffix is empty |
| (@samp{.from:}). |
| |
| @cindex Separated Dependencies |
| @dfn{Separated dependencies} simply refers to listing the prerequisite |
| of a target, without defining a rule. Usually one can list on the one |
| hand side, the rules, and on the other hand side, the dependencies. |
| |
| Solaris @command{make} does not support separated dependencies for |
| targets defined by single suffix rules: |
| |
| @example |
| $ @kbd{cat Makefile} |
| .SUFFIXES: .in |
| foo: foo.in |
| .in: |
| cp $< $@@ |
| $ @kbd{touch foo.in} |
| $ @kbd{make} |
| $ @kbd{ls} |
| Makefile foo.in |
| @end example |
| |
| @noindent |
| while GNU Make does: |
| |
| @example |
| $ @kbd{gmake} |
| cp foo.in foo |
| $ @kbd{ls} |
| Makefile foo foo.in |
| @end example |
| |
| Note it works without the @samp{foo: foo.in} dependency. |
| |
| @example |
| $ @kbd{cat Makefile} |
| .SUFFIXES: .in |
| .in: |
| cp $< $@@ |
| $ @kbd{make foo} |
| cp foo.in foo |
| @end example |
| |
| @noindent |
| and it works with double suffix inference rules: |
| |
| @example |
| $ @kbd{cat Makefile} |
| foo.out: foo.in |
| .SUFFIXES: .in .out |
| .in.out: |
| cp $< $@@ |
| $ @kbd{make} |
| cp foo.in foo.out |
| @end example |
| |
| As a result, in such a case, you have to write target rules. |
| |
| @node Timestamps and Make |
| @section Timestamp Resolution and Make |
| @cindex timestamp resolution |
| Traditionally, file timestamps had 1-second resolution, and |
| @command{make} used those timestamps to determine whether one file was |
| newer than the other. However, many modern file systems have |
| timestamps with 1-nanosecond resolution. Some @command{make} |
| implementations look at the entire timestamp; others ignore the |
| fractional part, which can lead to incorrect results. Normally this |
| is not a problem, but in some extreme cases you may need to use tricks |
| like @samp{sleep 1} to work around timestamp truncation bugs. |
| |
| Traditionally, commands like @samp{cp -p} and @samp{touch -r} did not copy |
| file timestamps to their full resolutions (@pxref{touch, , Limitations of Usual |
| Tools}). Hence you should be wary of rules like this: |
| |
| @example |
| dest: src |
| cp -p src dest |
| @end example |
| |
| as @file{dest} often appears to be older than @file{src} after the |
| timestamp is truncated, and this can cause @command{make} to do |
| needless rework the next time it is invoked. To work around this |
| problem, you can use a timestamp file, e.g.: |
| |
| @example |
| dest-stamp: src |
| cp -p src dest |
| echo >dest-stamp |
| @end example |
| |
| Apart from timestamp resolution, there are also differences in handling |
| equal timestamps. Although POSIX suggests that @command{make} update a |
| target with the same timestamp as its newest prerequisite, only |
| HP-UX @command{make} is known to do so; GNU and other @command{make} |
| implementations do not update, a behavior that POSIX also allows. |
| |
| The HP-UX behavior can cause spurious rebuilds |
| and this in turn can cause @command{make} to fail if it tries to rebuild |
| generated files in a possibly read-only source tree with tools not |
| present on the build machine. Conversely, if a source file is updated |
| immediately after running @command{make} in a file system with |
| low-resolution timestamps, the GNU behavior can cause a later |
| @command{make} to neglect rebuilds and quietly generate incorrect results. |
| To avoid both these problems, use GNU @command{make} on a platform |
| with high-resolution timestamps. |
| |
| |
| @c ======================================== Portable C and C++ Programming |
| |
| @node Portable C and C++ |
| @chapter Portable C and C++ Programming |
| @cindex Portable C and C++ programming |
| |
| C and C++ programs often use low-level features of the underlying |
| system, and therefore are often more difficult to make portable to other |
| platforms. |
| |
| Several standards have been developed to help make your programs more |
| portable. If you write programs with these standards in mind, you can |
| have greater confidence that your programs work on a wide variety |
| of systems. |
| @ifhtml |
| @uref{https://@/gcc.gnu.org/@/onlinedocs/@/gcc/@/Standards.html, Language |
| Standards Supported by GCC} |
| @end ifhtml |
| @ifnothtml |
| @xref{Standards, , Language Standards Supported by |
| GCC, gcc, Using the GNU Compiler Collection |
| (GCC)}, |
| @end ifnothtml |
| for a list of C-related standards. Many programs also assume the |
| @uref{https://@/en.wikipedia.org/@/wiki/@/POSIX, POSIX standard}. |
| |
| @cindex K&R C |
| @cindex C89, C99, C11, C17, and C23 |
| The first widely used C variant was K&R C, which predates any C |
| standard. K&R C compilers are no longer of practical interest, though, |
| and Autoconf assumes at least C89, the first C standard, |
| which is sometimes called ``C90'' due to a delay in standardization. |
| C has since gone through the standards C99, C11, C17, and C23, and |
| Autoconf is compatible with all these standards. |
| |
| Program portability is a huge topic, and this section can only briefly |
| introduce common pitfalls. @xref{System Portability, , Portability |
| between System Types, standards, The GNU Coding Standards}, for |
| more information. |
| |
| @menu |
| * Varieties of Unportability:: How to make your programs unportable |
| * Integer Overflow:: When integers get too large |
| * Preprocessor Arithmetic:: @code{#if} expression problems |
| * Null Pointers:: Properties of null pointers |
| * Buffer Overruns:: Subscript errors and the like |
| * Volatile Objects:: @code{volatile} and signals |
| * Floating Point Portability:: Portable floating-point arithmetic |
| * Exiting Portably:: Exiting and the exit status |
| @end menu |
| |
| @node Varieties of Unportability |
| @section Varieties of Unportability |
| @cindex portability |
| |
| Autoconf tests and ordinary programs often need to test what is allowed |
| on a system, and therefore they may need to deliberately exceed the |
| boundaries of what the standards allow, if only to see whether an |
| optional feature is present. When you write such a program, you should |
| keep in mind the difference between constraints, unspecified behavior, |
| and undefined behavior. |
| |
| In C, a @dfn{constraint} is a rule that the compiler must enforce. An |
| example constraint is that C programs must not declare a bit-field with |
| negative width. Tests can therefore reliably assume that programs with |
| negative-width bit-fields are rejected by a compiler that conforms |
| to the standard. |
| |
| @dfn{Unspecified behavior} is valid behavior, where the standard allows |
| multiple possibilities. For example, the order of evaluation of |
| function arguments is unspecified. Some unspecified behavior is |
| @dfn{implementation-defined}, i.e., documented by the implementation, |
| but since Autoconf tests cannot read the documentation they cannot |
| distinguish between implementation-defined and other unspecified |
| behavior. It is common for Autoconf tests to probe implementations to |
| determine otherwise-unspecified behavior. |
| |
| @dfn{Undefined behavior} is invalid behavior, where the standard allows |
| the implementation to do anything it pleases. For example, |
| dereferencing a null pointer leads to undefined behavior. If possible, |
| test programs should avoid undefined behavior, since a program with |
| undefined behavior might succeed on a test that should fail. |
| |
| The above rules apply to programs that are intended to conform to the |
| standard. However, strictly-conforming programs are quite rare, since |
| the standards are so limiting. A major goal of Autoconf is to support |
| programs that use implementation features not described by the standard, |
| and it is fairly common for test programs to violate the above rules, if |
| the programs work well enough in practice. |
| |
| @node Integer Overflow |
| @section Integer Overflow |
| @cindex integer overflow |
| @cindex overflow, signed integer |
| @cindex signed integer overflow |
| @cindex wraparound arithmetic |
| |
| Although some traditional C programs assume that signed integer overflow |
| wraps around reliably using two's complement arithmetic, the C standard |
| says that program behavior is undefined on overflow, and these C |
| programs may not work on many modern implementations. |
| |
| @menu |
| * Integer Overflow Basics:: Why integer overflow is a problem |
| * Signed Overflow Examples:: Examples of code assuming wraparound |
| * Optimization and Wraparound:: Optimizations that break uses of wraparound |
| * Signed Overflow Advice:: Practical advice for signed overflow issues |
| * Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} |
| @end menu |
| |
| @node Integer Overflow Basics |
| @subsection Basics of Integer Overflow |
| @cindex integer overflow |
| @cindex overflow, signed integer |
| @cindex signed integer overflow |
| @cindex wraparound arithmetic |
| |
| In languages like C, integer overflow wraps around for unsigned |
| integer types that are at least as wide as @code{unsigned int}; |
| e.g., @code{UINT_MAX + 1} yields zero. |
| This is guaranteed by the C standard and is |
| portable in practice, unless you specify aggressive, |
| nonstandard optimization options |
| suitable only for special applications. |
| |
| In contrast, the C standard says that signed integer overflow leads to |
| undefined behavior where a program can do anything, including dumping |
| core or overrunning a buffer. The misbehavior can even precede the |
| overflow. Such an overflow can occur during addition, subtraction, |
| multiplication, division, and left shift. It can even occur for |
| unsigned types like @code{unsigned short int} that are narrower |
| than @code{int}, as values of these types are widened to @code{int} |
| before computation. |
| |
| Despite this requirement of the standard, some C programs assume that |
| signed integer overflow silently wraps around modulo a power of two, |
| using two's complement arithmetic, so long as you convert the resulting |
| value to a signed integer type. These programs can have problems, |
| especially when optimization is enabled. If you assume a GCC-like |
| compiler, you can work around the problems by compiling with GCC's |
| @code{-fwrapv} option; however, this is not portable. |
| |
| For historical reasons C17 and earlier also allowed implementations with |
| ones' complement or signed magnitude arithmetic, but C23 requires |
| two's complement and it is safe to assume two's complement nowadays. |
| |
| Also, overflow can occur when converting an out-of-range value to a |
| signed integer type. Here a standard implementation must define what |
| happens, and this can include raising an exception. Although practical |
| implementations typically wrap around silently in this case, a few |
| debugging implementations trap instead. |
| |
| @node Signed Overflow Examples |
| @subsection Examples of Code Assuming Wraparound Overflow |
| @cindex integer overflow |
| @cindex overflow, signed integer |
| @cindex signed integer overflow |
| @cindex wraparound arithmetic |
| |
| There was long a tension between what the C standard requires for signed |
| integer overflow, and what traditional C programs commonly assumed. The |
| standard allows aggressive optimizations based on assumptions that |
| overflow never occurs, but traditionally many C programs relied on overflow |
| wrapping around. Although these programs did not conform to the standard, |
| they formerly worked in practice because traditionally compilers did not |
| optimize in such a way that would break the programs. Nowadays, though, |
| compilers do perform these optimizations, so portable programs can no |
| longer assume reliable wraparound on signed integer overflow. |
| |
| The C Standard says that if a program has signed integer overflow its |
| behavior is undefined, and the undefined behavior can even precede the |
| overflow. To take an extreme example: |
| |
| @c Inspired by Robert Dewar's example in |
| @c <https://gcc.gnu.org/ml/gcc/2007-01/msg00038.html> (2007-01-01). |
| @example |
| if (password == expected_password) |
| allow_superuser_privileges (); |
| else if (counter++ == INT_MAX) |
| abort (); |
| else |
| printf ("%d password mismatches\n", counter); |
| @end example |
| |
| @noindent |
| If the @code{int} variable @code{counter} equals @code{INT_MAX}, |
| @code{counter++} must overflow and the behavior is undefined, so the C |
| standard allows the compiler to optimize away the test against |
| @code{INT_MAX} and the @code{abort} call. |
| Worse, if an earlier bug in the program lets the compiler deduce that |
| @code{counter == INT_MAX} or that @code{counter} previously overflowed, |
| the C standard allows the compiler to optimize away the password test |
| and generate code that allows superuser privileges unconditionally. |
| |
| Here is an example derived from the 7th Edition Unix implementation of |
| @code{atoi} (1979-01-10): |
| |
| @example |
| char *p; |
| int f, n; |
| @dots{} |
| while (*p >= '0' && *p <= '9') |
| n = n * 10 + *p++ - '0'; |
| return (f ? -n : n); |
| @end example |
| |
| @noindent |
| Even if the input string is in range, on most modern machines this has |
| signed overflow when computing the most negative integer (the @code{-n} |
| overflows) or a value near an extreme integer (the @code{+} |
| overflows). |
| |
| Here is another example, derived from the 7th Edition implementation of |
| @code{rand} (1979-01-10). Here the programmer expects both |
| multiplication and addition to wrap on overflow: |
| |
| @example |
| static long int randx = 1; |
| @dots{} |
| randx = randx * 1103515245 + 12345; |
| return (randx >> 16) & 077777; |
| @end example |
| |
| In the following example, derived from the GNU C Library 2.15 |
| implementation of @code{mktime} (2012-03-21), the code assumes |
| wraparound arithmetic in @code{+} to detect signed overflow: |
| |
| @example |
| time_t t, t1, t2; |
| int sec_requested, sec_adjustment; |
| @dots{} |
| t1 = t + sec_requested; |
| t2 = t1 + sec_adjustment; |
| if (((t1 < t) != (sec_requested < 0)) |
| | ((t2 < t1) != (sec_adjustment < 0))) |
| return -1; |
| @end example |
| |
| Although some of these examples will likely behave as if signed integer |
| overflow wraps around reliably, other examples are likely to misbehave |
| when optimization is enabled. All these examples should be avoided in |
| portable code because signed integer overflow is not reliable on modern |
| systems, and it's not worth worrying about which of these examples |
| happen to work on most platforms and which do not. |
| |
| @node Optimization and Wraparound |
| @subsection Optimizations That Break Wraparound Arithmetic |
| @cindex loop induction |
| |
| Compilers sometimes generate code that is incompatible with wraparound |
| integer arithmetic. A simple example is an algebraic simplification: a |
| compiler might translate @code{(i * 2000) / 1000} to @code{i * 2} |
| because it assumes that @code{i * 2000} does not overflow. The |
| translation is not equivalent to the original when overflow occurs: |
| e.g., in the typical case of 32-bit signed two's complement wraparound |
| @code{int}, if @code{i} has type @code{int} and value @code{1073742}, |
| the original expression returns @minus{}2147483 but the optimized |
| version returns the mathematically correct value 2147484. |
| |
| More subtly, loop induction optimizations often exploit the undefined |
| behavior of signed overflow. Consider the following contrived function |
| @code{sumc}: |
| |
| @example |
| int |
| sumc (int lo, int hi) |
| @{ |
| int sum = 0; |
| for (int i = lo; i <= hi; i++) |
| sum ^= i * 53; |
| return sum; |
| @} |
| @end example |
| |
| @noindent |
| To avoid multiplying by 53 each time through the loop, an optimizing |
| compiler might internally transform @code{sumc} to the equivalent of the |
| following: |
| |
| @example |
| int |
| transformed_sumc (int lo, int hi) |
| @{ |
| int sum = 0; |
| int hic = hi * 53; |
| for (int ic = lo * 53; ic <= hic; ic += 53) |
| sum ^= ic; |
| return sum; |
| @} |
| @end example |
| |
| @noindent |
| This transformation is allowed by the C standard, but it is invalid for |
| wraparound arithmetic when @code{INT_MAX / 53 < hi}, because then the |
| overflow in computing expressions like @code{hi * 53} can cause the |
| expression @code{i <= hi} to yield a different value from the |
| transformed expression @code{ic <= hic}. |
| |
| For this reason, compilers that use loop induction and similar |
| techniques often do not support reliable wraparound arithmetic when a |
| loop induction variable like @code{ic} is involved. Since loop |
| induction variables are generated by the compiler, and are not visible |
| in the source code, it is not always trivial to say whether the problem |
| affects your code. |
| |
| Hardly any code actually depends on wraparound arithmetic in cases like |
| these, so in practice these loop induction optimizations are almost |
| always useful. However, edge cases in this area can cause problems. |
| For example: |
| |
| @example |
| for (int j = 1; 0 < j; j *= 2) |
| test (j); |
| @end example |
| |
| @noindent |
| Here, the loop attempts to iterate through all powers of 2 that |
| @code{int} can represent, but the C standard allows a compiler to |
| optimize away the comparison and generate an infinite loop, |
| under the argument that behavior is undefined on overflow. As of this |
| writing this optimization is done on some platforms by |
| GCC with @option{-O2}, so this code is not portable in practice. |
| |
| @node Signed Overflow Advice |
| @subsection Practical Advice for Signed Overflow Issues |
| @cindex integer overflow |
| @cindex overflow, signed integer |
| @cindex signed integer overflow |
| @cindex wraparound arithmetic |
| |
| Ideally the safest approach is to avoid signed integer overflow |
| entirely. For example, instead of multiplying two signed integers, you |
| can convert them to double-width integers, multiply the wider values, |
| then test whether the result is in the narrower range. Or you can use |
| more-complicated code employing unsigned integers of the same width. |
| |
| Rewriting code in this way will be inconvenient, though, especially if |
| the signed values might be negative and no wider type is available. |
| Using unsigned arithmetic to check for overflow is |
| particularly painful to do portably and efficiently when dealing with an |
| integer type like @code{uid_t} whose width and signedness vary from |
| platform to platform. Also, this approach may hurt performance. |
| |
| Hence it is often useful to maintain code that needs |
| wraparound on overflow, instead of rewriting the code. The rest of this |
| section attempts to give practical advice for this situation. |
| |
| To detect integer overflow portably when attempting operations like |
| @code{sum = a + b}, you can use the C23 @code{<stdckdint.h>} macros |
| @code{ckd_add}, @code{ckd_sub}, and @code{ckd_mul}. |
| The following code adds two integers with overflow wrapping around |
| reliably in the sum: |
| |
| @example |
| #include <stdckdint.h> |
| ... |
| /* Set sum = a + b, with wraparound. */ |
| if (ckd_add (&sum, a, b)) |
| /* 'sum' has just the low order bits. */; |
| else |
| /* 'sum' is the correct answer. */; |
| @end example |
| |
| To be portable to pre-C23 platforms you can use Gnulib's |
| @code{stdckdint} module, which emulates this part of C23 (@pxref{Gnulib}). |
| Invoking the @code{stdckdint} macros typically costs just one machine |
| instruction for the arithmetic and another instruction for the rare |
| branch on overflow. |
| |
| If your code uses a signed loop index, make sure that the index cannot |
| overflow, along with all signed expressions derived from the index. |
| Here is a contrived example of problematic code with two instances of |
| overflow. |
| |
| @example |
| for (int i = INT_MAX - 10; i <= INT_MAX; i++) |
| if (i + 1 < 0) |
| @{ |
| report_overflow (); |
| break; |
| @} |
| @end example |
| |
| @noindent |
| Because of the two overflows, a compiler might optimize away or |
| transform the two comparisons in a way that is incompatible with the |
| wraparound assumption. |
| |
| If your code is intended to be compiled only by GCC and |
| assumes wraparound behavior, and you want to insulate it |
| against any GCC optimizations that would fail to support that |
| behavior, you should use GCC's @option{-fwrapv} option, which |
| causes signed overflow to wrap around reliably (except for division and |
| remainder, as discussed in the next section). |
| |
| If you need to write portable code and therefore cannot assume that |
| signed integer overflow wraps around reliably, you should consider |
| debugging with a GCC option that causes signed overflow to raise an |
| exception. These options include @option{-fsanitize=undefined} and |
| @option{-ftrapv}. |
| |
| @node Signed Integer Division |
| @subsection Signed Integer Division and Integer Overflow |
| @cindex division, integer |
| |
| Overflow in signed |
| integer division is not always harmless: for example, on CPUs of the |
| i386 family, dividing @code{INT_MIN} by @code{-1} yields a SIGFPE signal |
| which by default terminates the program. Worse, taking the remainder |
| of these two values typically yields the same signal on these CPUs, |
| behavior that the C standard allows. |
| |
| @node Preprocessor Arithmetic |
| @section Preprocessor Arithmetic |
| @cindex preprocessor arithmetic |
| |
| In C99 and later, preprocessor arithmetic, used for @code{#if} |
| expressions, must |
| be evaluated as if all signed values are of type @code{intmax_t} and all |
| unsigned values of type @code{uintmax_t}. Many compilers are buggy in |
| this area, though. For example, as of 2007, Sun C mishandles @code{#if |
| LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit |
| @code{long long int}. Also, some older preprocessors mishandle |
| constants ending in @code{LL}. To work around these problems, you can |
| compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at |
| @code{configure}-time rather than at @code{#if}-time. |
| |
| @node Null Pointers |
| @section Properties of Null Pointers |
| @cindex null pointers |
| |
| Most modern hosts reliably fail when you attempt to dereference a null |
| pointer. |
| |
| On almost all modern hosts, null pointers use an all-bits-zero internal |
| representation, so you can reliably use @code{memset} with 0 to set all |
| the pointers in an array to null values. |
| |
| If @code{p} is a null pointer to an object type, the C expression |
| @code{p + 0} always evaluates to @code{p} on modern hosts, even though |
| the standard says that it has undefined behavior. |
| |
| @node Buffer Overruns |
| @section Buffer Overruns and Subscript Errors |
| @cindex buffer overruns |
| |
| Buffer overruns and subscript errors are the most common dangerous |
| errors in C programs. They result in undefined behavior because storing |
| outside an array typically modifies storage that is used by some other |
| object, and most modern systems lack runtime checks to catch these |
| errors. Programs should not rely on buffer overruns being caught. |
| |
| There is one exception to the usual rule that a portable program cannot |
| address outside an array. In C, it is valid to compute the address just |
| past an object, e.g., @code{&a[N]} where @code{a} has @code{N} elements, |
| so long as you do not dereference the resulting pointer. But it is not |
| valid to compute the address just before an object, e.g., @code{&a[-1]}; |
| nor is it valid to compute two past the end, e.g., @code{&a[N+1]}. On |
| most platforms @code{&a[-1] < &a[0] && &a[N] < &a[N+1]}, but this is not |
| reliable in general, and it is usually easy enough to avoid the |
| potential portability problem, e.g., by allocating an extra unused array |
| element at the start or end. |
| |
| @uref{https://@/www.valgrind.org/, Valgrind} can catch many overruns. |
| GCC users might also consider using the @option{-fsanitize=} options |
| to catch overruns. |
| @xref{Instrumentation Options, , Program Instrumentation Options, |
| gcc, Using the GNU Compiler Collection (GCC)}. |
| |
| Buffer overruns are usually caused by off-by-one errors, but there are |
| more subtle ways to get them. |
| |
| Using @code{int} values to index into an array or compute array sizes |
| causes problems on typical 64-bit hosts where an array index might |
| be @math{2^{31}} or larger. Index values of type @code{size_t} avoid this |
| problem, but cannot be negative. Index values of type @code{ptrdiff_t} |
| are signed, and are wide enough in practice. |
| |
| If you add or multiply two numbers to calculate an array size, e.g., |
| @code{malloc (x * sizeof y + z)}, havoc ensues if the addition or |
| multiplication overflows. |
| |
| Many implementations of the @code{alloca} function silently misbehave |
| and can generate buffer overflows if given sizes that are too large. |
| The size limits are implementation dependent, but are at least 4000 |
| bytes on all platforms that we know about. |
| |
| The standard functions @code{asctime}, @code{asctime_r}, @code{ctime}, |
| @code{ctime_r}, and @code{gets} are prone to buffer overflows, and |
| portable code should not use them unless the inputs are known to be |
| within certain limits. The time-related functions can overflow their |
| buffers if given timestamps out of range (e.g., a year less than -999 |
| or greater than 9999). Time-related buffer overflows cannot happen with |
| recent-enough versions of the GNU C library, but are possible |
| with other |
| implementations. The @code{gets} function is the worst, since it almost |
| invariably overflows its buffer when presented with an input line larger |
| than the buffer. |
| |
| @node Volatile Objects |
| @section Volatile Objects |
| @cindex volatile objects |
| |
| The keyword @code{volatile} is often misunderstood in portable code. |
| Its use inhibits some memory-access optimizations, but programmers often |
| wish that it had a different meaning than it actually does. |
| |
| @code{volatile} was designed for code that accesses special objects like |
| memory-mapped device registers whose contents spontaneously change. |
| Such code is inherently low-level, and it is difficult to specify |
| portably what @code{volatile} means in these cases. The C standard |
| says, ``What constitutes an access to an object that has |
| volatile-qualified type is implementation-defined,'' so in theory each |
| implementation is supposed to fill in the gap by documenting what |
| @code{volatile} means for that implementation. In practice, though, |
| this documentation is usually absent or incomplete. |
| |
| One area of confusion is the distinction between objects defined with |
| volatile types, and volatile lvalues. From the C standard's point of |
| view, an object defined with a volatile type has externally visible |
| behavior. You can think of such objects as having little oscilloscope |
| probes attached to them, so that the user can observe some properties of |
| accesses to them, just as the user can observe data written to output |
| files. However, accesses via volatile lvalues to ordinary objects |
| are merely side effects (i.e., changes to the state of the execution |
| environment), and the implementation is not required to document |
| their visibility any further. For example: |
| |
| @example |
| /* Declare and access a volatile object. |
| Accesses to X are "visible" to users. */ |
| static int volatile x; |
| x = 1; |
| |
| /* Access two ordinary objects via a volatile lvalue. |
| Although each read and write is a side effect, |
| the accesses are not directly "visible" to users. */ |
| int y = 0; |
| int *z = malloc (sizeof *z); |
| *z = 7; |
| int volatile *p; |
| p = &y; |
| *p = *p + 1; |
| p = z; |
| *p = *p + 1; |
| @end example |
| |
| Programmers often wish that @code{volatile} meant ``Perform the memory |
| access here and now, without merging several memory accesses, without |
| changing the memory word size, and without reordering.'' But the C |
| standard does not require this. For objects defined with a volatile |
| type, accesses must be done before the next sequence point; but |
| otherwise merging, reordering, and word-size change is allowed. |
| |
| Even when accessing objects defined with a volatile type, |
| the C standard allows only |
| extremely limited signal handlers: in C23 the behavior is undefined if a |
| signal handler refers to any non-local object that is not a lock-free |
| atomic object and that is not @code{constexpr} (other than by writing to |
| a @code{sig_atomic_t volatile} object), or calls any standard library |
| function other than from a small set that includes @code{abort}, |
| @code{_Exit}, @code{quick_exit}, some @code{<stdatomic.h>} functions, |
| and @code{signal}. Hence C compilers need not worry about a signal |
| handler disturbing ordinary computation. POSIX allows some additional |
| behavior in a portable signal handler, but is still quite restrictive. |
| @xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the |
| GNU Compiler Collection (GCC)}, for some |
| restrictions imposed by GCC. @xref{Defining Handlers, , |
| Defining Signal Handlers, libc, The GNU C Library}, for some |
| restrictions imposed by the GNU C library. Restrictions |
| differ on other platforms. |
| |
| If possible, it is best to use a signal handler that fits within the |
| limits imposed by the C and POSIX standards. |
| |
| If this is not practical, you can try the following rules of thumb. A |
| signal handler should access only volatile lvalues, preferably lvalues |
| that refer to objects defined with a volatile type, and should not |
| assume that the accessed objects have an internally consistent state |
| if they are larger than a machine word. Furthermore, installers |
| should employ compilers and compiler options that are commonly used |
| for building operating system kernels, because kernels often need more |
| from @code{volatile} than the C Standard requires, and installers who |
| compile an application in a similar environment can sometimes benefit |
| from the extra constraints imposed by kernels on compilers. |
| Admittedly we are hand-waving somewhat here, as there are few |
| guarantees in this area; the rules of thumb may help to fix some bugs |
| but there is a good chance that they will not fix them all. |
| |
| For @code{volatile}, C++ has the same problems that C does. |
| Multithreaded applications have even more problems with @code{volatile}, |
| but they are beyond the scope of this section. |
| |
| The bottom line is that using @code{volatile} typically hurts |
| performance but should not hurt correctness. In some cases its use |
| does help correctness, but these cases are often so poorly understood |
| that all too often adding @code{volatile} to a data structure merely |
| alleviates some symptoms of a bug while not fixing the bug in general. |
| |
| @node Floating Point Portability |
| @section Floating Point Portability |
| @cindex floating point |
| |
| Almost all modern systems use IEEE-754 floating point, and it is safe to |
| assume IEEE-754 in most portable code these days. For more information, |
| please see David Goldberg's classic paper |
| @uref{https://@/www.validlab.com/@/goldberg/@/paper.pdf, What Every Computer |
| Scientist Should Know About Floating-Point Arithmetic}. |
| |
| @node Exiting Portably |
| @section Exiting Portably |
| @cindex exiting portably |
| |
| A C or C++ program can exit with status @var{N} by returning |
| @var{N} from the @code{main} function. Portable programs are supposed |
| to exit either with status 0 or @code{EXIT_SUCCESS} to succeed, or with |
| status @code{EXIT_FAILURE} to fail, but in practice it is portable to |
| fail by exiting with status 1, and test programs that assume POSIX can |
| fail by exiting with status values from 1 through 255. |
| |
| A program can also exit with status @var{N} by passing @var{N} to the |
| @code{exit} function, and a program can fail by calling the @code{abort} |
| function. If a program is specialized to just some platforms, it can fail |
| by calling functions specific to those platforms, e.g., @code{_exit} |
| (POSIX). However, like other functions, an exit |
| function should be declared, typically by including a header. For |
| example, if a C program calls @code{exit}, it should include @file{stdlib.h} |
| either directly or via the default includes (@pxref{Default Includes}). |
| |
| A program can fail due to undefined behavior such as dereferencing a null |
| pointer, but this is not recommended as undefined behavior allows an |
| implementation to do whatever it pleases and this includes exiting |
| successfully. |
| |
| |
| @c ================================================== Manual Configuration |
| |
| @node Manual Configuration |
| @chapter Manual Configuration |
| |
| A few kinds of features can't be guessed automatically by running test |
| programs. For example, the details of the object-file format, or |
| special options that need to be passed to the compiler or linker. |
| Autoconf provides a uniform method for handling unguessable features, |
| by giving each operating system a @dfn{canonical system type}, also |
| known as a @dfn{canonical name} or @dfn{target triplet}. |
| |
| @prindex @command{config.guess} |
| @prindex @command{config.sub} |
| |
| If you use any of the macros described in this chapter, you must |
| distribute the helper scripts @command{config.guess} and |
| @command{config.sub} along with your source code. Some Autoconf macros |
| use these macros internally, so you may need to distribute these scripts |
| even if you do not use any of these macros yourself. @xref{Input}, for |
| information about the @code{AC_CONFIG_AUX_DIR} macro which you can use |
| to control in which directory @command{configure} looks for helper |
| scripts, and where to get the scripts from. |
| |
| @menu |
| * Specifying Target Triplets:: Specifying target triplets |
| * Canonicalizing:: Getting the canonical system type |
| * Using System Type:: What to do with the system type |
| @end menu |
| |
| @node Specifying Target Triplets |
| @section Specifying target triplets |
| @cindex System type |
| @cindex Target triplet |
| @c This node used to be named Specifying Names. The @anchor allows old |
| @c links to still work. |
| @anchor{Specifying Names} |
| |
| Autoconf-generated |
| @command{configure} scripts can make decisions based on a canonical name |
| for the system type, or @dfn{target triplet}, which has the form: |
| @samp{@var{cpu}-@var{vendor}-@var{os}}, where @var{os} can be |
| @samp{@var{system}} or @samp{@var{kernel}-@var{system}} |
| |
| @command{configure} can usually guess the canonical name for the type of |
| system it's running on. To do so it runs a script called |
| @command{config.guess}, which infers the name using the @code{uname} |
| command or symbols predefined by the C preprocessor. |
| |
| Alternately, the user can specify the system type with command line |
| arguments to @command{configure} (@pxref{System Types}. Doing so is |
| necessary when |
| cross-compiling. In the most complex case of cross-compiling, three |
| system types are involved. The options to specify them are: |
| |
| @table @option |
| @item --build=@var{build-type} |
| the type of system on which the package is being configured and |
| compiled. It defaults to the result of running @command{config.guess}. |
| Specifying a @var{build-type} that differs from @var{host-type} enables |
| cross-compilation mode. |
| |
| @item --host=@var{host-type} |
| the type of system on which the package runs. By default it is the |
| same as the build machine. The tools that get used to build and |
| manipulate binaries will, by default, all be prefixed with |
| @code{@var{host-type}-}, such as @code{@var{host-type}-gcc}, |
| @code{@var{host-type}-g++}, @code{@var{host-type}-ar}, and |
| @code{@var{host-type}-nm}. If the binaries produced by these tools can |
| be executed by the build system, the configure script will make use of |
| it in @code{AC_RUN_IFELSE} invocations; otherwise, cross-compilation |
| mode is enabled. Specifying a @var{host-type} that differs |
| from @var{build-type}, when @var{build-type} was also explicitly |
| specified, equally enables cross-compilation mode. |
| |
| @item --target=@var{target-type} |
| the type of system for which any compiler tools in the package |
| produce code (rarely needed). By default, it is the same as host. |
| @end table |
| |
| If you mean to override the result of @command{config.guess} but |
| still produce binaries for the build machine, use @option{--build}, |
| not @option{--host}. |
| |
| So, for example, to produce binaries for 64-bit MinGW, use a command |
| like this: |
| |
| @example |
| ./configure --host=x86_64-w64-mingw64 |
| @end example |
| |
| If your system has the ability to execute MinGW binaries but you don't |
| want to make use of this feature and instead prefer cross-compilation |
| guesses, use a command like this: |
| |
| @example |
| ./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64 |
| @end example |
| |
| @noindent |
| Note that if you do not specify @option{--host}, @command{configure} |
| fails if it can't run the code generated by the specified compiler. For |
| example, configuring as follows fails: |
| |
| @example |
| ./configure CC=x86_64-w64-mingw64-gcc |
| @end example |
| |
| When cross-compiling, @command{configure} will warn about any tools |
| (compilers, linkers, assemblers) whose name is not prefixed with the |
| host type. This is an aid to users performing cross-compilation. |
| Continuing the example above, if a cross-compiler named @command{cc} is |
| used with a native @command{pkg-config}, then libraries found by |
| @command{pkg-config} will likely cause subtle build failures; but using |
| the names @command{x86_64-w64-mingw64-gcc} and |
| @command{x86_64-w64-mingw64-pkg-config} |
| avoids any confusion. Avoiding the warning is as simple as creating the |
| correct symlinks naming the cross tools. |
| |
| @cindex @command{config.sub} |
| @command{configure} recognizes short aliases for some system types; for |
| example, @samp{mingw64} can be used instead of |
| @samp{x86_64-pc-mingw64}. @command{configure} runs a script called |
| @command{config.sub} to canonicalize system type aliases. |
| |
| This section deliberately omits the description of the obsolete |
| interface; see @ref{Hosts and Cross-Compilation}. |
| |
| |
| @node Canonicalizing |
| @section Getting the Canonical System Type |
| @cindex System type |
| @cindex Canonical system type |
| |
| The following macros make the system type available to @command{configure} |
| scripts. |
| |
| @ovindex build_alias |
| @ovindex host_alias |
| @ovindex target_alias |
| |
| The variables @samp{build_alias}, @samp{host_alias}, and |
| @samp{target_alias} are always exactly the arguments of @option{--build}, |
| @option{--host}, and @option{--target}; in particular, they are left empty |
| if the user did not use them, even if the corresponding |
| @code{AC_CANONICAL} macro was run. Any configure script may use these |
| variables anywhere. These are the variables that should be used when in |
| interaction with the user. |
| |
| If you need to recognize some special environments based on their system |
| type, run the following macros to get canonical system names. These |
| variables are not set before the macro call. |
| |
| @defmac AC_CANONICAL_BUILD |
| @acindex{CANONICAL_BUILD} |
| @ovindex build |
| @ovindex build_cpu |
| @ovindex build_vendor |
| @ovindex build_os |
| Compute the canonical build-system type variable, @code{build}, and its |
| three individual parts @code{build_cpu}, @code{build_vendor}, and |
| @code{build_os}. |
| |
| If @option{--build} was specified, then @code{build} is the |
| canonicalization of @code{build_alias} by @command{config.sub}, |
| otherwise it is determined by the shell script @command{config.guess}. |
| @end defmac |
| |
| @defmac AC_CANONICAL_HOST |
| @acindex{CANONICAL_HOST} |
| @ovindex host |
| @ovindex host_cpu |
| @ovindex host_vendor |
| @ovindex host_os |
| Compute the canonical host-system type variable, @code{host}, and its |
| three individual parts @code{host_cpu}, @code{host_vendor}, and |
| @code{host_os}. |
| |
| If @option{--host} was specified, then @code{host} is the |
| canonicalization of @code{host_alias} by @command{config.sub}, |
| otherwise it defaults to @code{build}. |
| @end defmac |
| |
| @defmac AC_CANONICAL_TARGET |
| @acindex{CANONICAL_TARGET} |
| @ovindex target |
| @ovindex target_cpu |
| @ovindex target_vendor |
| @ovindex target_os |
| Compute the canonical target-system type variable, @code{target}, and its |
| three individual parts @code{target_cpu}, @code{target_vendor}, and |
| @code{target_os}. |
| |
| If @option{--target} was specified, then @code{target} is the |
| canonicalization of @code{target_alias} by @command{config.sub}, |
| otherwise it defaults to @code{host}. |
| @end defmac |
| |
| Note that there can be artifacts due to the backward compatibility |
| code. @xref{Hosts and Cross-Compilation}, for more. |
| |
| @node Using System Type |
| @section Using the System Type |
| |
| In @file{configure.ac} the system type is generally used by one or more |
| @code{case} statements to select system-specifics. Shell wildcards can |
| be used to match a group of system types. |
| |
| For example, an extra assembler code object file could be chosen, giving |
| access to a CPU cycle counter register. @code{$(CYCLE_OBJ)} in the |
| following would be used in a makefile to add the object to a |
| program or library. |
| |
| @example |
| AS_CASE([$host], |
| [aarch64*-*-*], [CYCLE_OBJ=pmccntr.o], |
| [i?86-*-*], [CYCLE_OBJ=rdtsc.o], |
| [CYCLE_OBJ=""]) |
| AC_SUBST([CYCLE_OBJ]) |
| @end example |
| |
| @code{AC_CONFIG_LINKS} (@pxref{Configuration Links}) is another good way |
| to select variant source files, for example optimized code for some |
| CPUs. The configured CPU type doesn't always indicate exact CPU types, |
| so some runtime capability checks may be necessary too. |
| |
| @example |
| AS_CASE([$host], |
| [aarch64*-*-*], [AC_CONFIG_LINKS([dither.c:aarch64/dither.c])], |
| [powerpc*-*-*], [AC_CONFIG_LINKS([dither.c:powerpc/dither.c])], |
| [AC_CONFIG_LINKS([dither.c:generic/dither.c])]) |
| @end example |
| |
| The host system type can also be used to find cross-compilation tools |
| with @code{AC_CHECK_TOOL} (@pxref{Generic Programs}). |
| |
| The above examples all show @samp{$host}, since this is where the code |
| is going to run. Only rarely is it necessary to test @samp{$build} |
| (which is where the build is being done). |
| |
| Whenever you're tempted to use @samp{$host} it's worth considering |
| whether some sort of probe would be better. New system types come along |
| periodically or previously missing features are added. Well-written |
| probes can adapt themselves to such things, but hard-coded lists of |
| names can't. Here are some guidelines, |
| |
| @itemize @bullet |
| @item |
| Availability of libraries and library functions should always be checked |
| by probing. |
| @item |
| Variant behavior of system calls is best identified with runtime tests |
| if possible, but bug workarounds or obscure difficulties might have to |
| be driven from @samp{$host}. |
| @item |
| Assembler code is inevitably highly CPU-specific and is best selected |
| according to @samp{$host_cpu}. |
| @item |
| Assembler variations like underscore prefix on globals or ELF versus |
| COFF type directives are however best determined by probing, perhaps |
| even examining the compiler output. |
| @end itemize |
| |
| @samp{$target} is for use by a package creating a compiler or similar. |
| For ordinary packages it's meaningless and should not be used. It |
| indicates what the created compiler should generate code for, if it can |
| cross-compile. @samp{$target} generally selects various hard-coded CPU |
| and system conventions, since usually the compiler or tools under |
| construction themselves determine how the target works. |
| |
| |
| @c ===================================================== Site Configuration. |
| |
| @node Site Configuration |
| @chapter Site Configuration |
| |
| @command{configure} scripts support several kinds of local configuration |
| decisions. There are ways for users to specify where external software |
| packages are, include or exclude optional features, install programs |
| under modified names, and set default values for @command{configure} |
| options. |
| |
| @menu |
| * Help Formatting:: Customizing @samp{configure --help} |
| * External Software:: Working with other optional software |
| * Package Options:: Selecting optional features |
| * Pretty Help Strings:: Formatting help string |
| * Option Checking:: Controlling checking of @command{configure} options |
| * Site Details:: Configuring site details |
| * Transforming Names:: Changing program names when installing |
| * Site Defaults:: Giving @command{configure} local defaults |
| @end menu |
| |
| @node Help Formatting |
| @section Controlling Help Output |
| |
| Users consult @samp{configure --help} to learn of configuration |
| decisions specific to your package. By default, @command{configure} |
| breaks this output into sections for each type of option; within each |
| section, help strings appear in the order @file{configure.ac} defines |
| them: |
| |
| @example |
| Optional Features: |
| @dots{} |
| --enable-bar include bar |
| |
| Optional Packages: |
| @dots{} |
| --with-foo use foo |
| @end example |
| |
| @defmac AC_PRESERVE_HELP_ORDER |
| @acindex{PRESERVE_HELP_ORDER} |
| |
| Request an alternate @option{--help} format, in which options of all |
| types appear together, in the order defined. Call this macro before any |
| @code{AC_ARG_ENABLE} or @code{AC_ARG_WITH}. |
| |
| @example |
| Optional Features and Packages: |
| @dots{} |
| --enable-bar include bar |
| --with-foo use foo |
| @end example |
| |
| @end defmac |
| |
| @node External Software |
| @section Working With External Software |
| @cindex External software |
| |
| Some packages require, or can optionally use, other software packages |
| that are already installed. The user can give @command{configure} |
| command line options to specify which such external software to use. |
| The options have one of these forms: |
| |
| @c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something |
| @c awful. |
| @example |
| --with-@var{package}@r{[}=@var{arg}@r{]} |
| --without-@var{package} |
| @end example |
| |
| For example, @option{--with-gnu-ld} means work with the GNU linker |
| instead of some other linker. @option{--with-x} means work with The X |
| Window System. |
| |
| The user can give an argument by following the package name with |
| @samp{=} and the argument. Giving an argument of @samp{no} is for |
| packages that are used by default; it says to @emph{not} use the |
| package. An argument that is neither @samp{yes} nor @samp{no} could |
| include a name or number of a version of the other package, to specify |
| more precisely which other package this program is supposed to work |
| with. If no argument is given, it defaults to @samp{yes}. |
| @option{--without-@var{package}} is equivalent to |
| @option{--with-@var{package}=no}. |
| |
| Normally @command{configure} scripts complain about |
| @option{--with-@var{package}} options that they do not support. |
| @xref{Option Checking}, for details, and for how to override the |
| defaults. |
| |
| For each external software package that may be used, @file{configure.ac} |
| should call @code{AC_ARG_WITH} to detect whether the @command{configure} |
| user asked to use it. Whether each package is used or not by default, |
| and which arguments are valid, is up to you. |
| |
| @anchor{AC_ARG_WITH} |
| @defmac AC_ARG_WITH (@var{package}, @var{help-string}, @ |
| @ovar{action-if-given}, @ovar{action-if-not-given}) |
| @acindex{ARG_WITH} |
| If the user gave @command{configure} the option @option{--with-@var{package}} |
| or @option{--without-@var{package}}, run shell commands |
| @var{action-if-given}. If neither option was given, run shell commands |
| @var{action-if-not-given}. The name @var{package} indicates another |
| software package that this program should work with. It should consist |
| only of alphanumeric characters, dashes, plus signs, and dots. |
| |
| The option's argument is available to the shell commands |
| @var{action-if-given} in the shell variable @code{withval}, which is |
| actually just the value of the shell variable named |
| @code{with_@var{package}}, with any non-alphanumeric characters in |
| @var{package} changed into @samp{_}. You may use that variable instead, |
| if you wish. |
| |
| Note that @var{action-if-not-given} is not expanded until the point that |
| @code{AC_ARG_WITH} was expanded. If you need the value of |
| @code{with_@var{package}} set to a default value by the time argument |
| parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS} |
| diversion (@pxref{m4_divert_text}) (if done as an argument to |
| @code{AC_ARG_WITH}, also provide non-diverted text to avoid a shell |
| syntax error). |
| |
| The argument @var{help-string} is a description of the option that |
| looks like this: |
| @example |
| --with-readline support fancy command line editing |
| @end example |
| |
| @noindent |
| @var{help-string} may be more than one line long, if more detail is |
| needed. Just make sure the columns line up in @samp{configure |
| --help}. Avoid tabs in the help string. The easiest way to provide the |
| proper leading whitespace is to format your @var{help-string} with the macro |
| @code{AS_HELP_STRING} (@pxref{Pretty Help Strings}). |
| |
| The following example shows how to use the @code{AC_ARG_WITH} macro in |
| a common situation. You want to let the user decide whether to enable |
| support for an external library (e.g., the readline library); if the user |
| specified neither @option{--with-readline} nor @option{--without-readline}, |
| you want to enable support for readline only if the library is available |
| on the system. |
| |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. |
| @example |
| AC_ARG_WITH([readline], |
| [AS_HELP_STRING([--with-readline], |
| [support fancy command line editing @@<:@@default=check@@:>@@])], |
| [], |
| [: m4_divert_text([DEFAULTS], [with_readline=check])]) |
| |
| LIBREADLINE= |
| AS_IF([test "x$with_readline" != xno], |
| [AC_CHECK_LIB([readline], [main], |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) |
| AC_DEFINE([HAVE_LIBREADLINE], [1], |
| [Define if you have libreadline]) |
| ], |
| [if test "x$with_readline" != xcheck; then |
| AC_MSG_FAILURE( |
| [--with-readline was given, but test for readline failed]) |
| fi |
| ], -lncurses)]) |
| @end example |
| |
| The next example shows how to use @code{AC_ARG_WITH} to give the user the |
| possibility to enable support for the readline library, in case it is still |
| experimental and not well tested, and is therefore disabled by default. |
| |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. |
| @example |
| AC_ARG_WITH([readline], |
| [AS_HELP_STRING([--with-readline], |
| [enable experimental support for readline])], |
| [], |
| [with_readline=no]) |
| |
| LIBREADLINE= |
| AS_IF([test "x$with_readline" != xno], |
| [AC_CHECK_LIB([readline], [main], |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) |
| AC_DEFINE([HAVE_LIBREADLINE], [1], |
| [Define if you have libreadline]) |
| ], |
| [AC_MSG_FAILURE( |
| [--with-readline was given, but test for readline failed])], |
| [-lncurses])]) |
| @end example |
| |
| The last example shows how to use @code{AC_ARG_WITH} to give the user the |
| possibility to disable support for the readline library, given that it is |
| an important feature and that it should be enabled by default. |
| |
| @c FIXME: Remove AS_IF when the problem of AC_REQUIRE within 'if' is solved. |
| @example |
| AC_ARG_WITH([readline], |
| [AS_HELP_STRING([--without-readline], |
| [disable support for readline])], |
| [], |
| [with_readline=yes]) |
| |
| LIBREADLINE= |
| AS_IF([test "x$with_readline" != xno], |
| [AC_CHECK_LIB([readline], [main], |
| [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"]) |
| AC_DEFINE([HAVE_LIBREADLINE], [1], |
| [Define if you have libreadline]) |
| ], |
| [AC_MSG_FAILURE( |
| [readline test failed (--without-readline to disable)])], |
| [-lncurses])]) |
| @end example |
| |
| These three examples can be easily adapted to the case where |
| @code{AC_ARG_ENABLE} should be preferred to @code{AC_ARG_WITH} (see |
| @ref{Package Options}). |
| @end defmac |
| |
| @node Package Options |
| @section Choosing Package Options |
| @cindex Package options |
| @cindex Options, package |
| |
| If a software package has optional compile-time features, the user can |
| give @command{configure} command line options to specify whether to |
| compile them. The options have one of these forms: |
| |
| @c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something |
| @c awful. |
| @example |
| --enable-@var{feature}@r{[}=@var{arg}@r{]} |
| --disable-@var{feature} |
| @end example |
| |
| These options allow users to choose which optional features to build and |
| install. @option{--enable-@var{feature}} options should never make a |
| feature behave differently or cause one feature to replace another. |
| They should only cause parts of the program to be built rather than left |
| out. |
| |
| The user can give an argument by following the feature name with |
| @samp{=} and the argument. Giving an argument of @samp{no} requests |
| that the feature @emph{not} be made available. A feature with an |
| argument looks like @option{--enable-debug=stabs}. If no argument is |
| given, it defaults to @samp{yes}. @option{--disable-@var{feature}} is |
| equivalent to @option{--enable-@var{feature}=no}. |
| |
| Normally @command{configure} scripts complain about |
| @option{--enable-@var{package}} options that they do not support. |
| @xref{Option Checking}, for details, and for how to override the |
| defaults. |
| |
| For each optional feature, @file{configure.ac} should call |
| @code{AC_ARG_ENABLE} to detect whether the @command{configure} user asked |
| to include it. Whether each feature is included or not by default, and |
| which arguments are valid, is up to you. |
| |
| @anchor{AC_ARG_ENABLE} |
| @defmac AC_ARG_ENABLE (@var{feature}, @var{help-string}, @ |
| @ovar{action-if-given}, @ovar{action-if-not-given}) |
| @acindex{ARG_ENABLE} |
| If the user gave @command{configure} the option |
| @option{--enable-@var{feature}} or @option{--disable-@var{feature}}, run |
| shell commands @var{action-if-given}. If neither option was given, run |
| shell commands @var{action-if-not-given}. The name @var{feature} |
| indicates an optional user-level facility. It should consist only of |
| alphanumeric characters, dashes, plus signs, and dots. |
| |
| The option's argument is available to the shell commands |
| @var{action-if-given} in the shell variable @code{enableval}, which is |
| actually just the value of the shell variable named |
| @code{enable_@var{feature}}, with any non-alphanumeric characters in |
| @var{feature} changed into @samp{_}. You may use that variable instead, |
| if you wish. The @var{help-string} argument is like that of |
| @code{AC_ARG_WITH} (@pxref{External Software}). |
| |
| Note that @var{action-if-not-given} is not expanded until the point that |
| @code{AC_ARG_ENABLE} was expanded. If you need the value of |
| @code{enable_@var{feature}} set to a default value by the time argument |
| parsing is completed, use @code{m4_divert_text} to the @code{DEFAULTS} |
| diversion (@pxref{m4_divert_text}) (if done as an argument to |
| @code{AC_ARG_ENABLE}, also provide non-diverted text to avoid a shell |
| syntax error). |
| |
| You should format your @var{help-string} with the macro |
| @code{AS_HELP_STRING} (@pxref{Pretty Help Strings}). |
| |
| See the examples suggested with the definition of @code{AC_ARG_WITH} |
| (@pxref{External Software}) to get an idea of possible applications of |
| @code{AC_ARG_ENABLE}. |
| @end defmac |
| |
| @node Pretty Help Strings |
| @section Making Your Help Strings Look Pretty |
| @cindex Help strings |
| |
| Properly formatting the @samp{help strings} which are used in |
| @code{AC_ARG_WITH} (@pxref{External Software}) and @code{AC_ARG_ENABLE} |
| (@pxref{Package Options}) can be challenging. Specifically, you want |
| your own @samp{help strings} to line up in the appropriate columns of |
| @samp{configure --help} just like the standard Autoconf @samp{help |
| strings} do. This is the purpose of the @code{AS_HELP_STRING} macro. |
| |
| @anchor{AS_HELP_STRING} |
| @defmac AS_HELP_STRING (@var{left-hand-side}, @var{right-hand-side} @ |
| @dvar{indent-column, 26}, @dvar{wrap-column, 79}) |
| @asindex{HELP_STRING} |
| |
| Expands into a help string that looks pretty when the user executes |
| @samp{configure --help}. It is typically used in @code{AC_ARG_WITH} |
| (@pxref{External Software}) or @code{AC_ARG_ENABLE} (@pxref{Package |
| Options}). The following example makes this clearer. |
| |
| @example |
| AC_ARG_WITH([foo], |
| [AS_HELP_STRING([--with-foo], |
| [use foo (default is no)])], |
| [use_foo=$withval], |
| [use_foo=no]) |
| @end example |
| |
| Then the last few lines of @samp{configure --help} appear like |
| this: |
| |
| @example |
| --enable and --with options recognized: |
| --with-foo use foo (default is no) |
| @end example |
| |
| Macro expansion is performed on the first argument. However, the second |
| argument of @code{AS_HELP_STRING} is treated as a whitespace separated |
| list of text to be reformatted, and is not subject to macro expansion. |
| Since it is not expanded, it should not be double quoted. |
| @xref{Autoconf Language}, for a more detailed explanation. |
| |
| The @code{AS_HELP_STRING} macro is particularly helpful when the |
| @var{left-hand-side} and/or @var{right-hand-side} are composed of macro |
| arguments, as shown in the following example. Be aware that |
| @var{left-hand-side} may not expand to unbalanced quotes, |
| although quadrigraphs can be used. |
| |
| @example |
| AC_DEFUN([MY_ARG_WITH], |
| [AC_ARG_WITH(m4_translit([[$1]], [_], [-]), |
| [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])], |
| [use $1 (default is $2)])], |
| [use_[]$1=$withval], |
| [use_[]$1=$2])]) |
| MY_ARG_WITH([a_b], [no]) |
| @end example |
| @noindent |
| Here, the last few lines of @samp{configure --help} will include: |
| |
| @example |
| --enable and --with options recognized: |
| --with-a-b use a_b (default is no) |
| @end example |
| |
| The parameters @var{indent-column} and @var{wrap-column} were introduced |
| in Autoconf 2.62. Generally, they should not be specified; they exist |
| for fine-tuning of the wrapping. |
| @example |
| AS_HELP_STRING([--option], [description of option]) |
| @result{} --option description of option |
| AS_HELP_STRING([--option], [description of option], [15], [30]) |
| @result{} --option description of |
| @result{} option |
| @end example |
| @end defmac |
| |
| |
| @node Option Checking |
| @section Controlling Checking of @command{configure} Options |
| @cindex Options, Package |
| |
| The @command{configure} script checks its command-line options against a |
| list of known options, like @option{--help} or @option{--config-cache}. |
| An unknown option ordinarily indicates a mistake by the user and |
| @command{configure} halts with an error. However, by default unknown |
| @option{--with-@var{package}} and @option{--enable-@var{feature}} |
| options elicit only a warning, to support configuring entire source |
| trees. |
| |
| Source trees often contain multiple packages with a top-level |
| @command{configure} script that uses the @code{AC_CONFIG_SUBDIRS} macro |
| (@pxref{Subdirectories}). Because the packages generally support |
| different @option{--with-@var{package}} and |
| @option{--enable-@var{feature}} options, the GNU Coding |
| Standards say they must accept unrecognized options without halting. |
| Even a warning message is undesirable here, so @code{AC_CONFIG_SUBDIRS} |
| automatically disables the warnings. |
| |
| This default behavior may be modified in two ways. First, the installer |
| can invoke @code{configure --disable-option-checking} to disable |
| these warnings, or invoke @code{configure --enable-option-checking=fatal} |
| options to turn them into fatal errors, respectively. Second, the |
| maintainer can use @code{AC_DISABLE_OPTION_CHECKING}. |
| |
| @defmac AC_DISABLE_OPTION_CHECKING |
| @acindex{DISABLE_OPTION_CHECKING} |
| |
| By default, disable warnings related to any unrecognized |
| @option{--with-@var{package}} or @option{--enable-@var{feature}} |
| options. This is implied by @code{AC_CONFIG_SUBDIRS}. |
| |
| The installer can override this behavior by passing |
| @option{--enable-option-checking} (enable warnings) or |
| @option{--enable-option-checking=fatal} (enable errors) to |
| @command{configure}. |
| @end defmac |
| |
| |
| @node Site Details |
| @section Configuring Site Details |
| @cindex Site details |
| |
| Some software packages require complex site-specific information. Some |
| examples are host names to use for certain services, company names, and |
| email addresses to contact. Since some configuration scripts generated |
| by Metaconfig ask for such information interactively, people sometimes |
| wonder how to get that information in Autoconf-generated configuration |
| scripts, which aren't interactive. |
| |
| Such site configuration information should be put in a file that is |
| edited @emph{only by users}, not by programs. The location of the file |
| can either be based on the @code{prefix} variable, or be a standard |
| location such as the user's home directory. It could even be specified |
| by an environment variable. The programs should examine that file at |
| runtime, rather than at compile time. Runtime configuration is more |
| convenient for users and makes the configuration process simpler than |
| getting the information while configuring. @xref{Directory Variables, , |
| Variables for Installation Directories, standards, The GNU Coding |
| Standards}, for more information on where to put data files. |
| |
| @node Transforming Names |
| @section Transforming Program Names When Installing |
| @cindex Transforming program names |
| @cindex Program names, transforming |
| |
| Autoconf supports changing the names of programs when installing them. |
| In order to use these transformations, @file{configure.ac} must call the |
| macro @code{AC_ARG_PROGRAM}. |
| |
| @defmac AC_ARG_PROGRAM |
| @acindex{ARG_PROGRAM} |
| @ovindex program_transform_name |
| Place in output variable @code{program_transform_name} a sequence of |
| @code{sed} commands for changing the names of installed programs. |
| |
| If any of the options described below are given to @command{configure}, |
| program names are transformed accordingly. Otherwise, if |
| @code{AC_CANONICAL_TARGET} has been called and a @option{--target} value |
| is given, the target type followed by a dash is used as a prefix. |
| Otherwise, no program name transformation is done. |
| @end defmac |
| |
| @menu |
| * Transformation Options:: @command{configure} options to transform names |
| * Transformation Examples:: Sample uses of transforming names |
| * Transformation Rules:: Makefile uses of transforming names |
| @end menu |
| |
| @node Transformation Options |
| @subsection Transformation Options |
| |
| You can specify name transformations by giving @command{configure} these |
| command line options: |
| |
| @table @option |
| @item --program-prefix=@var{prefix} |
| prepend @var{prefix} to the names; |
| |
| @item --program-suffix=@var{suffix} |
| append @var{suffix} to the names; |
| |
| @item --program-transform-name=@var{expression} |
| perform @code{sed} substitution @var{expression} on the names. |
| @end table |
| |
| @node Transformation Examples |
| @subsection Transformation Examples |
| |
| These transformations are useful with programs that can be part of a |
| cross-compilation development environment. For example, a |
| cross-assembler running on x86-64 configured with |
| @option{--target=aarch64-linux-gnu} is normally installed as |
| @file{aarch64-linux-gnu-as}, rather than @file{as}, which could be confused |
| with a native x86-64 assembler. |
| |
| You can force a program name to begin with @file{g}, if you don't want |
| GNU programs installed on your system to shadow other programs with |
| the same name. For example, if you configure GNU @code{diff} with |
| @option{--program-prefix=g}, then when you run @samp{make install} it is |
| installed as @file{/usr/local/bin/gdiff}. |
| |
| As a more sophisticated example, you could use |
| |
| @example |
| --program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/' |
| @end example |
| @noindent |
| |
| to prepend @samp{g} to most of the program names in a source tree, |
| excepting those like @code{gdb} that already have one and those like |
| @code{less} and @code{lesskey} that aren't GNU programs. (That is |
| assuming that you have a source tree containing those programs that is |
| set up to use this feature.) |
| |
| One way to install multiple versions of some programs simultaneously is |
| to append a version number to the name of one or both. For example, if |
| you want to keep Autoconf version 1 around for awhile, you can configure |
| Autoconf version 2 using @option{--program-suffix=2} to install the |
| programs as @file{/usr/local/bin/autoconf2}, |
| @file{/usr/local/bin/autoheader2}, etc. Nevertheless, pay attention |
| that only the binaries are renamed, therefore you'd have problems with |
| the library files which might overlap. |
| |
| @node Transformation Rules |
| @subsection Transformation Rules |
| |
| Here is how to use the variable @code{program_transform_name} in a |
| @file{Makefile.in}: |
| |
| @example |
| PROGRAMS = cp ls rm |
| transform = @@program_transform_name@@ |
| install: |
| for p in $(PROGRAMS); do \ |
| $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \ |
| sed '$(transform)'`; \ |
| done |
| |
| uninstall: |
| for p in $(PROGRAMS); do \ |
| rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \ |
| @c $$ restore font-lock |
| done |
| @end example |
| |
| It is guaranteed that @code{program_transform_name} is never empty, and |
| that there are no useless separators. Therefore you may safely embed |
| @code{program_transform_name} within a sed program using @samp{;}: |
| |
| @example |
| transform = @@program_transform_name@@ |
| transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/ |
| @end example |
| |
| Whether to do the transformations on documentation files (Texinfo or |
| @code{man}) is a tricky question; there seems to be no perfect answer, |
| due to the several reasons for name transforming. Documentation is not |
| usually particular to a specific architecture, and Texinfo files do not |
| conflict with system documentation. But they might conflict with |
| earlier versions of the same files, and @code{man} pages sometimes do |
| conflict with system documentation. As a compromise, it is probably |
| best to do name transformations on @code{man} pages but not on Texinfo |
| manuals. |
| |
| @node Site Defaults |
| @section Setting Site Defaults |
| @cindex Site defaults |
| @cindex config.site |
| |
| Autoconf-generated @command{configure} scripts allow your site to provide |
| default values for some configuration values. You do this by creating |
| site- and system-wide initialization files. |
| |
| @evindex CONFIG_SITE |
| If the environment variable @code{CONFIG_SITE} is set, @command{configure} |
| uses its value as a space-separated list of shell scripts to read; |
| it is recommended that these be absolute file names. Otherwise, it |
| reads the shell script @file{@var{prefix}/share/config.site} if it exists, |
| then @file{@var{prefix}/etc/config.site} if it exists. Thus, |
| settings in machine-specific files override those in machine-independent |
| ones in case of conflict. |
| |
| Site files can be arbitrary shell scripts, but only certain kinds of |
| code are really appropriate to be in them. Because @command{configure} |
| reads any cache file after it has read any site files, a site file can |
| define a default cache file to be shared between all Autoconf-generated |
| @command{configure} scripts run on that system (@pxref{Cache Files}). If |
| you set a default cache file in a site file, it is a good idea to also |
| set the output variable @code{CC} in that site file, because the cache |
| file is only valid for a particular compiler, but many systems have |
| several available. |
| |
| You can examine or override the value set by a command line option to |
| @command{configure} in a site file; options set shell variables that have |
| the same names as the options, with any dashes turned into underscores. |
| The exceptions are that @option{--without-} and @option{--disable-} options |
| are like giving the corresponding @option{--with-} or @option{--enable-} |
| option and the value @samp{no}. Thus, @option{--cache-file=localcache} |
| sets the variable @code{cache_file} to the value @samp{localcache}; |
| @option{--enable-warnings=no} or @option{--disable-warnings} sets the variable |
| @code{enable_warnings} to the value @samp{no}; @option{--prefix=/usr} sets the |
| variable @code{prefix} to the value @samp{/usr}; etc. |
| |
| Site files are also good places to set default values for other output |
| variables, such as @code{CFLAGS}, if you need to give them non-default |
| values: anything you would normally do, repetitively, on the command |
| line. If you use non-default values for @var{prefix} or |
| @var{exec_prefix} (wherever you locate the site file), you can set them |
| in the site file if you specify it with the @code{CONFIG_SITE} |
| environment variable. |
| |
| You can set some cache values in the site file itself. Doing this is |
| useful if you are cross-compiling, where it is impossible to check features |
| that require running a test program. You could ``prime the cache'' by |
| setting those values correctly for that system in |
| @file{@var{prefix}/etc/config.site}. To find out the names of the cache |
| variables you need to set, see the documentation of the respective |
| Autoconf macro. If the variables or their semantics are undocumented, |
| you may need to look for shell variables with @samp{_cv_} in their names |
| in the affected @command{configure} scripts, or in the Autoconf M4 |
| source code for those macros; but in that case, their name or semantics |
| may change in a future Autoconf version. |
| |
| The cache file is careful to not override any variables set in the site |
| files. Similarly, you should not override command-line options in the |
| site files. Your code should check that variables such as @code{prefix} |
| and @code{cache_file} have their default values (as set near the top of |
| @command{configure}) before changing them. |
| |
| Here is a sample file @file{/usr/share/local/@/gnu/share/@/config.site}. The |
| command @samp{configure --prefix=/usr/share/local/gnu} would read this |
| file (if @code{CONFIG_SITE} is not set to a different file). |
| |
| @example |
| # /usr/share/local/gnu/share/config.site for configure |
| # |
| # Change some defaults. |
| test "$prefix" = NONE && prefix=/usr/share/local/gnu |
| test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu |
| test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var |
| test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var |
| test "$runstatedir" = '$@{localstatedir@}/run' && runstatedir=/run |
| |
| # Give Autoconf 2.x generated configure scripts a shared default |
| # cache file for feature test results, architecture-specific. |
| if test "$cache_file" = /dev/null; then |
| cache_file="$prefix/var/config.cache" |
| # A cache file is only valid for one C compiler. |
| CC=gcc |
| fi |
| @end example |
| |
| @c Leave this use of "File system" rendered as one word, but |
| @c slightly obfuscated so as not to trigger the syntax-check prohibition. |
| @cindex File@/system Hierarchy Standard |
| @cindex FHS |
| |
| Another use of @file{config.site} is for priming the directory variables |
| @c "File system", but slightly obfuscated, as above. |
| in a manner consistent with the File@/system Hierarchy Standard |
| (FHS). Once the following file is installed at |
| @file{/usr/share/config.site}, a user can execute simply |
| @code{./configure --prefix=/usr} to get all the directories chosen in |
| the locations recommended by FHS. |
| |
| @example |
| # /usr/share/config.site for FHS defaults when installing below /usr, |
| # and the respective settings were not changed on the command line. |
| if test "$prefix" = /usr; then |
| test "$sysconfdir" = '$@{prefix@}/etc' && sysconfdir=/etc |
| test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var |
| test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var |
| fi |
| @end example |
| |
| @cindex @file{lib64} |
| @cindex 64-bit libraries |
| Likewise, on platforms where 64-bit libraries are built by default, then |
| installed in @file{/usr/local/@/lib64} instead of @file{/usr/local/@/lib}, |
| it is appropriate to install @file{/usr/local/@/share/config.site}: |
| |
| @example |
| # /usr/local/share/config.site for platforms that prefer |
| # the directory /usr/local/lib64 over /usr/local/lib. |
| test "$libdir" = '$@{exec_prefix@}/lib' && libdir='$@{exec_prefix@}/lib64' |
| @end example |
| |
| |
| @c ============================================== Running configure Scripts. |
| |
| @node Running configure Scripts |
| @chapter Running @command{configure} Scripts |
| @cindex @command{configure} |
| |
| Below are instructions on how to configure a package that uses a |
| @command{configure} script, suitable for inclusion as an @file{INSTALL} |
| file in the package. A plain-text version of @file{INSTALL} which you |
| may use comes with Autoconf. |
| |
| @menu |
| * Basic Installation:: Instructions for typical cases |
| * Installation Prerequisites:: What you need to install |
| * Compilers and Options:: Selecting compilers and optimization |
| * Multiple Architectures:: Compiling for multiple architectures at once |
| * Installation Names:: Installing in different directories |
| * Optional Features:: Selecting optional features |
| * System Types:: Specifying a system type |
| * Sharing Defaults:: Setting site-wide defaults for @command{configure} |
| * Defining Variables:: Specifying the compiler etc. |
| * configure Invocation:: Changing how @command{configure} runs |
| @end menu |
| |
| @set autoconf |
| @include install.texi |
| |
| |
| @c ============================================== config.status Invocation |
| |
| @node config.status Invocation |
| @chapter config.status Invocation |
| @cindex @command{config.status} |
| |
| The @command{configure} script creates a file named @file{config.status}, |
| which actually configures, @dfn{instantiates}, the template files. It |
| also records the configuration options that were specified when the |
| package was last configured in case reconfiguring is needed. |
| |
| Synopsis: |
| @example |
| ./config.status @ovar{option}@dots{} @ovar{tag}@dots{} |
| @end example |
| |
| It configures each @var{tag}; if none are specified, all the templates |
| are instantiated. A @var{tag} refers to a file or other tag associated |
| with a configuration action, as specified by an @code{AC_CONFIG_@var{ITEMS}} |
| macro (@pxref{Configuration Actions}). The files must be specified |
| without their dependencies, as in |
| |
| @example |
| ./config.status foobar |
| @end example |
| |
| @noindent |
| not |
| |
| @example |
| ./config.status foobar:foo.in:bar.in |
| @end example |
| |
| The supported options are: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options, the list of the template |
| files, and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and the configuration settings, |
| and exit. |
| |
| @item --config |
| Print the configuration settings in reusable way, quoted for the shell, |
| and exit. For example, for a debugging build that otherwise reuses the |
| configuration from a different build directory @var{build-dir} of a |
| package in @var{src-dir}, you could use the following: |
| |
| @example |
| args=`@var{build-dir}/config.status --config` |
| eval @var{src-dir}/configure "$args" CFLAGS=-g --srcdir=@var{src-dir} |
| @end example |
| |
| @noindent |
| Note that it may be necessary to override a @option{--srcdir} setting |
| that was saved in the configuration, if the arguments are used in a |
| different build directory. |
| |
| @item --silent |
| @itemx --quiet |
| @itemx -q |
| Do not print progress messages. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files. |
| |
| @item --file=@var{file}[:@var{template}] |
| Require that @var{file} be instantiated as if |
| @samp{AC_CONFIG_FILES(@var{file}:@var{template})} was used. Both |
| @var{file} and @var{template} may be @samp{-} in which case the standard |
| output and/or standard input, respectively, is used. If a |
| @var{template} file name is relative, it is first looked for in the build |
| tree, and then in the source tree. @xref{Configuration Actions}, for |
| more details. |
| |
| This option and the following ones provide one way for separately |
| distributed packages to share the values computed by @command{configure}. |
| Doing so can be useful if some of the packages need a superset of the |
| features that one of them, perhaps a common library, does. These |
| options allow a @file{config.status} file to create files other than the |
| ones that its @file{configure.ac} specifies, so it can be used for a |
| different package, or for extracting a subset of values. For example, |
| |
| @example |
| echo '@@CC@@' | ./config.status --file=- |
| @end example |
| |
| @noindent |
| provides the value of @code{@@CC@@} on standard output. |
| |
| @item --header=@var{file}[:@var{template}] |
| Same as @option{--file} above, but with @samp{AC_CONFIG_HEADERS}. |
| |
| @item --recheck |
| Ask @file{config.status} to update itself and exit (no instantiation). |
| This option is useful if you change @command{configure}, so that the |
| results of some tests might be different from the previous run. The |
| @option{--recheck} option reruns @command{configure} with the same arguments |
| you used before, plus the @option{--no-create} option, which prevents |
| @command{configure} from running @file{config.status} and creating |
| @file{Makefile} and other files, and the @option{--no-recursion} option, |
| which prevents @command{configure} from running other @command{configure} |
| scripts in subdirectories. (This is so other Make rules can |
| run @file{config.status} when it changes; @pxref{Automatic Remaking}, |
| for an example). |
| @end table |
| |
| @file{config.status} checks several optional environment variables that |
| can alter its behavior: |
| |
| @anchor{CONFIG_SHELL} |
| @defvar CONFIG_SHELL |
| @evindex CONFIG_SHELL |
| The shell with which to run @command{configure}. It must be |
| Bourne-compatible, and the absolute name of the shell should be passed. |
| The default is a shell that supports @code{LINENO} if available, and |
| @file{/bin/sh} otherwise. |
| @end defvar |
| |
| @defvar CONFIG_STATUS |
| @evindex CONFIG_STATUS |
| The file name to use for the shell script that records the |
| configuration. The default is @file{./config.status}. This variable is |
| useful when one package uses parts of another and the @command{configure} |
| scripts shouldn't be merged because they are maintained separately. |
| @end defvar |
| |
| You can use @file{./config.status} in your makefiles. For example, in |
| the dependencies given above (@pxref{Automatic Remaking}), |
| @file{config.status} is run twice when @file{configure.ac} has changed. |
| If that bothers you, you can make each run only regenerate the files for |
| that rule: |
| @example |
| @group |
| config.h: stamp-h |
| stamp-h: config.h.in config.status |
| ./config.status config.h |
| echo > stamp-h |
| |
| Makefile: Makefile.in config.status |
| ./config.status Makefile |
| @end group |
| @end example |
| |
| The calling convention of @file{config.status} has changed; see |
| @ref{Obsolete config.status Use}, for details. |
| |
| |
| @c =================================================== Obsolete Constructs |
| |
| @node Obsolete Constructs |
| @chapter Obsolete Constructs |
| @cindex Obsolete constructs |
| |
| Autoconf changes, and throughout the years some constructs have been |
| obsoleted. Most of the changes involve the macros, but in some cases |
| the tools themselves, or even some concepts, are now considered |
| obsolete. |
| |
| You may completely skip this chapter if you are new to Autoconf. Its |
| intention is mainly to help maintainers updating their packages by |
| understanding how to move to more modern constructs. |
| |
| @menu |
| * Obsolete config.status Use:: Obsolete convention for @command{config.status} |
| * acconfig Header:: Additional entries in @file{config.h.in} |
| * autoupdate Invocation:: Automatic update of @file{configure.ac} |
| * Obsolete Macros:: Backward compatibility macros |
| * Autoconf 1:: Tips for upgrading your files |
| * Autoconf 2.13:: Some fresher tips |
| @end menu |
| |
| @node Obsolete config.status Use |
| @section Obsolete @file{config.status} Invocation |
| |
| @file{config.status} now supports arguments to specify the files to |
| instantiate; see @ref{config.status Invocation}, for more details. |
| Before, environment variables had to be used. |
| |
| @defvar CONFIG_COMMANDS |
| @evindex CONFIG_COMMANDS |
| The tags of the commands to execute. The default is the arguments given |
| to @code{AC_OUTPUT} and @code{AC_CONFIG_COMMANDS} in |
| @file{configure.ac}. |
| @end defvar |
| |
| @defvar CONFIG_FILES |
| @evindex CONFIG_FILES |
| The files in which to perform @samp{@@@var{variable}@@} substitutions. |
| The default is the arguments given to @code{AC_OUTPUT} and |
| @code{AC_CONFIG_FILES} in @file{configure.ac}. |
| @end defvar |
| |
| @defvar CONFIG_HEADERS |
| @evindex CONFIG_HEADERS |
| The files in which to substitute C @code{#define} statements. The |
| default is the arguments given to @code{AC_CONFIG_HEADERS}; if that |
| macro was not called, @file{config.status} ignores this variable. |
| @end defvar |
| |
| @defvar CONFIG_LINKS |
| @evindex CONFIG_LINKS |
| The symbolic links to establish. The default is the arguments given to |
| @code{AC_CONFIG_LINKS}; if that macro was not called, |
| @file{config.status} ignores this variable. |
| @end defvar |
| |
| In @ref{config.status Invocation}, using this old interface, the example |
| would be: |
| |
| @example |
| @group |
| config.h: stamp-h |
| stamp-h: config.h.in config.status |
| CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \ |
| CONFIG_HEADERS=config.h ./config.status |
| echo > stamp-h |
| |
| Makefile: Makefile.in config.status |
| CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \ |
| CONFIG_FILES=Makefile ./config.status |
| @end group |
| @end example |
| |
| @noindent |
| (If @file{configure.ac} does not call @code{AC_CONFIG_HEADERS}, there is |
| no need to set @code{CONFIG_HEADERS} in the @command{make} rules. Equally |
| for @code{CONFIG_COMMANDS}, etc.) |
| |
| |
| @node acconfig Header |
| @section @file{acconfig.h} |
| |
| @cindex @file{acconfig.h} |
| @cindex @file{config.h.top} |
| @cindex @file{config.h.bot} |
| |
| In order to produce @file{config.h.in}, @command{autoheader} needs to |
| build or to find templates for each symbol. Modern releases of Autoconf |
| use @code{AH_VERBATIM} and @code{AH_TEMPLATE} (@pxref{Autoheader |
| Macros}), but in older releases a file, @file{acconfig.h}, contained the |
| list of needed templates. @command{autoheader} copied comments and |
| @code{#define} and @code{#undef} statements from @file{acconfig.h} in |
| the current directory, if present. This file used to be mandatory if |
| you @code{AC_DEFINE} any additional symbols. |
| |
| Modern releases of Autoconf also provide @code{AH_TOP} and |
| @code{AH_BOTTOM} if you need to prepend/append some information to |
| @file{config.h.in}. Ancient versions of Autoconf had a similar feature: |
| if @file{./acconfig.h} contains the string @samp{@@TOP@@}, |
| @command{autoheader} copies the lines before the line containing |
| @samp{@@TOP@@} into the top of the file that it generates. Similarly, |
| if @file{./acconfig.h} contains the string @samp{@@BOTTOM@@}, |
| @command{autoheader} copies the lines after that line to the end of the |
| file it generates. Either or both of those strings may be omitted. An |
| even older alternate way to produce the same effect in ancient versions |
| of Autoconf is to create the files @file{@var{file}.top} (typically |
| @file{config.h.top}) and/or @file{@var{file}.bot} in the current |
| directory. If they exist, @command{autoheader} copies them to the |
| beginning and end, respectively, of its output. |
| |
| In former versions of Autoconf, the files used in preparing a software |
| package for distribution were: |
| @example |
| @group |
| configure.ac --. .------> autoconf* -----> configure |
| +---+ |
| [aclocal.m4] --+ `---. |
| [acsite.m4] ---' | |
| +--> [autoheader*] -> [config.h.in] |
| [acconfig.h] ----. | |
| +-----' |
| [config.h.top] --+ |
| [config.h.bot] --' |
| @end group |
| @end example |
| |
| Using only the @code{AH_} macros, @file{configure.ac} should be |
| self-contained, and should not depend upon @file{acconfig.h} etc. |
| |
| |
| @node autoupdate Invocation |
| @section Using @command{autoupdate} to Modernize @file{configure.ac} |
| @cindex @command{autoupdate} |
| |
| The @command{autoupdate} program updates a @file{configure.ac} file that |
| calls Autoconf macros by their old names to use the current macro names. |
| In version 2 of Autoconf, most of the macros were renamed to use a more |
| uniform and descriptive naming scheme. @xref{Macro Names}, for a |
| description of the new scheme. Although the old names still work |
| (@pxref{Obsolete Macros}, for a list of the old macros and the corresponding |
| new names), you can make your @file{configure.ac} files more readable |
| and make it easier to use the current Autoconf documentation if you |
| update them to use the new macro names. |
| |
| @evindex SIMPLE_BACKUP_SUFFIX |
| If given no arguments, @command{autoupdate} updates @file{configure.ac}, |
| backing up the original version with the suffix @file{~} (or the value |
| of the environment variable @code{SIMPLE_BACKUP_SUFFIX}, if that is |
| set). If you give @command{autoupdate} an argument, it reads that file |
| instead of @file{configure.ac} and writes the updated file to the |
| standard output. |
| |
| @noindent |
| @command{autoupdate} accepts the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Print a summary of the command line options and exit. |
| |
| @item --version |
| @itemx -V |
| Print the version number of Autoconf and exit. |
| |
| @item --verbose |
| @itemx -v |
| Report processing steps. |
| |
| @item --debug |
| @itemx -d |
| Don't remove the temporary files. |
| |
| @item --force |
| @itemx -f |
| Force the update even if the file has not changed. Disregard the cache. |
| |
| @item --include=@var{dir} |
| @itemx -I @var{dir} |
| Also look for input files in @var{dir}. Multiple invocations accumulate. |
| Directories are browsed from last to first. |
| |
| @item --prepend-include=@var{dir} |
| @itemx -B @var{dir} |
| Prepend directory @var{dir} to the search path. This is used to include |
| the language-specific files before any third-party macros. |
| @end table |
| |
| @node Obsolete Macros |
| @section Obsolete Macros |
| |
| Several macros are obsoleted in Autoconf, for various reasons (typically |
| they failed to quote properly, couldn't be extended for more recent |
| issues, etc.). They are still supported, but deprecated: their use |
| should be avoided. |
| |
| During the jump from Autoconf version 1 to version 2, most of the |
| macros were renamed to use a more uniform and descriptive naming scheme, |
| but their signature did not change. @xref{Macro Names}, for a |
| description of the new naming scheme. Below, if there is just the mapping |
| from old names to new names for these macros, the reader is invited to |
| refer to the definition of the new macro for the signature and the |
| description. |
| |
| @defmac AC_AIX |
| @acindex{AIX} |
| @cvindex _ALL_SOURCE |
| This macro is a platform-specific subset of |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). |
| @end defmac |
| |
| @defmac AC_ALLOCA |
| @acindex{ALLOCA} |
| Replaced by @code{AC_FUNC_ALLOCA} (@pxref{AC_FUNC_ALLOCA}). |
| @end defmac |
| |
| @defmac AC_ARG_ARRAY |
| @acindex{ARG_ARRAY} |
| Removed because of limited usefulness. |
| @end defmac |
| |
| @defmac AC_C_CROSS |
| @acindex{C_CROSS} |
| This macro is obsolete; it does nothing. |
| @end defmac |
| |
| @defmac AC_C_LONG_DOUBLE |
| @acindex{C_LONG_DOUBLE} |
| @cvindex HAVE_LONG_DOUBLE |
| If the C compiler supports a working @code{long double} type with more |
| range or precision than the @code{double} type, define |
| @code{HAVE_LONG_DOUBLE}. |
| |
| You should use @code{AC_TYPE_LONG_DOUBLE} or |
| @code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}. |
| @end defmac |
| |
| @defmac AC_CANONICAL_SYSTEM |
| @acindex{CANONICAL_SYSTEM} |
| Determine the system type and set output variables to the names of the |
| canonical system types. @xref{Canonicalizing}, for details about the |
| variables this macro sets. |
| |
| The user is encouraged to use either @code{AC_CANONICAL_BUILD}, or |
| @code{AC_CANONICAL_HOST}, or @code{AC_CANONICAL_TARGET}, depending on |
| the needs. Using @code{AC_CANONICAL_TARGET} is enough to run the two |
| other macros (@pxref{Canonicalizing}). |
| @end defmac |
| |
| @defmac AC_CHAR_UNSIGNED |
| @acindex{CHAR_UNSIGNED} |
| Replaced by @code{AC_C_CHAR_UNSIGNED} (@pxref{AC_C_CHAR_UNSIGNED}). |
| @end defmac |
| |
| @defmac AC_CHECK_TYPE (@var{type}, @var{default}) |
| @acindex{CHECK_TYPE} |
| Autoconf, up to 2.13, used to provide this version of |
| @code{AC_CHECK_TYPE}, deprecated because of its flaws. First, although |
| it is a member of the @code{CHECK} clan, it does |
| more than just checking. Secondly, missing types are defined |
| using @code{#define}, not @code{typedef}, and this can lead to |
| problems in the case of pointer types. |
| |
| This use of @code{AC_CHECK_TYPE} is obsolete and discouraged; see |
| @ref{Generic Types}, for the description of the current macro. |
| |
| If the type @var{type} is not defined, define it to be the C (or C++) |
| builtin type @var{default}, e.g., @samp{short int} or @samp{unsigned int}. |
| |
| This macro is equivalent to: |
| |
| @example |
| AC_CHECK_TYPE([@var{type}], [], |
| [AC_DEFINE_UNQUOTED([@var{type}], [@var{default}], |
| [Define to '@var{default}' |
| if <sys/types.h> does not define.])]) |
| @end example |
| |
| In order to keep backward compatibility, the two versions of |
| @code{AC_CHECK_TYPE} are implemented, selected using these heuristics: |
| |
| @enumerate |
| @item |
| If there are three or four arguments, the modern version is used. |
| |
| @item |
| If the second argument appears to be a C or C++ type, then the |
| obsolete version is used. This happens if the argument is a C or C++ |
| @emph{builtin} type or a C identifier ending in @samp{_t}, optionally |
| followed by one of @samp{[(* } and then by a string of zero or more |
| characters taken from the set @samp{[]()* _a-zA-Z0-9}. |
| |
| @item |
| If the second argument is spelled with the alphabet of valid C and C++ |
| types, the user is warned and the modern version is used. |
| |
| @item |
| Otherwise, the modern version is used. |
| @end enumerate |
| |
| @noindent |
| You are encouraged either to use a valid builtin type, or to use the |
| equivalent modern code (see above), or better yet, to use |
| @code{AC_CHECK_TYPES} together with |
| |
| @example |
| #ifndef HAVE_LOFF_T |
| typedef loff_t off_t; |
| #endif |
| @end example |
| @end defmac |
| @c end of AC_CHECK_TYPE |
| |
| @defmac AC_CHECKING (@var{feature-description}) |
| @acindex{CHECKING} |
| Same as |
| |
| @example |
| AC_MSG_NOTICE([checking @var{feature-description}@dots{}] |
| @end example |
| |
| @noindent |
| @xref{AC_MSG_NOTICE}. |
| @end defmac |
| |
| @defmac AC_COMPILE_CHECK (@var{echo-text}, @var{includes}, @ |
| @var{function-body}, @var{action-if-true}, @ovar{action-if-false}) |
| @acindex{COMPILE_CHECK} |
| This is an obsolete version of @code{AC_TRY_COMPILE} itself replaced by |
| @code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}), with the |
| addition that it prints @samp{checking for @var{echo-text}} to the |
| standard output first, if @var{echo-text} is non-empty. Use |
| @code{AC_MSG_CHECKING} and @code{AC_MSG_RESULT} instead to print |
| messages (@pxref{Printing Messages}). |
| @end defmac |
| |
| @defmac AC_CONST |
| @acindex{CONST} |
| Replaced by @code{AC_C_CONST} (@pxref{AC_C_CONST}). |
| @end defmac |
| |
| @defmac AC_CROSS_CHECK |
| @acindex{CROSS_CHECK} |
| Same as @code{AC_C_CROSS}, which is obsolete too, and does nothing |
| @code{:-)}. |
| @end defmac |
| |
| @defmac AC_CYGWIN |
| @acindex{CYGWIN} |
| @evindex CYGWIN |
| Check for the Cygwin environment in which case the shell variable |
| @code{CYGWIN} is set to @samp{yes}. Don't use this macro, the dignified |
| means to check the nature of the host is using @code{AC_CANONICAL_HOST} |
| (@pxref{Canonicalizing}). As a matter of fact this macro is defined as: |
| |
| @example |
| AC_REQUIRE([AC_CANONICAL_HOST])[]dnl |
| case $host_os in |
| *cygwin* ) CYGWIN=yes;; |
| * ) CYGWIN=no;; |
| esac |
| @end example |
| |
| Beware that the variable @env{CYGWIN} has a special meaning when |
| running Cygwin, and should not be changed. That's yet another reason |
| not to use this macro. |
| @end defmac |
| |
| @defmac AC_DECL_SYS_SIGLIST |
| @acindex{DECL_SYS_SIGLIST} |
| @cvindex SYS_SIGLIST_DECLARED |
| Same as: |
| |
| @example |
| AC_CHECK_DECLS([sys_siglist], [], [], |
| [#include <signal.h> |
| /* NetBSD declares sys_siglist in unistd.h. */ |
| #ifdef HAVE_UNISTD_H |
| # include <unistd.h> |
| #endif |
| ]) |
| @end example |
| |
| @noindent |
| @xref{AC_CHECK_DECLS}. |
| @end defmac |
| |
| @defmac AC_DECL_YYTEXT |
| @acindex{DECL_YYTEXT} |
| Does nothing, now integrated in @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}). |
| @end defmac |
| |
| @defmac AC_DIAGNOSE (@var{category}, @var{message}) |
| @acindex{DIAGNOSE} |
| Replaced by @code{m4_warn} (@pxref{m4_warn}). |
| @end defmac |
| |
| @defmac AC_DIR_HEADER |
| @acindex{DIR_HEADER} |
| @cvindex DIRENT |
| @cvindex SYSNDIR |
| @cvindex SYSDIR |
| @cvindex NDIR |
| Like calling @code{AC_FUNC_CLOSEDIR_VOID} |
| (@pxref{AC_FUNC_CLOSEDIR_VOID}) and @code{AC_HEADER_DIRENT} |
| (@pxref{AC_HEADER_DIRENT}), |
| but defines a different set of C preprocessor macros to indicate which |
| header file is found: |
| |
| @multitable {@file{sys/ndir.h}} {Old Symbol} {@code{HAVE_SYS_NDIR_H}} |
| @item Header @tab Old Symbol @tab New Symbol |
| @item @file{dirent.h} @tab @code{DIRENT} @tab @code{HAVE_DIRENT_H} |
| @item @file{sys/ndir.h} @tab @code{SYSNDIR} @tab @code{HAVE_SYS_NDIR_H} |
| @item @file{sys/dir.h} @tab @code{SYSDIR} @tab @code{HAVE_SYS_DIR_H} |
| @item @file{ndir.h} @tab @code{NDIR} @tab @code{HAVE_NDIR_H} |
| @end multitable |
| @end defmac |
| |
| @defmac AC_DYNIX_SEQ |
| @acindex{DYNIX_SEQ} |
| If on DYNIX/ptx, add @option{-lseq} to output variable |
| @code{LIBS}. This macro used to be defined as |
| |
| @example |
| AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"]) |
| @end example |
| |
| @noindent |
| now it is just @code{AC_FUNC_GETMNTENT} (@pxref{AC_FUNC_GETMNTENT}). |
| @end defmac |
| |
| @defmac AC_EXEEXT |
| @acindex{EXEEXT} |
| @ovindex EXEEXT |
| Defined the output variable @code{EXEEXT} based on the output of the |
| compiler, which is now done automatically. Typically set to empty |
| string if POSIX and @samp{.exe} if a DOS variant. |
| @end defmac |
| |
| @defmac AC_EMXOS2 |
| @acindex{EMXOS2} |
| Similar to @code{AC_CYGWIN} but checks for the EMX environment on OS/2 |
| and sets @code{EMXOS2}. Don't use this macro, the dignified means to |
| check the nature of the host is using @code{AC_CANONICAL_HOST} |
| (@pxref{Canonicalizing}). |
| @end defmac |
| |
| @defmac AC_ENABLE (@var{feature}, @var{action-if-given}, @ |
| @ovar{action-if-not-given}) |
| @acindex{ENABLE} |
| This is an obsolete version of @code{AC_ARG_ENABLE} that does not |
| support providing a help string (@pxref{AC_ARG_ENABLE}). |
| @end defmac |
| |
| @defmac AC_ERROR |
| @acindex{ERROR} |
| Replaced by @code{AC_MSG_ERROR} (@pxref{AC_MSG_ERROR}). |
| @end defmac |
| |
| @defmac AC_FATAL (@var{message}) |
| @acindex{FATAL} |
| Replaced by @code{m4_fatal} (@pxref{m4_fatal}). |
| @end defmac |
| |
| @defmac AC_FIND_X |
| @acindex{FIND_X} |
| Replaced by @code{AC_PATH_X} (@pxref{AC_PATH_X}). |
| @end defmac |
| |
| @defmac AC_FIND_XTRA |
| @acindex{FIND_XTRA} |
| Replaced by @code{AC_PATH_XTRA} (@pxref{AC_PATH_XTRA}). |
| @end defmac |
| |
| @defmac AC_FOREACH |
| @acindex{FOREACH} |
| Replaced by @code{m4_foreach_w} (@pxref{m4_foreach_w}). |
| @end defmac |
| |
| @defmac AC_FUNC_CHECK |
| @acindex{FUNC_CHECK} |
| Replaced by @code{AC_CHECK_FUNC} (@pxref{AC_CHECK_FUNC}). |
| @end defmac |
| |
| @anchor{AC_FUNC_SETVBUF_REVERSED} |
| @defmac AC_FUNC_SETVBUF_REVERSED |
| @acindex{FUNC_SETVBUF_REVERSED} |
| @cvindex SETVBUF_REVERSED |
| @c @fuindex setvbuf |
| @prindex @code{setvbuf} |
| Do nothing. Formerly, this macro checked whether @code{setvbuf} takes |
| the buffering type as its second argument and the buffer pointer as the |
| third, instead of the other way around, and defined |
| @code{SETVBUF_REVERSED}. However, the last systems to have the problem |
| were those based on SVR2, which became obsolete in 1987, and the macro |
| is no longer needed. |
| @end defmac |
| |
| @defmac AC_FUNC_WAIT3 |
| @acindex{FUNC_WAIT3} |
| @cvindex HAVE_WAIT3 |
| @c @fuindex wait3 |
| @prindex @code{wait3} |
| If @code{wait3} is found and fills in the contents of its third argument |
| (a @samp{struct rusage *}), which HP-UX does not do, define |
| @code{HAVE_WAIT3}. |
| |
| These days portable programs should use @code{waitpid}, not |
| @code{wait3}, as @code{wait3} has been removed from POSIX. |
| @end defmac |
| |
| @defmac AC_GCC_TRADITIONAL |
| @acindex{GCC_TRADITIONAL} |
| Replaced by @code{AC_PROG_GCC_TRADITIONAL} (@pxref{AC_PROG_GCC_TRADITIONAL}), |
| which is itself obsolete. |
| @end defmac |
| |
| @defmac AC_GETGROUPS_T |
| @acindex{GETGROUPS_T} |
| Replaced by @code{AC_TYPE_GETGROUPS} (@pxref{AC_TYPE_GETGROUPS}). |
| @end defmac |
| |
| @defmac AC_GETLOADAVG |
| @acindex{GETLOADAVG} |
| Replaced by @code{AC_FUNC_GETLOADAVG} (@pxref{AC_FUNC_GETLOADAVG}). |
| @end defmac |
| |
| @defmac AC_GNU_SOURCE |
| @acindex{GNU_SOURCE} |
| @cvindex _GNU_SOURCE |
| This macro is a platform-specific subset of |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). |
| @end defmac |
| |
| @defmac AC_HAVE_FUNCS |
| @acindex{HAVE_FUNCS} |
| Replaced by @code{AC_CHECK_FUNCS} (@pxref{AC_CHECK_FUNCS}). |
| @end defmac |
| |
| @defmac AC_HAVE_HEADERS |
| @acindex{HAVE_HEADERS} |
| Replaced by @code{AC_CHECK_HEADERS} (@pxref{AC_CHECK_HEADERS}). |
| @end defmac |
| |
| @defmac AC_HAVE_LIBRARY (@var{library}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}, @ovar{other-libraries}) |
| @acindex{HAVE_LIBRARY} |
| This macro is equivalent to calling @code{AC_CHECK_LIB} with a |
| @var{function} argument of @code{main}. In addition, @var{library} can |
| be written as any of @samp{foo}, @option{-lfoo}, or @samp{libfoo.a}. In |
| all of those cases, the compiler is passed @option{-lfoo}. However, |
| @var{library} cannot be a shell variable; it must be a literal name. |
| @xref{AC_CHECK_LIB}. |
| @end defmac |
| |
| @defmac AC_HAVE_POUNDBANG |
| @acindex{HAVE_POUNDBANG} |
| Replaced by @code{AC_SYS_INTERPRETER} (@pxref{AC_SYS_INTERPRETER}). |
| @end defmac |
| |
| @defmac AC_HEADER_CHECK |
| @acindex{HEADER_CHECK} |
| Replaced by @code{AC_CHECK_HEADER} (@pxref{AC_CHECK_HEADER}). |
| @end defmac |
| |
| @defmac AC_HEADER_EGREP |
| @acindex{HEADER_EGREP} |
| Replaced by @code{AC_EGREP_HEADER} (@pxref{AC_EGREP_HEADER}). |
| @end defmac |
| |
| @anchor{AC_HEADER_TIME} |
| @defmac AC_HEADER_TIME |
| @acindex{HEADER_TIME} |
| @cvindex TIME_WITH_SYS_TIME |
| @hdrindex{time.h} |
| @hdrindex{sys/time.h} |
| @caindex header_time |
| This macro used to check whether it was possible to include |
| @file{time.h} and @file{sys/time.h} in the same source file, |
| defining @code{TIME_WITH_SYS_TIME} if so. |
| |
| Nowadays, it is equivalent to @samp{AC_CHECK_HEADERS([sys/time.h])}, |
| although it does still define @code{TIME_WITH_SYS_TIME} for |
| compatibility's sake. @file{time.h} is universally present, and the |
| systems on which @file{sys/time.h} conflicted with @file{time.h} are |
| obsolete. |
| @end defmac |
| |
| @defmac AC_HELP_STRING |
| @acindex{HELP_STRING} |
| Replaced by @code{AS_HELP_STRING} (@pxref{AS_HELP_STRING}). |
| @end defmac |
| |
| @defmac AC_INIT (@var{unique-file-in-source-dir}) |
| @acindex{INIT} |
| Formerly @code{AC_INIT} used to have a single argument, and was |
| equivalent to: |
| |
| @example |
| AC_INIT |
| AC_CONFIG_SRCDIR(@var{unique-file-in-source-dir}) |
| @end example |
| See @ref{AC_INIT} and @ref{AC_CONFIG_SRCDIR}. |
| @end defmac |
| |
| @defmac AC_INLINE |
| @acindex{INLINE} |
| Replaced by @code{AC_C_INLINE} (@pxref{AC_C_INLINE}). |
| @end defmac |
| |
| @defmac AC_INT_16_BITS |
| @acindex{INT_16_BITS} |
| @cvindex INT_16_BITS |
| If the C type @code{int} is 16 bits wide, define @code{INT_16_BITS}. |
| Use @samp{AC_CHECK_SIZEOF(int)} instead (@pxref{AC_CHECK_SIZEOF}). |
| @end defmac |
| |
| @defmac AC_IRIX_SUN |
| @acindex{IRIX_SUN} |
| If on IRIX (Silicon Graphics Unix), add @option{-lsun} to output |
| @code{LIBS}. If you were using it to get @code{getmntent}, use |
| @code{AC_FUNC_GETMNTENT} instead. If you used it for the NIS versions |
| of the password and group functions, use @samp{AC_CHECK_LIB(sun, |
| getpwnam)}. Up to Autoconf 2.13, it used to be |
| |
| @example |
| AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"]) |
| @end example |
| |
| @noindent |
| now it is defined as |
| |
| @example |
| AC_FUNC_GETMNTENT |
| AC_CHECK_LIB([sun], [getpwnam]) |
| @end example |
| |
| @noindent |
| See @ref{AC_FUNC_GETMNTENT} and @ref{AC_CHECK_LIB}. |
| @end defmac |
| |
| @defmac AC_ISC_POSIX |
| @acindex{ISC_POSIX} |
| @ovindex LIBS |
| This macro adds @option{-lcposix} to output variable @code{LIBS} if |
| necessary for POSIX facilities. Sun dropped support for the obsolete |
| INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs |
| need not use this macro. It is implemented as |
| @code{AC_SEARCH_LIBS([strerror], [cposix])} (@pxref{AC_SEARCH_LIBS}). |
| @end defmac |
| |
| @defmac AC_LANG_C |
| @acindex{LANG_C} |
| Same as @samp{AC_LANG([C])} (@pxref{AC_LANG}). |
| @end defmac |
| |
| @defmac AC_LANG_CPLUSPLUS |
| @acindex{LANG_CPLUSPLUS} |
| Same as @samp{AC_LANG([C++])} (@pxref{AC_LANG}). |
| @end defmac |
| |
| @defmac AC_LANG_FORTRAN77 |
| @acindex{LANG_FORTRAN77} |
| Same as @samp{AC_LANG([Fortran 77])} (@pxref{AC_LANG}). |
| @end defmac |
| |
| @defmac AC_LANG_RESTORE |
| @acindex{LANG_RESTORE} |
| Select the @var{language} that is saved on the top of the stack, as set |
| by @code{AC_LANG_SAVE}, remove it from the stack, and call |
| @code{AC_LANG(@var{language})}. @xref{Language Choice}, for the |
| preferred way to change languages. |
| @end defmac |
| |
| @defmac AC_LANG_SAVE |
| @acindex{LANG_SAVE} |
| Remember the current language (as set by @code{AC_LANG}) on a stack. |
| The current language does not change. @code{AC_LANG_PUSH} is preferred |
| (@pxref{AC_LANG_PUSH}). |
| @end defmac |
| |
| @defmac AC_LINK_FILES (@var{source}@dots{}, @var{dest}@dots{}) |
| @acindex{LINK_FILES} |
| This is an obsolete version of @code{AC_CONFIG_LINKS} |
| (@pxref{AC_CONFIG_LINKS}. An updated version of: |
| |
| @example |
| AC_LINK_FILES(config/$machine.h config/$obj_format.h, |
| host.h object.h) |
| @end example |
| |
| @noindent |
| is: |
| |
| @example |
| AC_CONFIG_LINKS([host.h:config/$machine.h |
| object.h:config/$obj_format.h]) |
| @end example |
| @end defmac |
| |
| @defmac AC_LN_S |
| @acindex{LN_S} |
| Replaced by @code{AC_PROG_LN_S} (@pxref{AC_PROG_LN_S}). |
| @end defmac |
| |
| @defmac AC_LONG_64_BITS |
| @acindex{LONG_64_BITS} |
| @cvindex LONG_64_BITS |
| Define @code{LONG_64_BITS} if the C type @code{long int} is 64 bits wide. |
| Use the generic macro @samp{AC_CHECK_SIZEOF([long int])} instead |
| (@pxref{AC_CHECK_SIZEOF}). |
| @end defmac |
| |
| @defmac AC_LONG_DOUBLE |
| @acindex{LONG_DOUBLE} |
| If the C compiler supports a working @code{long double} type with more |
| range or precision than the @code{double} type, define |
| @code{HAVE_LONG_DOUBLE}. |
| |
| You should use @code{AC_TYPE_LONG_DOUBLE} or |
| @code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}. |
| @end defmac |
| |
| @defmac AC_LONG_FILE_NAMES |
| @acindex{LONG_FILE_NAMES} |
| Replaced by |
| @example |
| AC_SYS_LONG_FILE_NAMES |
| @end example |
| @noindent |
| @xref{AC_SYS_LONG_FILE_NAMES}. |
| @end defmac |
| |
| @defmac AC_MAJOR_HEADER |
| @acindex{MAJOR_HEADER} |
| Replaced by @code{AC_HEADER_MAJOR} (@pxref{AC_HEADER_MAJOR}). |
| @end defmac |
| |
| @defmac AC_MEMORY_H |
| @acindex{MEMORY_H} |
| @cvindex NEED_MEMORY_H |
| Used to define @code{NEED_MEMORY_H} if the @code{mem} functions were |
| defined in @file{memory.h}. Today it is equivalent to |
| @samp{AC_CHECK_HEADERS([memory.h])} (@pxref{AC_CHECK_HEADERS}). Adjust |
| your code to get the @code{mem} functions from @file{string.h} instead. |
| @end defmac |
| |
| @defmac AC_MINGW32 |
| @acindex{MINGW32} |
| Similar to @code{AC_CYGWIN} but checks for the MinGW compiler |
| environment and sets @code{MINGW32}. Don't use this macro, the |
| dignified means to check the nature of the host is using |
| @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}). |
| @end defmac |
| |
| @defmac AC_MINIX |
| @acindex{MINIX} |
| @cvindex _MINIX |
| @cvindex _POSIX_SOURCE |
| @cvindex _POSIX_1_SOURCE |
| This macro is a platform-specific subset of |
| @code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}). |
| @end defmac |
| |
| @defmac AC_MINUS_C_MINUS_O |
| @acindex{MINUS_C_MINUS_O} |
| Replaced by @code{AC_PROG_CC_C_O} (@pxref{AC_PROG_CC_C_O}). |
| @end defmac |
| |
| @defmac AC_MMAP |
| @acindex{MMAP} |
| Replaced by @code{AC_FUNC_MMAP} (@pxref{AC_FUNC_MMAP}). |
| @end defmac |
| |
| @defmac AC_MODE_T |
| @acindex{MODE_T} |
| Replaced by @code{AC_TYPE_MODE_T} (@pxref{AC_TYPE_MODE_T}). |
| @end defmac |
| |
| @defmac AC_OBJEXT |
| @acindex{OBJEXT} |
| @ovindex OBJEXT |
| Defined the output variable @code{OBJEXT} based on the output of the |
| compiler, after .c files have been excluded. Typically set to @samp{o} |
| if POSIX, @samp{obj} if a DOS variant. |
| Now the compiler checking macros handle |
| this automatically. |
| @end defmac |
| |
| @defmac AC_OBSOLETE (@var{this-macro-name}, @ovar{suggestion}) |
| @acindex{OBSOLETE} |
| Make M4 print a message to the standard error output warning that |
| @var{this-macro-name} is obsolete, and giving the file and line number |
| where it was called. @var{this-macro-name} should be the name of the |
| macro that is calling @code{AC_OBSOLETE}. If @var{suggestion} is given, |
| it is printed at the end of the warning message; for example, it can be |
| a suggestion for what to use instead of @var{this-macro-name}. |
| |
| For instance |
| |
| @example |
| AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl |
| @end example |
| |
| @noindent |
| You are encouraged to use @code{AU_DEFUN} instead, since it gives better |
| services to the user (@pxref{AU_DEFUN}). |
| @end defmac |
| |
| @defmac AC_OFF_T |
| @acindex{OFF_T} |
| Replaced by @code{AC_TYPE_OFF_T} (@pxref{AC_TYPE_OFF_T}). |
| @end defmac |
| |
| @defmac AC_OUTPUT (@ovar{file}@dots{}, @ovar{extra-cmds}, @ovar{init-cmds}) |
| @acindex{OUTPUT} |
| The use of @code{AC_OUTPUT} with arguments is deprecated. This obsoleted |
| interface is equivalent to: |
| |
| @example |
| @group |
| AC_CONFIG_FILES(@var{file}@dots{}) |
| AC_CONFIG_COMMANDS([default], |
| @var{extra-cmds}, @var{init-cmds}) |
| AC_OUTPUT |
| @end group |
| @end example |
| |
| @noindent |
| See @ref{AC_CONFIG_FILES}, @ref{AC_CONFIG_COMMANDS}, and @ref{AC_OUTPUT}. |
| @end defmac |
| |
| @defmac AC_OUTPUT_COMMANDS (@var{extra-cmds}, @ovar{init-cmds}) |
| @acindex{OUTPUT_COMMANDS} |
| Specify additional shell commands to run at the end of |
| @file{config.status}, and shell commands to initialize any variables |
| from @command{configure}. This macro may be called multiple times. It is |
| obsolete, replaced by @code{AC_CONFIG_COMMANDS} (@pxref{AC_CONFIG_COMMANDS}). |
| |
| Here is an unrealistic example: |
| |
| @example |
| fubar=27 |
| AC_OUTPUT_COMMANDS( |
| [AS_ECHO(["this is extra $fubar, and so on."])], |
| [fubar=$fubar]) |
| AC_OUTPUT_COMMANDS( |
| [AS_ECHO(["this is another, extra, bit"])], |
| [AS_ECHO(["init bit"])]) |
| @end example |
| |
| Aside from the fact that @code{AC_CONFIG_COMMANDS} requires an |
| additional key, an important difference is that |
| @code{AC_OUTPUT_COMMANDS} is quoting its arguments twice, unlike |
| @code{AC_CONFIG_COMMANDS}. This means that @code{AC_CONFIG_COMMANDS} |
| can safely be given macro calls as arguments: |
| |
| @example |
| AC_CONFIG_COMMANDS(foo, [my_FOO()]) |
| @end example |
| |
| @noindent |
| Conversely, where one level of quoting was enough for literal strings |
| with @code{AC_OUTPUT_COMMANDS}, you need two with |
| @code{AC_CONFIG_COMMANDS}. The following lines are equivalent: |
| |
| @example |
| @group |
| AC_OUTPUT_COMMANDS([echo "Square brackets: []"]) |
| AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]]) |
| @end group |
| @end example |
| @end defmac |
| |
| @defmac AC_PID_T |
| @acindex{PID_T} |
| Replaced by @code{AC_TYPE_PID_T} (@pxref{AC_TYPE_PID_T}). |
| @end defmac |
| |
| @defmac AC_PREFIX |
| @acindex{PREFIX} |
| Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}). |
| @end defmac |
| |
| @defmac AC_PROG_CC_C89 |
| @acindex{PROG_CC_C89} |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). |
| @end defmac |
| |
| @defmac AC_PROG_CC_C99 |
| @acindex{PROG_CC_C99} |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). |
| @end defmac |
| |
| @defmac AC_PROG_CC_STDC |
| @acindex{PROG_CC_STDC} |
| Now done by @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). |
| @end defmac |
| |
| @anchor{AC_PROG_GCC_TRADITIONAL} |
| @defmac AC_PROG_GCC_TRADITIONAL |
| @acindex{PROG_GCC_TRADITIONAL} |
| Used to put GCC into ``traditional'' (pre-ISO C) compilation mode, |
| on systems with headers that did not work correctly with a |
| standard-compliant compiler. GCC has not supported traditional |
| compilation in many years, and all of the systems that required this are |
| long obsolete themselves. This macro is now a compatibility synonym for |
| @code{AC_PROG_CC} (@pxref{AC_PROG_CC}). |
| |
| @end defmac |
| |
| @defmac AC_PROGRAMS_CHECK |
| @acindex{PROGRAMS_CHECK} |
| Replaced by @code{AC_CHECK_PROGS} (@pxref{AC_CHECK_PROGS}). |
| @end defmac |
| |
| @defmac AC_PROGRAMS_PATH |
| @acindex{PROGRAMS_PATH} |
| Replaced by @code{AC_PATH_PROGS} (@pxref{AC_PATH_PROGS}). |
| @end defmac |
| |
| @defmac AC_PROGRAM_CHECK |
| @acindex{PROGRAM_CHECK} |
| Replaced by @code{AC_CHECK_PROG} (@pxref{AC_CHECK_PROG}). |
| @end defmac |
| |
| @defmac AC_PROGRAM_EGREP |
| @acindex{PROGRAM_EGREP} |
| Replaced by @code{AC_EGREP_CPP} (@pxref{AC_EGREP_CPP}). |
| @end defmac |
| |
| @defmac AC_PROGRAM_PATH |
| @acindex{PROGRAM_PATH} |
| Replaced by @code{AC_PATH_PROG} (@pxref{AC_PATH_PROG}). |
| @end defmac |
| |
| @defmac AC_REMOTE_TAPE |
| @acindex{REMOTE_TAPE} |
| Removed because of limited usefulness. |
| @end defmac |
| |
| @defmac AC_RESTARTABLE_SYSCALLS |
| @acindex{RESTARTABLE_SYSCALLS} |
| This macro was renamed @code{AC_SYS_RESTARTABLE_SYSCALLS}. However, |
| these days portable programs should use @code{sigaction} with |
| @code{SA_RESTART} if they want restartable system calls. They should |
| not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a |
| system call is restartable is a dynamic issue, not a configuration-time |
| issue. |
| @end defmac |
| |
| @defmac AC_RETSIGTYPE |
| @acindex{RETSIGTYPE} |
| Replaced by @code{AC_TYPE_SIGNAL} (@pxref{AC_TYPE_SIGNAL}), which itself |
| is obsolete. |
| @end defmac |
| |
| @defmac AC_RSH |
| @acindex{RSH} |
| Removed because of limited usefulness. |
| @end defmac |
| |
| @defmac AC_SCO_INTL |
| @acindex{SCO_INTL} |
| @ovindex LIBS |
| Equivalent to the obsolescent macro @code{AC_FUNC_STRFTIME}. |
| @xref{AC_FUNC_STRFTIME}. |
| @end defmac |
| |
| @defmac AC_SETVBUF_REVERSED |
| @acindex{SETVBUF_REVERSED} |
| Replaced by |
| @example |
| AC_FUNC_SETVBUF_REVERSED |
| @end example |
| @noindent |
| @xref{AC_FUNC_SETVBUF_REVERSED}. |
| @end defmac |
| |
| @defmac AC_SET_MAKE |
| @acindex{SET_MAKE} |
| Replaced by @code{AC_PROG_MAKE_SET} (@pxref{AC_PROG_MAKE_SET}). |
| @end defmac |
| |
| @defmac AC_SIZEOF_TYPE |
| @acindex{SIZEOF_TYPE} |
| Replaced by @code{AC_CHECK_SIZEOF} (@pxref{AC_CHECK_SIZEOF}). |
| @end defmac |
| |
| @defmac AC_SIZE_T |
| @acindex{SIZE_T} |
| Replaced by @code{AC_TYPE_SIZE_T} (@pxref{AC_TYPE_SIZE_T}). |
| @end defmac |
| |
| @defmac AC_STAT_MACROS_BROKEN |
| @acindex{STAT_MACROS_BROKEN} |
| Replaced by @code{AC_HEADER_STAT} (@pxref{AC_HEADER_STAT}). |
| @end defmac |
| |
| @defmac AC_STDC_HEADERS |
| @acindex{STDC_HEADERS} |
| Replaced by @code{AC_HEADER_STDC} (@pxref{AC_HEADER_STDC}), which |
| is itself obsolete. Nowadays it is safe to assume the facilities of C89 |
| exist. |
| @end defmac |
| |
| @defmac AC_STRCOLL |
| @acindex{STRCOLL} |
| Replaced by @code{AC_FUNC_STRCOLL} (@pxref{AC_FUNC_STRCOLL}). |
| @end defmac |
| |
| @defmac AC_STRUCT_ST_BLKSIZE |
| @acindex{STRUCT_ST_BLKSIZE} |
| @cvindex HAVE_STRUCT_STAT_ST_BLKSIZE |
| @cvindex HAVE_ST_BLKSIZE |
| If @code{struct stat} contains an @code{st_blksize} member, define |
| @code{HAVE_STRUCT_STAT_ST_BLKSIZE}. The former name, |
| @code{HAVE_ST_BLKSIZE} is to be avoided, as its support will cease in |
| the future. This macro is obsoleted, and should be replaced by |
| |
| @example |
| AC_CHECK_MEMBERS([struct stat.st_blksize]) |
| @end example |
| @noindent |
| @xref{AC_CHECK_MEMBERS}. |
| @end defmac |
| |
| @defmac AC_STRUCT_ST_RDEV |
| @acindex{STRUCT_ST_RDEV} |
| @cvindex HAVE_ST_RDEV |
| @cvindex HAVE_STRUCT_STAT_ST_RDEV |
| If @code{struct stat} contains an @code{st_rdev} member, define |
| @code{HAVE_STRUCT_STAT_ST_RDEV}. The former name for this macro, |
| @code{HAVE_ST_RDEV}, is to be avoided as it will cease to be supported |
| in the future. Actually, even the new macro is obsolete and should be |
| replaced by: |
| @example |
| AC_CHECK_MEMBERS([struct stat.st_rdev]) |
| @end example |
| @noindent |
| @xref{AC_CHECK_MEMBERS}. |
| @end defmac |
| |
| @defmac AC_ST_BLKSIZE |
| @acindex{ST_BLKSIZE} |
| Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}). |
| @end defmac |
| |
| @defmac AC_ST_BLOCKS |
| @acindex{ST_BLOCKS} |
| Replaced by @code{AC_STRUCT_ST_BLOCKS} (@pxref{AC_STRUCT_ST_BLOCKS}). |
| @end defmac |
| |
| @defmac AC_ST_RDEV |
| @acindex{ST_RDEV} |
| Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}). |
| @end defmac |
| |
| @defmac AC_SYS_RESTARTABLE_SYSCALLS |
| @acindex{SYS_RESTARTABLE_SYSCALLS} |
| @cvindex HAVE_RESTARTABLE_SYSCALLS |
| If the system automatically restarts a system call that is interrupted |
| by a signal, define @code{HAVE_RESTARTABLE_SYSCALLS}. This macro does |
| not check whether system calls are restarted in general---it checks whether a |
| signal handler installed with @code{signal} (but not @code{sigaction}) |
| causes system calls to be restarted. It does not check whether system calls |
| can be restarted when interrupted by signals that have no handler. |
| |
| These days portable programs should use @code{sigaction} with |
| @code{SA_RESTART} if they want restartable system calls. They should |
| not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a |
| system call is restartable is a dynamic issue, not a configuration-time |
| issue. |
| @end defmac |
| |
| @defmac AC_SYS_SIGLIST_DECLARED |
| @acindex{SYS_SIGLIST_DECLARED} |
| This macro was renamed @code{AC_DECL_SYS_SIGLIST}. However, even that |
| name is obsolete, as the same functionality is now achieved via |
| @code{AC_CHECK_DECLS} (@pxref{AC_CHECK_DECLS}). |
| @end defmac |
| |
| @defmac AC_TEST_CPP |
| @acindex{TEST_CPP} |
| This macro was renamed @code{AC_TRY_CPP}, which in turn was replaced by |
| @code{AC_PREPROC_IFELSE} (@pxref{AC_PREPROC_IFELSE}). |
| @end defmac |
| |
| @defmac AC_TEST_PROGRAM |
| @acindex{TEST_PROGRAM} |
| This macro was renamed @code{AC_TRY_RUN}, which in turn was replaced by |
| @code{AC_RUN_IFELSE} (@pxref{AC_RUN_IFELSE}). |
| @end defmac |
| |
| @defmac AC_TIMEZONE |
| @acindex{TIMEZONE} |
| Replaced by @code{AC_STRUCT_TIMEZONE} (@pxref{AC_STRUCT_TIMEZONE}). |
| @end defmac |
| |
| @defmac AC_TIME_WITH_SYS_TIME |
| @acindex{TIME_WITH_SYS_TIME} |
| Replaced by @code{AC_HEADER_TIME} (@pxref{AC_HEADER_TIME}), which is |
| itself obsolete; nowadays one need only do |
| @samp{AC_CHECK_HEADERS([sys/time.h])}. |
| @end defmac |
| |
| @defmac AC_TRY_COMPILE (@var{includes}, @var{function-body}, @ |
| @ovar{action-if-true}, @ovar{action-if-false}) |
| @acindex{TRY_COMPILE} |
| Same as: |
| |
| @example |
| AC_COMPILE_IFELSE( |
| [AC_LANG_PROGRAM([[@var{includes}]], |
| [[@var{function-body}]])], |
| [@var{action-if-true}], |
| [@var{action-if-false}]) |
| @end example |
| |
| @noindent |
| @xref{Running the Compiler}. |
| |
| This macro double quotes both @var{includes} and @var{function-body}. |
| |
| For C and C++, @var{includes} is any @code{#include} statements needed |
| by the code in @var{function-body} (@var{includes} is ignored if |
| the currently selected language is Fortran or Fortran 77). The compiler |
| and compilation flags are determined by the current language |
| (@pxref{Language Choice}). |
| @end defmac |
| |
| @defmac AC_TRY_CPP (@var{input}, @ovar{action-if-true}, @ovar{action-if-false}) |
| @acindex{TRY_CPP} |
| Same as: |
| |
| @example |
| AC_PREPROC_IFELSE( |
| [AC_LANG_SOURCE([[@var{input}]])], |
| [@var{action-if-true}], |
| [@var{action-if-false}]) |
| @end example |
| |
| @noindent |
| @xref{Running the Preprocessor}. |
| |
| This macro double quotes the @var{input}. |
| @end defmac |
| |
| @defmac AC_TRY_LINK (@var{includes}, @var{function-body}, @ |
| @ovar{action-if-true}, @ovar{action-if-false}) |
| @acindex{TRY_LINK} |
| Same as: |
| |
| @example |
| AC_LINK_IFELSE( |
| [AC_LANG_PROGRAM([[@var{includes}]], |
| [[@var{function-body}]])], |
| [@var{action-if-true}], |
| [@var{action-if-false}]) |
| @end example |
| |
| @noindent |
| @xref{Running the Linker}. |
| |
| This macro double quotes both @var{includes} and @var{function-body}. |
| |
| Depending on the current language (@pxref{Language Choice}), create a |
| test program to see whether a function whose body consists of |
| @var{function-body} can be compiled and linked. If the file compiles |
| and links successfully, run shell commands @var{action-if-found}, |
| otherwise run @var{action-if-not-found}. |
| |
| This macro double quotes both @var{includes} and @var{function-body}. |
| |
| For C and C++, @var{includes} is any @code{#include} statements needed |
| by the code in @var{function-body} (@var{includes} is ignored if |
| the currently selected language is Fortran or Fortran 77). The compiler |
| and compilation flags are determined by the current language |
| (@pxref{Language Choice}), and in addition @code{LDFLAGS} and |
| @code{LIBS} are used for linking. |
| @end defmac |
| |
| @defmac AC_TRY_LINK_FUNC (@var{function}, @ovar{action-if-found}, @ |
| @ovar{action-if-not-found}) |
| @acindex{TRY_LINK_FUNC} |
| This macro is equivalent to |
| @example |
| AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])], |
| [@var{action-if-found}], [@var{action-if-not-found}]) |
| @end example |
| @noindent |
| @xref{Running the Linker}. |
| @end defmac |
| |
| @defmac AC_TRY_RUN (@var{program}, @ovar{action-if-true}, @ |
| @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE}) |
| @acindex{TRY_RUN} |
| Same as: |
| |
| @example |
| AC_RUN_IFELSE( |
| [AC_LANG_SOURCE([[@var{program}]])], |
| [@var{action-if-true}], |
| [@var{action-if-false}], |
| [@var{action-if-cross-compiling}]) |
| @end example |
| |
| @noindent |
| @xref{Runtime}. |
| @end defmac |
| |
| @anchor{AC_TYPE_SIGNAL} |
| @defmac AC_TYPE_SIGNAL |
| @acindex{TYPE_SIGNAL} |
| @cvindex RETSIGTYPE |
| @hdrindex{signal.h} |
| If @file{signal.h} declares @code{signal} as returning a pointer to a |
| function returning @code{void}, define @code{RETSIGTYPE} to be |
| @code{void}; otherwise, define it to be @code{int}. These days, it is |
| portable to assume C89, and that signal handlers return @code{void}, |
| without needing to use this macro or @code{RETSIGTYPE}. |
| @end defmac |
| |
| @defmac AC_UID_T |
| @acindex{UID_T} |
| Replaced by @code{AC_TYPE_UID_T} (@pxref{AC_TYPE_UID_T}). |
| @end defmac |
| |
| @defmac AC_UNISTD_H |
| @acindex{UNISTD_H} |
| Same as @samp{AC_CHECK_HEADERS([unistd.h])} (@pxref{AC_CHECK_HEADERS}), |
| which is one of the tests done as a side effect by |
| @code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), so usually |
| unnecessary to write explicitly. |
| @end defmac |
| |
| @defmac AC_USG |
| @acindex{USG} |
| @cvindex USG |
| Define @code{USG} if the BSD string functions (@code{bcopy}, |
| @code{bzero}, @code{index}, @code{rindex}, etc) are @emph{not} defined |
| in @file{strings.h}. Modern code should assume @file{string.h} exists |
| and should use the standard C string functions (@code{memmove}, @code{memset}, |
| @code{strchr}, @code{strrchr}, etc) unconditionally. |
| |
| @file{strings.h} may be the only header that declares @code{strcasecmp}, |
| @code{strncasecmp}, and @code{ffs}. @code{AC_INCLUDES_DEFAULT} checks |
| for it (@pxref{Default Includes}); test @code{HAVE_STRINGS_H}. |
| @end defmac |
| |
| @defmac AC_UTIME_NULL |
| @acindex{UTIME_NULL} |
| Replaced by @code{AC_FUNC_UTIME_NULL} (@pxref{AC_FUNC_UTIME_NULL}). |
| @end defmac |
| |
| @defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@ovar{cmd}) |
| @acindex{VALIDATE_CACHED_SYSTEM_TUPLE} |
| If the cache file is inconsistent with the current host, target and |
| build system types, it used to execute @var{cmd} or print a default |
| error message. This is now handled by default. |
| @end defmac |
| |
| @defmac AC_VERBOSE (@var{result-description}) |
| @acindex{VERBOSE} |
| Replaced by @code{AC_MSG_RESULT} (@pxref{AC_MSG_RESULT}). |
| @end defmac |
| |
| @defmac AC_VFORK |
| @acindex{VFORK} |
| Replaced by @code{AC_FUNC_FORK} (@pxref{AC_FUNC_FORK}). |
| @end defmac |
| |
| @defmac AC_VPRINTF |
| @acindex{VPRINTF} |
| Replaced by @code{AC_FUNC_VPRINTF} (@pxref{AC_FUNC_VPRINTF}). |
| @end defmac |
| |
| @defmac AC_WAIT3 |
| @acindex{WAIT3} |
| This macro was renamed @code{AC_FUNC_WAIT3}. However, these days |
| portable programs should use @code{waitpid}, not @code{wait3}, as |
| @code{wait3} has been removed from POSIX. |
| @end defmac |
| |
| @defmac AC_WARN |
| @acindex{WARN} |
| Replaced by @code{AC_MSG_WARN} (@pxref{AC_MSG_WARN}). |
| @end defmac |
| |
| @defmac AC_WARNING (@var{message}) |
| @acindex{WARNING} |
| Replaced by @code{m4_warn} (@pxref{m4_warn}). |
| @end defmac |
| |
| @defmac AC_WITH (@var{package}, @var{action-if-given}, @ |
| @ovar{action-if-not-given}) |
| @acindex{WITH} |
| This is an obsolete version of @code{AC_ARG_WITH} that does not |
| support providing a help string (@pxref{AC_ARG_WITH}). |
| @end defmac |
| |
| @defmac AC_WORDS_BIGENDIAN |
| @acindex{WORDS_BIGENDIAN} |
| Replaced by @code{AC_C_BIGENDIAN} (@pxref{AC_C_BIGENDIAN}). |
| @end defmac |
| |
| @defmac AC_XENIX_DIR |
| @acindex{XENIX_DIR} |
| @ovindex LIBS |
| This macro is equivalent to the obsolescent @code{AC_HEADER_DIRENT} |
| macro, plus it also sets the shell variable @code{XENIX}. |
| Don't use this macro, the dignified means to check the nature of the |
| host is using @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}). |
| @end defmac |
| |
| @defmac AC_YYTEXT_POINTER |
| @acindex{YYTEXT_POINTER} |
| This macro was renamed @code{AC_DECL_YYTEXT}, which in turn was |
| integrated into @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}). |
| @end defmac |
| |
| @node Autoconf 1 |
| @section Upgrading From Version 1 |
| @cindex Upgrading autoconf |
| @cindex Autoconf upgrading |
| |
| Autoconf version 2 is mostly backward compatible with version 1. |
| However, it introduces better ways to do some things, and doesn't |
| support some of the ugly things in version 1. So, depending on how |
| sophisticated your @file{configure.ac} files are, you might have to do |
| some manual work in order to upgrade to version 2. This chapter points |
| out some problems to watch for when upgrading. Also, perhaps your |
| @command{configure} scripts could benefit from some of the new features in |
| version 2; the changes are summarized in the file @file{NEWS} in the |
| Autoconf distribution. |
| |
| @menu |
| * Changed File Names:: Files you might rename |
| * Changed Makefiles:: New things to put in @file{Makefile.in} |
| * Changed Macros:: Macro calls you might replace |
| * Changed Results:: Changes in how to check test results |
| * Changed Macro Writing:: Better ways to write your own macros |
| @end menu |
| |
| @node Changed File Names |
| @subsection Changed File Names |
| |
| If you have an @file{aclocal.m4} installed with Autoconf (as opposed to |
| in a particular package's source directory), you must rename it to |
| @file{acsite.m4}. @xref{autoconf Invocation}. |
| |
| If you distribute @file{install.sh} with your package, rename it to |
| @file{install-sh} so @command{make} builtin rules don't inadvertently |
| create a file called @file{install} from it. @code{AC_PROG_INSTALL} |
| looks for the script under both names, but it is best to use the new name. |
| |
| If you were using @file{config.h.top}, @file{config.h.bot}, or |
| @file{acconfig.h}, you still can, but you have less clutter if you |
| use the @code{AH_} macros. @xref{Autoheader Macros}. |
| |
| @node Changed Makefiles |
| @subsection Changed Makefiles |
| |
| Add @samp{@@CFLAGS@@}, @samp{@@CPPFLAGS@@}, and @samp{@@LDFLAGS@@} in |
| your @file{Makefile.in} files, so they can take advantage of the values |
| of those variables in the environment when @command{configure} is run. |
| Doing this isn't necessary, but it's a convenience for users. |
| |
| Also add @samp{@@configure_input@@} in a comment to each input file for |
| @code{AC_OUTPUT}, so that the output files contain a comment saying |
| they were produced by @command{configure}. Automatically selecting the |
| right comment syntax for all the kinds of files that people call |
| @code{AC_OUTPUT} on became too much work. |
| |
| Add @file{config.log} and @file{config.cache} to the list of files you |
| remove in @code{distclean} targets. |
| |
| If you have the following in @file{Makefile.in}: |
| |
| @example |
| prefix = /usr/local |
| exec_prefix = $(prefix) |
| @end example |
| |
| @noindent |
| you must change it to: |
| |
| @example |
| prefix = @@prefix@@ |
| exec_prefix = @@exec_prefix@@ |
| @end example |
| |
| @noindent |
| The old behavior of replacing those variables without @samp{@@} |
| characters around them has been removed. |
| |
| @node Changed Macros |
| @subsection Changed Macros |
| |
| Many of the macros were renamed in Autoconf version 2. You can still |
| use the old names, but the new ones are clearer, and it's easier to find |
| the documentation for them. @xref{Obsolete Macros}, for a table showing the |
| new names for the old macros. Use the @command{autoupdate} program to |
| convert your @file{configure.ac} to using the new macro names. |
| @xref{autoupdate Invocation}. |
| |
| Some macros have been superseded by similar ones that do the job better, |
| but are not call-compatible. If you get warnings about calling obsolete |
| macros while running @command{autoconf}, you may safely ignore them, but |
| your @command{configure} script generally works better if you follow |
| the advice that is printed about what to replace the obsolete macros with. In |
| particular, the mechanism for reporting the results of tests has |
| changed. If you were using @command{echo} or @code{AC_VERBOSE} (perhaps |
| via @code{AC_COMPILE_CHECK}), your @command{configure} script's output |
| looks better if you switch to @code{AC_MSG_CHECKING} and |
| @code{AC_MSG_RESULT}. @xref{Printing Messages}. Those macros work best |
| in conjunction with cache variables. @xref{Caching Results}. |
| |
| |
| |
| @node Changed Results |
| @subsection Changed Results |
| |
| If you were checking the results of previous tests by examining the |
| shell variable @code{DEFS}, you need to switch to checking the values of |
| the cache variables for those tests. @code{DEFS} no longer exists while |
| @command{configure} is running; it is only created when generating output |
| files. This difference from version 1 is because properly quoting the |
| contents of that variable turned out to be too cumbersome and |
| inefficient to do every time @code{AC_DEFINE} is called. @xref{Cache |
| Variable Names}. |
| |
| For example, here is a @file{configure.ac} fragment written for Autoconf |
| version 1: |
| |
| @example |
| AC_HAVE_FUNCS(syslog) |
| case "$DEFS" in |
| *-DHAVE_SYSLOG*) ;; |
| *) # syslog is not in the default libraries. See if it's in some other. |
| saved_LIBS="$LIBS" |
| for lib in bsd socket inet; do |
| AC_CHECKING(for syslog in -l$lib) |
| LIBS="-l$lib $saved_LIBS" |
| AC_HAVE_FUNCS(syslog) |
| case "$DEFS" in |
| *-DHAVE_SYSLOG*) break ;; |
| *) ;; |
| esac |
| LIBS="$saved_LIBS" |
| done ;; |
| esac |
| @end example |
| |
| Here is a way to write it for version 2: |
| |
| @example |
| AC_CHECK_FUNCS([syslog]) |
| AS_IF([test "x$ac_cv_func_syslog" = xno], |
| [# syslog is not in the default libraries. See if it's in some other. |
| for lib in bsd socket inet; do |
| AC_CHECK_LIB([$lib], [syslog], |
| [AC_DEFINE([HAVE_SYSLOG]) |
| LIBS="-l$lib $LIBS"; break]) |
| done]) |
| @end example |
| |
| If you were working around bugs in @code{AC_DEFINE_UNQUOTED} by adding |
| backslashes before quotes, you need to remove them. It now works |
| predictably, and does not treat quotes (except back quotes) specially. |
| @xref{Setting Output Variables}. |
| |
| All of the Boolean shell variables set by Autoconf macros now use |
| @samp{yes} for the true value. Most of them use @samp{no} for false, |
| though for backward compatibility some use the empty string instead. If |
| you were relying on a shell variable being set to something like 1 or |
| @samp{t} for true, you need to change your tests. |
| |
| @node Changed Macro Writing |
| @subsection Changed Macro Writing |
| |
| When defining your own macros, you should now use @code{AC_DEFUN} |
| instead of @code{define}. @code{AC_DEFUN} automatically calls |
| @code{AC_PROVIDE} and ensures that macros called via @code{AC_REQUIRE} |
| do not interrupt other macros, to prevent nested @samp{checking@dots{}} |
| messages on the screen. There's no actual harm in continuing to use the |
| older way, but it's less convenient and attractive. @xref{Macro |
| Definitions}. |
| |
| You probably looked at the macros that came with Autoconf as a guide for |
| how to do things. It would be a good idea to take a look at the new |
| versions of them, as the style is somewhat improved and they take |
| advantage of some new features. |
| |
| If you were doing tricky things with undocumented Autoconf internals |
| (macros, variables, diversions), check whether you need to change |
| anything to account for changes that have been made. Perhaps you can |
| even use an officially supported technique in version 2 instead of |
| kludging. Or perhaps not. |
| |
| To speed up your locally written feature tests, add caching to them. |
| See whether any of your tests are of general enough usefulness to |
| encapsulate them into macros that you can share. |
| |
| |
| @node Autoconf 2.13 |
| @section Upgrading From Version 2.13 |
| @cindex Upgrading autoconf |
| @cindex Autoconf upgrading |
| |
| The introduction of the previous section (@pxref{Autoconf 1}) perfectly |
| suits this section@enddots{} |
| |
| @quotation |
| Autoconf version 2.50 is mostly backward compatible with version 2.13. |
| However, it introduces better ways to do some things, and doesn't |
| support some of the ugly things in version 2.13. So, depending on how |
| sophisticated your @file{configure.ac} files are, you might have to do |
| some manual work in order to upgrade to version 2.50. This chapter |
| points out some problems to watch for when upgrading. Also, perhaps |
| your @command{configure} scripts could benefit from some of the new |
| features in version 2.50; the changes are summarized in the file |
| @file{NEWS} in the Autoconf distribution. |
| @end quotation |
| |
| @menu |
| * Changed Quotation:: Broken code which used to work |
| * New Macros:: Interaction with foreign macros |
| * Hosts and Cross-Compilation:: Bugward compatibility kludges |
| * AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token |
| * AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources |
| @end menu |
| |
| @node Changed Quotation |
| @subsection Changed Quotation |
| |
| The most important changes are invisible to you: the implementation of |
| most macros have completely changed. This allowed more factorization of |
| the code, better error messages, a higher uniformity of the user's |
| interface etc. Unfortunately, as a side effect, some construct which |
| used to (miraculously) work might break starting with Autoconf 2.50. |
| The most common culprit is bad quotation. |
| |
| For instance, in the following example, the message is not properly |
| quoted: |
| |
| @example |
| AC_INIT |
| AC_CHECK_HEADERS(foo.h, , |
| AC_MSG_ERROR(cannot find foo.h, bailing out)) |
| AC_OUTPUT |
| @end example |
| |
| @noindent |
| Autoconf 2.13 simply ignores it: |
| |
| @example |
| $ @kbd{autoconf-2.13; ./configure --silent} |
| creating cache ./config.cache |
| configure: error: cannot find foo.h |
| $ |
| @end example |
| |
| @noindent |
| while Autoconf 2.50 produces a broken @file{configure}: |
| |
| @example |
| $ @kbd{autoconf-2.50; ./configure --silent} |
| configure: error: cannot find foo.h |
| ./configure: exit: bad non-numeric arg `bailing' |
| ./configure: exit: bad non-numeric arg `bailing' |
| $ |
| @end example |
| |
| The message needs to be quoted, and the @code{AC_MSG_ERROR} invocation |
| too! |
| |
| @example |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AC_CHECK_HEADERS([foo.h], [], |
| [AC_MSG_ERROR([cannot find foo.h, bailing out])]) |
| AC_OUTPUT |
| @end example |
| |
| Many many (and many more) Autoconf macros were lacking proper quotation, |
| including no less than@dots{} @code{AC_DEFUN} itself! |
| |
| @example |
| $ @kbd{cat configure.in} |
| AC_DEFUN([AC_PROG_INSTALL], |
| [# My own much better version |
| ]) |
| AC_INIT |
| AC_PROG_INSTALL |
| AC_OUTPUT |
| $ @kbd{autoconf-2.13} |
| autoconf: Undefined macros: |
| ***BUG in Autoconf--please report*** AC_FD_MSG |
| ***BUG in Autoconf--please report*** AC_EPI |
| configure.in:1:AC_DEFUN([AC_PROG_INSTALL], |
| configure.in:5:AC_PROG_INSTALL |
| $ @kbd{autoconf-2.50} |
| $ |
| @end example |
| |
| |
| @node New Macros |
| @subsection New Macros |
| |
| @cindex undefined macro |
| @cindex @code{_m4_divert_diversion} |
| |
| While Autoconf was relatively dormant in the late 1990s, Automake |
| provided Autoconf-like macros for a while. Starting with Autoconf 2.50 |
| in 2001, Autoconf provided |
| versions of these macros, integrated in the @code{AC_} namespace, |
| instead of @code{AM_}. But in order to ease the upgrading via |
| @command{autoupdate}, bindings to such @code{AM_} macros are provided. |
| |
| Unfortunately older versions of Automake (e.g., Automake 1.4) |
| did not quote the names of these macros. |
| Therefore, when @command{m4} finds something like |
| @samp{AC_DEFUN(AM_TYPE_PTRDIFF_T, @dots{})} in @file{aclocal.m4}, |
| @code{AM_TYPE_PTRDIFF_T} is |
| expanded, replaced with its Autoconf definition. |
| |
| Fortunately Autoconf catches pre-@code{AC_INIT} expansions, and |
| complains, in its own words: |
| |
| @example |
| $ @kbd{cat configure.ac} |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AM_TYPE_PTRDIFF_T |
| $ @kbd{aclocal-1.4} |
| $ @kbd{autoconf} |
| aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion |
| aclocal.m4:17: the top level |
| autom4te: m4 failed with exit status: 1 |
| $ |
| @end example |
| |
| Modern versions of Automake no longer define most of these |
| macros, and properly quote the names of the remaining macros. |
| If you must use an old Automake, do not depend upon macros from Automake |
| as it is simply not its job |
| to provide macros (but the one it requires itself): |
| |
| @example |
| $ @kbd{cat configure.ac} |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AM_TYPE_PTRDIFF_T |
| $ @kbd{rm aclocal.m4} |
| $ @kbd{autoupdate} |
| autoupdate: 'configure.ac' is updated |
| $ @kbd{cat configure.ac} |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AC_CHECK_TYPES([ptrdiff_t]) |
| $ @kbd{aclocal-1.4} |
| $ @kbd{autoconf} |
| $ |
| @end example |
| |
| |
| @node Hosts and Cross-Compilation |
| @subsection Hosts and Cross-Compilation |
| @cindex Cross compilation |
| |
| Based on the experience of compiler writers, and after long public |
| debates, many aspects of the cross-compilation chain have changed: |
| |
| @itemize @minus |
| @item |
| the relationship between the build, host, and target architecture types, |
| |
| @item |
| the command line interface for specifying them to @command{configure}, |
| |
| @item |
| the variables defined in @command{configure}, |
| |
| @item |
| the enabling of cross-compilation mode. |
| @end itemize |
| |
| @sp 1 |
| |
| The relationship between build, host, and target have been cleaned up: |
| the chain of default is now simply: target defaults to host, host to |
| build, and build to the result of @command{config.guess}. Nevertheless, |
| in order to ease the transition from 2.13 to 2.50, the following |
| transition scheme is implemented. @emph{Do not rely on it}, as it will |
| be completely disabled in a couple of releases (we cannot keep it, as it |
| proves to cause more problems than it cures). |
| |
| They all default to the result of running @command{config.guess}, unless |
| you specify either @option{--build} or @option{--host}. In this case, |
| the default becomes the system type you specified. If you specify both, |
| and they're different, @command{configure} enters cross compilation |
| mode, so it doesn't run any tests that require execution. |
| |
| Hint: if you mean to override the result of @command{config.guess}, |
| prefer @option{--build} over @option{--host}. |
| |
| @sp 1 |
| |
| For backward compatibility, @command{configure} accepts a system |
| type as an option by itself. Such an option overrides the |
| defaults for build, host, and target system types. The following |
| configure statement configures a cross toolchain that runs on |
| NetBSD/aarch64 but generates code for GNU Hurd/riscv64, |
| which is also the build platform. |
| |
| @example |
| ./configure --host=aarch64-netbsd riscv64-gnu |
| @end example |
| |
| @sp 1 |
| |
| In Autoconf 2.13 and before, the variables @code{build}, @code{host}, |
| and @code{target} had a different semantics before and after the |
| invocation of @code{AC_CANONICAL_BUILD} etc. Now, the argument of |
| @option{--build} is strictly copied into @code{build_alias}, and is left |
| empty otherwise. After the @code{AC_CANONICAL_BUILD}, @code{build} is |
| set to the canonicalized build type. To ease the transition, before, |
| its contents is the same as that of @code{build_alias}. Do @emph{not} |
| rely on this broken feature. |
| |
| For consistency with the backward compatibility scheme exposed above, |
| when @option{--host} is specified but @option{--build} isn't, the build |
| system is assumed to be the same as @option{--host}, and |
| @samp{build_alias} is set to that value. Eventually, this |
| historically incorrect behavior will go away. |
| |
| @sp 1 |
| |
| The former scheme to enable cross-compilation proved to cause more harm |
| than good, in particular, it used to be triggered too easily, leaving |
| regular end users puzzled in front of cryptic error messages. |
| @command{configure} could even enter cross-compilation mode only |
| because the compiler was not functional. This is mainly because |
| @command{configure} used to try to detect cross-compilation, instead of |
| waiting for an explicit flag from the user. |
| |
| Now, @command{configure} enters cross-compilation mode if and only if |
| @option{--host} is passed. |
| |
| That's the short documentation. To ease the transition between 2.13 and |
| its successors, a more complicated scheme is implemented. @emph{Do not |
| rely on the following}, as it will be removed in the near future. |
| |
| If you specify @option{--host}, but not @option{--build}, when |
| @command{configure} performs the first compiler test it tries to run |
| an executable produced by the compiler. If the execution fails, it |
| enters cross-compilation mode. This is fragile. Moreover, by the time |
| the compiler test is performed, it may be too late to modify the |
| build-system type: other tests may have already been performed. |
| Therefore, whenever you specify @option{--host}, be sure to specify |
| @option{--build} too. |
| |
| @example |
| ./configure --build=x86_64-pc-linux-gnu --host=x86_64-w64-mingw64 |
| @end example |
| |
| @noindent |
| enters cross-compilation mode. The former interface, which |
| consisted in setting the compiler to a cross-compiler without informing |
| @command{configure} is obsolete. For instance, @command{configure} |
| fails if it can't run the code generated by the specified compiler if you |
| configure as follows: |
| |
| @example |
| ./configure CC=x86_64-w64-mingw64-gcc |
| @end example |
| |
| |
| @node AC_LIBOBJ vs LIBOBJS |
| @subsection @code{AC_LIBOBJ} vs.@: @code{LIBOBJS} |
| |
| Up to Autoconf 2.13, the replacement of functions was triggered via the |
| variable @code{LIBOBJS}. Since Autoconf 2.50, the macro |
| @code{AC_LIBOBJ} should be used instead (@pxref{Generic Functions}). |
| Starting at Autoconf 2.53, the use of @code{LIBOBJS} is an error. |
| |
| This change is mandated by the unification of the GNU Build System |
| components. In particular, the various fragile techniques used to parse |
| a @file{configure.ac} are all replaced with the use of traces. As a |
| consequence, any action must be traceable, which obsoletes critical |
| variable assignments. Fortunately, @code{LIBOBJS} was the only problem, |
| and it can even be handled gracefully (read, ``without your having to |
| change something''). |
| |
| There were two typical uses of @code{LIBOBJS}: asking for a replacement |
| function, and adjusting @code{LIBOBJS} for Automake and/or Libtool. |
| |
| @sp 1 |
| |
| As for function replacement, the fix is immediate: use |
| @code{AC_LIBOBJ}. For instance: |
| |
| @example |
| LIBOBJS="$LIBOBJS fnmatch.o" |
| LIBOBJS="$LIBOBJS malloc.$ac_objext" |
| @end example |
| |
| @noindent |
| should be replaced with: |
| |
| @example |
| AC_LIBOBJ([fnmatch]) |
| AC_LIBOBJ([malloc]) |
| @end example |
| |
| @sp 1 |
| |
| @ovindex LIBOBJDIR |
| When used with Automake 1.10 or newer, a suitable value for |
| @code{LIBOBJDIR} is set so that the @code{LIBOBJS} and @code{LTLIBOBJS} |
| can be referenced from any @file{Makefile.am}. Even without Automake, |
| arranging for @code{LIBOBJDIR} to be set correctly enables |
| referencing @code{LIBOBJS} and @code{LTLIBOBJS} in another directory. |
| The @code{LIBOBJDIR} feature is experimental. |
| |
| |
| @node AC_ACT_IFELSE vs AC_TRY_ACT |
| @subsection @code{AC_@var{ACT}_IFELSE} vs.@: @code{AC_TRY_@var{ACT}} |
| @c the anchor keeps the old node name, to try to avoid breaking links |
| @anchor{AC_FOO_IFELSE vs AC_TRY_FOO} |
| |
| @acindex{@var{ACT}_IFELSE} |
| @acindex{TRY_@var{ACT}} |
| Since Autoconf 2.50, internal codes uses @code{AC_PREPROC_IFELSE}, |
| @code{AC_COMPILE_IFELSE}, @code{AC_LINK_IFELSE}, and |
| @code{AC_RUN_IFELSE} on one hand and @code{AC_LANG_SOURCE}, |
| and @code{AC_LANG_PROGRAM} on the other hand instead of the deprecated |
| @code{AC_TRY_CPP}, @code{AC_TRY_COMPILE}, @code{AC_TRY_LINK}, and |
| @code{AC_TRY_RUN}. The motivations where: |
| @itemize @minus |
| @item |
| a more consistent interface: @code{AC_TRY_COMPILE} etc.@: were double |
| quoting their arguments; |
| |
| @item |
| the combinatorial explosion is solved by decomposing on the one hand the |
| generation of sources, and on the other hand executing the program; |
| |
| @item |
| this scheme helps supporting more languages than plain C and C++. |
| @end itemize |
| |
| In addition to the change of syntax, the philosophy has changed too: |
| while emphasis was put on speed at the expense of accuracy, today's |
| Autoconf promotes accuracy of the testing framework at, ahem@dots{}, the |
| expense of speed. |
| |
| |
| As a perfect example of what is @emph{not} to be done, here is how to |
| find out whether a header file contains a particular declaration, such |
| as a typedef, a structure, a structure member, or a function. Use |
| @code{AC_EGREP_HEADER} instead of running @code{grep} directly on the |
| header file; on some systems the symbol might be defined in another |
| header file that the file you are checking includes. |
| |
| As a (bad) example, here is how you should not check for C preprocessor |
| symbols, either defined by header files or predefined by the C |
| preprocessor: using @code{AC_EGREP_CPP}: |
| |
| @example |
| @group |
| AC_EGREP_CPP(yes, |
| [#ifdef _AIX |
| yes |
| #endif |
| ], is_aix=yes, is_aix=no) |
| @end group |
| @end example |
| |
| The above example, properly written would (i) use |
| @code{AC_LANG_PROGRAM}, and (ii) run the compiler: |
| |
| @example |
| @group |
| AC_COMPILE_IFELSE([AC_LANG_PROGRAM( |
| [[#ifndef _AIX |
| error: This isn't AIX! |
| #endif |
| ]])], |
| [is_aix=yes], |
| [is_aix=no]) |
| @end group |
| @end example |
| |
| |
| @c ============================= Generating Test Suites with Autotest |
| |
| @node Using Autotest |
| @chapter Generating Test Suites with Autotest |
| |
| @cindex Autotest |
| |
| @display |
| @strong{N.B.: This section describes a feature which is still |
| stabilizing. Although we believe that Autotest is useful as-is, this |
| documentation describes an interface which might change in the future: |
| do not depend upon Autotest without subscribing to the Autoconf mailing |
| lists.} |
| @end display |
| |
| It is paradoxical that portable projects depend on nonportable tools |
| to run their test suite. Autoconf by itself is the paragon of this |
| problem: although it aims at perfectly portability, up to 2.13 its |
| test suite was using DejaGNU, a rich and complex testing |
| framework, but which is far from being standard on POSIX systems. |
| Worse yet, it was likely to be missing on the most fragile platforms, |
| the very platforms that are most likely to torture Autoconf and |
| exhibit deficiencies. |
| |
| To circumvent this problem, many package maintainers have developed their |
| own testing framework, based on simple shell scripts whose sole outputs |
| are exit status values describing whether the test succeeded. Most of |
| these tests share common patterns, and this can result in lots of |
| duplicated code and tedious maintenance. |
| |
| Following exactly the same reasoning that yielded to the inception of |
| Autoconf, Autotest provides a test suite generation framework, based on |
| M4 macros building a portable shell script. The suite itself is |
| equipped with automatic logging and tracing facilities which greatly |
| diminish the interaction with bug reporters, and simple timing reports. |
| |
| Autoconf itself has been using Autotest for years, and we do attest that |
| it has considerably improved the strength of the test suite and the |
| quality of bug reports. Other projects are known to use some generation |
| of Autotest, such as Bison, GNU Wdiff, GNU Tar, each of |
| them with different needs, and this usage has validated Autotest as a general |
| testing framework. |
| |
| Nonetheless, compared to DejaGNU, Autotest is inadequate for |
| interactive tool testing, which is probably its main limitation. |
| |
| @menu |
| * Using an Autotest Test Suite:: Autotest and the user |
| * Writing Testsuites:: Autotest macros |
| * testsuite Invocation:: Running @command{testsuite} scripts |
| * Making testsuite Scripts:: Using autom4te to create @command{testsuite} |
| @end menu |
| |
| @node Using an Autotest Test Suite |
| @section Using an Autotest Test Suite |
| |
| @menu |
| * testsuite Scripts:: The concepts of Autotest |
| * Autotest Logs:: Their contents |
| @end menu |
| |
| @node testsuite Scripts |
| @subsection @command{testsuite} Scripts |
| |
| @cindex @command{testsuite} |
| |
| Generating testing or validation suites using Autotest is rather easy. |
| The whole validation suite is held in a file to be processed through |
| @command{autom4te}, itself using GNU M4 under the hood, to |
| produce a stand-alone Bourne shell script which then gets distributed. |
| Neither @command{autom4te} nor GNU M4 are needed at |
| the installer's end. |
| |
| @cindex test group |
| Each test of the validation suite should be part of some test group. A |
| @dfn{test group} is a sequence of interwoven tests that ought to be |
| executed together, usually because one test in the group creates data |
| files that a later test in the same group needs to read. Complex test |
| groups make later debugging more tedious. It is much better to |
| keep only a few tests per test group. Ideally there is only one test |
| per test group. |
| |
| For all but the simplest packages, some file such as @file{testsuite.at} |
| does not fully hold all test sources, as these are often easier to |
| maintain in separate files. Each of these separate files holds a single |
| test group, or a sequence of test groups all addressing some common |
| functionality in the package. In such cases, @file{testsuite.at} |
| merely initializes the validation suite, and sometimes does elementary |
| health checking, before listing include statements for all other test |
| files. The special file @file{package.m4}, containing the |
| identification of the package, is automatically included if found. |
| |
| A convenient alternative consists in moving all the global issues |
| (local Autotest macros, elementary health checking, and @code{AT_INIT} |
| invocation) into the file @code{local.at}, and making |
| @file{testsuite.at} be a simple list of @code{m4_include}s of sub test |
| suites. In such case, generating the whole test suite or pieces of it |
| is only a matter of choosing the @command{autom4te} command line |
| arguments. |
| |
| The validation scripts that Autotest produces are by convention called |
| @command{testsuite}. When run, @command{testsuite} executes each test |
| group in turn, producing only one summary line per test to say if that |
| particular test succeeded or failed. At end of all tests, summarizing |
| counters get printed. One debugging directory is left for each test |
| group which failed, if any: such directories are named |
| @file{testsuite.dir/@var{nn}}, where @var{nn} is the sequence number of |
| the test group, and they include: |
| |
| @itemize @bullet |
| @item a debugging script named @file{run} which reruns the test in |
| @dfn{debug mode} (@pxref{testsuite Invocation}). The automatic generation |
| of debugging scripts has the purpose of easing the chase for bugs. |
| |
| @item all the files created with @code{AT_DATA} |
| |
| @item all the Erlang source code files created with @code{AT_CHECK_EUNIT} |
| |
| @item a log of the run, named @file{testsuite.log} |
| @end itemize |
| |
| In the ideal situation, none of the tests fail, and consequently no |
| debugging directory is left behind for validation. |
| |
| It often happens in practice that individual tests in the validation |
| suite need to get information coming out of the configuration process. |
| Some of this information, common for all validation suites, is provided |
| through the file @file{atconfig}, automatically created by |
| @code{AC_CONFIG_TESTDIR}. For configuration information which your |
| testing environment specifically needs, you might prepare an optional |
| file named @file{atlocal.in}, instantiated by @code{AC_CONFIG_FILES}. |
| The configuration process produces @file{atconfig} and @file{atlocal} |
| out of these two input files, and these two produced files are |
| automatically read by the @file{testsuite} script. |
| |
| Here is a diagram showing the relationship between files. |
| |
| @noindent |
| Files used in preparing a software package for distribution: |
| |
| @example |
| [package.m4] -->. |
| \ |
| subfile-1.at ->. [local.at] ---->+ |
| ... \ \ |
| subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite |
| ... / |
| subfile-n.at ->' |
| @end example |
| |
| @noindent |
| Files used in configuring a software package: |
| |
| @example |
| .--> atconfig |
| / |
| [atlocal.in] --> config.status* --< |
| \ |
| `--> [atlocal] |
| @end example |
| |
| @noindent |
| Files created during test suite execution: |
| |
| @example |
| atconfig -->. .--> testsuite.log |
| \ / |
| >-- testsuite* --< |
| / \ |
| [atlocal] ->' `--> [testsuite.dir] |
| @end example |
| |
| |
| @node Autotest Logs |
| @subsection Autotest Logs |
| |
| When run, the test suite creates a log file named after itself, e.g., a |
| test suite named @command{testsuite} creates @file{testsuite.log}. It |
| contains a lot of information, usually more than maintainers actually |
| need, but therefore most of the time it contains all that is needed: |
| |
| @table @asis |
| @item command line arguments |
| A bad but unfortunately widespread habit consists of |
| setting environment variables before the command, such as in |
| @samp{CC=my-home-grown-cc ./testsuite}. The test suite does not |
| know this change, hence (i) it cannot report it to you, and (ii) |
| it cannot preserve the value of @code{CC} for subsequent runs. |
| Autoconf faced exactly the same problem, and solved it by asking |
| users to pass the variable definitions as command line arguments. |
| Autotest requires this rule, too, but has no means to enforce it; the log |
| then contains a trace of the variables that were changed by the user. |
| |
| @item @file{ChangeLog} excerpts |
| The topmost lines of all the @file{ChangeLog} files found in the source |
| hierarchy. This is especially useful when bugs are reported against |
| development versions of the package, since the version string does not |
| provide sufficient information to know the exact state of the sources |
| the user compiled. Of course, this relies on the use of a |
| @file{ChangeLog}. |
| |
| @item build machine |
| Running a test suite in a cross-compile environment is not an easy task, |
| since it would mean having the test suite run on a machine @var{build}, |
| while running programs on a machine @var{host}. It is much simpler to |
| run both the test suite and the programs on @var{host}, but then, from |
| the point of view of the test suite, there remains a single environment, |
| @var{host} = @var{build}. The log contains relevant information on the |
| state of the @var{build} machine, including some important environment |
| variables. |
| @c FIXME: How about having an M4sh macro to say "hey, log the value |
| @c of '@dots{}'"? This would help both Autoconf and Autotest. |
| |
| @item tested programs |
| The absolute file name and answers to @option{--version} of the tested |
| programs (see @ref{Writing Testsuites}, @code{AT_TESTED}). |
| |
| @item configuration log |
| The contents of @file{config.log}, as created by @command{configure}, |
| are appended. It contains the configuration flags and a detailed report |
| on the configuration itself. |
| @end table |
| |
| |
| @node Writing Testsuites |
| @section Writing @file{testsuite.at} |
| |
| The @file{testsuite.at} is a Bourne shell script making use of special |
| Autotest M4 macros. It often contains a call to @code{AT_INIT} near |
| its beginning followed by one call to @code{m4_include} per source file |
| for tests. Each such included file, or the remainder of |
| @file{testsuite.at} if include files are not used, contain a sequence of |
| test groups. Each test group begins with a call to @code{AT_SETUP}, |
| then an arbitrary number of shell commands or calls to @code{AT_CHECK}, |
| and then completes with a call to @code{AT_CLEANUP}. Multiple test |
| groups can be categorized by a call to @code{AT_BANNER}. |
| |
| All of the public Autotest macros have all-uppercase names in the |
| namespace @samp{^AT_} to prevent them from accidentally conflicting with |
| other text; Autoconf also reserves the namespace @samp{^_AT_} for |
| internal macros. All shell variables used in the testsuite for internal |
| purposes have mostly-lowercase names starting with @samp{at_}. Autotest |
| also uses here-document delimiters in the namespace @samp{^_AT[A-Z]}, and |
| makes use of the file system namespace @samp{^at-}. |
| |
| Since Autoconf is built on top of M4sugar (@pxref{Programming in |
| M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware |
| of those namespaces (@samp{^_?\(m4\|AS\)_}). In general, you |
| @emph{should not use} the namespace of a package that does not own the |
| macro or shell code you are writing. |
| |
| @defmac AT_INIT (@ovar{name}) |
| @atindex{INIT} |
| @c FIXME: Not clear, plus duplication of the information. |
| Initialize Autotest. Giving a @var{name} to the test suite is |
| encouraged if your package includes several test suites. Before this |
| macro is called, @code{AT_PACKAGE_STRING} and |
| @code{AT_PACKAGE_BUGREPORT} must be defined, which are used to display |
| information about the testsuite to the user. Typically, these macros |
| are provided by a file @file{package.m4} built by @command{make} |
| (@pxref{Making testsuite Scripts}), in order to inherit the package |
| name, version, and bug reporting address from @file{configure.ac}. |
| @end defmac |
| |
| @defmac AT_COPYRIGHT (@var{copyright-notice}) |
| @atindex{COPYRIGHT} |
| @cindex Copyright Notice |
| State that, in addition to the Free Software Foundation's copyright on |
| the Autotest macros, parts of your test suite are covered by |
| @var{copyright-notice}. |
| |
| The @var{copyright-notice} shows up in both the head of |
| @command{testsuite} and in @samp{testsuite --version}. |
| @end defmac |
| |
| @defmac AT_ARG_OPTION (@var{options}, @var{help-text}, @ |
| @ovar{action-if-given}, @ovar{action-if-not-given}) |
| @atindex{ARG_OPTION} |
| @vrindex at_arg_@var{option} |
| Accept options from the space-separated list @var{options}, a list that |
| has leading dashes removed from the options. Long options will be |
| prefixed with @samp{--}, single-character options with @samp{-}. The |
| first word in this list is the primary @var{option}, any others are |
| assumed to be short-hand aliases. The variable associated with it |
| is @code{at_arg_@var{option}}, with any dashes in @var{option} replaced |
| with underscores. |
| |
| If the user passes @option{--@var{option}} to the @command{testsuite}, |
| the variable will be set to @samp{:}. If the user does not pass the |
| option, or passes @option{--no-@var{option}}, then the variable will be |
| set to @samp{false}. |
| |
| @vrindex at_optarg |
| @vrindex at_optarg_@var{option} |
| @var{action-if-given} is run each time the option is encountered; here, |
| the variable @code{at_optarg} will be set to @samp{:} or @samp{false} as |
| appropriate. @code{at_optarg} is actually just a copy of |
| @code{at_arg_@var{option}}. |
| |
| @var{action-if-not-given} will be run once after option parsing is |
| complete and if no option from @var{options} was used. |
| |
| @var{help-text} is added to the end of the list of options shown in |
| @command{testsuite --help} (@pxref{AS_HELP_STRING}). |
| |
| It is recommended that you use a package-specific prefix to @var{options} |
| names in order to avoid clashes with future Autotest built-in options. |
| @end defmac |
| |
| @defmac AT_ARG_OPTION_ARG (@var{options}, @var{help-text}, @ |
| @ovar{action-if-given}, @ovar{action-if-not-given}) |
| @atindex{ARG_OPTION_ARG} |
| @vrindex at_arg_@var{option} |
| Accept options with arguments from the space-separated list |
| @var{options}, a list that has leading dashes removed from the options. |
| Long options will be prefixed with @samp{--}, single-character options |
| with @samp{-}. The first word in this list is the primary @var{option}, |
| any others are assumed to be short-hand aliases. The variable associated |
| with it is @code{at_arg_@var{option}}, with any dashes in @var{option} |
| replaced with underscores. |
| |
| If the user passes @option{--@var{option}=@var{arg}} or |
| @option{--@var{option} @var{arg}} to the @command{testsuite}, the |
| variable will be set to @samp{@var{arg}}. |
| |
| @vrindex at_optarg |
| @var{action-if-given} is run each time the option is encountered; here, |
| the variable @code{at_optarg} will be set to @samp{@var{arg}}. |
| @code{at_optarg} is actually just a copy of @code{at_arg_@var{option}}. |
| |
| @var{action-if-not-given} will be run once after option parsing is |
| complete and if no option from @var{options} was used. |
| |
| @var{help-text} is added to the end of the list of options shown in |
| @command{testsuite --help} (@pxref{AS_HELP_STRING}). |
| |
| It is recommended that you use a package-specific prefix to @var{options} |
| names in order to avoid clashes with future Autotest built-in options. |
| @end defmac |
| |
| @defmac AT_COLOR_TESTS |
| @atindex{COLOR_TESTS} |
| Enable colored test results by default when the output is connected to |
| a terminal. |
| @end defmac |
| |
| @defmac AT_TESTED (@var{executables}) |
| @atindex{TESTED} |
| Log the file name and answer to @option{--version} of each program in |
| space-separated list @var{executables}. Several invocations register |
| new executables, in other words, don't fear registering one program |
| several times. |
| |
| Autotest test suites rely on @env{PATH} to find the tested program. |
| This avoids the need to generate absolute names of the various tools, and |
| makes it possible to test installed programs. Therefore, knowing which |
| programs are being exercised is crucial to understanding problems in |
| the test suite itself, or its occasional misuses. It is a good idea to |
| also subscribe foreign programs you depend upon, to avoid incompatible |
| diagnostics. |
| |
| @var{executables} is implicitly wrapped in shell double quotes, but it |
| will still use shell variable expansion (@samp{$}), command substitution |
| (@samp{`}), and backslash escaping (@samp{\}). In particular, the |
| @env{EXEEXT} variable is available if it is passed to the testsuite |
| via @file{atlocal} or @file{atconfig}. |
| @end defmac |
| |
| @defmac AT_PREPARE_TESTS (@var{shell-code}) |
| @atindex{PREPARE_TESTS} |
| Execute @var{shell-code} in the main testsuite process, |
| after initializing the test suite and processing command-line options, |
| but before running any tests. If this macro is used several times, |
| all of the @var{shell-code}s will be executed, |
| in the order they appeared in @file{testsuite.at}. |
| |
| One reason to use @code{AT_PREPARE_TESTS} is when the programs under |
| test are sensitive to environment variables: you can unset all these |
| variables or reset them to safe values in @var{shell-code}. |
| |
| @var{shell-code} is only executed if at least one test is going to be |
| run. In particular, it will not be executed if any of the @option{--help}, |
| @option{--version}, @option{--list}, or @option{--clean} options are |
| given to @command{testsuite} (@pxref{testsuite Invocation}). |
| @end defmac |
| |
| @defmac AT_PREPARE_EACH_TEST (@var{shell-code}) |
| @atindex{AT_PREPARE_EACH_TEST} |
| Execute @var{shell-code} in each test group's subshell, at the point of |
| the @code{AT_SETUP} that starts the test group. |
| @end defmac |
| |
| @defmac AT_TEST_HELPER_FN (@var{name}, @var{args}, @var{description}, @var{code}) |
| Define a shell function that will be available to the code for each test |
| group. Its name will be @code{ath_fn_@var{name}}, and its body will be |
| @var{code}. (The prefix prevents name conflicts with shell functions |
| defined by M4sh and Autotest.) |
| |
| @var{args} should describe the function's arguments and @var{description} |
| what it does; these are used only for documentation comments in the |
| generated testsuite script. |
| @end defmac |
| |
| @sp 1 |
| |
| @defmac AT_BANNER (@var{test-category-name}) |
| @atindex{BANNER} |
| This macro identifies the start of a category of related test groups. |
| When the resulting @file{testsuite} is invoked with more than one test |
| group to run, its output will include a banner containing |
| @var{test-category-name} prior to any tests run from that category. The |
| banner should be no more than about 40 or 50 characters. A blank banner |
| indicates uncategorized tests; an empty line will be inserted after |
| tests from an earlier category, effectively ending that category. |
| @end defmac |
| |
| @defmac AT_SETUP (@var{test-group-name}) |
| @atindex{SETUP} |
| This macro starts a group of related tests, all to be executed in the |
| same subshell. It accepts a single argument, which holds a few words |
| (no more than about 30 or 40 characters) quickly describing the purpose |
| of the test group being started. @var{test-group-name} must not expand |
| to unbalanced quotes, although quadrigraphs can be used. |
| @end defmac |
| |
| @defmac AT_KEYWORDS (@var{keywords}) |
| @atindex{KEYWORDS} |
| Associate the space-separated list of @var{keywords} to the enclosing |
| test group. This makes it possible to run ``slices'' of the test suite. |
| For instance, if some of your test groups exercise some @samp{foo} |
| feature, then using @samp{AT_KEYWORDS(foo)} lets you run |
| @samp{./testsuite -k foo} to run exclusively these test groups. The |
| @var{test-group-name} of the test group is automatically recorded to |
| @code{AT_KEYWORDS}. |
| |
| Several invocations within a test group accumulate new keywords. In |
| other words, don't fear registering the same keyword several times in a |
| test group. |
| @end defmac |
| |
| @defmac AT_CAPTURE_FILE (@var{file}) |
| @atindex{CAPTURE_FILE} |
| If the current test group fails, log the contents of @var{file}. |
| Several identical calls within one test group have no additional effect. |
| @end defmac |
| |
| @defmac AT_FAIL_IF (@var{shell-condition}) |
| @atindex{FAIL_IF} |
| Make the test group fail and skip the rest of its execution, if |
| @var{shell-condition} is true. @var{shell-condition} is a shell expression |
| such as a @code{test} command. Tests before @command{AT_FAIL_IF} |
| will be executed and may still cause the test group to be skipped. |
| You can instantiate this macro many times from within the same test group. |
| |
| You should use this macro only for very simple failure conditions. If the |
| @var{shell-condition} could emit any kind of output you should instead |
| use @command{AT_CHECK} like |
| @example |
| AT_CHECK([if @var{shell-condition}; then exit 99; fi]) |
| @end example |
| @noindent |
| so that such output is properly recorded in the @file{testsuite.log} |
| file. |
| @end defmac |
| |
| @defmac AT_SKIP_IF (@var{shell-condition}) |
| @atindex{SKIP_IF} |
| Determine whether the test should be skipped because it requires |
| features that are unsupported on the machine under test. |
| @var{shell-condition} is a shell expression such as a @code{test} |
| command. Tests before @command{AT_SKIP_IF} will be executed |
| and may still cause the test group to fail. You can instantiate this |
| macro many times from within the same test group. |
| |
| You should use this macro only for very simple skip conditions. If the |
| @var{shell-condition} could emit any kind of output you should instead |
| use @command{AT_CHECK} like |
| @example |
| AT_CHECK([if @var{shell-condition}; then exit 77; fi]) |
| @end example |
| @noindent |
| so that such output is properly recorded in the @file{testsuite.log} |
| file. |
| @end defmac |
| |
| @defmac AT_XFAIL_IF (@var{shell-condition}) |
| @atindex{XFAIL_IF} |
| Determine whether the test is expected to fail because it is a known |
| bug (for unsupported features, you should skip the test). |
| @var{shell-condition} is a shell expression such as a @code{test} |
| command; you can instantiate this macro many times from within the |
| same test group, and one of the conditions is enough to turn |
| the test into an expected failure. |
| @end defmac |
| |
| @defmac AT_CLEANUP |
| @atindex{CLEANUP} |
| End the current test group. |
| @end defmac |
| |
| @sp 1 |
| |
| @defmac AT_DATA (@var{file}, @var{contents}) |
| @defmacx AT_DATA_UNQUOTED (@var{file}, @var{contents}) |
| @atindex{DATA} |
| Initialize an input data @var{file} with given @var{contents}. Of |
| course, the @var{contents} have to be properly quoted between square |
| brackets to protect against included commas or spurious M4 |
| expansion. @var{contents} must be empty or end with a newline. |
| @var{file} must |
| be a single shell word that expands into a single file name. |
| |
| The difference between @code{AT_DATA} and @code{AT_DATA_UNQUOTED} is |
| that only the latter performs shell variable expansion (@samp{$}), |
| command substitution (@samp{`}), and backslash escaping (@samp{\}) |
| on @var{contents}. |
| @end defmac |
| |
| @defmac AT_CHECK (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @ |
| @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass}) |
| @defmacx AT_CHECK_UNQUOTED (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @ |
| @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass}) |
| @atindex{CHECK} |
| @atindex{CHECK_UNQUOTED} |
| @vrindex at_status |
| Perform a test, by running the shell @var{commands} in a subshell. |
| @var{commands} is output as-is, so shell expansions are honored. |
| These commands are expected to have a final exit status of @var{status}, |
| and to produce output as described by @var{stdout} and @var{stderr} |
| (see below). |
| |
| This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}. |
| |
| If @var{commands} exit with unexpected status 77, then the rest of the |
| test group is skipped. If @var{commands} exit with unexpected status |
| 99, then the test group is immediately failed; this is called a |
| @emph{hard failure}. Otherwise, the test is considered to have |
| succeeded if all of the status, stdout, and stderr expectations were |
| met. |
| |
| If @var{run-if-fail} is nonempty, it provides extra shell commands to |
| run when the test fails; if @var{run-if-pass} is nonempty, it provides |
| extra shell commands to run when the test succeeds. These commands are |
| @emph{not} run in a subshell, and they are not run when the test group |
| is skipped (exit code 77) or hard-failed (exit code 99). They may |
| change whether the test group is considered to have succeeded, by |
| modifying the shell variable @code{at_failed}; set it to @code{:} to |
| indicate that the test group has failed, or @code{false} to indicate |
| that it has succeeded. |
| |
| The exit status of @var{commands} is available to @var{run-if-fail} and |
| @var{run-if-pass} commands in the @code{at_status} shell variable. The |
| output from @var{commands} is also available, in the files named by the |
| @code{at_stdout} and @code{at_stderr} variables. |
| |
| If @var{status} is the literal @samp{ignore}, then the exit status of |
| @var{commands} is not checked, except for the special cases of 77 (skip) |
| and 99 (hard failure). The existence of hard failures allows one to |
| mark a test as an expected failure with @code{AT_XFAIL_IF} because a |
| feature has not yet been implemented, but to still distinguish between |
| gracefully handling the missing feature and dumping core. |
| |
| If the value of the @var{stdout} or @var{stderr} parameter is one of the |
| literals in the following table, then the test treats the output |
| according to the rules of that literal. |
| |
| @table @samp |
| @item ignore |
| The content of the output is ignored, but still captured in the test |
| group log (if the testsuite is run with the @option{-v} option, the test |
| group log is displayed as the test is run; if the test group later |
| fails, the test group log is also copied into the overall testsuite |
| log). This action is valid for both @var{stdout} and @var{stderr}. |
| |
| @item ignore-nolog |
| The content of the output is ignored, and nothing is captured in the log |
| files. If @var{commands} are likely to produce binary output (including |
| long lines) or large amounts of output, then logging the output can make |
| it harder to locate details related to subsequent tests within the |
| group, and could potentially corrupt terminal display of a user running |
| @command{testsuite -v}. This action is valid for both @var{stdout} and |
| @var{stderr}. |
| |
| @item stdout |
| Only valid as the @var{stdout} parameter. Capture the content of |
| standard output in both a file named @file{stdout} and the test group log. |
| Subsequent commands in the test group can then post-process the file. |
| This action is often used when it is desired to use @command{grep} to |
| look for a substring in the output, or when the output must be |
| post-processed to normalize error messages into a common form. |
| |
| @item stderr |
| Only valid as the @var{stderr} parameter. Capture the content of |
| standard error in both a file named @file{stderr} and the test group log. |
| |
| @item stdout-nolog |
| @itemx stderr-nolog |
| Like @samp{stdout} or @samp{stderr}, except that the captured output is |
| not duplicated into the test group log. This action is particularly |
| useful for an intermediate check that produces large amounts of data, |
| which will be followed by another check that filters down to the |
| relevant data, as it makes it easier to locate details in the log. |
| |
| @item expout |
| Only valid as the @var{stdout} parameter. Compare standard output with |
| the previously created file @file{expout}, and list any differences in |
| the testsuite log. |
| |
| @item experr |
| Only valid as the @var{stderr} parameter. Compare standard error with |
| the previously created file @file{experr}, and list any differences in |
| the testsuite log. |
| @end table |
| |
| Otherwise, the values of the @var{stdout} and @var{stderr} parameters |
| are treated as text that must exactly match the output given by |
| @var{commands} on standard output and standard error (including an empty |
| parameter for no output); any differences are captured in the testsuite |
| log and the test is failed (unless an unexpected exit status of 77 |
| skipped the test instead). |
| |
| @code{AT_CHECK_UNQUOTED} performs shell variable expansion (@samp{$}), |
| command substitution (@samp{`}), and backslash escaping (@samp{\}) on |
| comparison text given in the @var{stdout} and @var{stderr} parameters; |
| @code{AT_CHECK} does not. There is no difference in the interpretation |
| of @var{commands}. |
| @end defmac |
| |
| @defmac AT_CHECK_EUNIT (@var{module}, @var{test-spec}, @ovar{erlflags}, @ |
| @ovar{run-if-fail}, @ovar{run-if-pass}) |
| @atindex{CHECK_EUNIT} |
| Initialize and execute an Erlang module named @var{module} that performs |
| tests following the @var{test-spec} EUnit test specification. |
| @var{test-spec} must be a valid EUnit test specification, as defined in |
| the @uref{https://@/erlang.org/@/doc/@/apps/@/eunit/@/index.html, EUnit |
| Reference Manual}. @var{erlflags} are optional command-line options |
| passed to the Erlang interpreter to execute the test Erlang module. |
| Typically, @var{erlflags} defines at least the paths to directories |
| containing the compiled Erlang modules under test, as @samp{-pa path1 |
| path2 ...}. |
| |
| For example, the unit tests associated with Erlang module @samp{testme}, |
| which compiled code is in subdirectory @file{src}, can be performed |
| with: |
| |
| @example |
| AT_CHECK_EUNIT([testme_testsuite], [@{module, testme@}], |
| [-pa "$@{abs_top_builddir@}/src"]) |
| @end example |
| |
| This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}. |
| |
| Variables @code{ERL}, @code{ERLC}, and (optionally) @code{ERLCFLAGS} |
| must be defined as the path of the Erlang interpreter, the path of the |
| Erlang compiler, and the command-line flags to pass to the compiler, |
| respectively. Those variables should be configured in |
| @file{configure.ac} using the @command{AC_ERLANG_PATH_ERL} and |
| @command{AC_ERLANG_PATH_ERLC} macros, and the configured values of those |
| variables are automatically defined in the testsuite. If @code{ERL} or |
| @code{ERLC} is not defined, the test group is skipped. |
| |
| If the EUnit library cannot be found, i.e. if module @code{eunit} cannot |
| be loaded, the test group is skipped. Otherwise, if @var{test-spec} is |
| an invalid EUnit test specification, the test group fails. Otherwise, |
| if the EUnit test passes, shell commands @var{run-if-pass} are executed |
| or, if the EUnit test fails, shell commands @var{run-if-fail} are |
| executed and the test group fails. |
| |
| Only the generated test Erlang module is automatically compiled and |
| executed. If @var{test-spec} involves testing other Erlang modules, |
| e.g. module @samp{testme} in the example above, those modules must be |
| already compiled. |
| |
| If the testsuite is run in verbose mode and with the @option{--verbose} option, |
| EUnit is also run in verbose mode to output more details about |
| individual unit tests. |
| @end defmac |
| |
| |
| @node testsuite Invocation |
| @section Running @command{testsuite} Scripts |
| @cindex @command{testsuite} |
| |
| Autotest test suites support the following options: |
| |
| @table @option |
| @item --help |
| @itemx -h |
| Display the list of options and exit successfully. |
| |
| @item --version |
| @itemx -V |
| Display the version of the test suite and exit successfully. |
| |
| @item --directory=@var{dir} |
| @itemx -C @var{dir} |
| Change the current directory to @var{dir} before creating any files. |
| Useful for running the testsuite in a subdirectory from a top-level |
| Makefile. |
| |
| @item --jobs@r{[}=@var{n}@r{]} |
| @itemx -j@ovar{n} |
| Run @var{n} tests in parallel, if possible. If @var{n} is not given, |
| run all given tests in parallel. Note that there should be no space |
| before the argument to @option{-j}, as @option{-j @var{number}} denotes |
| the separate arguments @option{-j} and @option{@var{number}}, see below. |
| |
| In parallel mode, the standard input device of the testsuite script is |
| not available to commands inside a test group. Furthermore, banner |
| lines are not printed, and the summary line for each test group is |
| output after the test group completes. Summary lines may appear |
| unordered. If verbose and trace output are enabled (see below), they |
| may appear intermixed from concurrently running tests. |
| |
| Parallel mode requires the @command{mkfifo} command to work, and will be |
| silently disabled otherwise. |
| |
| @item --clean |
| @itemx -c |
| Remove all the files the test suite might have created and exit. Meant |
| for @code{clean} Make targets. |
| |
| @item --list |
| @itemx -l |
| List all the tests (or only the selection), including their possible |
| keywords. |
| @end table |
| |
| @sp 1 |
| |
| By default all tests are performed (or described with @option{--list}) |
| silently in the default environment, but the environment, set of tests, |
| and verbosity level can be tuned: |
| |
| @table @samp |
| @item @var{variable}=@var{value} |
| Set the environment @var{variable} to @var{value}. Use this rather |
| than @samp{FOO=foo ./testsuite} as debugging scripts would then run in a |
| different environment. |
| |
| @cindex @code{AUTOTEST_PATH} |
| The variable @code{AUTOTEST_PATH} specifies the testing path to prepend |
| to @env{PATH}. Relative directory names (not starting with |
| @samp{/}) are considered to be relative to the top level of the |
| package being built. All directories are made absolute, first |
| starting from the top level @emph{build} tree, then from the |
| @emph{source} tree. For instance @samp{./testsuite |
| AUTOTEST_PATH=tests:bin} for a @file{/src/foo-1.0} source package built |
| in @file{/tmp/foo} results in @samp{/tmp/foo/tests:/tmp/foo/bin} and |
| then @samp{/src/foo-1.0/tests:/src/foo-1.0/bin} being prepended to |
| @env{PATH}. |
| |
| @item @var{number} |
| @itemx @var{number}-@var{number} |
| @itemx @var{number}- |
| @itemx -@var{number} |
| Add the corresponding test groups, with obvious semantics, to the |
| selection. |
| |
| @item --keywords=@var{keywords} |
| @itemx -k @var{keywords} |
| Add to the selection the test groups with title or keywords (arguments |
| to @code{AT_SETUP} or @code{AT_KEYWORDS}) that match @emph{all} keywords |
| of the comma separated list @var{keywords}, case-insensitively. Use |
| @samp{!} immediately before the keyword to invert the selection for this |
| keyword. By default, the keywords match whole words; enclose them in |
| @samp{.*} to also match parts of words. |
| |
| For example, running |
| |
| @example |
| @kbd{./testsuite -k 'autoupdate,.*FUNC.*'} |
| @end example |
| |
| @noindent |
| selects all tests tagged @samp{autoupdate} @emph{and} with tags |
| containing @samp{FUNC} (as in @samp{AC_CHECK_FUNC}, @samp{AC_FUNC_ALLOCA}, |
| etc.), while |
| |
| @example |
| @kbd{./testsuite -k '!autoupdate' -k '.*FUNC.*'} |
| @end example |
| |
| @noindent |
| selects all tests not tagged @samp{autoupdate} @emph{or} with tags |
| containing @samp{FUNC}. |
| |
| @item --errexit |
| @itemx -e |
| If any test fails, immediately abort testing. This implies |
| @option{--debug}: post test group clean up, and top-level logging |
| are inhibited. This option is meant for the full test |
| suite, it is not really useful for generated debugging scripts. |
| If the testsuite is run in parallel mode using @option{--jobs}, |
| then concurrently running tests will finish before exiting. |
| |
| @item --verbose |
| @itemx -v |
| Force more verbosity in the detailed output of what is being done. This |
| is the default for debugging scripts. |
| |
| @item --color |
| @itemx --color@r{[}=never@r{|}auto@r{|}always@r{]} |
| Enable colored test results. Without an argument, or with @samp{always}, |
| test results will be colored. With @samp{never}, color mode is turned |
| off. Otherwise, if either the macro @code{AT_COLOR_TESTS} is used by |
| the testsuite author, or the argument @samp{auto} is given, then test |
| results are colored if standard output is connected to a terminal. |
| |
| @item --debug |
| @itemx -d |
| Do not remove the files after a test group was performed---but they are |
| still removed @emph{before}, therefore using this option is sane when |
| running several test groups. Create debugging scripts. Do not |
| overwrite the top-level |
| log (in order to preserve a supposedly existing full log file). This is |
| the default for debugging scripts, but it can also be useful to debug |
| the testsuite itself. |
| |
| @item --recheck |
| Add to the selection all test groups that failed or passed unexpectedly |
| during the last non-debugging test run. |
| |
| @item --trace |
| @itemx -x |
| Trigger shell tracing of the test groups. |
| @end table |
| |
| Besides these options accepted by every Autotest testsuite, the |
| testsuite author might have added package-specific options |
| via the @code{AT_ARG_OPTION} and @code{AT_ARG_OPTION_ARG} macros |
| (@pxref{Writing Testsuites}); refer to @command{testsuite --help} and |
| the package documentation for details. |
| |
| |
| @node Making testsuite Scripts |
| @section Making @command{testsuite} Scripts |
| |
| For putting Autotest into movement, you need some configuration and |
| makefile machinery. We recommend, at least if your package uses deep or |
| shallow hierarchies, that you use @file{tests/} as the name of the |
| directory holding all your tests and their makefile. Here is a |
| check list of things to do, followed by an example, taking into |
| consideration whether you are also using Automake. |
| |
| @itemize @minus |
| |
| @item |
| @cindex @file{package.m4} |
| @atindex{PACKAGE_STRING} |
| @atindex{PACKAGE_BUGREPORT} |
| @atindex{PACKAGE_NAME} |
| @atindex{PACKAGE_TARNAME} |
| @atindex{PACKAGE_VERSION} |
| @atindex{PACKAGE_URL} |
| Make sure to create the file @file{package.m4}, which defines the |
| identity of the package. It must define @code{AT_PACKAGE_STRING}, the |
| full signature of the package, and @code{AT_PACKAGE_BUGREPORT}, the |
| address to which bug reports should be sent. For sake of completeness, |
| we suggest that you also define @code{AT_PACKAGE_NAME}, |
| @code{AT_PACKAGE_TARNAME}, @code{AT_PACKAGE_VERSION}, and |
| @code{AT_PACKAGE_URL}. |
| @xref{Initializing configure}, for a description of these variables. |
| Be sure to distribute @file{package.m4} and to put it into the source |
| hierarchy: the test suite ought to be shipped! See below for an example. |
| |
| @item |
| Invoke @code{AC_CONFIG_TESTDIR} in your @file{configure.ac}. |
| |
| @defmac AC_CONFIG_TESTDIR (@var{directory}, @dvarv{test-path, directory}) |
| @acindex{CONFIG_TESTDIR} |
| An Autotest test suite is to be configured in @var{directory}. This |
| macro causes @file{@var{directory}/atconfig} to be created by |
| @command{config.status} and sets the default @code{AUTOTEST_PATH} to |
| @var{test-path} (@pxref{testsuite Invocation}). |
| @end defmac |
| |
| @item |
| Still within @file{configure.ac}, as appropriate, ensure that some |
| @code{AC_CONFIG_FILES} command includes substitution for |
| @file{tests/atlocal}. |
| |
| @item |
| Also within your @file{configure.ac}, arrange for the @code{AUTOM4TE} |
| variable to be set. |
| |
| @item |
| The appropriate @file{Makefile} should be modified so the validation in |
| your package is triggered by @samp{make check}. |
| @end itemize |
| |
| The following example demonstrates the above checklist, first by |
| assuming that you are using Automake (see below for tweaks to make to |
| get the same results without Automake). Begin by adding the following |
| lines to your @file{configure.ac}: |
| |
| @example |
| # Initialize the test suite. |
| AC_CONFIG_TESTDIR([tests]) |
| AC_CONFIG_FILES([tests/Makefile tests/atlocal]) |
| AM_MISSING_PROG([AUTOM4TE], [autom4te]) |
| @end example |
| |
| Next, add the following lines to your @file{tests/Makefile.am}, in order |
| to link @samp{make check} with a validation suite. |
| |
| @example |
| $(srcdir)/package.m4: $(top_srcdir)/configure.ac |
| printf >'$@@' '%s\n' \ |
| '# Signature of the current package.' \ |
| 'm4_define([AT_PACKAGE_NAME], [$(PACKAGE_NAME)])' \ |
| 'm4_define([AT_PACKAGE_TARNAME], [$(PACKAGE_TARNAME)])' \ |
| 'm4_define([AT_PACKAGE_VERSION], [$(PACKAGE_VERSION)])' \ |
| 'm4_define([AT_PACKAGE_STRING], [$(PACKAGE_STRING)])' \ |
| 'm4_define([AT_PACKAGE_URL], [$(PACKAGE_URL)])' \ |
| 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])' |
| |
| EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in |
| TESTSUITE = $(srcdir)/testsuite |
| |
| check-local: atconfig atlocal $(TESTSUITE) |
| $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS) |
| |
| installcheck-local: atconfig atlocal $(TESTSUITE) |
| $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \ |
| $(TESTSUITEFLAGS) |
| |
| clean-local: |
| test ! -f '$(TESTSUITE)' || \ |
| $(SHELL) '$(TESTSUITE)' --clean |
| |
| AUTOTEST = $(AUTOM4TE) --language=autotest |
| $(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4 |
| $(AUTOTEST) -I '$(srcdir)' -o $@@.tmp $@@.at |
| mv $@@.tmp $@@ |
| @end example |
| |
| Note that the built testsuite is distributed; this is necessary because |
| users might not have Autoconf installed, and thus would not be able to |
| rebuild it. Likewise, the use of Automake's @code{AM_MISSING_PROG} will |
| arrange for the definition of @code{$AUTOM4TE} within the Makefile to |
| provide the user with |
| a nicer error message if they modify a source file to the testsuite, and |
| accidentally trigger the rebuild rules. |
| |
| You might want to list explicitly the dependencies, i.e., the list of |
| the files @file{testsuite.at} includes. |
| |
| If you don't use Automake, you should make the following tweaks. In |
| your @file{configure.ac}, replace the @code{AM_MISSING_PROG} line above |
| with @code{AC_PATH_PROG([AUTOM4TE], [autom4te], [false])}. You are |
| welcome to also try using the @command{missing} script from the Automake |
| project instead of @command{false}, to try to get a nicer error message |
| when the user modifies prerequisites but did not have Autoconf |
| installed, but at that point you may be better off using Automake. |
| Then, take the code suggested above for @file{tests/@/Makefile.am} and |
| place it in your @file{tests/@/Makefile.in} instead. Add code to your |
| @file{tests/@/Makefile.in} to ensure that @code{$(EXTRA_DIST)} files are |
| distributed, as well as adding the following additional lines to prepare |
| the set of needed Makefile variables: |
| |
| @example |
| subdir = tests |
| PACKAGE_NAME = @@PACKAGE_NAME@@ |
| PACKAGE_TARNAME = @@PACKAGE_TARNAME@@ |
| PACKAGE_VERSION = @@PACKAGE_VERSION@@ |
| PACKAGE_STRING = @@PACKAGE_STRING@@ |
| PACKAGE_BUGREPORT = @@PACKAGE_BUGREPORT@@ |
| PACKAGE_URL = @@PACKAGE_URL@@ |
| AUTOM4TE = @@AUTOM4TE@@ |
| |
| atconfig: $(top_builddir)/config.status |
| cd $(top_builddir) && \ |
| $(SHELL) ./config.status $(subdir)/$@@ |
| |
| atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status |
| cd $(top_builddir) && \ |
| $(SHELL) ./config.status $(subdir)/$@@ |
| @end example |
| |
| Using the above example (with or without Automake), and assuming you |
| were careful to not initialize @samp{TESTSUITEFLAGS} within your |
| makefile, you can now fine-tune test suite execution at runtime by |
| altering this variable, for example: |
| |
| @example |
| make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g' |
| @end example |
| |
| |
| |
| @c =============================== Frequent Autoconf Questions, with answers |
| |
| @node FAQ |
| @chapter Frequent Autoconf Questions, with answers |
| |
| Several questions about Autoconf come up occasionally. Here some of them |
| are addressed. |
| |
| @menu |
| * Distributing:: Distributing @command{configure} scripts |
| * Why GNU M4:: Why not use the standard M4? |
| * Bootstrapping:: Autoconf and GNU M4 require each other? |
| * Why Not Imake:: Why GNU uses @command{configure} instead of Imake |
| * Defining Directories:: Passing @code{datadir} to program |
| * Autom4te Cache:: What is it? Can I remove it? |
| * Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree |
| * Expanded Before Required:: Expanded Before Required |
| * Debugging:: Debugging @command{configure} scripts |
| @end menu |
| |
| @node Distributing |
| @section Distributing @command{configure} Scripts |
| @cindex License |
| |
| @display |
| What are the restrictions on distributing @command{configure} |
| scripts that Autoconf generates? How does that affect my |
| programs that use them? |
| @end display |
| |
| There are no restrictions on how the configuration scripts that Autoconf |
| produces may be distributed or used. In Autoconf version 1, they were |
| covered by the GNU General Public License. We still encourage |
| software authors to distribute their work under terms like those of the |
| GPL, but doing so is not required to use Autoconf. |
| |
| Of the other files that might be used with @command{configure}, |
| @file{config.h.in} is under whatever copyright you use for your |
| @file{configure.ac}. @file{config.sub} and @file{config.guess} have an |
| exception to the GPL when they are used with an Autoconf-generated |
| @command{configure} script, which permits you to distribute them under the |
| same terms as the rest of your package. @file{install-sh} is from the X |
| Consortium and is not copyrighted. |
| |
| @node Why GNU M4 |
| @section Why Require GNU M4? |
| |
| @display |
| Why does Autoconf require GNU M4? |
| @end display |
| |
| Many M4 implementations have hard-coded limitations on the size and |
| number of macros that Autoconf exceeds. They also lack several |
| builtin macros that it would be difficult to get along without in a |
| sophisticated application like Autoconf, including: |
| |
| @example |
| m4_builtin |
| m4_indir |
| m4_bpatsubst |
| __file__ |
| __line__ |
| @end example |
| |
| Autoconf requires version 1.4.8 or later of GNU M4. |
| It works better with version 1.4.16 or later. |
| |
| Since only software maintainers need to use Autoconf, and since GNU |
| M4 is simple to configure and install, it seems reasonable to require |
| GNU M4 to be installed also. Many maintainers of GNU and |
| other free software already have most of the GNU utilities |
| installed, since they prefer them. |
| |
| @node Bootstrapping |
| @section How Can I Bootstrap? |
| @cindex Bootstrap |
| |
| @display |
| If Autoconf requires GNU M4 and GNU M4 has an Autoconf |
| @command{configure} script, how do I bootstrap? It seems like a chicken |
| and egg problem! |
| @end display |
| |
| This is a misunderstanding. Although GNU M4 does come with a |
| @command{configure} script produced by Autoconf, Autoconf is not required |
| in order to run the script and install GNU M4. Autoconf is only |
| required if you want to change the M4 @command{configure} script, which few |
| people have to do (mainly its maintainer). |
| |
| @node Why Not Imake |
| @section Why Not Imake? |
| @cindex Imake |
| |
| @display |
| Why not use Imake instead of @command{configure} scripts? |
| @end display |
| |
| Several people have written addressing this question, so |
| adaptations of their explanations are included here. |
| |
| The following answer is based on one written by Richard Pixley: |
| |
| @quotation |
| Autoconf generated scripts frequently work on machines that it has |
| never been set up to handle before. That is, it does a good job of |
| inferring a configuration for a new system. Imake cannot do this. |
| |
| Imake uses a common database of host specific data. For X11, this makes |
| sense because the distribution is made as a collection of tools, by one |
| central authority who has control over the database. |
| |
| GNU tools are not released this way. Each GNU tool has a |
| maintainer; these maintainers are scattered across the world. Using a |
| common database would be a maintenance nightmare. Autoconf may appear |
| to be this kind of database, but in fact it is not. Instead of listing |
| host dependencies, it lists program requirements. |
| |
| If you view the GNU suite as a collection of native tools, then the |
| problems are similar. But the GNU development tools can be |
| configured as cross tools in almost any host+target permutation. All of |
| these configurations can be installed concurrently. They can even be |
| configured to share host independent files across hosts. Imake doesn't |
| address these issues. |
| |
| Imake templates are a form of standardization. The GNU coding |
| standards address the same issues without necessarily imposing the same |
| restrictions. |
| @end quotation |
| |
| |
| Here is some further explanation, written by Per Bothner: |
| |
| @quotation |
| One of the advantages of Imake is that it is easy to generate large |
| makefiles using the @samp{#include} and macro mechanisms of @command{cpp}. |
| However, @code{cpp} is not programmable: it has limited conditional |
| facilities, and no looping. And @code{cpp} cannot inspect its |
| environment. |
| |
| All of these problems are solved by using @code{sh} instead of |
| @code{cpp}. The shell is fully programmable, has macro substitution, |
| can execute (or source) other shell scripts, and can inspect its |
| environment. |
| @end quotation |
| |
| |
| Paul Eggert elaborates more: |
| |
| @quotation |
| With Autoconf, installers need not assume that Imake itself is already |
| installed and working well. This may not seem like much of an advantage |
| to people who are accustomed to Imake. But on many hosts Imake is not |
| installed or the default installation is not working well, and requiring |
| Imake to install a package hinders the acceptance of that package on |
| those hosts. For example, the Imake template and configuration files |
| might not be installed properly on a host, or the Imake build procedure |
| might wrongly assume that all source files are in one big directory |
| tree, or the Imake configuration might assume one compiler whereas the |
| package or the installer needs to use another, or there might be a |
| version mismatch between the Imake expected by the package and the Imake |
| supported by the host. These problems are much rarer with Autoconf, |
| where each package comes with its own independent configuration |
| processor. |
| |
| Also, Imake often suffers from unexpected interactions between |
| @command{make} and the installer's C preprocessor. The fundamental problem |
| here is that the C preprocessor was designed to preprocess C programs, |
| not makefiles. This is much less of a problem with Autoconf, |
| which uses the general-purpose preprocessor M4, and where the |
| package's author (rather than the installer) does the preprocessing in a |
| standard way. |
| @end quotation |
| |
| |
| Finally, Mark Eichin notes: |
| |
| @quotation |
| Imake isn't all that extensible, either. In order to add new features to |
| Imake, you need to provide your own project template, and duplicate most |
| of the features of the existing one. This means that for a sophisticated |
| project, using the vendor-provided Imake templates fails to provide any |
| leverage---since they don't cover anything that your own project needs |
| (unless it is an X11 program). |
| |
| On the other side, though: |
| |
| The one advantage that Imake has over @command{configure}: |
| @file{Imakefile} files tend to be much shorter (likewise, less redundant) |
| than @file{Makefile.in} files. There is a fix to this, however---at least |
| for the Kerberos V5 tree, we've modified things to call in common |
| @file{post.in} and @file{pre.in} makefile fragments for the |
| entire tree. This means that a lot of common things don't have to be |
| duplicated, even though they normally are in @command{configure} setups. |
| @end quotation |
| |
| |
| @node Defining Directories |
| @section How Do I @code{#define} Installation Directories? |
| |
| @display |
| My program needs library files, installed in @code{datadir} and |
| similar. If I use |
| |
| @example |
| AC_DEFINE_UNQUOTED([DATADIR], [$datadir], |
| [Define to the read-only architecture-independent |
| data directory.]) |
| @end example |
| |
| @noindent |
| I get |
| |
| @example |
| #define DATADIR "$@{prefix@}/share" |
| @end example |
| @end display |
| |
| As already explained, this behavior is on purpose, mandated by the |
| GNU Coding Standards, see @ref{Installation Directory |
| Variables}. There are several means to achieve a similar goal: |
| |
| @itemize @minus |
| @item |
| Do not use @code{AC_DEFINE} but use your makefile to pass the |
| actual value of @code{datadir} via compilation flags. |
| @xref{Installation Directory Variables}, for the details. |
| |
| @item |
| This solution can be simplified when compiling a program: you may either |
| extend the @code{CPPFLAGS}: |
| |
| @example |
| CPPFLAGS = -DDATADIR='"$(datadir)"' @@CPPFLAGS@@ |
| @end example |
| |
| @noindent |
| If you are using Automake, you should use @code{AM_CPPFLAGS} instead: |
| |
| @example |
| AM_CPPFLAGS = -DDATADIR='"$(datadir)"' |
| @end example |
| |
| @noindent |
| Alternatively, create a dedicated header file: |
| |
| @example |
| DISTCLEANFILES = myprog-paths.h |
| myprog-paths.h: Makefile |
| printf '%s\n' '#define DATADIR "$(datadir)"' >$@@ |
| @end example |
| |
| @noindent |
| The Gnulib module @samp{configmake} provides such a header with all the |
| standard directory variables defined, @pxref{configmake,,, gnulib, GNU |
| Gnulib}. |
| |
| @item |
| Use @code{AC_DEFINE} but have @command{configure} compute the literal |
| value of @code{datadir} and others. Many people have wrapped macros to |
| automate this task; for an example, see the macro @code{AC_DEFINE_DIR} from |
| the @uref{https://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro |
| Archive}. |
| |
| This solution does not conform to the GNU Coding Standards. |
| |
| @item |
| Note that all the previous solutions hard wire the absolute name of |
| these directories in the executables, which is not a good property. You |
| may try to compute the names relative to @code{prefix}, and try to |
| find @code{prefix} at runtime, this way your package is relocatable. |
| @end itemize |
| |
| |
| @node Autom4te Cache |
| @section What is @file{autom4te.cache}? |
| |
| @display |
| What is this directory @file{autom4te.cache}? Can I safely remove it? |
| @end display |
| |
| In the GNU Build System, @file{configure.ac} plays a central |
| role and is read by many tools: @command{autoconf} to create |
| @file{configure}, @command{autoheader} to create @file{config.h.in}, |
| @command{automake} to create @file{Makefile.in}, @command{autoscan} to |
| check the completeness of @file{configure.ac}, @command{autoreconf} to |
| check the GNU Build System components that are used. To |
| ``read @file{configure.ac}'' actually means to compile it with M4, |
| which can be a long process for complex @file{configure.ac}. |
| |
| This is why all these tools, instead of running directly M4, invoke |
| @command{autom4te} (@pxref{autom4te Invocation}) which, while answering to |
| a specific demand, stores additional information in |
| @file{autom4te.cache} for future runs. For instance, if you run |
| @command{autoconf}, behind the scenes, @command{autom4te} also |
| stores information for the other tools, so that when you invoke |
| @command{autoheader} or @command{automake} etc., reprocessing |
| @file{configure.ac} is not needed. The speed up is frequently 30%, |
| and is increasing with the size of @file{configure.ac}. |
| |
| But it is and remains being simply a cache: you can safely remove it. |
| |
| @sp 1 |
| |
| @display |
| Can I permanently get rid of it? |
| @end display |
| |
| The creation of this cache can be disabled from |
| @file{~/.autom4te.cfg}, see @ref{Customizing autom4te}, for more |
| details. You should be aware that disabling the cache slows down the |
| Autoconf test suite by 40%. The more GNU Build System |
| components are used, the more the cache is useful; for instance |
| running @samp{autoreconf -f} on the Core Utilities is twice slower without |
| the cache @emph{although @option{--force} implies that the cache is |
| not fully exploited}, and eight times slower than without |
| @option{--force}. |
| |
| |
| @node Present But Cannot Be Compiled |
| @section Header Present But Cannot Be Compiled |
| |
| The most important guideline to bear in mind when checking for |
| features is to mimic as much as possible the intended use. |
| Unfortunately, old versions of @code{AC_CHECK_HEADER} and |
| @code{AC_CHECK_HEADERS} failed to follow this idea, and called |
| the preprocessor, instead of the compiler, to check for headers. As a |
| result, incompatibilities between headers went unnoticed during |
| configuration, and maintainers finally had to deal with this issue |
| elsewhere. |
| |
| The transition began with Autoconf 2.56. As of Autoconf 2.64 both |
| checks are performed, and @command{configure} complains loudly if the |
| compiler and the preprocessor do not agree. However, only the compiler |
| result is considered. As of Autoconf 2.70, only the compiler check is |
| performed. |
| |
| Consider the following example: |
| |
| @smallexample |
| $ @kbd{cat number.h} |
| typedef int number; |
| $ @kbd{cat pi.h} |
| const number pi = 3; |
| $ @kbd{cat configure.ac} |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AC_CHECK_HEADERS([pi.h]) |
| $ @kbd{autoconf -Wall} |
| $ @kbd{./configure CPPFLAGS='-I.'} |
| checking for gcc... gcc |
| checking whether the C compiler works... yes |
| checking for C compiler default output file name... a.out |
| checking for suffix of executables... |
| checking whether we are cross compiling... no |
| checking for suffix of object files... o |
| checking whether the compiler supports GNU C... yes |
| checking whether gcc accepts -g... yes |
| checking for gcc option to enable C23 features... -std=gnu23 |
| checking for sys/types.h... yes |
| checking for sys/stat.h... yes |
| checking for strings.h... yes |
| checking for inttypes.h... yes |
| checking for stdint.h... yes |
| checking for unistd.h... yes |
| checking for pi.h... no |
| @end smallexample |
| |
| @noindent |
| The proper way to handle this case is using the fourth argument |
| (@pxref{Generic Headers}): |
| |
| @example |
| $ @kbd{cat configure.ac} |
| AC_INIT([Example], [1.0], [bug-example@@example.org]) |
| AC_CHECK_HEADERS([number.h pi.h], [], [], |
| [[#ifdef HAVE_NUMBER_H |
| # include <number.h> |
| #endif |
| ]]) |
| $ @kbd{autoconf -Wall} |
| $ @kbd{./configure CPPFLAGS='-I.'} |
| checking for gcc... gcc |
| checking whether the C compiler works... yes |
| checking for C compiler default output file name... a.out |
| checking for suffix of executables... |
| checking whether we are cross compiling... no |
| checking for suffix of object files... o |
| checking whether the compiler supports GNU C... yes |
| checking whether gcc accepts -g... yes |
| checking for gcc option to enable C23 features... -std=gnu23 |
| checking for number.h... yes |
| checking for pi.h... yes |
| @end example |
| |
| See @ref{Particular Headers}, for a list of headers with their |
| prerequisites. |
| |
| @node Expanded Before Required |
| @section Expanded Before Required |
| |
| @cindex expanded before required |
| Older versions of Autoconf silently built files with incorrect ordering |
| between dependent macros if an outer macro first expanded, then later |
| indirectly required, an inner macro. Starting with Autoconf 2.64, this |
| situation no longer generates out-of-order code, but results in |
| duplicate output and a syntax warning: |
| |
| @example |
| $ @kbd{cat configure.ac} |
| @result{}AC_DEFUN([TESTA], [[echo in A |
| @result{}if test -n "$SEEN_A" ; then echo duplicate ; fi |
| @result{}SEEN_A=:]]) |
| @result{}AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B |
| @result{}if test -z "$SEEN_A" ; then echo bug ; fi]]) |
| @result{}AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]]) |
| @result{}AC_DEFUN([OUTER], [[echo in OUTER] |
| @result{}TESTA |
| @result{}TESTC]) |
| @result{}AC_INIT |
| @result{}OUTER |
| @result{}AC_OUTPUT |
| $ @kbd{autoconf} |
| @result{}configure.ac:11: warning: AC_REQUIRE: |
| @result{} 'TESTA' was expanded before it was required |
| @result{}configure.ac:4: TESTB is expanded from... |
| @result{}configure.ac:6: TESTC is expanded from... |
| @result{}configure.ac:7: OUTER is expanded from... |
| @result{}configure.ac:11: the top level |
| @end example |
| |
| @noindent |
| To avoid this warning, decide what purpose the macro in question serves. |
| If it only needs to be expanded once (for example, if it provides |
| initialization text used by later macros), then the simplest fix is to |
| change the macro to be declared with @code{AC_DEFUN_ONCE} |
| (@pxref{One-Shot Macros}), although this only works in Autoconf 2.64 and |
| newer. A more portable fix is to change all |
| instances of direct calls to instead go through @code{AC_REQUIRE} |
| (@pxref{Prerequisite Macros}). If, instead, the macro is parameterized |
| by arguments or by the current definition of other macros in the m4 |
| environment, then the macro should always be directly expanded instead |
| of required. |
| |
| For another case study, consider this example trimmed down from an |
| actual package. Originally, the package contained shell code and |
| multiple macro invocations at the top level of @file{configure.ac}: |
| |
| @example |
| AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])]) |
| foobar= |
| AC_PROG_CC |
| FOO |
| @end example |
| |
| @noindent |
| but that was getting complex, so the author wanted to offload some of |
| the text into a new macro in another file included via |
| @file{aclocal.m4}. The naïve approach merely wraps the text in a new |
| macro: |
| |
| @example |
| AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])]) |
| AC_DEFUN([BAR], [ |
| foobar= |
| AC_PROG_CC |
| FOO |
| ]) |
| BAR |
| @end example |
| |
| @noindent |
| With older versions of Autoconf, the setting of @samp{foobar=} occurs |
| before the single compiler check, as the author intended. But with |
| Autoconf 2.64, this issues the ``expanded before it was required'' |
| warning for @code{AC_PROG_CC}, and outputs two copies of the compiler |
| check, one before @samp{foobar=}, and one after. To understand why this |
| is happening, remember that the use of @code{AC_COMPILE_IFELSE} includes |
| a call to @code{AC_REQUIRE([AC_PROG_CC])} under the hood. According to |
| the documented semantics of @code{AC_REQUIRE}, this means that |
| @code{AC_PROG_CC} @emph{must} occur before the body of the outermost |
| @code{AC_DEFUN}, which in this case is @code{BAR}, thus preceding the |
| use of @samp{foobar=}. The older versions of Autoconf were broken with |
| regards to the rules of @code{AC_REQUIRE}, which explains why the code |
| changed from one over to two copies of @code{AC_PROG_CC} when upgrading |
| autoconf. In other words, the author was unknowingly relying on a bug |
| exploit to get the desired results, and that exploit broke once the bug |
| was fixed. |
| |
| So, what recourse does the author have, to restore their intended |
| semantics of setting @samp{foobar=} prior to a single compiler check, |
| regardless of whether Autoconf 2.63 or 2.64 is used? One idea is to |
| remember that only @code{AC_DEFUN} is impacted by @code{AC_REQUIRE}; |
| there is always the possibility of using the lower-level |
| @code{m4_define}: |
| |
| @example |
| AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])]) |
| m4_define([BAR], [ |
| foobar= |
| AC_PROG_CC |
| FOO |
| ]) |
| BAR |
| @end example |
| |
| @noindent |
| This works great if everything is in the same file. However, it does |
| not help in the case where the author wants to have @command{aclocal} |
| find the definition of @code{BAR} from its own file, since |
| @command{aclocal} requires the use of @code{AC_DEFUN}. In this case, a |
| better fix is to recognize that if @code{BAR} also uses |
| @code{AC_REQUIRE}, then there will no longer be direct expansion prior |
| to a subsequent require. Then, by creating yet another helper macro, |
| the author can once again guarantee a single invocation of |
| @code{AC_PROG_CC}, which will still occur after @code{foobar=}. The |
| author can also use @code{AC_BEFORE} to make sure no other macro |
| appearing before @code{BAR} has triggered an unwanted expansion of |
| @code{AC_PROG_CC}. |
| |
| @example |
| AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])]) |
| AC_DEFUN([BEFORE_CC], [ |
| foobar= |
| ]) |
| AC_DEFUN([BAR], [ |
| AC_BEFORE([$0], [AC_PROG_CC])dnl |
| AC_REQUIRE([BEFORE_CC])dnl |
| AC_REQUIRE([AC_PROG_CC])dnl |
| FOO |
| ]) |
| BAR |
| @end example |
| |
| |
| @node Debugging |
| @section Debugging @command{configure} scripts |
| |
| While in general, @command{configure} scripts generated by Autoconf |
| strive to be fairly portable to various systems, compilers, shells, and |
| other tools, it may still be necessary to debug a failing test, broken |
| script or makefile, or fix or override an incomplete, faulty, or erroneous |
| test, especially during macro development. Failures can occur at all levels, |
| in M4 syntax or semantics, shell script issues, or due to bugs in the |
| test or the tools invoked by @command{configure}. Together with the |
| rather arcane error message that @command{m4} and @command{make} may |
| produce when their input contains syntax errors, this can make debugging |
| rather painful. |
| |
| Nevertheless, here is a list of hints and strategies that may help: |
| |
| @itemize |
| @item |
| When @command{autoconf} fails, common causes for error include: |
| |
| @itemize |
| @item |
| mismatched or unbalanced parentheses or braces (@pxref{Balancing |
| Parentheses}), |
| |
| @item under- or over-quoted macro arguments (@pxref{Autoconf |
| Language}, @pxref{Quoting and Parameters}, @pxref{Quotation and Nested |
| Macros}), |
| |
| @item spaces between macro name and opening parenthesis (@pxref{Autoconf |
| Language}). |
| @end itemize |
| |
| Typically, it helps to go back to the last working version of the input |
| and compare the differences for each of these errors. Another |
| possibility is to sprinkle pairs of @code{m4_traceon} and |
| @code{m4_traceoff} judiciously in the code, either without a parameter |
| or listing some macro names and watch @command{m4} expand its input |
| verbosely (@pxref{Debugging via autom4te}). |
| |
| @item |
| Sometimes @command{autoconf} succeeds but the generated |
| @command{configure} script has invalid shell syntax. You can detect this |
| case by running @samp{bash -n configure} or @samp{sh -n configure}. |
| If this command fails, the same tips apply, as if @command{autoconf} had |
| failed. |
| |
| @item |
| Debugging @command{configure} script execution may be done by sprinkling |
| pairs of @code{set -x} and @code{set +x} into the shell script before |
| and after the region that contains a bug. Running the whole script with |
| @samp{@var{shell} -vx ./configure 2>&1 | tee @var{log-file}} with a decent |
| @var{shell} may work, but produces lots of output. Here, it can help to |
| search for markers like @samp{checking for} a particular test in the |
| @var{log-file}. |
| |
| @item |
| Alternatively, you might use a shell with debugging capabilities like |
| @uref{https://bashdb.sourceforge.net/, bashdb}. |
| |
| @item |
| When @command{configure} tests produce invalid results for your system, |
| it may be necessary to override them: |
| |
| @itemize |
| @item |
| For programs, tools or libraries variables, preprocessor, compiler, or |
| linker flags, it is often sufficient to override them at @command{make} |
| run time with some care (@pxref{Macros and Submakes}). Since this |
| normally won't cause @command{configure} to be run again with these |
| changed settings, it may fail if the changed variable would have caused |
| different test results from @command{configure}, so this may work only |
| for simple differences. |
| |
| @item |
| Most tests which produce their result in a substituted variable allow to |
| override the test by setting the variable on the @command{configure} |
| command line (@pxref{Compilers and Options}, @pxref{Defining Variables}). |
| |
| @item |
| Many tests store their result in a cache variable (@pxref{Caching |
| Results}). This lets you override them either on the |
| @command{configure} command line as above, or through a primed cache or |
| site file (@pxref{Cache Files}, @pxref{Site Defaults}). The name of a |
| cache variable is documented with a test macro or may be inferred from |
| @ref{Cache Variable Names}; the precise semantics of undocumented |
| variables are often internal details, subject to change. |
| @end itemize |
| |
| @item |
| Alternatively, @command{configure} may produce invalid results because |
| of uncaught programming errors, in your package or in an upstream |
| library package. For example, when @code{AC_CHECK_LIB} fails to find a |
| library with a specified function, always check @file{config.log}. This |
| will reveal the exact error that produced the failing result: the |
| library linked by @code{AC_CHECK_LIB} probably has a fatal bug. |
| @end itemize |
| |
| Conversely, as macro author, you can make it easier for users of your |
| macro: |
| |
| @itemize |
| @item |
| by minimizing dependencies between tests and between test results as far |
| as possible, |
| |
| @item |
| by using @command{make} variables to factorize and allow |
| override of settings at @command{make} run time, |
| |
| @item |
| by honoring the GNU Coding Standards and not overriding flags |
| reserved for the user except temporarily during @command{configure} |
| tests, |
| |
| @item |
| by not requiring users of your macro to use the cache variables. |
| Instead, expose the result of the test via @var{run-if-true} and |
| @var{run-if-false} parameters. If the result is not a boolean, |
| then provide it through documented shell variables. |
| @end itemize |
| |
| |
| @c ===================================================== History of Autoconf. |
| |
| @node History |
| @chapter History of Autoconf |
| @cindex History of autoconf |
| |
| @emph{This chapter was written by the original author, David MacKenzie.} |
| |
| You may be wondering, Why was Autoconf originally written? How did it |
| get into its present form? (Why does it look like gorilla spit?) If |
| you're not wondering, then this chapter contains no information useful |
| to you, and you might as well skip it. If you @emph{are} wondering, |
| then let there be light@enddots{} |
| |
| @menu |
| * Genesis:: Prehistory and naming of @command{configure} |
| * Exodus:: The plagues of M4 and Perl |
| * Leviticus:: The priestly code of portability arrives |
| * Numbers:: Growth and contributors |
| * Deuteronomy:: Approaching the promises of easy configuration |
| @end menu |
| |
| @node Genesis |
| @section Genesis |
| |
| In June 1991 I was maintaining many of the GNU utilities for the |
| Free Software Foundation. As they were ported to more platforms and |
| more programs were added, the number of @option{-D} options that users |
| had to select in the makefile (around 20) became burdensome. |
| Especially for me---I had to test each new release on a bunch of |
| different systems. So I wrote a little shell script to guess some of |
| the correct settings for the fileutils package, and released it as part |
| of fileutils 2.0. That @command{configure} script worked well enough that |
| the next month I adapted it (by hand) to create similar @command{configure} |
| scripts for several other GNU utilities packages. Brian Berliner |
| also adapted one of my scripts for his CVS revision control system. |
| |
| Later that summer, I learned that Richard Stallman and Richard Pixley |
| were developing similar scripts to use in the GNU compiler tools; |
| so I adapted my @command{configure} scripts to support their evolving |
| interface: using the file name @file{Makefile.in} as the templates; |
| adding @samp{+srcdir}, the first option (of many); and creating |
| @file{config.status} files. |
| |
| @node Exodus |
| @section Exodus |
| |
| As I got feedback from users, I incorporated many improvements, using |
| Emacs to search and replace, cut and paste, similar changes in each of |
| the scripts. As I adapted more GNU utilities packages to use |
| @command{configure} scripts, updating them all by hand became impractical. |
| Rich Murphey, the maintainer of the GNU graphics utilities, sent me |
| mail saying that the @command{configure} scripts were great, and asking if |
| I had a tool for generating them that I could send him. No, I thought, |
| but I should! So I started to work out how to generate them. And the |
| journey from the slavery of hand-written @command{configure} scripts to the |
| abundance and ease of Autoconf began. |
| |
| Cygnus @command{configure}, which was being developed at around that time, |
| is table driven; it is meant to deal mainly with a discrete number of |
| system types with a small number of mainly unguessable features (such as |
| details of the object file format). The automatic configuration system |
| that Brian Fox had developed for Bash takes a similar approach. For |
| general use, it seems to me a hopeless cause to try to maintain an |
| up-to-date database of which features each variant of each operating |
| system has. It's easier and more reliable to check for most features on |
| the fly---especially on hybrid systems that people have hacked on |
| locally or that have patches from vendors installed. |
| |
| I considered using an architecture similar to that of Cygnus |
| @command{configure}, where there is a single @command{configure} script that |
| reads pieces of @file{configure.in} when run. But I didn't want to have |
| to distribute all of the feature tests with every package, so I settled |
| on having a different @command{configure} made from each |
| @file{configure.in} by a preprocessor. That approach also offered more |
| control and flexibility. |
| |
| I looked briefly into using the Metaconfig package, by Larry Wall, |
| Harlan Stenn, and Raphael Manfredi, but I decided not to for several |
| reasons. The @command{Configure} scripts it produces are interactive, |
| which I find quite inconvenient; I didn't like the ways it checked for |
| some features (such as library functions); I didn't know that it was |
| still being maintained, and the @command{Configure} scripts I had |
| seen didn't work on many modern systems (such as System V R4 and NeXT); |
| it wasn't flexible in what it could do in response to a feature's |
| presence or absence; I found it confusing to learn; and it was too big |
| and complex for my needs (I didn't realize then how much Autoconf would |
| eventually have to grow). |
| |
| I considered using Perl to generate my style of @command{configure} |
| scripts, but decided that M4 was better suited to the job of simple |
| textual substitutions: it gets in the way less, because output is |
| implicit. Plus, everyone already has it. (Initially I didn't rely on |
| the GNU extensions to M4.) Also, some of my friends at the |
| University of Maryland had recently been putting M4 front ends on |
| several programs, including @code{tvtwm}, and I was interested in trying |
| out a new language. |
| |
| @node Leviticus |
| @section Leviticus |
| |
| Since my @command{configure} scripts determine the system's capabilities |
| automatically, with no interactive user intervention, I decided to call |
| the program that generates them Autoconfig. But with a version number |
| tacked on, that name would be too long for old Unix file systems, |
| so I shortened it to Autoconf. |
| |
| In the fall of 1991 I called together a group of fellow questers after |
| the Holy Grail of portability (er, that is, alpha testers) to give me |
| feedback as I encapsulated pieces of my handwritten scripts in M4 macros |
| and continued to add features and improve the techniques used in the |
| checks. Prominent among the testers were François Pinard, who came up |
| with the idea of making an Autoconf shell script to run M4 |
| and check for unresolved macro calls; Richard Pixley, who suggested |
| running the compiler instead of searching the file system to find |
| include files and symbols, for more accurate results; Karl Berry, who |
| got Autoconf to configure @TeX{} and added the macro index to the |
| documentation; and Ian Lance Taylor, who added support for creating a C |
| header file as an alternative to putting @option{-D} options in a |
| makefile, so he could use Autoconf for his UUCP package. |
| The alpha testers cheerfully adjusted their files again and again as the |
| names and calling conventions of the Autoconf macros changed from |
| release to release. They all contributed many specific checks, great |
| ideas, and bug fixes. |
| |
| @node Numbers |
| @section Numbers |
| |
| In July 1992, after months of alpha testing, I released Autoconf 1.0, |
| and converted many GNU packages to use it. I was surprised by how |
| positive the reaction to it was. More people started using it than I |
| could keep track of, including people working on software that wasn't |
| part of the GNU Project (such as TCL, FSP, and Kerberos V5). |
| Autoconf continued to improve rapidly, as many people using the |
| @command{configure} scripts reported problems they encountered. |
| |
| Autoconf turned out to be a good torture test for M4 implementations. |
| Unix M4 started to dump core because of the length of the |
| macros that Autoconf defined, and several bugs showed up in GNU |
| M4 as well. Eventually, we realized that we needed to use some |
| features that only GNU M4 has. 4.3BSD M4, in |
| particular, has an impoverished set of builtin macros; the System V |
| version is better, but still doesn't provide everything we need. |
| |
| More development occurred as people put Autoconf under more stresses |
| (and to uses I hadn't anticipated). Karl Berry added checks for X11. |
| david zuhn contributed C++ support. François Pinard made it diagnose |
| invalid arguments. Jim Blandy bravely coerced it into configuring |
| GNU Emacs, laying the groundwork for several later improvements. |
| Roland McGrath got it to configure the GNU C Library, wrote the |
| @command{autoheader} script to automate the creation of C header file |
| templates, and added a @option{--verbose} option to @command{configure}. |
| Noah Friedman added the @option{--autoconf-dir} option and |
| @code{AC_MACRODIR} environment variable. (He also coined the term |
| @dfn{autoconfiscate} to mean ``adapt a software package to use |
| Autoconf''.) Roland and Noah improved the quoting protection in |
| @code{AC_DEFINE} and fixed many bugs, especially when I got sick of |
| dealing with portability problems from February through June, 1993. |
| |
| @node Deuteronomy |
| @section Deuteronomy |
| |
| A long wish list for major features had accumulated, and the effect of |
| several years of patching by various people had left some residual |
| cruft. In April 1994, while working for Cygnus Support, I began a major |
| revision of Autoconf. I added most of the features of the Cygnus |
| @command{configure} that Autoconf had lacked, largely by adapting the |
| relevant parts of Cygnus @command{configure} with the help of david zuhn |
| and Ken Raeburn. These features include support for using |
| @file{config.sub}, @file{config.guess}, @option{--host}, and |
| @option{--target}; making links to files; and running @command{configure} |
| scripts in subdirectories. Adding these features enabled Ken to convert |
| GNU @code{as}, and Rob Savoye to convert DejaGNU, to using |
| Autoconf. |
| |
| I added more features in response to other peoples' requests. Many |
| people had asked for @command{configure} scripts to share the results of |
| the checks between runs, because (particularly when configuring a large |
| source tree, like Cygnus does) they were frustratingly slow. Mike |
| Haertel suggested adding site-specific initialization scripts. People |
| distributing software that had to unpack on MS-DOS asked for a way to |
| override the @file{.in} extension on the file names, which produced file |
| names like @file{config.h.in} containing two dots. Jim Avera did an |
| extensive examination of the problems with quoting in @code{AC_DEFINE} |
| and @code{AC_SUBST}; his insights led to significant improvements. |
| Richard Stallman asked that compiler output be sent to @file{config.log} |
| instead of @file{/dev/null}, to help people debug the Emacs |
| @command{configure} script. |
| |
| I made some other changes because of my dissatisfaction with the quality |
| of the program. I made the messages showing results of the checks less |
| ambiguous, always printing a result. I regularized the names of the |
| macros and cleaned up coding style inconsistencies. I added some |
| auxiliary utilities that I had developed to help convert source code |
| packages to use Autoconf. With the help of François Pinard, I made |
| the macros not interrupt each others' messages. (That feature revealed |
| some performance bottlenecks in GNU M4, which he hastily |
| corrected!) I reorganized the documentation around problems people want |
| to solve. And I began a test suite, because experience had shown that |
| Autoconf has a pronounced tendency to regress when we change it. |
| |
| Again, several alpha testers gave invaluable feedback, especially |
| François Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn, |
| and Mark Eichin. |
| |
| Finally, version 2.0 was ready. And there was much rejoicing. (And I |
| have free time again. I think. Yeah, right.) |
| |
| |
| @c ========================================================== Appendices |
| |
| |
| @node GNU Free Documentation License |
| @appendix GNU Free Documentation License |
| |
| @include fdl.texi |
| |
| @node Indices |
| @appendix Indices |
| |
| @menu |
| * Environment Variable Index:: Index of environment variables used |
| * Output Variable Index:: Index of variables set in output files |
| * Preprocessor Symbol Index:: Index of C preprocessor symbols defined |
| * Cache Variable Index:: Index of documented cache variables |
| * Autoconf Macro Index:: Index of Autoconf macros |
| * M4 Macro Index:: Index of M4, M4sugar, and M4sh macros |
| * Autotest Macro Index:: Index of Autotest macros |
| * Program & Function Index:: Index of those with portability problems |
| * Concept Index:: General index |
| @end menu |
| |
| @node Environment Variable Index |
| @appendixsec Environment Variable Index |
| |
| This is an alphabetical list of the environment variables that might |
| influence Autoconf checks. |
| |
| @printindex ev |
| |
| @node Output Variable Index |
| @appendixsec Output Variable Index |
| |
| This is an alphabetical list of the variables that Autoconf can |
| substitute into files that it creates, typically one or more |
| makefiles. @xref{Setting Output Variables}, for more information |
| on how this is done. |
| |
| @printindex ov |
| |
| @node Preprocessor Symbol Index |
| @appendixsec Preprocessor Symbol Index |
| |
| This is an alphabetical list of the C preprocessor symbols that the |
| Autoconf macros define. To work with Autoconf, C source code needs to |
| use these names in @code{#if} or @code{#ifdef} directives. |
| |
| @printindex cv |
| |
| @node Cache Variable Index |
| @appendixsec Cache Variable Index |
| |
| This is an alphabetical list of documented cache variables used |
| by macros defined in Autoconf. Autoconf macros may use additional cache |
| variables internally. |
| @ifset shortindexflag |
| To make the list easier to use, the variables are listed without their |
| preceding @samp{ac_cv_}. |
| @end ifset |
| |
| @printindex CA |
| |
| @node Autoconf Macro Index |
| @appendixsec Autoconf Macro Index |
| |
| This is an alphabetical list of the Autoconf macros. |
| @ifset shortindexflag |
| To make the list easier to use, the macros are listed without their |
| preceding @samp{AC_}. |
| @end ifset |
| |
| @printindex AC |
| |
| @node M4 Macro Index |
| @appendixsec M4 Macro Index |
| |
| This is an alphabetical list of the M4, M4sugar, and M4sh macros. |
| @ifset shortindexflag |
| To make the list easier to use, the macros are listed without their |
| preceding @samp{m4_} or @samp{AS_}. The prefix is @samp{m4_} for |
| all-lowercase macro names and @samp{AS_} for all-uppercase macro |
| names. |
| @end ifset |
| |
| @printindex MS |
| |
| @node Autotest Macro Index |
| @appendixsec Autotest Macro Index |
| |
| This is an alphabetical list of the Autotest macros. |
| @ifset shortindexflag |
| To make the list easier to use, the macros are listed without their |
| preceding @samp{AT_}. |
| @end ifset |
| |
| @printindex AT |
| |
| @node Program & Function Index |
| @appendixsec Program and Function Index |
| |
| This is an alphabetical list of the programs and functions whose |
| portability is discussed in this document. |
| |
| @printindex pr |
| |
| @node Concept Index |
| @appendixsec Concept Index |
| |
| This is an alphabetical list of the files, tools, and concepts |
| introduced in this document. |
| |
| @printindex cp |
| |
| @bye |
| |
| @c LocalWords: texinfo setfilename autoconf texi settitle setchapternewpage |
| @c LocalWords: setcontentsaftertitlepage finalout ARG ovar varname dvar acx |
| @c LocalWords: makeinfo dvi defcodeindex ev ov CPP cv Autotest mv defindex fn |
| @c LocalWords: shortindexflag iftex ifset acindex ACindex ifclear ahindex fu |
| @c LocalWords: asindex MSindex atindex ATindex auindex hdrindex prindex FIXME |
| @c LocalWords: msindex alloca fnindex Aaarg indices FSF's dircategory ifnames |
| @c LocalWords: direntry autoscan autoreconf autoheader autoupdate config FDs |
| @c LocalWords: testsuite titlepage Elliston Demaille vskip filll ifnottex hmm |
| @c LocalWords: insertcopying Autoconf's detailmenu Automake Libtool POSIX ois |
| @c LocalWords: Systemology Checkpointing Changequote INTERCAL changequote dfn |
| @c LocalWords: Quadrigraphs builtins Shellology acconfig Bugward LIBOBJ Imake |
| @c LocalWords: LIBOBJS IFELSE cindex flushright Pinard Metaconfig uref Simons |
| @c LocalWords: distclean uninstall noindent versioning Tromey dir vr |
| @c LocalWords: SAMS samp aclocal acsite underquoted emph itemx prepend SUBST |
| @c LocalWords: evindex automake Gettext autopoint gettext symlink libtoolize |
| @c LocalWords: defmac INIT tarname ovindex cvindex BUGREPORT PREREQ asis PROG |
| @c LocalWords: SRCDIR srcdir globbing afterwards cmds foos fooo foooo init cd |
| @c LocalWords: builddir timestamp src Imakefile chmod defvar CFLAGS CPPFLAGS |
| @c LocalWords: CXXFLAGS DEFS DHAVE defvarx FCFLAGS FFLAGS LDFLAGS bindir GCC |
| @c LocalWords: datadir datarootdir docdir dvidir htmldir libdir ifnothtml kbd |
| @c LocalWords: includedir infodir libexecdir localedir localstatedir mandir |
| @c LocalWords: oldincludedir pdfdir PDF psdir PostScript sbindir sysconfdir |
| @c LocalWords: sharedstatedir DDATADIR sed tmp pkgdatadir VPATH conf unistd |
| @c LocalWords: undef endif builtin FUNCS ifndef STACKSEG getb GETB YMP fubar |
| @c LocalWords: PRE dest SUBDIRS subdirs fi struct STDC stdlib stddef INTTYPES |
| @c LocalWords: inttypes STDINT stdint AWK AIX Solaris NeXT env EGREP FGREP yy |
| @c LocalWords: LEXLIB YYTEXT lfl nonportable Automake's LN RANLIB byacc INETD |
| @c LocalWords: inetd prog PROGS progs ranlib lmp lXt lX nsl gethostbyname UX |
| @c LocalWords: isinf isnan glibc IRIX sunmath lm lsunmath pre sizeof |
| @c LocalWords: ld inline malloc putenv setenv FreeBSD realloc SunOS MinGW |
| @c LocalWords: snprintf vsnprintf sprintf vsprintf sscanf gcc strerror ifdef |
| @c LocalWords: strnlen sysconf PAGESIZE unsetenv va fallback memcpy dst FUNC |
| @c LocalWords: PowerPC GNUC libPW pragma Olibcalls CHOWN chown CLOSEDIR VFORK |
| @c LocalWords: closedir FNMATCH fnmatch vfork FSEEKO LARGEFILE fseeko SVR sc |
| @c LocalWords: largefile GETGROUPS getgroups GETLOADAVG DGUX UMAX NLIST KMEM |
| @c LocalWords: SETGID getloadavg nlist GETMNTENT irix acxindex autom |
| @c LocalWords: getmntent UnixWare GETPGRP getpgid getpgrp POSIX's pid LSTAT |
| @c LocalWords: lstat rpl MEMCMP memcmp OpenStep MBRTOWC mbrtowc MKTIME mktime |
| @c LocalWords: localtime MMAP mmap OBSTACK obstack obstacks ARGTYPES timeval |
| @c LocalWords: SETPGRP setpgrp defmacx Hurd SETVBUF setvbuf STRCOLL strcoll |
| @c LocalWords: STRTOD strtod DECL STRFTIME strftime UTIME utime VPRINTF |
| @c LocalWords: DOPRNT vprintf doprnt sp unfixable LIBSOURCE LIBSOURCES Eggert |
| @c LocalWords: linux netinet ia Tru XFree DIRENT NDIR dirent ndir multitable |
| @c LocalWords: NAMLEN strlen namlen MKDEV SYSMACROS makedev RESOLV resolv DNS |
| @c LocalWords: inet structs NAMESER arpa NETDB netdb UTekV UTS GCC's kB |
| @c LocalWords: STDBOOL BOOL stdbool cplusplus bool Bool stdarg tm te |
| @c LocalWords: ctype strchr strrchr rindex bcopy memmove memchr WEXITSTATUS |
| @c LocalWords: WIFEXITED TIOCGWINSZ GWINSZ termios preprocess preprocessable |
| @c LocalWords: DECLS strdup calloc BLKSIZE blksize RDEV rdev TZNAME tzname pw |
| @c LocalWords: passwd gecos pwd MBSTATE mbstate wchar RETSIGTYPE hup UID uid |
| @c LocalWords: gid ptrdiff uintmax EXEEXT OBJEXT Ae conftest AXP str |
| @c LocalWords: ALIGNOF WERROR Werror cpp HP's WorkShop egcs un fied stdc CXX |
| @c LocalWords: varargs BIGENDIAN Endianness SPARC endianness grep'ed CONST FC |
| @c LocalWords: const STRINGIZE stringizing PARAMS unprotoize protos KCC cxx |
| @c LocalWords: xlC aCC CXXCPP FREEFORM xlf FLIBS FCLIBS ish SRCEXT XTRA LFS |
| @c LocalWords: ISC lcposix MINIX Minix conditionalized inlines hw dD confdefs |
| @c LocalWords: fputs stdout PREPROC ar UFS HFS QNX realtime fstype STATVFS se |
| @c LocalWords: statvfs STATFS statfs func machfile hdr lelf raboof DEFUN GTK |
| @c LocalWords: GTKMM Grmph ified ine defn baz EOF qar Ahhh changecom algol io |
| @c LocalWords: changeword quadrigraphs quadrigraph dnl SGI atoi overquoting |
| @c LocalWords: Aas Wcross sep args namespace undefine bpatsubst popdef dquote |
| @c LocalWords: bregexp Overquote overquotation meisch maisch meische maische |
| @c LocalWords: miscian DIRNAME dirname MKDIR CATFILE XMKMF TRAVOLTA celsius |
| @c LocalWords: EMX emxos Emacsen Korn DYNIX subshell posix Ksh ksh Pdksh Zsh |
| @c LocalWords: pdksh zsh Allbery Lipe Kubota UWS zorglub stderr eval esac lfn |
| @c LocalWords: drivespec POSIXy DJGPP doschk prettybird LPT pfew Zsh's yu yaa |
| @c LocalWords: yM uM aM firebird IP subdir misparses ok Unpatched abc bc zA |
| @c LocalWords: CDPATH DUALCASE LINENO prepass Subshells lineno NULLCMD cmp wc |
| @c LocalWords: MAILPATH scanset arg NetBSD Almquist printf expr cp pR |
| @c LocalWords: Oliva awk Aaaaarg cmd regex xfoo GNV OpenVMS VM url fc |
| @c LocalWords: sparc Proulx nbar nfoo maxdepth acdilrtu TWG mc ing FP |
| @c LocalWords: mkdir exe uname OpenBSD Fileutils mktemp umask TMPDIR guid os |
| @c LocalWords: fooXXXXXX Unicos utimes hpux hppa unescaped SUBST'ed |
| @c LocalWords: pmake DOS's gmake ifoo DESTDIR autoconfiscated pc coff mips gg |
| @c LocalWords: cpu wildcards rpcc rdtsc powerpc readline |
| @c LocalWords: withval vxworks gless localcache usr LOFF loff CYGWIN Cygwin |
| @c LocalWords: cygwin SIGLIST siglist SYSNDIR SYSDIR ptx lseq rusage elif MSC |
| @c LocalWords: lfoo POUNDBANG lsun NIS getpwnam SYSCALLS RSH INTL lintl aix |
| @c LocalWords: intl lx ldir syslog bsd EPI toolchain netbsd objext de KNR nn |
| @c LocalWords: fication LTLIBOBJS Wdiff TESTDIR atconfig atlocal akim XFAIL |
| @c LocalWords: ChangeLog prepended errexit smallexample TESTSUITEFLAGS GPL er |
| @c LocalWords: installcheck autotest indir Pixley Bothner Eichin Kerberos adl |
| @c LocalWords: DISTCLEANFILES preprocessor's fileutils Stallman Murphey Stenn |
| @c LocalWords: Manfredi Autoconfig TCL FSP david zuhn Blandy MACRODIR Raeburn |
| @c LocalWords: autoconfiscate Savoye Haertel Avera Meyering fdl appendixsec |
| @c LocalWords: printindex american LIBOBJDIR LibdirTest ERLCFLAGS OBJCFLAGS |
| @c LocalWords: VER Gnulib online xyes strcpy TYPEOF typeof OBJC objcc objc ln |
| @c LocalWords: GOBJC OTP ERLC erl valloc decr dumpdef errprint incr |
| @c LocalWords: esyscmd len maketemp pushdef substr syscmd sysval translit txt |
| @c LocalWords: sinclude foreach myvar tolower toupper uniq BASENAME STDIN |
| @c LocalWords: Dynix basename aname cname macroexpands xno xcheck iso |
| @c LocalWords: LIBREADLINE lreadline lncurses libreadline vrindex SYS |
| @c LocalWords: syncodeindex define'd caindex CAindex MacKenzie DIRS |
| @c LocalWords: Runtime runtime Submakes submakes MAKEFLAGS whitespace |
| @c LocalWords: Timestamps Unportability Canonicalizing stdckdint dirN |
| @c LocalWords: acinclude AMFLAGS LIBS OBJCXXFLAGS GOFLAGS runstatedir |
| @c LocalWords: metacharacter EXPENSIVEP errno setjmp wctype sys mawk |
| @c LocalWords: nawk ggrep egrep gegrep fgrep gfgrep LEX lex yytext nm |
| @c LocalWords: yywrap xflex lexyy YFLAGS yacc divnum libs fuindex ffs |
| @c LocalWords: environ sigaction extern ftello nonnull STRTOLD LLONG |
| @c LocalWords: strtold vfprintf ULLONG strcasecmp strncasecmp MSVC th |
| @c LocalWords: NDEBUG INO libc ISDIR ISREG Tektronix Amdahl ino |
| @c LocalWords: typedef pxref fileblocks submembers INTMAX intmax UINT |
| @c LocalWords: INTPTR intptr SSIZE ssize uint UINTPTR uintptr OPENMP |
| @c LocalWords: openmp OpenMP omp Alignas Alignof Noreturn UTF vals gl |
| @c LocalWords: offsetof VARARRAYS VLA CCC stdcxx nullptr |
| @c LocalWords: constexpr decltype unicode fstreams iostreams iomanip |
| @c LocalWords: stringstreams GXX OBJCPP OBJCXX objcxx GOBJCXX erlc tx |
| @c LocalWords: OBJCXXCPP FIXEDFORM GFC argc argv shellvar fpp MODEXT |
| @c LocalWords: freeform fixedform MODINC MODOUT gccgo GOC xmkmf fseek |
| @c LocalWords: interpval ftell Interix macOS PTHREAD NonStop XOPEN xc |
| @c LocalWords: IEC ATTRIBS BFP DFP O'Donell Sebor ERTS Erlang's erts |
| @c LocalWords: erlang Wundef scalable USG NOTMAKE DOUCH |
| @c LocalWords: IVE changesyntax ifnotinfo oline num cfg debugfile cdr |
| @c LocalWords: debugmode traceoff traceon patsubst dumpdefs ifelse aa |
| @c LocalWords: mkstemp undivert lifo errprintn BINSH sanitization bcd |
| @c LocalWords: cleardivert bmatch bpatsubsts subst cond nblank ifval |
| @c LocalWords: ifblank ifnblank ifvaln fputc fgetc argn mapall dvarv |
| @c LocalWords: shiftn abcd elt noquote mkargs joinall SHA prereq dup |
| @c LocalWords: listc setb seta ARITH HNUM xcurly xoccupied |
| @c LocalWords: TESTA TESTB TESTC hoc xpg xxyzzyz dtksh nosuch fifos |
| @c LocalWords: fifo Stardent sig WIF WIFSIGNALED SIGQUIT tty perl ret |
| @c LocalWords: SIGINT NUL SFN PRN aeiou MSYS SIGTERM xhi arith UWIN |
| @c LocalWords: CLICOLOR FPATH POSIXLY Shellshock CVE doit ec ci |
| @c LocalWords: notreached cim nc ACL faccessat Alexandre getline sqrt |
| @c LocalWords: CONVFMT FS OFMT CDS chgrp futimens utimensat oo esc od |
| @c LocalWords: ownerships mape readdir mkfifo mknod testsuites XSI rf |
| @c LocalWords: bcdox hexdump filelist rmdir flushleft busybox nl HAZy |
| @c LocalWords: ABCDEFGHIJKLMNOPQRSTUVWXYZ Fantazy FAntAZy adc unix xb |
| @c LocalWords: SUBMAKEFLAGS ehBc ehB hBc hvB dmake hostname nlinit xf |
| @c LocalWords: DCOMMENT bart pathnames ifhtml randx |
| @c LocalWords: sumc hic ic fwrapv ftrapv SIGFPE memset fmudflap ctime |
| @c LocalWords: asctime lvalues lvalue Multithreaded decstation gdb na |
| @c LocalWords: enableval lesskey FHS superset waitpid libfoo cposix |
| @c LocalWords: mem RESTARTABLE bzero DejaGNU EUNIT subfile optarg ive |
| @c LocalWords: nolog expout experr erlflags EUnit testme eunit myprog |
| @c LocalWords: configmake vx bashdb tvtwm questers UUCP McGrath |
| @c LocalWords: ispell |
| @c Local Variables: |
| @c coding: utf-8 |
| @c fill-column: 72 |
| @c ispell-local-dictionary: "american" |
| @c indent-tabs-mode: nil |
| @c whitespace-check-buffer-indent: nil |
| @c End: |