Merge pull request #1727 from pypa/dont-require-platform
Don't require `--platform` when running on a development machine
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
CIBW_PLATFORM=linux pytest "$@"
|
||||
+11
-22
@@ -49,10 +49,9 @@ def main() -> None:
|
||||
default=None,
|
||||
help="""
|
||||
Platform to build for. Use this option to override the
|
||||
auto-detected platform or to run cibuildwheel on your development
|
||||
machine. Specifying "macos" or "windows" only works on that
|
||||
operating system, but "linux" works on all three, as long as
|
||||
Docker/Podman is installed. Default: auto.
|
||||
auto-detected platform. Specifying "macos" or "windows" only works
|
||||
on that operating system, but "linux" works on all three, as long
|
||||
as Docker/Podman is installed. Default: auto.
|
||||
""",
|
||||
)
|
||||
|
||||
@@ -184,20 +183,7 @@ def _compute_platform_only(only: str) -> PlatformName:
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
def _compute_platform_ci() -> PlatformName:
|
||||
if detect_ci_provider() is None:
|
||||
print(
|
||||
textwrap.dedent(
|
||||
"""
|
||||
cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server;
|
||||
Travis CI, AppVeyor, Azure Pipelines, GitHub Actions, CircleCI, Gitlab, and Cirrus CI
|
||||
are supported. You can run on your development machine or other CI providers
|
||||
using the --platform argument. Check --help output for more information.
|
||||
"""
|
||||
),
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(2)
|
||||
def _compute_platform_auto() -> PlatformName:
|
||||
if sys.platform.startswith("linux"):
|
||||
return "linux"
|
||||
elif sys.platform == "darwin":
|
||||
@@ -206,8 +192,9 @@ def _compute_platform_ci() -> PlatformName:
|
||||
return "windows"
|
||||
else:
|
||||
print(
|
||||
'cibuildwheel: Unable to detect platform from "sys.platform" in a CI environment. You can run '
|
||||
"cibuildwheel using the --platform argument. Check --help output for more information.",
|
||||
'cibuildwheel: Unable to detect platform from "sys.platform". cibuildwheel doesn\'t '
|
||||
"support building wheels for this platform. You might be able to build for a different "
|
||||
"platform using the --platform argument. Check --help output for more information.",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(2)
|
||||
@@ -238,7 +225,7 @@ def _compute_platform(args: CommandLineArguments) -> PlatformName:
|
||||
elif platform_option_value != "auto":
|
||||
return typing.cast(PlatformName, platform_option_value)
|
||||
|
||||
return _compute_platform_ci()
|
||||
return _compute_platform_auto()
|
||||
|
||||
|
||||
class PlatformModule(Protocol):
|
||||
@@ -292,7 +279,9 @@ def build_in_directory(args: CommandLineArguments) -> None:
|
||||
# Add CIBUILDWHEEL environment variable
|
||||
os.environ["CIBUILDWHEEL"] = "1"
|
||||
|
||||
# Python is buffering by default when running on the CI platforms, giving problems interleaving subprocess call output with unflushed calls to 'print'
|
||||
# Python is buffering by default when running on the CI platforms, giving
|
||||
# problems interleaving subprocess call output with unflushed calls to
|
||||
# 'print'
|
||||
sys.stdout = Unbuffered(sys.stdout) # type: ignore[assignment]
|
||||
|
||||
# create the cache dir before it gets printed & builds performed
|
||||
|
||||
+4
-2
@@ -184,7 +184,7 @@ Options: `auto` `linux` `macos` `windows`
|
||||
|
||||
Default: `auto`
|
||||
|
||||
`auto` will auto-detect platform using environment variables, such as `TRAVIS_OS_NAME`/`APPVEYOR`/`CIRCLECI`.
|
||||
`auto` will build wheels for the current platform.
|
||||
|
||||
- For `linux`, you need [Docker or Podman](#container-engine) running, on Linux, macOS, or Windows.
|
||||
- For `macos` and `windows`, you need to be running on the respective system, with a working compiler toolchain installed - Xcode Command Line tools for macOS, and MSVC for Windows.
|
||||
@@ -192,7 +192,7 @@ Default: `auto`
|
||||
This option can also be set using the [command-line option](#command-line) `--platform`. This option is not available in the `pyproject.toml` config.
|
||||
|
||||
!!! tip
|
||||
You can use this option to locally debug your cibuildwheel config, instead of pushing to CI to test every change. For example:
|
||||
You can use this option to locally debug your cibuildwheel config on Linux, instead of pushing to CI to test every change. For example:
|
||||
|
||||
```bash
|
||||
export CIBW_BUILD='cp37-*'
|
||||
@@ -200,6 +200,8 @@ This option can also be set using the [command-line option](#command-line) `--pl
|
||||
cibuildwheel --platform linux .
|
||||
```
|
||||
|
||||
Linux builds are the easiest to test locally, because all the build tools are supplied in the container, and they run exactly the same locally as in CI.
|
||||
|
||||
This is even more convenient if you store your cibuildwheel config in [`pyproject.toml`](#configuration-file).
|
||||
|
||||
You can also run a single identifier with `--only <identifier>`. This will
|
||||
|
||||
+10
-41
@@ -11,45 +11,14 @@ locally to quickly iterate and track down issues without even touching CI.
|
||||
|
||||
Install cibuildwheel and run a build like this:
|
||||
|
||||
!!! tab "Linux"
|
||||
```sh
|
||||
# using pipx (https://github.com/pypa/pipx)
|
||||
pipx run cibuildwheel
|
||||
|
||||
Using [pipx](https://github.com/pypa/pipx):
|
||||
```sh
|
||||
pipx run cibuildwheel --platform linux
|
||||
```
|
||||
|
||||
Or,
|
||||
```sh
|
||||
pip install cibuildwheel
|
||||
cibuildwheel --platform linux
|
||||
```
|
||||
|
||||
!!! tab "macOS"
|
||||
|
||||
Using [pipx](https://github.com/pypa/pipx):
|
||||
```sh
|
||||
pipx run cibuildwheel --platform macos
|
||||
```
|
||||
|
||||
Or,
|
||||
```sh
|
||||
pip install cibuildwheel
|
||||
cibuildwheel --platform macos
|
||||
```
|
||||
|
||||
|
||||
!!! tab "Windows"
|
||||
|
||||
Using [pipx](https://github.com/pypa/pipx):
|
||||
```bat
|
||||
pipx run cibuildwheel --platform windows
|
||||
```
|
||||
|
||||
Or,
|
||||
```bat
|
||||
pip install cibuildwheel
|
||||
cibuildwheel --platform windows
|
||||
```
|
||||
# or,
|
||||
pip install cibuildwheel
|
||||
cibuildwheel
|
||||
```
|
||||
|
||||
You should see the builds taking place. You can experiment with options using environment variables or pyproject.toml.
|
||||
|
||||
@@ -63,7 +32,7 @@ You should see the builds taking place. You can experiment with options using en
|
||||
# run a command to set up the build system
|
||||
export CIBW_BEFORE_ALL='uname -a'
|
||||
|
||||
cibuildwheel --platform linux
|
||||
cibuildwheel
|
||||
```
|
||||
|
||||
> CMD (Windows)
|
||||
@@ -71,7 +40,7 @@ You should see the builds taking place. You can experiment with options using en
|
||||
```bat
|
||||
set CIBW_BEFORE_ALL='uname -a'
|
||||
|
||||
cibuildwheel --platform linux
|
||||
cibuildwheel
|
||||
```
|
||||
|
||||
!!! tab "pyproject.toml"
|
||||
@@ -88,7 +57,7 @@ You should see the builds taking place. You can experiment with options using en
|
||||
Then invoke cibuildwheel, like:
|
||||
|
||||
```console
|
||||
cibuildwheel --platform linux
|
||||
cibuildwheel
|
||||
```
|
||||
|
||||
### Linux builds
|
||||
|
||||
@@ -10,25 +10,26 @@ from cibuildwheel.architecture import Architecture
|
||||
from ..conftest import MOCK_PACKAGE_DIR
|
||||
|
||||
|
||||
def test_unknown_platform_non_ci(monkeypatch, capsys):
|
||||
monkeypatch.delenv("CI", raising=False)
|
||||
monkeypatch.delenv("BITRISE_BUILD_NUMBER", raising=False)
|
||||
monkeypatch.delenv("AZURE_HTTP_USER_AGENT", raising=False)
|
||||
monkeypatch.delenv("TRAVIS", raising=False)
|
||||
monkeypatch.delenv("APPVEYOR", raising=False)
|
||||
monkeypatch.delenv("GITHUB_ACTIONS", raising=False)
|
||||
monkeypatch.delenv("GITLAB_CI", raising=False)
|
||||
monkeypatch.delenv("CIRCLECI", raising=False)
|
||||
monkeypatch.delenv("CIRRUS_CI", raising=False)
|
||||
monkeypatch.delenv("CIBW_PLATFORM", raising=False)
|
||||
@pytest.mark.parametrize("option_value", [None, "auto"])
|
||||
def test_platform_unset_or_auto(monkeypatch, intercepted_build_args, option_value):
|
||||
if option_value is None:
|
||||
monkeypatch.delenv("CIBW_PLATFORM", raising=False)
|
||||
else:
|
||||
monkeypatch.setenv("CIBW_PLATFORM", option_value)
|
||||
|
||||
with pytest.raises(SystemExit) as exit:
|
||||
main()
|
||||
assert exit.value.code == 2
|
||||
_, err = capsys.readouterr()
|
||||
main()
|
||||
|
||||
assert "cibuildwheel: Unable to detect platform." in err
|
||||
assert "cibuildwheel should run on your CI server" in err
|
||||
options = intercepted_build_args.args[0]
|
||||
|
||||
# check that the platform was auto detected to build for the current system
|
||||
if sys.platform.startswith("linux"):
|
||||
assert options.platform == "linux"
|
||||
elif sys.platform == "darwin":
|
||||
assert options.platform == "macos"
|
||||
elif sys.platform == "win32":
|
||||
assert options.platform == "windows"
|
||||
else:
|
||||
pytest.fail(f"Unknown platform: {sys.platform}")
|
||||
|
||||
|
||||
def test_unknown_platform_on_ci(monkeypatch, capsys):
|
||||
|
||||
Reference in New Issue
Block a user