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