# Copyright 2018 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. load("@bazel_skylib//rules:build_test.bzl", "build_test") load("//examples/wheel/private:wheel_utils.bzl", "directory_writer", "make_variable_tags") load("//python:defs.bzl", "py_library", "py_test") load("//python:packaging.bzl", "py_package", "py_wheel") load("//python:versions.bzl", "gen_python_config_settings") package(default_visibility = ["//visibility:public"]) licenses(["notice"]) # Apache 2.0 py_library( name = "main", srcs = ["main.py"], deps = [ "//examples/wheel/lib:simple_module", "//examples/wheel/lib:module_with_data", # Example dependency which is not packaged in the wheel # due to "packages" filter on py_package rule. "//tests/load_from_macro:foo", ], ) py_library( name = "main_with_gen_data", srcs = ["main.py"], data = [ ":gen_dir", ], ) directory_writer( name = "gen_dir", out = "someDir", files = {"foo.py": ""}, ) # Package just a specific py_libraries, without their dependencies py_wheel( name = "minimal_with_py_library", testonly = True, # Set this to verify the generated .dist target doesn't break things # Package data. We're building "example_minimal_library-0.0.1-py3-none-any.whl" distribution = "example_minimal_library", python_tag = "py3", version = "0.0.1", deps = [ "//examples/wheel/lib:module_with_data", "//examples/wheel/lib:simple_module", ], ) # Populate a rule with "Make Variable" arguments for # abi, python_tag and version. You might want to do this # for the following use cases: # - abi, python_tag: introspect a toolchain to map to appropriate cpython tags # - version: populate given this or a dependent module's version make_variable_tags( name = "make_variable_tags", ) py_wheel( name = "minimal_with_py_library_with_make_variables", testonly = True, abi = "$(ABI)", distribution = "example_minimal_library", python_tag = "$(PYTHON_TAG)", toolchains = ["//examples/wheel:make_variable_tags"], version = "$(VERSION)", deps = [ "//examples/wheel/lib:module_with_data", "//examples/wheel/lib:simple_module", ], ) build_test( name = "dist_build_tests", targets = [":minimal_with_py_library.dist"], ) # Package just a specific py_libraries, without their dependencies py_wheel( name = "minimal_with_py_library_with_stamp", # Package data. We're building "example_minimal_library-0.0.1-py3-none-any.whl" distribution = "example_minimal_library{BUILD_USER}", python_tag = "py3", stamp = 1, version = "0.1.{BUILD_TIMESTAMP}", deps = [ "//examples/wheel/lib:module_with_data", "//examples/wheel/lib:simple_module", ], ) # Use py_package to collect all transitive dependencies of a target, # selecting just the files within a specific python package. py_package( name = "example_pkg", # Only include these Python packages. packages = ["examples.wheel"], deps = [":main"], ) py_package( name = "example_pkg_with_data", packages = ["examples.wheel"], deps = [":main_with_gen_data"], ) py_wheel( name = "minimal_with_py_package", # Package data. We're building "example_minimal_package-0.0.1-py3-none-any.whl" distribution = "example_minimal_package", python_tag = "py3", version = "0.0.1", deps = [":example_pkg"], ) # An example that uses all features provided by py_wheel. py_wheel( name = "customized", author = "Example Author with non-ascii characters: żółw", author_email = "example@example.com", classifiers = [ "License :: OSI Approved :: Apache Software License", "Intended Audience :: Developers", ], console_scripts = { "customized_wheel": "examples.wheel.main:main", }, description_file = "README.md", # Package data. We're building "example_customized-0.0.1-py3-none-any.whl" distribution = "example_customized", entry_points = { "console_scripts": ["another = foo.bar:baz"], "group2": [ "second = second.main:s", "first = first.main:f", ], }, extra_distinfo_files = { "//examples/wheel:NOTICE": "NOTICE", # Rename the file when packaging to show we can. "//examples/wheel:README.md": "README", }, homepage = "www.example.com", license = "Apache 2.0", project_urls = { "Bug Tracker": "www.example.com/issues", "Documentation": "www.example.com/docs", }, python_tag = "py3", # Requirements embedded into the wheel metadata. requires = ["pytest"], summary = "A one-line summary of this test package", version = "0.0.1", deps = [":example_pkg"], ) # An example of how to change the wheel package root directory using 'strip_path_prefixes'. py_wheel( name = "custom_package_root", # Package data. We're building "examples_custom_package_root-0.0.1-py3-none-any.whl" distribution = "examples_custom_package_root", entry_points = { "console_scripts": ["main = foo.bar:baz"], }, python_tag = "py3", strip_path_prefixes = [ "examples", ], version = "0.0.1", deps = [ ":example_pkg", ], ) py_wheel( name = "custom_package_root_multi_prefix", # Package data. We're building "custom_custom_package_root_multi_prefix-0.0.1-py3-none-any.whl" distribution = "example_custom_package_root_multi_prefix", python_tag = "py3", strip_path_prefixes = [ "examples/wheel/lib", "examples/wheel", ], version = "0.0.1", deps = [ ":example_pkg", ], ) py_wheel( name = "custom_package_root_multi_prefix_reverse_order", # Package data. We're building "custom_custom_package_root_multi_prefix_reverse_order-0.0.1-py3-none-any.whl" distribution = "example_custom_package_root_multi_prefix_reverse_order", python_tag = "py3", strip_path_prefixes = [ "examples/wheel", "examples/wheel/lib", # this is not effective, because the first prefix takes priority ], version = "0.0.1", deps = [ ":example_pkg", ], ) py_wheel( name = "python_requires_in_a_package", distribution = "example_python_requires_in_a_package", python_requires = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", python_tag = "py3", version = "0.0.1", deps = [ ":example_pkg", ], ) py_wheel( name = "use_rule_with_dir_in_outs", distribution = "use_rule_with_dir_in_outs", python_tag = "py3", version = "0.0.1", deps = [ ":example_pkg_with_data", ], ) gen_python_config_settings() py_wheel( name = "python_abi3_binary_wheel", abi = "abi3", distribution = "example_python_abi3_binary_wheel", # these platform strings must line up with test_python_abi3_binary_wheel() in wheel_test.py platform = select({ ":aarch64-apple-darwin": "macosx_11_0_arm64", ":aarch64-unknown-linux-gnu": "manylinux2014_aarch64", ":x86_64-apple-darwin": "macosx_11_0_x86_64", # this is typically macosx_10_9_x86_64? ":x86_64-pc-windows-msvc": "win_amd64", ":x86_64-unknown-linux-gnu": "manylinux2014_x86_64", }), python_requires = ">=3.8", python_tag = "cp38", version = "0.0.1", ) py_wheel( name = "filename_escaping", # Per https://www.python.org/dev/peps/pep-0427/#escaping-and-unicode # runs of non-alphanumeric, non-digit symbols should be replaced with a single underscore. # Unicode non-ascii letters should *not* be replaced with underscore. distribution = "file~~name-escaping", python_tag = "py3", version = "0.0.1-r7", deps = [":example_pkg"], ) py_test( name = "wheel_test", srcs = ["wheel_test.py"], data = [ ":custom_package_root", ":custom_package_root_multi_prefix", ":custom_package_root_multi_prefix_reverse_order", ":customized", ":filename_escaping", ":minimal_with_py_library", ":minimal_with_py_library_with_stamp", ":minimal_with_py_package", ":python_abi3_binary_wheel", ":python_requires_in_a_package", ":use_rule_with_dir_in_outs", ], )