From c0d4bb06d4227be27d5b4d4b04a4d5bb9ae3215d Mon Sep 17 00:00:00 2001 From: shahan Date: Sun, 12 Aug 2018 11:35:14 -0700 Subject: ActionAnalysisMetadata exposes whether loose headers are present. TransitiveVersionTable uses futures. PiperOrigin-RevId: 208402465 --- .../build/lib/actions/ActionAnalysisMetadata.java | 10 +++++++++ .../build/lib/rules/cpp/CcCompilationContext.java | 24 +++++++++++++++++++--- .../build/lib/rules/cpp/CcCompilationHelper.java | 1 + .../build/lib/rules/cpp/CppCompileAction.java | 11 ++++++++++ .../build/lib/skyframe/SkyframeExecutor.java | 2 +- .../build/skyframe/TransitiveVersionTable.java | 12 ++++++----- 6 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java index 1e13cbec96..d86224ba3f 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java @@ -179,4 +179,14 @@ public interface ActionAnalysisMetadata { return this != NORMAL; } } + + /** + * Whether this action has loose headers. + * + *

If this is true, top-down evaluation considers an action changed if any source files in + * package have changed. + */ + default boolean hasLooseHeaders() { + return false; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java index c69e6d93f9..0e0553949a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java @@ -75,6 +75,8 @@ public final class CcCompilationContext implements CcCompilationContextApi { // Derived from depsContexts. private final ImmutableSet compilationPrerequisites; + private final CppConfiguration.HeadersCheckingMode headersCheckingMode; + @AutoCodec.Instantiator @VisibleForSerialization CcCompilationContext( @@ -90,7 +92,8 @@ public final class CcCompilationContext implements CcCompilationContextApi { ImmutableList directModuleMaps, CppModuleMap cppModuleMap, @Nullable CppModuleMap verificationModuleMap, - boolean propagateModuleMapAsActionInput) { + boolean propagateModuleMapAsActionInput, + CppConfiguration.HeadersCheckingMode headersCheckingMode) { Preconditions.checkNotNull(commandLineCcCompilationContext); this.commandLineCcCompilationContext = commandLineCcCompilationContext; this.declaredIncludeDirs = declaredIncludeDirs; @@ -105,6 +108,7 @@ public final class CcCompilationContext implements CcCompilationContextApi { this.verificationModuleMap = verificationModuleMap; this.compilationPrerequisites = compilationPrerequisites; this.propagateModuleMapAsActionInput = propagateModuleMapAsActionInput; + this.headersCheckingMode = headersCheckingMode; } /** @@ -294,7 +298,8 @@ public final class CcCompilationContext implements CcCompilationContextApi { ccCompilationContext.directModuleMaps, ccCompilationContext.cppModuleMap, ccCompilationContext.verificationModuleMap, - ccCompilationContext.propagateModuleMapAsActionInput); + ccCompilationContext.propagateModuleMapAsActionInput, + ccCompilationContext.headersCheckingMode); } /** @return the C++ module map of the owner. */ @@ -307,6 +312,10 @@ public final class CcCompilationContext implements CcCompilationContextApi { return verificationModuleMap; } + public CppConfiguration.HeadersCheckingMode getHeadersCheckingMode() { + return headersCheckingMode; + } + /** * The parts of the {@code CcCompilationContext} that influence the command line of compilation * actions. @@ -354,6 +363,8 @@ public final class CcCompilationContext implements CcCompilationContextApi { private CppModuleMap cppModuleMap; private CppModuleMap verificationModuleMap; private boolean propagateModuleMapAsActionInput = true; + private CppConfiguration.HeadersCheckingMode headersCheckingMode = + CppConfiguration.HeadersCheckingMode.STRICT; /** The rule that owns the context */ private final RuleContext ruleContext; @@ -565,6 +576,12 @@ public final class CcCompilationContext implements CcCompilationContextApi { return this; } + public Builder setHeadersCheckingMode( + CppConfiguration.HeadersCheckingMode headersCheckingMode) { + this.headersCheckingMode = headersCheckingMode; + return this; + } + /** Builds the {@link CcCompilationContext}. */ public CcCompilationContext build() { return build( @@ -600,7 +617,8 @@ public final class CcCompilationContext implements CcCompilationContextApi { ImmutableList.copyOf(directModuleMaps), cppModuleMap, verificationModuleMap, - propagateModuleMapAsActionInput); + propagateModuleMapAsActionInput, + headersCheckingMode); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index ea5ee63f04..474ea556fc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -982,6 +982,7 @@ public final class CcCompilationHelper { for (PathFragment looseIncludeDir : looseIncludeDirs) { ccCompilationContextBuilder.addDeclaredIncludeDir(looseIncludeDir); } + ccCompilationContextBuilder.setHeadersCheckingMode(headersCheckingMode); } if (featureConfiguration.isEnabled(CppRuleClasses.MODULE_MAPS)) { 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 f4b9c688d2..8492e10be6 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 @@ -1271,6 +1271,17 @@ public class CppCompileAction extends AbstractAction return message.toString(); } + @Override + public boolean hasLooseHeaders() { + // Layering check is stricter than hdrs_check = strict, so when it's enabled, there can't be + // loose headers. + return ccCompilationContext + .getHeadersCheckingMode() + .equals(CppConfiguration.HeadersCheckingMode.LOOSE) + && !(featureConfiguration.isEnabled(CppRuleClasses.LAYERING_CHECK) + && featureConfiguration.isEnabled(CppRuleClasses.PARSE_HEADERS)); + } + public CompileCommandLine getCompileCommandLine() { return compileCommandLine; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index ce65b6d646..5e8f708444 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -691,7 +691,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { * single command, so callers should err on the side of calling it more frequently. Should be * idempotent, so that calls after the first one in the same evaluation should be quick. */ - public final void notifyCommandComplete() throws InterruptedException { + public void notifyCommandComplete() throws InterruptedException { memoizingEvaluator.noteEvaluationsAtSameVersionMayBeFinished(); } diff --git a/src/main/java/com/google/devtools/build/skyframe/TransitiveVersionTable.java b/src/main/java/com/google/devtools/build/skyframe/TransitiveVersionTable.java index 210cff45b8..9aa6083552 100644 --- a/src/main/java/com/google/devtools/build/skyframe/TransitiveVersionTable.java +++ b/src/main/java/com/google/devtools/build/skyframe/TransitiveVersionTable.java @@ -13,7 +13,8 @@ // limitations under the License. package com.google.devtools.build.skyframe; -import java.io.IOException; +import com.google.common.util.concurrent.ListenableFuture; +import java.util.function.Supplier; /** Readable view of transitive version information. */ public interface TransitiveVersionTable { @@ -22,9 +23,10 @@ public interface TransitiveVersionTable { /** Encapsulates transitive version information. */ interface VersionAggregator { - /** @return the maximum transitive source version or -1 if no sources were found */ - long getMaxTransitiveVersion( - long baselineVersion, InterruptibleIOLongSupplier deferredMaxDepVersion) - throws InterruptedException, IOException; + /** @return future with the maximum transitive source version or -1 if no sources were found */ + ListenableFuture getMaxTransitiveVersion( + SkyKey key, + InterruptibleSupplier valueSupplier, + Supplier> deferredMaxDepVersion); } } -- cgit v1.2.3