From 3608a8d19b82666618aeebb9eb5c10897307f470 Mon Sep 17 00:00:00 2001 From: Reuben Thomas Date: Tue, 31 Dec 2013 22:42:39 +0000 Subject: [PATCH] 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. --- ChangeLog | 7 +++++ build-aux/relocatable.pl.in | 64 +++++++++++++++++++++++++++++++++++++++++++++ doc/relocatable-maint.texi | 30 +++++++++++++++++++++ modules/relocatable-perl | 26 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 build-aux/relocatable.pl.in create mode 100644 modules/relocatable-perl diff --git a/ChangeLog b/ChangeLog index 67bbf7b..bb4a7f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2014-01-08 Reuben Thomas + + 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 tests: fix export bug in previous patch diff --git a/build-aux/relocatable.pl.in b/build-aux/relocatable.pl.in new file mode 100644 index 0000000..5472468 --- /dev/null +++ b/build-aux/relocatable.pl.in @@ -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 . +# + +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; +} diff --git a/doc/relocatable-maint.texi b/doc/relocatable-maint.texi index 8780b84..36dfae0 100644 --- a/doc/relocatable-maint.texi +++ b/doc/relocatable-maint.texi @@ -135,6 +135,36 @@ where the script gets installed. Also, at the end, instead of @code{gettext_dir}, transform those variables that you need. @item +If your package installs Perl scripts, also import the address@hidden module. Then, near the beginning of each +Perl script that your package installs, add the following: + address@hidden +@@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"); address@hidden example + +You must adapt the definition of @code{$orig_installdir}, depending on +where the script gets installed. Also, at the end, instead of address@hidden, transform those variables that you need. + address@hidden In your @file{Makefile.am}, for every program @command{foo} that gets installed in, say, @file{$(bindir)}, you add: diff --git a/modules/relocatable-perl b/modules/relocatable-perl new file mode 100644 index 0000000..42498e2 --- /dev/null +++ b/modules/relocatable-perl @@ -0,0 +1,26 @@ +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 + -- 1.8.3.2