blob: ee765ab4c60be0a2d49fb7696529ac3e0ef3cc85 [file] [log] [blame]
Adam Cozzette9df1d762023-09-20 16:52:54 -07001# Protobuf Python runtime
2#
3# See also code generation logic under /src/google/protobuf/compiler/python.
4#
5# Most users should depend upon public aliases in the root:
6# //:protobuf_python
7# //:well_known_types_py_pb2
8
aiuto3ab12762024-02-13 09:06:30 -08009load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix")
Adam Cozzette9df1d762023-09-20 16:52:54 -070010load("@rules_python//python:defs.bzl", "py_library")
11load("//:protobuf.bzl", "internal_py_proto_library")
Protobuf Team Bot8257c442024-04-10 00:33:05 -070012load("//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain")
Adam Cozzette9df1d762023-09-20 16:52:54 -070013load("//build_defs:arch_tests.bzl", "aarch64_test", "x86_64_test")
14load("//build_defs:cpp_opts.bzl", "COPTS")
15load("//conformance:defs.bzl", "conformance_test")
Mike Kruskalea810242024-04-16 11:11:03 -070016load("//editions:defaults.bzl", "compile_edition_defaults", "embed_edition_defaults")
Adam Cozzette9df1d762023-09-20 16:52:54 -070017load(":internal.bzl", "internal_copy_files", "internal_py_test")
18
19def build_targets(name):
20 """
21 Declares the build targets of the //python package.
22
23 Args:
24 name: unused.
25 """
26 py_library(
27 name = "protobuf_python",
28 data = select({
29 "//conditions:default": [],
30 ":use_fast_cpp_protos": [
31 ":google/protobuf/internal/_api_implementation.so",
32 ":google/protobuf/pyext/_message.so",
33 ],
34 }),
35 visibility = ["//:__pkg__"],
36 deps = [
37 ":python_srcs",
38 ":well_known_types_py_pb2",
39 ],
40 )
41
42 native.config_setting(
43 name = "use_fast_cpp_protos",
44 values = {
45 "define": "use_fast_cpp_protos=true",
46 },
47 )
48
49 internal_py_proto_library(
50 name = "well_known_types_py_pb2",
51 srcs = [":copied_wkt_proto_files"],
52 include = ".",
53 default_runtime = "",
54 protoc = "//:protoc",
55 srcs_version = "PY2AND3",
56 visibility = [
57 "//:__pkg__",
Mike Kruskalea810242024-04-16 11:11:03 -070058 "//editions:__pkg__",
Adam Cozzette9df1d762023-09-20 16:52:54 -070059 "//upb:__subpackages__",
60 ],
61 )
62
63 internal_copy_files(
64 name = "copied_wkt_proto_files",
65 srcs = [
66 "//:well_known_type_protos",
67 "//src/google/protobuf:descriptor_proto_srcs",
68 "//src/google/protobuf/compiler:plugin.proto",
69 ],
70 strip_prefix = "src",
71 )
72
73 native.cc_binary(
74 name = "google/protobuf/internal/_api_implementation.so",
75 srcs = ["google/protobuf/internal/api_implementation.cc"],
76 copts = COPTS + [
77 "-DPYTHON_PROTO2_CPP_IMPL_V2",
78 ],
79 linkshared = 1,
80 linkstatic = 1,
81 tags = [
82 # Exclude this target from wildcard expansion (//...) because it may
83 # not even be buildable. It will be built if it is needed according
84 # to :use_fast_cpp_protos.
85 # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
86 "manual",
87 ],
88 deps = select({
89 "//conditions:default": [],
Marcelfbbe6812024-01-04 10:12:42 -080090 ":use_fast_cpp_protos": ["@system_python//:python_headers"],
Adam Cozzette9df1d762023-09-20 16:52:54 -070091 }),
92 )
93
94 native.config_setting(
95 name = "allow_oversize_protos",
96 values = {
97 "define": "allow_oversize_protos=true",
98 },
99 )
100
101 native.cc_binary(
102 name = "google/protobuf/pyext/_message.so",
103 srcs = native.glob([
104 "google/protobuf/pyext/*.cc",
105 "google/protobuf/pyext/*.h",
106 ]),
107 copts = COPTS + [
108 "-DGOOGLE_PROTOBUF_HAS_ONEOF=1",
109 ] + select({
110 "//conditions:default": [],
111 ":allow_oversize_protos": ["-DPROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS=1"],
112 }),
113 includes = ["."],
114 linkshared = 1,
115 linkstatic = 1,
116 tags = [
117 # Exclude this target from wildcard expansion (//...) because it may
118 # not even be buildable. It will be built if it is needed according
119 # to :use_fast_cpp_protos.
120 # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
121 "manual",
122 ],
123 deps = [
124 ":proto_api",
Adam Cozzettea7b04212024-01-03 15:17:41 -0800125 "//src/google/protobuf",
126 "//src/google/protobuf:port",
127 "//src/google/protobuf:protobuf_lite",
128 "//src/google/protobuf/io",
129 "//src/google/protobuf/io:tokenizer",
130 "//src/google/protobuf/stubs:lite",
131 "//src/google/protobuf/util:differencer",
132 "@com_google_absl//absl/container:flat_hash_map",
133 "@com_google_absl//absl/log:absl_check",
134 "@com_google_absl//absl/log:absl_log",
135 "@com_google_absl//absl/status",
136 "@com_google_absl//absl/strings",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700137 ] + select({
138 "//conditions:default": [],
Marcelfbbe6812024-01-04 10:12:42 -0800139 ":use_fast_cpp_protos": ["@system_python//:python_headers"],
Adam Cozzette9df1d762023-09-20 16:52:54 -0700140 }),
141 )
142
143 aarch64_test(
144 name = "aarch64_test",
145 bazel_binaries = [
146 "google/protobuf/internal/_api_implementation.so",
147 "google/protobuf/pyext/_message.so",
148 ],
149 )
150
151 x86_64_test(
152 name = "x86_64_test",
153 bazel_binaries = [
154 "google/protobuf/internal/_api_implementation.so",
155 "google/protobuf/pyext/_message.so",
156 ],
157 )
158
Mike Kruskal15eccf32023-11-07 14:37:40 -0800159 compile_edition_defaults(
160 name = "python_edition_defaults",
161 srcs = ["//:descriptor_proto"],
162 maximum_edition = "2023",
163 minimum_edition = "PROTO2",
164 )
165
166 embed_edition_defaults(
167 name = "embedded_python_edition_defaults_generate",
168 defaults = "python_edition_defaults",
169 output = "google/protobuf/internal/python_edition_defaults.py",
170 placeholder = "DEFAULTS_VALUE",
171 template = "google/protobuf/internal/python_edition_defaults.py.template",
172 )
173
174 native.filegroup(
175 name = "python_src_files",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700176 srcs = native.glob(
177 [
178 "google/protobuf/**/*.py",
179 ],
180 exclude = [
181 "google/protobuf/internal/*_test.py",
182 "google/protobuf/internal/test_util.py",
183 "google/protobuf/internal/import_test_package/__init__.py",
184 ],
Mike Kruskal15eccf32023-11-07 14:37:40 -0800185 ) + ["google/protobuf/internal/python_edition_defaults.py"],
186 )
187
188 py_library(
189 name = "python_srcs",
190 srcs = [":python_src_files"],
Adam Cozzette9df1d762023-09-20 16:52:54 -0700191 imports = ["python"],
192 srcs_version = "PY2AND3",
193 visibility = [
194 "//:__pkg__",
195 "//upb:__subpackages__",
196 ],
197 )
198
199 py_library(
200 name = "python_test_srcs",
201 srcs = native.glob([
202 "google/protobuf/internal/*_test.py",
203 ]) + [
204 "google/protobuf/internal/import_test_package/__init__.py",
205 "google/protobuf/internal/test_util.py",
206 "//python/google/protobuf/internal/numpy:__init__.py",
207 "//python/google/protobuf/internal/numpy:numpy_test.py",
208 ],
209 imports = ["python"],
210 srcs_version = "PY3",
211 visibility = [
212 "//:__pkg__",
213 "//upb:__subpackages__",
214 ],
215 )
216
217 ################################################################################
218 # Tests
219 ################################################################################
220
221 internal_copy_files(
222 name = "copied_test_proto_files",
223 testonly = 1,
224 srcs = [
225 "//:test_proto_srcs",
Sandy Zhang65c65c22024-01-22 09:54:16 -0800226 "//:test_proto_editions_srcs",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700227 "//src/google/protobuf/util:test_proto_srcs",
228 ],
229 strip_prefix = "src",
230 )
231
232 internal_copy_files(
Mike Kruskal15eccf32023-11-07 14:37:40 -0800233 name = "copied_conformance_test_files",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700234 testonly = 1,
235 srcs = [
236 "//src/google/protobuf:test_messages_proto2.proto",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700237 "//src/google/protobuf:test_messages_proto3.proto",
238 ],
239 strip_prefix = "src",
240 )
241
Protobuf Team Bot2fc70222024-02-08 11:01:09 -0800242 internal_copy_files(
243 name = "copied_test_dependency_proto_files",
244 srcs = [
245 "//src/google/protobuf:cpp_features_proto_srcs",
246 ],
247 strip_prefix = "src",
248 )
249
250 internal_py_proto_library(
251 name = "test_dependency_proto_py_pb2",
252 srcs = [":copied_test_dependency_proto_files"],
253 include = ".",
254 default_runtime = "",
255 protoc = "//:protoc",
256 srcs_version = "PY2AND3",
257 visibility = [
258 "//:__pkg__",
259 "//upb:__subpackages__",
260 ],
261 deps = [":well_known_types_py_pb2"],
262 )
263
Adam Cozzette9df1d762023-09-20 16:52:54 -0700264 internal_py_proto_library(
265 name = "python_common_test_protos",
266 testonly = 1,
267 srcs = [":copied_test_proto_files"],
268 include = ".",
269 default_runtime = "",
270 protoc = "//:protoc",
271 srcs_version = "PY2AND3",
272 visibility = ["//:__pkg__"],
Protobuf Team Bot2fc70222024-02-08 11:01:09 -0800273 deps = [":well_known_types_py_pb2", ":test_dependency_proto_py_pb2"],
Adam Cozzette9df1d762023-09-20 16:52:54 -0700274 )
275
276 internal_py_proto_library(
277 name = "python_specific_test_protos",
278 testonly = 1,
279 srcs = native.glob([
280 "google/protobuf/internal/*.proto",
281 "google/protobuf/internal/import_test_package/*.proto",
282 ]),
283 include = ".",
284 default_runtime = ":protobuf_python",
285 protoc = "//:protoc",
286 srcs_version = "PY2AND3",
287 visibility = ["//:__pkg__"],
288 deps = [":python_common_test_protos"],
289 )
290
291 internal_py_proto_library(
Mike Kruskal15eccf32023-11-07 14:37:40 -0800292 name = "conformance_test_py_proto",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700293 testonly = 1,
Mike Kruskal15eccf32023-11-07 14:37:40 -0800294 srcs = [":copied_conformance_test_files"],
Adam Cozzette9df1d762023-09-20 16:52:54 -0700295 include = ".",
296 default_runtime = "//:protobuf_python",
297 protoc = "//:protoc",
298 visibility = [
299 "//conformance:__pkg__",
300 "//python:__subpackages__",
301 ],
302 deps = [":well_known_types_py_pb2"],
303 )
304
305 py_library(
306 name = "python_test_lib",
307 testonly = 1,
308 srcs = [
309 "google/protobuf/internal/import_test_package/__init__.py",
310 "google/protobuf/internal/test_util.py",
311 ],
312 imports = ["python"],
313 srcs_version = "PY2AND3",
314 visibility = ["//python:__subpackages__"],
315 deps = [
316 ":protobuf_python",
317 ":python_common_test_protos",
318 ":python_specific_test_protos",
319 ],
320 )
321
322 internal_py_test(
323 name = "descriptor_database_test",
324 srcs = ["google/protobuf/internal/descriptor_database_test.py"],
325 )
326
327 internal_py_test(
328 name = "descriptor_pool_test",
329 srcs = ["google/protobuf/internal/descriptor_pool_test.py"],
330 )
331
332 internal_py_test(
333 name = "descriptor_test",
334 srcs = ["google/protobuf/internal/descriptor_test.py"],
335 )
336
337 internal_py_test(
338 name = "field_mask_test",
339 srcs = ["google/protobuf/internal/field_mask_test.py"],
340 )
341
342 internal_py_test(
343 name = "generator_test",
344 srcs = ["google/protobuf/internal/generator_test.py"],
345 )
346
347 internal_py_test(
348 name = "import_test",
349 srcs = ["google/protobuf/internal/import_test.py"],
350 )
351
352 internal_py_test(
353 name = "json_format_test",
354 srcs = ["google/protobuf/internal/json_format_test.py"],
355 )
356
357 internal_py_test(
358 name = "keywords_test",
359 srcs = ["google/protobuf/internal/keywords_test.py"],
360 )
361
362 internal_py_test(
363 name = "message_factory_test",
364 srcs = ["google/protobuf/internal/message_factory_test.py"],
365 )
366
367 internal_py_test(
368 name = "message_test",
369 srcs = ["google/protobuf/internal/message_test.py"],
370 data = ["//src/google/protobuf:testdata"],
371 )
372
373 internal_py_test(
374 name = "proto_builder_test",
375 srcs = ["google/protobuf/internal/proto_builder_test.py"],
376 )
377
378 internal_py_test(
379 name = "reflection_test",
380 srcs = ["google/protobuf/internal/reflection_test.py"],
381 )
382
383 internal_py_test(
384 name = "service_reflection_test",
385 srcs = ["google/protobuf/internal/service_reflection_test.py"],
386 )
387
388 internal_py_test(
389 name = "symbol_database_test",
390 srcs = ["google/protobuf/internal/symbol_database_test.py"],
391 )
392
393 internal_py_test(
394 name = "text_encoding_test",
395 srcs = ["google/protobuf/internal/text_encoding_test.py"],
396 )
397
398 internal_py_test(
399 name = "text_format_test",
400 srcs = ["google/protobuf/internal/text_format_test.py"],
401 data = ["//src/google/protobuf:testdata"],
402 )
403
404 internal_py_test(
405 name = "unknown_fields_test",
406 srcs = ["google/protobuf/internal/unknown_fields_test.py"],
407 )
408
409 internal_py_test(
410 name = "well_known_types_test",
411 srcs = ["google/protobuf/internal/well_known_types_test.py"],
412 )
413
414 internal_py_test(
Jie Luo3a9f0742024-05-29 12:33:23 -0700415 name = "decoder_test",
416 srcs = ["google/protobuf/internal/decoder_test.py"],
417 )
418
419 internal_py_test(
Adam Cozzette9df1d762023-09-20 16:52:54 -0700420 name = "wire_format_test",
421 srcs = ["google/protobuf/internal/wire_format_test.py"],
422 )
423
Jie Luoe7fdab42024-05-10 13:55:08 -0700424 internal_py_test(
425 name = "proto_test",
426 srcs = ["google/protobuf/internal/proto_test.py"],
427 )
428
Jie Luo6c91de92024-05-16 12:21:01 -0700429 internal_py_test(
430 name = "proto_json_test",
431 srcs = ["google/protobuf/internal/proto_json_test.py"],
432 )
433
Adam Cozzette9df1d762023-09-20 16:52:54 -0700434 native.cc_library(
435 name = "proto_api",
436 hdrs = ["google/protobuf/proto_api.h"],
437 visibility = ["//visibility:public"],
438 deps = [
Marcelfbbe6812024-01-04 10:12:42 -0800439 "@system_python//:python_headers",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700440 ],
441 )
442
443 internal_py_test(
444 name = "python_version_test",
445 srcs = ["python_version_test.py"],
446 )
447
448 conformance_test(
449 name = "conformance_test",
450 env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "python"},
451 failure_list = "//conformance:failure_list_python.txt",
452 target_compatible_with = select({
453 "@system_python//:none": ["@platforms//:incompatible"],
454 ":use_fast_cpp_protos": ["@platforms//:incompatible"],
455 "//conditions:default": [],
456 }),
Mike Kruskal15eccf32023-11-07 14:37:40 -0800457 maximum_edition = "2023",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700458 testee = "//conformance:conformance_python",
459 text_format_failure_list = "//conformance:text_format_failure_list_python.txt",
460 )
461
462 # Note: this requires --define=use_fast_cpp_protos=true
463 conformance_test(
464 name = "conformance_test_cpp",
465 env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "cpp"},
466 failure_list = "//conformance:failure_list_python.txt",
467 target_compatible_with = select({
468 "@system_python//:none": ["@platforms//:incompatible"],
469 ":use_fast_cpp_protos": [],
470 "//conditions:default": ["@platforms//:incompatible"],
471 }),
Mike Kruskal15eccf32023-11-07 14:37:40 -0800472 maximum_edition = "2023",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700473 testee = "//conformance:conformance_python",
474 text_format_failure_list = "//conformance:text_format_failure_list_python_cpp.txt",
475 )
476
Mike Kruskalc23d5332023-11-10 15:18:00 -0800477 conformance_test(
478 name = "conformance_test_upb",
479 env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "upb"},
480 failure_list = "//conformance:failure_list_python_upb.txt",
481 target_compatible_with = select({
482 "@system_python//:none": ["@platforms//:incompatible"],
483 ":use_fast_cpp_protos": ["@platforms//:incompatible"],
484 "//conditions:default": [],
485 }),
486 maximum_edition = "2023",
487 testee = "//conformance:conformance_python",
488 text_format_failure_list = "//conformance:text_format_failure_list_python_upb.txt",
489 )
490
Adam Cozzette9df1d762023-09-20 16:52:54 -0700491 ################################################################################
492 # Distribution files
493 ################################################################################
494
495 pkg_files(
496 name = "python_source_files",
Mike Kruskal15eccf32023-11-07 14:37:40 -0800497 srcs = [
498 ":python_src_files",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700499 "README.md",
500 "google/__init__.py",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700501 ],
502 strip_prefix = "",
Adam Cozzette501ecec2023-09-26 14:36:20 -0700503 visibility = ["//python/dist:__pkg__"],
Adam Cozzette9df1d762023-09-20 16:52:54 -0700504 )
505
506 pkg_files(
507 name = "dist_files",
508 srcs = native.glob([
509 "google/**/*.proto",
510 "google/**/*.py",
511 "google/protobuf/internal/*.cc",
512 "google/protobuf/pyext/*.cc",
513 "google/protobuf/pyext/*.h",
514 ]) + [
Adam Cozzette7e0e8ef2023-11-06 08:58:37 -0800515 "BUILD.bazel",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700516 "MANIFEST.in",
517 "README.md",
Adam Cozzette501ecec2023-09-26 14:36:20 -0700518 "build_targets.bzl",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700519 "google/protobuf/proto_api.h",
520 "google/protobuf/pyext/README",
521 "google/protobuf/python_protobuf.h",
522 "internal.bzl",
523 "python_version_test.py",
Adam Cozzette9df1d762023-09-20 16:52:54 -0700524 ],
525 strip_prefix = strip_prefix.from_root(""),
526 visibility = ["//pkg:__pkg__"],
527 )
Protobuf Team Bot8257c442024-04-10 00:33:05 -0700528
529 proto_lang_toolchain(
530 name = "python_toolchain",
531 command_line = "--python_out=%s",
532 progress_message = "Generating Python proto_library %{label}",
533 runtime = ":protobuf_python",
534 # NOTE: This isn't *actually* public. It's an implicit dependency of py_proto_library,
535 # so must be public so user usages of the rule can reference it.
536 visibility = ["//visibility:public"],
537 )