through @code{configure; make; make install} with all its
dependencies, options, and hurdles.
-Red Hat, Debian, and similar package systems solve the ``ease of
+Red Hat, Debian, and other binary distributions 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 filesystem. It is possible to make symlinks to the installed
+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.
This approach does not always work. On OpenBSD and OpenServer,
prereleases of Libtool 1.5 put absolute file names of libraries in
-executables, which prevents searching any other locations.
+executables, which prevents searching any other locations.
@item
On Windows, the executable's own directory is searched for libraries,
@noindent
becomes:
-@example
+@example
bindtextdomain (PACKAGE, relocate (LOCALEDIR));
@end example
The prototype for this function is in @file{relocatable.h}.
@item
+The @code{set_program_name} function can also configure some
+additional libraries to relocate files that they access, by defining
+corresponding C preprocessor symbols to 1. The libraries for which
+this is supported and the corresponding preprocessor symbols are:
+
+@table @asis
+@item libcharset
+@code{DEPENDS_ON_LIBCHARSET}
+
+@item libiconv
+@code{DEPENDS_ON_LIBICONV}
+
+@item libintl
+@code{DEPENDS_ON_LIBINTL}
+@end table
+
+Defining the symbol for a library makes every program in the package
+depend on that library, whether the program really uses the library or
+not, so this feature should be used with some caution.
+
+@item
If your package installs shell scripts, also import the
@code{relocatable-script} module. Then, near the beginning of each
shell script that your package installs, add the following:
orig_installdir="$bindir" # see Makefile.am's *_SCRIPTS variables
func_find_curr_installdir # determine curr_installdir
func_find_prefixes
- # Relocate the directory variables that we use.
- gettext_dir=`
- echo "$gettext_dir/" \
+ relocate () @{
+ echo "$1/" \
| sed -e "s%^$@{orig_installprefix@}/%$@{curr_installprefix@}/%" \
- | sed -e 's,/$,,'`
+ | sed -e 's,/$,,'
+ @}
+else
+ relocate () @{
+ echo "$1"
+ @}
fi
+
+# Get some relocated directory names.
+sysconfdir=`relocate "@@sysconfdir@@"`
+some_datadir=`relocate "@@datadir@@/something"`
@end example
You must adapt the definition of @code{orig_installdir}, depending on
where the script gets installed. Also, at the end, instead of
-@code{gettext_dir}, transform those variables that you need.
+@code{sysconfdir} and @code{some_datadir}, transform those variables
+that you need.
+
+@item
+If your package installs Perl scripts, also import the
+@code{relocatable-perl} module. Then, near the beginning of each
+Perl script that your package installs, add the following:
+
+@example
+@@relocatable_pl@@
+if ("@@RELOCATABLE@@" eq "yes") @{
+ my $exec_prefix = "@@exec_prefix@@";
+ my $orig_installdir = "@@bindir@@"; # see Makefile.am's *_SCRIPTS variables
+ my ($orig_installprefix, $curr_installprefix) = find_prefixes($orig_installdir, find_curr_installdir());
+ sub relocate @{ # the subroutine is defined whether or not the enclosing block is executed
+ my ($dir) = @@_;
+ if ("@@RELOCATABLE@@" eq "yes") @{
+ $dir =~ s%^$orig_installprefix/%$curr_installprefix/%;
+ $dir =~ s,/$,,;
+ @}
+ return $dir;
+ @}
+@}
+
+# Get some relocated directory names.
+$sysconfdir = relocate("@@sysconfdir@@");
+$some_datadir = relocate(@@datadir@@/something");
+@end example
+
+You must adapt the definition of @code{$orig_installdir}, depending on
+where the script gets installed. Also, at the end, instead of
+@code{sysconfdir} and @code{some_datadir}, transform those variables
+that you need.
@item
In your @file{Makefile.am}, for every program @command{foo} that gets
@end example
@item
-You may also need to add one or two variable assignments to your
-@file{configure.ac}.
+You may also need to add a couple of variable assignments to your
+@file{configure.ac}.
If your package (or any package you rely on, e.g.@: gettext-runtime)
will be relocated together with a set of installed shared libraries,