Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
2ae389d
Fix a typo: pyoodide ➡️ pyodide
agriyakhetarpal Sep 10, 2024
0e3b3f1
Add `pyodide_build_version` attribute
agriyakhetarpal Sep 10, 2024
394459f
Add version to xbuildenv log step
agriyakhetarpal Sep 10, 2024
dff7bf2
Add version to Emscripten log step
agriyakhetarpal Sep 10, 2024
16057bc
Use `pyodide-build`'s version for updating constraints
agriyakhetarpal Sep 10, 2024
f167c50
Bump Pyodide constraints by updating `pyodide-build`
agriyakhetarpal Sep 10, 2024
31a6be9
Add a schema for `pyodide-version`
agriyakhetarpal Sep 12, 2024
cbca40b
Merge branch 'main' into feat/distinct-pyodide-build
agriyakhetarpal Sep 12, 2024
9003067
Update Pyodide constraints
agriyakhetarpal Sep 12, 2024
d8a8d5e
Bump `pyodide-build` to new 0.29.0
agriyakhetarpal Sep 24, 2024
cf5dd3e
Test out another Pyodide identifier
agriyakhetarpal Sep 24, 2024
55459cb
Merge branch 'main' into feat/distinct-pyodide-build
agriyakhetarpal Sep 24, 2024
4fe86e0
Update outdated Pyodide constraints
agriyakhetarpal Sep 24, 2024
b6830ee
Add Pyodide version to temp directory name
agriyakhetarpal Sep 24, 2024
aaf32e5
Remove Pyodide 0.26.1 from build configurations
agriyakhetarpal Sep 24, 2024
bb6e0d6
Retrieve + validate + install specific xbuildenvs
agriyakhetarpal Sep 24, 2024
735d5bb
Test wheel builds with Pyodide 0.26.2
agriyakhetarpal Sep 24, 2024
b8ac6c0
Add correct Pyodide version to identifier temp dir
agriyakhetarpal Sep 24, 2024
7796311
Don't pre-call Pyodide xbuildenv search
agriyakhetarpal Sep 24, 2024
97e22c8
Fetch just the stable Pyodide versions
agriyakhetarpal Sep 24, 2024
d30eb6a
Refactor search + validation + install into one step
agriyakhetarpal Sep 24, 2024
ce2a3f0
Move all of it under a lock
agriyakhetarpal Sep 24, 2024
13fbf66
Reorder xbuildenv installation
agriyakhetarpal Sep 24, 2024
14ec071
Add env and cwd to xbuildenv search call
agriyakhetarpal Sep 24, 2024
aae64bb
Temporarily lower to 0.26.2 target
agriyakhetarpal Sep 24, 2024
6956121
Separate out search, validate, install; again
agriyakhetarpal Sep 24, 2024
e5d8443
Run xbuildenv search in `CIBW_CACHE_PATH`
agriyakhetarpal Sep 24, 2024
95c3681
Remove prior `PYODIDE_ROOT` env vars, copy envs
agriyakhetarpal Sep 24, 2024
09af46f
Validate doesn't need to depend on searching
agriyakhetarpal Sep 24, 2024
66999cb
Add file lock when searching xbuildenvs
agriyakhetarpal Sep 24, 2024
1af1e5d
Test the original version: 0.26.1
agriyakhetarpal Sep 24, 2024
ad3a203
Merge branch 'main' into feat/distinct-pyodide-build
agriyakhetarpal Oct 22, 2024
d344548
Update Pyodide constraints
agriyakhetarpal Oct 22, 2024
b3143b4
Merge remote-tracking branch 'upstream/main' into feat/distinct-pyodi…
agriyakhetarpal Nov 21, 2024
738ed1f
Update constraints for `pyodide-build` 0.29.0 again
agriyakhetarpal Nov 21, 2024
41e466a
Bump Pyodide from version 0.26.1 ➡️ version 0.26.4
agriyakhetarpal Nov 21, 2024
2a66ddd
Add note on compatibility for macOS + other archs
agriyakhetarpal Nov 21, 2024
dff72ca
Note Pyodide version for Pyodide identifier
agriyakhetarpal Nov 21, 2024
9a78845
Docs about `CIBW_PYODIDE_VERSION`
agriyakhetarpal Nov 21, 2024
e551021
Don't fetch just the stable versions
agriyakhetarpal Nov 21, 2024
1fe8a04
Discard a variable that's not used later
agriyakhetarpal Nov 21, 2024
8a8177c
Rename `search_xbuildenv` ➡️ `get_xbuildenv_versions`
agriyakhetarpal Nov 21, 2024
fffb705
`validate_xbuildenv` ➡️ `validate_xbuildenv_version`
agriyakhetarpal Nov 21, 2024
0df3c45
Replace ordered comment, add newline
agriyakhetarpal Nov 21, 2024
057e542
Replace sentence on macOS support
agriyakhetarpal Nov 21, 2024
29b5eff
Capitalise: "pyodide" ➡️ "Pyodide"
agriyakhetarpal Nov 21, 2024
321e0de
"work" ➡️ "may succeed"
agriyakhetarpal Nov 21, 2024
92babdb
Add another job to test a custom Pyodide version
agriyakhetarpal Nov 21, 2024
d73f71f
Handle "v"-prefixed + non-prefixed versions
agriyakhetarpal Nov 21, 2024
0f52a4b
Merge remote-tracking branch 'upstream/main' into feat/distinct-pyodi…
agriyakhetarpal Nov 22, 2024
0b09321
Merge branch 'main' into feat/distinct-pyodide-build
joerick Mar 21, 2025
1b4f911
Convert to a proper toml-able option, and remove some hardcoded versions
joerick Mar 21, 2025
9d0f6bc
Add a schema entry
joerick Mar 21, 2025
b9f55e1
Add docs for CIBW_PYODIDE_VERSION
joerick Mar 24, 2025
611b032
Rephrase
joerick Mar 24, 2025
16f4c5d
Add tests for pyodide-version
joerick Mar 24, 2025
4f443c7
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick Mar 24, 2025
aef35c9
Apply suggestions from code review
joerick Mar 26, 2025
1061775
Add python_build_standalone util
joerick Apr 9, 2025
d47b080
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick Apr 9, 2025
5e3a8ed
Hook up to python-build-standalone, removing dependency on host python
joerick Apr 9, 2025
985fc46
Remove python hard-code in action.yml
joerick Apr 9, 2025
62b57e6
Add log step
joerick Apr 11, 2025
b3ee8d1
Add workaround for https://github.com/pyodide/pyodide-build/issues/143
joerick Apr 11, 2025
8b8cd62
Add emscripten pytest test
joerick Apr 11, 2025
5077397
Remove unneeded checks
joerick Apr 11, 2025
3efb38f
Fix a pytest invoke for emscripten
joerick Apr 11, 2025
468dd92
Generate pyodide-build constraints from the pinned pyodide version
joerick Apr 20, 2025
da3ffad
Remove pyodide python-build-standalone workaround
joerick Apr 20, 2025
15b894a
Fixup paths from newer version of pyodide-build
joerick Apr 20, 2025
5b860af
Fix/skip some failing tests
joerick Apr 20, 2025
471345b
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick Apr 20, 2025
ecc37a1
Use `python -m pytest` on pyodide, even on Linux
joerick Apr 21, 2025
fd805ae
Docs fixes
joerick Apr 21, 2025
c8fbd0b
Don't call the github API at runtime, cache the release assets instead
joerick Apr 26, 2025
89bdaa5
Ignore pylint false positive
joerick Apr 26, 2025
6f387f6
Add version auto-updating for pyodide
joerick Apr 26, 2025
95dea1d
Add support for pyodide 3.13.
joerick Apr 26, 2025
c9ee5a0
Fix tests for multiple pyodide wheels
joerick Apr 26, 2025
e440e11
Remove workaround for unreleased pyodide-build
joerick Apr 26, 2025
4f78dd8
Rename to "test_pyodide"
joerick Apr 26, 2025
6f3e6ca
Fix pathname confusion
joerick Apr 27, 2025
3dbe64c
Remove extra github actions job
joerick Apr 27, 2025
ea6e81f
Fix expectation for test_abi_none
joerick Apr 27, 2025
1cd3e22
Fix the custom_repair_wheel test to actually have clashing names
joerick Apr 27, 2025
9680dd9
Fix pinned version test
joerick Apr 28, 2025
78a37ef
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick Apr 28, 2025
60ee8a4
Document test-command limitation
joerick May 8, 2025
880f66a
Remove pyodide 0.28.0a1 for now
joerick May 8, 2025
243c029
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick May 8, 2025
e58bad6
Update constraints files
joerick May 8, 2025
2e7d716
Docs/test fixes post removing pyodide cp313
joerick May 8, 2025
ef51f83
Fix ABI test expectation
joerick May 8, 2025
062003f
Docs improvements
joerick May 10, 2025
4533cb1
Improve some comments
joerick May 10, 2025
57cdc60
Remove logic duplication
joerick May 10, 2025
32d06e6
remove pyodide special casing
joerick May 10, 2025
eb3789c
Refactor constraints code to use a utility script, circumventing impo…
joerick May 10, 2025
1823dce
Merge branch 'main' into feat/distinct-pyodide-build
henryiii May 14, 2025
b8fe94a
chore: nicer nox env
henryiii May 14, 2025
f844431
fix: typo in variable name found by copilot
henryiii May 14, 2025
5751bb0
Apply suggestions from code review
agriyakhetarpal May 14, 2025
9fd41d0
Some more Pyodide version updates in the docs section
agriyakhetarpal May 14, 2025
7994b0c
We haven't released Pyodide v0.27.6 yet
agriyakhetarpal May 14, 2025
76e8d58
Back to the Github URL for cross-build-environments
joerick May 15, 2025
006bb2f
`pyodide-build`, not `emsdk` for Windows skips
agriyakhetarpal May 15, 2025
ac64fc4
Move to a separate `_json_request` function
agriyakhetarpal May 16, 2025
5a40c1f
Rename "retries" ➡️ "retry_count"
agriyakhetarpal May 16, 2025
b94fc00
Add some type hints
agriyakhetarpal May 16, 2025
00137fb
Copy env vars before `UV_CUSTOM_COMPILE_COMMAND`
agriyakhetarpal May 16, 2025
5c8d57b
Use `HTTPError.headers.get` instead
agriyakhetarpal May 16, 2025
84314e4
Remove extra end quote
agriyakhetarpal May 16, 2025
b5b53cd
Merge remote-tracking branch 'origin/main' into feat/distinct-pyodide…
joerick May 16, 2025
f4c30a4
Change download tests URL to `https://badssl.com/`
agriyakhetarpal May 16, 2025
f7e5c00
Download size changes, too
agriyakhetarpal May 16, 2025
f97d5a8
Use jsdelivr for Github asset mirroring
joerick May 16, 2025
f8f6729
Bump to Pyodide v0.27.6
agriyakhetarpal May 16, 2025
1e03d09
Fix unit tests
joerick May 18, 2025
c795a41
Move to pyodide v0.27.6 again
agriyakhetarpal May 19, 2025
482d38c
Merge main
agriyakhetarpal May 19, 2025
a9d6434
Bump to pyodide-build 0.30.4
agriyakhetarpal May 20, 2025
1f9e496
Merge branch 'main' into feat/distinct-pyodide-build
agriyakhetarpal May 20, 2025
2396224
Use new URL for cross-build environments metadata
agriyakhetarpal May 20, 2025
f9453ed
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ jobs:
run: uv run --no-sync pytest --run-emulation ${{ matrix.arch }} test/test_emulation.py

