From bc1e2b0052c910bc976ab06823289ca1cf8156e4 Mon Sep 17 00:00:00 2001 From: ajmichael Date: Wed, 7 Mar 2018 07:30:48 -0800 Subject: 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 --- .../build/lib/rules/cpp/CppCompileAction.java | 17 +++++++++--- .../lib/rules/cpp/CppCompileActionBuilder.java | 26 ++++++++++++------- .../devtools/build/lib/rules/cpp/CppHelper.java | 4 ++- .../lib/rules/cpp/CppIncludeExtractionContext.java | 3 ++- .../build/lib/rules/cpp/CppRuleClasses.java | 30 +++++++++++++++++++++- .../lib/rules/cpp/ExtractInclusionAction.java | 11 +++++--- .../build/lib/rules/cpp/FakeCppCompileAction.java | 8 +++--- .../build/lib/rules/cpp/IncludeScannable.java | 11 +++++--- .../build/lib/rules/cpp/IncludeScanner.java | 7 ++--- 9 files changed, 89 insertions(+), 28 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp') 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 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 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 environment = new LinkedHashMap<>(); private CppSemantics cppSemantics; private CcToolchainProvider ccToolchain; + @Nullable private final Artifact grepIncludes; private final ImmutableMap 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 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 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 lipoScannables, CppSemantics cppSemantics, CcToolchainProvider cppProvider, - ImmutableMap executionInfo) { + ImmutableMap executionInfo, + Artifact grepIncludes) { super( owner, allInputs, @@ -120,7 +121,8 @@ public class FakeCppCompileAction extends CppCompileAction { ImmutableMap.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 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. - * + * *

Must contain {@code getMainIncludeScannerSource()}. */ Collection getIncludeScannerSources(); @@ -106,4 +106,9 @@ public interface IncludeScannable { * should just map to null. */ Map 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. *

- * + * *

{@code mainSource} is the source file relative to which the {@code cmdlineIncludes} are * interpreted.

*/ void process(Artifact mainSource, Collection sources, Map legalOutputPaths, List includeDirs, List quoteIncludeDirs, List cmdlineIncludes, - Set includes, ActionExecutionContext actionExecutionContext) + Set 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 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()); -- cgit v1.2.3