On 13/11/20 11:07 +0000, Jonathan Wakely wrote:
Currently this is shown when building libstdc++ on Solaris:

-lrt: open: No such file or directory

The error comes from the make_sunver.pl script which tries to open each
of its arguments. The arguments are passed by this make rule:

        perl ${glibcxx_srcdir}/scripts/make_exports.pl \
          libstdc++-symbols.ver \
          $(libstdc___la_OBJECTS:%.lo=.libs/%.o) \
         `echo $(libstdc___la_LIBADD) | \
            sed 's,/\([^/.]*\)\.la,/.libs/\1.a,g'` \
         > $@ || (rm -f $@ ; exit 1)

The $(libstdc___la_LIBADD) variable includes $(GLIBCXX_LIBS) which
contains -lrt on Solaris.

This patch adds another sed script to filter -l arguments from the echo
command. In order to reliably match ' -l[^ ]* ' the echo arguments are
quoted and a space added before and after them. This might be overkill
just to remove -lrt from the start of the string, but should be robust
in case other -l arguments are added to $(GLIBCXX_LIBS), or in case the
$(libstdc___la_LIBADD) libraries are reordered.

libstdc++-v3/ChangeLog:

        * src/Makefile.am (libstdc++-symbols.ver-sun): Remove -lrt from
        arguments passed to make_sunver.pl script.
        * src/Makefile.in: Regenerate.

Tested sparc-solaris2.11. Rainer, does this look OK?

Iain, the libstdc++-symbols.explist target for Darwin is very similar,
but I don't know if it's a problem there. Does GLIBCXX_LIBS contain
anything in $target/libstdc++-v3/src/Makefile on Darwin?

Should we make the same change just in case?

On examining acinclude.m4 it looks like GLIBCXX_LIBS could in theory
be non-empty for any target, including Darwin:

  elif test x"$enable_libstdcxx_time" != x"no"; then

    if test x"$enable_libstdcxx_time" = x"rt"; then
      AC_SEARCH_LIBS(clock_gettime, [rt posix4])
      AC_SEARCH_LIBS(nanosleep, [rt posix4])
    else
      AC_SEARCH_LIBS(clock_gettime, [posix4])
      AC_SEARCH_LIBS(nanosleep, [posix4])
    fi

    case "$ac_cv_search_clock_gettime" in
      -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
      ;;
    esac
    case "$ac_cv_search_nanosleep" in
      -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
      ;;
    esac

    AC_SEARCH_LIBS(sched_yield, [rt posix4])

    case "$ac_cv_search_sched_yield" in
      -lposix4*)
      GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
      ac_has_sched_yield=yes
      ;;
      -lrt*)
      if test x"$enable_libstdcxx_time" = x"rt"; then
        GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
        ac_has_sched_yield=yes
      fi
      ;;
      *)
      ac_has_sched_yield=yes
      ;;
    esac

But in practice the snippet above is only used if you explicitly
configure with --enable-libstdcxx-time={yes,rt} and will only add
anything to GLIBCXX_LIBS if clock_gettime or nanosleep lives in one of
librt or libposix4. I think libposix4 is Solaris-specific, and I don't
think Darwin has librt. So in practice I don't think there's a
problem on Darwin today.



Reply via email to