Skip to content

py_proto_library rule not using prebuilt protoc #28028

@ninepints

Description

@ninepints

What version of protobuf and what language are you using?
Version: 35.1
Language: Python

What supported operating system version are you using (e.g. Linux, Windows) ?
macOS 26.5.1

What supported runtime / compiler version are you using (e.g. python version, gcc version)
Bazel 9.1.0
rules_python 2.0.0
Python 3.13 toolchain from rules_python

What did you do?

I have what I think is a pretty vanilla Bazel/Python/Protobuf configuration, and I'm trying to use the recently-released support for prebuilt protobuf compiler binaries. It's not working - trying to build a py_proto_library rule results in the protobuf compiler being built from source.

To debug, I ran bazel cquery 'somepath("//my_project/proto:my_py_proto", "@protobuf//src/google/protobuf")' which gave me the following dependency chain:

//my_project/proto:my_py_proto
@protobuf//python:python_toolchain
@protobuf//python:protobuf_python
@protobuf//python:python_srcs
@protobuf//python:python_src_files
@protobuf//python:google/protobuf/internal/python_edition_defaults.py
@protobuf//python:embedded_python_edition_defaults_generate
@protobuf//editions:internal_defaults_escape
@protobuf//src/google/protobuf:protobuf

My uneducated guess at narrowing down the problem is that @protobuf//python:python_toolchain is mis-resolving such that it depends on @protobuf//python:protobuf_python, which in turn depends on python_edition_defaults.py, in turn generated from C++ stuff. I would expect the dependency chain to stop after python_toolchain. To the extent that Python sources are needed to compile my protos, I'd expect them to be part of the prebuilt compiler distribution, and to the extent they're needed at runtime I'd expect to get them from PyPI. But my convictions aren't very strong here, maybe I'm doing something obviously wrong?

For good measure I also tried

bazel build //my_project/proto:my_py_proto \
  --'@protobuf//bazel/flags:prefer_prebuilt_protoc' \
  --incompatible_enable_proto_toolchain_resolution

with the same result.

What did you expect to see

Prebuilt compiler used, compiler not built from source

What did you see instead?

Compiler built from source

Anything else we should know about your project / environment

I have some gross workarounds in my BUILD files to relocate the proto Python modules going into the wheel I'm trying to build, but all of that is downstream of the py_proto_library rule and I wouldn't expect it to affect the proto library's upstream dependencies.

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions