The following pun remains, in my opinion, the best introduction to Autoconf:
A physicist, an engineer, and a computer scientist were discussing the nature of God. "Surely a Physicist," said the physicist, "because early in the Creation, God made Light; and you know, Maxwell's equations, the dual nature of electromagnetic waves, the relativistic consequences..." "An Engineer!," said the engineer, "because before making Light, God split the Chaos into Land and Water; it takes a hell of an engineer to handle that big amount of mud, and orderly separation of solids from liquids..." The computer scientist shouted: "And the Chaos, where do you think it was coming from, hmm?"
And indeed, if you happen to work on a widespread program you will soon learn that there are thousands of subtle or huge differences between systems, which render compilation of a program an impossible exercise. Virtually all the different systems require that sources of a program be adjusted specifically for them.
An impossible task... Instead of providing sources for all the
different systems, maintainers program for an ideal system, named
POSIX, and use a tool that will try to pretend that the user's
machine does fulfill the specifications of this ideal POSIX
machine. This program is Autoconf.
The task of Autoconf is therefore to help the maintainer studying the
user's machine, diagnosing its non-POSIX-nesses, and providing
workarounds. Obviously, examining the user's machine requires running
an auditor. Since this auditor is responsible of finding the
weaknesses, it must be absolutely universal. The Bourne shell is the
only language in which this auditor, configure
, can be
written. But since the Bourne shell has no support for functions (!),
programming complex auditors is near to impossible, just as for
programming in assembly language.
Higher level languages and compilers have been invented to run away from
assembly language. Autoconf, the language, and autoconf
, the
program, have been invented by David J. MacKenzie to run away from plain
Bourne shell.
This chapter is a gentle introduction to Autoconf, the tool of reference to ensure software portability. Nevertheless, little emphasize will be put over portability, because:
Then, why do you still need to know about Autoconf? First because it is
the standard interface to the GNU Build System (which also comprises
Automake and Libtool): users are used to run configure
, to
pass --prefix=$HOME
etc. instead of having to edit files by hand.
Secondly because POSIX specifies only the core of the system, but
if your package requires some specific program or library (say, the GNU
Multiple Precision library), then you still have to check for it.