Solaris 8's mkdir is not thread-safe.
* lib/mkinstalldirs: Likewise.
* lib/install-sh: Abort when mkdir fails to create a directory.
Report from Nathanael Nerode.
+2004-02-15 Alexandre Duret-Lutz <adl@gnu.org>
+
+ * m4/mkdirp.m4: Use `mkdir -p' only with GNU mkdir, because
+ Solaris 8's mkdir is not thread-safe.
+ * lib/mkinstalldirs: Likewise.
+ * lib/install-sh: Abort when mkdir fails to create a directory.
+ Report from Nathanael Nerode.
+
2004-02-07 Alexandre Duret-Lutz <adl@gnu.org>
* aclocal.in (rel2abs): New function.
Mirko Streckenbach strecken@infosun.fmi.uni-passau.de
Morten Eriksen mortene@sim.no
Motoyuki Kasahara m-kasahr@sra.co.jp
+Nathanael Nerode neroden@twcny.rr.com
Nelson H. F. Beebe beebe@math.utah.edu
Nicholas Wourms nwourms@netscape.net
Nicolas Joly njoly@pasteur.fr
echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
fi
-if mkdir -p -- . 2>/dev/null; then
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
# Keeping the `.' argument allows $(mkdir_p) to be used without
# argument. Indeed, we sometimes output rules like
# $(mkdir_p) $(somedir)
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
- for d in ./-p ./--;
+ for d in ./-p ./--version;
do
test -d $d && rmdir $d
done
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2004-01-13.14
+scriptversion=2004-02-15.20
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
while test $# -ne 0 ; do
pathcomp=$pathcomp$1
shift
- test -d "$pathcomp" || $mkdirprog "$pathcomp"
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp" || lasterr=$?
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
+ fi
pathcomp=$pathcomp/
done
fi
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
-scriptversion=2003-11-08.23
+scriptversion=2004-02-15.20
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
0) exit 0 ;;
esac
+# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error. This is a problem when calling mkinstalldirs
+# from a parallel make. We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
'')
- if mkdir -p -- . 2>/dev/null; then
+ if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
else
# directories to create, and then abort because `.' already
# exists.
test -d ./-p && rmdir ./-p
- test -d ./-- && rmdir ./--
+ test -d ./--version && rmdir ./--version
fi
;;
*)
- if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+ if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+ test ! -d ./--version; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
else
# Clean up after NextStep and OpenStep mkdir.
- for d in ./-m ./-p ./-- "./$dirmode";
+ for d in ./-m ./-p ./--version "./$dirmode";
do
test -d $d && rmdir $d
done
#
# Do not use -m 0755 and let people choose whatever they expect by
# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
AC_DEFUN([AM_PROG_MKDIR_P],
-[if mkdir -p -- . 2>/dev/null; then
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
# Keeping the `.' argument allows $(mkdir_p) to be used without
# argument. Indeed, we sometimes output rules like
# $(mkdir_p) $(somedir)
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
- for d in ./-p ./--;
+ for d in ./-p ./--version;
do
test -d $d && rmdir $d
done