C++: Make linking_context libraries_to_link return depset

Triggered by the flag: --incompatible_depset_for_libraries_to_link_getter

GitHub tracking issue: https://github.com/bazelbuild/bazel/issues/8118

RELNOTES:none
PiperOrigin-RevId: 245747705
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
index 96236cb..8b34979 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
@@ -605,6 +605,20 @@
               + "only specifiable positionally (and not by keyword).")
   public boolean incompatibleRestrictNamedParams;
 
+  @Option(
+      name = "incompatible_depset_for_libraries_to_link_getter",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
+      effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+      },
+      help =
+          "When true, Bazel no longer returns a list from linking_context.libraries_to_link but "
+              + "returns a depset instead.")
+  public boolean incompatibleDepsetForLibrariesToLinkGetter;
+
   /** Constructs a {@link StarlarkSemantics} object corresponding to this set of option values. */
   public StarlarkSemantics toSkylarkSemantics() {
     return StarlarkSemantics.builder()
@@ -654,6 +668,7 @@
         .incompatibleStringJoinRequiresStrings(incompatibleStringJoinRequiresStrings)
         .internalSkylarkFlagTestCanary(internalSkylarkFlagTestCanary)
         .incompatibleDoNotSplitLinkingCmdline(incompatibleDoNotSplitLinkingCmdline)
+        .incompatibleDepsetForLibrariesToLinkGetter(incompatibleDepsetForLibrariesToLinkGetter)
         .build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
index 73315f1..9b868a8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLink.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
+import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -61,7 +62,7 @@
   }
 
   /** Structure of CcLinkingContext. */
