diff options
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.java | 47 |
1 files changed, 39 insertions, 8 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 cec53199e4..931db5361a 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 @@ -209,7 +209,7 @@ public final class CcCompilationHelper { private CoptsFilter coptsFilter = CoptsFilter.alwaysPasses(); private final Set<String> defines = new LinkedHashSet<>(); private final List<TransitiveInfoCollection> deps = new ArrayList<>(); - private final List<CcCompilationContext> ccCompilationContexts = new ArrayList<>(); + private final List<CcCompilationInfo> ccCompilationInfos = new ArrayList<>(); private final List<PathFragment> looseIncludeDirs = new ArrayList<>(); private final List<PathFragment> systemIncludeDirs = new ArrayList<>(); private final List<PathFragment> includeDirs = new ArrayList<>(); @@ -573,10 +573,9 @@ public final class CcCompilationHelper { return this; } - /** For adding CC compilation contexts that affect compilation, e.g: from dependencies. */ - public CcCompilationHelper addCcCompilationContexts( - List<CcCompilationContext> ccCompilationContexts) { - this.ccCompilationContexts.addAll(Preconditions.checkNotNull(ccCompilationContexts)); + /** For adding CC compilation infos that affect compilation, e.g: from dependencies. */ + public CcCompilationHelper addCcCompilationInfos(Iterable<CcCompilationInfo> ccCompilationInfos) { + Iterables.addAll(this.ccCompilationInfos, Preconditions.checkNotNull(ccCompilationInfos)); return this; } @@ -958,9 +957,13 @@ public final class CcCompilationHelper { if (useDeps) { ccCompilationContextBuilder.mergeDependentCcCompilationContexts( CcCompilationInfo.getCcCompilationContexts(deps)); - ccCompilationContextBuilder.mergeDependentCcCompilationContexts(ccCompilationContexts); + ccCompilationContextBuilder.mergeDependentCcCompilationContexts( + ccCompilationInfos + .stream() + .map(CcCompilationInfo::getCcCompilationContext) + .collect(ImmutableList.toImmutableList())); } - CppHelper.mergeToolchainDependentCcCompilationContext( + mergeToolchainDependentCcCompilationContext( ruleContext, ccToolchain, ccCompilationContextBuilder); // But defines come after those inherited from deps. @@ -1138,7 +1141,7 @@ public final class CcCompilationHelper { } if (ccToolchain != null) { - result.add(ccToolchain.getCcCompilationContext().getCppModuleMap()); + result.add(ccToolchain.getCcCompilationInfo().getCcCompilationContext().getCppModuleMap()); } for (CppModuleMap additionalCppModuleMap : additionalCppModuleMaps) { result.add(additionalCppModuleMap); @@ -2122,4 +2125,32 @@ public final class CcCompilationHelper { return ImmutableList.of(dAction.getOutputFile(), sdAction.getOutputFile()); } + + /** + * Merges the STL and toolchain contexts into context builder. The STL is automatically determined + * using the ":stl" attribute. + */ + private static void mergeToolchainDependentCcCompilationContext( + RuleContext ruleContext, + CcToolchainProvider toolchain, + CcCompilationContext.Builder ccCompilationContextBuilder) { + if (ruleContext.getRule().getAttributeDefinition(":stl") != null) { + TransitiveInfoCollection stl = ruleContext.getPrerequisite(":stl", Mode.TARGET); + if (stl != null) { + CcCompilationInfo ccCompilationInfo = stl.get(CcCompilationInfo.PROVIDER); + CcCompilationContext ccCompilationContext = + ccCompilationInfo != null ? ccCompilationInfo.getCcCompilationContext() : null; + if (ccCompilationContext == null) { + ruleContext.ruleError( + "Unable to merge the STL '" + stl.getLabel() + "' and toolchain contexts"); + return; + } + ccCompilationContextBuilder.mergeDependentCcCompilationContext(ccCompilationContext); + } + } + if (toolchain != null) { + ccCompilationContextBuilder.mergeDependentCcCompilationContext( + toolchain.getCcCompilationContext()); + } + } } |