* Iain Sandoe <idsan...@googlemail.com> [2020-01-28 10:34:52 +0000]: > Hi Andrew, > > Andrew Burgess <andrew.burg...@embecosm.com> wrote: > > > * Jeff Law <l...@redhat.com> [2020-01-22 13:52:27 -0700]: > > > > > On Wed, 2020-01-22 at 15:39 +0000, Andrew Burgess wrote: > > > > The motivation behind this change is to make it easier for a user to > > > > link against static libraries on a target where dynamic libraries are > > > > the default library type (for example GNU/Linux). > > > > > > > > Further, my motivation is really for linking libraries into GDB, > > > > however, the binutils-gdb/config/ directory is a copy of gcc/config/ > > > > so changes for GDB need to be approved by the GCC project first. > > > > > > > > After making this change in the gcc/config/ directory I've run > > > > autoreconf on all of the configure scripts in the GCC tree and a > > > > couple have been updated, so I'll use one of these to describe what my > > > > change does. > > > > > > > > Consider libcpp, this library links against libiconv. Currently if > > > > the user builds on a system with both static and dynamic libiconv > > > > installed then autotools will pick up the dynamic libiconv by > > > > default. This is almost certainly the right thing to do. > > > > > > > > However, if the user wants to link against static libiconv then things > > > > are a little harder, they could remove the dynamic libiconv from their > > > > system, but this is probably a bad idea (other things might depend on > > > > that library), or the user can build their own version of libiconv, > > > > install it into a unique prefix, and then configure gcc using the > > > > --with-libiconv-prefix=DIR flag. This works fine, but is somewhat > > > > annoying, the static library available, I just can't get autotools to > > > > use it. > > > > > > > > My change then adds a new flag --with-libiconv-type=TYPE, where type > > > > is either auto, static, or shared. The default auto, ensures we keep > > > > the existing behaviour unchanged. > > > > > > > > If the user configures with --with-libiconv-type=static then the > > > > configure script will ignore any dynamic libiconv it finds, and will > > > > only look for a static libiconv, if no static libiconv is found then > > > > the configure will continue as though there is no libiconv at all > > > > available. > > > > > > > > Similarly a user can specify --with-libiconv-type=shared and force the > > > > use of shared libiconv, any static libiconv will be ignored. > > > > > > > > As I've implemented this change within the AC_LIB_LINKFLAGS_BODY macro > > > > then only libraries configured using the AC_LIB_LINKFLAGS or > > > > AC_LIB_HAVE_LINKFLAGS macros will gain the new configure flag. > > > > > > > > If this is accepted into GCC then there will be follow on patches for > > > > binutils and GDB to regenerate some configure scripts in those > > > > projects. > > > > > > > > For GCC only two configure scripts needed updated after this commit, > > > > libcpp and libstdc++-v3, both of which link against libiconv. > > This kinda surprises me, gcc/ also configures for iconv > > > > > config/ChangeLog: > > > > > > > > * lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Add new > > > > --with-libXXX-type=... option. Use this to guide the selection > > > > of > > > > either a shared library or a static library. > > > > > > > > libcpp/ChangeLog: > > > > > > > > * configure: Regnerate. > > > > > > > > libstdc++-v3/ChangeLog: > > > > > > > > * configure: Regnerate. > > > s/Regnerate/Regenerate/ > > > > > > This isn't strictly a regression bugfix. But given the nature of these > > > files I think we probably need to be a bit more lax and allow safe > > > changes so that downstream uses can move forward independent of the gcc > > > development and release schedule. > > > > > > So, OK. > > > > Thanks for the flexibility. Now pushed. > > this (r10-6269, > https://gcc.gnu.org/g:e7c26e04b2dd6266d62d5a5825ff7eb44d1cf14e) causes or > exposes a problem which breaks bootstrap on all Darwin platforms I tried. > > Bootstrap fails stage1 self-check with: > cc1: internal compiler error: in on_diagnostic, at input.c:2182
First, massive apologies for breaking this. I'm aware that Jeff bent the rules to allow me to commit this patch, so I feel terrible for breaking things as a result. > > * AFAICT, this is caused by self-test attempting to do something that libcpp > was not configured to support. > > * All viable Darwin platforms have libiconv installed (but Darwin’s /lib is > /usr/lib; this might well apply to other BSD derivatives too). > > * Before the patch, libcpp and gcc configury finds this and they agree on > the availability of ICONV (#define HAVE_ICONV 1). > > * After the patch libcpp no longer thinks iconv is available, but gcc > continues to find it - and that, I think, leads to it attempting tests for > which libcpp has not been configured. > This must be a bug, right? With no changes to the configure scripts both components should continue to find libiconv after this patch. Even with the failure to update gcc/configure correctly (see below) libcpp should continue to find the exact same libraries as before. I took another look through the patch and I did spot one issue, which I'm hoping is the cause of this problem, in lib-link.m4 I mostly managed to write using 'sh' syntax, but in one place I messed up and slipped back to (maybe?) bash syntax? So I wrote this: if x$lib_type = xauto || x$lib_type = xshared; then When I think I should have written: if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then In all of the other places that I changed I correctly used 'test' syntax, and I think they shouldn't make any difference to the conditions that I modified. Would you be able to test the patch below and let me know if it resolves the build issue you're seeing please? The patch doesn't have ChangeLogs or commit message yet, and this point I'd just like to see if this fixes the problem you're seeing. > * I can work around this by adding —with-iconv-prefix=/usr to the configure > line which forces both libcpp and gcc to find the library explicitly - but > that’s only a short-term solution. > > Can you clarify why there’s no need to match the configury changes in libcpp > / gcc / libstdc++ ? This is the same issue that Tobias pointed out, and was a result of me incorrectly trying to regenerate the configure files. I obviously approached this problem the wrong way - I manually ran autoreconf in all the directories containing a configure file, but this didn't appear to do the correct thing. I have had success with this approach in other autotools based projects, but clearly it doesn't work correctly here. As Tobias suggested, when I rebuilt with --enable-maintainer-mode (and with --enable-languages=all) I do see more files regenerated. The patch below includes regeneration of all the missing files, as well as updates for the 'test' syntax issue above. Let me know if this resolves the problems you're seeing and if it does I'll prepare it for submission. Thanks, Andrew --- diff --git a/config/lib-link.m4 b/config/lib-link.m4 index 662192e0a07..20e281fd323 100644 --- a/config/lib-link.m4 +++ b/config/lib-link.m4 @@ -492,7 +492,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY], dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) - if x$lib_type = xauto || x$lib_type = xshared; then + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" else diff --git a/gcc/configure b/gcc/configure index e2c8fc71772..4c2c5991c0e 100755 --- a/gcc/configure +++ b/gcc/configure @@ -974,6 +974,7 @@ with_zstd_include with_zstd_lib enable_rpath with_libiconv_prefix +with_libiconv_type enable_sjlj_exceptions with_gcc_major_version_only enable_secureplt @@ -1811,6 +1812,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libiconv-type=TYPE type of library to search for (auto/static/shared) --with-gcc-major-version-only use only GCC major number in filesystem paths --with-pic try to use only PIC/non-PIC objects [default=use @@ -10730,6 +10732,16 @@ if test "${with_libiconv_prefix+set}" = set; then : fi + +# Check whether --with-libiconv-type was given. +if test "${with_libiconv_type+set}" = set; then : + withval=$with_libiconv_type; with_libiconv_type=$withval +else + with_libiconv_type=auto +fi + + lib_type=`eval echo \$with_libiconv_type` + LIBICONV= LTLIBICONV= INCICONV= @@ -10767,13 +10779,13 @@ fi found_so= found_a= if test $use_additional = yes; then - if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" @@ -10797,13 +10809,13 @@ fi case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` - if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" @@ -11031,8 +11043,13 @@ fi done fi else - LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" - LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l:lib$name.$libext" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l:lib$name.$libext" + fi fi fi fi diff --git a/intl/configure b/intl/configure index 2f35993148e..870b29f7d3f 100755 --- a/intl/configure +++ b/intl/configure @@ -719,8 +719,10 @@ enable_nls with_gnu_ld enable_rpath with_libiconv_prefix +with_libiconv_type with_included_gettext with_libintl_prefix +with_libintl_type enable_maintainer_mode ' ac_precious_vars='build_alias @@ -1353,9 +1355,11 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libiconv-type=TYPE type of library to search for (auto/static/shared) --with-included-gettext use the GNU gettext library included here --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir + --with-libintl-type=TYPE type of library to search for (auto/static/shared) Some influential environment variables: CC C compiler command @@ -5195,6 +5199,16 @@ if test "${with_libiconv_prefix+set}" = set; then : fi + +# Check whether --with-libiconv-type was given. +if test "${with_libiconv_type+set}" = set; then : + withval=$with_libiconv_type; with_libiconv_type=$withval +else + with_libiconv_type=auto +fi + + lib_type=`eval echo \$with_libiconv_type` + LIBICONV= LTLIBICONV= INCICONV= @@ -5232,13 +5246,13 @@ fi found_so= found_a= if test $use_additional = yes; then - if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" @@ -5262,13 +5276,13 @@ fi case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` - if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" @@ -5496,8 +5510,13 @@ fi done fi else - LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" - LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l:lib$name.$libext" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l:lib$name.$libext" + fi fi fi fi @@ -6026,6 +6045,16 @@ if test "${with_libintl_prefix+set}" = set; then : fi + +# Check whether --with-libintl-type was given. +if test "${with_libintl_type+set}" = set; then : + withval=$with_libintl_type; with_libintl_type=$withval +else + with_libintl_type=auto +fi + + lib_type=`eval echo \$with_libintl_type` + LIBINTL= LTLIBINTL= INCINTL= @@ -6063,13 +6092,13 @@ fi found_so= found_a= if test $use_additional = yes; then - if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" @@ -6093,13 +6122,13 @@ fi case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` - if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext" && test x$lib_type != xstatic; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi - else + elif test x$lib_type != xshared; then if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" @@ -6327,8 +6356,13 @@ fi done fi else - LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" - LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l:lib$name.$libext" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l:lib$name.$libext" + fi fi fi fi diff --git a/libcpp/configure b/libcpp/configure index 7e53cade210..11da199083b 100755 --- a/libcpp/configure +++ b/libcpp/configure @@ -7066,7 +7066,7 @@ fi done fi else - if x$lib_type = xauto || x$lib_type = xshared; then + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" else diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 5e2892121f4..a39c33b055d 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -29506,7 +29506,7 @@ fi done fi else - if x$lib_type = xauto || x$lib_type = xshared; then + if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" else