automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

PR/307: depcomp/libtool race


From: Alexandre Duret-Lutz
Subject: PR/307: depcomp/libtool race
Date: Fri, 19 Apr 2002 15:58:12 +0200
User-agent: Gnus/5.090006 (Oort Gnus v0.06) Emacs/21.2 (i386-debian-linux-gnu)

Here is a (somewhat extreme) suggestion for PR/307. 
This get rid of all the backgroud processes in depcomp: they are
hard to debug and can cause races with the other tools involved
(e.g. libtool).

2002-04-19  Alexandre Duret-Lutz  <address@hidden>

        For PR automake/307:
        * lib/depcomp: Never compute dependencies in the background, this
        can cause races with libtool.  Compute the dependencies after
        the actual compilation.  Don't make libtool silent now that
        it's run in the foreground.
        * tests/pr307.test: New file.
        * tests/Makefile.am (TESTS): Add pr307.test.
        Reported by Laurent Morichetti.

Index: THANKS
===================================================================
RCS file: /cvs/automake/automake/THANKS,v
retrieving revision 1.166
diff -u -r1.166 THANKS
--- THANKS      26 Mar 2002 06:04:18 -0000      1.166
+++ THANKS      19 Apr 2002 13:43:47 -0000
@@ -94,6 +94,7 @@
 Larry Jones            address@hidden
 Lars Hecking           address@hidden
 Lars J. Aas            address@hidden
+Laurent Morichetti     address@hidden
 Maciej Stachowiak      address@hidden
 Maciej W. Rozycki      address@hidden
 Manu Rouat             address@hidden
Index: lib/depcomp
===================================================================
RCS file: /cvs/automake/automake/lib/depcomp,v
retrieving revision 1.32
diff -u -r1.32 depcomp
--- lib/depcomp 26 Mar 2002 06:04:19 -0000      1.32
+++ lib/depcomp 19 Apr 2002 13:43:47 -0000
@@ -209,7 +209,7 @@
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
    # dependencies in `foo.d' instead, so we check for that too.
    # Subdirectories are respected.
 
@@ -252,32 +252,9 @@
   # Important note: in order to support this mode, a compiler *must*
   # always write the proprocessed file to stdout, regardless of -o,
   # because we must use -o when running libtool.
+  "$@" || exit $?
   test -z "$dashmflag" && dashmflag=-M
-  ( IFS=" "
-    case " $* " in
-    *" --mode=compile "*) # this is libtool, let us make it quiet
-      for arg
-      do # cycle over the arguments
-        case "$arg" in
-       "--mode=compile")
-         # insert --quiet before "--mode=compile"
-         set fnord "$@" --quiet
-         shift # fnord
-         ;;
-       esac
-       set fnord "$@" "$arg"
-       shift # fnord
-       shift # "$arg"
-      done
-      ;;
-    esac
-    "$@" $dashmflag | sed 's:^[^:]*\:[         ]*:'"$object"'\: :' > 
"$tmpdepfile"
-  ) &
-  proc=$!
-  "$@"
-  stat=$?
-  wait "$proc"
-  if test "$stat" != 0; then exit $stat; fi
+  "$@" $dashmflag | sed 's:^[^:]*\:[   ]*:'"$object"'\: :' > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
   tr ' ' '
@@ -295,33 +272,28 @@
   ;;
 
 makedepend)
+  "$@" || exit $?
   # X makedepend
-  (
-    shift
-    cleared=no
-    for arg in "$@"; do
-      case $cleared in no)
-        set ""; shift
-       cleared=yes
-      esac
-      case "$arg" in
-        -D*|-I*)
-         set fnord "$@" "$arg"; shift;;
-       -*)
-         ;;
-       *)
-         set fnord "$@" "$arg"; shift;;
-      esac
-    done
-    obj_suffix="`echo $object | sed 's/^.*\././'`"
-    touch "$tmpdepfile"
-    ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  ) &
-  proc=$!
-  "$@"
-  stat=$?
-  wait "$proc"
-  if test "$stat" != 0; then exit $stat; fi
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    -*)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
   sed '1,2d' "$tmpdepfile" | tr ' ' '
@@ -336,33 +308,10 @@
   # Important note: in order to support this mode, a compiler *must*
   # always write the proprocessed file to stdout, regardless of -o,
   # because we must use -o when running libtool.
