From 69d2ea284602f0801fbffedd29239821e7915d3e Mon Sep 17 00:00:00 2001 From: lberki Date: Tue, 23 May 2017 10:46:26 +0200 Subject: Don't de-duplicate linkopts from two different configured targets that have the same value. RELNOTES: None. PiperOrigin-RevId: 156837699 --- .../devtools/build/lib/rules/cpp/CcLinkParams.java | 46 ++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'src/main/java/com/google/devtools/build') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java index c96877af5d..9469a30bfe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; import com.google.devtools.build.lib.util.Preconditions; @@ -41,12 +42,37 @@ import java.util.Objects; * link order (preorder) and linkstamps are sorted. */ public final class CcLinkParams { - private final NestedSet> linkOpts; + + /** + * A list of link options contributed by a single configured target. + * + * WARNING: Do not implement {@code #equals()} in the obvious way. This class must be + * checked for equality by object identity because otherwise if two configured targets contribute + * the same link options, they will be de-duplicated, which is not the desirable behavior. + */ + @Immutable + public static final class LinkOptions { + private final ImmutableList linkOptions; + + private LinkOptions(Iterable linkOptions) { + this.linkOptions = ImmutableList.copyOf(linkOptions); + } + + public ImmutableList get() { + return linkOptions; + } + + public static LinkOptions of(Iterable linkOptions) { + return new LinkOptions(linkOptions); + } + } + + private final NestedSet linkOpts; private final NestedSet linkstamps; private final NestedSet libraries; private final ExtraLinkTimeLibraries extraLinkTimeLibraries; - private CcLinkParams(NestedSet> linkOpts, + private CcLinkParams(NestedSet linkOpts, NestedSet linkstamps, NestedSet libraries, ExtraLinkTimeLibraries extraLinkTimeLibraries) { @@ -59,12 +85,18 @@ public final class CcLinkParams { /** * @return the linkopts */ - public NestedSet> getLinkopts() { + public NestedSet getLinkopts() { return linkOpts; } public ImmutableList flattenedLinkopts() { - return ImmutableList.copyOf(Iterables.concat(linkOpts)); + return ImmutableList.copyOf(Iterables.concat(Iterables.transform(linkOpts, + new Function>() { + @Override + public ImmutableList apply(LinkOptions linkOptions) { + return linkOptions.get(); + } + }))); } /** @@ -115,7 +147,7 @@ public final class CcLinkParams { private ImmutableList.Builder localLinkoptsBuilder = ImmutableList.builder(); - private final NestedSetBuilder> linkOptsBuilder = + private final NestedSetBuilder linkOptsBuilder = NestedSetBuilder.linkOrder(); private final NestedSetBuilder linkstampsBuilder = NestedSetBuilder.compileOrder(); @@ -145,7 +177,7 @@ public final class CcLinkParams { built = true; ImmutableList localLinkopts = localLinkoptsBuilder.build(); if (!localLinkopts.isEmpty()) { - linkOptsBuilder.add(localLinkopts); + linkOptsBuilder.add(LinkOptions.of(localLinkopts)); } ExtraLinkTimeLibraries extraLinkTimeLibraries = null; if (extraLinkTimeLibrariesBuilder != null) { @@ -367,7 +399,7 @@ public final class CcLinkParams { * Empty CcLinkParams. */ public static final CcLinkParams EMPTY = new CcLinkParams( - NestedSetBuilder.>emptySet(Order.LINK_ORDER), + NestedSetBuilder.emptySet(Order.LINK_ORDER), NestedSetBuilder.emptySet(Order.COMPILE_ORDER), NestedSetBuilder.emptySet(Order.LINK_ORDER), null); -- cgit v1.2.3