Go to the first, previous, next, last section, table of contents.
Autoconf changes, and throughout the years some constructs are obsoleted. Most of the changes involve the macros, but 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.
`config.status' now supports arguments to specify the files to instantiate, see section Recreating a Configuration, for more details. Before, environment variables had to be used.
AC_OUTPUT
and AC_CONFIG_COMMANDS
in
`configure.ac'.
AC_OUTPUT
and
AC_CONFIG_FILES
in `configure.ac'.
#define
statements. The
default is the arguments given to AC_CONFIG_HEADERS
; if that
macro was not called, `config.status' ignores this variable.
AC_CONFIG_LINKS
; if that macro was not called,
`config.status' ignores this variable.
In section Recreating a Configuration, using this old interface, the example would be:
config.h: stamp-h stamp-h: config.h.in config.status CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \ CONFIG_HEADERS=config.h ./config.status echo > stamp-h Makefile: Makefile.in config.status CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \ CONFIG_FILES=Makefile ./config.status
(If `configure.ac' does not call AC_CONFIG_HEADERS
, there is
no need to set CONFIG_HEADERS
in the make
rules, equally
for CONFIG_COMMANDS
etc.)
In order to produce `config.h.in', @command{autoheader} needs to
build or to find templates for each symbol. Modern releases of Autoconf
use AH_VERBATIM
and AH_TEMPLATE
(see section Autoheader Macros), but in older releases a file, `acconfig.h', contained the
list of needed templates. autoheader
copies comments and
#define
and #undef
statements from `acconfig.h' in
the current directory, if present. This file used to be mandatory if
you AC_DEFINE
any additional symbols.
Modern releases of Autoconf also provide AH_TOP
and
AH_BOTTOM
if you need to prepend/append some information to
`config.h.in'. Ancient versions of Autoconf had a similar feature:
if `./acconfig.h' contains the string `@TOP@',
autoheader
copies the lines before the line containing
`@TOP@' into the top of the file that it generates. Similarly,
if `./acconfig.h' contains the string `@BOTTOM@',
autoheader
copies the lines after that line to the end of the
file it generates. Either or both of those strings may be omitted. An
even older alternate way to produce the same effect in jurasik versions
of Autoconf is to create the files `file.top' (typically
`config.h.top') and/or `file.bot' in the current
directory. If they exist, autoheader
copies them to the
beginning and end, respectively, of its output.
In former versions of Autoconf, the files used in preparing a software package for distribution were:
configure.ac --. .------> autoconf* -----> configure +---+ [aclocal.m4] --+ `---. [acsite.m4] ---' | +--> [autoheader*] -> [config.h.in] [acconfig.h] ----. | +-----' [config.h.top] --+ [config.h.bot] --'
Use only the AH_
macros, `configure.ac' should be
self-contained, and should not depend upon `acconfig.h' etc.
autoupdate
to Modernize `configure.ac'
The autoupdate
program updates a `configure.ac' file that
calls Autoconf macros by their old names to use the current macro names.
In version 2 of Autoconf, most of the macros were renamed to use a more
uniform and descriptive naming scheme. See section Macro Names, for a
description of the new scheme. Although the old names still work
(see section Obsolete Macros, for a list of the old macros and the corresponding
new names), you can make your `configure.ac' files more readable
and make it easier to use the current Autoconf documentation if you
update them to use the new macro names.
If given no arguments, autoupdate
updates `configure.ac',
backing up the original version with the suffix `~' (or the value
of the environment variable SIMPLE_BACKUP_SUFFIX
, if that is
set). If you give autoupdate
an argument, it reads that file
instead of `configure.ac' and writes the updated file to the
standard output.
autoupdate
accepts the following options:
AC_MACRODIR
environment variable to a
directory; this option overrides the environment variable.
This option is rarely needed and dangerous; it is only used when one
plays with different versions of Autoconf simultaneously.
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. See section Macro Names, for a description of the new naming scheme. Below, 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.
AC_FUNC_ALLOCA
The user is encouraged to use either AC_CANONICAL_BUILD
, or
AC_CANONICAL_HOST
, or AC_CANONICAL_TARGET
, depending on
the needs. Using AC_CANONICAL_TARGET
is enough to run the two
other macros.
AC_C_CHAR_UNSIGNED
AC_CHECK_TYPE
, deprecated because of its flaws. Firstly, although
it is a member of the CHECK
clan, singular sub-family, it does
more than just checking. Second, missing types are not
typedef
'd, they are #define
'd, which can lead to
incompatible code in the case of pointer types.
This use of AC_CHECK_TYPE
is obsolete and discouraged, see
section Generic Type Checks, for the description of the current macro.
If the type type is not defined, define it to be the C (or C++) builtin type default; e.g., `short' or `unsigned'.
This macro is equivalent to:
AC_CHECK_TYPE([type], [AC_DEFINE([type], [default], [Define to `default' if <sys/types.h> does not define.])])
In order to keep backward compatibility, the two versions of
AC_CHECK_TYPE
are implemented, selected by a simple heuristics:
You are encouraged either to use a valid builtin type, or to use the
equivalent modern code (see above), or better yet, to use
AC_CHECK_TYPES
together with
#if !HAVE_LOFF_T typedef loff_t off_t; #endif
AC_TRY_LINK
(see section Examining Libraries), with the addition that it prints `checking for
echo-text' to the standard output first, if echo-text is
non-empty. Use AC_MSG_CHECKING
and AC_MSG_RESULT
instead
to print messages (see section Printing Messages).
AC_C_CONST
AC_C_CROSS
, which is obsolete too, and does nothing
:-)
.
CYGWIN
is set to `yes'. Don't use this macro, the dignified
means to check the nature of the host is using
AC_CANONICAL_HOST
. As a matter of fact this macro is defined as:
AC_REQUIRE([AC_CANONICAL_HOST])[]dnl case $host_os in *cygwin* ) CYGWIN=yes;; * ) CYGWIN=no;; esac
Beware that the variable CYGWIN
has a very special meaning when
running CygWin32, and should not be changed. That's yet another reason
not to use this macro.
AC_PROG_LEX
.
AC_FUNC_CLOSEDIR_VOID
andAC_HEADER_DIRENT
,
but defines a different set of C preprocessor macros to indicate which
header file is found:
Old Symbol | New Symbol
|
DIRENT | HAVE_DIRENT_H
|
SYSNDIR | HAVE_SYS_NDIR_H
|
SYSDIR | HAVE_SYS_DIR_H
|
NDIR | HAVE_NDIR_H
|
LIBS
. This macro used to be defined as
AC_CHECK_LIB(seq, getmntent, LIBS="-lseq $LIBS")now it is just
AC_FUNC_GETMNTENT
.
EXEEXT
based on the output of the
compiler, which is now done automatically. Typically set to empty
string if Unix and `.exe' if Win32 or OS/2.
AC_CYGWIN
but checks for the EMX environment on OS/2
and sets EMXOS2
.
AC_MSG_ERROR
AC_PATH_X
AC_PATH_XTRA
AC_CHECK_FUNC
wait3
is found and fills in the contents of its third argument
(a `struct rusage *'), which HP-UX does not do, define
HAVE_WAIT3
.
These days portable programs should use waitpid
, not
wait3
, as wait3
is being removed from the Open Group
standards, and will not appear in the next revision of POSIX.
AC_PROG_GCC_TRADITIONAL
AC_TYPE_GETGROUPS
AC_FUNC_GETLOADAVG
AC_CHECK_FUNCS
AC_CHECK_HEADERS
AC_CHECK_LIB
with a
function argument of main
. In addition, library can
be written as any of `foo', @option{-lfoo}, or `libfoo.a'. In
all of those cases, the compiler is passed @option{-lfoo}. However,
library cannot be a shell variable; it must be a literal name.
AC_SYS_INTERPRETER
(different calling convention)
AC_CHECK_HEADER
AC_EGREP_HEADER
AC_INIT
used to have a single argument, and was
equivalent to:
AC_INIT AC_CONFIG_SRCDIR(unique-file-in-source-dir)
AC_C_INLINE
int
is 16 bits wide, define INT_16_BITS
.
Use `AC_CHECK_SIZEOF(int)' instead.
LIBS
. If you were using it to get getmntent
, use
AC_FUNC_GETMNTENT
instead. If you used it for the NIS versions
of the password and group functions, use `AC_CHECK_LIB(sun,
getpwnam)'. Up to Autoconf 2.13, it used to be
AC_CHECK_LIB(sun, getmntent, LIBS="-lsun $LIBS")now it is defined as
AC_FUNC_GETMNTENT AC_CHECK_LIB(sun, getpwnam)
AC_LANG_SAVE
, remove it from the stack, and call
AC_LANG(language)
.
AC_LANG
) on a stack.
The current language does not change. AC_LANG_PUSH
is preferred.
AC_CONFIG_LINKS
. An updated
version of:
AC_LINK_FILES(config/$machine.h config/$obj_format.h, host.h object.h)is:
AC_CONFIG_LINKS(host.h:config/$machine.h object.h:config/$obj_format.h)
AC_PROG_LN_S
LONG_64_BITS
if the C type long int
is 64 bits wide.
Use the generic macro `AC_CHECK_SIZEOF([long int])' instead.
AC_C_LONG_DOUBLE
AC_SYS_LONG_FILE_NAMES
AC_HEADER_MAJOR
NEED_MEMORY_H
if the mem
functions were
defined in `memory.h'. Today it is equivalent to
`AC_CHECK_HEADERS(memory.h)'. Adjust your code to depend upon
HAVE_MEMORY_H
, not NEED_MEMORY_H
, see See section Standard Symbols.
AC_CYGWIN
but checks for the MingW32 compiler
environment and sets MINGW32
.
AC_PROG_CC_C_O
AC_FUNC_MMAP
AC_TYPE_MODE_T
OBJEXT
based on the output of the
compiler, after .c files have been excluded. Typically set to `o'
if Unix, `obj' if Win32. Now the compiler checking macros handle
this automatically.
m4
print a message to the standard error output warning that
this-macro-name is obsolete, and giving the file and line number
where it was called. this-macro-name should be the name of the
macro that is calling AC_OBSOLETE
. If suggestion is given,
it is printed at the end of the warning message; for example, it can be
a suggestion for what to use instead of this-macro-name.
For instance
AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnlYou are encouraged to use
AU_DEFUN
instead, since it gives better
services to the user.
AC_TYPE_OFF_T
AC_OUTPUT
with argument is deprecated, this obsoleted
interface is equivalent to:
AC_CONFIG_FILES(file...) AC_CONFIG_COMMANDS([default], extra-cmds, init-cmds) AC_OUTPUT
configure
. This macro may be called multiple times. It is
obsolete, replaced by AC_CONFIG_COMMANDS
.
Here is an unrealistic example:
fubar=27 AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.], fubar=$fubar) AC_OUTPUT_COMMANDS([echo this is another, extra, bit], [echo init bit])Aside from the fact that
AC_CONFIG_COMMANDS
requires an
additional key, an important difference is that
AC_OUTPUT_COMMANDS
is quoting its arguments twice, while
AC_CONFIG_COMMANDS
. This means that AC_CONFIG_COMMANDS
can safely be given macro calls as arguments:
AC_CONFIG_COMMANDS(foo, [my_FOO()])conversely, where one level of quoting was enough for literal strings with
AC_OUTPUT_COMMANDS
, you need two with
AC_CONFIG_COMMANDS
. The following lines are equivalent:
AC_OUTPUT_COMMANDS([echo "Square brackets: []"]) AC_CONFIG_COMMANDS(default, [[echo "Square brackets: []"]])
AC_TYPE_PID_T
AC_PREFIX_PROGRAM
AC_CHECK_PROGS
AC_PATH_PROGS
AC_CHECK_PROG
AC_EGREP_CPP
AC_PATH_PROG
AC_SYS_RESTARTABLE_SYSCALLS
AC_TYPE_SIGNAL
LIBS
. This
macro used to
AC_CHECK_LIB(intl, strftime, LIBS="-lintl $LIBS")now it just calls
AC_FUNC_STRFTIME
instead.
AC_FUNC_SETVBUF_REVERSED
AC_PROG_MAKE_SET
AC_CHECK_SIZEOF
AC_TYPE_SIZE_T
AC_HEADER_STAT
AC_HEADER_STDC
AC_FUNC_STRCOLL
AC_STRUCT_ST_BLKSIZE
AC_STRUCT_ST_BLOCKS
AC_STRUCT_ST_RDEV
HAVE_RESTARTABLE_SYSCALLS
. This macro does
not check if system calls are restarted in general--it tests whether a
signal handler installed with signal
(but not sigaction
)
causes system calls to be restarted. It does not test if system calls
can be restarted when interrupted by signals that have no handler.
These days portable programs should use sigaction
with
SA_RESTART
if they want restartable system calls. They should
not rely on HAVE_RESTARTABLE_SYSCALLS
, since nowadays whether a
system call is restartable is a dynamic issue, not a configuration-time
issue.
AC_DECL_SYS_SIGLIST
AC_TRY_CPP
AC_TRY_RUN
AC_STRUCT_TIMEZONE
AC_HEADER_TIME
AC_TYPE_UID_T
USG
if the BSD string functions are defined in
`strings.h'. You should no longer depend upon USG
, but on
HAVE_STRING_H
, see See section Standard Symbols.
AC_FUNC_UTIME_NULL
AC_MSG_RESULT
.
AC_FUNC_VFORK
AC_FUNC_VPRINTF
AC_FUNC_WAIT3
AC_MSG_WARN
AC_C_BIGENDIAN
LIBS
if on
Xenix. Also, if `dirent.h' is being checked for, added
@option{-ldir} to LIBS
. Now it is merely an alias of
AC_HEADER_DIRENT
instead, plus some code to detect whether
running XENIX on which you should not depend:
AC_MSG_CHECKING([for Xenix]) AC_EGREP_CPP(yes, [#if defined M_XENIX && !defined M_UNIX yes #endif], [AC_MSG_RESULT([yes]); XENIX=yes], [AC_MSG_RESULT([no]); XENIX=])
AC_DECL_YYTEXT
Autoconf version 2 is mostly backward compatible with version 1.
However, it introduces better ways to do some things, and doesn't
support some of the ugly things in version 1. So, depending on how
sophisticated your `configure.ac' files are, you might have to do
some manual work in order to upgrade to version 2. This chapter points
out some problems to watch for when upgrading. Also, perhaps your
configure
scripts could benefit from some of the new features in
version 2; the changes are summarized in the file `NEWS' in the
Autoconf distribution.
If you have an `aclocal.m4' installed with Autoconf (as opposed to
in a particular package's source directory), you must rename it to
`acsite.m4'. See section Using autoconf
to Create configure
.
If you distribute `install.sh' with your package, rename it to
`install-sh' so make
builtin rules won't inadvertently
create a file called `install' from it. AC_PROG_INSTALL
looks for the script under both names, but it is best to use the new name.
If you were using `config.h.top', `config.h.bot', or
`acconfig.h', you still can, but you will have less clutter if you
use the AH_
macros. See section Autoheader Macros.
Add `@CFLAGS@', `@CPPFLAGS@', and `@LDFLAGS@' in
your `Makefile.in' files, so they can take advantage of the values
of those variables in the environment when configure
is run.
Doing this isn't necessary, but it's a convenience for users.
Also add `@configure_input@' in a comment to each input file for
AC_OUTPUT
, so that the output files will contain a comment saying
they were produced by configure
. Automatically selecting the
right comment syntax for all the kinds of files that people call
AC_OUTPUT
on became too much work.
Add `config.log' and `config.cache' to the list of files you
remove in distclean
targets.
If you have the following in `Makefile.in':
prefix = /usr/local exec_prefix = $(prefix)
you must change it to:
prefix = @prefix@ exec_prefix = @exec_prefix@
The old behavior of replacing those variables without `@' characters around them has been removed.
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. See section Obsolete Macros, for a table showing the
new names for the old macros. Use the autoupdate
program to
convert your `configure.ac' to using the new macro names.
See section Using autoupdate
to Modernize `configure.ac'.
Some macros have been superseded by similar ones that do the job better,
but are not call-compatible. If you get warnings about calling obsolete
macros while running autoconf
, you may safely ignore them, but
your configure
script will generally work better if you follow
the advice it prints about what to replace the obsolete macros with. In
particular, the mechanism for reporting the results of tests has
changed. If you were using echo
or AC_VERBOSE
(perhaps
via AC_COMPILE_CHECK
), your configure
script's output will
look better if you switch to AC_MSG_CHECKING
and
AC_MSG_RESULT
. See section Printing Messages. Those macros work best
in conjunction with cache variables. See section Caching Results.
If you were checking the results of previous tests by examining the
shell variable DEFS
, you need to switch to checking the values of
the cache variables for those tests. DEFS
no longer exists while
configure
is running; it is only created when generating output
files. This difference from version 1 is because properly quoting the
contents of that variable turned out to be too cumbersome and
inefficient to do every time AC_DEFINE
is called. See section Cache Variable Names.
For example, here is a `configure.ac' fragment written for Autoconf version 1:
AC_HAVE_FUNCS(syslog) case "$DEFS" in *-DHAVE_SYSLOG*) ;; *) # syslog is not in the default libraries. See if it's in some other. saved_LIBS="$LIBS" for lib in bsd socket inet; do AC_CHECKING(for syslog in -l$lib) LIBS="$saved_LIBS -l$lib" AC_HAVE_FUNCS(syslog) case "$DEFS" in *-DHAVE_SYSLOG*) break ;; *) ;; esac LIBS="$saved_LIBS" done ;; esac
Here is a way to write it for version 2:
AC_CHECK_FUNCS(syslog) if test $ac_cv_func_syslog = no; then # syslog is not in the default libraries. See if it's in some other. for lib in bsd socket inet; do AC_CHECK_LIB($lib, syslog, [AC_DEFINE(HAVE_SYSLOG) LIBS="$LIBS -l$lib"; break]) done fi
If you were working around bugs in AC_DEFINE_UNQUOTED
by adding
backslashes before quotes, you need to remove them. It now works
predictably, and does not treat quotes (except back quotes) specially.
See section Setting Output Variables.
All of the boolean shell variables set by Autoconf macros now use `yes' for the true value. Most of them use `no' for false, though for backward compatibility some use the empty string instead. If you were relying on a shell variable being set to something like 1 or `t' for true, you need to change your tests.
When defining your own macros, you should now use AC_DEFUN
instead of define
. AC_DEFUN
automatically calls
AC_PROVIDE
and ensures that macros called via AC_REQUIRE
do not interrupt other macros, to prevent nested `checking...'
messages on the screen. There's no actual harm in continuing to use the
older way, but it's less convenient and attractive. See section 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 into macros that you can share.
The introduction of the previous section (see section Upgrading From Version 1) perfectly suits this section...
Autoconf version 2.50 is mostly backward compatible with version 2.13. However, it introduces better ways to do some things, and doesn't support some of the ugly things in version 2.13. So, depending on how sophisticated your `configure.ac' files are, you might have to do some manual work in order to upgrade to version 2.50. This chapter points out some problems to watch for when upgrading. Also, perhaps your
configure
scripts could benefit from some of the new features in version 2.50; the changes are summarized in the file `NEWS' in the Autoconf distribution.
The most important changes are invisible to you: the implementation of most macros have completely changed. This allowed more factorization of the code, better error messages, a higher uniformity of the user's interface etc. Unfortunately, as a side effect, some construct which used to (miraculously) work might break starting with Autoconf 2.50. The most common culprit is bad quotation.
For instance, in the following example, the message is not properly quoted:
AC_INIT AC_CHECK_HEADERS(foo.h,, AC_MSG_ERROR(cannot find foo.h, bailing out)) AC_OUTPUT
Autoconf 2.13 simply ignores it:
$ autoconf-2.13; ./configure --silent creating cache ./config.cache configure: error: cannot find foo.h $
while Autoconf 2.50 will produce a broken `configure':
$ autoconf-2.50; ./configure --silent configure: error: cannot find foo.h ./configure: exit: bad non-numeric arg `bailing' ./configure: exit: bad non-numeric arg `bailing' $
The message needs to be quoted, and the AC_MSG_ERROR
invocation
too!
AC_INIT AC_CHECK_HEADERS(foo.h,, [AC_MSG_ERROR([cannot find foo.h, bailing out])]) AC_OUTPUT
Many many (and many more) Autoconf macros were lacking proper quotation,
including no less than... AC_DEFUN
itself!
$ cat configure.in AC_DEFUN([AC_PROG_INSTALL], [# My own much better version ]) AC_INIT AC_PROG_INSTALL AC_OUTPUT $ autoconf-2.13 autoconf: Undefined macros: ***BUG in Autoconf--please report*** AC_FD_MSG ***BUG in Autoconf--please report*** AC_EPI configure.in:1:AC_DEFUN([AC_PROG_INSTALL], configure.in:5:AC_PROG_INSTALL $ autoconf-2.50 $
Because Autoconf has been dormant for years, Automake provided
Autoconf-like macros for a while. Autoconf 2.50 now provides better
versions of these macros, integrated in the AC_
namespace,
instead of AM_
. But in order to ease the upgrading via
@command{autoupdate}, bindings to such AM_
macros are provided.
Unfortunately Automake did not quote the name of these macros!
Therefore, when @command{m4} find in `aclocal.m4' something like
`AC_DEFUN(AM_TYPE_PTRDIFF_T, ...)', AM_TYPE_PTRDIFF_T
is
expanded, replaced with its Autoconf definition.
Fortunately Autoconf catches pre-AC_INIT
expansions, and will
complain, in its own words:
$ cat configure.in AC_INIT AM_TYPE_PTRDIFF_T $ aclocal-1.4 $ autoconf ./aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion actypes.m4:289: AM_TYPE_PTRDIFF_T is expanded from... ./aclocal.m4:17: the top level $
Future versions of Automake will simply no longer define most of these macros, and will properly quote the names of the remaining macros. But you don't have to wait for it to happen to do the right thing right now: do not depend upon macros from Automake as it is simply not its job to provide macros (but the one it requires by itself):
$ cat configure.in AC_INIT AM_TYPE_PTRDIFF_T $ rm aclocal.m4 $ autoupdate autoupdate: `configure.in' is updated $ cat configure.in AC_INIT AC_CHECK_TYPES([ptrdiff_t]) $ aclocal-1.4 $ autoconf $
Go to the first, previous, next, last section, table of contents.