From b2c6405c0c8b3c9e7ed6bea8ec3225aedbb27598 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 10 Apr 2023 12:25:19 -0700 Subject: [PATCH] python: port PyCcLinkParamsProvider to Starlark and enable it. Because providers are based on identity, and there are Java tests that need to reference the provider, it's hard to split up the changes, so it's all in a single change. The Java class is kept to make usage by the Java tests easier; it isn't actually used outside of tests. Work towards #15897 PiperOrigin-RevId: 523182610 Change-Id: I6e07cf55ba08bb87c5ccb6cd37b473ed6aeeb760 --- .../bazel/rules/BazelRuleClassProvider.java | 4 +- .../lib/rules/cpp/GoogleLegacyStubs.java | 13 ------- .../devtools/build/lib/rules/python/BUILD | 1 - .../build/lib/rules/python/PyBuiltins.java | 17 --------- .../rules/python/PyCcLinkParamsProvider.java | 37 ++++++++++++------- .../cpp/PyCcLinkParamsProviderApi.java | 37 ------------------- .../starlarkbuildapi/python/PyBootstrap.java | 8 +--- .../builtins_bzl/common/python/providers.bzl | 5 +-- .../common/python/py_executable.bzl | 3 +- .../common/python/py_internal.bzl | 1 - .../builtins_bzl/common/python/py_library.bzl | 3 +- 11 files changed, 32 insertions(+), 97 deletions(-) delete mode 100644 src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyCcLinkParamsProviderApi.java diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index e0b68c2a4a5009..a0060156292012 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -112,7 +112,6 @@ import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule; import com.google.devtools.build.lib.rules.proto.ProtoConfiguration; import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule; -import com.google.devtools.build.lib.rules.python.PyCcLinkParamsProvider; import com.google.devtools.build.lib.rules.python.PyInfo; import com.google.devtools.build.lib.rules.python.PyRuleClasses.PySymlink; import com.google.devtools.build.lib.rules.python.PyRuntimeRule; @@ -476,8 +475,7 @@ public void init(ConfiguredRuleClassProvider.Builder builder) { PyInfo.PROVIDER, PyStarlarkTransitions.INSTANCE, new GoogleLegacyStubs.PyWrapCcHelper(), - new GoogleLegacyStubs.PyWrapCcInfoProvider(), - PyCcLinkParamsProvider.PROVIDER)); + new GoogleLegacyStubs.PyWrapCcInfoProvider())); builder.addSymlinkDefinition(PySymlink.PY2); builder.addSymlinkDefinition(PySymlink.PY3); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java index b79bfd284d0f4c..7e5f6708226b67 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java @@ -24,7 +24,6 @@ import com.google.devtools.build.lib.starlarkbuildapi.cpp.CompilationInfoApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.CppConfigurationApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.FeatureConfigurationApi; -import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyCcLinkParamsProviderApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcHelperApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcInfoApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.WrapCcHelperApi; @@ -210,16 +209,4 @@ public void repr(Printer printer) { printer.append(""); } } - - /** - * Fake no-op implementation of {@link PyCcLinkParamsProviderApi.Provider}. This implementation - * should be unreachable without (discouraged) use of --experimental_google_legacy_api. - */ - public static class PyCcLinkParamsProvider implements PyCcLinkParamsProviderApi.Provider { - - @Override - public void repr(Printer printer) { - printer.append(""); - } - } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/BUILD b/src/main/java/com/google/devtools/build/lib/rules/python/BUILD index feeb07a59f4771..49f7aa4a654365 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/python/BUILD @@ -47,7 +47,6 @@ java_library( "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", - "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp", "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:filetype", diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyBuiltins.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyBuiltins.java index 706a79bae0033d..1a91ce17311688 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyBuiltins.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyBuiltins.java @@ -40,7 +40,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.StarlarkProvider; -import com.google.devtools.build.lib.rules.cpp.CcInfo; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.OS; import com.google.devtools.build.lib.vfs.PathFragment; @@ -93,22 +92,6 @@ public boolean regexMatch(String subject, String pattern) { return subject.matches(pattern); } - @StarlarkMethod( - name = "new_py_cc_link_params_provider", - doc = "Creates a PyCcLinkParamsProvder.", - parameters = { - @Param( - name = "cc_info", - positional = false, - named = true, - defaultValue = "unbound", - doc = "The CcInfo whose linking context to propagate; other information is discarded"), - }, - useStarlarkThread = false) - public PyCcLinkParamsProvider newPyCcLinkParamsProvider(CcInfo ccInfo) { - return new PyCcLinkParamsProvider(ccInfo); - } - @StarlarkMethod( name = "get_legacy_external_runfiles", doc = "Get the --legacy_external_runfiles flag value", diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java index 9a0464e53d6bca..e8053fe99274d1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java @@ -13,40 +13,51 @@ // limitations under the License. package com.google.devtools.build.lib.rules.python; -import com.google.devtools.build.lib.actions.Artifact; +import com.google.common.annotations.VisibleForTesting; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.packages.BuiltinProvider; -import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.packages.Info; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; +import com.google.devtools.build.lib.packages.StarlarkInfo; +import com.google.devtools.build.lib.packages.StarlarkProviderWrapper; import com.google.devtools.build.lib.rules.cpp.CcInfo; -import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyCcLinkParamsProviderApi; +import net.starlark.java.eval.EvalException; /** A target that provides C++ libraries to be linked into Python targets. */ +@VisibleForTesting @Immutable -public final class PyCcLinkParamsProvider extends NativeInfo - implements PyCcLinkParamsProviderApi { +public final class PyCcLinkParamsProvider { public static final Provider PROVIDER = new Provider(); private final CcInfo ccInfo; - public PyCcLinkParamsProvider(CcInfo ccInfo) { - this.ccInfo = CcInfo.builder().setCcLinkingContext(ccInfo.getCcLinkingContext()).build(); + public PyCcLinkParamsProvider(StarlarkInfo info) throws EvalException { + this.ccInfo = info.getValue("cc_info", CcInfo.class); } - @Override public Provider getProvider() { return PROVIDER; } - @Override public CcInfo getCcInfo() { return ccInfo; } /** Provider class for {@link PyCcLinkParamsProvider} objects. */ - public static class Provider extends BuiltinProvider - implements PyCcLinkParamsProviderApi.Provider { + public static class Provider extends StarlarkProviderWrapper { private Provider() { - super("PyCcLinkParamsProvider", PyCcLinkParamsProvider.class); + super( + Label.parseCanonicalUnchecked("@_builtins//:common/python/providers.bzl"), + "PyCcLinkParamsProvider"); + } + + @Override + public PyCcLinkParamsProvider wrap(Info value) throws RuleErrorException { + try { + return new PyCcLinkParamsProvider((StarlarkInfo) value); + } catch (EvalException e) { + throw new RuleErrorException(e.getMessageWithStack()); + } } } } diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyCcLinkParamsProviderApi.java deleted file mode 100644 index a29fdf74a44e14..00000000000000 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyCcLinkParamsProviderApi.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2019 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.starlarkbuildapi.cpp; - -import com.google.devtools.build.docgen.annot.DocCategory; -import com.google.devtools.build.lib.starlarkbuildapi.FileApi; -import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi; -import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi; -import net.starlark.java.annot.StarlarkBuiltin; -import net.starlark.java.annot.StarlarkMethod; - -/** A target that provides C++ libraries to be linked into Python targets. */ -@StarlarkBuiltin( - name = "PyCcLinkParamsProvider", - documented = false, - category = DocCategory.PROVIDER, - doc = "Wrapper for every C++ linking provider") -public interface PyCcLinkParamsProviderApi extends StructApi { - @StarlarkMethod(name = "cc_info", doc = "", structField = true, documented = false) - CcInfoApi getCcInfo(); - - /** Provider for PyCcLinkParamsProvider objects. */ - @StarlarkBuiltin(name = "Provider", doc = "", documented = false) - public interface Provider extends ProviderApi {} -} diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java index 221b00299bd64c..dd177236146677 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyBootstrap.java @@ -20,7 +20,6 @@ import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; import com.google.devtools.build.lib.starlarkbuildapi.core.Bootstrap; import com.google.devtools.build.lib.starlarkbuildapi.core.ContextAndFlagGuardedValue; -import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyCcLinkParamsProviderApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcHelperApi; import com.google.devtools.build.lib.starlarkbuildapi.cpp.PyWrapCcInfoApi; import com.google.devtools.build.lib.starlarkbuildapi.python.PyInfoApi.PyInfoProviderApi; @@ -40,19 +39,16 @@ public class PyBootstrap implements Bootstrap { private final PyStarlarkTransitionsApi pyStarlarkTransitionsApi; private final PyWrapCcHelperApi pyWrapCcHelper; private final PyWrapCcInfoApi.Provider pyWrapCcInfoProvider; - private final PyCcLinkParamsProviderApi.Provider pyCcLinkInfoParamsInfoProvider; public PyBootstrap( PyInfoProviderApi pyInfoProviderApi, PyStarlarkTransitionsApi pyStarlarkTransitionsApi, PyWrapCcHelperApi pyWrapCcHelper, - PyWrapCcInfoApi.Provider pyWrapCcInfoProvider, - PyCcLinkParamsProviderApi.Provider pyCcLinkInfoParamsInfoProvider) { + PyWrapCcInfoApi.Provider pyWrapCcInfoProvider) { this.pyInfoProviderApi = pyInfoProviderApi; this.pyStarlarkTransitionsApi = pyStarlarkTransitionsApi; this.pyWrapCcHelper = pyWrapCcHelper; this.pyWrapCcInfoProvider = pyWrapCcInfoProvider; - this.pyCcLinkInfoParamsInfoProvider = pyCcLinkInfoParamsInfoProvider; } @Override @@ -88,7 +84,7 @@ public void addBindingsToBuilder(ImmutableMap.Builder builder) { "PyCcLinkParamsProvider", ContextAndFlagGuardedValue.onlyInAllowedReposOrWhenIncompatibleFlagIsFalse( BuildLanguageOptions.INCOMPATIBLE_STOP_EXPORTING_LANGUAGE_MODULES, - pyCcLinkInfoParamsInfoProvider, + Starlark.NONE, allowedRepositories)); } } diff --git a/src/main/starlark/builtins_bzl/common/python/providers.bzl b/src/main/starlark/builtins_bzl/common/python/providers.bzl index 00c1fb6e672f14..317a9711e43ee1 100644 --- a/src/main/starlark/builtins_bzl/common/python/providers.bzl +++ b/src/main/starlark/builtins_bzl/common/python/providers.bzl @@ -199,7 +199,7 @@ def _PyCcLinkParamsProvider_init(cc_info): } # buildifier: disable=name-conventions -StarlarkPyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = provider( +PyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = provider( doc = ("Python-wrapper to forward CcInfo.linking_context. This is to " + "allow Python targets to propagate C++ linking information, but " + "without the Python target appearing to be a valid C++ rule dependency"), @@ -208,6 +208,3 @@ StarlarkPyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = pr "cc_info": "A CcInfo instance; it has only linking_context set", }, ) - -# TODO(b/203567235): Re-implement in Starlark -PyCcLinkParamsProvider = _builtins.toplevel.PyCcLinkParamsProvider # buildifier: disable=name-conventions diff --git a/src/main/starlark/builtins_bzl/common/python/py_executable.bzl b/src/main/starlark/builtins_bzl/common/python/py_executable.bzl index 19396341f8d978..8b7e26e3eae49f 100644 --- a/src/main/starlark/builtins_bzl/common/python/py_executable.bzl +++ b/src/main/starlark/builtins_bzl/common/python/py_executable.bzl @@ -38,6 +38,7 @@ load( ) load( ":common/python/providers.bzl", + "PyCcLinkParamsProvider", "PyRuntimeInfo", ) load( @@ -758,7 +759,7 @@ def _create_providers( # are cleaned up. if cc_info: providers.append( - _py_builtins.new_py_cc_link_params_provider(cc_info = cc_info), + PyCcLinkParamsProvider(cc_info = cc_info), ) py_info, deps_transitive_sources = create_py_info( diff --git a/src/main/starlark/builtins_bzl/common/python/py_internal.bzl b/src/main/starlark/builtins_bzl/common/python/py_internal.bzl index 49467a019669a1..e53303a2be6d8e 100644 --- a/src/main/starlark/builtins_bzl/common/python/py_internal.bzl +++ b/src/main/starlark/builtins_bzl/common/python/py_internal.bzl @@ -39,5 +39,4 @@ py_internal = struct( is_singleton_depset = _py_builtins.is_singleton_depset, make_runfiles_respect_legacy_external_runfiles = _py_builtins.make_runfiles_respect_legacy_external_runfiles, merge_runfiles_with_generated_inits_empty_files_supplier = _py_builtins.merge_runfiles_with_generated_inits_empty_files_supplier, - new_py_cc_link_params_provider = _py_builtins.new_py_cc_link_params_provider, ) diff --git a/src/main/starlark/builtins_bzl/common/python/py_library.bzl b/src/main/starlark/builtins_bzl/common/python/py_library.bzl index 095b28b66c07ce..e14492792486f5 100644 --- a/src/main/starlark/builtins_bzl/common/python/py_library.bzl +++ b/src/main/starlark/builtins_bzl/common/python/py_library.bzl @@ -32,6 +32,7 @@ load( "filter_to_py_srcs", "union_attrs", ) +load(":common/python/providers.bzl", "PyCcLinkParamsProvider") _py_builtins = _builtins.internal.py_builtins @@ -76,7 +77,7 @@ def py_library_impl(ctx, *, semantics): DefaultInfo(files = output_sources, runfiles = runfiles), py_info, create_instrumented_files_info(ctx), - _py_builtins.new_py_cc_link_params_provider(cc_info = cc_info), + PyCcLinkParamsProvider(cc_info = cc_info), create_output_group_info(py_info.transitive_sources, extra_groups = {}), ]