# Important links - [`os-wasi` label](https://github.com/python/cpython/labels/OS-wasi) - [WASI dev container definition](https://github.com/python/cpython-devcontainers/tree/main/wasicontainer) ([image](https://github.com/python/cpython-devcontainers/pkgs/container/wasicontainer)) - Buildbot [builders](https://buildbot.python.org/#/builders?tags=%2Bwasi) # Legend - πŸ₯§ beginner-friendly ("as easy as pie") - πŸ”– Working on it (bookmark where I/someone left off) - πŸ›‘ Blocked by something (stop and check status before proceeding) # Plans - [ ] `wasi package` - [x] Figure out file name (`python-3.25.0a3-wasm32-wasip1.tar.xz`; host triple from `config.toml`; [`platform.python_version()`](https://docs.python.org/3/library/platform.html#platform.python_version)) - [x] Research what should be shipped for building extensions - [X] [Refactor](https://github.com/brettcannon/cpython/tree/wasi-refactor) `Platforms/WASI` to support other subcommands ([PR](https://github.com/python/cpython/pull/145404)) - [ ] πŸ”– Get tests passing ([[#Release build test failure exploration]]) - [x] REPL - [ ] `test.test_io.test_fileio` - [ ] `test_stat` - [ ] Backport - [ ] 3.15 (and update buildbot to use the new builder) - [ ] Add a `release` subcommand to do e2e source to release (`clean`, builds with `--without-static-libpython` via `configure-host --release`, then `package`) - [ ] Use at https://github.com/brettcannon/cpython-wasi-build/ - [ ] Use in CI - [ ] Have the RM release the [binaries via GHA](https://github.com/python/release-tools/blob/main/.github/workflows/build-release.yml) - [ ] PEP for a wheel tag ([discussion](https://bytecodealliance.zulipchat.com/#narrow/channel/219900-wasi/topic/Platform.20tags.20for.20packages.20targeting.20WASI/with/516694780)) - [x] Expose WASI details in `sys` or `platform` ([changes in wasi-libc](https://github.com/WebAssembly/wasi-libc/issues/688)) - [ ] Draft PEP (thanks to PEP 816, might be able to do just `wasi_wasm32` and non-standard `wasi_N_N_sdk_N_wasm32` in `packaging` when not matching PEP 11) - [ ] Post to DPO - [ ] Submit for approval - [ ] [External dependencies](https://github.com/python/cpython-source-deps) via `wasi externals` - [ ] Figure out what version policy we want (i.e. always latest or freeze versions like Windows builds? If latter, specify in `config.toml`) - [ ] [zlib](https://github.com/python/cpython/issues/91246) (and potentially undoing part of https://github.com/python/cpython/pull/130297) or zlib-ng - `RANLIB=/opt/wasi-sdk-29.0-x86_64-linux/bin/ranlib CC=/opt/wasi-sdk-29.0-x86_64-linux/bin/clang CHOST=wasm32 ./configure --static --zlib-compat --prefix <...> && make install` - Blank out `PKG_CONFIG_SYSROOT_DIR` and `PKG_CONFIG_PATH`, set `PKG_CONFIG_LIBDIR` to where `lib/pkgconfig` ended up from `--prefix` - [ ] bzip2 - [ ] xz - [`get_externals.bat`](https://github.com/python/cpython/blob/5592399313c963c110280a7c98de974889e1d353/PCbuild/get_externals.bat#L61) - [`python.props`](https://github.com/python/cpython/blob/5592399313c963c110280a7c98de974889e1d353/PCbuild/python.props#L73) - [`externals.spdx.json`](https://github.com/python/cpython/blob/5592399313c963c110280a7c98de974889e1d353/Misc/externals.spdx.json#L160) - [ ] sqlite - [ ] zstd - [ ] mpdecimal - [x] OpenSSL (not safe as WebAssembly doesn't have constant-time ops) - [ ] πŸ›‘ Networking under WASI 0.3 (blocked on threading in WASI 0.3 being released) - [Joel's hack](https://github.com/dicej/cpython/commit/118e9d8eeabb6345d57295f6cec1616694eacbc2) - [wasi-libc patches](https://github.com/WebAssembly/wasi-libc/blob/main/test/scripts/cpython3.14.patch) - Any tests requiring threads probably won't work - See the [headers in wasi-libc](https://github.com/WebAssembly/wasi-libc/tree/main/libc-top-half/musl/include) for what can be turned on - Will probably require tweaking `config.site` - [ ] πŸ₯§ Make sure build details are still relevant - [ ] Check if all the flags set in `configure.ac` are necessary - [ ] Check what `__wasi__` usage can be removed ([issue](https://github.com/python/cpython/issues/156692)) - [x] [Check](https://github.com/python/cpython/issues/115982) that the [site config](https://github.com/python/cpython/blob/main/Tools/wasm/config.site-wasm32-wasi) is up-to-date - [ ] [[HTTP fetch API]] # Release build test failure exploration https://github.com/WebAssembly/wasi-libc/issues/888 ``` ``` ο»ΏUser: When you run `./cross-build/wasm32-wasip3/python.sh -m test test_stat`, the tests pass. But when you run `./dist/python-3.16.0a1-wasm32-wasip3/bin/python3.16.wasmtime -m test test_stat`, the same tests fail. The code is the same, the only difference is the former is running inside a CPython checkout while the latter is not (put there via `python3 Platforms/WASI gather`). Figure out why the tests fail when run outside of a checkout. See @Platforms/WASI/README.md if you end up needing to rebuild any C code (I just did a build, so you don't need to worry about it unless you edit some C code). Assistant: I’ll read CPython’s AI policy, reproduce both runs, and trace what differs between the checkout and gathered installation. Assistant: The checkout run passes because it cannot see `/dev`, so `test_devices` never exercises a device. The installed runner exposes the host root; it finds `/dev/sda`, but WASI reports its mode as `0`, causing both failures. I’ll verify that changing filesystem visibility alone reproducesβ€”and removesβ€”the failures. Assistant: **The difference is filesystem exposure, not whether Python is installed.** The two `.wasm` binaries are byte-for-byte identical. - The checkout launcher maps the checkout to guest `/`. Consequently, `/dev/null` and `/dev/sda` do not exist, and `test_devices` passes without testing any devices. - The gathered launcher uses `--dir "/"` (`Platforms/WASI/_package.py:34`), exposing the host filesystem. `/dev/sda` exists, but `os.stat('/dev/sda').st_mode` returns `0`, so `stat.filemode()` produces `?---------` rather than a block-device mode. This fails the assertion at `Lib/test/test_stat.py:218` in both the C and pure-Python variants. `/dev/null` is classified correctly. **Verified by changing only mounts:** exposing host `/dev` to the checkout binary reproduces both failures; hiding devices from the installed binary makes all tests pass. The checkout run therefore masks a block-device stat problem in the WASI execution stackβ€”it isn’t a gathering or installation-layout problem. No files changed or rebuild needed. User: Is WASI doing something wrong and thus has a C function that should be considered undefined in @Platforms/WASI/config.site-wasm32-wasi , or should the failing test(s) just be skipped under WASI? Assistant: I’ll check the WASI stat contract and CPython’s configuration to distinguish an unavailable C function from incorrect device metadata. Assistant: **This looks like a bug in the WASI execution stack, not an unavailable C function. I would neither change `config.site-wasm32-wasi` nor blanket-skip `test_devices` on WASI.** `stat()` works for regular files, directories, and character devices; it returns incorrect type information specifically for this block device. Disabling `stat`, `lstat`, or `fstatat` would remove useful functionality without addressing that distinction. Disabling `mknod` is unrelated: the test inspects an existing device rather than creating one. Block devices are explicitly supported: [SDK 34’s wasi-libc conversion](https://github.com/WebAssembly/wasi-libc/blob/2e6fb9d8ee0cdf9e431fbcabe8af3115de000a13/libc-bottom-half/cloudlibc/src/libc/sys/stat/stat_impl.h#L102-L125) maps them to `S_IFBLK`, and [Wasmtime 50’s WASIp3 conversion](https://github.com/bytecodealliance/wasmtime/blob/v50.0.0/crates/wasi/src/p3/filesystem/mod.rs#L366-L375) preserves the block-device type. Returning mode `0` is therefore unexpected, not an inherent WASI limitation. I have not isolated which component loses that information. **Recommendation:** retain the failing assertion and investigate upstream. If a temporary workaround is necessary, skip only the block-device portion for the affected configuration, with a linked upstream issue; preserve the working `/dev/null` check. The current combined test would need splitting to make that skip appropriately narrow. User: What should the mode be Assistant: For `/dev/sda`, WASI should report **`0o060000` (`stat.S_IFBLK`)**, giving `stat.filemode(...) == 'b---------'`. WASI doesn’t preserve POSIX permission bits here, so it needn’t match the host’s full mode, `0o060660`. The missing block-device type bits are the problem. User: Can you give me the line of Python code I can run with `-c` to show the issue Assistant: ```sh ./dist/python-3.16.0a1-wasm32-wasip3/bin/python3.16.wasmtime -c 'import os, stat; mode = os.stat("/dev/sda").st_mode; print("actual:", oct(mode), "expected:", oct(stat.S_IFBLK)); assert stat.S_ISBLK(mode)' ``` User: How about the test `test.test_io.test_fileio`; same situation of passing in one place and not the other Assistant: I’ll run `test.test_io.test_fileio` with both launchers and check which filesystem differences trigger the failure. Assistant: The installed tests pass without a terminal, but fail when I give them a controlling terminal. The difference is `/dev/tty`: the checkout cannot see it, while the installed runner can open it. I’ll check which terminal properties the test receives. Assistant: **Same filesystem-exposure cause, but this time `/dev/tty`.** I reproduced two failures with a controlling terminal; without one, both launchers pass. Both `COtherFileTests.testAbles` and `PyOtherFileTests.testAbles` fail at `Lib/test/test_io/test_fileio.py:570`: `/dev/tty` reports `seekable() == True`, although the test expects `False`. It also reports `isatty() == False`, which would fail the next assertion. Native Python reports the expected `False`/`True`. The checkout cannot open `/dev/tty`, so it bypasses these assertions. The installed runner exposes it and exercises them. **This is a wasi-libc limitation:** filesystem descriptors [emulate seeking using a stored offset and have no `isatty` hook](https://github.com/WebAssembly/wasi-libc/blob/2e6fb9d8ee0cdf9e431fbcabe8af3115de000a13/libc-bottom-half/sources/file.c#L263-L381). Terminal detection is implemented separately for standard streamsβ€”indeed, `os.isatty(0)` correctly returned `True`. I would skip only the `/dev/tty` section on WASI, preserving the ordinary-file checksβ€”not disable `lseek` or `isatty` in configure. Run this **from a terminal** to demonstrate it: ```sh ./dist/python-3.16.0a1-wasm32-wasip3/bin/python3.16.wasmtime -c 'import io; f = io.FileIO("/dev/tty", "a"); print("seekable:", f.seekable(), "isatty:", f.isatty()); f.close()' ``` No files changed. User: So WASI reports stdin as a tty but not `/dev/tty` Assistant: Yesβ€”**when attached to a terminal**. WASI’s standard streams carry explicit terminal information, so `os.isatty(0)` returns `True`. Opening `/dev/tty` creates a filesystem descriptor without that terminal-detection support, so its `isatty()` returns `False`, even though it refers to the terminal. User: Is this by design in wasi-libc Assistant: I’ll check whether wasi-libc documents this as a deliberate limitation, rather than just reflecting its current implementation. Assistant: **Yes, in the sense that it follows the current WASIp2/p3 API designβ€”not an accidental Python discrepancy.** [WASI exposes terminal capabilities specifically for stdin/stdout/stderr](https://github.com/WebAssembly/wasi-cli/blob/main/wit/terminal.wit), not for arbitrary filesystem descriptors. wasi-libc reflects that separation: its filesystem descriptors have no `isatty` hook, and [`isatty()` explicitly returns false with `ENOTTY` when that hook is absent](https://github.com/WebAssembly/wasi-libc/blob/2e6fb9d8ee0cdf9e431fbcabe8af3115de000a13/libc-bottom-half/sources/isatty.c#L31-L42). So this is an architectural limitation, though I haven’t found an explicit maintainer statement about `/dev/tty` specifically. Skipping that POSIX-specific section on WASI is reasonable; disabling `isatty` globally would incorrectly remove working standard-stream detection. User: Should the test be turned off, or should a `skipIf` decorator be used if `/dev/tty` isn't an actual TTY? Or is the point of the test to make sure `/dev/tty` reports it's a TTY? Assistant: **Yesβ€”the `/dev/tty` section is explicitly testing that `FileIO` reports terminal properties correctly.** Skipping when `isatty()` returns false would use the behavior under test to decide whether to test it, hiding genuine regressions. The existing handling already bypasses that section when opening `/dev/tty` fails. WASI is different: opening succeeds, but its API cannot provide the expected terminal semantics. **Best approach:** extract the `/dev/tty` section into a separate test and decorate it with `@unittest.skipIf(is_wasi, "WASI filesystem descriptors do not support terminal detection")`. Keep the ordinary-file portion of `testAbles` enabled. That documents the known platform limitation without weakening the assertion elsewhere. # Packaging notes ```shell ./configure --without-static-libpython --prefix (pwd)/builddir && make -s -j && make install ``` ## Release ```shell ➲ ls πŸ“‚ bin πŸ“‚ include πŸ“‚ lib πŸ“‚ share ``` ```shell ➲ ls bin/ πŸ”– idle3 πŸ— idle3.15 πŸ— pip3 πŸ— pip3.15 πŸ”– pydoc3 πŸ— pydoc3.15 πŸ”– python3 πŸ”– python3-config πŸ— python3.15 πŸ— python3.15-config ``` ```shell ➲ ls include/python3.15/ πŸ“„ abstract.h πŸ“„ codecs.h πŸ“„ dictobject.h πŸ“„ floatobject.h πŸ“„ listobject.h πŸ“„ object.h πŸ“„ py_curses.h πŸ“„ pyexpat.h πŸ“„ pymem.h πŸ“„ pythonrun.h πŸ“„ structmember.h πŸ“„ warnings.h πŸ“„ audit.h πŸ“„ compile.h πŸ“„ dynamic_annotations.h πŸ“„ frameobject.h πŸ“„ longobject.h πŸ“„ objimpl.h πŸ“„ pyatomic.h πŸ“„ pyframe.h πŸ“„ pyport.h πŸ“„ pythread.h πŸ“„ structseq.h πŸ“„ weakrefobject.h πŸ“„ bltinmodule.h πŸ“„ complexobject.h πŸ“„ enumobject.h πŸ“„ genericaliasobject.h πŸ“„ marshal.h πŸ“„ opcode.h πŸ“„ pybuffer.h πŸ“„ pyhash.h πŸ“„ pystate.h πŸ“„ pytypedefs.h πŸ“„ sysmodule.h πŸ“„ boolobject.h πŸ“‚ cpython πŸ“„ errcode.h πŸ“„ import.h πŸ“„ memoryobject.h πŸ“„ opcode_ids.h πŸ“„ pycapsule.h πŸ“„ pylifecycle.h πŸ“„ pystats.h πŸ“„ rangeobject.h πŸ“„ traceback.h πŸ“„ bytearrayobject.h πŸ“„ critical_section.h πŸ“„ exports.h πŸ“‚ internal πŸ“„ methodobject.h πŸ“„ osdefs.h πŸ“„ pyconfig.h πŸ“„ pymacconfig.h πŸ“„ pystrcmp.h πŸ“„ refcount.h πŸ“„ tupleobject.h πŸ“„ bytesobject.h πŸ“„ datetime.h πŸ“„ fileobject.h πŸ“„ intrcheck.h πŸ“„ modsupport.h πŸ“„ osmodule.h πŸ“„ pydtrace.h πŸ“„ pymacro.h πŸ“„ pystrtod.h πŸ“„ setobject.h πŸ“„ typeslots.h πŸ“„ ceval.h πŸ“„ descrobject.h πŸ“„ fileutils.h πŸ“„ iterobject.h πŸ“„ moduleobject.h πŸ“„ patchlevel.h πŸ“„ pyerrors.h πŸ“„ pymath.h πŸ“„ Python.h πŸ“„ sliceobject.h πŸ“„ unicodeobject.h ``` ```shell ➲ ls lib/ πŸ“‚ pkgconfig πŸ“‚ python3.15 ``` ```shell ➲ ls lib/pkgconfig/ πŸ“„ python-3.15-embed.pc πŸ“„ python-3.15.pc πŸ”– python3-embed.pc πŸ”– python3.pc ``` ```shell ➲ ls lib/python3.15/ πŸ“„ __future__.py πŸ“„ _pyio.py πŸ“„ calendar.py πŸ“„ dataclasses.py πŸ“„ gettext.py πŸ“„ locale.py πŸ“„ platform.py πŸ“„ sched.py πŸ“„ symtable.py πŸ“„ types.py πŸ“„ __hello__.py πŸ“„ _pylong.py πŸ“„ cmd.py πŸ“„ datetime.py πŸ“„ glob.py πŸ“‚ logging πŸ“„ plistlib.py πŸ“„ secrets.py πŸ“‚ sysconfig πŸ“„ typing.py πŸ“‚ __phello__ πŸ“‚ _pyrepl πŸ“„ code.py πŸ“‚ dbm πŸ“„ graphlib.py πŸ“„ lzma.py πŸ“„ poplib.py πŸ“„ selectors.py πŸ“„ tabnanny.py πŸ“‚ unittest πŸ“‚ __pycache__ πŸ“„ _sitebuiltins.py πŸ“„ codecs.py πŸ“„ decimal.py πŸ“„ gzip.py πŸ“„ mailbox.py πŸ“„ posixpath.py πŸ“„ shelve.py πŸ“„ tarfile.py πŸ“‚ urllib πŸ“„ _aix_support.py πŸ“„ _strptime.py πŸ“„ codeop.py πŸ“„ difflib.py πŸ“„ hashlib.py πŸ“„ mimetypes.py πŸ“„ pprint.py πŸ“„ shlex.py πŸ“„ tempfile.py πŸ“„ uuid.py πŸ“„ _android_support.py πŸ“„ _sysconfig_vars__linux_x86_64-linux-gnu.json πŸ“‚ collections πŸ“„ dis.py πŸ“„ heapq.py πŸ“„ modulefinder.py πŸ“„ profile.py πŸ“„ shutil.py πŸ“‚ test πŸ“‚ venv πŸ“„ _apple_support.py πŸ“„ _sysconfigdata__linux_x86_64-linux-gnu.py πŸ“„ colorsys.py πŸ“„ doctest.py πŸ“„ hmac.py πŸ“‚ multiprocessing πŸ“‚ profiling πŸ“„ signal.py πŸ“„ textwrap.py πŸ“„ warnings.py πŸ“„ _ast_unparse.py πŸ“„ _threading_local.py πŸ“„ compileall.py πŸ“‚ email πŸ“‚ html πŸ“„ netrc.py πŸ“„ pstats.py πŸ“‚ site-packages πŸ“„ this.py πŸ“„ wave.py πŸ“„ _collections_abc.py πŸ“„ _weakrefset.py πŸ“‚ compression πŸ“‚ encodings πŸ“‚ http πŸ“„ ntpath.py πŸ“„ pty.py πŸ“„ site.py πŸ“„ threading.py πŸ“„ weakref.py πŸ“„ _colorize.py πŸ“„ abc.py πŸ“‚ concurrent πŸ“‚ ensurepip πŸ“‚ idlelib πŸ“„ nturl2path.py πŸ“„ py_compile.py πŸ“„ smtplib.py πŸ“„ timeit.py πŸ“„ webbrowser.py πŸ“„ _compat_pickle.py πŸ“„ annotationlib.py πŸ“‚ config-3.15-x86_64-linux-gnu πŸ“„ enum.py πŸ“„ imaplib.py πŸ“„ numbers.py πŸ“„ pyclbr.py πŸ“„ socket.py πŸ“‚ tkinter πŸ“‚ wsgiref πŸ“„ _ios_support.py πŸ“„ antigravity.py πŸ“„ configparser.py πŸ“„ filecmp.py πŸ“‚ importlib πŸ“„ opcode.py πŸ“„ pydoc.py πŸ“„ socketserver.py πŸ“„ token.py πŸ“‚ xml πŸ“„ _markupbase.py πŸ“„ argparse.py πŸ“„ contextlib.py πŸ“„ fileinput.py πŸ“„ inspect.py πŸ“„ operator.py πŸ“‚ pydoc_data πŸ“‚ sqlite3 πŸ“„ tokenize.py πŸ“‚ xmlrpc πŸ“„ _missing_stdlib_info.py πŸ“„ ast.py πŸ“„ contextvars.py πŸ“„ fnmatch.py πŸ“„ io.py πŸ“„ optparse.py πŸ“„ queue.py πŸ“„ ssl.py πŸ“‚ tomllib πŸ“„ zipapp.py πŸ“„ _opcode_metadata.py πŸ“‚ asyncio πŸ“„ copy.py πŸ“„ fractions.py πŸ“„ ipaddress.py πŸ“„ os.py πŸ“„ quopri.py πŸ“„ stat.py πŸ“„ trace.py πŸ“‚ zipfile πŸ“„ _osx_support.py πŸ“„ base64.py πŸ“„ copyreg.py πŸ“„ ftplib.py πŸ“‚ json πŸ“‚ pathlib πŸ“„ random.py πŸ“„ statistics.py πŸ“„ traceback.py πŸ“„ zipimport.py πŸ“„ _py_abc.py πŸ“„ bdb.py πŸ“„ cProfile.py πŸ“„ functools.py πŸ“„ keyword.py πŸ“„ pdb.py πŸ“‚ re πŸ“‚ string πŸ“„ tracemalloc.py πŸ“‚ zoneinfo πŸ“„ _py_warnings.py πŸ“„ bisect.py πŸ“„ csv.py πŸ“„ genericpath.py πŸ“‚ lib-dynload πŸ“„ pickle.py πŸ“„ reprlib.py πŸ“„ stringprep.py πŸ“„ tty.py πŸ“„ _pydatetime.py πŸ“„ build-details.json πŸ“‚ ctypes πŸ“„ getopt.py πŸ“„ LICENSE.txt πŸ“„ pickletools.py πŸ“„ rlcompleter.py πŸ“„ struct.py πŸ“„ turtle.py πŸ“„ _pydecimal.py πŸ“„ bz2.py πŸ“‚ curses πŸ“„ getpass.py πŸ“„ linecache.py πŸ“„ pkgutil.py πŸ“„ runpy.py πŸ“„ subprocess.py πŸ“‚ turtledemo ``` ```shell /tmp/cp-install ➲ ls lib/python3.15/lib-dynload/ πŸ— _bisect.cpython-315-x86_64-linux-gnu.so πŸ— _heapq.cpython-315-x86_64-linux-gnu.so πŸ— _sha2.cpython-315-x86_64-linux-gnu.so πŸ— _zoneinfo.cpython-315-x86_64-linux-gnu.so πŸ— zlib.cpython-315-x86_64-linux-gnu.so πŸ— _blake2.cpython-315-x86_64-linux-gnu.so πŸ— _hmac.cpython-315-x86_64-linux-gnu.so πŸ— _sha3.cpython-315-x86_64-linux-gnu.so πŸ— _zstd.cpython-315-x86_64-linux-gnu.so πŸ— _bz2.cpython-315-x86_64-linux-gnu.so πŸ— _interpchannels.cpython-315-x86_64-linux-gnu.so πŸ— _socket.cpython-315-x86_64-linux-gnu.so πŸ— array.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_cn.cpython-315-x86_64-linux-gnu.so πŸ— _interpqueues.cpython-315-x86_64-linux-gnu.so πŸ— _sqlite3.cpython-315-x86_64-linux-gnu.so πŸ— binascii.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_hk.cpython-315-x86_64-linux-gnu.so πŸ— _interpreters.cpython-315-x86_64-linux-gnu.so πŸ— _ssl.cpython-315-x86_64-linux-gnu.so πŸ— cmath.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_iso2022.cpython-315-x86_64-linux-gnu.so πŸ— _json.cpython-315-x86_64-linux-gnu.so πŸ— _statistics.cpython-315-x86_64-linux-gnu.so πŸ— fcntl.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_jp.cpython-315-x86_64-linux-gnu.so πŸ— _lsprof.cpython-315-x86_64-linux-gnu.so πŸ— _struct.cpython-315-x86_64-linux-gnu.so πŸ— grp.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_kr.cpython-315-x86_64-linux-gnu.so πŸ— _lzma.cpython-315-x86_64-linux-gnu.so πŸ— _testbuffer.cpython-315-x86_64-linux-gnu.so πŸ— math.cpython-315-x86_64-linux-gnu.so πŸ— _codecs_tw.cpython-315-x86_64-linux-gnu.so πŸ— _math_integer.cpython-315-x86_64-linux-gnu.so πŸ— _testcapi.cpython-315-x86_64-linux-gnu.so πŸ— mmap.cpython-315-x86_64-linux-gnu.so πŸ— _csv.cpython-315-x86_64-linux-gnu.so πŸ— _md5.cpython-315-x86_64-linux-gnu.so πŸ— _testclinic.cpython-315-x86_64-linux-gnu.so πŸ— pyexpat.cpython-315-x86_64-linux-gnu.so πŸ— _ctypes.cpython-315-x86_64-linux-gnu.so πŸ— _multibytecodec.cpython-315-x86_64-linux-gnu.so πŸ— _testclinic_limited.cpython-315-x86_64-linux-gnu.so πŸ— readline.cpython-315-x86_64-linux-gnu.so πŸ— _ctypes_test.cpython-315-x86_64-linux-gnu.so πŸ— _multiprocessing.cpython-315-x86_64-linux-gnu.so πŸ— _testimportmultiple.cpython-315-x86_64-linux-gnu.so πŸ— resource.cpython-315-x86_64-linux-gnu.so πŸ— _curses.cpython-315-x86_64-linux-gnu.so πŸ— _pickle.cpython-315-x86_64-linux-gnu.so πŸ— _testinternalcapi.cpython-315-x86_64-linux-gnu.so πŸ— select.cpython-315-x86_64-linux-gnu.so πŸ— _curses_panel.cpython-315-x86_64-linux-gnu.so πŸ— _posixshmem.cpython-315-x86_64-linux-gnu.so πŸ— _testlimitedcapi.cpython-315-x86_64-linux-gnu.so πŸ— syslog.cpython-315-x86_64-linux-gnu.so πŸ— _dbm.cpython-315-x86_64-linux-gnu.so πŸ— _posixsubprocess.cpython-315-x86_64-linux-gnu.so πŸ— _testmultiphase.cpython-315-x86_64-linux-gnu.so πŸ— termios.cpython-315-x86_64-linux-gnu.so πŸ— _decimal.cpython-315-x86_64-linux-gnu.so πŸ— _queue.cpython-315-x86_64-linux-gnu.so πŸ— _testsinglephase.cpython-315-x86_64-linux-gnu.so πŸ— unicodedata.cpython-315-x86_64-linux-gnu.so πŸ— _elementtree.cpython-315-x86_64-linux-gnu.so πŸ— _random.cpython-315-x86_64-linux-gnu.so πŸ— _tkinter.cpython-315-x86_64-linux-gnu.so πŸ— xxlimited.cpython-315-x86_64-linux-gnu.so πŸ— _gdbm.cpython-315-x86_64-linux-gnu.so πŸ— _remote_debugging.cpython-315-x86_64-linux-gnu.so πŸ— _uuid.cpython-315-x86_64-linux-gnu.so πŸ— xxlimited_35.cpython-315-x86_64-linux-gnu.so πŸ— _hashlib.cpython-315-x86_64-linux-gnu.so πŸ— _sha1.cpython-315-x86_64-linux-gnu.so πŸ— _xxtestfuzz.cpython-315-x86_64-linux-gnu.so πŸ— xxsubtype.cpython-315-x86_64-linux-gnu.so ``` ```shell share/man/man1 on ξ‚  wasi-package ✦ ➲ ls -l lrwxrwxrwx brett brett 12 B Wed Jun 10 16:19:20 2026 python3.1 β‡’ python3.15.1 .rw-r--r-- brett brett 24 KB Wed Jun 10 16:19:20 2026 python3.15.1 ``` ## Debug Only listing differences with a release build. ```shell cpython/builddir/bin on ξ‚  wasi-package ✦ ➲ ls -l lrwxrwxrwx brett brett 8 B Wed Jun 10 16:19:33 2026 idle3 β‡’ idle3.15 .rwxr-xr-x brett brett 139 B Wed Jun 10 16:19:21 2026 idle3.15 .rwxr-xr-x brett brett 216 B Wed Jun 10 16:19:38 2026 pip3 .rwxr-xr-x brett brett 216 B Wed Jun 10 16:19:38 2026 pip3.15 lrwxrwxrwx brett brett 9 B Wed Jun 10 16:19:33 2026 pydoc3 β‡’ pydoc3.15 .rwxr-xr-x brett brett 124 B Wed Jun 10 16:19:21 2026 pydoc3.15 lrwxrwxrwx brett brett 10 B Wed Jun 10 16:19:33 2026 python3 β‡’ python3.15 lrwxrwxrwx brett brett 17 B Wed Jun 10 16:19:33 2026 python3-config β‡’ python3.15-config .rwxr-xr-x brett brett 27 MB Wed Jun 10 16:19:20 2026 python3.15 lrwxrwxrwx brett brett 18 B Wed Jun 10 16:19:33 2026 python3.15-config β‡’ python3.15d-config .rwxr-xr-x brett brett 27 MB Wed Jun 10 16:19:20 2026 python3.15d .rwxr-xr-x brett brett 3.2 KB Wed Jun 10 16:19:21 2026 python3.15d-config ``` ```shell ➲ ls include/python3.15d/ abstract.h datetime.h import.h objimpl.h pyerrors.h pystrcmp.h sysmodule.h audit.h descrobject.h internal opcode.h pyexpat.h pystrtod.h traceback.h bltinmodule.h dictobject.h intrcheck.h opcode_ids.h pyframe.h Python.h tupleobject.h boolobject.h dynamic_annotations.h iterobject.h osdefs.h pyhash.h pythonrun.h typeslots.h bytearrayobject.h enumobject.h listobject.h osmodule.h pylifecycle.h pythread.h unicodeobject.h bytesobject.h errcode.h longobject.h patchlevel.h pymacconfig.h pytypedefs.h warnings.h ceval.h exports.h marshal.h py_curses.h pymacro.h rangeobject.h weakrefobject.h codecs.h fileobject.h memoryobject.h pyatomic.h pymath.h refcount.h compile.h fileutils.h methodobject.h pybuffer.h pymem.h setobject.h complexobject.h floatobject.h modsupport.h pycapsule.h pyport.h sliceobject.h cpython frameobject.h moduleobject.h pyconfig.h pystate.h structmember.h critical_section.h genericaliasobject.h object.h pydtrace.h pystats.h structseq.h ``` ```shell builddir/lib/pkgconfig on ξ‚  wasi-package ✦ ➲ ls -l lrwxrwxrwx brett brett 21 B Wed Jun 10 16:19:33 2026 python-3.15-embed.pc β‡’ python-3.15d-embed.pc lrwxrwxrwx brett brett 15 B Wed Jun 10 16:19:33 2026 python-3.15.pc β‡’ python-3.15d.pc .rw-r--r-- brett brett 327 B Wed Jun 10 16:19:21 2026 python-3.15d-embed.pc .rw-r--r-- brett brett 312 B Wed Jun 10 16:19:21 2026 python-3.15d.pc lrwxrwxrwx brett brett 20 B Wed Jun 10 16:19:33 2026 python3-embed.pc β‡’ python-3.15-embed.pc lrwxrwxrwx brett brett 14 B Wed Jun 10 16:19:33 2026 python3.pc β‡’ python-3.15.pc ```