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 = {}), ]