Document option inheritance across configuration layers

Amp-Thread-ID: https://ampcode.com/threads/T-019fefe0-6bbb-736e-b01c-d7f15d2db320
Co-authored-by: Joe Rickerby <joe@nordprojects.co>
This commit is contained in:
Amp
2026-08-12 08:41:03 +01:00
committed by Joe Rickerby
co-authored by Joe Rickerby
parent b652a90184
commit de7e10c7db
2 changed files with 80 additions and 21 deletions
+71 -18
View File
@@ -66,10 +66,11 @@ placed in `[tool.cibuildwheel]` and are lower case, with dashes, following
common [TOML](https://toml.io) practice. Anything placed in subsections common [TOML](https://toml.io) practice. Anything placed in subsections
named after a platform will only affect those platforms. Platform-specific named after a platform will only affect those platforms. Platform-specific
values replace the corresponding global value for that platform; table options values replace the corresponding global value for that platform; table options
are not merged key by key. Lists can be used instead of strings for items that are not merged key by key unless you configure [inheritance](#inherit). Lists can
are naturally a list. Multiline strings also work just like in the environment be used instead of strings for items that are naturally a list. Multiline strings
variables. Environment variable overrides, such as `CIBW_TEST_COMMAND` and also work just like in the environment variables. Environment variable overrides,
`CIBW_TEST_COMMAND_LINUX`, will take precedence if defined. such as `CIBW_TEST_COMMAND` and `CIBW_TEST_COMMAND_LINUX`, take precedence if
defined.
The example above using environment variables could have been written like this: The example above using environment variables could have been written like this:
@@ -113,9 +114,9 @@ trigger new containers, one per image.
The ``output-dir``, ``build``, ``skip``, ``test_skip`` selectors, and architectures cannot be overridden. The ``output-dir``, ``build``, ``skip``, ``test_skip`` selectors, and architectures cannot be overridden.
You can specify a table of overrides in `inherit={}`, any list or table in this By default, values in an override replace values from the main configuration or
list will inherit from previous overrides or the main configuration. The valid earlier overrides. You can instead [extend a list or table option](#inherit) by
options are `"none"` (the default), `"append"`, and `"prepend"`. setting an `inherit` rule for it.
#### Examples: #### Examples:
@@ -175,14 +176,50 @@ This example will provide the command `"pyproject-before && pyproject && pyproje
on Python 3.11, and will have `environment = {FOO="BAZ", "PYTHON"="MONTY", "HAM"="EGGS"}`. on Python 3.11, and will have `environment = {FOO="BAZ", "PYTHON"="MONTY", "HAM"="EGGS"}`.
## Extending existing options {: #inherit } ## Option inheritance {: #inherit }
In the TOML configuration, you can choose how tables and lists are inherited. As cibuildwheel reads its configuration, each layer normally replaces the value
By default, all values are overridden completely (`"none"`) but sometimes you'd from the previous layer. The layers, from lowest to highest precedence, are:
rather `"append"` or `"prepend"` to an existing list or table. You can do this
with the `inherit` table in overrides. For example, if you want to add an environment 1. cibuildwheel's defaults
variable for CPython 3.11, without `inherit` you'd have to repeat all the 2. `[tool.cibuildwheel]`
original environment variables in the override. With `inherit`, it's just: 3. `[tool.cibuildwheel.<platform>]`
4. matching `[[tool.cibuildwheel.overrides]]` entries, in order
5. `CIBW_<OPTION>`
6. `CIBW_<OPTION>_<PLATFORM>`
For list and table options, you can use an `inherit` rule to merge a value with
the value accumulated from the preceding layers instead. The available rules
are `"none"` (replace the previous value, the default), `"append"`, and
`"prepend"`.
In `pyproject.toml`, set the rule in the same table as the value it applies to.
For example, this adds Twine checks to the default audit configuration:
```toml
[tool.cibuildwheel]
inherit.audit-requires = "append"
inherit.audit-command = "append"
audit-requires = ["twine"]
audit-command = "twine check {wheel}"
```
Inheritance can also combine global and platform-specific configuration. This
example runs a Linux-specific setup command before the global command:
```toml
[tool.cibuildwheel]
before-all = "make -C third_party_lib"
[tool.cibuildwheel.linux]
inherit.before-all = "prepend"
before-all = "yum install -y libffi-devel"
```
The same mechanism remains available in overrides. For example, if you want to
add an environment variable for CPython 3.11, without `inherit` you'd have to
repeat all the original environment variables in the override. With `inherit`,
it's just:
```toml ```toml
[[tool.cibuildwheel.overrides]] [[tool.cibuildwheel.overrides]]
@@ -210,7 +247,23 @@ repair-wheel-command = "echo 'After repair'"
``` ```
As seen in this example, you can have multiple overrides match - they match top As seen in this example, you can have multiple overrides match - they match top
to bottom, with the config being accumulated. If you need platform-specific to bottom, with the config being accumulated.
inheritance, you can use `select = "*-????linux_*"` for Linux, `select =
"*-win_*"` for Windows, and `select = "*-macosx_*"` for macOS. As always, For environment variables, specify the rules in `CIBW_INHERIT`. Rules are
environment variables will completely override any TOML configuration. separated by semicolons and use lowercase option names. A rule without an
explicit value defaults to `append`:
```yaml
CIBW_AUDIT_REQUIRES: twine
CIBW_AUDIT_COMMAND: "twine check {wheel}"
CIBW_INHERIT: "audit-requires; audit-command"
```
To control a platform-specific environment variable, add the lowercase platform
suffix to the option name. For example, this prepends `CIBW_BEFORE_ALL_LINUX` to
the value accumulated from the lower-precedence layers:
```yaml
CIBW_BEFORE_ALL_LINUX: yum install -y libffi-devel
CIBW_INHERIT: "before-all-linux: prepend"
```
+9 -3
View File
@@ -1444,10 +1444,11 @@ Run shell commands to verify your wheels once they are built. Multiple commands
audit-requires = ["twine"] audit-requires = ["twine"]
audit-command = "twine check {wheel}" audit-command = "twine check {wheel}"
# Add an additional audit command using overrides, keeping the default abi3audit check # Add an additional audit command, keeping the default abi3audit check
[[tool.cibuildwheel.overrides]] [tool.cibuildwheel]
select = "*" inherit.audit-requires = "append"
inherit.audit-command = "append" inherit.audit-command = "append"
audit-requires = ["twine"]
audit-command = "twine check {wheel}" audit-command = "twine check {wheel}"
``` ```
@@ -1463,6 +1464,11 @@ Run shell commands to verify your wheels once they are built. Multiple commands
# Use twine check to validate wheel metadata # Use twine check to validate wheel metadata
CIBW_AUDIT_REQUIRES: "twine" CIBW_AUDIT_REQUIRES: "twine"
CIBW_AUDIT_COMMAND: "twine check {wheel}" CIBW_AUDIT_COMMAND: "twine check {wheel}"
# Add twine check to the default audit configuration
CIBW_AUDIT_REQUIRES: "twine"
CIBW_AUDIT_COMMAND: "twine check {wheel}"
CIBW_INHERIT: "audit-requires; audit-command"
``` ```