|
1 | 1 | # Python WebAssembly (WASM) build
|
2 | 2 |
|
3 |
| -**WARNING: WASM support is work-in-progress! Lots of features are not working yet.** |
| 3 | +**WASI support is [tier 2](https://peps.python.org/pep-0011/#tier-2).** |
| 4 | +**Emscripten is NOT officially supported as of Python 3.13.** |
4 | 5 |
|
5 | 6 | This directory contains configuration and helpers to facilitate cross
|
6 | 7 | compilation of CPython to WebAssembly (WASM). Python supports Emscripten
|
@@ -298,66 +299,7 @@ AddType application/wasm wasm
|
298 | 299 |
|
299 | 300 | ## WASI (wasm32-wasi)
|
300 | 301 |
|
301 |
| -**NOTE**: The instructions below assume a Unix-based OS due to cross-compilation for CPython being set up for `./configure`. |
302 |
| - |
303 |
| -### Prerequisites |
304 |
| - |
305 |
| -Developing for WASI requires two additional tools to be installed beyond the typical tools required to build CPython: |
306 |
| - |
307 |
| -1. The [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 16.0+ |
308 |
| -2. A WASI host/runtime ([wasmtime](https://wasmtime.dev) 14+ is recommended and what the instructions below assume) |
309 |
| - |
310 |
| -All of this is provided in the [devcontainer](https://devguide.python.org/getting-started/setup-building/#contribute-using-github-codespaces) if you don't want to install these tools locally. |
311 |
| - |
312 |
| -### Building |
313 |
| - |
314 |
| -Building for WASI requires doing a cross-build where you have a "build" Python to help produce a WASI build of CPython (technically it's a "host x host" cross-build because the build Python is also the target Python while the host build is the WASI build; yes, it's confusing terminology). In the end you should have a build Python in `cross-build/build` and a WASI build in `cross-build/wasm32-wasi`. |
315 |
| - |
316 |
| -The easiest way to do a build is to use the `wasi.py` script. You can either have it perform the entire build process from start to finish in one step, or you can do it in discrete steps that mirror running `configure` and `make` for each of the two builds of Python you end up producing (which are beneficial when you only need to do a specific step after getting a complete build, e.g. editing some code and you just need to run `make` for the WASI build). The script is designed to self-document what actions it is performing on your behalf, both as a way to check its work but also for educaitonal purposes. |
317 |
| - |
318 |
| -The discrete steps for building via `wasi.py` are: |
319 |
| -```shell |
320 |
| -python Tools/wasm/wasi.py configure-build-python |
321 |
| -python Tools/wasm/wasi.py make-build-python |
322 |
| -python Tools/wasm/wasi.py configure-host |
323 |
| -python Tools/wasm/wasi.py make-host |
324 |
| -``` |
325 |
| - |
326 |
| -To do it all in a single command, run: |
327 |
| -```shell |
328 |
| -python Tools/wasm/wasi.py build |
329 |
| -``` |
330 |
| - |
331 |
| -That will: |
332 |
| - |
333 |
| -1. Run `configure` for the build Python (same as `wasi.py configure-build-python`) |
334 |
| -2. Run `make` for the build Python (`wasi.py make-build-python`) |
335 |
| -3. Run `configure` for the WASI build (`wasi.py configure-host`) |
336 |
| -4. Run `make` for the WASI build (`wasi.py make-host`) |
337 |
| - |
338 |
| -See the `--help` for the various options available for each of the subcommands which controls things like the location of the WASI SDK, the command to use with the WASI host/runtime, etc. Also note that you can use `--` as a separator for any of the `configure`-related commands -- including `build` itself -- to pass arguments to the underlying `configure` call. For example, if you want a pydebug build that also caches the results from `configure`, you can do: |
339 |
| -```shell |
340 |
| -python Tools/wasm/wasi.py build -- -C --with-pydebug |
341 |
| -``` |
342 |
| - |
343 |
| -The `wasi.py` script is able to infer details from the build Python, and so you only technically need to specify `--with-pydebug` once via `configure-build-python` as this will lead to `configure-host` detecting its use if you use the discrete steps: |
344 |
| -```shell |
345 |
| -python Tools/wasm/wasi.py configure-build-python -- -C --with-pydebug |
346 |
| -python Tools/wasm/wasi.py make-build-python |
347 |
| -python Tools/wasm/wasi.py configure-host -- -C |
348 |
| -python Tools/wasm/wasi.py make-host |
349 |
| -``` |
350 |
| - |
351 |
| - |
352 |
| -### Running |
353 |
| - |
354 |
| -If you used `wasi.py` to do your build then there will be a `cross-build/wasm32-wasi/python.sh` file which you can use to run the `python.wasm` file (see the output from the `configure-host` subcommand): |
355 |
| -```shell |
356 |
| -cross-build/wasm32-wasi/python.sh --version |
357 |
| -``` |
358 |
| - |
359 |
| -While you _can_ run `python.wasm` directly, Python will fail to start up without certain things being set (e.g. `PYTHONPATH` for `sysconfig` data). As such, the `python.sh` file records these details for you. |
360 |
| - |
| 302 | +See [the devguide on how to build and run for WASI](https://devguide.python.org/getting-started/setup-building/#wasi). |
361 | 303 |
|
362 | 304 | ## Detecting WebAssembly builds
|
363 | 305 |
|
|
0 commit comments