[PATCH] [gdb/build] Check if libsource-highlight is usable

Tom de Vries tdevries@suse.de
Fri Nov 19 20:56:41 GMT 2021


On 11/19/21 4:56 PM, Andrew Burgess wrote:
> * Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> [2021-11-19 13:34:23 +0100]:
> 
>> 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.
> 
> I make no claims of being an autoconf expert, but this all looks
> reasonable to me.  I had just one tiny nit..
> 
>>
>> Tested on x86_64-linux.
>> ---
>>  gdb/configure    | 158 ++++++++++++++++++++++++++++++++---------------
>>  gdb/configure.ac |  47 ++++++++++++--
>>  2 files changed, 151 insertions(+), 54 deletions(-)
>>
>> diff --git a/gdb/configure b/gdb/configure
>> index 6e2dfb766c8..aaa622d9fcc 100755
>> --- a/gdb/configure
>> +++ b/gdb/configure
>> @@ -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 when f.i. using a source highlight library
> 
> what's "f.i." ? 

For instance.

>did you mean "e.g." ?

Well, I meant for instance.  That is, I know "e.g.", but I find it hard
to use because it doesn't directly map to an english language
expression, like "f.i.".  So I'd prefer to continue to use this, unless
it's hard to understand for people in general.  I'm
not-a-native-speaker, so feedback on that is welcome :)

Thanks,
- Tom

> 
> Otherwise, LGTM.
> 
> Thanks,
> Andrew
> 
>> +      # 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; }
>> diff --git a/gdb/configure.ac b/gdb/configure.ac
>> index d4cfb6a7624..e4fed3c575c 100644
>> --- a/gdb/configure.ac
>> +++ b/gdb/configure.ac
>> @@ -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 when f.i. 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
>>
>> base-commit: fd0ff19bf435b267caae6a1ae04e7b4a4ba64f5b
>> -- 
>> 2.26.2
>>
> 


More information about the Gdb-patches mailing list