# Copyright (c) 2009-2022, Google LLC # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Google LLC nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. load("//bazel:py_proto_library.bzl", "py_proto_library") load(":dist.bzl", "py_dist", "py_dist_module") load("@bazel_skylib//lib:selects.bzl", "selects") load("@com_google_protobuf//:protobuf_version.bzl", "PROTOBUF_PYTHON_VERSION") load("@rules_pkg//:mappings.bzl", "pkg_files") load("@rules_pkg//:pkg.bzl", "pkg_tar") load("@rules_python//python:packaging.bzl", "py_wheel") load("@system_python//:version.bzl", "SYSTEM_PYTHON_VERSION") 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 = [ "@com_google_protobuf//:any_proto", "@com_google_protobuf//:api_proto", "@com_google_protobuf//:descriptor_proto", "@com_google_protobuf//:duration_proto", "@com_google_protobuf//:empty_proto", "@com_google_protobuf//:field_mask_proto", "@com_google_protobuf//:source_context_proto", "@com_google_protobuf//:struct_proto", "@com_google_protobuf//:timestamp_proto", "@com_google_protobuf//:type_proto", "@com_google_protobuf//:wrappers_proto", ], ) py_proto_library( name = "plugin_py_pb2", deps = ["@com_google_protobuf//:compiler_plugin_proto"], ) config_setting( name = "linux_aarch64_release", values = {"cpu": "linux-aarch_64"}, ) config_setting( name = "linux_aarch64_local", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:aarch64", ], ) config_setting( name = "linux_x86_64_release", values = {"cpu": "linux-x86_64"}, ) config_setting( name = "linux_x86_64_local", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:x86_64", ], ) config_setting( name = "osx_x86_64_release", values = {"cpu": "osx-x86_64"}, ) config_setting( name = "osx_x86_64_local", constraint_values = [ "@platforms//os:osx", "@platforms//cpu:x86_64", ], ) selects.config_setting_group( name = "osx_x86_64", match_any = [ ":osx_x86_64_release", ":osx_x86_64_local", ], ) config_setting( name = "osx_aarch64_release", values = {"cpu": "osx-aarch_64"}, ) config_setting( name = "osx_aarch64_local", constraint_values = [ "@platforms//os:osx", "@platforms//cpu:aarch64", ], ) 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", values = {"cpu": "win32"}, ) config_setting( name = "windows_x86_32_local", constraint_values = [ "@platforms//os:windows", "@platforms//cpu:x86_32", ], ) 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", values = {"cpu": "win64"}, ) config_setting( name = "windows_x86_64_local", constraint_values = [ "@platforms//os:windows", "@platforms//cpu:x86_64", ], ) 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", "//:descriptor_upb_proto", "//: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 = ["@utf8_range//:utf8_range_srcs"], prefix = "utf8_range", ) # NOTE: This package currently only works for macos and ubuntu, MSVC users # should use a binary wheel. pkg_tar( name = "source_tarball", srcs = [ "MANIFEST.in", "setup.py", ":generated_wkt", ":generated_wkt_compiler", ":utf8_range_source_files", "//:LICENSE", "//:source_files", "//python:message_srcs", "//upb/mini_descriptor:source_files", "//upb/mini_table:source_files", "//upb/util:source_files", "@com_google_protobuf//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 = """ 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": [], }), ) py_wheel( name = "binary_wheel", abi = select({ "//python:full_api_3.7": "cp37m", "//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.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], 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.7", python_tag = selects.with_or({ ("//python:limited_api_3.7", "//python:full_api_3.7"): "cp37", "//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", "@com_google_protobuf//: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.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", ], distribution = "protobuf", extra_distinfo_files = { "//:LICENSE": "LICENSE", }, homepage = "https://developers.google.com/protocol-buffers/", license = "3-Clause BSD License", platform = "any", python_requires = ">=3.7", 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", "@com_google_protobuf//: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/pb_unit_tests:test_files", "@com_google_protobuf//:python_common_test_protos", "@com_google_protobuf//:python_specific_test_protos", "@com_google_protobuf//:python_test_srcs", "@com_google_protobuf//src/google/protobuf:testdata", ], ) py_dist( name = "dist", binary_wheel = ":binary_wheel", full_api_cpus = [ # TODO(b/231485326): fix win32 build "win32", "win64", ], # Windows needs version-specific wheels until 3.10. full_api_versions = [ "37", "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(b/231485326): fix win32 build "win32": "310", "win64": "310", "linux-x86_64": "37", "linux-aarch_64": "37", "osx-universal2": "37", }, pure_python_wheel = ":pure_python_wheel", tags = ["manual"], )