diff options
author | Manuel Klimek <klimek@google.com> | 2016-02-04 12:34:47 +0000 |
---|---|---|
committer | David Chen <dzc@google.com> | 2016-02-04 18:14:54 +0000 |
commit | c5efa1ca6d6084b344f2ab49a5d9bbee1c809e43 (patch) | |
tree | 3bcc4604e9c3887db64c6fbbd8682f2b594ecd62 /src/main/java/com/google/devtools/build | |
parent | 177ec024dc21e78948cb9fe032df36c07a632d01 (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/google/devtools/build')
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, |