From 9b3446717ab7795d1d8a10c34f09ea9655e1553b Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Sun, 15 Feb 2004 21:14:22 +0000 Subject: [PATCH] * 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. --- ChangeLog | 8 ++++++++ THANKS | 1 + configure | 4 ++-- lib/install-sh | 10 ++++++++-- lib/mkinstalldirs | 17 ++++++++++++----- m4/mkdirp.m4 | 12 ++++++++++-- 6 files changed, 41 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 73c641c7..3ac423b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-02-15 Alexandre Duret-Lutz + + * 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 * aclocal.in (rel2abs): New function. diff --git a/THANKS b/THANKS index ad14175d..8a26177d 100644 --- a/THANKS +++ b/THANKS @@ -161,6 +161,7 @@ Miodrag Vallat miodrag@ifrance.com 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 diff --git a/configure b/configure index dde209cd..acbe2fb1 100755 --- a/configure +++ b/configure @@ -1681,7 +1681,7 @@ else 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) @@ -1694,7 +1694,7 @@ else # 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 diff --git a/lib/install-sh b/lib/install-sh index 8042a49b..77bc3814 100755 --- a/lib/install-sh +++ b/lib/install-sh @@ -1,7 +1,7 @@ #!/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 @@ -228,7 +228,13 @@ do 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 diff --git a/lib/mkinstalldirs b/lib/mkinstalldirs index 6504b744..6fbe5e11 100755 --- a/lib/mkinstalldirs +++ b/lib/mkinstalldirs @@ -1,7 +1,7 @@ #! /bin/sh # mkinstalldirs --- make directory hierarchy -scriptversion=2003-11-08.23 +scriptversion=2004-02-15.20 # Original author: Noah Friedman # Created: 1993-05-16 @@ -66,9 +66,15 @@ case $# in 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 @@ -77,16 +83,17 @@ case $dirmode in # 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 diff --git a/m4/mkdirp.m4 b/m4/mkdirp.m4 index f54005f5..361d20cf 100644 --- a/m4/mkdirp.m4 +++ b/m4/mkdirp.m4 @@ -29,8 +29,16 @@ # # 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) @@ -43,7 +51,7 @@ else # 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 -- 2.43.5