aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
diff options
context:
space:
mode:
authorGravatar pcloudy <pcloudy@google.com>2018-04-03 12:46:32 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-03 12:47:47 -0700
commitdb0b36404771204ab7e6f776ba704e7af7aff463 (patch)
tree0616a422140e18f34b9e77622cf1ad171c1c99c9 /src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
parent79a03bc632329474d9078fcd08edf024cd18199b (diff)
Calculate outputNames for different types of sources separately
For example: in cc_library( name = "lib", srcs = ["lib.h", "lib.cc"], ) lib.h and lib.cc have the same base name, but they should not be considered as conflict. RELNOTES: PiperOrigin-RevId: 191485223
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java40
1 files changed, 33 insertions, 7 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 a097a81790..ba662d8aff 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
@@ -1200,7 +1200,7 @@ public final class CcCompilationHelper {
* are ["0/foo", "bar", "1/foo", "2/foo"]
*/
private ImmutableMap<Artifact, String> calculateOutputNameMap(
- Iterable<Artifact> sourceArtifacts, String prefixDir) {
+ NestedSet<Artifact> sourceArtifacts, String prefixDir) {
ImmutableMap.Builder<Artifact, String> builder = ImmutableMap.builder();
HashMap<String, Integer> count = new LinkedHashMap<>();
@@ -1230,6 +1230,37 @@ public final class CcCompilationHelper {
}
/**
+ * Calculate outputNameMap for different source types separately. Returns a merged outputNameMap
+ * for all artifacts.
+ */
+ private ImmutableMap<Artifact, String> calculateOutputNameMapByType(
+ Set<CppSource> sources, String prefixDir) {
+ ImmutableMap.Builder<Artifact, String> builder = ImmutableMap.builder();
+ builder.putAll(
+ calculateOutputNameMap(
+ getSourceArtifactsByType(sources, CppSource.Type.SOURCE), prefixDir));
+ builder.putAll(
+ calculateOutputNameMap(
+ getSourceArtifactsByType(sources, CppSource.Type.HEADER), prefixDir));
+ // TODO(plf): Removing CLIF logic
+ builder.putAll(
+ calculateOutputNameMap(
+ getSourceArtifactsByType(sources, CppSource.Type.CLIF_INPUT_PROTO), prefixDir));
+ return builder.build();
+ }
+
+ private NestedSet<Artifact> getSourceArtifactsByType(
+ Set<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()));
+ return result.build();
+ }
+
+ /**
* Constructs the C++ compiler actions. It generally creates one action for every specified source
* file. It takes into account LIPO, fake-ness, coverage, and PIC, in addition to using the
* settings specified on the current object. This method should only be called once.
@@ -1267,12 +1298,7 @@ public final class CcCompilationHelper {
if (purpose != null) {
outputNamePrefixDir = purpose.endsWith("_non_objc_arc") ? "non_arc" : "arc";
}
- outputNameMap = calculateOutputNameMap(
- compilationUnitSources
- .stream()
- .map(source -> source.getSource())
- .collect(Collectors.toList()),
- outputNamePrefixDir);
+ outputNameMap = calculateOutputNameMapByType(compilationUnitSources, outputNamePrefixDir);
}
for (CppSource source : compilationUnitSources) {