test-pyodide:
name: Test cibuildwheel building Pyodide wheels
name: Test pyodide
needs: lint
runs-on: ubuntu-24.04
timeout-minutes: 180
Expand All @@ -222,6 +222,19 @@ jobs:
env:
CIBW_PLATFORM: pyodide

- name: Run a sample build (GitHub Action) for an overridden Pyodide version
uses: ./
with:
package-dir: sample_proj
output-dir: wheelhouse
# In case this breaks at any point in time, switch to using the latest version
# available or any other version that is not the same as the default one set
# in cibuildwheel/resources/build-platforms.toml.
env:
CIBW_PLATFORM: pyodide
CIBW_BUILD: "cp312*"
CIBW_PYODIDE_VERSION: "0.27.6"

- name: Run tests with 'CIBW_PLATFORM' set to 'pyodide'
run: |
uv run --no-sync ./bin/run_tests.py
Expand Down
3 changes: 1 addition & 2 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@ branding:
runs:
using: composite
steps:
# Set up the version of Python that supports pyodide
- uses: actions/setup-python@v5
id: python
with:
python-version: "3.12"
python-version: "3.11 - 3.13"
update-environment: false

- id: cibw
Expand Down
69 changes: 69 additions & 0 deletions bin/generate_pyodide_constraints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env python3

import sys
import textwrap
from pathlib import Path

import click

from cibuildwheel.extra import get_pyodide_xbuildenv_info


@click.command()
@click.argument(
"pyodide-version",
type=str,
)
@click.option(
"--output-file",
type=click.Path(),
default=None,
help="Output file to write the constraints to. If not provided, the constraints will be printed to stdout.",
)
def generate_pyodide_constraints(pyodide_version: str, output_file: str | None = None) -> None:
"""
Generate constraints for a specific Pyodide version. The constraints are
generated based on the Pyodide version's xbuildenv info, which is retrieved
from the Pyodide repository.

These constraints should then be 'pinned' using `uv pip compile`.

Example usage:

bin/generate_pyodide_constraints.py 0.27.0
"""
xbuildenv_info = get_pyodide_xbuildenv_info()
try:
pyodide_version_xbuildenv_info = xbuildenv_info["releases"][pyodide_version]
except KeyError as e:
msg = f"Pyodide version {pyodide_version} not found in xbuildenv info. Versions available: {', '.join(xbuildenv_info['releases'].keys())}"
raise click.BadParameter(msg) from e

pyodide_build_min_version = pyodide_version_xbuildenv_info.get("min_pyodide_build_version")
pyodide_build_max_version = pyodide_version_xbuildenv_info.get("max_pyodide_build_version")

pyodide_build_specifier_parts: list[str] = []

if pyodide_build_min_version:
pyodide_build_specifier_parts.append(f">={pyodide_build_min_version}")
if pyodide_build_max_version:
pyodide_build_specifier_parts.append(f"<={pyodide_build_max_version}")

pyodide_build_specifier = ",".join(pyodide_build_specifier_parts)

constraints_txt = textwrap.dedent(f"""
pip
build[virtualenv]
pyodide-build{pyodide_build_specifier}
click<8.2
""")

if output_file is None:
print(constraints_txt)
else:
Path(output_file).write_text(constraints_txt)
print(f"Constraints written to {output_file}", file=sys.stderr)


if __name__ == "__main__":
generate_pyodide_constraints()
3 changes: 3 additions & 0 deletions bin/generate_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,9 @@
xbuild-tools:
description: Binaries on the path that should be included in an isolated cross-build environment
type: string_array
pyodide-version:
type: string
description: Specify the version of Pyodide to use
repair-wheel-command:
description: Execute a shell command to repair each built wheel.
type: string_array
Expand Down
59 changes: 59 additions & 0 deletions bin/update_python_build_standalone.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/usr/bin/env python3

import json

from cibuildwheel.extra import github_api_request
from cibuildwheel.util.python_build_standalone import (
PythonBuildStandaloneAsset,
PythonBuildStandaloneReleaseData,
)
from cibuildwheel.util.resources import PYTHON_BUILD_STANDALONE_RELEASES


def main() -> None:
"""
This script updates the vendored list of release assets to the latest
version of astral-sh/python-build-standalone.
"""

# Get the latest release tag from the GitHub API
latest_release = github_api_request("repos/astral-sh/python-build-standalone/releases/latest")
latest_tag = latest_release["tag_name"]