-  public static class CcLinkingContext implements CcLinkingContextApi<Artifact, LibraryToLink> {
+  public static class CcLinkingContext implements CcLinkingContextApi<Artifact> {
     public static final CcLinkingContext EMPTY = builder().build();
 
     /** A list of link options contributed by a single configured target/aspect. */
@@ -289,8 +290,12 @@
     }
 
     @Override
-    public SkylarkList<LibraryToLink> getSkylarkLibrariesToLink() {
-      return SkylarkList.createImmutable(libraries.toList());
+    public Object getSkylarkLibrariesToLink(Environment environment) {
+      if (environment.getSemantics().incompatibleDepsetForLibrariesToLinkGetter()) {
+        return SkylarkNestedSet.of(LibraryToLink.class, libraries);
+      } else {
+        return SkylarkList.createImmutable(libraries.toList());
+      }
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
index 7df8f2a..dac4d87 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
@@ -44,7 +44,7 @@
         CompilationOutputsT extends CcCompilationOutputsApi<FileT>,
         LinkingOutputsT extends CcLinkingOutputsApi<FileT>,
         LibraryToLinkT extends LibraryToLinkApi<FileT>,
-        LinkingContextT extends CcLinkingContextApi<FileT, LibraryToLinkT>,
+        LinkingContextT extends CcLinkingContextApi<FileT>,
         CcToolchainVariablesT extends CcToolchainVariablesApi,
         CcToolchainConfigInfoT extends CcToolchainConfigInfoApi>
     extends CcModuleApi<
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
index 023de9c..18ebafc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
@@ -34,8 +34,7 @@
           ? extends CcCompilationOutputsApi<? extends FileApi>,
           ? extends CcLinkingOutputsApi<? extends FileApi>,
           ? extends LibraryToLinkApi<? extends FileApi>,
-          ? extends
-              CcLinkingContextApi<? extends FileApi, ? extends LibraryToLinkApi<? extends FileApi>>,
+          ? extends CcLinkingContextApi<? extends FileApi>,
           ? extends CcToolchainVariablesApi,
           ? extends CcToolchainConfigInfoApi>
       ccModule;
@@ -51,9 +50,7 @@
               ? extends CcCompilationOutputsApi<? extends FileApi>,
               ? extends CcLinkingOutputsApi<? extends FileApi>,
               ? extends LibraryToLinkApi<? extends FileApi>,
-              ? extends
-                  CcLinkingContextApi<
-                      ? extends FileApi, ? extends LibraryToLinkApi<? extends FileApi>>,
+              ? extends CcLinkingContextApi<? extends FileApi>,
               ? extends CcToolchainVariablesApi,
               ? extends CcToolchainConfigInfoApi>
           ccModule) {
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
index 318d327..34671f4 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
@@ -28,8 +29,7 @@
     doc =
         "Immutable store of information needed for C++ linking that is aggregated across "
             + "dependencies.")
-public interface CcLinkingContextApi<
-    FileT extends FileApi, LibraryToLinkT extends LibraryToLinkApi<FileT>> {
+public interface CcLinkingContextApi<FileT extends FileApi> {
   @SkylarkCallable(
       name = "user_link_flags",
       doc = "Returns the list of user link flags passed as strings.",
@@ -38,13 +38,16 @@
 
   @SkylarkCallable(
       name = "libraries_to_link",
-      doc = "Returns the list of <code>LibraryToLink</code>.",
-      structField = true)
-  SkylarkList<LibraryToLinkT> getSkylarkLibrariesToLink();
+      doc =
+          "Returns the depset of <code>LibraryToLink</code>. May return a list but this is"
+              + "deprecated. See #8118.",
+      structField = true,
+      useEnvironment = true)
+  Object getSkylarkLibrariesToLink(Environment environment);
 
   @SkylarkCallable(
       name = "additional_inputs",
-      doc = "Returns the list of additional inputs, e.g.: linker scripts.",
+      doc = "Returns the depset of additional inputs, e.g.: linker scripts.",
       structField = true)
   SkylarkNestedSet getSkylarkNonCodeInputs();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
index 6778ce9..5b1909f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -200,6 +200,8 @@
 
   public abstract boolean incompatibleDoNotSplitLinkingCmdline();
 
+  public abstract boolean incompatibleDepsetForLibrariesToLinkGetter();
+
   /** Returns a {@link Builder} initialized with the values of this instance. */
   public abstract Builder toBuilder();
 
@@ -256,6 +258,7 @@
           .incompatibleStringJoinRequiresStrings(false)
           .internalSkylarkFlagTestCanary(false)
           .incompatibleDoNotSplitLinkingCmdline(false)
+          .incompatibleDepsetForLibrariesToLinkGetter(false)
           .build();
 
   /** Builder for {@link StarlarkSemantics}. All fields are mandatory. */
@@ -346,6 +349,8 @@
 
     public abstract Builder incompatibleDoNotSplitLinkingCmdline(boolean value);
 
+    public abstract Builder incompatibleDepsetForLibrariesToLinkGetter(boolean value);
+
     public abstract StarlarkSemantics build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index d3fa42e..276f497 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -51,7 +51,7 @@
         CcCompilationOutputsApi<FileApi>,
         CcLinkingOutputsApi<FileApi>,
         LibraryToLinkApi<FileApi>,
-        CcLinkingContextApi<FileApi, LibraryToLinkApi<FileApi>>,
+        CcLinkingContextApi<FileApi>,
         CcToolchainVariablesApi,
         CcToolchainConfigInfoApi> {
 
@@ -199,7 +199,7 @@
       CcToolchainProviderApi<FeatureConfigurationApi> skylarkCcToolchainProvider,
       CcCompilationOutputsApi<FileApi> compilationOutputs,
       SkylarkList<String> userLinkFlags,
-      SkylarkList<CcLinkingContextApi<FileApi, LibraryToLinkApi<FileApi>>> ccLinkingContextApis,
+      SkylarkList<CcLinkingContextApi<FileApi>> ccLinkingContextApis,
       String name,
       String language,
       boolean alwayslink,
@@ -221,7 +221,7 @@
       CcToolchainProviderApi<FeatureConfigurationApi> skylarkCcToolchainProvider,
       CcCompilationOutputsApi<FileApi> compilationOutputs,
       SkylarkList<String> userLinkFlags,
-      SkylarkList<CcLinkingContextApi<FileApi, LibraryToLinkApi<FileApi>>> linkingContexts,
+      SkylarkList<CcLinkingContextApi<FileApi>> linkingContexts,
       String name,
       String language,
       String outputType,