aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar lberki <lberki@google.com>2018-07-10 06:12:27 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-10 06:14:11 -0700
commit9c883bf10568b818c7b5f8e80b19ba305e49206e (patch)
tree3ae4cc3ba9baf26ce543a5064600128e95a06d17 /src/main
parentd17467e3bf9ff0408d201b960af71939b55b873b (diff)
Only compile a single source file once for a given cc_* rule.
RELNOTES: None. PiperOrigin-RevId: 203934582
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java31
1 files changed, 18 insertions, 13 deletions
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<Artifact> additionalIncludeScanningRoots = new ArrayList<>();
private final List<PathFragment> additionalExportedHeaders = new ArrayList<>();
private final List<CppModuleMap> additionalCppModuleMaps = new ArrayList<>();
- private final Set<CppSource> compilationUnitSources = new LinkedHashSet<>();
+ private final LinkedHashMap<Artifact, CppSource> compilationUnitSources = new LinkedHashMap<>();
private final List<Artifact> objectFiles = new ArrayList<>();
private final List<Artifact> picObjectFiles = new ArrayList<>();
private ImmutableList<String> 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<CppSource> 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<Artifact, String> calculateOutputNameMapByType(
- Set<CppSource> sources, String prefixDir) {
+ Map<Artifact, CppSource> sources, String prefixDir) {
ImmutableMap.Builder<Artifact, String> builder = ImmutableMap.builder();
builder.putAll(
calculateOutputNameMap(
@@ -1248,13 +1251,15 @@ public final class CcCompilationHelper {
}
private NestedSet<Artifact> getSourceArtifactsByType(
- Set<CppSource> sources, CppSource.Type type) {
+ Map<Artifact, CppSource> sources, CppSource.Type type) {
NestedSetBuilder<Artifact> 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);