# Get the list of assets for the latest release
github_assets = github_api_request(
f"repos/astral-sh/python-build-standalone/releases/tags/{latest_tag}"
)["assets"]

assets: list[PythonBuildStandaloneAsset] = []

for github_asset in github_assets:
name = github_asset["name"]
if not name.endswith("install_only.tar.gz"):
continue
url = github_asset["browser_download_url"]
assets.append({"name": name, "url": url})

# Write the assets to the JSON file. One day, we might need to support
# multiple releases, but for now, we only support the latest one
json_file_contents: PythonBuildStandaloneReleaseData = {
"releases": [
{
"tag": latest_tag,
"assets": assets,
}
]
}

with PYTHON_BUILD_STANDALONE_RELEASES.open("w", encoding="utf-8") as f:
json.dump(json_file_contents, f, indent=2)
# Add a trailing newline, our pre-commit hook requires it
f.write("\n")

print(
f"Updated {PYTHON_BUILD_STANDALONE_RELEASES.name} with {len(assets)} assets for tag {latest_tag}"
)


if __name__ == "__main__":
main()
53 changes: 51 additions & 2 deletions bin/update_pythons.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from rich.logging import RichHandler
from rich.syntax import Syntax

from cibuildwheel.extra import dump_python_configurations
from cibuildwheel.extra import dump_python_configurations, get_pyodide_xbuildenv_info

log = logging.getLogger("cibw")

Expand Down Expand Up @@ -57,7 +57,14 @@ class ConfigApple(TypedDict):
url: str


AnyConfig = ConfigWinCP | ConfigWinPP | ConfigWinGP | ConfigApple
class ConfigPyodide(TypedDict):
identifier: str
version: str
default_pyodide_version: str
node_version: str


AnyConfig = ConfigWinCP | ConfigWinPP | ConfigWinGP | ConfigApple | ConfigPyodide


# The following set of "Versions" classes allow the initial call to the APIs to
Expand Down Expand Up @@ -347,6 +354,39 @@ def update_version_ios(self, identifier: str, version: Version) -> ConfigApple |
return None


class PyodideVersions:
def __init__(self) -> None:
xbuildenv_info = get_pyodide_xbuildenv_info()
self.releases = xbuildenv_info["releases"]

def update_version_pyodide(
self, identifier: str, version: Version, spec: Specifier, node_version: str
) -> ConfigPyodide | None:
# get releases that match the python version
releases = [
r for r in self.releases.values() if spec.contains(Version(r["python_version"]))
]
# sort by version, latest first
releases.sort(key=lambda r: Version(r["version"]), reverse=True)

if not releases:
msg = f"Pyodide not found for {spec}!"
raise ValueError(msg)

final_releases = [r for r in releases if not Version(r["version"]).is_prerelease]

# prefer a final release if available, otherwise use the latest
# pre-release
release = final_releases[0] if final_releases else releases[0]

return ConfigPyodide(
identifier=identifier,
version=str(version),
default_pyodide_version=release["version"],
node_version=node_version,
)


# This is a universal interface to all the above Versions classes. Given an
# identifier, it updates a config dict.

Expand All @@ -369,6 +409,8 @@ def __init__(self) -> None:

self.graalpy = GraalPyVersions()

self.pyodide = PyodideVersions()

def update_config(self, config: MutableMapping[str, str]) -> None:
identifier = config["identifier"]
version = Version(config["version"])
Expand Down Expand Up @@ -407,6 +449,10 @@ def update_config(self, config: MutableMapping[str, str]) -> None:
config_update = self.windows_arm64.update_version_windows(spec)
elif "ios" in identifier:
config_update = self.ios_cpython.update_version_ios(identifier, version)
elif "pyodide" in identifier:
config_update = self.pyodide.update_version_pyodide(
identifier, version, spec, config["node_version"]
)

assert config_update is not None, f"{identifier} not found!"
config.update(**config_update)
Expand Down Expand Up @@ -445,6 +491,9 @@ def update_pythons(force: bool, level: str) -> None:
for config in configs["ios"]["python_configurations"]:
all_versions.update_config(config)

