New sky function that does the following:
1) call BzlLoadFunction to load the content of PROJECT.scl file given the provided scl_config name
2) call ParsedFlagsFunction to parse the list of options
3) define a patch transition and applies the transition to the targetOptions which was used for creating topLevel configuration
4) the returned adjusted BuildOptions are then used in AnalysisPhaseRunner and BuildTool instead of the original BuildOptions.
PiperOrigin-RevId: 621913271
Change-Id: If0620fdaca6f292a96150faa34f1b3145ec54a23
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Project.java b/src/main/java/com/google/devtools/build/lib/analysis/Project.java
index 19fecbf..f7579f4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Project.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Project.java
@@ -24,14 +24,21 @@
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.CoreOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
+import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration.Code;
import com.google.devtools.build.lib.skyframe.ContainingPackageLookupValue;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
+import com.google.devtools.build.lib.skyframe.config.FlagSetValue;
import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.SkyValue;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -180,4 +187,34 @@
}
return ans.build();
}
+
+ /**
+ * applies {@link CoreOptions.sclConfig} to the top-level {@link BuildOptions}
+ *
+ * <p>given an existing PROJECT.scl file and an {@link CoreOptions.sclConfig}, the method creates
+ * a {@link SkyKey} containing the {@link PathFragment} of the scl file and the config name which
+ * is evaluated by the {@link FlagSetFunction}
+ *
+ * @return {@link FlagSetValue} which has the effective top-level {@link BuildOptions} after
+ * project file resolution.
+ */
+ public static FlagSetValue modifyBuildOptionsWithFlagSets(
+ PathFragment projectFile,
+ BuildOptions targetOptions,
+ ExtendedEventHandler eventHandler,
+ SkyframeExecutor skyframeExecutor)
+ throws InvalidConfigurationException {
+
+ FlagSetValue.Key flagSetKey =
+ FlagSetValue.Key.create(
+ projectFile, targetOptions.get(CoreOptions.class).sclConfig, targetOptions);
+
+ EvaluationResult<SkyValue> result =
+ skyframeExecutor.evaluateSkyKeys(
+ eventHandler, ImmutableList.of(flagSetKey), /* keepGoing= */ false);
+ if (result.hasError()) {
+ throw new InvalidConfigurationException("Cannot parse options", Code.INVALID_BUILD_OPTIONS);
+ }
+ return (FlagSetValue) result.get(flagSetKey);
+ }
}