module( name = "example_bzlmod", version = "0.0.0", compatibility_level = 1, ) bazel_dep(name = "bazel_skylib", version = "1.4.1") bazel_dep(name = "rules_python", version = "0.0.0") local_path_override( module_name = "rules_python", path = "../..", ) # (py_proto_library specific) We are using rules_proto to define rules_proto targets to be consumed by py_proto_library. bazel_dep(name = "rules_proto", version = "5.3.0-21.7") # (py_proto_library specific) Add the protobuf library for well-known types (e.g. `Any`, `Timestamp`, etc) bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf") # We next initialize the python toolchain using the extension. # You can set different Python versions in this block. python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( configure_coverage_tool = True, # Only set when you have multiple toolchain versions. is_default = True, python_version = "3.9", ) # We are also using a second version of Python in this project. # Typically you will only need a single version of Python, but # If you need a different vesion we support more than one. # Note: we do not supporting using multiple pip extensions, this is # work in progress. python.toolchain( configure_coverage_tool = True, python_version = "3.10", ) # One can override the actual toolchain versions that are available, which can be useful # when optimizing what gets downloaded and when. python.override( available_python_versions = [ "3.10.9", "3.9.19", # The following is used by the `other_module` and we need to include it here # as well. "3.11.8", ], # Also override the `minor_mapping` so that the root module, # instead of rules_python's defaults, controls what full version # is used when `3.x` is requested. minor_mapping = { "3.10": "3.10.9", "3.11": "3.11.8", "3.9": "3.9.19", }, ) # Or the sources that the toolchains come from for all platforms python.single_version_override( patch_strip = 1, # The user can specify patches to be applied to all interpreters. patches = [], python_version = "3.10.2", sha256 = { "aarch64-apple-darwin": "1409acd9a506e2d1d3b65c1488db4e40d8f19d09a7df099667c87a506f71c0ef", "aarch64-unknown-linux-gnu": "8f351a8cc348bb45c0f95b8634c8345ec6e749e483384188ad865b7428342703", "x86_64-apple-darwin": "8146ad4390710ec69b316a5649912df0247d35f4a42e2aa9615bffd87b3e235a", "x86_64-pc-windows-msvc": "a1d9a594cd3103baa24937ad9150c1a389544b4350e859200b3e5c036ac352bd", "x86_64-unknown-linux-gnu": "9b64eca2a94f7aff9409ad70bdaa7fbbf8148692662e764401883957943620dd", }, urls = ["20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz"], ) # Or a single platform. This can be used in combination with the # `single_version_override` and `single_version_platform_override` will be # applied after `single_version_override`. Any values present in this override # will overwrite the values set by the `single_version_override` python.single_version_platform_override( patch_strip = 1, patches = [], platform = "aarch64-apple-darwin", python_version = "3.10.2", sha256 = "1409acd9a506e2d1d3b65c1488db4e40d8f19d09a7df099667c87a506f71c0ef", urls = ["20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz"], ) # You only need to load this repositories if you are using multiple Python versions. # See the tests folder for various examples on using multiple Python versions. # The names "python_3_9" and "python_3_10" are autmatically created by the repo # rules based on the `python_version` arg values. use_repo(python, "python_3_10", "python_3_9", "python_versions") # EXPERIMENTAL: This is experimental and may be removed without notice uv = use_extension("@rules_python//python/uv:extensions.bzl", "uv") uv.toolchain(uv_version = "0.2.23") use_repo(uv, "uv_toolchains") register_toolchains("@uv_toolchains//:all") # This extension allows a user to create modifications to how rules_python # creates different wheel repositories. Different attributes allow the user # to modify the BUILD file, and copy files. # See @rules_python//python/extensions:whl_mods.bzl attributes for more information # on each of the attributes. # You are able to set a hub name, so that you can have different modifications of the same # wheel in different pip hubs. pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") # Call whl_mods.create for the requests package. pip.whl_mods( # we are using the appended_build_content.BUILD file # to add content to the request wheel BUILD file. additive_build_content_file = "//whl_mods:appended_build_content.BUILD", data = [":generated_file"], hub_name = "whl_mods_hub", whl_name = "requests", ) ADDITIVE_BUILD_CONTENT = """\ load("@bazel_skylib//rules:write_file.bzl", "write_file") write_file( name = "generated_file", out = "generated_file.txt", content = ["Hello world from build content file"], ) """ # Call whl_mods.create for the wheel package. pip.whl_mods( additive_build_content = ADDITIVE_BUILD_CONTENT, copy_executables = { "@@//whl_mods:data/copy_executable.py": "copied_content/executable.py", }, copy_files = { "@@//whl_mods:data/copy_file.txt": "copied_content/file.txt", }, data = [":generated_file"], data_exclude_glob = ["site-packages/*.dist-info/WHEEL"], hub_name = "whl_mods_hub", whl_name = "wheel", ) use_repo(pip, "whl_mods_hub") # To fetch pip dependencies, use pip.parse. We can pass in various options, # but typically we pass requirements and the Python version. The Python # version must have been configured by a corresponding `python.toolchain()` # call. # Alternatively, `python_interpreter_target` can be used to directly specify # the Python interpreter to run to resolve dependencies. pip.parse( # We can use `envsubst in the above envsubst = ["PIP_INDEX_URL"], # Use the bazel downloader to query the simple API for downloading the sources # Note, that we can use envsubst for this value. experimental_index_url = "${PIP_INDEX_URL:-https://pypi.org/simple}", # One can also select a particular index for a particular package. # This ensures that the setup is resistant against confusion attacks. # experimental_index_url_overrides = { # "my_package": "https://different-index-url.com", # }, # Or you can specify extra indexes like with `pip`: # experimental_extra_index_urls = [ # "https://different-index-url.com", # ], experimental_requirement_cycles = { "sphinx": [ "sphinx", "sphinxcontrib-qthelp", "sphinxcontrib-htmlhelp", "sphinxcontrib-devhelp", "sphinxcontrib-applehelp", "sphinxcontrib-serializinghtml", ], }, # You can use one of the values below to specify the target platform # to generate the dependency graph for. experimental_target_platforms = [ # Specifying the target platforms explicitly "cp39_linux_x86_64", "cp39_linux_*", "cp39_*", ], hub_name = "pip", python_version = "3.9", requirements_lock = "requirements_lock_3_9.txt", # These modifications were created above and we # are providing pip.parse with the label of the mod # and the name of the wheel. whl_modifications = { "@whl_mods_hub//:requests.json": "requests", "@whl_mods_hub//:wheel.json": "wheel", }, ) pip.parse( experimental_requirement_cycles = { "sphinx": [ "sphinx", "sphinxcontrib-qthelp", "sphinxcontrib-htmlhelp", "sphinxcontrib-devhelp", "sphinxcontrib-applehelp", "sphinxcontrib-serializinghtml", ], }, # You can use one of the values below to specify the target platform # to generate the dependency graph for. experimental_target_platforms = [ # Using host python version "linux_*", "osx_*", "windows_*", # Or specifying an exact platform "linux_x86_64", # Or the following to get the `host` platform only "host", ], hub_name = "pip", python_version = "3.10", # The requirements files for each platform that we want to support. requirements_by_platform = { # Default requirements file for needs to explicitly provide the platforms "//:requirements_lock_3_10.txt": "linux_*,osx_*", # This API allows one to specify additional platforms that the users # configure the toolchains for themselves. In this example we add # `windows_aarch64` to illustrate that `rules_python` won't fail to # process the value, but it does not mean that this example will work # on Windows ARM. "//:requirements_windows_3_10.txt": "windows_x86_64,windows_aarch64", }, # These modifications were created above and we # are providing pip.parse with the label of the mod # and the name of the wheel. whl_modifications = { "@whl_mods_hub//:requests.json": "requests", "@whl_mods_hub//:wheel.json": "wheel", }, ) # You can add patches that will be applied on the whl contents. # # The patches have to be in the unified-diff format. pip.override( file = "requests-2.25.1-py2.py3-none-any.whl", patch_strip = 1, patches = [ "@//patches:empty.patch", "@//patches:requests_metadata.patch", "@//patches:requests_record.patch", ], ) use_repo(pip, "pip") bazel_dep(name = "other_module", version = "", repo_name = "our_other_module") local_path_override( module_name = "other_module", path = "other_module", )