This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]