diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java | 13 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java | 18 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index b8c0727bee..4df20e40ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -608,6 +608,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { cppConfiguration.isLipoContextCollector(), cppConfiguration.processHeadersInDependencies(), CppHelper.usePic(ruleContext, false)); + NestedSet<Artifact> artifactsToForce = collectHiddenTopLevelArtifacts(ruleContext); builder .setFilesToBuild(filesToBuild) .add(CppCompilationContext.class, cppCompilationContext) @@ -630,11 +631,23 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { .addOutputGroup( OutputGroupProvider.TEMP_FILES, getTemps(cppConfiguration, ccCompilationOutputs)) .addOutputGroup(OutputGroupProvider.FILES_TO_COMPILE, filesToCompile) + .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, artifactsToForce) .addOutputGroup( OutputGroupProvider.COMPILATION_PREREQUISITES, CcCommon.collectCompilationPrerequisites(ruleContext, cppCompilationContext)); } + private static NestedSet<Artifact> collectHiddenTopLevelArtifacts(RuleContext ruleContext) { + // Ensure that we build all the dependencies, otherwise users may get confused. + NestedSetBuilder<Artifact> artifactsToForceBuilder = NestedSetBuilder.stableOrder(); + for (OutputGroupProvider dep : + ruleContext.getPrerequisites("deps", Mode.TARGET, OutputGroupProvider.class)) { + artifactsToForceBuilder.addTransitive( + dep.getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL)); + } + return artifactsToForceBuilder.build(); + } + private static NestedSet<Artifact> collectExecutionDynamicLibraryArtifacts( RuleContext ruleContext, List<LibraryToLink> executionDynamicLibraries) { diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index 5b6f44362c..fdab980be9 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java @@ -734,6 +734,24 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase { } @Test + public void testProcessHeadersInDependenciesOfBinaries() throws Exception { + AnalysisMock.get() + .ccSupport() + .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_PROCESSING_FEATURE_CONFIGURATION); + useConfiguration("--features=parse_headers", "--process_headers_in_dependencies"); + ConfiguredTarget x = + scratchConfiguredTarget( + "foo", + "x", + "cc_binary(name = 'x', deps = [':y'])", + "cc_library(name = 'y', hdrs = ['y.h'])"); + assertThat( + ActionsTestUtil.baseArtifactNames( + getOutputGroup(x, OutputGroupProvider.HIDDEN_TOP_LEVEL))) + .contains("y.h.processed"); + } + + @Test public void testDoNotProcessHeadersInDependencies() throws Exception { AnalysisMock.get() .ccSupport() |