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,