| :::{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"], |
| ) |
| ``` |