File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / build-aux / install-reloc
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 13:38:46 2021 UTC (3 years, 9 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_16p0, HEAD
libiconv 1.16

    1: #!/bin/sh
    2: # install-reloc - install a program including a relocating wrapper
    3: # Copyright (C) 2003-2019 Free Software Foundation, Inc.
    4: # Written by Bruno Haible <bruno@clisp.org>, 2003.
    5: #
    6: # This program is free software: you can redistribute it and/or modify
    7: # it under the terms of the GNU General Public License as published by
    8: # the Free Software Foundation; either version 3 of the License, or
    9: # (at your option) any later version.
   10: #
   11: # This program is distributed in the hope that it will be useful,
   12: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   13: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   14: # GNU General Public License for more details.
   15: #
   16: # You should have received a copy of the GNU General Public License
   17: # along with this program.  If not, see <https://www.gnu.org/licenses/>.
   18: 
   19: # Usage 1:
   20: #   install-reloc -- library_path_var library_path_value prefix destdir \
   21: #                    compile_command srcdir builddir config_h_dir exeext \
   22: #                    strip_command \
   23: #                    install_command... destprog
   24: # where
   25: #   - library_path_var is the platform dependent runtime library path variable
   26: #   - library_path_value is a colon separated list of directories that contain
   27: #     the libraries at installation time (use this instead of -rpath)
   28: #   - prefix is the base directory at installation time
   29: #   - destdir is a string that is prepended to all file names at installation
   30: #     time; it is already prepended to destprog but not to library_path_value
   31: #     and prefix
   32: #   - compile_command is a C compiler compilation and linking command
   33: #   - srcdir is the directory where to find relocwrapper.c and its dependencies
   34: #   - builddir is the directory where to find built dependencies (namely,
   35: #     alloca.h and stdbool.h)
   36: #   - config_h_dir is the directory where to find config.h
   37: #   - exeext is platform dependent suffix of executables
   38: #   - strip_command is the command for stripping executables, or : if no
   39: #     stripping is desired
   40: #   - install_command is the install command line, excluding the final destprog
   41: #   - destprog is the destination program name
   42: # Usage 2:
   43: #   env RELOC_LIBRARY_PATH_VAR=library_path_var \
   44: #       RELOC_LIBRARY_PATH_VALUE=library_path_value \
   45: #       RELOC_PREFIX=prefix \
   46: #       RELOC_DESTDIR=destdir \
   47: #       RELOC_COMPILE_COMMAND=compile_command \
   48: #       RELOC_SRCDIR=srcdir \
   49: #       RELOC_BUILDDIR=builddir \
   50: #       RELOC_CONFIG_H_DIR=config_h_dir \
   51: #       RELOC_EXEEXT=exeext \
   52: #       RELOC_STRIP_PROG=strip_command \
   53: #       RELOC_INSTALL_PROG=install_command... \
   54: #   install-reloc prog1 ... destprog
   55: #   where destprog is either the destination program name (when only one program
   56: #   is specified) or the destination directory for all programs.
   57: # install-reloc renames destprog to destprog.bin and installs a relocating
   58: # wrapper in the place of destprog.
   59: 
   60: progname=$0
   61: 
   62: if test $# -ge 12 && test "x$1" = "x--"; then
   63:   # Get fixed position arguments.
   64:   shift
   65:   library_path_var=$1
   66:   library_path_value=$2
   67:   prefix=$3
   68:   destdir=$4
   69:   shift
   70:   shift
   71:   shift
   72:   shift
   73:   compile_command=$1
   74:   srcdir=$2
   75:   builddir=$3
   76:   config_h_dir=$4
   77:   exeext=$5
   78:   shift
   79:   shift
   80:   shift
   81:   shift
   82:   shift
   83:   strip_prog=$1
   84:   shift
   85:   install_prog=$1 # maybe not including the "-c" option
   86:   shift
   87: else
   88:   if test $# -ge 2; then
   89:     # Get arguments from environment variables.
   90:     library_path_var=$RELOC_LIBRARY_PATH_VAR
   91:     library_path_value=$RELOC_LIBRARY_PATH_VALUE
   92:     prefix=$RELOC_PREFIX
   93:     destdir=$RELOC_DESTDIR
   94:     compile_command=$RELOC_COMPILE_COMMAND
   95:     srcdir=$RELOC_SRCDIR
   96:     builddir=$RELOC_BUILDDIR
   97:     config_h_dir=$RELOC_CONFIG_H_DIR
   98:     exeext=$RELOC_EXEEXT
   99:     strip_prog=$RELOC_STRIP_PROG
  100:     install_prog=$RELOC_INSTALL_PROG # including the "-c" option
  101:   else
  102:     echo "Usage: $0 -- library_path_var library_path_value prefix destdir" \
  103:          "compile_command srcdir builddir config_h_dir exeext" \
  104:          "strip_command" \
  105:          "install_command... destprog" 1>&2
  106:     exit 1
  107:   fi
  108: fi
  109: 
  110: # Get destprog, last argument.
  111: destprog=
  112: for arg
  113: do
  114:   destprog=$arg
  115: done
  116: # Determine whether destprog is a program name or a directory name.
  117: if test -d "$destprog"; then
  118:   sed_remove_trailing_slashes='s|//*$||'
  119:   destprog_directory=`echo "$destprog" | sed -e "$sed_remove_trailing_slashes"`
  120:   if test -z "$destprog_directory"; then
  121:     destprog_directory='/'
  122:   fi
  123: else
  124:   destprog_directory=
  125: fi
  126: # Prepare for remove trailing $exeext, if present.
  127: if test -n "$exeext"; then
  128:   sed_quote='s,\.,\\.,g'
  129:   sed_remove_exeext='s|'`echo "$exeext" | sed -e "$sed_quote"`'$||'
  130: fi
  131: if test -z "$destprog_directory"; then
  132:   # Remove trailing $exeext, if present.
  133:   if test -n "$exeext"; then
  134:     destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
  135:   fi
  136: fi
  137: 
  138: # Outputs a command and runs it.
  139: func_verbose ()
  140: {
  141:   # Make it easy to copy&paste the printed command into a shell in most cases,
  142:   # by escaping '\\', '"', and '$'. This is not perfect, just good enough.
  143:   echo "$@" | sed -e 's/\([\\"$]\)/\\\1/g'
  144:   "$@"
  145: }
  146: 
  147: # Run install_command.
  148: func_verbose $install_prog "$@" || exit $?
  149: 
  150: # Iterate over all destination program names.
  151: # func_iterate f
  152: # applies f to each destination program names, after setting destprog.
  153: sed_basename_of_file='s|^.*/||'
  154: func_iterate ()
  155: {
  156:   if test -n "$destprog_directory"; then
  157:     prev_arg=
  158:     for arg
  159:     do
  160:       if test -n "prev_arg"; then
  161:         destprog="$destprog_directory"/`echo "$prev_arg" | sed -e "$sed_basename_of_file"`
  162:         $1
  163:       fi
  164:       prev_arg="$arg"
  165:     done
  166:   else
  167:     $1
  168:   fi
  169: }
  170: 
  171: # Run strip_command.
  172: func_strip ()
  173: {
  174:   # Remove trailing $exeext, if present.
  175:   if test -n "$exeext"; then
  176:     destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
  177:   fi
  178:   func_verbose "$strip_prog" "$destprog$exeext" || exit $?
  179: }
  180: if test "$strip_prog" != ':'; then
  181:   func_iterate func_strip
  182: fi
  183: 
  184: # If the platform doesn't support LD_LIBRARY_PATH or similar, we cannot build
  185: # a wrapper.
  186: test -n "$library_path_var" || exit 0
  187: 
  188: libdirs=
  189: save_IFS="$IFS"; IFS=":"
  190: for dir in $library_path_value; do
  191:   IFS="$save_IFS"
  192:   if test -n "$dir"; then
  193:     case "$libdirs" in
  194:       *"\"$dir\""*) ;; # remove duplicate
  195:       *) libdirs="$libdirs\"$dir\"," ;;
  196:     esac
  197:   fi
  198: done
  199: IFS="$save_IFS"
  200: # If there are no library directories to add at runtime, we don't need a
  201: # wrapper.
  202: test -n "$libdirs" || exit 0
  203: 
  204: # Determine installdir from destprog, removing a leading destdir if present.
  205: if test -n "$destprog_directory"; then
  206:   installdir="$destprog_directory"
  207: else
  208:   installdir=`echo "$destprog" | sed -e 's,/[^/]*$,,'`
  209: fi
  210: if test -n "$destdir"; then
  211:   sed_quote='s,\([|.\*^$[]\),\\\1,g'
  212:   sed_remove_destdir='s|^'`echo "$destdir" | sed -e "$sed_quote"`'||'
  213:   installdir=`echo "$installdir" | sed -e "$sed_remove_destdir"`
  214: fi
  215: 
  216: # Compile and install wrapper.
  217: func_create_wrapper ()
  218: {
  219:   # Remove trailing $exeext, if present.
  220:   if test -n "$exeext"; then
  221:     destprog=`echo "$destprog" | sed -e "$sed_remove_exeext"`
  222:   fi
  223: 
  224:   # Compile wrapper.
  225:   func_verbose $compile_command \
  226:                -I"$builddir" -I"$srcdir" -I"$config_h_dir" \
  227:                -DHAVE_CONFIG_H -DIN_RELOCWRAPPER -DNO_XMALLOC \
  228:                -D"INSTALLPREFIX=\"$prefix\"" -D"INSTALLDIR=\"$installdir\"" \
  229:                -D"LIBPATHVAR=\"$library_path_var\"" -D"LIBDIRS=$libdirs" \
  230:                -D"EXEEXT=\"$exeext\"" \
  231:                "$srcdir"/relocwrapper.c \
  232:                "$srcdir"/progname.c \
  233:                "$srcdir"/progreloc.c \
  234:                "$srcdir"/areadlink.c \
  235:                "$srcdir"/careadlinkat.c \
  236:                "$srcdir"/allocator.c \
  237:                "$srcdir"/readlink.c \
  238:                "$srcdir"/stat.c \
  239:                "$srcdir"/canonicalize-lgpl.c \
  240:                "$srcdir"/malloca.c \
  241:                "$srcdir"/lstat.c \
  242:                "$srcdir"/relocatable.c \
  243:                "$srcdir"/setenv.c \
  244:                "$srcdir"/c-ctype.c \
  245:                -o "$destprog.wrapper$exeext"
  246:   rc=$?
  247:   # Clean up object files left over in the current directory by the native C
  248:   # compilers on Solaris, HP-UX, OSF/1, IRIX.
  249:   rm -f relocwrapper.o \
  250:         progname.o \
  251:         progreloc.o \
  252:         areadlink.o \
  253:         careadlinkat.o \
  254:         allocator.o \
  255:         readlink.o \
  256:         stat.o \
  257:         canonicalize-lgpl.o \
  258:         malloca.o \
  259:         lstat.o \
  260:         relocatable.o \
  261:         setenv.o \
  262:         c-ctype.o
  263:   test $rc = 0 || exit $?
  264:   # Clean up debugging information left over by the native C compiler on MacOS X.
  265:   rm -rf "$destprog.wrapper$exeext.dSYM"
  266:   test $rc = 0 || exit $?
  267: 
  268:   # Strip wrapper.
  269:   test "$strip_prog" = ':' || func_verbose "$strip_prog" "$destprog.wrapper$exeext" || exit $?
  270: 
  271:   # Rename $destprog.wrapper -> $destprog -> $destprog.bin.
  272:   ln -f "$destprog$exeext" "$destprog.bin$exeext" \
  273:     || { rm -f "$destprog.bin$exeext" \
  274:          && cp -p "$destprog$exeext" "$destprog.bin$exeext"; } \
  275:     || exit 1
  276:   mv "$destprog.wrapper$exeext" "$destprog$exeext" || exit 1
  277: }
  278: func_iterate func_create_wrapper
  279: 
  280: exit 0

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>