From 9c883bf10568b818c7b5f8e80b19ba305e49206e Mon Sep 17 00:00:00 2001 From: lberki Date: Tue, 10 Jul 2018 06:12:27 -0700 Subject: Only compile a single source file once for a given cc_* rule. RELNOTES: None. PiperOrigin-RevId: 203934582 --- .../build/lib/rules/cpp/CcCompilationHelper.java | 31 +++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'src/main') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index 08ae86068f..384d98959f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -201,7 +201,7 @@ public final class CcCompilationHelper { private final List additionalIncludeScanningRoots = new ArrayList<>(); private final List additionalExportedHeaders = new ArrayList<>(); private final List additionalCppModuleMaps = new ArrayList<>(); - private final Set compilationUnitSources = new LinkedHashSet<>(); + private final LinkedHashMap compilationUnitSources = new LinkedHashMap<>(); private final List objectFiles = new ArrayList<>(); private final List picObjectFiles = new ArrayList<>(); private ImmutableList copts = ImmutableList.of(); @@ -408,8 +408,10 @@ public final class CcCompilationHelper { Preconditions.checkState(isHeader || isTextualInclude); if (ccToolchain.shouldProcessHeaders(featureConfiguration) && !isTextualInclude) { - compilationUnitSources.add(CppSource.create(privateHeader, label, CppSource.Type.HEADER)); + compilationUnitSources.put( + privateHeader, CppSource.create(privateHeader, label, CppSource.Type.HEADER)); } + this.privateHeaders.add(privateHeader); return this; } @@ -464,7 +466,8 @@ public final class CcCompilationHelper { if (isTextualInclude || !isHeader || !ccToolchain.shouldProcessHeaders(featureConfiguration)) { return; } - compilationUnitSources.add(CppSource.create(header, label, CppSource.Type.HEADER)); + + compilationUnitSources.put(header, CppSource.create(header, label, CppSource.Type.HEADER)); } /** Adds a header to {@code publicHeaders}, but not to this target's module map. */ @@ -497,7 +500,7 @@ public final class CcCompilationHelper { } else { type = CppSource.Type.SOURCE; } - compilationUnitSources.add(CppSource.create(source, label, type)); + compilationUnitSources.put(source, CppSource.create(source, label, type)); } /** @@ -507,7 +510,7 @@ public final class CcCompilationHelper { * compilation. */ public ImmutableSet getCompilationUnitSources() { - return ImmutableSet.copyOf(this.compilationUnitSources); + return ImmutableSet.copyOf(this.compilationUnitSources.values()); } /** @@ -1232,7 +1235,7 @@ public final class CcCompilationHelper { * for all artifacts. */ private ImmutableMap calculateOutputNameMapByType( - Set sources, String prefixDir) { + Map sources, String prefixDir) { ImmutableMap.Builder builder = ImmutableMap.builder(); builder.putAll( calculateOutputNameMap( @@ -1248,13 +1251,15 @@ public final class CcCompilationHelper { } private NestedSet getSourceArtifactsByType( - Set sources, CppSource.Type type) { + Map sources, CppSource.Type type) { NestedSetBuilder result = NestedSetBuilder.stableOrder(); - result.addAll(sources - .stream() - .filter(source -> source.getType().equals(type)) - .map(CppSource::getSource) - .collect(Collectors.toList())); + result.addAll( + sources + .values() + .stream() + .filter(source -> source.getType().equals(type)) + .map(CppSource::getSource) + .collect(Collectors.toList())); return result.build(); } @@ -1299,7 +1304,7 @@ public final class CcCompilationHelper { outputNameMap = calculateOutputNameMapByType(compilationUnitSources, outputNamePrefixDir); } - for (CppSource source : compilationUnitSources) { + for (CppSource source : compilationUnitSources.values()) { Artifact sourceArtifact = source.getSource(); Label sourceLabel = source.getLabel(); CppCompileActionBuilder builder = initializeCompileAction(sourceArtifact); -- cgit v1.2.3