Home | History | Annotate | Download | only in install-tools
      1 #! /bin/sh
      2 # mkinstalldirs --- make directory hierarchy
      3 
      4 scriptversion=2005-06-29.22
      5 
      6 # Original author: Noah Friedman <friedman (at] prep.ai.mit.edu>
      7 # Created: 1993-05-16
      8 # Public domain.
      9 #
     10 # This file is maintained in Automake, please report
     11 # bugs to <bug-automake (at] gnu.org> or send patches to
     12 # <automake-patches (at] gnu.org>.
     13 
     14 errstatus=0
     15 dirmode=
     16 
     17 usage="\
     18 Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
     19 
     20 Create each directory DIR (with mode MODE, if specified), including all
     21 leading file name components.
     22 
     23 Report bugs to <bug-automake (at] gnu.org>."
     24 
     25 # process command line arguments
     26 while test $# -gt 0 ; do
     27   case $1 in
     28     -h | --help | --h*)         # -h for help
     29       echo "$usage"
     30       exit $?
     31       ;;
     32     -m)                         # -m PERM arg
     33       shift
     34       test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
     35       dirmode=$1
     36       shift
     37       ;;
     38     --version)
     39       echo "$0 $scriptversion"
     40       exit $?
     41       ;;
     42     --)                         # stop option processing
     43       shift
     44       break
     45       ;;
     46     -*)                         # unknown option
     47       echo "$usage" 1>&2
     48       exit 1
     49       ;;
     50     *)                          # first non-opt arg
     51       break
     52       ;;
     53   esac
     54 done
     55 
     56 for file
     57 do
     58   if test -d "$file"; then
     59     shift
     60   else
     61     break
     62   fi
     63 done
     64 
     65 case $# in
     66   0) exit 0 ;;
     67 esac
     68 
     69 # Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
     70 # mkdir -p a/c at the same time, both will detect that a is missing,
     71 # one will create a, then the other will try to create a and die with
     72 # a "File exists" error.  This is a problem when calling mkinstalldirs
     73 # from a parallel make.  We use --version in the probe to restrict
     74 # ourselves to GNU mkdir, which is thread-safe.
     75 case $dirmode in
     76   '')
     77     if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
     78       echo "mkdir -p -- $*"
     79       exec mkdir -p -- "$@"
     80     else
     81       # On NextStep and OpenStep, the `mkdir' command does not
     82       # recognize any option.  It will interpret all options as
     83       # directories to create, and then abort because `.' already
     84       # exists.
     85       test -d ./-p && rmdir ./-p
     86       test -d ./--version && rmdir ./--version
     87     fi
     88     ;;
     89   *)
     90     if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
     91        test ! -d ./--version; then
     92       echo "mkdir -m $dirmode -p -- $*"
     93       exec mkdir -m "$dirmode" -p -- "$@"
     94     else
     95       # Clean up after NextStep and OpenStep mkdir.
     96       for d in ./-m ./-p ./--version "./$dirmode";
     97       do
     98         test -d $d && rmdir $d
     99       done
    100     fi
    101     ;;
    102 esac
    103 
    104 for file
    105 do
    106   case $file in
    107     /*) pathcomp=/ ;;
    108     *)  pathcomp= ;;
    109   esac
    110   oIFS=$IFS
    111   IFS=/
    112   set fnord $file
    113   shift
    114   IFS=$oIFS
    115 
    116   for d
    117   do
    118     test "x$d" = x && continue
    119 
    120     pathcomp=$pathcomp$d
    121     case $pathcomp in
    122       -*) pathcomp=./$pathcomp ;;
    123     esac
    124 
    125     if test ! -d "$pathcomp"; then
    126       echo "mkdir $pathcomp"
    127 
    128       mkdir "$pathcomp" || lasterr=$?
    129 
    130       if test ! -d "$pathcomp"; then
    131 	errstatus=$lasterr
    132       else
    133 	if test ! -z "$dirmode"; then
    134 	  echo "chmod $dirmode $pathcomp"
    135 	  lasterr=
    136 	  chmod "$dirmode" "$pathcomp" || lasterr=$?
    137 
    138 	  if test ! -z "$lasterr"; then
    139 	    errstatus=$lasterr
    140 	  fi
    141 	fi
    142       fi
    143     fi
    144 
    145     pathcomp=$pathcomp/
    146   done
    147 done
    148 
    149 exit $errstatus
    150 
    151 # Local Variables:
    152 # mode: shell-script
    153 # sh-indentation: 2
    154 # eval: (add-hook 'write-file-hooks 'time-stamp)
    155 # time-stamp-start: "scriptversion="
    156 # time-stamp-format: "%:y-%02m-%02d.%02H"
    157 # time-stamp-end: "$"
    158 # End:
    159