All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- When the target Python is a pre-release, the
PYO3_USE_ABI3_FORWARD_COMPATIBILITYenvironment variable is now set for all builds so that PyO3 packages will build against the unstable CPython version.
-
The wrapper scripts written into a Pyodide virtual environment now quote every interpolated path, so
pyodide venvworks when the host Python, the cross-build environment, orPATHcontains a space. This previously brokeuv-managed Pythons on macOS, which live underLibrary/Application Support. #409 -
Pyodide virtual environments on Windows now include the
python.exeshim that Pyodide ships, and console scripts installed into them point at it. The venv previously had no.exeinterpreter at all, and the launcher that pip puts in front of a console script refuses to invoke anything else, so no installed script could be run. This needs a cross-build environment from Pyodide 0.29.3 or later, which is when the shim was first shipped. #409
-
Replaced the
pydanticdependency withattrs+cattrsfor recipe (meta.yaml) and cross-build environment metadata parsing/validation. Recipe validation errors now raisepyodide_build.recipe.spec.SpecValidationErrorinstead ofpydantic.ValidationError. -
The
rustflagsconfig is now applied via the target-specificCARGO_TARGET_WASM32_UNKNOWN_EMSCRIPTEN_RUSTFLAGSenvironment variable instead of the globalRUSTFLAGS, so the flags only affect thewasm32-unknown-emscriptentarget and no longer leak into host builds of build-dependencies and proc-macros.
- Unvendored tests that are generated from the package recipes are now compressed as a
.zipfile instead of a.tarfile. This should not affect any user-facing functionality. #401
-
Fixed several bugs in the cross-build-environment (xbuildenv) lifecycle #378:
- A Python-version marker mismatch on an already-installed xbuildenv will now refresh the host packages.
- Installing via
DEFAULT_CROSS_BUILD_ENV_URLis now treated like an explicit--urlinstall, so it no longer bakes a mangled, URL-derived version into the generated package index. pyodide xbuildenv useno longer raisesFileExistsErrorwhen thexbuildenvsymlink is dangling (its target was removed); the stale symlink is now cleaned up first.- A failure during a later installation step no longer deletes a pre-existing, valid cached xbuildenv.
-
Fixed a hang when a recipe
build/scriptorbuild/postends by exiting the shell itself (e.g.exit 0). The build no longer blocks forever waiting for an environment dump that never runs; the previous environment is kept instead. #383 -
Fixed per-package build variables (
PKGDIR,PKG_VERSION,DISTDIR, ...) leaking into the cached build-environment dict, which caused later packages in a sequentialbuild-recipesrun to see the previous package's values. #383 -
Fixed
find_matching_wheelraisingRuntimeError("Found multiple matching wheels")for a single file. #381 -
Fixed
pyodide clean recipesincorrectly cleaning packages taggedalways. #381 -
Fixed a bug where boolean and non-string values in pyproject.toml crashes pyodide CLI when loading config values #381
-
Sanitize
Content-Disposition: filename=...header values to prevent path traversal. #382 -
Fixed build constraints not being applied when using
uvas the installer by settingUV_BUILD_CONSTRAINTalongsidePIP_CONSTRAINTandPIP_BUILD_CONSTRAINT. #389 -
Fixed a dead-code control flow in
pyodide skeleton pypiwhere a package whose new release ships only wheels (while the recipe used an sdist) would raise an exception rather than updating to the wheel. #384 -
skeleton: fixed incorrect predictable URLs sdists for.zip-style sdists and packages with non-normalised names (such asruamel.yaml). #384 -
Fixed three bugs in
pyodide venv:pyodide venv --no-download/--never-downloadbeing silently ignored, versioned pip scripts (e.g.,pip3.12) being renamed topip3, and a failedpyodide venvinvocation deleting a pre-existing destination directory. #377
-
Fixed build-time scripts of unisolated packages (like
f2pyandnumpy-configfrom NumPy) not being available onPATHduring builds. #21 -
oldest-supported-numpyis now explicitly rejected when encountered as a build-time dependency. It is deprecated since NumPy 2.0, and packages that still list it should migrate to a directnumpydependency. #392
- Fixed an include path issue on macOS when homebrew Python is installed:
if
sys.prefixcontains a symlink (as is the case with homebrew), resolve it so that host include paths are still replaced by the cross-compile ones #375
-
CrossBuildEnvReleaseSpecnow has apublished_atfield containing the UTC timestamp when the release was published on GitHub (ISO 8601 format). This is exposed inpyodide xbuildenv search --allandpyodide xbuildenv search --all --json. #349 -
pyodide xbuildenv searchandpyodide xbuildenv installnow support--nightlyand--debugflags to search and install stable-debug, nightly, and nightly-debug cross-build environments respectively. #350, #354 -
pyodide buildnow accepts-v/--verboseflags (stackable twice up to-vv) to increase build verbosity. At-v, installer commands and backend hook invocations are shown. At-vv, the package installers (uv/pip) additionally receive a-vflag for detailed package resolution output. #363
- We now show better error message when
pyodide buildfails to install build dependencies. #346
- Fixed compatibility issue with newer pypa/build >= 1.4.4 #345
-
Fixed error when undefined environment variables are used in
meta.yaml. #331 -
pyodide venvnow works with new pip 26.1. #341
pyodide configexposes variablesemsdk_dirandemscripten_dirthat point to the Emscripten SDK installation directory and Emscripten installation directory respectively in the xbuildenv (these are only available after Emscripten gets installed into the xbuildenv via thepyodide xbuildenv install-emscriptencommand). #321, #326
- Platform name for the Pyodide wheel is now
pyemscripteninstead ofpyodide, following the PEP 783 standard. If you want to use the old platform name, you can set theUSE_LEGACY_PLATFORMenvironment variable to1. #319
- pyodide xbuildenv install can skip eager installation, and cross-build packages are installed on first build-time use.
-
vendor_sharedliboption is now enabled by default. #304 -
By default,
-Ozflag is used for C/C++ compilation instead of-O2, to reduce binary size. This can be overridden by settingcflagsandcxxflagsinpyproject.toml. #306
--enable-new-dtagslinker flag is now filtered out. #317
- Emscripten will now be auto installed when running
pyodide buildandpyodide build-recipesif the host system does not have emscripten installed. #293
- Fixed
pyodide venvnot working in Windows + Python 3.14. #299
- Added
--skip-cross-build-packagesflag (andPYODIDE_SKIP_CROSS_BUILD_PACKAGESenv var) topyodide xbuildenv install, allowing users to skip installing cross-build packages (numpy, scipy, cffi, pycparser) into the host site-packages. This is useful in locked-down environments where packages need to be pre-approved, and the user is building packages that don't depend on these at cross-compile time. - Added support for
PIP_BUILD_CONSTRAINTenvironment variable for pip 26.2+ compatibility. The build system now prioritizesPIP_BUILD_CONSTRAINToverPIP_CONSTRAINTwhen determining build-time constraints, while maintaining backward compatibility.
- The feature to build packages with dependencies is now opt-in feature. It needs to be enabled by
installing pyodide-build with
pip install pyodide-build[resolve]. #277
- Fixed
pyodide venvnot working in Windows with virtualenv 20.38. #298
- Dropped
typerdependency in favor ofclick. #287
- Added
--cleanoption to clean up temporary build files after building a package withpyodide build-recipes. #282
- Fixed an issue where pip inside the Pyodide venv would not correctly handle the arguments with spaces. #281
pyodide venvnow works in Windows. It only works with Pyodide 0.29.1 and later. #274
- Removed
pyodide create-zipfilesubcommand. This command is was used only for building pyodide runtime and not for building packages. #276
-
Fixed an issue where the compiler flags such as
cflags,cxxflags, andldflagsfrom the meta.yaml were being overridden by those from the default build arguments. #270 -
Default
cxxflagsare not equal to thecflags#255
- Added
pyodide clean recipes, a CLI command that deletes build files for chosen packages or tags. #254
-
pyodide confignow exposesdist_dirvariable. #236 -
The CMake toolchain file for Pyodide now sets
CMAKE_SHARED_LINKER_FLAGS_INITandCMAKE_MODULE_LINKER_FLAGS_INITand unsetCMAKE_SHARED_LINKER_FLAGSto avoid conflicts with the user's settings. #247
pyodide confignow exposesrust_emscripten_target_url. #225
-
Fixed compatibility with
virtualenv20.31 and later. The Pyodide virtual environment viapyodide venvno longer seedswheel, i.e., the--wheel/--no-wheeloptions are not available anymore. #208 -
The default cross-build metadata URL was changed to https://pyodide.github.io/pyodide/api/pyodide-cross-build-environments.json to circumvent rate limits imposed by GitHub. It remains overridable by setting the
PYODIDE_CROSS_BUILD_ENV_METADATA_URLenvironment variable. #206
- Added
interpreterandpacakge_indexto the variables available viapyodide config get. #199
pyodide configexposes new variables:pyodide_root,pyodide_abi_version, andpython_include_dir, andignored_build_requirements. #186 and #187
pyodide venvnow works in uv-managed environments. See issue #143. #185
-
Added basic support for uv.
uv tool install pyodide-cli --with pyodide-build, oruvx --from pyodide-cli --with pyodide-build pyodide --help, or usingpyodide-buildinuv-managed virtual environments will now work. #132 -
pyodide buildnow takes an additional--xbuildenv-pathargument and corresponding equivalentPYODIDE_XBUILDENV_PATHenvironment variable to either use an existing cross-build environment or create one at the specified path. This means that users can usepyodide xbuildenv install <...> --pathto install a cross-build environment somewhere and reuse this withpyodide build. #158 -
Added a new config variable
xbuildenv_paththat can be left in the[tool.pyodide.build]section inpyproject.tomland retrieved throughpyodide config get xbuildenv_path. Thepyodide xbuildenvandpyodide buildcommands will setup/use cross-build environments at this path if one isn't specified as a CLI argument or unless overridden through thePYODIDE_XBUILDENV_PATHenvironment variable. #158 -
Added support for building without a wheel without build isolation:
pyodide buildno accepts the--no-isolation/-nand/or--skip-dependency-check/-xflags to customise the wheel building behaviour, similar topypa/build. #152
-
The Rust toolchain version has been updated to
nightly-2025-01-18. #103 -
Pyodide cross-build environments will now be installed in the user cache directory by default, which is
<home>/.cacheor XDG cache in Linux systems, and/Users/<user>/Library/Cachesin macOS. #148 -
Removed
cmakedependency from the package. The Pyodide build system now uses thecmakepackage specified in thepyproject.tomlfile of the target package. #141
- Fixed Pyodide venv
sys_platformmarker evaluation with pip >= 25. #108
-
Added new configuration variable
default_cross_build_env_url. #85 -
Added a new recipe key
requirement.constraintto set the package-level constraints. #97 -
The
pyodide venvcommand now supports morevirtualenvcommand-line flags to customise the virtual environment creation behaviour (experimental) #117
- Fixed
pyodide venvcommand not loading the shared libraries correctly, resulting in the package load failure. This bug was introduced in version 0.28. #67
- Add
skip_emscripten_version_checkflag and SKIP_EMSCRIPTEN_VERSION_CHECK environment variable to skip emscripten version check. #53 - Set the
EM_PKG_CONFIG_PATHenvironment variable used by emscripten/pkg-configto discover dependencies #52
-
Source tar files are now extracted with python's data filter #52
-
The
pyodide buildcommand will now raise an error if the local Python version has been changed, after the cross-build environment has been set up. #62
- The
pyodide xbuildenv searchcommand now accepts a--jsonflag to output the search results in JSON format that is machine-readable. The design for the regular tabular output has been improved. #28
-
The
pyodide skeleton pypi --updatecommand and the--update-patchedvariant now validate the version and the source checksum when updating a package's recipe. #27 -
pyo3_config_fileis no longer available inpyodide configcommand. Pyodide now setsPYO3_CROSS_PYTHON_VERSION,PYO3_CROSS_LIB_DIRto specify the cross compilation environment for PyO3. #19
pyodide xbuildenvsubcommand is now publicly available. #15
- It is now possible to override
_f2c_fixes.pyfile, with_f2c_fixes_wrappervariable. #8
-
pyodide py-compilecommand now acceptsexcludesflag. #9 -
cpython_moduletype recipes now should output wheels #10
- ported f2c_fixes patch from pyodide/pyodide#4822
- pyodide-build is now developed under https://github.com/pyodide/pyodide-build.