@node Enabling Relocatability
@section Enabling Relocatability

It has been a pain for many users of GNU packages for a long time that
packages are not relocatable.  It means a user cannot copy a program,
installed by another user on the same machine, to his home directory,
and have it work correctly (including i18n).  So many users need to go
through @code{configure; make; make install} with all its
dependencies, options, and hurdles.

Red Hat, Debian, and similar package systems solve the ``ease of
installation'' problem, but they hardwire path names, usually to
@file{/usr} or @file{/usr/local}.  This means that users need root
privileges to install a binary package, and prevents installing two
different versions of the same binary package.

A relocatable program can be moved or copied to a different location
on the file system.  It is possible to make symlinks to the installed
and moved programs, and invoke them through the symlink. It is
possible to do the same thing with a hard link @emph{only} if the hard
link file is in the same directory as the real program.

To configure a program to be relocatable, add
@option{--enable-relocatable} to the @command{configure} command line.

On some OSes the executables remember the location of shared libraries
and prefer them over any other search path.  Therefore, such an
executable will look for its shared libraries first in the original
installation directory and only then in the current installation
directory.  Thus, for reliability, it is best to also give a
@option{--prefix} option pointing to a directory that does not exist
now and which never will be created, e.g.@:
@option{--prefix=/nonexistent}.  You may use
@code{DESTDIR=@var{dest-dir}} on the @command{make} command line to
avoid installing into that directory.

We do not recommend using a prefix writable by unprivileged users
(e.g.@: @file{/tmp/inst$$}) because such a directory can be recreated
by an unprivileged user after the original directory has been removed.
We also do not recommend prefixes that might be behind an automounter
(e.g.@: @file{$HOME/inst$$}) because of the performance impact of
directory searching.

Here's a sample installation run that takes into account all these
recommendations:

@example
./configure --enable-relocatable --prefix=/nonexistent
make
make install DESTDIR=/tmp/inst$$
@end example

Installation with @option{--enable-relocatable} will not work for
setuid or setgid executables, because such executables search only
system library paths for security reasons.  Also, installation with
@option{--enable-relocatable} might not work on OpenBSD, when the
package contains shared libraries and libtool versions 1.5.xx are used.

The runtime penalty and size penalty are negligible on GNU/Linux (just
one system call more when an executable is launched), and small on
other systems (the wrapper program just sets an environment variable
and executes the real program).
