mkinstalldirs 3.39 KB
Newer Older
Craig Silverstein's avatar
Craig Silverstein committed
1 2
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
3 4 5 6

scriptversion=2005-06-29.22

# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
Craig Silverstein's avatar
Craig Silverstein committed
7
# Created: 1993-05-16
8 9 10 11 12
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
Craig Silverstein's avatar
Craig Silverstein committed
13 14

errstatus=0
15
dirmode=
Craig Silverstein's avatar
Craig Silverstein committed
16 17

usage="\
18 19 20 21 22 23
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>."
Craig Silverstein's avatar
Craig Silverstein committed
24 25 26

# process command line arguments
while test $# -gt 0 ; do
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  case $1 in
    -h | --help | --h*)         # -h for help
      echo "$usage"
      exit $?
      ;;
    -m)                         # -m PERM arg
      shift
      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
      dirmode=$1
      shift
      ;;
    --version)
      echo "$0 $scriptversion"
      exit $?
      ;;
    --)                         # stop option processing
      shift
      break
      ;;
    -*)                         # unknown option
      echo "$usage" 1>&2
      exit 1
      ;;
    *)                          # first non-opt arg
      break
      ;;
  esac
Craig Silverstein's avatar
Craig Silverstein committed
54 55 56 57 58 59 60 61 62 63 64 65
done

for file
do
  if test -d "$file"; then
    shift
  else
    break
  fi
done

case $# in
66
  0) exit 0 ;;
Craig Silverstein's avatar
Craig Silverstein committed
67 68
esac

69 70 71 72 73 74
# 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.
Craig Silverstein's avatar
Craig Silverstein committed
75
case $dirmode in
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
  '')
    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
    ;;
Craig Silverstein's avatar
Craig Silverstein committed
102 103 104 105
esac

for file
do
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
  case $file in
    /*) pathcomp=/ ;;
    *)  pathcomp= ;;
  esac
  oIFS=$IFS
  IFS=/
  set fnord $file
  shift
  IFS=$oIFS

  for d
  do
    test "x$d" = x && continue

    pathcomp=$pathcomp$d
    case $pathcomp in
      -*) pathcomp=./$pathcomp ;;
    esac

    if test ! -d "$pathcomp"; then
      echo "mkdir $pathcomp"

      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
Craig Silverstein's avatar
Craig Silverstein committed
140 141
	  fi
	fi
142 143
      fi
    fi
Craig Silverstein's avatar
Craig Silverstein committed
144

145 146
    pathcomp=$pathcomp/
  done
Craig Silverstein's avatar
Craig Silverstein committed
147 148 149 150 151 152
done

exit $errstatus

# Local Variables:
# mode: shell-script
153 154 155 156 157
# 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: "$"
Craig Silverstein's avatar
Craig Silverstein committed
158
# End: