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-2020 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 <https://www.gnu.org/licenses/>. 23# 24 25# Support for relocatability. 26func_find_curr_installdir () 27{ 28 # Determine curr_installdir, even taking into account symlinks. 29 curr_executable="$0" 30 case "$curr_executable" in 31 */* | *\\*) ;; 32 *) # Need to look in the PATH. 33 if test "${PATH_SEPARATOR+set}" != set; then 34 # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which 35 # contains only /bin. Note that ksh looks also at the FPATH variable, 36 # so we have to set that as well for the test. 37 PATH_SEPARATOR=: 38 (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ 39 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ 40 || PATH_SEPARATOR=';' 41 } 42 fi 43 save_IFS="$IFS"; IFS="$PATH_SEPARATOR" 44 for dir in $PATH; do 45 IFS="$save_IFS" 46 test -z "$dir" && dir=. 47 for exec_ext in ''; do 48 if test -f "$dir/$curr_executable$exec_ext"; then 49 curr_executable="$dir/$curr_executable$exec_ext" 50 break 2 51 fi 52 done 53 done 54 IFS="$save_IFS" 55 ;; 56 esac 57 # Make absolute. 58 case "$curr_executable" in 59 /* | ?:/* | ?:\\*) ;; 60 *) curr_executable=`pwd`/"$curr_executable" ;; 61 esac 62 # Resolve symlinks. 63 sed_dirname='s,/[^/]*$,,' 64 sed_linkdest='s,^.* -> \(.*\),\1,p' 65 while : ; do 66 lsline=`LC_ALL=C ls -l "$curr_executable"` 67 case "$lsline" in 68 *" -> "*) 69 linkdest=`echo "$lsline" | sed -n -e "$sed_linkdest"` 70 case "$linkdest" in 71 /* | ?:/* | ?:\\*) curr_executable="$linkdest" ;; 72 *) curr_executable=`echo "$curr_executable" | sed -e "$sed_dirname"`/"$linkdest" ;; 73 esac ;; 74 *) break ;; 75 esac 76 done 77 curr_installdir=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'` 78 # Canonicalize. 79 curr_installdir=`cd "$curr_installdir" && pwd` 80} 81func_find_prefixes () 82{ 83 # Compute the original/current installation prefixes by stripping the 84 # trailing directories off the original/current installation directories. 85 orig_installprefix="$orig_installdir" 86 curr_installprefix="$curr_installdir" 87 while true; do 88 orig_last=`echo "$orig_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'` 89 curr_last=`echo "$curr_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'` 90 if test -z "$orig_last" || test -z "$curr_last"; then 91 break 92 fi 93 if test "$orig_last" != "$curr_last"; then 94 break 95 fi 96 orig_installprefix=`echo "$orig_installprefix" | sed -e 's,/[^/]*$,,'` 97 curr_installprefix=`echo "$curr_installprefix" | sed -e 's,/[^/]*$,,'` 98 done 99} 100