supported.
* libtool.m4 (libtool-lock): new ARG_ENABLE; sets (need_locks)
* ltconfig.in (disable-lock): control need_locks
(hard_links): check whether hard-links can be used for locking
* ltmain.in (need_locks): use $output_obj.lock for locking
+1998-11-04 Eric Estievenart <eric@via.ecp.fr>
+
+ * doc/libtool.texi (Compile mode): Document that -o is fully
+ supported.
+
+ * libtool.m4 (libtool-lock): new ARG_ENABLE; sets (need_locks)
+ * ltconfig.in (disable-lock): control need_locks
+ (hard_links): check whether hard-links can be used for locking
+ * ltmain.in (need_locks): use $output_obj.lock for locking
+
1998-11-03 Alexandre Oliva <oliva@dcc.unicamp.br>
* ltmain.in: correctly create libraries and programs with
If the @samp{-static} option is given, then a @samp{.o} file is built,
even if libtool was configured with @samp{--disable-static}.
-Note that the @samp{-o} option is not supported for compile mode,
-because it cannot be implemented properly for all platforms. It is far
-easier just to change your Makefiles to create all the output files in
-the current working directory.
+Note that the @samp{-o} option is now fully supported. It is emulated
+for the platforms that don't support it (by locking and moving the
+objects), so it is really easy to use libtool, just with minor
+modifications to your Makefiles. Typing for example
+@example
+libtool gcc -c foo/x.c -o foo/x.lo
+@end example
+will do what you expect.
@node Link mode
@section Link mode
## configuration script generated by Autoconf, you may include it under
## the same distribution terms that you use for the rest of that program.
-# serial 26 AM_PROG_LIBTOOL
+# serial 27 AM_PROG_LIBTOOL
AC_DEFUN(AM_PROG_LIBTOOL,
[AC_REQUIRE([AM_ENABLE_SHARED])dnl
AC_REQUIRE([AM_ENABLE_STATIC])dnl
;;
esac
+# enable the --disable-libtool-lock switch
+
+AC_ARG_ENABLE(libtool-lock,
+[ --disable-libtool-lock force libtool not to do file locking],
+need_locks=$enableval,
+need_locks=yes)
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+
+
# Actually configure libtool. ac_aux_dir is where install-sh is found.
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
verify_host=yes
with_gcc=no
with_gnu_ld=no
+need_locks=yes
old_AR="$AR"
old_CC="$CC"
--version output version information and exit
--with-gcc assume that the GNU C compiler will be used
--with-gnu-ld assume that the C compiler uses the GNU linker
+ --disable-lock disable file locking
LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
that provides basic libtool functionality.
--with-gcc) with_gcc=yes ;;
--with-gnu-ld) with_gnu_ld=yes ;;
+ --disable-lock) need_locks=no ;;
+
-*)
echo "$progname: unrecognized option \`$option'" 1>&2
echo "$help" 1>&2
CFLAGS="$save_CFLAGS"
$rm conftest*
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$ac_t$hard_links" 1>&6
+ $rm conftest*
+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 <bug-libtool@gnu.org>"
+ 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
old_postuninstall_cmds archive_cmds postinstall_cmds postuninstall_cmds \
allow_undefined_flag no_undefined_flag \
finish_cmds finish_eval global_symbol_pipe \
- hardcode_libdir_flag_spec hardcode_libdir_separator compiler_c_o; do
+ hardcode_libdir_flag_spec hardcode_libdir_separator compiler_c_o need_locks; do
case "$var" in
reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
trap "$rm \"$ofile\"; exit 1" 1 2 15
echo "creating $ofile"
$rm "$ofile"
- if test "$compiler_c_o" = no; then
- $echo "**** Warning ! Your compiler doesn't support -c and -o options"
- $echo "**** If you use a single makefile, with relative directories and"
- $echo "**** use the -o option of libtool gcc, we strongly discourage"
- $echo "**** to make parallel builds (make -j n) if there are source"
- $echo "**** files with the same name in different subdirectories"
- fi
cat <<EOF > "$ofile"
#! $SHELL
# Does compiler simultaneously support -c and -o options
compiler_c_o=$compiler_c_o
+# Must we lock files when doing compilation ?
+need_locks=$need_locks
+
# Compiler flag to prevent dynamic linking.
link_static_flag=$link_static_flag
output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.o
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"
+ sleep 2
+ done
+ trap "rm $output_obj.lock; exit 1" 1 2 15
+ fi
+
# Only build a PIC object if we are building libtool libraries.
if test "$build_libtool_libs" = yes; then
# Without this assignment, base_compile gets emptied.
fi
fi
+ # Unlock the critical section if it was locked
+ if test "$need_locks" = yes; then
+ rm "$output_obj.lock"
+ fi
+
# Create an invalid libtool object if no PIC, so that we do not
# accidentally link it into a program.
if test "$build_libtool_libs" != yes; then