Created
September 13, 2009 18:43
-
-
Save 0xffea/186280 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -r b7ed0d468010 build-aux/install-sh | |
--- a/build-aux/install-sh Sun Sep 13 20:41:37 2009 +0200 | |
+++ b/build-aux/install-sh Sun Sep 13 20:42:15 2009 +0200 | |
@@ -1,7 +1,7 @@ | |
#!/bin/sh | |
# install - install a program, script, or datafile | |
-scriptversion=2005-05-14.22 | |
+scriptversion=2006-12-25.00 | |
# This originates from X11R5 (mit/util/scripts/install.sh), which was | |
# later released in X11R6 (xc/config/util/install.sh) with the | |
@@ -39,38 +39,68 @@ | |
# when there is no Makefile. | |
# | |
# This script is compatible with the BSD install script, but was written | |
-# from scratch. It can only install one file at a time, a restriction | |
-# shared with many OS's install programs. | |
+# from scratch. | |
+ | |
+nl=' | |
+' | |
+IFS=" "" $nl" | |
# set DOITPROG to echo to test this script | |
# Don't use :- since 4.3BSD and earlier shells don't like it. | |
-doit="${DOITPROG-}" | |
+doit=${DOITPROG-} | |
+if test -z "$doit"; then | |
+ doit_exec=exec | |
+else | |
+ doit_exec=$doit | |
+fi | |
-# put in absolute paths if you don't have them in your path; or use env. vars. | |
+# Put in absolute file names if you don't have them in your path; | |
+# or use environment vars. | |
-mvprog="${MVPROG-mv}" | |
-cpprog="${CPPROG-cp}" | |
-chmodprog="${CHMODPROG-chmod}" | |
-chownprog="${CHOWNPROG-chown}" | |
-chgrpprog="${CHGRPPROG-chgrp}" | |
-stripprog="${STRIPPROG-strip}" | |
-rmprog="${RMPROG-rm}" | |
-mkdirprog="${MKDIRPROG-mkdir}" | |
+chgrpprog=${CHGRPPROG-chgrp} | |
+chmodprog=${CHMODPROG-chmod} | |
+chownprog=${CHOWNPROG-chown} | |
+cmpprog=${CMPPROG-cmp} | |
+cpprog=${CPPROG-cp} | |
+mkdirprog=${MKDIRPROG-mkdir} | |
+mvprog=${MVPROG-mv} | |
+rmprog=${RMPROG-rm} | |
+stripprog=${STRIPPROG-strip} | |
-chmodcmd="$chmodprog 0755" | |
+posix_glob='?' | |
+initialize_posix_glob=' | |
+ test "$posix_glob" != "?" || { | |
+ if (set -f) 2>/dev/null; then | |
+ posix_glob= | |
+ else | |
+ posix_glob=: | |
+ fi | |
+ } | |
+' | |
+ | |
+posix_mkdir= | |
+ | |
+# Desired mode of installed file. | |
+mode=0755 | |
+ | |
+chgrpcmd= | |
+chmodcmd=$chmodprog | |
chowncmd= | |
-chgrpcmd= | |
+mvcmd=$mvprog | |
+rmcmd="$rmprog -f" | |
stripcmd= | |
-rmcmd="$rmprog -f" | |
-mvcmd="$mvprog" | |
+ | |
src= | |
dst= | |
dir_arg= | |
-dstarg= | |
+dst_arg= | |
+ | |
+copy_on_change=false | |
no_target_directory= | |
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | |
+usage="\ | |
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | |
or: $0 [OPTION]... SRCFILES... DIRECTORY | |
or: $0 [OPTION]... -t DIRECTORY SRCFILES... | |
or: $0 [OPTION]... -d DIRECTORIES... | |
@@ -80,81 +110,86 @@ | |
In the 4th, create DIRECTORIES. | |
Options: | |
--c (ignored) | |
--d create directories instead of installing files. | |
--g GROUP $chgrpprog installed files to GROUP. | |
--m MODE $chmodprog installed files to MODE. | |
--o USER $chownprog installed files to USER. | |
--s $stripprog installed files. | |
--t DIRECTORY install into DIRECTORY. | |
--T report an error if DSTFILE is a directory. | |
---help display this help and exit. | |
---version display version info and exit. | |
+ --help display this help and exit. | |
+ --version display version info and exit. | |
+ | |
+ -c (ignored) | |
+ -C install only if different (preserve the last data modification time) | |
+ -d create directories instead of installing files. | |
+ -g GROUP $chgrpprog installed files to GROUP. | |
+ -m MODE $chmodprog installed files to MODE. | |
+ -o USER $chownprog installed files to USER. | |
+ -s $stripprog installed files. | |
+ -t DIRECTORY install into DIRECTORY. | |
+ -T report an error if DSTFILE is a directory. | |
Environment variables override the default commands: | |
- CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG | |
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG | |
+ RMPROG STRIPPROG | |
" | |
-while test -n "$1"; do | |
+while test $# -ne 0; do | |
case $1 in | |
- -c) shift | |
- continue;; | |
+ -c) ;; | |
- -d) dir_arg=true | |
- shift | |
- continue;; | |
+ -C) copy_on_change=true;; | |
+ | |
+ -d) dir_arg=true;; | |
-g) chgrpcmd="$chgrpprog $2" | |
- shift | |
- shift | |
- continue;; | |
+ shift;; | |
--help) echo "$usage"; exit $?;; | |
- -m) chmodcmd="$chmodprog $2" | |
- shift | |
- shift | |
- continue;; | |
+ -m) mode=$2 | |
+ case $mode in | |
+ *' '* | *' '* | *' | |
+'* | *'*'* | *'?'* | *'['*) | |
+ echo "$0: invalid mode: $mode" >&2 | |
+ exit 1;; | |
+ esac | |
+ shift;; | |
-o) chowncmd="$chownprog $2" | |
- shift | |
- shift | |
- continue;; | |
+ shift;; | |
- -s) stripcmd=$stripprog | |
- shift | |
- continue;; | |
+ -s) stripcmd=$stripprog;; | |
- -t) dstarg=$2 | |
- shift | |
- shift | |
- continue;; | |
+ -t) dst_arg=$2 | |
+ shift;; | |
- -T) no_target_directory=true | |
- shift | |
- continue;; | |
+ -T) no_target_directory=true;; | |
--version) echo "$0 $scriptversion"; exit $?;; | |
- *) # When -d is used, all remaining arguments are directories to create. | |
- # When -t is used, the destination is already specified. | |
- test -n "$dir_arg$dstarg" && break | |
- # Otherwise, the last argument is the destination. Remove it from $@. | |
- for arg | |
- do | |
- if test -n "$dstarg"; then | |
- # $@ is not empty: it contains at least $arg. | |
- set fnord "$@" "$dstarg" | |
- shift # fnord | |
- fi | |
- shift # arg | |
- dstarg=$arg | |
- done | |
+ --) shift | |
break;; | |
+ | |
+ -*) echo "$0: invalid option: $1" >&2 | |
+ exit 1;; | |
+ | |
+ *) break;; | |
esac | |
+ shift | |
done | |
-if test -z "$1"; then | |
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then | |
+ # When -d is used, all remaining arguments are directories to create. | |
+ # When -t is used, the destination is already specified. | |
+ # Otherwise, the last argument is the destination. Remove it from $@. | |
+ for arg | |
+ do | |
+ if test -n "$dst_arg"; then | |
+ # $@ is not empty: it contains at least $arg. | |
+ set fnord "$@" "$dst_arg" | |
+ shift # fnord | |
+ fi | |
+ shift # arg | |
+ dst_arg=$arg | |
+ done | |
+fi | |
+ | |
+if test $# -eq 0; then | |
if test -z "$dir_arg"; then | |
echo "$0: no input file specified." >&2 | |
exit 1 | |
@@ -164,24 +199,47 @@ | |
exit 0 | |
fi | |
+if test -z "$dir_arg"; then | |
+ trap '(exit $?); exit' 1 2 13 15 | |
+ | |
+ # Set umask so as not to create temps with too-generous modes. | |
+ # However, 'strip' requires both read and write access to temps. | |
+ case $mode in | |
+ # Optimize common cases. | |
+ *644) cp_umask=133;; | |
+ *755) cp_umask=22;; | |
+ | |
+ *[0-7]) | |
+ if test -z "$stripcmd"; then | |
+ u_plus_rw= | |
+ else | |
+ u_plus_rw='% 200' | |
+ fi | |
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; | |
+ *) | |
+ if test -z "$stripcmd"; then | |
+ u_plus_rw= | |
+ else | |
+ u_plus_rw=,u+rw | |
+ fi | |
+ cp_umask=$mode$u_plus_rw;; | |
+ esac | |
+fi | |
+ | |
for src | |
do | |
# Protect names starting with `-'. | |
case $src in | |
- -*) src=./$src ;; | |
+ -*) src=./$src;; | |
esac | |
if test -n "$dir_arg"; then | |
dst=$src | |
- src= | |
+ dstdir=$dst | |
+ test -d "$dstdir" | |
+ dstdir_status=$? | |
+ else | |
- if test -d "$dst"; then | |
- mkdircmd=: | |
- chmodcmd= | |
- else | |
- mkdircmd=$mkdirprog | |
- fi | |
- else | |
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command | |
# might cause directories to be created, which would be especially bad | |
# if $src (and thus $dsttmp) contains '*'. | |
@@ -190,71 +248,199 @@ | |
exit 1 | |
fi | |
- if test -z "$dstarg"; then | |
+ if test -z "$dst_arg"; then | |
echo "$0: no destination specified." >&2 | |
exit 1 | |
fi | |
- dst=$dstarg | |
+ dst=$dst_arg | |
# Protect names starting with `-'. | |
case $dst in | |
- -*) dst=./$dst ;; | |
+ -*) dst=./$dst;; | |
esac | |
# If destination is a directory, append the input filename; won't work | |
# if double slashes aren't ignored. | |
if test -d "$dst"; then | |
if test -n "$no_target_directory"; then | |
- echo "$0: $dstarg: Is a directory" >&2 | |
+ echo "$0: $dst_arg: Is a directory" >&2 | |
exit 1 | |
fi | |
- dst=$dst/`basename "$src"` | |
+ dstdir=$dst | |
+ dst=$dstdir/`basename "$src"` | |
+ dstdir_status=0 | |
+ else | |
+ # Prefer dirname, but fall back on a substitute if dirname fails. | |
+ dstdir=` | |
+ (dirname "$dst") 2>/dev/null || | |
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ | |
+ X"$dst" : 'X\(//\)[^/]' \| \ | |
+ X"$dst" : 'X\(//\)$' \| \ | |
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null || | |
+ echo X"$dst" | | |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ | |
+ s//\1/ | |
+ q | |
+ } | |
+ /^X\(\/\/\)[^/].*/{ | |
+ s//\1/ | |
+ q | |
+ } | |
+ /^X\(\/\/\)$/{ | |
+ s//\1/ | |
+ q | |
+ } | |
+ /^X\(\/\).*/{ | |
+ s//\1/ | |
+ q | |
+ } | |
+ s/.*/./; q' | |
+ ` | |
+ | |
+ test -d "$dstdir" | |
+ dstdir_status=$? | |
fi | |
fi | |
- # This sed command emulates the dirname command. | |
- dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` | |
+ obsolete_mkdir_used=false | |
- # Make sure that the destination directory exists. | |
+ if test $dstdir_status != 0; then | |
+ case $posix_mkdir in | |
+ '') | |
+ # Create intermediate dirs using mode 755 as modified by the umask. | |
+ # This is like FreeBSD 'install' as of 1997-10-28. | |
+ umask=`umask` | |
+ case $stripcmd.$umask in | |
+ # Optimize common cases. | |
+ *[2367][2367]) mkdir_umask=$umask;; | |
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; | |
- # Skip lots of stat calls in the usual case. | |
- if test ! -d "$dstdir"; then | |
- defaultIFS=' | |
- ' | |
- IFS="${IFS-$defaultIFS}" | |
+ *[0-7]) | |
+ mkdir_umask=`expr $umask + 22 \ | |
+ - $umask % 100 % 40 + $umask % 20 \ | |
+ - $umask % 10 % 4 + $umask % 2 | |
+ `;; | |
+ *) mkdir_umask=$umask,go-w;; | |
+ esac | |
- oIFS=$IFS | |
- # Some sh's can't handle IFS=/ for some reason. | |
- IFS='%' | |
- set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` | |
- shift | |
- IFS=$oIFS | |
+ # With -d, create the new directory with the user-specified mode. | |
+ # Otherwise, rely on $mkdir_umask. | |
+ if test -n "$dir_arg"; then | |
+ mkdir_mode=-m$mode | |
+ else | |
+ mkdir_mode= | |
+ fi | |
- pathcomp= | |
+ posix_mkdir=false | |
+ case $umask in | |
+ *[123567][0-7][0-7]) | |
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which | |
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0. | |
+ ;; | |
+ *) | |
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ | |
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 | |
- while test $# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment