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