-  ( IFS=" "
-    case " $* " in
-    *" --mode=compile "*)
-      for arg
-      do # cycle over the arguments
-        case $arg in
-       "--mode=compile")
-         # insert --quiet before "--mode=compile"
-         set fnord "$@" --quiet
-         shift # fnord
-         ;;
-       esac
-       set fnord "$@" "$arg"
-       shift # fnord
-       shift # "$arg"
-      done
-      ;;
-    esac
-    "$@" -E |
+  "$@" || exit $?
+  "$@" -E |
     sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
     sed '$ s: \\$::' > "$tmpdepfile"
-  ) &
-  proc=$!
-  "$@"
-  stat=$?
-  wait "$proc"
-  if test "$stat" != 0; then exit $stat; fi
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   cat < "$tmpdepfile" >> "$depfile"
@@ -374,47 +323,25 @@
   # Important note: in order to support this mode, a compiler *must*
   # always write the proprocessed file to stdout, regardless of -o,
   # because we must use -o when running libtool.
-  ( IFS=" "
-    case " $* " in
-    *" --mode=compile "*)
-      for arg
-      do # cycle over the arguments
-        case $arg in
-       "--mode=compile")
-         # insert --quiet before "--mode=compile"
-         set fnord "$@" --quiet
-         shift # fnord
-         ;;
-       esac
-       set fnord "$@" "$arg"
-       shift # fnord
-       shift # "$arg"
-      done
-      ;;
-    esac
-    for arg
-    do
-      case "$arg" in
-      "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
        set fnord "$@"
        shift
        shift
        ;;
-      *)
+    *)
        set fnord "$@" "$arg"
        shift
        shift
        ;;
-      esac
-    done
-    "$@" -E |
-    sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u 
\\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  ) &
-  proc=$!
-  "$@"
-  stat=$?
-  wait "$proc"
-  if test "$stat" != 0; then exit $stat; fi
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' 
| sort | uniq > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::   \1 \\:p' >> 
"$depfile"
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.385.2.3
diff -u -r1.385.2.3 Makefile.am
--- tests/Makefile.am   19 Apr 2002 10:23:08 -0000      1.385.2.3
+++ tests/Makefile.am   19 Apr 2002 13:43:47 -0000
@@ -271,6 +271,7 @@
 pr300-lib.test \
 pr300-ltlib.test \
 pr300-prog.test \
+pr307.test \
 prefix.test \
 primary.test \
 primary2.test \
Index: tests/Makefile.in
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.in,v
retrieving revision 1.499.2.6
diff -u -r1.499.2.6 Makefile.in
--- tests/Makefile.in   19 Apr 2002 10:23:08 -0000      1.499.2.6
+++ tests/Makefile.in   19 Apr 2002 13:43:47 -0000
@@ -347,6 +347,7 @@
 pr300-lib.test \
 pr300-ltlib.test \
 pr300-prog.test \
+pr307.test \
 prefix.test \
 primary.test \
 primary2.test \
Index: tests/pr307.test
===================================================================
RCS file: tests/pr307.test
diff -N tests/pr307.test
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/pr307.test    19 Apr 2002 13:43:47 -0000
@@ -0,0 +1,49 @@
+#! /bin/sh
+
+# Test for PR 307: depcomp with depmode=dashmstdout libtool race condition
+# Report from Laurent Morichetti.
+# (Also exercises check_LTLIBRARIES.)
+
+required='libtoolize gcc'
+. $srcdir/defs || exit 1
+
+cat >> configure.in << 'END'
+AC_PROG_CC
+AC_PROG_LIBTOOL
+AC_OUTPUT
+END
+
+cat > Makefile.am << 'END'
+check_LTLIBRARIES = librace.la
+librace_la_SOURCES = a.c b.c c.c d.c e.c f.c g.c h.c
+END
+
+for i in a b c d e f g h; do
+  echo "int $i() { return 0; }" > $i.c
+done
+
+set -e
+
+libtoolize --force
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE -a
+
+# Sanity check: make sure the variable we are attempting to force
+# is used by configure
+grep am_cv_CC_dependencies_compiler_type configure
+
+./configure am_cv_CC_dependencies_compiler_type=dashmstdout
+$MAKE
+test -f librace.la && exit 1
+$MAKE check
+
+# The failure we check usually occurs during the above build,
+# with an output such as
+#
+# mv -f .libs/f.lo f.lo
+# mv: cannot stat `.libs/f.lo': No such file or directory
+#
+# (This may happen on `f' or on some other files.)
+
+test -f librace.la

-- 
Alexandre Duret-Lutz




reply via email to

[Prev in Thread] Current Thread [Next in Thread]