Drop CppLinkActionContext

Merge the functionality into CppLinkAction, which now simply creates and runs
a Spawn. Set PWD to /proc/self/cwd for Linux, and set execution info if the
action needs to run on MacOS.

--
PiperOrigin-RevId: 149285420
MOS_MIGRATED_REVID=149285420
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelActionContextConsumer.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelActionContextConsumer.java
index 03bf7d4..58c36408 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelActionContextConsumer.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelActionContextConsumer.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.exec.ActionContextConsumer;
 import com.google.devtools.build.lib.rules.android.WriteAdbArgsActionContext;
 import com.google.devtools.build.lib.rules.cpp.CppCompileActionContext;
-import com.google.devtools.build.lib.rules.cpp.CppLinkActionContext;
 import com.google.devtools.build.lib.rules.cpp.IncludeScanningContext;
 import java.util.Map;
 import java.util.TreeMap;
@@ -73,7 +72,6 @@
   public Multimap<Class<? extends ActionContext>, String> getActionContexts() {
     return ImmutableMultimap.<Class<? extends ActionContext>, String>builder()
         .put(CppCompileActionContext.class, "")
-        .put(CppLinkActionContext.class, "")
         .put(IncludeScanningContext.class, "")
         .put(FileWriteActionContext.class, "")
         .put(WriteAdbArgsActionContext.class, "")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
index 0fbd2d0..26011cb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.actions.AbstractAction;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
 import com.google.devtools.build.lib.actions.ActionExecutionException;
+import com.google.devtools.build.lib.actions.ActionInput;
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.CommandAction;
@@ -32,10 +33,13 @@
 import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier;
 import com.google.devtools.build.lib.actions.Executor;
 import com.google.devtools.build.lib.actions.ResourceSet;
+import com.google.devtools.build.lib.actions.SimpleSpawn;
+import com.google.devtools.build.lib.actions.Spawn;
 import com.google.devtools.build.lib.actions.extra.CppLinkInfo;
 import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.actions.ExecutionRequirements;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -52,6 +56,7 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -220,6 +225,12 @@
               .getParentDirectory()
               .getPathString());
     }
+
+    if (!needsToRunOnMac()) {
+      // This prevents gcc from writing the unpredictable (and often irrelevant)
+      // value of getcwd() into the debug info.
+      result.put("PWD", "/proc/self/cwd");
+    }
     return ImmutableMap.copyOf(result);
   }
 
@@ -298,6 +309,10 @@
     return allLTOBackendArtifacts;
   }
 
+  private boolean needsToRunOnMac() {
+    return getHostSystemName().equals(CppConfiguration.MAC_SYSTEM_NAME);
+  }
+
   @Override
   @ThreadCompatible
   public void execute(
@@ -307,10 +322,27 @@
       executeFake();
     } else {
       Executor executor = actionExecutionContext.getExecutor();
-
       try {
-        executor.getContext(CppLinkActionContext.class).exec(
-            this, actionExecutionContext);
+        // Collect input files
+        List<ActionInput> allInputs = new ArrayList<>();
+        Artifact.addExpandedArtifacts(
+            getMandatoryInputs(), allInputs, actionExecutionContext.getArtifactExpander());
+
+        ImmutableMap<String, String> executionInfo = ImmutableMap.of();
+        if (needsToRunOnMac()) {
+          executionInfo = ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, "");
+        }
+
+        Spawn spawn = new SimpleSpawn(
+            this,
+            ImmutableList.copyOf(getCommandLine()),
+            getEnvironment(),
+            executionInfo,
+            ImmutableList.copyOf(allInputs),
+            getOutputs().asList(),
+            estimateResourceConsumptionLocal());
+        executor.getSpawnActionContext(getMnemonic()).exec(
+            spawn, actionExecutionContext);
       } catch (ExecException e) {
         throw e.toActionExecutionException("Linking of rule '" + getOwner().getLabel() + "'",
             executor.getVerboseFailures(), this);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionContext.java
deleted file mode 100644
index bf0bd3e..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionContext.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 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.rules.cpp;
-
-import com.google.devtools.build.lib.actions.ActionContextMarker;
-import com.google.devtools.build.lib.actions.ActionExecutionContext;
-import com.google.devtools.build.lib.actions.ActionExecutionException;
-import com.google.devtools.build.lib.actions.ExecException;
-import com.google.devtools.build.lib.actions.Executor.ActionContext;
-
-/**
- * Context for executing {@link CppLinkAction}s.
- */
-@ActionContextMarker(name = "C++ link")
-public interface CppLinkActionContext extends ActionContext {
-  /**
-   * Executes the specified action.
-   */
-  void exec(CppLinkAction action,
-      ActionExecutionContext actionExecutionContext)
-      throws ExecException, ActionExecutionException, InterruptedException;
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/SpawnLinkStrategy.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/SpawnLinkStrategy.java
deleted file mode 100644
index 9360d2a..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/SpawnLinkStrategy.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2015 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.rules.cpp;
-
-import com.google.devtools.build.lib.actions.ActionExecutionContext;
-import com.google.devtools.build.lib.actions.ActionExecutionException;
-import com.google.devtools.build.lib.actions.BaseSpawn;
-import com.google.devtools.build.lib.actions.ExecException;
-import com.google.devtools.build.lib.actions.ExecutionStrategy;
-import com.google.devtools.build.lib.actions.Executor;
-import com.google.devtools.build.lib.actions.Spawn;
-import com.google.devtools.build.lib.actions.SpawnActionContext;
-
-/**
- * A link strategy that simply passes the everything through to the default spawn action strategy.
- */
-@ExecutionStrategy(
-  contextType = CppLinkActionContext.class,
-  name = {"spawn"}
-)
-public final class SpawnLinkStrategy implements CppLinkActionContext {
-
-  @Override
-  public void exec(CppLinkAction action, ActionExecutionContext actionExecutionContext)
-      throws ExecException, ActionExecutionException, InterruptedException {
-    Executor executor = actionExecutionContext.getExecutor();
-    SpawnActionContext spawnActionContext = executor.getSpawnActionContext(action.getMnemonic());
-    Spawn spawn =
-        new BaseSpawn(
-            action.getCommandLine(),
-            action.getEnvironment(),
-            action.getExecutionInfo(),
-            action,
-            action.estimateResourceConsumptionLocal());
-    spawnActionContext.exec(spawn, actionExecutionContext);
-  }
-}
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 1e74c9b..ff4ddbe 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
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.exec.TestStrategy;
 import com.google.devtools.build.lib.rules.cpp.IncludeScanningContext;
 import com.google.devtools.build.lib.rules.cpp.SpawnGccStrategy;
-import com.google.devtools.build.lib.rules.cpp.SpawnLinkStrategy;
 import com.google.devtools.build.lib.rules.test.ExclusiveTestStrategy;
 import com.google.devtools.build.lib.rules.test.TestActionContext;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
@@ -88,7 +87,6 @@
             verboseFailures,
             env.getRuntime().getProductName()),
         new DummyIncludeScanningContext(),
-        new SpawnLinkStrategy(),
         new SpawnGccStrategy(),
         testStrategy,
         new ExclusiveTestStrategy(testStrategy),