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