aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Manuel Klimek <klimek@google.com>2016-02-04 12:34:47 +0000
committerGravatar David Chen <dzc@google.com>2016-02-04 18:14:54 +0000
commitc5efa1ca6d6084b344f2ab49a5d9bbee1c809e43 (patch)
tree3bcc4604e9c3887db64c6fbbd8682f2b594ecd62 /src/main/java/com
parent177ec024dc21e78948cb9fe032df36c07a632d01 (diff)
Allow switching on header processing (parse_headers or preprocess_headers)
for targets in the transitive closure of a target that is built. Rollback of commit e01291a1a3d65cd706190c9bf0c8cfc585f38eb7. Added an additional test to check that the configuration value is actually effectively used. -- MOS_MIGRATED_REVID=113836105
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java49
-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.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java16
-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
7 files changed, 89 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 64cca1c653..7d25f9040a 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
@@ -308,8 +308,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()) {
@@ -594,23 +603,35 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
InstrumentedFilesProvider instrumentedFilesProvider = common.getInstrumentedFilesProvider(
instrumentedObjectFiles, !TargetUtils.isTestRule(ruleContext.getRule()) && !fake);
+ NestedSet<Artifact> filesToCompile =
+ ccCompilationOutputs.getFilesToCompile(
+ cppConfiguration.isLipoContextCollector(),
+ cppConfiguration.processHeadersInDependencies(),
+ 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 f17766cb18..ae66d2b770 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;
@@ -464,14 +463,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..b7f0300adb 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,23 @@ public class CcCompilationOutputs {
public List<IncludeScannable> getLipoScannables() {
return lipoScannables;
}
+
+ /**
+ * Returns the output files that are considered "compiled" by this C++ compile action.
+ */
+ NestedSet<Artifact> getFilesToCompile(
+ boolean isLipoContextCollector, boolean parseHeaders, boolean usePic) {
+ if (isLipoContextCollector) {
+ return NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER);
+ }
+ NestedSetBuilder<Artifact> files = NestedSetBuilder.stableOrder();
+ files.addAll(getObjectFiles(usePic));
+ if (parseHeaders) {
+ 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..700de93de5 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,18 @@ 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 processHeadersInDependencies =
+ ruleContext.getFragment(CppConfiguration.class).processHeadersInDependencies();
+ boolean usePic = CppHelper.usePic(ruleContext, false);
+ artifactsToForceBuilder.addTransitive(
+ ccCompilationOutputs.getFilesToCompile(
+ isLipoCollector, processHeadersInDependencies, 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..79d1c8d2dd 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,14 @@ 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 processHeadersInDependencies =
+ ruleContext.getFragment(CppConfiguration.class).processHeadersInDependencies();
+ boolean usePic = CppHelper.usePic(ruleContext, false);
+ outputGroups.put(
+ OutputGroupProvider.FILES_TO_COMPILE,
+ ccOutputs.getFilesToCompile(isLipoCollector, processHeadersInDependencies, usePic));
outputGroups.put(OutputGroupProvider.COMPILATION_PREREQUISITES,
CcCommon.collectCompilationPrerequisites(ruleContext, cppCompilationContext));
}
@@ -1003,11 +1010,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 bfc08276b3..2b9dca28ef 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
@@ -1530,6 +1530,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 6af0a7f662..12f230f2b9 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
@@ -251,6 +251,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,