From db0b36404771204ab7e6f776ba704e7af7aff463 Mon Sep 17 00:00:00 2001 From: pcloudy Date: Tue, 3 Apr 2018 12:46:32 -0700 Subject: 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 --- .../build/lib/rules/cpp/CcCompilationHelper.java | 40 ++++++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'src/main/java/com') 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 calculateOutputNameMap( - Iterable sourceArtifacts, String prefixDir) { + NestedSet sourceArtifacts, String prefixDir) { ImmutableMap.Builder builder = ImmutableMap.builder(); HashMap count = new LinkedHashMap<>(); @@ -1229,6 +1229,37 @@ public final class CcCompilationHelper { return builder.build(); } + /** + * Calculate outputNameMap for different source types separately. Returns a merged outputNameMap + * for all artifacts. + */ + private ImmutableMap calculateOutputNameMapByType( + Set sources, String prefixDir) { + ImmutableMap.Builder 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 getSourceArtifactsByType( + Set sources, CppSource.Type type) { + NestedSetBuilder 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 @@ -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) { -- cgit v1.2.3