mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-07 13:39:43 +08:00
[gdb/build] Check if libsource-highlight is usable
When building gdb with g++ 4.8.5, I ran into: ... ld: source-cache.o: in function `source_cache::ensure(symtab*)': source-cache.c:207: undefined reference to \ srchilite::SourceHighlight::SourceHighlight(std::string const&) ... [ I configured gdb without explicit settings related to source-highlight, so we're excercising the enable_source_highlight=auto scenario. ] The problem is that: - the source-highlight library is build with system compiler g++ 7.5.0 which uses the new libstdc++ library abi (see https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html ) - gdb is build using g++ 4.8.5 which uses the old abi. [ There's a compatibility macro _GLIBCXX_USE_CXX11_ABI, but that doesn't work for this case. Instead, it enables the opposite case where the source-highlight library is build with g++ 4.8.5 and gdb is build with g++ 7.5.0. ] Fix this by checking whether the source-highlight library is usable during configuration. In the enable_source_highlight=auto scenario, this allows the build to skip the unusable library and finish successfully. In the enable_source_highlight=yes scenario, this allows the build to error out earlier. Tested on x86_64-linux.
This commit is contained in:
parent
d966a54ba9
commit
0f8f2de183
158
gdb/configure
vendored
158
gdb/configure
vendored
@ -2367,6 +2367,52 @@ $as_echo "$ac_res" >&6; }
|
||||
|
||||
} # ac_fn_c_check_func
|
||||
|
||||
# ac_fn_cxx_try_link LINENO
|
||||
# -------------------------
|
||||
# Try to link conftest.$ac_ext, and return whether this succeeded.
|
||||
ac_fn_cxx_try_link ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { { ac_try="$ac_link"
|
||||
case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||
$as_echo "$ac_try_echo"; } >&5
|
||||
(eval "$ac_link") 2>conftest.err
|
||||
ac_status=$?
|
||||
if test -s conftest.err; then
|
||||
grep -v '^ *+' conftest.err >conftest.er1
|
||||
cat conftest.er1 >&5
|
||||
mv -f conftest.er1 conftest.err
|
||||
fi
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; } && {
|
||||
test -z "$ac_cxx_werror_flag" ||
|
||||
test ! -s conftest.err
|
||||
} && test -s conftest$ac_exeext && {
|
||||
test "$cross_compiling" = yes ||
|
||||
test -x conftest$ac_exeext
|
||||
}; then :
|
||||
ac_retval=0
|
||||
else
|
||||
$as_echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_retval=1
|
||||
fi
|
||||
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
|
||||
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
|
||||
# interfere with the next link command; also delete a directory that is
|
||||
# left behind by Apple's compiler. We do this before executing the actions.
|
||||
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
as_fn_set_status $ac_retval
|
||||
|
||||
} # ac_fn_cxx_try_link
|
||||
|
||||
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
|
||||
# -------------------------------------------
|
||||
# Tests whether TYPE exists after having included INCLUDES, setting cache
|
||||
@ -2524,52 +2570,6 @@ $as_echo "$ac_res" >&6; }
|
||||
|
||||
} # ac_fn_c_check_member
|
||||
|
||||
# ac_fn_cxx_try_link LINENO
|
||||
# -------------------------
|
||||
# Try to link conftest.$ac_ext, and return whether this succeeded.
|
||||
ac_fn_cxx_try_link ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { { ac_try="$ac_link"
|
||||
case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||
$as_echo "$ac_try_echo"; } >&5
|
||||
(eval "$ac_link") 2>conftest.err
|
||||
ac_status=$?
|
||||
if test -s conftest.err; then
|
||||
grep -v '^ *+' conftest.err >conftest.er1
|
||||
cat conftest.er1 >&5
|
||||
mv -f conftest.er1 conftest.err
|
||||
fi
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; } && {
|
||||
test -z "$ac_cxx_werror_flag" ||
|
||||
test ! -s conftest.err
|
||||
} && test -s conftest$ac_exeext && {
|
||||
test "$cross_compiling" = yes ||
|
||||
test -x conftest$ac_exeext
|
||||
}; then :
|
||||
ac_retval=0
|
||||
else
|
||||
$as_echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_retval=1
|
||||
fi
|
||||
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
|
||||
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
|
||||
# interfere with the next link command; also delete a directory that is
|
||||
# left behind by Apple's compiler. We do this before executing the actions.
|
||||
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
as_fn_set_status $ac_retval
|
||||
|
||||
} # ac_fn_cxx_try_link
|
||||
|
||||
# ac_fn_cxx_check_func LINENO FUNC VAR
|
||||
# ------------------------------------
|
||||
# Tests whether FUNC exists, setting the cache variable VAR accordingly
|
||||
@ -12103,13 +12103,73 @@ $as_echo "no - pkg-config not found" >&6; }
|
||||
;;
|
||||
esac
|
||||
|
||||
SRCHIGH_CFLAGS=`${pkg_config_prog_path} --cflags source-highlight`
|
||||
SRCHIGH_LIBS=`${pkg_config_prog_path} --libs source-highlight`
|
||||
srchigh_pkg_cflags=`${pkg_config_prog_path} --cflags source-highlight`
|
||||
srchigh_pkg_libs=`${pkg_config_prog_path} --libs source-highlight`
|
||||
|
||||
# Now that we have found a source-highlight library, check if we can use
|
||||
# it. In particular, we're trying to detect the situation that the
|
||||
# library is using the new libstdc++ library abi ( see
|
||||
# https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html )
|
||||
# while the compiler being used to compile gdb is using the old abi.
|
||||
# Such a situation will result in an undefined reference to
|
||||
# srchilite::SourceHighlight::SourceHighlight(std::string const&).
|
||||
# This situation can occur for instance when using a source highlight
|
||||
# library compiled with g++ 7.5.0 while building gdb with g++ 4.8.5.
|
||||
ac_ext=cpp
|
||||
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||
|
||||
save_CFLAGS=$CFLAGS
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
CFLAGS="$CFLAGS $srchigh_pkg_cflags"
|
||||
LDFLAGS="$LDFLAGS $srchigh_pkg_libs"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
#include <srchilite/sourcehighlight.h>
|
||||
int
|
||||
main ()
|
||||
{
|
||||
std::string outlang = "esc.outlang";
|
||||
new srchilite::SourceHighlight (outlang);
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_cxx_try_link "$LINENO"; then :
|
||||
have_usable_source_highlight=yes
|
||||
else
|
||||
have_usable_source_highlight=no
|
||||
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CFLAGS="$SAVE_CFLAGS"
|
||||
LDFLAGS="$SAVE_LDFLAGS"
|
||||
ac_ext=c
|
||||
ac_cpp='$CPP $CPPFLAGS'
|
||||
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||
|
||||
|
||||
if test "${have_usable_source_highlight}" = "yes"; then
|
||||
|
||||
$as_echo "#define HAVE_SOURCE_HIGHLIGHT 1" >>confdefs.h
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
SRCHIGH_CFLAGS="$srchigh_pkg_cflags"
|
||||
SRCHIGH_LIBS="$srchigh_pkg_libs"
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
if test "${enable_source_highlight}" = "yes"; then
|
||||
as_fn_error $? "source-highlight in your system could not be used" "$LINENO" 5
|
||||
fi
|
||||
fi
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
|
@ -1248,11 +1248,48 @@ either use --disable-source-highlight or dnl
|
||||
;;
|
||||
esac
|
||||
|
||||
SRCHIGH_CFLAGS=`${pkg_config_prog_path} --cflags source-highlight`
|
||||
SRCHIGH_LIBS=`${pkg_config_prog_path} --libs source-highlight`
|
||||
AC_DEFINE([HAVE_SOURCE_HIGHLIGHT], 1,
|
||||
[Define to 1 if the source-highlight library is available])
|
||||
AC_MSG_RESULT([yes])
|
||||
srchigh_pkg_cflags=`${pkg_config_prog_path} --cflags source-highlight`
|
||||
srchigh_pkg_libs=`${pkg_config_prog_path} --libs source-highlight`
|
||||
|
||||
# Now that we have found a source-highlight library, check if we can use
|
||||
# it. In particular, we're trying to detect the situation that the
|
||||
# library is using the new libstdc++ library abi ( see
|
||||
# https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html )
|
||||
# while the compiler being used to compile gdb is using the old abi.
|
||||
# Such a situation will result in an undefined reference to
|
||||
# srchilite::SourceHighlight::SourceHighlight(std::string const&).
|
||||
# This situation can occur for instance when using a source highlight
|
||||
# library compiled with g++ 7.5.0 while building gdb with g++ 4.8.5.
|
||||
AC_LANG_PUSH(C++)
|
||||
save_CFLAGS=$CFLAGS
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
CFLAGS="$CFLAGS $srchigh_pkg_cflags"
|
||||
LDFLAGS="$LDFLAGS $srchigh_pkg_libs"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#include <srchilite/sourcehighlight.h>],
|
||||
[std::string outlang = "esc.outlang";
|
||||
new srchilite::SourceHighlight (outlang);]
|
||||
)],
|
||||
[have_usable_source_highlight=yes],
|
||||
[have_usable_source_highlight=no]
|
||||
)
|
||||
CFLAGS="$SAVE_CFLAGS"
|
||||
LDFLAGS="$SAVE_LDFLAGS"
|
||||
AC_LANG_POP(C++)
|
||||
|
||||
if test "${have_usable_source_highlight}" = "yes"; then
|
||||
AC_DEFINE([HAVE_SOURCE_HIGHLIGHT], 1,
|
||||
[Define to 1 if the source-highlight library is available])
|
||||
AC_MSG_RESULT([yes])
|
||||
SRCHIGH_CFLAGS="$srchigh_pkg_cflags"
|
||||
SRCHIGH_LIBS="$srchigh_pkg_libs"
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
if test "${enable_source_highlight}" = "yes"; then
|
||||
AC_MSG_ERROR([source-highlight in your system could not be used])
|
||||
fi
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
if test "${enable_source_highlight}" = "yes"; then
|
||||
|
Loading…
Reference in New Issue
Block a user