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