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