for config in configs["pyodide"]["python_configurations"]:
all_versions.update_config(config)

result_toml = dump_python_configurations(configs)

rich.print() # spacer
Expand Down
71 changes: 70 additions & 1 deletion cibuildwheel/extra.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@
These are utilities for the `/bin` scripts, not for the `cibuildwheel` program.
"""

import json
import time
import typing
import urllib.error
import urllib.request
from collections.abc import Mapping, Sequence
from io import StringIO
from typing import Protocol
from typing import Any, NotRequired, Protocol

from cibuildwheel import __version__ as cibw_version

__all__ = ("Printable", "dump_python_configurations")

Expand All @@ -30,3 +37,65 @@ def dump_python_configurations(
output.write("\n")
# Strip the final newline, to avoid two blank lines at the end.
return output.getvalue()[:-1]


def _json_request(request: urllib.request.Request, timeout: int = 30) -> dict[str, Any]:
with urllib.request.urlopen(request, timeout=timeout) as response:
return typing.cast(dict[str, Any], json.load(response))


def github_api_request(path: str, *, max_retries: int = 3) -> dict[str, Any]:
"""
Makes a GitHub API request to the given path and returns the JSON response.
"""
api_url = f"https://api.github.com/{path}"
headers = {
"Accept": "application/vnd.github.v3+json",
"User-Agent": f"cibuildwheel/{cibw_version}",
}
request = urllib.request.Request(api_url, headers=headers)

for retry_count in range(max_retries):
try:
return _json_request(request)
except (urllib.error.URLError, TimeoutError) as e:
# pylint: disable=E1101
if (
isinstance(e, urllib.error.HTTPError)
and (e.code == 403 or e.code == 429)
and e.headers.get("x-ratelimit-remaining") == "0"
):
reset_time = int(e.headers.get("x-ratelimit-reset", 0))
wait_time = max(0, reset_time - int(e.headers.get("date", 0)))
print(f"Github rate limit exceeded. Waiting for {wait_time} seconds.")
time.sleep(wait_time)
else:
print(f"Retrying GitHub API request due to error: {e}")

if retry_count == max_retries - 1:
print(f"GitHub API request failed (Network error: {e}). Check network connection.")
raise e

# Should never be reached but to keep the type checker happy
msg = "Unexpected execution path in github_api_request"
raise RuntimeError(msg)


class PyodideXBuildEnvRelease(typing.TypedDict):
version: str
python_version: str
emscripten_version: str
min_pyodide_build_version: NotRequired[str]
max_pyodide_build_version: NotRequired[str]


class PyodideXBuildEnvInfo(typing.TypedDict):
releases: dict[str, PyodideXBuildEnvRelease]


def get_pyodide_xbuildenv_info() -> PyodideXBuildEnvInfo:
xbuildenv_info_url = (
"https://pyodide.github.io/pyodide/api/pyodide-cross-build-environments.json"
)
with urllib.request.urlopen(xbuildenv_info_url) as response:
return typing.cast(PyodideXBuildEnvInfo, json.loads(response.read().decode("utf-8")))
4 changes: 4 additions & 0 deletions cibuildwheel/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ class BuildOptions:
build_frontend: BuildFrontendConfig | None
config_settings: str
container_engine: OCIContainerEngineConfig
pyodide_version: str | None

@property
def package_dir(self) -> Path:
Expand Down Expand Up @@ -840,6 +841,8 @@ def _compute_build_options(self, identifier: str | None) -> BuildOptions:
msg = f"Failed to parse container config. {e}"
raise errors.ConfigurationError(msg) from e

pyodide_version = self.reader.get("pyodide-version", env_plat=False)

return BuildOptions(
globals=self.globals,
test_command=test_command,
Expand All @@ -860,6 +863,7 @@ def _compute_build_options(self, identifier: str | None) -> BuildOptions:
build_frontend=build_frontend,
config_settings=config_settings,
container_engine=container_engine,
pyodide_version=pyodide_version or None,
)

def check_for_invalid_configuration(self, identifiers: Iterable[str]) -> None:
Expand Down
Loading