< 上一个 | 内容 | 下一个 >

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 provides sufficient cross-directory support2 to enable you to write a single ‘Makefile.am’ for a complex multi-directory package.

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_’ (see Section 14.2 [Fine-grained Distribution Control], page 97). For instance:


image

2 We believe. This work is new and there are probably warts. See Chapter 1 [Introduction], page 1, for information on reporting bugs.


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 (see Section 3.3 [Uniform], page 20). 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.