autoconf processes configure.in to produce a configure script. configure is a portable shell script which examines the build environment to determine which libraries are available, which features the platform has, where libraries and headers are located, and so on. Based on this information, it modifies compiler flags, generates makefiles, and/or outputs the file config.h with appropriate preprocessor symbols defined. Again, configure does not require autoconf to run; you generate it before distributing your software, so users do not have to have autoconf.
Your job is to write configure.in. The file is basically a series of m4 macros, which expand to snippets of shell script according to the parameters you pass them. You can also write shell code manually. Really understanding how to write a configure.in requires some knowledge of m4 (which is pretty simple) and some knowledge of the Bourne shell (which is a black art). Fortunately, you can cheat: start with an existing configure.in and modify it slightly to suit your application. There's also an extensive autoconf manual, which describes the many pre-written macros shipped with autoconf.
The GTK+ and Gnome developers have simplified things still further, by providing macros to locate GTK+ and Gnome on the user's system.
Here is a sample configure.in, from a Gnome version of "Hello, World":
AC_INIT(src/hello.c) AM_CONFIG_HEADER(config.h) AM_INIT_AUTOMAKE(GnomeHello, 0.1) AM_MAINTAINER_MODE AM_ACLOCAL_INCLUDE(macros) GNOME_INIT AC_PROG_CC AC_ISC_POSIX AC_HEADER_STDC AC_ARG_PROGRAM AM_PROG_LIBTOOL GNOME_COMPILE_WARNINGS ALL_LINGUAS="da de es fr gl nl no pl ru sv fi uk" AM_GNU_GETTEXT AC_SUBST(CFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) AC_OUTPUT([ Makefile macros/Makefile src/Makefile intl/Makefile po/Makefile.in pixmaps/Makefile doc/Makefile doc/C/Makefile doc/es/Makefile ])
Before describing each macro, some general points should be made. First, those macros that begin with AC come with autoconf, and those that begin with AM usually come with automake. (This is useful when you're trying to find documentation for them.) The macros that begin with GNOME come in the Gnome macros directory. These macros are written in m4; the standard ones from autoconf/automake reside in /usr/share/aclocal, if you installed autoconf/automake under /usr. (An aside: the macros directory is not a good thing; each Gnome package should install its own m4 files to /usr/share/aclocal. Newer Gnome versions attempt to fix the problem.)
AC_INIT is always the first macro in configure.in. It expands to a lot of boilerplate code shared by all configure scripts; this code parses the command line arguments to configure. The macro's one argument is a file that should be present in the source directory; this is used as a sanity check, to be sure configure has correctly located the source directory.
AM_CONFIG_HEADER specifies a header file to create; this will almost always be config.h. The created header file will contain C preprocessor symbols defined by configure. At a minimum, the symbols PACKAGE and VERSION will be defined, which makes it easy to put the name and version of your program in your code without hard-coding them. (Your non-public source files should #include <config.h> to take advantage of its definitions; however, config.h should never be installed, because it would conflict with other packages.)
AM_INIT_AUTOMAKE initializes automake; the arguments to this macro are the name and version of the package being compiled. (These arguments become the values of PACKAGE and VERSION, defined in config.h.)
AM_MAINTAINER_MODE turns off maintainer-only makefile targets by default, and changes configure to understand a --enable-maintainer-mode option. --enable-maintainer-mode turns the maintainer-only targets back on. The maintainer-only makefile targets permit end users to clean automatically-generated files such as configure, which means they have to have autoconf and automake installed to repair the damage. AM_MAINTAINER_MODE makes it a bit harder for users to shoot themselves in the foot. Note, however, that the autogen.sh script used in Gnome automatically passes --enable-maintainer-mode to configure, since autogen.sh is intended for developers to use.
AM_ACLOCAL_INCLUDE specifies an additional directory in which to search for m4 macros. In this case, it specifies the macros subdirectory, where you should have copied the Gnome macros.
GNOME_INIT adds a number of Gnome-related command-line arguments to configure, and defines makefile variables containing the necessary preprocessor and linker flags for Gnome programs. These flags are obtained from a gnome-config script installed by the gnome-libs package.
AC_PROG_CC locates the C compiler.
AC_ISC_POSIX adds some flags needed for POSIX compatibility on certain platforms.
AC_HEADER_STDC checks whether the present system has the standard ANSI header files, and defines STDC_HEADERS if so.
AC_ARG_PROGRAM adds options to configure so that users can modify the name of an installed program. (Useful if your program happens to have the same name as some locally-installed program on their system.)
AM_PROG_LIBTOOL is used by automake to set up its use of libtool. This is only required if you are planning to build a shared library or dynamically loadable modules; it is unnecessary for this early version of GnomeHello, but we're planning ahead.
GNOME_COMPILE_WARNINGS adds a number of warning options to the gcc command line, but does nothing for most other compilers.
ALL_LINGUAS="es" is not a macro, just a bit of shell code. It contains a space-separated list of language abbreviations, corresponding to .po files in the po subdirectory. (.po files contain translations into other languages, so ALL_LINGUAS should list all languages your program has been translated into.)
AM_GNU_GETTEXT is used by automake, but the macro itself is distributed with the gettext package. It causes automake to perform a number of internationalization-related tasks.
AC_SUBST "exports" a variable into the files generated by configure. More on this below.
AC_OUTPUT lists the files to be created by the configure script. These will be created from a file with the same name, with .in appended. For example, the output file src/Makefile is generated from src/Makefile.in, and config.h comes from config.h.in.
In the AC_OUTPUT stage, configure processes files containing variables marked with two @ symbols; for example, @PACKAGE@. It recognizes such variables only if AC_SUBST was used to "export" the variable (many of the pre-written macros discussed above use AC_SUBST to define variables). Most commonly, this features is used to convert a Makefile.in to a Makefile. Makefile.in is typically generated by automake from Makefile.am. (However, you can use autoconf without automake, and write Makefile.in yourself.)