diff options
author | 2018-03-07 07:30:48 -0800 | |
---|---|---|
committer | 2018-03-07 07:32:08 -0800 | |
commit | bc1e2b0052c910bc976ab06823289ca1cf8156e4 (patch) | |
tree | 51bb9470108ec776192450b0b0e499b50654f4d2 /src/main/java/com/google/devtools | |
parent | a4b4f8fb1c67a0d0489439a23e4b094816c2a71e (diff) |
Add a binary to CppCompileAction that is responsible for grepping header files for include statments. This binary is currently only used for an internal feature - but that feature may be supported externally eventually.
RELNOTES: None
PiperOrigin-RevId: 188173513
Diffstat (limited to 'src/main/java/com/google/devtools')
12 files changed, 95 insertions, 29 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java index 977c13caf7..aeb956ce19 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule; import com.google.devtools.build.lib.rules.cpp.CppBuildInfo; import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader; import com.google.devtools.build.lib.rules.cpp.CppOptions; +import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.CcIncludeScanningRule; import com.google.devtools.build.lib.rules.cpp.CpuTransformer; import com.google.devtools.build.lib.rules.platform.PlatformRules; @@ -67,6 +68,7 @@ public class CcRules implements RuleSet { builder.addRuleDefinition(new BazelCppRuleClasses.CcLibraryBaseRule()); builder.addRuleDefinition(new BazelCcLibraryRule()); builder.addRuleDefinition(new BazelCcImportRule()); + builder.addRuleDefinition(new CcIncludeScanningRule()); builder.addWorkspaceFileSuffix( "register_toolchains('@bazel_tools//tools/cpp:dummy_cc_toolchain')\n"); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java index 709336be16..9dc21c2f54 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java @@ -58,6 +58,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.cpp.CppRuleClasses; +import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.CcIncludeScanningRule; import com.google.devtools.build.lib.rules.cpp.TransitiveLipoInfoProvider; import com.google.devtools.build.lib.rules.cpp.transitions.LipoContextCollectorTransition; import com.google.devtools.build.lib.util.FileTypeSet; @@ -143,6 +144,7 @@ public class BazelCppRuleClasses { public Metadata getMetadata() { return RuleDefinition.Metadata.builder() .name("$cc_linking_rule") + .ancestors(CcIncludeScanningRule.class) .type(RuleClassType.ABSTRACT) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 955e48b733..1e7b65b4b6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -175,6 +175,7 @@ public class CppCompileAction extends AbstractAction */ private final NestedSet<Artifact> prunableInputs; + @Nullable private final Artifact grepIncludes; private final boolean shouldScanIncludes; private final boolean shouldPruneModules; private final boolean usePic; @@ -293,7 +294,8 @@ public class CppCompileAction extends AbstractAction ImmutableMap<String, String> environment, String actionName, CppSemantics cppSemantics, - CcToolchainProvider cppProvider) { + CcToolchainProvider cppProvider, + @Nullable Artifact grepIncludes) { this( owner, allInputs, @@ -343,7 +345,8 @@ public class CppCompileAction extends AbstractAction /*overwrittenVariables=*/ null, cppSemantics.needsDotdInputPruning(), cppSemantics.needsIncludeValidation(), - cppSemantics.getIncludeProcessing()); + cppSemantics.getIncludeProcessing(), + grepIncludes); Preconditions.checkArgument(!shouldPruneModules || shouldScanIncludes); } @@ -383,7 +386,8 @@ public class CppCompileAction extends AbstractAction CcToolchainFeatures.Variables overwrittenVariables, boolean needsDotdInputPruning, boolean needsIncludeValidation, - IncludeProcessing includeProcessing) { + IncludeProcessing includeProcessing, + @Nullable Artifact grepIncludes) { super(owner, inputs, outputs); this.localShellEnvironment = localShellEnvironment; this.outputFile = outputFile; @@ -416,6 +420,7 @@ public class CppCompileAction extends AbstractAction this.usedModules = usedModules; this.topLevelModules = topLevelModules; this.overwrittenVariables = overwrittenVariables; + this.grepIncludes = grepIncludes; } /** @@ -644,6 +649,12 @@ public class CppCompileAction extends AbstractAction return Collections.unmodifiableMap(legalOuts); } + @Override + @Nullable + public Artifact getGrepIncludes() { + return grepIncludes; + } + /** * Returns the path where gcc should put the discovered dependency * information. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java index 6264c8e2bd..013f3e6abb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java @@ -78,6 +78,7 @@ public class CppCompileActionBuilder { private Map<String, String> environment = new LinkedHashMap<>(); private CppSemantics cppSemantics; private CcToolchainProvider ccToolchain; + @Nullable private final Artifact grepIncludes; private final ImmutableMap<String, String> localShellEnvironment; private final boolean codeCoverageEnabled; @Nullable private String actionName; @@ -90,11 +91,7 @@ public class CppCompileActionBuilder { * rule. */ public CppCompileActionBuilder(RuleContext ruleContext, CcToolchainProvider ccToolchain) { - this( - ruleContext.getActionOwner(), - ruleContext.getConfiguration(), - getLipoScannableMap(ruleContext, ccToolchain), - ccToolchain); + this(ruleContext, ccToolchain, ruleContext.getConfiguration()); } /** Creates a builder from a rule and configuration. */ @@ -106,7 +103,10 @@ public class CppCompileActionBuilder { ruleContext.getActionOwner(), configuration, getLipoScannableMap(ruleContext, ccToolchain), - ccToolchain); + ccToolchain, + ruleContext.attributes().has("$grep_includes") + ? ruleContext.getPrerequisiteArtifact("$grep_includes", Mode.HOST) + : null); } /** Creates a builder from a rule and configuration. */ @@ -114,7 +114,8 @@ public class CppCompileActionBuilder { ActionOwner actionOwner, BuildConfiguration configuration, Map<Artifact, IncludeScannable> lipoScannableMap, - CcToolchainProvider ccToolchain) { + CcToolchainProvider ccToolchain, + @Nullable Artifact grepIncludes) { this.owner = actionOwner; this.configuration = configuration; this.cppConfiguration = configuration.getFragment(CppConfiguration.class); @@ -125,6 +126,7 @@ public class CppCompileActionBuilder { this.localShellEnvironment = configuration.getLocalShellEnvironment(); this.codeCoverageEnabled = configuration.isCodeCoverageEnabled(); this.ccToolchain = ccToolchain; + this.grepIncludes = grepIncludes; } /** @@ -164,6 +166,7 @@ public class CppCompileActionBuilder { this.cppSemantics = other.cppSemantics; this.ccToolchain = other.ccToolchain; this.actionName = other.actionName; + this.grepIncludes = other.grepIncludes; } private static ImmutableMap<Artifact, IncludeScannable> getLipoScannableMap( @@ -384,7 +387,8 @@ public class CppCompileActionBuilder { getLipoScannables(realMandatoryInputs), cppSemantics, ccToolchain, - ImmutableMap.copyOf(executionInfo)); + ImmutableMap.copyOf(executionInfo), + grepIncludes); } else { action = new CppCompileAction( @@ -419,7 +423,8 @@ public class CppCompileActionBuilder { ImmutableMap.copyOf(environment), getActionName(), cppSemantics, - ccToolchain); + ccToolchain, + grepIncludes); } if (cppSemantics.needsIncludeValidation()) { @@ -450,6 +455,9 @@ public class CppCompileActionBuilder { } realMandatoryInputsBuilder.addTransitive(ccCompilationInfo.getAdditionalInputs()); realMandatoryInputsBuilder.add(Preconditions.checkNotNull(sourceFile)); + if (grepIncludes != null) { + realMandatoryInputsBuilder.add(grepIncludes); + } return realMandatoryInputsBuilder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 0ca8887dd7..f3e22be1b8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -630,8 +630,10 @@ public class CppHelper { && !prerequisite.isSourceArtifact() && CPP_FILETYPES.matches(prerequisite.getFilename())) { Artifact scanned = getIncludesOutput(ruleContext, prerequisite); + Artifact grepIncludes = ruleContext.getPrerequisiteArtifact("$grep_includes", Mode.HOST); ruleContext.registerAction( - new ExtractInclusionAction(ruleContext.getActionOwner(), prerequisite, scanned)); + new ExtractInclusionAction( + ruleContext.getActionOwner(), prerequisite, scanned, grepIncludes)); return scanned; } return null; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppIncludeExtractionContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppIncludeExtractionContext.java index 8b4b638e53..400fdb99a3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppIncludeExtractionContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppIncludeExtractionContext.java @@ -37,7 +37,8 @@ public interface CppIncludeExtractionContext extends ActionContext { ActionExecutionContext actionExecutionContext, Action resourceOwner, Artifact primaryInput, - Artifact primaryOutput) + Artifact primaryOutput, + Artifact grepIncludes) throws IOException, ExecException, InterruptedException; /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java index 62454204fa..0aacc00a01 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.rules.cpp; +import static com.google.devtools.build.lib.packages.Attribute.attr; +import static com.google.devtools.build.lib.packages.BuildType.LABEL; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ALWAYS_LINK_LIBRARY; import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.ALWAYS_LINK_PIC_LIBRARY; @@ -31,11 +33,16 @@ import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.SHARED_LIBRAR import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.VERSIONED_SHARED_LIBRARY; import com.google.devtools.build.lib.analysis.LanguageDependentFragment.LibraryLanguage; +import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.analysis.config.HostTransition; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; +import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.rules.cpp.transitions.EnableLipoTransition; import com.google.devtools.build.lib.util.FileTypeSet; @@ -178,7 +185,7 @@ public class CppRuleClasses { /** A string constant for the header_modules_compile feature. */ public static final String HEADER_MODULE_COMPILE = "header_module_compile"; - + /** A string constant for the header_module_codegen feature. */ public static final String HEADER_MODULE_CODEGEN = "header_module_codegen"; @@ -364,4 +371,25 @@ public class CppRuleClasses { /** A string constant for the match-clif action. */ public static final String MATCH_CLIF = "match_clif"; + + /** Ancestor for all rules that do include scanning. */ + public static final class CcIncludeScanningRule implements RuleDefinition { + @Override + public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { + return builder + .add( + attr("$grep_includes", LABEL) + .cfg(HostTransition.INSTANCE) + .value(env.getToolsLabel("//tools/cpp:grep-includes"))) + .build(); + } + + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("$cc_include_scanning_rule") + .type(RuleClassType.ABSTRACT) + .build(); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java index 211ae9ca4d..f03d4ee9c1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java @@ -45,10 +45,13 @@ final class ExtractInclusionAction extends AbstractAction { private static final String GUID = "45b43e5a-4734-43bb-a05e-012313808142"; + private final Artifact grepIncludes; + /** Constructs a new action. */ public ExtractInclusionAction( - ActionOwner owner, Artifact primaryInput, Artifact primaryOutput) { - super(owner, ImmutableList.of(primaryInput), ImmutableList.of(primaryOutput)); + ActionOwner owner, Artifact primaryInput, Artifact primaryOutput, Artifact grepIncludes) { + super(owner, ImmutableList.of(primaryInput, grepIncludes), ImmutableList.of(primaryOutput)); + this.grepIncludes = grepIncludes; } @Override @@ -72,8 +75,8 @@ final class ExtractInclusionAction extends AbstractAction { CppIncludeExtractionContext context = actionExecutionContext.getContext(CppIncludeExtractionContext.class); try { - context.extractIncludes(actionExecutionContext, this, getPrimaryInput(), - getPrimaryOutput()); + context.extractIncludes( + actionExecutionContext, this, getPrimaryInput(), getPrimaryOutput(), grepIncludes); } catch (IOException e) { throw new ActionExecutionException(e, this, false); } catch (ExecException e) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java index 93e6bfa02e..25b22678ea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java @@ -80,7 +80,8 @@ public class FakeCppCompileAction extends CppCompileAction { Iterable<IncludeScannable> lipoScannables, CppSemantics cppSemantics, CcToolchainProvider cppProvider, - ImmutableMap<String, String> executionInfo) { + ImmutableMap<String, String> executionInfo, + Artifact grepIncludes) { super( owner, allInputs, @@ -120,7 +121,8 @@ public class FakeCppCompileAction extends CppCompileAction { ImmutableMap.<String, String>of(), CppCompileAction.CPP_COMPILE, cppSemantics, - cppProvider); + cppProvider, + grepIncludes); this.tempOutputFile = Preconditions.checkNotNull(tempOutputFile); } @@ -172,7 +174,7 @@ public class FakeCppCompileAction extends CppCompileAction { .build() .discoverInputsFromDependencies(execRoot, scanningContext.getArtifactResolver()); } - + reply = null; // Clear in-memory .d files early. // Even cc_fake_binary rules need to properly declare their dependencies... diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java index 4c97495126..f5bf7e907f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java @@ -74,14 +74,14 @@ public interface IncludeScannable { List<Artifact> getBuiltInIncludeFiles(); /** - * Returns the artifact relative to which the {@code getCmdlineIncludes()} should be interpreted. + * Returns the artifact relative to which the {@code getCmdlineIncludes()} should be interpreted. */ Artifact getMainIncludeScannerSource(); - + /** * Returns an immutable list of sources that the IncludeScanner should scan * for this action. - * + * * <p>Must contain {@code getMainIncludeScannerSource()}. */ Collection<Artifact> getIncludeScannerSources(); @@ -106,4 +106,9 @@ public interface IncludeScannable { * should just map to null. */ Map<Artifact, Artifact> getLegalGeneratedScannerFileMap(); + + /** + * Returns an artifact that is the executable for {@link ExtractInclusionAction}. + */ + Artifact getGrepIncludes(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java index ffde90d9b1..1335470856 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java @@ -60,14 +60,14 @@ public interface IncludeScanner { * transitively for compiled header modules as include scanning entry points, and we need to * add the entry points to the inputs here.</li></ol> * </p> - * + * * <p>{@code mainSource} is the source file relative to which the {@code cmdlineIncludes} are * interpreted.</p> */ void process(Artifact mainSource, Collection<Artifact> sources, Map<Artifact, Artifact> legalOutputPaths, List<PathFragment> includeDirs, List<PathFragment> quoteIncludeDirs, List<String> cmdlineIncludes, - Set<Artifact> includes, ActionExecutionContext actionExecutionContext) + Set<Artifact> includes, ActionExecutionContext actionExecutionContext, Artifact grepIncludes) throws IOException, ExecException, InterruptedException; /** Supplies IncludeScanners upon request. */ @@ -142,7 +142,8 @@ public interface IncludeScanner { Artifact mainSource = scannable.getMainIncludeScannerSource(); Collection<Artifact> sources = scannable.getIncludeScannerSources(); scanner.process(mainSource, sources, legalOutputPaths, quoteIncludeDirs, - includeDirList, cmdlineIncludes, includes, actionExecutionContext); + includeDirList, cmdlineIncludes, includes, actionExecutionContext, + action.getGrepIncludes()); } } catch (IOException e) { throw new EnvironmentalExecException(e.getMessage()); diff --git a/src/main/java/com/google/devtools/build/lib/standalone/DummyIncludeScanningContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/DummyIncludeScanningContextProvider.java index 2c92f75c9e..33a076a0a6 100644 --- a/src/main/java/com/google/devtools/build/lib/standalone/DummyIncludeScanningContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/standalone/DummyIncludeScanningContextProvider.java @@ -48,7 +48,8 @@ public class DummyIncludeScanningContextProvider extends ActionContextProvider { ActionExecutionContext actionExecutionContext, Action resourceOwner, Artifact primaryInput, - Artifact primaryOutput) + Artifact primaryOutput, + Artifact grepIncludes) throws IOException { FileSystemUtils.writeContent(primaryOutput.getPath(), new byte[]{}); } |