blob: b683daa0b10d4dcd2151d554855c29847b4fb21c [file] [log] [blame]
// Copyright 2017 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.actions;
import static com.google.common.base.Preconditions.checkState;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import java.util.Set;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
/** Immutable implementation of a Spawn that does not perform any processing on the parameters. */
@Immutable
public final class SimpleSpawn implements Spawn {
private final ActionExecutionMetadata owner;
private final ImmutableList<String> arguments;
private final ImmutableMap<String, String> environment;
private final ImmutableMap<String, String> executionInfo;
private final NestedSet<? extends ActionInput> inputs;
private final NestedSet<? extends ActionInput> tools;
private final RunfilesSupplier runfilesSupplier;
private final ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> filesetMappings;
private final ImmutableList<? extends ActionInput> outputs;
// If null, all outputs are mandatory.
@Nullable private final Set<? extends ActionInput> mandatoryOutputs;
private final LocalResourcesSupplier localResourcesSupplier;
private ResourceSet localResourcesCached;
private SimpleSpawn(
ActionExecutionMetadata owner,
ImmutableList<String> arguments,
ImmutableMap<String, String> environment,
ImmutableMap<String, String> executionInfo,
RunfilesSupplier runfilesSupplier,
ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> filesetMappings,
NestedSet<? extends ActionInput> inputs,
NestedSet<? extends ActionInput> tools,
ImmutableSet<? extends ActionInput> outputs,
@Nullable final Set<? extends ActionInput> mandatoryOutputs,
@Nullable ResourceSet localResources,
@Nullable LocalResourcesSupplier localResourcesSupplier) {
this.owner = Preconditions.checkNotNull(owner);
this.arguments = Preconditions.checkNotNull(arguments);
this.environment = Preconditions.checkNotNull(environment);
this.executionInfo = Preconditions.checkNotNull(executionInfo);
this.inputs = Preconditions.checkNotNull(inputs);
this.tools = Preconditions.checkNotNull(tools);
this.runfilesSupplier =
runfilesSupplier == null ? EmptyRunfilesSupplier.INSTANCE : runfilesSupplier;
this.filesetMappings = filesetMappings;
this.outputs = Preconditions.checkNotNull(outputs).asList();
this.mandatoryOutputs = mandatoryOutputs;
checkState(
(localResourcesSupplier == null) != (localResources == null),
"Exactly one must be null: %s %s",
localResources,
localResourcesSupplier);
if (localResources != null) {
this.localResourcesCached = localResources;
this.localResourcesSupplier = null;
} else {
this.localResourcesSupplier = localResourcesSupplier;
this.localResourcesCached = null;
}
}
public SimpleSpawn(
ActionExecutionMetadata owner,
ImmutableList<String> arguments,
ImmutableMap<String, String> environment,
ImmutableMap<String, String> executionInfo,
RunfilesSupplier runfilesSupplier,
ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> filesetMappings,
NestedSet<? extends ActionInput> inputs,
NestedSet<? extends ActionInput> tools,
ImmutableSet<? extends ActionInput> outputs,
@Nullable Set<? extends ActionInput> mandatoryOutputs,
ResourceSet localResources) {
this(
owner,
arguments,
environment,
executionInfo,
runfilesSupplier,
filesetMappings,
inputs,
tools,
outputs,
mandatoryOutputs,
localResources,
/*localResourcesSupplier=*/ null);
}
@SuppressWarnings("TooManyParameters")
public SimpleSpawn(
ActionExecutionMetadata owner,
ImmutableList<String> arguments,
ImmutableMap<String, String> environment,
ImmutableMap<String, String> executionInfo,
RunfilesSupplier runfilesSupplier,
ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> filesetMappings,
NestedSet<? extends ActionInput> inputs,
NestedSet<? extends ActionInput> tools,
ImmutableSet<? extends ActionInput> outputs,
@Nullable Set<? extends ActionInput> mandatoryOutputs,
LocalResourcesSupplier localResourcesSupplier) {
this(
owner,
arguments,
environment,
executionInfo,
runfilesSupplier,
filesetMappings,
inputs,
tools,
outputs,
mandatoryOutputs,
/*localResources=*/ null,
localResourcesSupplier);
}
public SimpleSpawn(
ActionExecutionMetadata owner,
ImmutableList<String> arguments,
ImmutableMap<String, String> environment,
ImmutableMap<String, String> executionInfo,
NestedSet<? extends ActionInput> inputs,
ImmutableSet<? extends ActionInput> outputs,
LocalResourcesSupplier localResourcesSupplier) {
this(
owner,
arguments,
environment,
executionInfo,
/*runfilesSupplier=*/ null,
/*filesetMappings=*/ ImmutableMap.of(),
inputs,
/*tools=*/ NestedSetBuilder.emptySet(Order.STABLE_ORDER),
outputs,
/*mandatoryOutputs=*/ null,
localResourcesSupplier);
}
public SimpleSpawn(
ActionExecutionMetadata owner,
ImmutableList<String> arguments,
ImmutableMap<String, String> environment,
ImmutableMap<String, String> executionInfo,
NestedSet<? extends ActionInput> inputs,
ImmutableSet<? extends ActionInput> outputs,
ResourceSet resourceSet) {
this(
owner,
arguments,
environment,
executionInfo,
null,
ImmutableMap.of(),
inputs,
NestedSetBuilder.emptySet(Order.STABLE_ORDER),
outputs,
/*mandatoryOutputs=*/ null,
resourceSet);
}
@Override
public ImmutableMap<String, String> getExecutionInfo() {
return executionInfo;
}
@Override
public RunfilesSupplier getRunfilesSupplier() {
return runfilesSupplier;
}
@Override
public ImmutableList<String> getArguments() {
return arguments;
}
@Override
public ImmutableMap<String, String> getEnvironment() {
return environment;
}
@Override
public ImmutableMap<Artifact, ImmutableList<FilesetOutputSymlink>> getFilesetMappings() {
return filesetMappings;
}
@Override
public NestedSet<? extends ActionInput> getInputFiles() {
return inputs;
}
@Override
public NestedSet<? extends ActionInput> getToolFiles() {
return tools;
}
@Override
public ImmutableList<? extends ActionInput> getOutputFiles() {
return outputs;
}
@Override
public boolean isMandatoryOutput(ActionInput output) {
return mandatoryOutputs == null || mandatoryOutputs.contains(output);
}
@Override
public ActionExecutionMetadata getResourceOwner() {
return owner;
}
@Override
public ResourceSet getLocalResources() throws ExecException {
if (localResourcesCached == null) {
// Not expected to be called concurrently, and an idempotent computation if it is.
localResourcesCached = localResourcesSupplier.get();
}
return localResourcesCached;
}
@Override
public String getMnemonic() {
return owner.getMnemonic();
}
@Override
public ImmutableMap<String, String> getCombinedExecProperties() {
return owner.getExecProperties();
}
@Override
@Nullable
public PlatformInfo getExecutionPlatform() {
return owner.getExecutionPlatform();
}
@Override
public String toString() {
return Spawns.prettyPrint(this);
}
/** Supplies resources needed for local execution. Result will be cached. */
public interface LocalResourcesSupplier {
ResourceSet get() throws ExecException;
}
}