1DOLLY 72PACKAGE python3REQUIRES HOST runtime@04REQUIRES HOST dso@05REQUIRES HOST http@06REQUIRES HOST sockets@078FROM /v0.1.4/Dollyfile-system 915c71d4ce772989e3076060967824e48ccd6a1a6259624fe6213542df088dbc9USE /v0.1.4/Dollyfile-libdolly-sockets 53258b5e913671f33fe70294b3ae9f164f2c38e68c13c45b7e5ba29e4526c49710USE /v0.1.4/demos/tools/Dollyfile-sqlite acf076d29343fc13c102b4b642714564182fb3a14eaba57a9921503f7ec83a1911USE /v0.1.4/demos/tools/Dollyfile-bzip2 9cfdf6c3cad66c99f5fab4905323ffdfd7298745577c5224f99bcb976468e84c12USE /v0.1.4/demos/tools/Dollyfile-xz 97034a7e8088aba5b63ff0a5f8fea7b42e7e44c88c69ea20e23ad165ae1e658d13# Build the Python runtime and native extension SDK; pip.dm adds pip.14REQUIRES HEADER curl15REQUIRES HEADER dso16REQUIRES HEADER libc17REQUIRES HEADER runtime18REQUIRES HEADER zlib19REQUIRES HEADER sqlite320REQUIRES HEADER bzlib21REQUIRES HEADER lzma22REQUIRES LIB    curl23REQUIRES LIB    z24REQUIRES LIB    sqlite325REQUIRES LIB    bz226REQUIRES LIB    lzma27REQUIRES TOOL   ar28REQUIRES TOOL   cc29REQUIRES TOOL   c++30REQUIRES TOOL   cp31REQUIRES TOOL   make32REQUIRES TOOL   mkdir33REQUIRES TOOL   mv34REQUIRES TOOL   rm35REQUIRES TOOL   tar36REQUIRES TOOL   test37REQUIRES TOOL   touch3839INSTALL /v0.1.4/demos/python/Dollyfile-libffi 5e6a33f1ebf1a038fb1799089b2f806acb35df54f315c1b140a544e78c92c7fc40EXPORTS LIB    ffi       /usr/lib/libffi.a41EXPORTS HEADER ffi       /usr/include/ffi.h42EXPORTS HEADER ffitarget /usr/include/ffitarget.h43FILE /usr/share/licenses/libffi/LICENSE44# python links the three USEd libraries statically and carries their licences.45FILE /usr/share/licenses/sqlite/blessing46FILE /usr/share/licenses/bzip2/LICENSE47FILE /usr/share/licenses/xz/COPYING48FILE /usr/share/licenses/xz/COPYING.0BSD49REQUIRES HEADER http50REQUIRES HEADER ffi51REQUIRES HEADER ffitarget52REQUIRES LIB    ffi53REQUIRES TOOL   gzip5455# Upstream Make runs the new interpreter before installing Lib. Do not retain56# timestamped bytecode caches from that build in the immutable image.57EXPORTS ENV PYTHONDONTWRITEBYTECODE 15859# The target is configured outside the browser, but every target object and60# executable is compiled here. Dolly-owned adapters remain independent pinned61# inputs instead of being hidden inside the upstream archive.62SOURCE /v0.1.4/dist/static/python/cpython.tar.gz 144cb80ac66c69736e4c9c387df6f2fb3c51e70a6e27cfdfe1ad50f20e989c71 /tmp/cpython.tar.gz6364SLOP gzip -dc /tmp/cpython.tar.gz | tar -xf - -C /6566SOURCE /v0.1.4/dist/static/python/runtimes/cpython-platform.c        20c5c120f835ce94ceb9be08cc25c4623ae333d844b2d3c3098ffed36f3b41eb /usr/src/python/Python/dolly_platform.c67SOURCE /v0.1.4/dist/static/python/runtimes/cpython-extension-check.c 1763ec04e582beee6066af81c93fe20e8cf0d83ae7d41d935b395c5cb3cdf071 /usr/src/python/Modules/dolly_extension_check.c68SOURCE /v0.1.4/dist/static/python/runtimes/cpython-socket-stubs.c    2aebdbdf3722dfa79f7b7eeb178b4beae2894a3d35ef12501054fb667342b335 /usr/src/python/Modules/dolly_socket_stubs.c69SOURCE /v0.1.4/dist/static/python/runtimes/cpython-http.c 13610f3322a4d09aa558e5d31523a082303835bf7c5981557c09443562cdc2da /usr/src/python/Modules/dolly_http.c70SOURCE /v0.1.4/dist/static/python/runtimes/cpython-transport.py 4567a855ff8459f6671c770dd69d93c84870bef3acd272f11ca28a394c9be92d /usr/src/python/Lib/_dolly_transport.py71SOURCE /v0.1.4/dist/static/python/runtimes/cpython-process.c         9dfbbe0c2de367d829b4fec488ff4e17488324c4cc4c750b34de2c82547fb943 /usr/src/python/Modules/dolly_process.c72SOURCE /v0.1.4/dist/static/python/runtimes/cpython-subprocess.py     cabc2b4eb15e61332c2b63454724c3b390c5f2a2f0effa2889861e123835b785 /usr/src/python/Lib/_dolly_subprocess.py7374SLOP CWD /usr/src/python touch \75  Python/frozen_modules/*.h7677# The embedded LLVM optimizer spends minutes on a small measured set of78# translation units. Compile only those outliers at -O0 and let upstream Make79# preserve the prepared objects; the rest of CPython is substantially faster80# at -O2.81SLOP CWD /usr/src/python cc \82  -c \83  -O0 \84  -std=c11 \85  -fno-builtin \86  -fno-strict-aliasing \87  -IInclude/internal \88  -IInclude/internal/mimalloc \89  -IObjects \90  -IInclude \91  -IPython \92  -I. \93  -DPy_BUILD_CORE \94  Python/tracemalloc.c \95  -o Python/tracemalloc.o96SLOP CWD /usr/src/python cc \97  -c \98  -O0 \99  -std=c11 \100  -fno-builtin \101  -fno-strict-aliasing \102  -IInclude/internal \103  -IInclude/internal/mimalloc \104  -IObjects \105  -IInclude \106  -IPython \107  -I. \108  -DPy_BUILD_CORE \109  Modules/arraymodule.c \110  -o Modules/arraymodule.o111SLOP CWD /usr/src/python cc \112  -c \113  -O0 \114  -std=c11 \115  -IInclude/internal \116  -IInclude/internal/mimalloc \117  -IObjects \118  -IInclude \119  -IPython \120  -I. \121  -DPy_BUILD_CORE \122  Python/dolly_platform.c \123  -o Python/dolly_platform.o124SLOP CWD /usr/src/python cc \125  -c \126  -O0 \127  -std=c11 \128  -IInclude/internal \129  -IInclude/internal/mimalloc \130  -IObjects \131  -IInclude \132  -IPython \133  -I. \134  -DPy_BUILD_CORE \135  -DDATE='"Jan 01 1970"' \136  -DTIME='"00:00:00"' \137  Modules/getbuildinfo.c \138  -o Modules/getbuildinfo.o139SLOP CWD /usr/src/python cc \140  -c \141  -O0 \142  -std=c11 \143  -IInclude/internal \144  -IInclude/internal/mimalloc \145  -IObjects \146  -IInclude \147  -IPython \148  -I. \149  -DPy_BUILD_CORE \150  -DPLATFORM='"dolly"' \151  Python/getplatform.c \152  -o Python/getplatform.o153SLOP CWD /usr/src/python cc \154  -c \155  -O0 \156  -std=c11 \157  -IInclude/internal \158  -IInclude/internal/mimalloc \159  -IObjects \160  -IInclude \161  -IPython \162  -I. \163  -DPy_BUILD_CORE \164  -DABIFLAGS='""' \165  -DMULTIARCH='"dolly_0_wasm64"' \166  Python/sysmodule.c \167  -o Python/sysmodule.o168SLOP CWD /usr/src/python cc \169  -c \170  -O0 \171  -std=c17 \172  Modules/dolly_socket_stubs.c \173  -o Modules/dolly_socket_stubs.o174SLOP CWD /usr/src/python make \175  -o configure \176  -o config.status \177  -o Makefile.pre \178  -o Makefile \179  -o Modules/config.c \180  -o Modules/getbuildinfo.o \181  -o Python/getplatform.o \182  -o Python/sysmodule.o \183  -o Python/tracemalloc.o \184  -o Modules/arraymodule.o \185  python \186  libpython3.14.a \187  SHELL=/bin/slop \188  CC=cc \189  LINKCC=cc \190  AR=ar \191  BLDSHARED=cc\ -shared \192  INSTSONAME=libpython3.14.a \193  DYNLOADFILE=dynload_shlib.o \194  PY_CFLAGS=-O2\ -std=c11\ -fno-builtin\ -fno-strict-aliasing \195  PY_CFLAGS_NODIST= \196  PY_CPPFLAGS=-IInclude/internal\ -IInclude/internal/mimalloc\ -IObjects\ -IInclude\ -IPython\ -I. \197  CFLAGSFORSHARED= \198  PY_CORE_LDFLAGS= \199  LDFLAGS= \200  LINKFORSHARED=-rdynamic \201  MODULE_MATH_LDFLAGS= \202  MODULE_CMATH_LDFLAGS= \203  MODULE__STATISTICS_LDFLAGS= \204  MODULE__DATETIME_LDFLAGS= \205  MODULE_PYEXPAT_LDFLAGS=Modules/expat/libexpat.a \206  MODULE__SOCKET_CFLAGS=-Dfreeaddrinfo=dolly_py_freeaddrinfo\ -Dgai_strerror=dolly_py_gai_strerror\ -Dgetaddrinfo=dolly_py_getaddrinfo\ -Dgethostbyaddr=dolly_py_gethostbyaddr\ -Dgethostname=dolly_py_gethostname\ -Dgetnameinfo=dolly_py_getnameinfo\ -Dgetprotobyname=dolly_py_getprotobyname\ -Dgetservbyport=dolly_py_getservbyport\ -Dhtonl=dolly_py_htonl\ -Dif_freenameindex=dolly_py_if_freenameindex\ -Dif_indextoname=dolly_py_if_indextoname\ -Dif_nameindex=dolly_py_if_nameindex\ -Dif_nametoindex=dolly_py_if_nametoindex\ -Dinet_aton=dolly_py_inet_aton\ -Dinet_ntop=dolly_py_inet_ntop\ -Dinet_pton=dolly_py_inet_pton\ -Dntohl=dolly_py_ntohl\ -Dpoll=dolly_py_poll \207  MODULE_BINASCII_CFLAGS=-DUSE_ZLIB_CRC32 \208  MODULE_BINASCII_LDFLAGS=-lz \209  MODULE_ZLIB_CFLAGS= \210  MODULE_ZLIB_LDFLAGS=-lz \211  MODULE__CTYPES_CFLAGS=-DHAVE_FFI_PREP_CIF_VAR\ -DHAVE_FFI_PREP_CLOSURE_LOC\ -DHAVE_FFI_CLOSURE_ALLOC \212  MODULE__CTYPES_LDFLAGS=-lffi \213  LIBS=-ldolly-sockets \214  SYSLIBS= \215  LIBM= \216  LIBC= \217  SHLIBS= \218  MACHDEP_OBJS=Python/dolly_platform.o\ Modules/dolly_socket_stubs.o \219  DTRACE=220221# Install the standard-library contents into their final prefix.  Treat the222# destination as an installation directory explicitly: it may already exist223# in a composed image, and `mv SOURCE DESTINATION` would then create a nested224# `Lib` directory instead of the sys.path layout CPython requires.225SLOP mkdir \226  -p \227  /usr/lib/python3.14 \228  /usr/lib/python3.14/lib-dynload229SLOP cp \230  -R \231  /usr/src/python/Lib/. \232  /usr/lib/python3.14233SLOP test \234  -f \235  /usr/lib/python3.14/encodings/__init__.py236SLOP cp \237  /usr/src/python/libpython3.14.a \238  /usr/lib/libpython3.14.a239SLOP mv \240  /usr/src/python/python \241  /usr/bin/python242SLOP ln -sf python /usr/bin/python3243SLOP mkdir \244  -p \245  /usr/include/python3.14246SLOP cp \247  -R \248  /usr/src/python/Include/. \249  /usr/include/python3.14250SLOP cp \251  /usr/src/python/pyconfig.h \252  /usr/include/python3.14/pyconfig.h253SLOP CWD /usr/src/python slop \254  -c \255  'export _PYTHON_PROJECT_BASE=/usr/src/python; python -m sysconfig --generate-posix-vars'256SLOP cp \257  /usr/src/python/build/lib.dolly_0-wasm64-3.14/_sysconfigdata__dolly_dolly_0_wasm64.py \258  /usr/lib/python3.14/_sysconfigdata__dolly_dolly_0_wasm64.py259SLOP mkdir \260  -p \261  /usr/lib/python3.14/config-3.14-dolly_0_wasm64262SLOP cp \263  /usr/src/python/Makefile \264  /usr/lib/python3.14/config-3.14-dolly_0_wasm64/Makefile265SLOP cc \266  -shared \267  -O0 \268  -std=c17 \269  -I/usr/include/python3.14 \270  /usr/src/python/Modules/dolly_extension_check.c \271  -o /usr/lib/python3.14/lib-dynload/dolly_extension_check.cpython-314-dolly_0_wasm64.so272273EXPORTS TOOL   python274EXPORTS TOOL   python3275EXPORTS ENV    PYTHONUTF8 1276EXPORTS LIB    python     /usr/lib/libpython3.14.a277EXPORTS HEADER python     /usr/include/python3.14278279SLOP python \280  --version281SLOP python \282  -c 'import pathlib; p = pathlib.Path("/tmp/python-check.txt"); p.write_text("PYTHON-WASM64"); assert p.read_text() == "PYTHON-WASM64"'283SLOP python \284  -c 'import dolly_extension_check; assert dolly_extension_check.answer() == 42'285SLOP python \286  -c 'import mmap, pathlib; p = pathlib.Path("/tmp/mmap-check"); p.write_bytes(b"DOLLY"); f = p.open("rb"); m = mmap.mmap(f.fileno(), 5, access=mmap.ACCESS_READ); assert m[:] == b"DOLLY"; m.madvise(mmap.MADV_SEQUENTIAL); m.close(); f.close()'287SLOP python \288  -c 'import sysconfig; assert sysconfig.get_platform() == "dolly_0-wasm64"; assert sysconfig.get_config_var("EXT_SUFFIX") == ".cpython-314-dolly_0_wasm64.so"'289SLOP python \290  -c 'import os, subprocess; assert subprocess.check_output(["echo", "spawn-ok"], text=True).strip() == "spawn-ok"; assert subprocess.check_output(["python", "-c", "print(6 * 7)"], text=True).strip() == "42"; child_env = dict(os.environ, DOLLY_CHILD_ENV="explicit"); assert subprocess.check_output(["python", "-c", "import os; print(os.environ[\"DOLLY_CHILD_ENV\"])"] , env=child_env, text=True, timeout=1).strip() == "explicit"'291SLOP python \292  -c 'import threading; seen = []; worker = threading.Thread(target=seen.append, args=(42,)); worker.start(); worker.join(); assert seen == [42] and not worker.is_alive()'293SLOP python \294  -c 'import hashlib; assert hashlib.md5(b"abc", usedforsecurity=False).hexdigest() == "900150983cd24fb0d6963f7d28e17f72"'295SLOP python \296  -c 'import ctypes; libc = ctypes.CDLL(None); libc.strlen.argtypes = [ctypes.c_char_p]; libc.strlen.restype = ctypes.c_size_t; assert libc.strlen(b"dolly") == 5; callback_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int); callback = callback_type(lambda value: value + 1); assert callback(41) == 42'297SLOP python \298  -c 'import locale, sys; assert sys.flags.utf8_mode == 1; assert locale.getpreferredencoding(False).lower() == "utf-8"; assert sys.getfilesystemencoding().lower() == "utf-8"'299SLOP python \300  -c 'from pathlib import Path; p = Path("/tmp/python-header-check/check.cpp"); p.parent.mkdir(); p.write_text("#include <Python.h>\nint python_header_check = 42;\n", encoding="utf-8")'301SLOP c++ \302  -c \303  -std=c++17 \304  -I/usr/include/python3.14 \305  /tmp/python-header-check/check.cpp \306  -o /tmp/python-header-check/check.o307SLOP python \308  -c 'import os, sys, termios, tty; assert not os.isatty(0); assert sys.stdin.buffer.read(1) == b""'309310FILE /usr/share/licenses/cpython/LICENSE311# The PSF License Agreement asks derivatives to summarize their changes.312FILE /usr/share/licenses/cpython/DOLLY-CHANGES313    Dolly's changes to CPython: cpython-dolly.patch ports posixmodule, getpath,314    faulthandler, the thread stubs, subprocess, threading, site, platform,315    sysconfig, uuid, ctypes.util and the pager to sys.platform "dolly", where316    processes use Dolly's spawn and wait, there is no fork and thread targets317    run serially. Built-in modules added by Dolly carry HTTP through the318    browser's broker (_dolly_http, _dolly_transport), fail name resolution319    and ssl explicitly, and run libffi over process-local calls. The patched source is320    published beside this image as dist/static/python/cpython.tar.gz.321EXPORTS FOLDER python-stdlib /usr/lib/python3.14322323SLOP rm \324  -rf \325  /tmp/cpython.tar.gz \326  /tmp/mmap-check \327  /tmp/python \328  /tmp/python-header-check \329  /tmp/python-check.txt \330  /usr/lib/python3.14/test \331  /usr/src/python332REQUIRES TOOL python333334# CPython's bundled pip, installed offline without build-time bytecode.335SLOP python \336  /usr/lib/python3.14/ensurepip/_bundled/pip-26.2.1-py3-none-any.whl/pip \337  install \338  --no-compile \339  --no-index \340  --disable-pip-version-check \341  --root-user-action=ignore \342  /usr/lib/python3.14/ensurepip/_bundled/pip-26.2.1-py3-none-any.whl343FOLDER /usr/lib/python3.14/site-packages344EXPORTS TOOL pip345EXPORTS TOOL pip3346347# pip builds what has no wheel for Dolly, which is every native package: a C348# extension with the compiler, a Meson project such as NumPy with Ninja too.349INSTALL /v0.1.4/Dollyfile-cc dadb1af6ae3450a3a48bf4c955fe40d012a9a20d6dc3eca63c4f2737ab4080cc350351# The browser policy decides which indexes are reachable; skip pip's own352# PyPI version check. Dolly has one user, uid 0. Progress bars refresh from a353# thread, which would never yield under Dolly's serial threading. Meson's debug354# build keeps sdists such as NumPy (which adds -O3 otherwise) and Pandas within355# the compiler budget; pip reads one config setting from this file.356FILE /etc/pip.conf357    [global]358    disable-pip-version-check = true359    root-user-action = ignore360    progress-bar = off361    config-settings = setup-args=-Dbuildtype=debug362363SLOP python \364  -c 'import urllib.request; assert urllib.request.HTTPHandler.__module__ == "_dolly_transport"'365SLOP pip \366  --version367FILE /usr/share/man/cat1/python3.1368    python3, python, pip: CPython and pip, with the cc package pip builds native369    packages with.370    371      python3 SCRIPT          runs a script; python3 alone, the prompt372      pip install PACKAGE     installs a wheel or builds an sdist373    374    An sdist with C code is compiled by cc. One built with Meson (NumPy,375    Pandas) needs Ninja too: amy install ninja. Its settings for every sdist are376    in /etc/pip.conf. urllib.request and requests send through the page's HTTP377    broker and its policy. sys.platform is "dolly"; Emscripten and Pyodide378    wheels do not fit it. Upstream's documentation: https://docs.python.org/3/379