automake-1.16: VPATH Builds
2.2.6 Parallel Build Trees (a.k.a. VPATH Builds)
------------------------------------------------
The GNU Build System distinguishes two trees: the source tree, and the
build tree. These are two directories that may be the same, or
different.
The source tree is rooted in the directory containing the ‘configure’
script. It contains all the source files (those that are distributed),
and may be arranged using several subdirectories.
The build tree is rooted in the current directory at the time
‘configure’ was run, and is populated with all object files, programs,
libraries, and other derived files built from the sources (and hence not
distributed). The build tree usually has the same subdirectory layout
as the source tree; its subdirectories are created automatically by the
build system.
If ‘configure’ is executed in its own directory, the source and build
trees are combined: derived files are constructed in the same
directories as their sources. This was the case in our first
installation example (⇒Basic Installation).
A common request from users is that they want to confine all derived
files to a single directory, to keep their source directories
uncluttered. Here is how we could run ‘configure’ to create everything
in a build tree (that is, subdirectory) called ‘build/’.
~ % tar zxf ~/amhello-1.0.tar.gz
~ % cd amhello-1.0
~/amhello-1.0 % mkdir build && cd build
~/amhello-1.0/build % ../configure
...
~/amhello-1.0/build % make
...
These setups, where source and build trees are different, are often
called “parallel builds” or “VPATH builds”. The expression _parallel
build_ is misleading: the word _parallel_ is a reference to the way the
build tree shadows the source tree, it is not about some concurrency in
the way build commands are run. For this reason we refer to such setups
using the name _VPATH builds_ in the following. _VPATH_ is the name of
the ‘make’ feature used by the ‘Makefile’s to allow these builds (⇒
‘VPATH’ Search Path for All Prerequisites (make)General Search.).
VPATH builds have other interesting uses. One is to build the same
sources with multiple configurations. For instance:
~ % tar zxf ~/amhello-1.0.tar.gz
~ % cd amhello-1.0
~/amhello-1.0 % mkdir debug optim && cd debug
~/amhello-1.0/debug % ../configure CFLAGS='-g -O0'
...
~/amhello-1.0/debug % make
...
~/amhello-1.0/debug % cd ../optim
~/amhello-1.0/optim % ../configure CFLAGS='-O3 -fomit-frame-pointer'
...
~/amhello-1.0/optim % make
...
With network file systems, a similar approach can be used to build
the same sources on different machines. For instance, suppose that the
sources are installed on a directory shared by two hosts: ‘HOST1’ and
‘HOST2’, which may be different platforms.
~ % cd /nfs/src
/nfs/src % tar zxf ~/amhello-1.0.tar.gz
On the first host, you could create a local build directory:
[HOST1] ~ % mkdir /tmp/amh && cd /tmp/amh
[HOST1] /tmp/amh % /nfs/src/amhello-1.0/configure
...
[HOST1] /tmp/amh % make && sudo make install
...
(Here we assume that the installer has configured ‘sudo’ so it can
execute ‘make install’ with root privileges; it is more convenient than
using ‘su’ like in ⇒Basic Installation).
On the second host, you would do exactly the same, possibly at the
same time:
[HOST2] ~ % mkdir /tmp/amh && cd /tmp/amh
[HOST2] /tmp/amh % /nfs/src/amhello-1.0/configure
...
[HOST2] /tmp/amh % make && sudo make install
...
In this scenario, nothing forbids the ‘/nfs/src/amhello-1.0’
directory from being read-only. In fact VPATH builds are also a means
of building packages from a read-only medium such as a CD-ROM. (The FSF
used to sell CD-ROMs with unpacked source code, before the GNU project
grew so big.)