# 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
```