From 8b56c8cd8aff04dd76a198825ad7ab7b44350438 Mon Sep 17 00:00:00 2001 From: Ulf Adams Date: Tue, 12 Apr 2016 13:45:56 +0000 Subject: Refactor BlazeWorkspace creation to happen after BlazeRuntime construction. As part of that, move a BinTools and the WorkspaceStatusActionFactory to the BlazeWorkspace. -- MOS_MIGRATED_REVID=119633702 --- .../devtools/build/lib/buildtool/BuildTool.java | 3 +- .../build/lib/buildtool/ExecutionTool.java | 5 +- .../devtools/build/lib/runtime/BlazeModule.java | 5 +- .../devtools/build/lib/runtime/BlazeRuntime.java | 223 +++++++++++---------- .../devtools/build/lib/runtime/BlazeWorkspace.java | 18 +- .../build/lib/runtime/commands/RunCommand.java | 9 +- .../build/lib/sandbox/NamespaceSandboxRunner.java | 5 +- .../StandaloneActionContextProvider.java | 3 +- 8 files changed, 152 insertions(+), 119 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java index 7523cc217b..78e4e747f3 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java @@ -241,7 +241,8 @@ public final class BuildTool { env.getEventBus() .post( new BuildInfoEvent( - runtime.getworkspaceStatusActionFactory().createDummyWorkspaceStatus())); + env.getBlazeWorkspace().getWorkspaceStatusActionFactory() + .createDummyWorkspaceStatus())); } } diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java index 285629d0a2..f741fe6a99 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java @@ -192,7 +192,8 @@ public class ExecutionTool { new FilesetActionContextImpl.Provider( env.getReporter(), env.getWorkspaceName()), new SimpleActionContextProvider( - new SymlinkTreeStrategy(env.getOutputService(), runtime.getBinTools()))); + new SymlinkTreeStrategy( + env.getOutputService(), env.getBlazeWorkspace().getBinTools()))); StrategyConverter strategyConverter = new StrategyConverter(actionContextProviders); ImmutableList actionContextConsumers = @@ -509,7 +510,7 @@ public class ExecutionTool { private void createToolsSymlinks() throws ExecutorInitException { try { - runtime.getBinTools().setupBuildTools(); + env.getBlazeWorkspace().getBinTools().setupBuildTools(); } catch (ExecException e) { throw new ExecutorInitException("Tools symlink creation failed", e); } diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java index ff4839ba41..c19235c663 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.exec.OutputService; import com.google.devtools.build.lib.packages.NoSuchThingException; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.Preprocessor; +import com.google.devtools.build.lib.query2.AbstractBlazeQueryEnvironment; import com.google.devtools.build.lib.query2.QueryEnvironmentFactory; import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction; import com.google.devtools.build.lib.query2.output.OutputFormatter; @@ -374,8 +375,10 @@ public abstract class BlazeModule { * Returns a factory for creating {@link SkyframeExecutor} objects. If the module does not * provide any SkyframeExecutorFactory, it returns null. Note that only one factory per * Bazel/Blaze runtime is allowed. + * + * @param directories the workspace directories */ - public SkyframeExecutorFactory getSkyframeExecutorFactory() { + public SkyframeExecutorFactory getSkyframeExecutorFactory(BlazeDirectories directories) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java index b899fbda29..df56b97478 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java @@ -151,33 +151,28 @@ public final class BlazeRuntime { // We pass this through here to make it available to the MasterLogWriter. private final OptionsProvider startupOptionsProvider; - private final BinTools binTools; - private final WorkspaceStatusAction.Factory workspaceStatusActionFactory; private final ProjectFile.Provider projectFileProvider; @Nullable private final InvocationPolicy invocationPolicy; private final QueryEnvironmentFactory queryEnvironmentFactory; + private final SubscriberExceptionHandler eventBusExceptionHandler; // Workspace state (currently exactly one workspace per server) - private final BlazeWorkspace workspace; + private BlazeWorkspace workspace; - private BlazeRuntime(BlazeDirectories directories, - WorkspaceStatusAction.Factory workspaceStatusActionFactory, - final SkyframeExecutor skyframeExecutor, + private BlazeRuntime( QueryEnvironmentFactory queryEnvironmentFactory, PackageFactory pkgFactory, ConfiguredRuleClassProvider ruleClassProvider, ConfigurationFactory configurationFactory, Clock clock, OptionsProvider startupOptionsProvider, Iterable blazeModules, SubscriberExceptionHandler eventBusExceptionHandler, - BinTools binTools, ProjectFile.Provider projectFileProvider, + ProjectFile.Provider projectFileProvider, InvocationPolicy invocationPolicy, Iterable commands) { // Server state this.blazeModules = blazeModules; overrideCommands(commands); - this.workspaceStatusActionFactory = workspaceStatusActionFactory; this.packageFactory = pkgFactory; - this.binTools = binTools; this.projectFileProvider = projectFileProvider; this.invocationPolicy = invocationPolicy; @@ -186,10 +181,7 @@ public final class BlazeRuntime { this.clock = clock; this.startupOptionsProvider = startupOptionsProvider; this.queryEnvironmentFactory = queryEnvironmentFactory; - - // Workspace state - this.workspace = new BlazeWorkspace( - this, directories, skyframeExecutor, eventBusExceptionHandler); + this.eventBusExceptionHandler = eventBusExceptionHandler; } private static InvocationPolicy createInvocationPolicyFromModules( @@ -207,6 +199,106 @@ public final class BlazeRuntime { return builder.build(); } + public void initWorkspace(BlazeDirectories directories, BinTools binTools) + throws AbruptExitException { + SkyframeExecutorFactory skyframeExecutorFactory = null; + for (BlazeModule module : blazeModules) { + SkyframeExecutorFactory skyFactory = module.getSkyframeExecutorFactory(directories); + if (skyFactory != null) { + Preconditions.checkState(skyframeExecutorFactory == null, + "At most one Skyframe factory supported. But found two: %s and %s", skyFactory, + skyframeExecutorFactory); + skyframeExecutorFactory = skyFactory; + } + } + if (skyframeExecutorFactory == null) { + skyframeExecutorFactory = new SequencedSkyframeExecutorFactory(); + } + + WorkspaceStatusAction.Factory workspaceStatusActionFactory = null; + for (BlazeModule module : blazeModules) { + WorkspaceStatusAction.Factory candidate = module.getWorkspaceStatusActionFactory(); + if (candidate != null) { + Preconditions.checkState(workspaceStatusActionFactory == null, + "more than one module defines a workspace status action factory"); + workspaceStatusActionFactory = candidate; + } + } + + Iterable diffAwarenessFactories; + { + ImmutableList.Builder builder = new ImmutableList.Builder<>(); + boolean watchFS = startupOptionsProvider != null + && startupOptionsProvider.getOptions(BlazeServerStartupOptions.class).watchFS; + for (BlazeModule module : blazeModules) { + builder.addAll(module.getDiffAwarenessFactories(watchFS)); + } + diffAwarenessFactories = builder.build(); + } + + // Merge filters from Blaze modules that allow some action inputs to be missing. + Predicate allowedMissingInputs = null; + for (BlazeModule module : blazeModules) { + Predicate modulePredicate = module.getAllowedMissingInputs(); + if (modulePredicate != null) { + Preconditions.checkArgument(allowedMissingInputs == null, + "More than one Blaze module allows missing inputs."); + allowedMissingInputs = modulePredicate; + } + } + if (allowedMissingInputs == null) { + allowedMissingInputs = Predicates.alwaysFalse(); + } + + Preprocessor.Factory.Supplier preprocessorFactorySupplier = null; + for (BlazeModule module : blazeModules) { + Preprocessor.Factory.Supplier modulePreprocessorFactorySupplier = + module.getPreprocessorFactorySupplier(); + if (modulePreprocessorFactorySupplier != null) { + Preconditions.checkState(preprocessorFactorySupplier == null, + "more than one module defines a preprocessor factory supplier"); + preprocessorFactorySupplier = modulePreprocessorFactorySupplier; + } + } + if (preprocessorFactorySupplier == null) { + preprocessorFactorySupplier = Preprocessor.Factory.Supplier.NullSupplier.INSTANCE; + } + + // We use an immutable map builder for the nice side effect that it throws if a duplicate key + // is inserted. + ImmutableMap.Builder skyFunctions = ImmutableMap.builder(); + for (BlazeModule module : blazeModules) { + skyFunctions.putAll(module.getSkyFunctions(directories)); + } + + ImmutableList.Builder precomputedValues = ImmutableList.builder(); + for (BlazeModule module : blazeModules) { + precomputedValues.addAll(module.getPrecomputedSkyframeValues()); + } + + ImmutableList.Builder customDirtinessCheckers = + ImmutableList.builder(); + for (BlazeModule module : blazeModules) { + customDirtinessCheckers.addAll(module.getCustomDirtinessCheckers()); + } + + SkyframeExecutor skyframeExecutor = skyframeExecutorFactory.create( + packageFactory, + directories, + binTools, + workspaceStatusActionFactory, + ruleClassProvider.getBuildInfoFactories(), + diffAwarenessFactories, + allowedMissingInputs, + preprocessorFactorySupplier, + skyFunctions.build(), + precomputedValues.build(), + customDirtinessCheckers.build()); + this.workspace = new BlazeWorkspace( + this, directories, skyframeExecutor, eventBusExceptionHandler, workspaceStatusActionFactory, + binTools); + } + @Nullable public CoverageReportActionFactory getCoverageReportActionFactory() { CoverageReportActionFactory firstFactory = null; for (BlazeModule module : blazeModules) { @@ -301,10 +393,6 @@ public final class BlazeRuntime { return getWorkspace().getDirectories().getOutputBase().getChild("server"); } - public BinTools getBinTools() { - return binTools; - } - /** * Returns the {@link QueryEnvironmentFactory} that should be used to create a * {@link AbstractBlazeQueryEnvironment}, whenever one is needed. @@ -330,10 +418,6 @@ public final class BlazeRuntime { return result.build(); } - public WorkspaceStatusAction.Factory getworkspaceStatusActionFactory() { - return workspaceStatusActionFactory; - } - /** * Returns the rule class provider. */ @@ -1067,14 +1151,12 @@ public final class BlazeRuntime { * an exception. Please plan appropriately. */ public static class Builder { - private BlazeDirectories directories; private ConfigurationFactory configurationFactory; private Clock clock; private OptionsProvider startupOptionsProvider; private final List blazeModules = new ArrayList<>(); - private SubscriberExceptionHandler eventBusExceptionHandler = - new RemoteExceptionHandler(); + private SubscriberExceptionHandler eventBusExceptionHandler = new RemoteExceptionHandler(); private BinTools binTools; private UUID instanceId; private final List commands = new ArrayList<>(); @@ -1089,26 +1171,13 @@ public final class BlazeRuntime { Preconditions.checkNotNull(clock); - Preprocessor.Factory.Supplier preprocessorFactorySupplier = null; - SkyframeExecutorFactory skyframeExecutorFactory = null; - QueryEnvironmentFactory queryEnvironmentFactory = null; for (BlazeModule module : blazeModules) { module.blazeStartup(startupOptionsProvider, BlazeVersionInfo.instance(), instanceId, directories, clock); - Preprocessor.Factory.Supplier modulePreprocessorFactorySupplier = - module.getPreprocessorFactorySupplier(); - if (modulePreprocessorFactorySupplier != null) { - Preconditions.checkState(preprocessorFactorySupplier == null, - "more than one module defines a preprocessor factory supplier"); - preprocessorFactorySupplier = modulePreprocessorFactorySupplier; - } - SkyframeExecutorFactory skyFactory = module.getSkyframeExecutorFactory(); - if (skyFactory != null) { - Preconditions.checkState(skyframeExecutorFactory == null, - "At most one skyframe factory supported. But found two: %s and %s", skyFactory, - skyframeExecutorFactory); - skyframeExecutorFactory = skyFactory; - } + } + + QueryEnvironmentFactory queryEnvironmentFactory = null; + for (BlazeModule module : blazeModules) { QueryEnvironmentFactory queryEnvFactory = module.getQueryEnvironmentFactory(); if (queryEnvFactory != null) { Preconditions.checkState(queryEnvironmentFactory == null, @@ -1118,15 +1187,9 @@ public final class BlazeRuntime { queryEnvironmentFactory = queryEnvFactory; } } - if (skyframeExecutorFactory == null) { - skyframeExecutorFactory = new SequencedSkyframeExecutorFactory(); - } if (queryEnvironmentFactory == null) { queryEnvironmentFactory = new QueryEnvironmentFactory(); } - if (preprocessorFactorySupplier == null) { - preprocessorFactorySupplier = Preprocessor.Factory.Supplier.NullSupplier.INSTANCE; - } ConfiguredRuleClassProvider.Builder ruleClassBuilder = new ConfiguredRuleClassProvider.Builder(); @@ -1146,17 +1209,6 @@ public final class BlazeRuntime { } } - Iterable diffAwarenessFactories; - { - ImmutableList.Builder builder = new ImmutableList.Builder<>(); - boolean watchFS = startupOptionsProvider != null - && startupOptionsProvider.getOptions(BlazeServerStartupOptions.class).watchFS; - for (BlazeModule module : blazeModules) { - builder.addAll(module.getDiffAwarenessFactories(watchFS)); - } - diffAwarenessFactories = builder.build(); - } - // Merge filters from Blaze modules that allow some action inputs to be missing. Predicate allowedMissingInputs = null; for (BlazeModule module : blazeModules) { @@ -1172,55 +1224,14 @@ public final class BlazeRuntime { } ConfiguredRuleClassProvider ruleClassProvider = ruleClassBuilder.build(); - WorkspaceStatusAction.Factory workspaceStatusActionFactory = null; - for (BlazeModule module : blazeModules) { - WorkspaceStatusAction.Factory candidate = module.getWorkspaceStatusActionFactory(); - if (candidate != null) { - Preconditions.checkState(workspaceStatusActionFactory == null, - "more than one module defines a workspace status action factory"); - workspaceStatusActionFactory = candidate; - } - } List extensions = new ArrayList<>(); for (BlazeModule module : blazeModules) { extensions.add(module.getPackageEnvironmentExtension()); } - // We use an immutable map builder for the nice side effect that it throws if a duplicate key - // is inserted. - ImmutableMap.Builder skyFunctions = ImmutableMap.builder(); - for (BlazeModule module : blazeModules) { - skyFunctions.putAll(module.getSkyFunctions(directories)); - } - - ImmutableList.Builder precomputedValues = ImmutableList.builder(); - for (BlazeModule module : blazeModules) { - precomputedValues.addAll(module.getPrecomputedSkyframeValues()); - } - - ImmutableList.Builder customDirtinessCheckers = - ImmutableList.builder(); - for (BlazeModule module : blazeModules) { - customDirtinessCheckers.addAll(module.getCustomDirtinessCheckers()); - } - - final PackageFactory pkgFactory = - new PackageFactory(ruleClassProvider, platformRegexps, extensions, - BlazeVersionInfo.instance().getVersion()); - SkyframeExecutor skyframeExecutor = - skyframeExecutorFactory.create( - pkgFactory, - directories, - binTools, - workspaceStatusActionFactory, - ruleClassProvider.getBuildInfoFactories(), - diffAwarenessFactories, - allowedMissingInputs, - preprocessorFactorySupplier, - skyFunctions.build(), - precomputedValues.build(), - customDirtinessCheckers.build()); + PackageFactory packageFactory = new PackageFactory( + ruleClassProvider, platformRegexps, extensions, BlazeVersionInfo.instance().getVersion()); if (configurationFactory == null) { configurationFactory = new ConfigurationFactory( @@ -1240,10 +1251,12 @@ public final class BlazeRuntime { invocationPolicy = createInvocationPolicyFromModules(invocationPolicy, blazeModules); - return new BlazeRuntime(directories, workspaceStatusActionFactory, skyframeExecutor, - queryEnvironmentFactory, pkgFactory, ruleClassProvider, configurationFactory, - clock, startupOptionsProvider, ImmutableList.copyOf(blazeModules), - eventBusExceptionHandler, binTools, projectFileProvider, invocationPolicy, commands); + BlazeRuntime runtime = new BlazeRuntime(queryEnvironmentFactory, packageFactory, + ruleClassProvider, configurationFactory, clock, startupOptionsProvider, + ImmutableList.copyOf(blazeModules), eventBusExceptionHandler, projectFileProvider, + invocationPolicy, commands); + runtime.initWorkspace(directories, binTools); + return runtime; } public Builder setBinTools(BinTools binTools) { diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java index b6be4b2699..aa98d3b98a 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeWorkspace.java @@ -23,6 +23,8 @@ import com.google.devtools.build.lib.actions.cache.ActionCache; import com.google.devtools.build.lib.actions.cache.CompactPersistentActionCache; import com.google.devtools.build.lib.actions.cache.NullActionCache; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.analysis.WorkspaceStatusAction; +import com.google.devtools.build.lib.analysis.config.BinTools; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.profiler.AutoProfiler; @@ -56,6 +58,8 @@ public final class BlazeWorkspace { private final BlazeRuntime runtime; private final SubscriberExceptionHandler eventBusExceptionHandler; + private final WorkspaceStatusAction.Factory workspaceStatusActionFactory; + private final BinTools binTools; private final BlazeDirectories directories; private final SkyframeExecutor skyframeExecutor; @@ -66,9 +70,13 @@ public final class BlazeWorkspace { private Range lastExecutionRange = null; public BlazeWorkspace(BlazeRuntime runtime, BlazeDirectories directories, - SkyframeExecutor skyframeExecutor, SubscriberExceptionHandler eventBusExceptionHandler) { + SkyframeExecutor skyframeExecutor, SubscriberExceptionHandler eventBusExceptionHandler, + WorkspaceStatusAction.Factory workspaceStatusActionFactory, BinTools binTools) { this.runtime = runtime; this.eventBusExceptionHandler = eventBusExceptionHandler; + this.workspaceStatusActionFactory = workspaceStatusActionFactory; + this.binTools = binTools; + this.directories = directories; this.skyframeExecutor = skyframeExecutor; @@ -90,6 +98,14 @@ public final class BlazeWorkspace { return skyframeExecutor; } + public WorkspaceStatusAction.Factory getWorkspaceStatusActionFactory() { + return workspaceStatusActionFactory; + } + + public BinTools getBinTools() { + return binTools; + } + /** * Returns the working directory of the server. * diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java index 836c154cfa..01faf50eff 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java @@ -39,7 +39,6 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.pkgcache.LoadingFailedException; import com.google.devtools.build.lib.runtime.BlazeCommand; -import com.google.devtools.build.lib.runtime.BlazeRuntime; import com.google.devtools.build.lib.runtime.Command; import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.shell.AbnormalTerminationException; @@ -126,7 +125,6 @@ public class RunCommand implements BlazeCommand { @Override public ExitCode exec(CommandEnvironment env, OptionsProvider options) { - BlazeRuntime runtime = env.getRuntime(); RunOptions runOptions = options.getOptions(RunOptions.class); // This list should look like: ["//executable:target", "arg1", "arg2"] List targetAndArgs = options.getResidue(); @@ -146,7 +144,7 @@ public class RunCommand implements BlazeCommand { : ImmutableList.of(targetString); BuildRequest request = BuildRequest.create( this.getClass().getAnnotation(Command.class).name(), options, - runtime.getStartupOptionsProvider(), targets, outErr, + env.getRuntime().getStartupOptionsProvider(), targets, outErr, env.getCommandId(), env.getCommandStartTime()); currentRunUnder = runUnder; @@ -246,7 +244,8 @@ public class RunCommand implements BlazeCommand { options.getOptions(BuildRequestOptions.class).getSymlinkPrefix()); List cmdLine = new ArrayList<>(); if (runOptions.scriptPath == null) { - PathFragment processWrapperPath = runtime.getBinTools().getExecPath(PROCESS_WRAPPER); + PathFragment processWrapperPath = + env.getBlazeWorkspace().getBinTools().getExecPath(PROCESS_WRAPPER); Preconditions.checkNotNull( processWrapperPath, PROCESS_WRAPPER + " not found in embedded tools"); cmdLine.add(env.getExecRoot().getRelative(processWrapperPath).getPathString()); @@ -372,7 +371,7 @@ public class RunCommand implements BlazeCommand { runfilesDir, false); helper.createSymlinksUsingCommand(env.getExecRoot(), target.getConfiguration(), - env.getRuntime().getBinTools()); + env.getBlazeWorkspace().getBinTools()); return workingDir; } diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java b/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java index 8b35723646..9516fe2753 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/NamespaceSandboxRunner.java @@ -20,7 +20,6 @@ import com.google.common.io.ByteStreams; import com.google.common.io.Files; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.UserExecException; -import com.google.devtools.build.lib.analysis.config.BinTools; import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.shell.AbnormalTerminationException; import com.google.devtools.build.lib.shell.Command; @@ -81,9 +80,9 @@ public class NamespaceSandboxRunner { static boolean isSupported(CommandEnvironment commandEnv) { Path execRoot = commandEnv.getExecRoot(); - BinTools binTools = commandEnv.getRuntime().getBinTools(); - PathFragment embeddedTool = binTools.getExecPath(NAMESPACE_SANDBOX); + PathFragment embeddedTool = + commandEnv.getBlazeWorkspace().getBinTools().getExecPath(NAMESPACE_SANDBOX); if (embeddedTool == null) { // The embedded tool does not exist, meaning that we don't support sandboxing (e.g., while // bootstrapping). diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java index 9583d318b4..4982624988 100644 --- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneActionContextProvider.java @@ -72,7 +72,8 @@ public class StandaloneActionContextProvider extends ActionContextProvider { TestActionContext testStrategy = new StandaloneTestStrategy( - buildRequest, env.getRuntime().getBinTools(), env.getClientEnv(), env.getWorkspace()); + buildRequest, env.getBlazeWorkspace().getBinTools(), env.getClientEnv(), + env.getWorkspace()); Builder strategiesBuilder = ImmutableList.builder(); -- cgit v1.2.3