Hi, all.

The patch below makes libtool remove -lstdc++ when -lestdc++ exists.
This is needed to fix another poppler linking issue, and likely some
other ports that get both -lstdc++ and -lestdc++ linked in (which is
bad by definition).

A side effect of this patch could/should be some stdc++ entries
in WANTLIB becoming extra ones. So, in theory, this _is_ a package
contents change. But PLIST_DB doesn't register checksums of files,
so this doesn't affect bulk builds themselves.

aja@ kindly put this in a bulk build, and there were no regressions.
So... okay?

To be honest, the patch won't help when either -lstdc++ or -lestdc++
is implied by the compiler. There are some crazy ideas, like:

  * Pass LIBTOOL_CXXLIB=estdc++ from ports framework when "estdc++"
    is found in any of WANTLIB* entries;

  * Patch ld(1) instead of libtool;

  * Ask David Blaine for a special magic;

and so on, discussion is open. :)

--
WBR,
  Vadim Zhukov


Index: LT/UList.pm
===================================================================
RCS file: /cvs/src/usr.bin/libtool/LT/UList.pm,v
retrieving revision 1.2
diff -u -p -r1.2 UList.pm
--- LT/UList.pm 20 Apr 2014 17:34:26 -0000      1.2
+++ LT/UList.pm 19 Dec 2016 08:34:15 -0000
@@ -63,6 +63,8 @@ sub TIEARRAY {
 # returned by tie() or tied() instead.
 sub exists { return exists $_[0]->[0]->{$_[1]}; }
 
+sub indexof { return exists($_[0]->[0]->{$_[1]}) ? ($_[0]->[0]->{$_[1]} - 1) : 
undef; }
+
 sub FETCHSIZE { return scalar(@{$_[0]}) - 1; }
 
 # not needed
@@ -144,8 +146,30 @@ sub SPLICE
                $length = $maxrm;
        }
 
-       # do not ever dream of adding items here
-       my @ret = splice(@$self, $offset, $length);
+       my $i = @$self;
+
+       # make sure no duplicates get added
+       @_ = grep { !exists $self->[0] or
+                   $self->[0]->{$_} >= $offset &&
+                   $self->[0]->{$_} < $offset + $length } @_;
+
+       for (@_) {
+               # set up index
+               $self->[0]->{$_} = $i++;
+       }
+
+       #
+       # Renumber (in advance) trailing items, in case something gets added
+       # and number of added and removed items differs.
+       #
+       my $delta = scalar(@_) - $length;
+       if (scalar(@_) and $delta) {
+               for $i ($offset + $length .. scalar(@$self)) {
+                       $self->[0]->{$self->[$i]} += $delta;
+               }
+       }
+
+       my @ret = splice(@$self, $offset, $length, @_);
 
        for (@ret) {
                delete $self->[0]->{$_};
Index: LT/Mode/Link.pm
===================================================================
RCS file: /cvs/src/usr.bin/libtool/LT/Mode/Link.pm,v
retrieving revision 1.33
diff -u -p -r1.33 Link.pm
--- LT/Mode/Link.pm     3 Nov 2016 10:23:01 -0000       1.33
+++ LT/Mode/Link.pm     19 Dec 2016 08:34:15 -0000
@@ -822,6 +822,20 @@ sub common1
        my $staticlibs = [];
        my $args = $parser->parse_linkargs2($gp, $orderedlibs, $staticlibs, 
$dirs,
            $libs);
+       my $tiedlibs = tied(@$orderedlibs);
+       my $ie = $tiedlibs->indexof("estdc++");
+       my $is = $tiedlibs->indexof("stdc++");
+       if (defined($ie) and defined($is)) {
+               tsay {"stripping stdc++ from orderedlibs due to having estdc++ 
already; ie=$ie, is=$is"};
+               # check what library comes later
+               if ($ie < $is) {
+                       splice(@$orderedlibs, $ie, 1);
+                       splice(@$orderedlibs, $is, 1, "estdc++");
+                       $ie = $is;
+               } else {
+                       splice(@$orderedlibs, $is, 1);
+               }
+       }
        tsay {"staticlibs = \n", join("\n", @$staticlibs)};
        tsay {"orderedlibs = @$orderedlibs"};
        return ($staticlibs, $orderedlibs, $args);

Reply via email to