maint: update copyright
[gnulib.git] / build-aux / relocatable.sh.in
1 # The functions in this file provide support for relocatability of
2 # shell scripts.  They should be included near the beginning of each
3 # shell script in a relocatable program, by adding @relocatable_sh@
4 # and causing the script to be expanded with AC_CONFIG_FILES.  A
5 # small amount of additional code must be added and adapted to the
6 # package by hand; see doc/relocatable-maint.texi (in Gnulib) for
7 # details.
8 #
9 # Copyright (C) 2003-2014 Free Software Foundation, Inc.
10 #
11 # This program is free software: you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 3 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 #
24
25 # func_tmpdir
26 # creates a temporary directory.
27 # Sets variable
28 # - tmp             pathname of freshly created temporary directory
29 func_tmpdir ()
30 {
31   # Use the environment variable TMPDIR, falling back to /tmp. This allows
32   # users to specify a different temporary directory, for example, if their
33   # /tmp is filled up or too small.
34   : ${TMPDIR=/tmp}
35   {
36     # Use the mktemp program if available. If not available, hide the error
37     # message.
38     tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
39     test -n "$tmp" && test -d "$tmp"
40   } ||
41   {
42     # Use a simple mkdir command. It is guaranteed to fail if the directory
43     # already exists.  $RANDOM is bash specific and expands to empty in shells
44     # other than bash, ksh and zsh.  Its use does not increase security;
45     # rather, it minimizes the probability of failure in a very cluttered /tmp
46     # directory.
47     tmp=$TMPDIR/gl$$-$RANDOM
48     (umask 077 && mkdir "$tmp")
49   } ||
50   {
51     echo "$0: cannot create a temporary directory in $TMPDIR" >&2
52     { (exit 1); exit 1; }
53   }
54 }
55
56 # Support for relocatability.
57 func_find_curr_installdir ()
58 {
59   # Determine curr_installdir, even taking into account symlinks.
60   curr_executable="$0"
61   case "$curr_executable" in
62     */* | *\\*) ;;
63     *) # Need to look in the PATH.
64       if test "${PATH_SEPARATOR+set}" != set; then
65         # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
66         # contains only /bin. Note that ksh looks also at the FPATH variable,
67         # so we have to set that as well for the test.
68         PATH_SEPARATOR=:
69         (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
70           && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
71                  || PATH_SEPARATOR=';'
72              }
73       fi
74       save_IFS="$IFS"; IFS="$PATH_SEPARATOR"
75       for dir in $PATH; do
76         IFS="$save_IFS"
77         test -z "$dir" && dir=.
78         for exec_ext in ''; do
79           if test -f "$dir/$curr_executable$exec_ext"; then
80             curr_executable="$dir/$curr_executable$exec_ext"
81             break 2
82           fi
83         done
84       done
85       IFS="$save_IFS"
86       ;;
87   esac
88   # Make absolute.
89   case "$curr_executable" in
90     /* | ?:/* | ?:\\*) ;;
91     *) curr_executable=`pwd`/"$curr_executable" ;;
92   esac
93   # Resolve symlinks.
94   sed_dirname='s,/[^/]*$,,'
95   sed_linkdest='s,^.* -> \(.*\),\1,p'
96   while : ; do
97     lsline=`LC_ALL=C ls -l "$curr_executable"`
98     case "$lsline" in
99       *" -> "*)
100         linkdest=`echo "$lsline" | sed -n -e "$sed_linkdest"`
101         case "$linkdest" in
102           /* | ?:/* | ?:\\*) curr_executable="$linkdest" ;;
103           *) curr_executable=`echo "$curr_executable" | sed -e "$sed_dirname"`/"$linkdest" ;;
104         esac ;;
105       *) break ;;
106     esac
107   done
108   curr_installdir=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'`
109   # Canonicalize.
110   curr_installdir=`cd "$curr_installdir" && pwd`
111 }
112 func_find_prefixes ()
113 {
114   # Compute the original/current installation prefixes by stripping the
115   # trailing directories off the original/current installation directories.
116   orig_installprefix="$orig_installdir"
117   curr_installprefix="$curr_installdir"
118   while true; do
119     orig_last=`echo "$orig_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
120     curr_last=`echo "$curr_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
121     if test -z "$orig_last" || test -z "$curr_last"; then
122       break
123     fi
124     if test "$orig_last" != "$curr_last"; then
125       break
126     fi
127     orig_installprefix=`echo "$orig_installprefix" | sed -e 's,/[^/]*$,,'`
128     curr_installprefix=`echo "$curr_installprefix" | sed -e 's,/[^/]*$,,'`
129   done
130 }