mirror of
https://https.git.savannah.gnu.org/git/libtool.git
synced 2026-01-26 15:39:10 +00:00
libtool: Add configuration options for CXX linking
Add configuration options to choose whether to use '-nostdlib' when linking C++ shared libraries and modules. * m4/libtool.m4: Replace '-nostdlib' with variable '$stdlibflag' and set '$output_verbose_link_cmd' to be empty when enabling standard library linking for C++ modules. * m4/ltoptions.m4: Add new configuration options, --enable-cxx-stdlib and --disable-cxx-stdlib, and add LT_INIT options, cxx-stdlib and no-cxx-stdlib. * doc/libtool.texi: Update for new configuration options. * NEWS: Update.
This commit is contained in:
parent
7945cf75f8
commit
9bc7536bd8
5
NEWS
5
NEWS
@ -12,6 +12,11 @@ NEWS - list of user-visible changes between releases of GNU Libtool
|
||||
- Increase 5 digit limit on revision value for libraries to 19 digits,
|
||||
which is referencing Unix epoch time in nanoseconds.
|
||||
|
||||
- Add configuration options to choose whether to use '-nostdlib' to let
|
||||
the compiler frontend decide what standard libraries to link when
|
||||
building C++ shared libraries and modules, --enable-cxx-stdlib and
|
||||
--disable-cxx-stdlib.
|
||||
|
||||
** Bug fixes:
|
||||
|
||||
- Fix wrongly deduplicated compiler dependencies on linux.
|
||||
|
||||
@ -2378,6 +2378,19 @@ Change the default behaviour of @command{libtool} to try to use only
|
||||
non-PIC objects. The user may still override this default by
|
||||
specifying @option{--enable-pic} to @command{configure}.
|
||||
|
||||
@item cxx-stdlib
|
||||
Change the default behaviour for @command{libtool} to let the compiler
|
||||
frontend decide what standard libraries to link when building C++ shared
|
||||
libraries and modules.
|
||||
The user may still override this default by specifying
|
||||
@option{--disable-cxx-stdlib} to @command{configure}.
|
||||
|
||||
@item no-cxx-stdlib
|
||||
Change the default behaviour for @command{libtool} to not link
|
||||
standard libraries when building C++ shared libraries and modules.
|
||||
The user may still override this default by specifying
|
||||
@option{--enable-cxx-stdlib} to @command{configure}.
|
||||
|
||||
@end table
|
||||
|
||||
@end defmac
|
||||
|
||||
48
m4/libtool.m4
vendored
48
m4/libtool.m4
vendored
@ -1201,8 +1201,8 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
|
||||
_LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
|
||||
m4_if([$1], [CXX],
|
||||
[ if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then
|
||||
_LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
|
||||
_LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs $stdlibflag -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs $stdlibflag -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
|
||||
fi
|
||||
],[])
|
||||
else
|
||||
@ -3016,6 +3016,8 @@ netbsdelf*-gnu)
|
||||
shlibpath_overrides_runpath=no
|
||||
hardcode_into_libs=yes
|
||||
dynamic_linker='NetBSD ld.elf_so'
|
||||
enable_cxx_stdlib=yes
|
||||
stdlibflag=
|
||||
;;
|
||||
|
||||
netbsd*)
|
||||
@ -3034,6 +3036,8 @@ netbsd*)
|
||||
shlibpath_var=LD_LIBRARY_PATH
|
||||
shlibpath_overrides_runpath=yes
|
||||
hardcode_into_libs=yes
|
||||
enable_cxx_stdlib=yes
|
||||
stdlibflag=
|
||||
;;
|
||||
|
||||
*-mlibc)
|
||||
@ -3541,7 +3545,7 @@ case $host_os in
|
||||
;;
|
||||
darwin*)
|
||||
if test yes = "$GCC"; then
|
||||
reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
|
||||
reload_cmds='$LTCC $LTCFLAGS $stdlibflag $wl-r -o $output$reload_objs'
|
||||
else
|
||||
reload_cmds='$LD$reload_flag -o $output$reload_objs'
|
||||
fi
|
||||
@ -6596,8 +6600,8 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
# Check if GNU C++ uses GNU ld as the underlying linker, since the
|
||||
# archiving commands below assume that GNU ld is being used.
|
||||
if test yes = "$with_gnu_ld"; then
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
|
||||
|
||||
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
|
||||
_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
|
||||
@ -6622,7 +6626,7 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
# linker, instead of GNU ld. If possible, this setting should
|
||||
# overridden to take advantage of the native linker features on
|
||||
# the platform it is being used on.
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
|
||||
fi
|
||||
|
||||
# Commands to make compiler produce verbose output that lists
|
||||
@ -6893,7 +6897,7 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
_LT_TAGVAR(file_list_spec, $1)='@'
|
||||
|
||||
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
|
||||
# If the export-symbols file already is a .def file, use it as
|
||||
# is; otherwise, prepend EXPORTS...
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
|
||||
@ -6902,7 +6906,7 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
echo EXPORTS > $output_objdir/$soname.def;
|
||||
cat $export_symbols >> $output_objdir/$soname.def;
|
||||
fi~
|
||||
$CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
|
||||
$CC -shared $stdlibflag $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
|
||||
else
|
||||
_LT_TAGVAR(ld_shlibs, $1)=no
|
||||
fi
|
||||
@ -7009,7 +7013,7 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
;;
|
||||
*)
|
||||
if test yes = "$GXX"; then
|
||||
_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $stdlibflag $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
|
||||
else
|
||||
# FIXME: insert proper C++ library support
|
||||
_LT_TAGVAR(ld_shlibs, $1)=no
|
||||
@ -7077,13 +7081,13 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
if test no = "$with_gnu_ld"; then
|
||||
case $host_cpu in
|
||||
hppa*64*)
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
;;
|
||||
ia64*)
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
;;
|
||||
*)
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
@ -7124,9 +7128,9 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
*)
|
||||
if test yes = "$GXX"; then
|
||||
if test no = "$with_gnu_ld"; then
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
else
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
|
||||
fi
|
||||
fi
|
||||
_LT_TAGVAR(link_all_deplibs, $1)=yes
|
||||
@ -7402,10 +7406,10 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
|
||||
case $host in
|
||||
osf3*)
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $stdlibflag $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
;;
|
||||
*)
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $stdlibflag $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -7495,9 +7499,9 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
if test yes,no = "$GXX,$with_gnu_ld"; then
|
||||
_LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
|
||||
if $CC --version | $GREP -v '^2\.7' > /dev/null; then
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
|
||||
$CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
|
||||
$CC -shared $pic_flag $stdlibflag $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
|
||||
|
||||
# Commands to make compiler produce verbose output that lists
|
||||
# what "hidden" libraries, object files and flags are used when
|
||||
@ -7506,9 +7510,9 @@ if test yes != "$_lt_caught_CXX_error"; then
|
||||
else
|
||||
# g++ 2.7 appears to require '-G' NOT '-shared' on this
|
||||
# platform.
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_cmds, $1)='$CC -G $stdlibflag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
|
||||
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
|
||||
$CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
|
||||
$CC -G $stdlibflag $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
|
||||
|
||||
# Commands to make compiler produce verbose output that lists
|
||||
# what "hidden" libraries, object files and flags are used when
|
||||
@ -7747,6 +7751,10 @@ if AC_TRY_EVAL(ac_compile); then
|
||||
# the conftest object file.
|
||||
pre_test_object_deps_done=no
|
||||
|
||||
if test yes = "$enable_cxx_stdlib"; then
|
||||
output_verbose_link_cmd=
|
||||
fi
|
||||
|
||||
for p in `eval "$output_verbose_link_cmd"`; do
|
||||
case $prev$p in
|
||||
|
||||
|
||||
44
m4/ltoptions.m4
vendored
44
m4/ltoptions.m4
vendored
@ -80,6 +80,7 @@ m4_if([$1],[LT_INIT],[
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [cxx-stdlib no-cxx-stdlib], [_LT_ENABLE_CXX_STDLIB])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
||||
[_LT_ENABLE_FAST_INSTALL])
|
||||
_LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
|
||||
@ -456,6 +457,49 @@ put the 'pic-only' option into LT_INIT's first parameter.])
|
||||
dnl aclocal-1.4 backwards compatibility:
|
||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
||||
|
||||
|
||||
# _LT_ENABLE_CXX_STDLIB([MODE])
|
||||
# --------------------
|
||||
# implement the --enable-cxx-stdlib flag, and support the 'cxx-stdlib' and 'no-cxx-stdlib'
|
||||
# LT_INIT options.
|
||||
# MODE is either 'yes' or 'no'. If omitted, it defaults to 'no'.
|
||||
m4_define([_LT_ENABLE_CXX_STDLIB],
|
||||
[m4_define([_LT_ENABLE_CXX_STDLIB_DEFAULT], [m4_if($1, yes, yes, no)])dnl
|
||||
stdlibflag=-nostdlib
|
||||
AC_ARG_ENABLE([cxx-stdlib],
|
||||
[AS_HELP_STRING([--enable-cxx-stdlib@<:@=PKGS@:>@],
|
||||
[let the compiler frontend decide what standard libraries to link when building C++ shared libraries and modules @<:@default=]_LT_ENABLE_CXX_STDLIB_DEFAULT[@:>@])],
|
||||
[p=${PACKAGE-default}
|
||||
case $enableval in
|
||||
yes) enable_cxx_stdlib=yes ;;
|
||||
no) enable_cxx_stdlib=no ;;
|
||||
*)
|
||||
enable_cxx_stdlib=no
|
||||
# Look at the argument we got. We use all the common list separators.
|
||||
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
|
||||
for pkg in $enableval; do
|
||||
IFS=$lt_save_ifs
|
||||
if test "X$pkg" = "X$p"; then
|
||||
enable_cxx_stdlib=yes
|
||||
fi
|
||||
done
|
||||
IFS=$lt_save_ifs
|
||||
;;
|
||||
esac],
|
||||
[enable_cxx_stdlib=]_LT_ENABLE_CXX_STDLIB_DEFAULT)
|
||||
|
||||
if test yes = "$enable_cxx_stdlib"; then
|
||||
stdlibflag=
|
||||
fi
|
||||
|
||||
_LT_DECL([], [enable_cxx_stdlib], [0], [Whether to let the compiler frontend decide what standard libraries to link when building C++ shared libraries and modules])dnl
|
||||
_LT_DECL([], [stdlibflag], [0], [Flag used for specifying not to link standard libraries])dnl
|
||||
])# _LT_ENABLE_CXX_STDLIB
|
||||
|
||||
LT_OPTION_DEFINE([LT_INIT], [cxx-stdlib], [_LT_ENABLE_CXX_STDLIB([yes])])
|
||||
LT_OPTION_DEFINE([LT_INIT], [no-cxx-stdlib], [_LT_ENABLE_CXX_STDLIB([no])])
|
||||
|
||||
|
||||
## ----------------- ##
|
||||
## LTDL_INIT Options ##
|
||||
## ----------------- ##
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user