In packages using make recursion, the top level Makefile.am must
tell Automake which subdirectories are to be built. This is done via
SUBDIRS variable holds a list of subdirectories in which
building of various sorts can occur. The rules for many targets
all) in the generated Makefile will run commands
both locally and in all specified subdirectories. Note that the
directories listed in
SUBDIRS are not required to contain
Makefile.ams; only Makefiles (after configuration).
This allows inclusion of libraries from packages that do not use
Automake (such as
gettext; see also Third-Party Makefiles).
In packages that use subdirectories, the top-level Makefile.am is often very short. For instance, here is the Makefile.am from the GNU Hello distribution:
EXTRA_DIST = BUGS ChangeLog.O README-alpha SUBDIRS = doc intl po src tests
When Automake invokes make in a subdirectory, it uses the value
MAKE variable. It passes the value of the variable
AM_MAKEFLAGS to the make invocation; this can be set in
Makefile.am if there are flags you must always pass to
The directories mentioned in
SUBDIRS are usually direct
children of the current directory, each subdirectory containing its
own Makefile.am with a
SUBDIRS pointing to deeper
subdirectories. Automake can be used to construct packages of
arbitrary depth this way.
By default, Automake generates Makefiles that work depth-first
in postfix order: the subdirectories are built before the current
directory. However, it is possible to change this ordering. You can
do this by putting ‘.’ into
SUBDIRS. For instance,
putting ‘.’ first will cause a prefix ordering of
SUBDIRS = lib src . test
will cause lib/ to be built before src/, then the current directory will be built, finally the test/ directory will be built. It is customary to arrange test directories to be built after everything else since they are meant to test what has been constructed.
In addition to the built-in recursive targets defined by Automake
check, etc.), the developer can also define his
own recursive targets. That is done by passing the names of such
targets as arguments to the m4 macro
in configure.ac. Automake generates rules to handle the
recursion for such targets; and the developer can define real actions
for them by defining corresponding
% cat configure.ac AC_INIT([pkg-name], [1.0] AM_INIT_AUTOMAKE AM_EXTRA_RECURSIVE_TARGETS([foo]) AC_CONFIG_FILES([Makefile sub/Makefile sub/src/Makefile]) AC_OUTPUT % cat Makefile.am SUBDIRS = sub foo-local: @echo This will be run by "make foo". % cat sub/Makefile.am SUBDIRS = src % cat sub/src/Makefile.am foo-local: @echo This too will be run by a "make foo" issued either in @echo the 'sub/src/' directory, the 'sub/' directory, or the @echo top-level directory.