This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[committed] Import newer install-sh, mkinstalldirs
- From: neroden at twcny dot rr dot com (Nathanael Nerode)
- To: gcc-patches at gcc dot gnu dot org, gdb-patches at sources dot redhat dot com, binutils at sources dot redhat dot com
- Date: Thu, 19 Feb 2004 21:03:22 -0500
- Subject: [committed] Import newer install-sh, mkinstalldirs
This fixes a nasty bug which first showed up doing parallel makes for
GCC, plus some related bugs.
2004-02-19 Nathanael Nerode <neroden@gcc.gnu.org>
PR bootstrap/11932
* mkinstalldirs, install-sh: Import from automake CVS HEAD.
Index: install-sh
===================================================================
RCS file: /cvs/src/src/install-sh,v
retrieving revision 1.2
diff -c -3 -r1.2 install-sh
*** install-sh 29 Aug 2003 00:13:09 -0000 1.2
--- install-sh 20 Feb 2004 02:02:12 -0000
***************
*** 1,7 ****
#!/bin/sh
- #
# install - install a program, script, or datafile
! #
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
# following copyright and license.
--- 1,8 ----
#!/bin/sh
# install - install a program, script, or datafile
!
! scriptversion=2004-02-15.20
!
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
# following copyright and license.
***************
*** 41,53 ****
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
-
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
-
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
--- 42,52 ----
***************
*** 59,294 ****
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
! transformbasename=""
! transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
! chowncmd=""
! chgrpcmd=""
! stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
! src=""
! dst=""
! dir_arg=""
!
! while [ x"$1" != x ]; do
! case $1 in
! -c) instcmd=$cpprog
! shift
! continue;;
!
! -d) dir_arg=true
! shift
! continue;;
!
! -m) chmodcmd="$chmodprog $2"
! shift
! shift
! continue;;
!
! -o) chowncmd="$chownprog $2"
! shift
! shift
! continue;;
!
! -g) chgrpcmd="$chgrpprog $2"
! shift
! shift
! continue;;
!
! -s) stripcmd=$stripprog
! shift
! continue;;
!
! -t=*) transformarg=`echo $1 | sed 's/-t=//'`
! shift
! continue;;
!
! -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
! shift
! continue;;
!
! *) if [ x"$src" = x ]
! then
! src=$1
! else
! # this colon is to work around a 386BSD /bin/sh bug
! :
! dst=$1
! fi
! shift
! continue;;
! esac
done
! if [ x"$src" = x ]
! then
! echo "$0: no input file specified" >&2
! exit 1
! else
! :
! fi
!
! if [ x"$dir_arg" != x ]; then
! dst=$src
! src=""
!
! if [ -d "$dst" ]; then
! instcmd=:
! chmodcmd=""
! else
! instcmd=$mkdirprog
! fi
! else
!
! # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
! # might cause directories to be created, which would be especially bad
! # if $src (and thus $dsttmp) contains '*'.
!
! if [ -f "$src" ] || [ -d "$src" ]
! then
! :
! else
! echo "$0: $src does not exist" >&2
! exit 1
! fi
!
! if [ x"$dst" = x ]
! then
! echo "$0: no destination specified" >&2
! exit 1
! else
! :
! fi
!
! # If destination is a directory, append the input filename; if your system
! # does not like double slashes in filenames, you may need to add some logic
!
! if [ -d "$dst" ]
! then
! dst=$dst/`basename "$src"`
! else
! :
! fi
fi
! ## this sed command emulates the dirname command
! dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
!
! # Make sure that the destination directory exists.
! # this part is taken from Noah Friedman's mkinstalldirs script
!
! # Skip lots of stat calls in the usual case.
! if [ ! -d "$dstdir" ]; then
! defaultIFS='
! '
! IFS="${IFS-$defaultIFS}"
!
! oIFS=$IFS
! # Some sh's can't handle IFS=/ for some reason.
! IFS='%'
! set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
! IFS=$oIFS
!
! pathcomp=''
!
! while [ $# -ne 0 ] ; do
! pathcomp=$pathcomp$1
! shift
!
! if [ ! -d "$pathcomp" ] ;
! then
! $mkdirprog "$pathcomp"
! else
! :
! fi
! pathcomp=$pathcomp/
done
- fi
-
- if [ x"$dir_arg" != x ]
- then
- $doit $instcmd "$dst" &&
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
- else
-
- # If we're going to rename the final executable, determine the name now.
-
- if [ x"$transformarg" = x ]
- then
- dstfile=`basename "$dst"`
- else
- dstfile=`basename "$dst" $transformbasename |
- sed $transformarg`$transformbasename
- fi
-
- # don't allow the sed command to completely eliminate the filename
-
- if [ x"$dstfile" = x ]
- then
- dstfile=`basename "$dst"`
- else
- :
- fi
-
- # Make a couple of temp file names in the proper directory.
-
- dsttmp=$dstdir/#inst.$$#
- rmtmp=$dstdir/#rm.$$#
-
- # Trap to clean up temp files at exit.
-
- trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
- trap '(exit $?); exit' 1 2 13 15
-
- # Move or copy the file name to the temp name
-
- $doit $instcmd "$src" "$dsttmp" &&
-
- # and set any options; do chmod last to preserve setuid bits
-
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $instcmd $src $dsttmp" command.
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
-
- # Now remove or move aside any old file at destination location. We try this
- # two ways since rm can't unlink itself on some systems and the destination
- # file might be busy for other reasons. In this case, the final cleanup
- # might fail but the new file should still install successfully.
-
- {
- if [ -f "$dstdir/$dstfile" ]
- then
- $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
- $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
- {
- echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
- (exit 1); exit
- }
- else
- :
- fi
- } &&
-
- # Now rename the file to the real destination.
-
- $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-
- fi &&
# The final little trick to "correctly" pass the exit status to the exit trap.
-
{
! (exit 0); exit
}
--- 58,316 ----
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
! transformbasename=
! transform_arg=
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
! chowncmd=
! chgrpcmd=
! stripcmd=
rmcmd="$rmprog -f"
mvcmd="$mvprog"
! src=
! dst=
! dir_arg=
!
! usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
! or: $0 [OPTION]... SRCFILES... DIRECTORY
! or: $0 -d DIRECTORIES...
!
! In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
! In the second, create the directory path DIR.
!
! Options:
! -b=TRANSFORMBASENAME
! -c copy source (using $cpprog) instead of moving (using $mvprog).
! -d create directories instead of installing files.
! -g GROUP $chgrp installed files to GROUP.
! -m MODE $chmod installed files to MODE.
! -o USER $chown installed files to USER.
! -s strip installed files (using $stripprog).
! -t=TRANSFORM
! --help display this help and exit.
! --version display version info and exit.
!
! Environment variables override the default commands:
! CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
! "
!
! while test -n "$1"; do
! case $1 in
! -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
! shift
! continue;;
!
! -c) instcmd=$cpprog
! shift
! continue;;
!
! -d) dir_arg=true
! shift
! continue;;
!
! -g) chgrpcmd="$chgrpprog $2"
! shift
! shift
! continue;;
!
! --help) echo "$usage"; exit 0;;
!
! -m) chmodcmd="$chmodprog $2"
! shift
! shift
! continue;;
!
! -o) chowncmd="$chownprog $2"
! shift
! shift
! continue;;
!
! -s) stripcmd=$stripprog
! shift
! continue;;
!
! -t=*) transformarg=`echo $1 | sed 's/-t=//'`
! shift
! continue;;
!
! --version) echo "$0 $scriptversion"; exit 0;;
!
! *) # When -d is used, all remaining arguments are directories to create.
! test -n "$dir_arg" && 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
! break;;
! esac
done
! if test -z "$1"; then
! if test -z "$dir_arg"; then
! echo "$0: no input file specified." >&2
! exit 1
! fi
! # It's OK to call `install-sh -d' without argument.
! # This can happen when creating conditional directories.
! exit 0
fi
! for src
! do
! # Protect names starting with `-'.
! case $src in
! -*) src=./$src ;;
! esac
!
! if test -n "$dir_arg"; then
! dst=$src
! src=
!
! if test -d "$dst"; then
! instcmd=:
! chmodcmd=
! else
! instcmd=$mkdirprog
! fi
! else
! # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
! # might cause directories to be created, which would be especially bad
! # if $src (and thus $dsttmp) contains '*'.
! if test ! -f "$src" && test ! -d "$src"; then
! echo "$0: $src does not exist." >&2
! exit 1
! fi
!
! if test -z "$dstarg"; then
! echo "$0: no destination specified." >&2
! exit 1
! fi
!
! dst=$dstarg
! # Protect names starting with `-'.
! case $dst in
! -*) 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
! dst=$dst/`basename "$src"`
! fi
! fi
!
! # This sed command emulates the dirname command.
! dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
!
! # Make sure that the destination directory exists.
!
! # Skip lots of stat calls in the usual case.
! if test ! -d "$dstdir"; then
! defaultIFS='
! '
! IFS="${IFS-$defaultIFS}"
!
! oIFS=$IFS
! # Some sh's can't handle IFS=/ for some reason.
! IFS='%'
! set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
! IFS=$oIFS
!
! pathcomp=
!
! while test $# -ne 0 ; do
! pathcomp=$pathcomp$1
! shift
! if test ! -d "$pathcomp"; then
! $mkdirprog "$pathcomp" || lasterr=$?
! # mkdir can fail with a `File exist' error in case several
! # install-sh are creating the directory concurrently. This
! # is OK.
! test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
! fi
! pathcomp=$pathcomp/
! done
! fi
!
! if test -n "$dir_arg"; then
! $doit $instcmd "$dst" \
! && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
! && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
! && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
! && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
!
! else
! # If we're going to rename the final executable, determine the name now.
! if test -z "$transformarg"; then
! dstfile=`basename "$dst"`
! else
! dstfile=`basename "$dst" $transformbasename \
! | sed $transformarg`$transformbasename
! fi
!
! # don't allow the sed command to completely eliminate the filename.
! test -z "$dstfile" && dstfile=`basename "$dst"`
!
! # Make a couple of temp file names in the proper directory.
! dsttmp=$dstdir/_inst.$$_
! rmtmp=$dstdir/_rm.$$_
!
! # Trap to clean up those temp files at exit.
! trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
! trap '(exit $?); exit' 1 2 13 15
!
! # Move or copy the file name to the temp name
! $doit $instcmd "$src" "$dsttmp" &&
!
! # and set any options; do chmod last to preserve setuid bits.
! #
! # If any of these fail, we abort the whole thing. If we want to
! # ignore errors from any of these, just make sure not to ignore
! # errors from the above "$doit $instcmd $src $dsttmp" command.
! #
! { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
! && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
! && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
! && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
!
! # Now remove or move aside any old file at destination location. We
! # try this two ways since rm can't unlink itself on some systems and
! # the destination file might be busy for other reasons. In this case,
! # the final cleanup might fail but the new file should still install
! # successfully.
! {
! if test -f "$dstdir/$dstfile"; then
! $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
! || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
! || {
! echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
! (exit 1); exit
! }
! else
! :
! fi
! } &&
!
! # Now rename the file to the real destination.
! $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
! fi || { (exit 1); exit; }
done
# The final little trick to "correctly" pass the exit status to the exit trap.
{
! (exit 0); exit
}
+
+ # Local variables:
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
+ # time-stamp-start: "scriptversion="
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
+ # time-stamp-end: "$"
+ # End:
Index: mkinstalldirs
===================================================================
RCS file: /cvs/src/src/mkinstalldirs,v
retrieving revision 1.2
diff -c -3 -r1.2 mkinstalldirs
*** mkinstalldirs 30 Jul 2003 01:35:07 -0000 1.2
--- mkinstalldirs 20 Feb 2004 02:02:12 -0000
***************
*** 1,20 ****
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
! # Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
! # Public domain
errstatus=0
dirmode=""
usage="\
! Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
# process command line arguments
while test $# -gt 0 ; do
case $1 in
-h | --help | --h*) # -h for help
! echo "$usage" 1>&2
exit 0
;;
-m) # -m PERM arg
--- 1,32 ----
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
!
! scriptversion=2004-02-15.20
!
! # Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
! # Public domain.
! #
! # This file is maintained in Automake, please report
! # bugs to <bug-automake@gnu.org> or send patches to
! # <automake-patches@gnu.org>.
errstatus=0
dirmode=""
usage="\
! Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
!
! Create each directory DIR (with mode MODE, if specified), including all
! leading file name components.
!
! Report bugs to <bug-automake@gnu.org>."
# process command line arguments
while test $# -gt 0 ; do
case $1 in
-h | --help | --h*) # -h for help
! echo "$usage"
exit 0
;;
-m) # -m PERM arg
***************
*** 23,28 ****
--- 35,44 ----
dirmode=$1
shift
;;
+ --version)
+ echo "$0 $scriptversion"
+ exit 0
+ ;;
--) # stop option processing
shift
break
***************
*** 50,66 ****
0) exit 0 ;;
esac
case $dirmode in
'')
! if mkdir -p -- . 2>/dev/null; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi
;;
*)
! if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
fi
;;
esac
--- 66,102 ----
0) exit 0 ;;
esac
+ # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+ # mkdir -p a/c at the same time, both will detect that a is missing,
+ # one will create a, then the other will try to create a and die with
+ # a "File exists" error. This is a problem when calling mkinstalldirs
+ # from a parallel make. We use --version in the probe to restrict
+ # ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
'')
! if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
+ else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ test -d ./-p && rmdir ./-p
+ test -d ./--version && rmdir ./--version
fi
;;
*)
! if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
! test ! -d ./--version; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
+ else
+ # Clean up after NextStep and OpenStep mkdir.
+ for d in ./-m ./-p ./--version "./$dirmode";
+ do
+ test -d $d && rmdir $d
+ done
fi
;;
esac
***************
*** 84,100 ****
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
! errstatus=$lasterr
else
! if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
! lasterr=""
! chmod "$dirmode" "$pathcomp" || lasterr=$?
! if test ! -z "$lasterr"; then
! errstatus=$lasterr
! fi
! fi
fi
fi
--- 120,136 ----
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
! errstatus=$lasterr
else
! if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
! lasterr=""
! chmod "$dirmode" "$pathcomp" || lasterr=$?
! if test ! -z "$lasterr"; then
! errstatus=$lasterr
! fi
! fi
fi
fi
***************
*** 107,111 ****
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# End:
- # mkinstalldirs ends here
--- 143,150 ----
# Local Variables:
# mode: shell-script
# sh-indentation: 2
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
+ # time-stamp-start: "scriptversion="
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
+ # time-stamp-end: "$"
# End:
--
Nathanael Nerode <neroden at gcc.gnu.org>
US citizens: if you're considering voting for Bush, look at these first:
http://www.misleader.org/ http://www.cbc.ca/news/background/arar/
http://www.house.gov/reform/min/politicsandscience/