diff --git a/ChangeLog b/ChangeLog index c438a1d3..5be397b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 1998-11-04 Alexandre Oliva + * ltconfig.in (need_locks): if neither `-c -o' nor hard links are + available, fallback to not so safe mechanism, by setting + need_locks to warn + * ltmain.in (need_locks): when need_locks is set to warn, use the + lockfile to try to fail in case of incorrect concurrent builds + * THANKS: Added Eric Estievenart 1998-11-04 Eric Estievenart diff --git a/ltconfig.in b/ltconfig.in index affa7912..4ddc33e3 100755 --- a/ltconfig.in +++ b/ltconfig.in @@ -655,23 +655,14 @@ if test "$compiler_c_o" = no && test "$need_locks" != no; then ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$ac_t$hard_links" 1>&6 $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" + need_locks=warn + fi else need_locks=no fi -# Abort if we need locks and they don't work and the user didn't disable them - -if test "$hard_links" = no; then - echo "*** Warning, your platform support neither -c and -o with your compiler" - echo "*** and doesn't provide working hard links to do file locking." - echo "*** You can use ltconfig --disable-lock or configure --disable-libtool-lock" - echo "*** but you should never try to do parallel compilation (make -j n)" - echo "*** unless the package maintainer told you that you could." - echo "*** You should report this bug to " - exit 1 -fi - - # Check for any special shared library compilation flags. if test -n "$special_shlib_compile_flags"; then echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 diff --git a/ltmain.in b/ltmain.in index 73048121..f5f9de49 100644 --- a/ltmain.in +++ b/ltmain.in @@ -362,27 +362,50 @@ if test -z "$show_help"; then # Delete any leftover library objects. if test "$build_old_libs" = yes; then - $run $rm $obj $libobj - trap "$run $rm $obj $libobj; exit 1" 1 2 15 + removelist="$obj $libobj $lockfile" else - $run $rm $libobj - trap "$run $rm $libobj; exit 1" 1 2 15 + removelist="$libobj $lockfile" fi + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.o + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then - until ln "$0" "$output_obj.lock" 2>/dev/null; do - $show "Waiting for lock on $output_obj to be removed" + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" sleep 2 done - trap "rm $output_obj.lock; exit 1" 1 2 15 + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" fi # Only build a PIC object if we are building libtool libraries. @@ -400,21 +423,51 @@ if test -z "$show_help"; then $show "$command" if $run eval "$command"; then : else - test -n "$output_obj" && $run $rm $output_obj + test -n "$output_obj" && $run $rm $removelist exit 1 fi + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + # Just move the object if needed, then go on to compile the next one - if test "$compiler_c_o" = no; then + if test "$compiler_c_o" = no && test x"$output_obj" != x"$libobj"; then $show "$mv $output_obj $libobj" - $run $mv $output_obj $libobj || exit $? + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi fi # If we have no pic_flag, then copy the object into place and finish. if test -z "$pic_flag"; then $show "$LN_S $libobj $obj" - $run $LN_S $libobj $obj - exit $? + if $run $LN_S $libobj $obj; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi fi # Allow error messages only from the first compilation. @@ -434,20 +487,45 @@ if test -z "$show_help"; then $show "$command" if $run eval "$command"; then : else - $run $rm $output_obj $libobj + $run $rm $removelist exit 1 fi + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + # Just move the object if needed - if test "$compiler_c_o" = no; then + if test "$compiler_c_o" = no && test x"$output_obj" != x"$obj"; then $show "$mv $output_obj $obj" - $run $mv $output_obj $obj || exit $? + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi fi fi # Unlock the critical section if it was locked - if test "$need_locks" = yes; then - rm "$output_obj.lock" + if test "$need_locks" != no; then + rm -f "$lockfile" fi # Create an invalid libtool object if no PIC, so that we do not