# Copyright (c) 2009-2022, Google LLC # All rights reserved. # # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file or at # https://developers.google.com/open-source/licenses/bsd load("@pip_deps//:requirements.bzl", "requirement") load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") load("@rules_pkg//:pkg.bzl", "pkg_tar") load("@rules_python//python:packaging.bzl", "py_wheel") load("@system_python//:version.bzl", "SYSTEM_PYTHON_VERSION") load("//:protobuf_version.bzl", "PROTOBUF_PYTHON_VERSION") load("//bazel:py_proto_library.bzl", "py_proto_library") load("@bazel_skylib//lib:selects.bzl", "selects") load(":dist.bzl", "py_dist", "py_dist_module") licenses(["notice"]) py_dist_module( name = "message_mod", extension = "//python:_message_binary", module_name = "google._upb._message", ) py_proto_library( name = "well_known_proto_py_pb2", deps = [ "//:any_proto", "//:api_proto", "//:descriptor_proto", "//:duration_proto", "//:empty_proto", "//:field_mask_proto", "//:source_context_proto", "//:struct_proto", "//:timestamp_proto", "//:type_proto", "//:wrappers_proto", ], ) py_proto_library( name = "plugin_py_pb2", deps = ["//:compiler_plugin_proto"], ) config_setting( name = "linux_aarch64_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "linux-aarch_64"}, ) config_setting( name = "linux_aarch64_local", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:aarch64", ], flag_values = { "//toolchain:release": "False", }, ) config_setting( name = "linux_x86_64_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "linux-x86_64"}, ) config_setting( name = "linux_x86_64_local", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:x86_64", ], flag_values = { "//toolchain:release": "False", }, ) config_setting( name = "osx_x86_64_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "osx-x86_64"}, ) config_setting( name = "osx_x86_64_local", constraint_values = [ "@platforms//os:osx", "@platforms//cpu:x86_64", ], flag_values = { "//toolchain:release": "False", }, ) selects.config_setting_group( name = "osx_x86_64", match_any = [ ":osx_x86_64_release", ":osx_x86_64_local", ], ) config_setting( name = "osx_aarch64_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "osx-aarch_64"}, ) config_setting( name = "osx_aarch64_local", constraint_values = [ "@platforms//os:osx", "@platforms//cpu:aarch64", ], flag_values = { "//toolchain:release": "False", }, ) selects.config_setting_group( name = "osx_aarch64", match_any = [ ":osx_aarch64_release", ":osx_aarch64_local", ], ) config_setting( name = "osx_universal2", values = {"cpu": "osx-universal2"}, ) config_setting( name = "windows_x86_32_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "win32"}, ) config_setting( name = "windows_x86_32_local", constraint_values = [ "@platforms//os:windows", "@platforms//cpu:x86_32", ], flag_values = { "//toolchain:release": "False", }, ) selects.config_setting_group( name = "windows_x86_32", match_any = [ ":windows_x86_32_release", ":windows_x86_32_local", ], ) config_setting( name = "windows_x86_64_release", flag_values = { "//toolchain:release": "True", }, values = {"cpu": "win64"}, ) config_setting( name = "windows_x86_64_local", constraint_values = [ "@platforms//os:windows", "@platforms//cpu:x86_64", ], flag_values = { "//toolchain:release": "False", }, ) selects.config_setting_group( name = "windows_x86_64", match_any = [ ":windows_x86_64_release", ":windows_x86_64_local", ], ) pkg_files( name = "generated_wkt", srcs = [ ":well_known_proto_py_pb2", "//upb:descriptor_upb_minitable_proto", "//upb:descriptor_upb_proto", "//upb:descriptor_upb_proto_reflection", ], prefix = "google/protobuf", ) pkg_files( name = "generated_wkt_compiler", srcs = [ ":plugin_py_pb2", ], prefix = "google/protobuf/compiler", ) pkg_files( name = "utf8_range_source_files", srcs = ["//third_party/utf8_range:utf8_range_srcs"], prefix = "utf8_range", ) pkg_files( name = "dist_source_files", srcs = [ "MANIFEST.in", "setup.py", ], ) # Passing filegroups to pkg_tar directly results in incorrect # `protobuf/external/upb/` directory structure when built from the protobuf # repo. This can be removed once repositories are merged. pkg_files( name = "filegroup_source_files", srcs = [ "//:LICENSE", "//python:message_srcs", "//upb:source_files", "//upb/base:source_files", "//upb/collections:source_files", "//upb/hash:source_files", "//upb/lex:source_files", "//upb/mem:source_files", "//upb/message:source_files", "//upb/mini_descriptor:source_files", "//upb/mini_table:source_files", "//upb/port:source_files", "//upb/reflection:source_files", "//upb/text:source_files", "//upb/util:source_files", "//upb/wire:source_files", ], strip_prefix = strip_prefix.from_root(""), ) # NOTE: This package currently only works for macos and ubuntu, MSVC users # should use a binary wheel. pkg_tar( name = "source_tarball", srcs = [ ":dist_source_files", ":filegroup_source_files", ":generated_wkt", ":generated_wkt_compiler", ":utf8_range_source_files", "//python:python_source_files", ], extension = "tar.gz", package_dir = "protobuf", package_file_name = "protobuf.tar.gz", strip_prefix = ".", target_compatible_with = select({ "@system_python//:none": ["@platforms//:incompatible"], "//conditions:default": [], }), ) genrule( name = "source_wheel", srcs = [":source_tarball"], outs = ["protobuf-%s.tar.gz" % PROTOBUF_PYTHON_VERSION], cmd = """ export PYTHONPATH=$$PWD/external/pip_deps_setuptools/site-packages set -eux tar -xzvf $(location :source_tarball) cd protobuf/ python3 setup.py sdist cd .. mv protobuf/dist/*.tar.gz $@ """, target_compatible_with = select({ "@system_python//:none": ["@platforms//:incompatible"], "//conditions:default": [], }), tools = [requirement("setuptools")], ) py_wheel( name = "binary_wheel", abi = select({ "//python:full_api_3.8": "cp38", "//python:full_api_3.9": "cp39", "//conditions:default": "abi3", }), author = "protobuf@googlegroups.com", author_email = "protobuf@googlegroups.com", classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ], distribution = "protobuf", extra_distinfo_files = { "//:LICENSE": "LICENSE", }, homepage = "https://developers.google.com/protocol-buffers/", license = "3-Clause BSD License", platform = select({ ":linux_x86_64_local": "linux_x86_64", ":linux_x86_64_release": "manylinux2014_x86_64", ":linux_aarch64_local": "linux_aarch64", ":linux_aarch64_release": "manylinux2014_aarch64", ":osx_universal2": "macosx_10_9_universal2", ":osx_aarch64": "macosx_11_0_arm64", ":windows_x86_32": "win32", ":windows_x86_64": "win_amd64", "//conditions:default": "any", }), python_requires = ">=3.8", python_tag = selects.with_or({ "//python:full_api_3.8": "cp38", "//python:full_api_3.9": "cp39", "//python:limited_api_3.10": "cp310", "//conditions:default": "cp" + SYSTEM_PYTHON_VERSION, }), strip_path_prefixes = [ "python/dist/", "python/", "src/", ], target_compatible_with = select({ "@system_python//:none": ["@platforms//:incompatible"], "//conditions:default": [], }), version = PROTOBUF_PYTHON_VERSION, deps = [ ":message_mod", ":plugin_py_pb2", ":well_known_proto_py_pb2", "//:python_srcs", ], ) py_wheel( name = "pure_python_wheel", abi = "none", author = "protobuf@googlegroups.com", author_email = "protobuf@googlegroups.com", classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ], distribution = "protobuf", extra_distinfo_files = { "//:LICENSE": "LICENSE", }, homepage = "https://developers.google.com/protocol-buffers/", license = "3-Clause BSD License", platform = "any", python_requires = ">=3.8", python_tag = "py3", strip_path_prefixes = [ "python/", "src/", ], target_compatible_with = select({ "@system_python//:none": ["@platforms//:incompatible"], "//conditions:default": [], }), version = PROTOBUF_PYTHON_VERSION, deps = [ ":plugin_py_pb2", ":well_known_proto_py_pb2", "//:python_srcs", ], ) py_wheel( name = "test_wheel", testonly = True, abi = "none", distribution = "protobuftests", extra_distinfo_files = { "//:LICENSE": "LICENSE", }, platform = "any", python_tag = "py3", strip_path_prefixes = [ "python/", "src/", ], target_compatible_with = select({ "@system_python//:none": ["@platforms//:incompatible"], "//conditions:default": [], }), version = PROTOBUF_PYTHON_VERSION, deps = [ "//:python_common_test_protos", "//:python_specific_test_protos", "//:python_test_srcs", "//python/pb_unit_tests:test_files", "//src/google/protobuf:testdata", ], ) py_dist( name = "dist", binary_wheel = ":binary_wheel", full_api_cpus = [ # TODO: fix win32 build "win32", "win64", ], # Windows needs version-specific wheels until 3.10. full_api_versions = [ "38", "39", ], # Limited API: these wheels will satisfy any Python version >= the # given version. # # Technically the limited API doesn't have the functions we need until # 3.10, but on Linux we can get away with using 3.7 (see ../python_api.h for # details). limited_api_wheels = { # TODO: fix win32 build "win32": "310", "win64": "310", "linux-x86_64": "38", "linux-aarch_64": "38", "osx-universal2": "38", }, pure_python_wheel = ":pure_python_wheel", tags = ["manual"], )