diff options
author | 2017-05-23 10:46:26 +0200 | |
---|---|---|
committer | 2017-05-23 12:48:22 +0200 | |
commit | 69d2ea284602f0801fbffedd29239821e7915d3e (patch) | |
tree | f7bc8744efe393ca11ea43418195f2b5494de74a /src/main/java/com/google/devtools/build | |
parent | 71c82076f9d4ad84810050bc350e414b3297286a (diff) |
Don't de-duplicate linkopts from two different configured targets that have the same value.
RELNOTES: None.
PiperOrigin-RevId: 156837699
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java | 46 |
1 files changed, 39 insertions, 7 deletions
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<ImmutableList<String>> linkOpts; + + /** + * A list of link options contributed by a single configured target. + * + * <b>WARNING:</b> 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<String> linkOptions; + + private LinkOptions(Iterable<String> linkOptions) { + this.linkOptions = ImmutableList.copyOf(linkOptions); + } + + public ImmutableList<String> get() { + return linkOptions; + } + + public static LinkOptions of(Iterable<String> linkOptions) { + return new LinkOptions(linkOptions); + } + } + + private final NestedSet<LinkOptions> linkOpts; private final NestedSet<Linkstamp> linkstamps; private final NestedSet<LibraryToLink> libraries; private final ExtraLinkTimeLibraries extraLinkTimeLibraries; - private CcLinkParams(NestedSet<ImmutableList<String>> linkOpts, + private CcLinkParams(NestedSet<LinkOptions> linkOpts, NestedSet<Linkstamp> linkstamps, NestedSet<LibraryToLink> libraries, ExtraLinkTimeLibraries extraLinkTimeLibraries) { @@ -59,12 +85,18 @@ public final class CcLinkParams { /** * @return the linkopts */ - public NestedSet<ImmutableList<String>> getLinkopts() { + public NestedSet<LinkOptions> getLinkopts() { return linkOpts; } public ImmutableList<String> flattenedLinkopts() { - return ImmutableList.copyOf(Iterables.concat(linkOpts)); + return ImmutableList.copyOf(Iterables.concat(Iterables.transform(linkOpts, + new Function<LinkOptions, ImmutableList<String>>() { + @Override + public ImmutableList<String> apply(LinkOptions linkOptions) { + return linkOptions.get(); + } + }))); } /** @@ -115,7 +147,7 @@ public final class CcLinkParams { private ImmutableList.Builder<String> localLinkoptsBuilder = ImmutableList.builder(); - private final NestedSetBuilder<ImmutableList<String>> linkOptsBuilder = + private final NestedSetBuilder<LinkOptions> linkOptsBuilder = NestedSetBuilder.linkOrder(); private final NestedSetBuilder<Linkstamp> linkstampsBuilder = NestedSetBuilder.compileOrder(); @@ -145,7 +177,7 @@ public final class CcLinkParams { built = true; ImmutableList<String> 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.<ImmutableList<String>>emptySet(Order.LINK_ORDER), + NestedSetBuilder.<LinkOptions>emptySet(Order.LINK_ORDER), NestedSetBuilder.<Linkstamp>emptySet(Order.COMPILE_ORDER), NestedSetBuilder.<LibraryToLink>emptySet(Order.LINK_ORDER), null); |