DESTDIR: Support for Staged Installs
DESTDIR is a variable prepended to each installed target file,
$(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a
DESTDIR variable is specified by the user on the
command line as an absolute file name. For example:
make DESTDIR=/tmp/stage install
DESTDIR should be supported only in the
uninstall* targets, as those are the only targets where it is
If your installation step would normally install /usr/local/bin/foo and /usr/local/lib/libfoo.a, then an installation invoked as in the example above would install /tmp/stage/usr/local/bin/foo and /tmp/stage/usr/local/lib/libfoo.a instead.
Prepending the variable
DESTDIR to each target in this way
provides for staged installs, where the installed files are not
placed directly into their expected location but are instead copied
into a temporary location (
DESTDIR). However, installed files
maintain their relative directory structure and any embedded file names
will not be modified.
You should not set the value of
DESTDIR in your Makefile
at all; then the files are installed into their expected locations by
default. Also, specifying
DESTDIR should not change the
operation of the software in any way, so its value should not be
included in any file contents.
DESTDIR support is commonly used in package creation. It is
also helpful to users who want to understand what a given package will
install where, and to allow users who don’t normally have permissions
to install into protected areas to build and install before gaining
those permissions. Finally, it can be useful with tools such as
stow, where code is installed in one place but made to appear
to be installed somewhere else using symbolic links or special mount
operations. So, we strongly recommend GNU packages support
DESTDIR, though it is not an absolute requirement.