| // Copyright 2024 The Bazel Authors. 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 static com.google.common.collect.ImmutableSet.toImmutableSet; | |
| import com.google.auto.value.AutoBuilder; | |
| import com.google.common.collect.ImmutableSet; | |
| import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue; | |
| import com.google.devtools.build.lib.cmdline.Label; | |
| import com.google.devtools.build.lib.vfs.FileStateKey; | |
| import com.google.devtools.build.skyframe.SkyKey; | |
| import java.io.PrintStream; | |
| import javax.annotation.Nullable; | |
| /** | |
| * An immutable record of the state of Skyfocus. This is recorded as a member in {@link | |
| * SkyframeExecutor}. | |
| * | |
| * @param enabled If true, Skyfocus may run at the end of the build, depending on the state of the | |
| * graph and active directories conditions. | |
| * @param forcedRerun If true, Skyfocus will always run at the end of the build, regardless of the | |
| * state of active directories or the graph. | |
| * @param focusedTargetLabels The set of targets focused in this server instance | |
| * @param activeDirectories Files/dirs representing the active directories. Can be empty, specified | |
| * by the command line flag, or automatically derived. Although the active directories is | |
| * represented as {@link FileStateKey}, the presence of a directory path's {@code FileStateKey} | |
| * is sufficient to represent the corresponding directory listing state node. | |
| * @param frontierSet {@link SkyKey}s for nodes that are in the DIRECT deps of the UTC of the active | |
| * directories. The values of these nodes are sufficient to build the active directories. | |
| * @param verificationSet The set of files/dirs that are not in the active directories, but is in | |
| * the transitive closure of focusedTargetLabels. | |
| * @param options The latest instance of {@link SkyfocusOptions}. | |
| * @param buildConfiguration The latest top level build configuration. | |
| */ | |
| public record SkyfocusState( | |
| boolean enabled, | |
| boolean forcedRerun, | |
| ImmutableSet<Label> focusedTargetLabels, | |
| ActiveDirectoriesType activeDirectoriesType, | |
| ImmutableSet<FileStateKey> activeDirectories, | |
| ImmutableSet<SkyKey> frontierSet, | |
| ImmutableSet<SkyKey> verificationSet, | |
| @Nullable SkyfocusOptions options, | |
| @Nullable BuildConfigurationValue buildConfiguration) { | |
| public void dumpActiveDirectories(PrintStream out) { | |
| activeDirectories.forEach(key -> out.println(key.getCanonicalName())); | |
| } | |
| public void dumpFrontierSet(PrintStream out) { | |
| frontierSet.forEach(key -> out.println(key.getCanonicalName())); | |
| } | |
| /** | |
| * Builder for the {@code SkyfocusState} record. | |
| * | |
| * <p>This must reflect all parameters in the record constructor. | |
| */ | |
| @AutoBuilder | |
| public interface Builder { | |
| Builder enabled(boolean enable); | |
| Builder forcedRerun(boolean forcedRerun); | |
| Builder focusedTargetLabels(ImmutableSet<Label> focusedTargetLabels); | |
| Builder activeDirectoriesType(ActiveDirectoriesType activeDirectoriesType); | |
| Builder activeDirectories(ImmutableSet<FileStateKey> activeDirectories); | |
| Builder frontierSet(ImmutableSet<SkyKey> frontierSet); | |
| Builder verificationSet(ImmutableSet<SkyKey> verificationSet); | |
| Builder options(@Nullable SkyfocusOptions options); | |
| Builder buildConfiguration(@Nullable BuildConfigurationValue buildConfiguration); | |
| SkyfocusState build(); | |
| } | |
| public Builder toBuilder() { | |
| return new AutoBuilder_SkyfocusState_Builder(this); | |
| } | |
| /** Describes how the active directories was constructed. */ | |
| public enum ActiveDirectoriesType { | |
| /** Automatically derived by the source state and the command line (e.g. focused targets) */ | |
| DERIVED, | |
| /** The value of --experimental_active_directories. Will override derived sets if used. */ | |
| USER_DEFINED | |
| } | |
| /** The canonical state to completely disable Skyfocus in the build. */ | |
| public static final SkyfocusState DISABLED = | |
| new SkyfocusState( | |
| false, | |
| false, | |
| /* focusedTargetLabels= */ ImmutableSet.of(), | |
| ActiveDirectoriesType.DERIVED, | |
| /* activeDirectories= */ ImmutableSet.of(), | |
| /* frontierSet= */ ImmutableSet.of(), | |
| /* verificationSet= */ ImmutableSet.of(), | |
| null, | |
| null); | |
| public ImmutableSet<String> activeDirectoriesStrings() { | |
| return activeDirectories.stream() | |
| .map(fsk -> fsk.argument().getRootRelativePath().toString()) | |
| .collect(toImmutableSet()); | |
| } | |
| } |