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