aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java47
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java33
8 files changed, 112 insertions, 35 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 3afa030e1c..4e79ea0363 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
@@ -300,8 +300,17 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
RuleConfiguredTargetBuilder ruleBuilder = new RuleConfiguredTargetBuilder(ruleContext);
addTransitiveInfoProviders(
- ruleContext, cppConfiguration, common, ruleBuilder, filesToBuild, ccCompilationOutputs,
- cppCompilationContext, linkingOutputs, dwoArtifacts, transitiveLipoInfo, fake);
+ ruleContext,
+ cppConfiguration,
+ common,
+ ruleBuilder,
+ filesToBuild,
+ ccCompilationOutputs,
+ cppCompilationContext,
+ linkingOutputs,
+ dwoArtifacts,
+ transitiveLipoInfo,
+ fake);
Map<Artifact, IncludeScannable> scannableMap = new LinkedHashMap<>();
if (cppConfiguration.isLipoContextCollector()) {
@@ -586,23 +595,33 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
InstrumentedFilesProvider instrumentedFilesProvider = common.getInstrumentedFilesProvider(
instrumentedObjectFiles, !TargetUtils.isTestRule(ruleContext.getRule()) && !fake);
+ NestedSet<Artifact> filesToCompile = ccCompilationOutputs.getFilesToCompile(
+ cppConfiguration.isLipoContextCollector(), CppHelper.usePic(ruleContext, false));
builder
.setFilesToBuild(filesToBuild)
.add(CppCompilationContext.class, cppCompilationContext)
.add(TransitiveLipoInfoProvider.class, transitiveLipoInfo)
- .add(CcExecutionDynamicLibrariesProvider.class,
- new CcExecutionDynamicLibrariesProvider(collectExecutionDynamicLibraryArtifacts(
- ruleContext, linkingOutputs.getExecutionDynamicLibraries())))
- .add(CcNativeLibraryProvider.class, new CcNativeLibraryProvider(
- collectTransitiveCcNativeLibraries(ruleContext, linkingOutputs.getDynamicLibraries())))
+ .add(
+ CcExecutionDynamicLibrariesProvider.class,
+ new CcExecutionDynamicLibrariesProvider(
+ collectExecutionDynamicLibraryArtifacts(
+ ruleContext, linkingOutputs.getExecutionDynamicLibraries())))
+ .add(
+ CcNativeLibraryProvider.class,
+ new CcNativeLibraryProvider(
+ collectTransitiveCcNativeLibraries(
+ ruleContext, linkingOutputs.getDynamicLibraries())))
.add(InstrumentedFilesProvider.class, instrumentedFilesProvider)
- .add(CppDebugFileProvider.class, new CppDebugFileProvider(
- dwoArtifacts.getDwoArtifacts(), dwoArtifacts.getPicDwoArtifacts()))
- .addOutputGroup(OutputGroupProvider.TEMP_FILES,
- getTemps(cppConfiguration, ccCompilationOutputs))
- .addOutputGroup(OutputGroupProvider.FILES_TO_COMPILE,
- common.getFilesToCompile(ccCompilationOutputs))
- .addOutputGroup(OutputGroupProvider.COMPILATION_PREREQUISITES,
+ .add(
+ CppDebugFileProvider.class,
+ new CppDebugFileProvider(
+ dwoArtifacts.getDwoArtifacts(), dwoArtifacts.getPicDwoArtifacts()))
+ .addOutputGroup(
+ OutputGroupProvider.TEMP_FILES, getTemps(cppConfiguration, ccCompilationOutputs))
+ .addOutputGroup(
+ OutputGroupProvider.FILES_TO_COMPILE, filesToCompile)
+ .addOutputGroup(
+ OutputGroupProvider.COMPILATION_PREREQUISITES,
CcCommon.collectCompilationPrerequisites(ruleContext, cppCompilationContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 2ede292346..49715198c4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -27,7 +27,6 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.rules.apple.Platform;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
@@ -460,14 +459,6 @@ public final class CcCommon {
CppFileTypes.LINKER_SCRIPT);
}
- NestedSet<Artifact> getFilesToCompile(CcCompilationOutputs compilationOutputs) {
- if (cppConfiguration.isLipoContextCollector()) {
- return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
- }
- return NestedSetBuilder.wrap(Order.STABLE_ORDER,
- compilationOutputs.getObjectFiles(CppHelper.usePic(ruleContext, false)));
- }
-
InstrumentedFilesProvider getInstrumentedFilesProvider(Iterable<Artifact> files,
boolean withBaselineCoverage) {
return cppConfiguration.isLipoContextCollector()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
index 67162c20d7..aad62f05e7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
@@ -19,6 +19,7 @@ import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
import java.util.ArrayList;
import java.util.LinkedHashSet;
@@ -144,6 +145,20 @@ public class CcCompilationOutputs {
public List<IncludeScannable> getLipoScannables() {
return lipoScannables;
}
+
+ /**
+ * Returns the output files that are considered "copmiled" by this C++ compile action.
+ */
+ NestedSet<Artifact> getFilesToCompile(boolean isLipoContextCollector, boolean usePic) {
+ if (isLipoContextCollector) {
+ return NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER);
+ }
+ NestedSetBuilder<Artifact> files = NestedSetBuilder.stableOrder();
+ files.addAll(getObjectFiles(usePic));
+ files.addAll(getHeaderTokenFiles());
+ return files.build();
+ }
+
public static final class Builder {
private final Set<Artifact> objectFiles = new LinkedHashSet<>();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index 764b7f4441..411f9ac5e3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -231,7 +231,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
CcLinkingOutputs linkedLibraries = info.getCcLinkingOutputsExcludingPrecompiledLibraries();
NestedSet<Artifact> artifactsToForce =
- collectHiddenTopLevelArtifacts(ruleContext, common, info.getCcCompilationOutputs());
+ collectHiddenTopLevelArtifacts(ruleContext, info.getCcCompilationOutputs());
NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
filesBuilder.addAll(LinkerInputs.toLibraryArtifacts(linkedLibraries.getStaticLibraries()));
@@ -268,11 +268,15 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
}
- private static NestedSet<Artifact> collectHiddenTopLevelArtifacts(RuleContext ruleContext,
- CcCommon common, CcCompilationOutputs ccCompilationOutputs) {
+ private static NestedSet<Artifact> collectHiddenTopLevelArtifacts(
+ RuleContext ruleContext, CcCompilationOutputs ccCompilationOutputs) {
// Ensure that we build all the dependencies, otherwise users may get confused.
NestedSetBuilder<Artifact> artifactsToForceBuilder = NestedSetBuilder.stableOrder();
- artifactsToForceBuilder.addTransitive(common.getFilesToCompile(ccCompilationOutputs));
+ boolean isLipoCollector =
+ ruleContext.getFragment(CppConfiguration.class).isLipoContextCollector();
+ boolean usePic = CppHelper.usePic(ruleContext, false);
+ artifactsToForceBuilder.addTransitive(
+ ccCompilationOutputs.getFilesToCompile(isLipoCollector, usePic));
for (OutputGroupProvider dep :
ruleContext.getPrerequisites("deps", Mode.TARGET, OutputGroupProvider.class)) {
artifactsToForceBuilder.addTransitive(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index 6fd24c9659..f08baba335 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -744,7 +744,12 @@ public final class CcLibraryHelper {
Map<String, NestedSet<Artifact>> outputGroups = new TreeMap<>();
outputGroups.put(OutputGroupProvider.TEMP_FILES, getTemps(ccOutputs));
if (emitCompileProviders) {
- outputGroups.put(OutputGroupProvider.FILES_TO_COMPILE, getFilesToCompile(ccOutputs));
+ boolean isLipoCollector =
+ ruleContext.getFragment(CppConfiguration.class).isLipoContextCollector();
+ boolean usePic = CppHelper.usePic(ruleContext, false);
+ outputGroups.put(
+ OutputGroupProvider.FILES_TO_COMPILE,
+ ccOutputs.getFilesToCompile(isLipoCollector, usePic));
outputGroups.put(OutputGroupProvider.COMPILATION_PREREQUISITES,
CcCommon.collectCompilationPrerequisites(ruleContext, cppCompilationContext));
}
@@ -1003,11 +1008,4 @@ public final class CcLibraryHelper {
? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER)
: compilationOutputs.getTemps();
}
-
- private NestedSet<Artifact> getFilesToCompile(CcCompilationOutputs compilationOutputs) {
- return ruleContext.getFragment(CppConfiguration.class).isLipoContextCollector()
- ? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER)
- : NestedSetBuilder.<Artifact>wrap(Order.STABLE_ORDER,
- compilationOutputs.getObjectFiles(CppHelper.usePic(ruleContext, false)));
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 31aa2f0fee..71045e4fd0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -1526,6 +1526,13 @@ public class CppConfiguration extends BuildConfiguration.Fragment {
public boolean skipStaticOutputs() {
return cppOptions.skipStaticOutputs;
}
+
+ /**
+ * Returns whether we are processing headers in dependencies of built C++ targets.
+ */
+ public boolean processHeadersInDependencies() {
+ return cppOptions.processHeadersInDependencies;
+ }
/**
* Returns true if Fission is specified for this build and supported by the crosstool.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index a1015979e7..683e559a46 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -244,6 +244,16 @@ public class CppOptions extends FragmentOptions {
+ "network and disk I/O load (and thus, continuous build cycle times) by a lot. "
+ "NOTE: use of this flag REQUIRES --distinct_host_configuration.")
public boolean skipStaticOutputs;
+
+ @Option(
+ name = "process_headers_in_dependencies",
+ defaultValue = "false",
+ category = "semantics",
+ help =
+ "When building a target //a:a, process headers in all targets that //a:a depends "
+ + "on (if header processing is enabled for the toolchain)."
+ )
+ public boolean processHeadersInDependencies;
@Option(name = "copt",
allowMultiple = true,
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 a11b7d7c3e..34c2786123 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
@@ -679,6 +679,39 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase {
}
@Test
+ public void testProcessHeadersInDependencies() 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_library(name = 'x', deps = [':y'])",
+ "cc_library(name = 'y', hdrs = ['y.h'])");
+ assertThat(ActionsTestUtil.baseNamesOf(getOutputGroup(x, OutputGroupProvider.HIDDEN_TOP_LEVEL)))
+ .isEqualTo("y.h.processed");
+ }
+
+ @Test
+ public void testProcessHeadersInCompileOnlyMode() throws Exception {
+ AnalysisMock.get()
+ .ccSupport()
+ .setupCrosstool(mockToolsConfig, MockCcSupport.HEADER_PROCESSING_FEATURE_CONFIGURATION);
+ useConfiguration(
+ "--features=parse_headers", "--process_headers_in_dependencies");
+ ConfiguredTarget y =
+ scratchConfiguredTarget(
+ "foo",
+ "y",
+ "cc_library(name = 'x', deps = [':y'])",
+ "cc_library(name = 'y', hdrs = ['y.h'])");
+ assertThat(ActionsTestUtil.baseNamesOf(getOutputGroup(y, OutputGroupProvider.FILES_TO_COMPILE)))
+ .isEqualTo("y.h.processed");
+ }
+
+ @Test
public void testIncludePathOrder() throws Exception {
scratch.file("foo/BUILD",
"cc_library(",