| :::{default-domain} bzl | |
| ::: | |
| # How to get Python headers for C extensions | |
| When building a Python C extension, you need access to the Python header | |
| files. This guide shows how to get the necessary include paths from the Python | |
| [toolchain](toolchains). | |
| The recommended way to get the headers is to depend on the | |
| {obj}`@rules_python//python/cc:current_py_cc_headers` or | |
| {obj}`@rules_python//python/cc:current_py_cc_headers_abi3` | |
| targets. These are convenience targets that use toolchain resolution to find | |
| the correct headers for the target platform. | |
| ## Using the headers | |
| In your `BUILD.bazel` file, you can add `@rules_python//python/cc:current_py_cc_headers` | |
| to the `deps` of a `cc_library` or `cc_binary` target. | |
| ```bazel | |
| # BUILD.bazel | |
| cc_library( | |
| name = "my_c_extension", | |
| srcs = ["my_c_extension.c"], | |
| deps = ["@rules_python//python/cc:current_py_cc_headers"], | |
| ) | |
| ``` | |
| This setup ensures that your C extension code can find and use the Python | |
| headers during compilation. | |
| :::{note} | |
| The `:current_py_cc_headers` target provides all the Python headers. This _may_ | |
| include ABI-specific information. | |
| ::: | |
| ## Using the stable ABI headers | |
| If you're building for the [Python stable ABI](https://docs.python.org/3/c-api/stable.html), | |
| then depend on {obj}`@rules_python//python/cc:current_py_cc_headers_abi3`. This | |
| target contains only objects relevant to the Python stable ABI. Remember to | |
| define | |
| [`Py_LIMITED_API`](https://docs.python.org/3/c-api/stable.html#c.Py_LIMITED_API) | |
| when building such extensions. | |
| ```bazel | |
| # BUILD.bazel | |
| cc_library( | |
| name = "my_stable_abi_extension", | |
| srcs = ["my_stable_abi_extension.c"], | |
| deps = ["@rules_python//python/cc:current_py_cc_headers_abi3"], | |
| ) | |
| ``` |