Jonathan Wakely <jwak...@redhat.com> wrote:

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.

Agreed, neither of those libs is currently in use on Darwin.

There have, in some cases, been library entries that are simply a symlink to
the one providing the equivalent functionality, to minimize cross-platform build
hassles - but I see no entry for librt.dylib or posix4.

thanks
Iain


Reply via email to