C++: Write GoWrapCc in Skylark

go_wrap_cc is partially re-written in Skylark in this CL. To completely re-write in Skylark, there would have to be a Go Skylark API that exposes the necessary bits. See b/113797843.

RELNOTES:none
PiperOrigin-RevId: 211806913
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index bdeacf0..e8ed749 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -273,8 +273,9 @@
    *
    * @return true if this rule's compilations should apply -fPIC, false otherwise
    */
+  @Override
   public boolean usePicForDynamicLibraries() {
-    return getCppConfiguration().forcePic() || toolchainNeedsPic();
+    return forcePic || toolchainNeedsPic();
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
index 6d2e014..2ee2ea2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -27,6 +27,19 @@
 public interface CcToolchainProviderApi extends ToolchainInfoApi {
 
   @SkylarkCallable(
+      name = "use_pic_for_dynamic_libraries",
+      doc =
+          "Returns true if this rule's compilations should apply -fPIC, false otherwise. "
+              + "Determines if we should apply -fPIC for this rule's C++ compilations. This "
+              + "determination is generally made by the global C++ configuration settings "
+              + "<code>needsPic</code> and <code>usePicForBinaries</code>. However, an individual "
+              + "rule may override these settings by applying <code>-fPIC</code> to its "
+              + "<code>nocopts</code> attribute. This allows incompatible rules to opt out of "
+              + "global PIC settings.",
+      structField = true)
+  boolean usePicForDynamicLibraries();
+
+  @SkylarkCallable(
       name = "built_in_include_directories",
       doc = "Returns the list of built-in directories of the compiler.",
       structField = true)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
index c7804b2..6d4f41d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
@@ -18,18 +18,11 @@
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.rules.cpp.FdoProvider.FdoMode;
-import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.ToolPath;
 import java.util.List;
@@ -43,90 +36,6 @@
 @RunWith(JUnit4.class)
 public class CcToolchainProviderTest extends BuildViewTestCase {
   @Test
-  public void equalityIsObjectIdentity() throws Exception {
-    CcToolchainProvider a =
-        new CcToolchainProvider(
-            /* values= */ ImmutableMap.of(),
-            /* cppConfiguration= */ null,
-            /* toolchainInfo= */ null,
-            /* crosstoolTopPathFragment= */ null,
-            /* crosstool= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* crosstoolMiddleman= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* compile= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* strip= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* objCopy= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* as= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* ar= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* link= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* interfaceSoBuilder= */ null,
-            /* dwp= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* coverage= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* libcLink= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* staticRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* staticRuntimeLinkMiddleman= */ null,
-            /* dynamicRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* dynamicRuntimeLinkMiddleman= */ null,
-            /* dynamicRuntimeSolibDir= */ PathFragment.EMPTY_FRAGMENT,
-            CcCompilationContext.EMPTY,
-            /* supportsParamFiles= */ false,
-            /* supportsHeaderParsing= */ false,
-            CcToolchainVariables.EMPTY,
-            /* builtinIncludeFiles= */ ImmutableList.<Artifact>of(),
-            /* coverageEnvironment= */ NestedSetBuilder.emptySet(Order.COMPILE_ORDER),
-            /* linkDynamicLibraryTool= */ null,
-            /* builtInIncludeDirectories= */ ImmutableList.<PathFragment>of(),
-            /* sysroot= */ null,
-            FdoMode.OFF,
-            /* fdoProvider= */ null,
-            /* useLLVMCoverageMapFormat= */ false,
-            /* codeCoverageEnabled= */ false,
-            /* isHostConfiguration= */ false);
-
-    CcToolchainProvider b =
-        new CcToolchainProvider(
-            /* values= */ ImmutableMap.of(),
-            /* cppConfiguration= */ null,
-            /* toolchainInfo= */ null,
-            /* crosstoolTopPathFragment= */ null,
-            /* crosstool= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* crosstoolMiddleman= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* compile= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* strip= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* objCopy= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* as= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* ar= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* link= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* interfaceSoBuilder= */ null,
-            /* dwp= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* coverage= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* libcLink= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* staticRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* staticRuntimeLinkMiddleman= */ null,
-            /* dynamicRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-            /* dynamicRuntimeLinkMiddleman= */ null,
-            /* dynamicRuntimeSolibDir= */ PathFragment.EMPTY_FRAGMENT,
-            CcCompilationContext.EMPTY,
-            /* supportsParamFiles= */ false,
-            /* supportsHeaderParsing= */ false,
-            CcToolchainVariables.EMPTY,
-            /* builtinIncludeFiles= */ ImmutableList.<Artifact>of(),
-            /* coverageEnvironment= */ NestedSetBuilder.emptySet(Order.COMPILE_ORDER),
-            /* linkDynamicLibraryTool= */ null,
-            /* builtInIncludeDirectories= */ ImmutableList.<PathFragment>of(),
-            /* sysroot= */ null,
-            FdoMode.OFF,
-            /* fdoProvider= */ null,
-            /* useLLVMCoverageMapFormat= */ false,
-            /* codeCoverageEnabled= */ false,
-            /* isHostConfiguration= */ false);
-
-    new EqualsTester()
-        .addEqualityGroup(a)
-        .addEqualityGroup(b)
-        .testEquals();
-  }
-
-  @Test
   public void testSkylarkCallables() throws Exception {
     AnalysisMock.get()
         .ccSupport()
@@ -138,8 +47,9 @@
                 .setBuiltinSysroot("/usr/local/custom-sysroot")
                 .addToolPath(ToolPath.newBuilder().setName("ar").setPath("foo/ar/path").build())
                 .buildPartial());
-    useConfiguration("--cpu=k8");
-    scratch.file("test/rule.bzl",
+    useConfiguration("--cpu=k8", "--force_pic");
+    scratch.file(
+        "test/rule.bzl",
         "def _impl(ctx):",
         "  provider = ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]",
         "  return struct(",
@@ -151,6 +61,7 @@
         "    compiler_options = provider.compiler_options(),",
         "    cxx_options = provider.cxx_options(),",
         "    ar_executable = provider.ar_executable,",
+        "    use_pic_for_dynamic_libraries = provider.use_pic_for_dynamic_libraries,",
         "  )",
         "",
         "my_rule = rule(",
@@ -186,6 +97,10 @@
     @SuppressWarnings("unchecked")
     List<String> unfilteredCompilerOptions = (List<String>) ct.get("unfiltered_compiler_options");
     assertThat(unfilteredCompilerOptions).contains("--sysroot=/usr/local/custom-sysroot");
+
+    @SuppressWarnings("unchecked")
+    boolean usePicForDynamicLibraries = (boolean) ct.get("use_pic_for_dynamic_libraries");
+    assertThat(usePicForDynamicLibraries).isTrue();
   }
 
   @Test