amhello's Makefile.am Setup Explained
We now turn to src/Makefile.am. This file contains Automake instructions to build and install hello.
bin_PROGRAMS = hello hello_SOURCES = main.c
A Makefile.am has the same syntax as an ordinary Makefile. When automake processes a Makefile.am it copies the entire file into the output Makefile.in (that will be later turned into Makefile by configure) but will react to certain variable definitions by generating some build rules and other variables. Often Makefile.ams contain only a list of variable definitions as above, but they can also contain other variable and rule definitions that automake will pass along without interpretation.
Variables that end with
_PROGRAMS are special variables
that list programs that the resulting Makefile should build.
In Automake speak, this
_PROGRAMS suffix is called a
primary; Automake recognizes other primaries such as
_LIBRARIES, etc. corresponding
to different types of files.
The ‘bin’ part of the
automake that the resulting programs should be installed in
bindir. Recall that the GNU Build System uses a set of variables
to denote destination directories and allow users to customize these
locations (see Standard Directory Variables). Any such directory
variable can be put in front of a primary (omitting the
suffix) to tell automake where to install the listed files.
Programs need to be built from source files, so for each program
prog listed in a
automake will look for another variable named
_SOURCES listing its source files. There may be more
than one source file: they will all be compiled and linked together.
Automake also knows that source files need to be distributed when
creating a tarball (unlike built programs). So a side-effect of this
hello_SOURCES declaration is that main.c will be
part of the tarball created by
Finally here are some explanations regarding the top-level Makefile.am.
SUBDIRS = src dist_doc_DATA = README
SUBDIRS is a special variable listing all directories that
make should recurse into before processing the current
directory. So this line is responsible for make building
src/hello even though we run it from the top-level. This line
make install to install src/hello before
installing README (not that this order matters).
dist_doc_DATA = README causes README to be
distributed and installed in docdir. Files listed with the
_DATA primary are not automatically part of the tarball built
make dist, so we add the
dist_ prefix so they get
distributed. However, for README it would not have been
necessary: automake automatically distributes any
README file it encounters (the list of other files
automatically distributed is presented by
The only important effect of this second line is therefore to install
One thing not covered in this example is accessing the installation directory values (see Standard Directory Variables) from your program code, that is, converting them into defined macros. For this, see Defining Directories.