automake-1.16: Alternative
7.3 An Alternative Approach to Subdirectories
=============================================
If you’ve ever read Peter Miller’s excellent paper, ‘Recursive Make
Considered Harmful’, the preceding sections on the use of make recursion
will probably come as unwelcome advice. For those who haven’t read the
paper, Miller’s main thesis is that recursive ‘make’ invocations are
both slow and error-prone.
Automake is intended to have sufficient cross-directory support to
enable you to write a single ‘Makefile.am’ for a complex multi-directory
package. (If it seems to be lacking, please report the issue as usual.)
By default an installable file specified in a subdirectory will have
its directory name stripped before installation. For instance, in this
example, the header file will be installed as ‘$(includedir)/stdio.h’:
include_HEADERS = inc/stdio.h
However, the ‘nobase_’ prefix can be used to circumvent this path
stripping. In this example, the header file will be installed as
‘$(includedir)/sys/types.h’:
nobase_include_HEADERS = sys/types.h
‘nobase_’ should be specified first when used in conjunction with
either ‘dist_’ or ‘nodist_’ (⇒Fine-grained Distribution Control).
For instance:
nobase_dist_pkgdata_DATA = images/vortex.pgm sounds/whirl.ogg
Finally, note that a variable using the ‘nobase_’ prefix can often be
replaced by several variables, one for each destination directory (⇒
Uniform). For instance, the last example could be rewritten as
follows:
imagesdir = $(pkgdatadir)/images
soundsdir = $(pkgdatadir)/sounds
dist_images_DATA = images/vortex.pgm
dist_sounds_DATA = sounds/whirl.ogg
This latter syntax makes it possible to change one destination directory
without changing the layout of the source tree.
Currently, ‘nobase_*_LTLIBRARIES’ are the only exception to this
rule, in that there is no particular installation order guarantee for an
otherwise equivalent set of variables without ‘nobase_’ prefix.