You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.9 KiB
63 lines
2.9 KiB
4 years ago
|
@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).
|