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.