fix: support wider range of verbosity settings on other build backends (#2339)

* fix: support wider range of verbosity settings on other build backends

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* Apply suggestions from code review

Co-authored-by: Matthieu Darbois <mayeut@users.noreply.github.com>

* refactor: address review comments

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: Matthieu Darbois <mayeut@users.noreply.github.com>
This commit is contained in:
Henry Schreiner
2025-04-06 18:50:24 +02:00
committed by GitHub
co-authored by Matthieu Darbois
parent 6c426a3a17
commit 2aaa489371
3 changed files with 80 additions and 9 deletions
+10 -5
View File
@@ -37,14 +37,19 @@ class BuildFrontendConfig:
def _get_verbosity_flags(level: int, frontend: BuildFrontendName) -> list[str]:
if frontend == "pip":
if level > 0:
return ["-" + level * "v"]
if level < 0:
if level < 0:
if frontend == "pip":
return ["-" + -level * "q"]
elif not 0 <= level < 2:
msg = f"build_verbosity {level} is not supported for {frontend} frontend. Ignoring."
log.warning(msg)
if level > 0:
if frontend == "pip":
return ["-" + level * "v"]
if level > 1:
return ["-" + (level - 1) * "v"]
return []
+22 -4
View File
@@ -1760,9 +1760,27 @@ export CIBW_DEBUG_TRACEBACK=TRUE
```
### `CIBW_BUILD_VERBOSITY` {: #build-verbosity}
> Increase/decrease the output of pip wheel
> Increase/decrease the output of the build
A number from 1 to 3 to increase the level of verbosity (corresponding to invoking pip with `-v`, `-vv`, and `-vvv`), between -1 and -3 (`-q`, `-qq`, and `-qqq`), or just 0 (default verbosity). These flags are useful while debugging a build when the output of the actual build invoked by `pip wheel` is required. Has no effect on the `build` backend, which produces verbose output by default.
This setting controls `-v`/`-q` flags to the build frontend. Since there is
no communication between the build backend and the build frontend, build
messages from the build backend will always be shown with `1`; higher levels
will not produce more logging about the build itself. Other levels only affect
the build frontend output, which is usually things like resolving and
downloading dependencies. The settings are:
| | build | pip | desc |
|-------------|-------|--------|----------------------------------|
| -2 | N/A | `-qq` | even more quiet, where supported |
| -1 | N/A | `-q` | quiet mode, where supported |
| 0 (default) | | | default for build tool |
| 1 | | `-v` | print backend output |
| 2 | `-v` | `-vv` | print log messages e.g. resolving info |
| 3 | `-vv` | `-vvv` | print even more debug info |
Settings that are not supported for a specific frontend will log a warning.
The default build frontend is `build`, which does show build backend output by
default.
Platform-specific environment variables are also available:<br/>
`CIBW_BUILD_VERBOSITY_MACOS` | `CIBW_BUILD_VERBOSITY_WINDOWS` | `CIBW_BUILD_VERBOSITY_LINUX` | `CIBW_BUILD_VERBOSITY_IOS` | `CIBW_BUILD_VERBOSITY_PYODIDE`
@@ -1772,7 +1790,7 @@ Platform-specific environment variables are also available:<br/>
!!! tab examples "Environment variables"
```yaml
# Increase pip debugging output
# Ensure that the build backend output is present
CIBW_BUILD_VERBOSITY: 1
```
@@ -1780,7 +1798,7 @@ Platform-specific environment variables are also available:<br/>
```toml
[tool.cibuildwheel]
# Increase pip debugging output
# Ensure that the build backend output is present
build-verbosity = 1
```
+48
View File
@@ -1,12 +1,16 @@
import os
import platform as platform_module
import textwrap
import unittest.mock
from pathlib import Path
from typing import Literal
import pytest
from cibuildwheel import errors
from cibuildwheel.bashlex_eval import local_environment_executor
from cibuildwheel.frontend import BuildFrontendConfig, get_build_frontend_extra_flags
from cibuildwheel.logger import Logger
from cibuildwheel.options import (
CommandLineArguments,
Options,
@@ -570,3 +574,47 @@ def test_deprecated_image(
assert f"{resolved_image!r}" in captured.err
else:
assert "Deprecated image" not in captured.err
@pytest.mark.parametrize(
("frontend", "verbosity", "result"),
[
("pip", 3, ["-Ca", "-Cb", "-1", "-vvv"]),
("pip", 2, ["-Ca", "-Cb", "-1", "-vv"]),
("pip", -1, ["-Ca", "-Cb", "-1", "-q"]),
("build", 0, ["-Ca", "-Cb", "-1"]),
("build", 1, ["-Ca", "-Cb", "-1"]),
("build", 2, ["-Ca", "-Cb", "-1", "-v"]),
("build", 3, ["-Ca", "-Cb", "-1", "-vv"]),
("build[uv]", 3, ["-Ca", "-Cb", "-1", "-vv"]),
],
)
def test_get_build_frontend_extra_flags(
frontend: Literal["pip", "build", "build[uv]"],
verbosity: int,
result: list[str],
monkeypatch: pytest.MonkeyPatch,
) -> None:
mock_warning = unittest.mock.MagicMock()
monkeypatch.setattr(Logger, "warning", mock_warning)
build_frontend = BuildFrontendConfig(frontend, ["-1"])
args = get_build_frontend_extra_flags(
build_frontend=build_frontend, verbosity_level=verbosity, config_settings="a b"
)
assert args == result
mock_warning.assert_not_called()
@pytest.mark.parametrize("frontend", ["build", "build[uv]"])
def test_get_build_frontend_extra_flags_warning(
frontend: Literal["build", "build[uv]"], monkeypatch: pytest.MonkeyPatch
) -> None:
mock_warning = unittest.mock.MagicMock()
monkeypatch.setattr(Logger, "warning", mock_warning)
build_frontend = BuildFrontendConfig(frontend, ["-1"])
args = get_build_frontend_extra_flags(
build_frontend=build_frontend, verbosity_level=-1, config_settings="a b"
)
assert args == ["-Ca", "-Cb", "-1"]
mock_warning.assert_called_once()