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