| # 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", |
| ], |
| ) |