changeset 37285:1556d95c5278

relocatable-perl: like relocatable-script, but for Perl scripts * build-aux/relocatable.pl.in: Add. * doc/relocatable-maint.texi: Add documentation. * modules/relocatable-perl: Add.
author Reuben Thomas <rrt@sc3d.org>
date Thu, 09 Jan 2014 22:31:42 +0000
parents 4d78804b6408
children 1dbd45055bf1
files ChangeLog build-aux/relocatable.pl.in doc/relocatable-maint.texi modules/relocatable-perl
diffstat 4 files changed, 127 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Jan 08 22:15:21 2014 -0800
+++ b/ChangeLog	Thu Jan 09 22:31:42 2014 +0000
@@ -1,3 +1,10 @@
+2014-01-09  Reuben Thomas  <rrt@sc3d.org>
+
+	relocatable-perl: like relocatable-script, but for Perl scripts
+	* build-aux/relocatable.pl.in: Add.
+	* doc/relocatable-maint.texi: Add documentation.
+	* modules/relocatable-perl: Add.
+
 2014-01-07  Paul Eggert  <eggert@cs.ucla.edu>
 
 	tests: fix export bug in previous patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build-aux/relocatable.pl.in	Thu Jan 09 22:31:42 2014 +0000
@@ -0,0 +1,64 @@
+# The functions in this file provide support for relocatability of
+# Perl scripts.  They should be included near the beginning of each
+# Perl script in a relocatable program, by adding @relocatable_pl@
+# and causing the script to be expanded with AC_CONFIG_FILES.  A
+# small amount of additional code must be added and adapted to the
+# package by hand; see doc/relocatable-maint.texi (in Gnulib) for
+# details.
+#
+# This code is based on relocatable.sh.in, and design changes (and
+# bugs) should probably be cross-checked with it.
+#
+# Copyright (C) 2013 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+use Config;
+use File::Basename;
+use File::Spec::Functions;
+use Cwd 'realpath';
+
+# Support for relocatability.
+sub find_curr_installdir {
+  # Determine curr_installdir, even taking into account symlinks.
+  my $curr_executable = $0;
+  my $basename = basename($0);
+  if ($curr_executable eq $basename) {
+    LOOP: for my $dir (split /$Config{path_sep}/, $ENV{PATH}) {
+      $dir = "." unless $dir;
+      for my $ext ('') {
+        my $filename = catfile($dir, "$curr_executable$ext");
+        if (-f $filename) {
+          $curr_executable = $filename;
+          last LOOP;
+        }
+      }
+    }
+  }
+  # Resolve symlinks and canonicalize.
+  return realpath(dirname($curr_executable));
+}
+sub find_prefixes {
+  # Compute the original/current installation prefixes by stripping the
+  # trailing directories off the original/current installation directories.
+  my ($orig_installprefix, $curr_installprefix) = @_;
+  my $orig_last = basename($orig_installprefix);
+  my $curr_last = basename($curr_installprefix);
+  if ($orig_last && $curr_last && $orig_last eq $curr_last) {
+    $orig_installprefix = dirname($orig_installprefix);
+    $curr_installprefix = dirname($curr_installprefix);
+  }
+  return $orig_installprefix, $curr_installprefix;
+}
--- a/doc/relocatable-maint.texi	Wed Jan 08 22:15:21 2014 -0800
+++ b/doc/relocatable-maint.texi	Thu Jan 09 22:31:42 2014 +0000
@@ -144,6 +144,37 @@
 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
 installed in, say, @file{$(bindir)}, you add:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/relocatable-perl	Thu Jan 09 22:31:42 2014 +0000
@@ -0,0 +1,25 @@
+Description:
+Help make Perl scripts relocatable, that is, to allow them to
+function properly when copied to an arbitrary directory.
+
+Files:
+doc/relocatable.texi
+build-aux/relocatable.pl.in
+m4/relocatable-lib.m4
+
+Depends-on:
+
+configure.ac:
+AC_REQUIRE([gl_RELOCATABLE_NOP])
+relocatable_pl=$ac_aux_dir/relocatable.pl.in
+AC_SUBST_FILE([relocatable_pl])
+
+Makefile.am:
+
+Include:
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Ben Pfaff, Reuben Thomas