diff options
author | 2015-05-13 18:42:51 +0000 | |
---|---|---|
committer | 2015-05-15 09:44:01 +0000 | |
commit | db4d8619023693c97e5afb467737084ccd30b311 (patch) | |
tree | 513e52cce65d50a2cb12f13d2f96c379e85761ec | |
parent | 767c372a6de2a4eb44a9c5cfe062885bcd1e7022 (diff) |
Add a SingleCycleReporter for analysis phase cycles, which can (only) occur due to configurations.
RELNOTES:
--
MOS_MIGRATED_REVID=93543318
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java | 61 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java | 3 |
2 files changed, 63 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java new file mode 100644 index 0000000000..f4a43aafba --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java @@ -0,0 +1,61 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.skyframe; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.pkgcache.LoadedPackageProvider; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.skyframe.CycleInfo; +import com.google.devtools.build.skyframe.SkyKey; + +/** + * Reports cycles between {@link ConfiguredTargetValue}s. Similar to + * {@link TransitiveTargetCycleReporter}, these indicate cycles between targets, but during the + * analysis phase. In the current target-parsing, loading, analysis, and execution phase + * distinction, such cycles can only occur due to the presence of a specific configuration (if + * such a cycle occurs regardless of the configuration, then it would have been caught during the + * target parsing or loading phase). + */ +class ConfiguredTargetCycleReporter extends AbstractLabelCycleReporter { + + private static final Predicate<SkyKey> IS_CONFIGURED_TARGET_SKY_KEY = + SkyFunctions.isSkyFunction(SkyFunctions.CONFIGURED_TARGET); + + ConfiguredTargetCycleReporter(LoadedPackageProvider loadedPackageProvider) { + super(loadedPackageProvider); + } + + @Override + protected boolean canReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo) { + return Iterables.all(Iterables.concat(ImmutableList.of(topLevelKey), + cycleInfo.getPathToCycle(), cycleInfo.getCycle()), IS_CONFIGURED_TARGET_SKY_KEY); + } + + @Override + protected String getAdditionalMessageAboutCycle(SkyKey topLevelKey, CycleInfo cycleInfo) { + return "\nThis cycle occurred because of a configuration option"; + } + + @Override + public String prettyPrint(SkyKey key) { + return ((ConfiguredTargetKey) key.argument()).prettyPrint(); + } + + @Override + public Label getLabel(SkyKey key) { + return ((ConfiguredTargetKey) key.argument()).getLabel(); + } +}
\ No newline at end of file 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 21d368c47a..49d702f1f7 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 @@ -1345,7 +1345,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { return new CyclesReporter( new TransitiveTargetCycleReporter(packageManager), new ActionArtifactCycleReporter(packageManager), - new SkylarkModuleCycleReporter()); + new SkylarkModuleCycleReporter(), + new ConfiguredTargetCycleReporter(packageManager)); } CyclesReporter getCyclesReporter() { |