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