Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consider supporting emscripten/webassembly as a build target #84461

Closed
SimonBiggs mannequin opened this issue Apr 14, 2020 · 85 comments
Closed

Consider supporting emscripten/webassembly as a build target #84461

SimonBiggs mannequin opened this issue Apr 14, 2020 · 85 comments
Labels
3.11 only security fixes build The build process and cross-build OS-wasi type-feature A feature request or enhancement

Comments

@SimonBiggs
Copy link
Mannequin

SimonBiggs mannequin commented Apr 14, 2020

BPO 40280
Nosy @warsaw, @brettcannon, @terryjreedy, @tiran, @mcepl, @pmp-p, @rdb, @ethanhs, @corona10, @miss-islington, @tirkarthi, @erlend-aasland
PRs
  • bpo-40280: Add wasm cross build targets (GH-29771) #29771
  • bpo-40280: Use Setup.stdlib static for wasm builds (GH-29784) #29784
  • bpo-40280: Move hard-coded feature checks to configure (GH-29789) #29789
  • bpo-40280: clean and ignore .wasm files (GH-29794) #29794
  • bpo-40280: Add configure check for socket shutdown (GH-29795) #29795
  • bpo-40280: Disable unusable core extension modules on emscripten (GH-29834) #29834
  • bpo-40280: Emscripten systems use .wasm suffix by default (GH-29842) #29842
  • bpo-40280: Emscripten has no support for subprocesses #29872
  • bpo-40280: Emscripten defaults to --with-ensurepip=no (GH-29873) #29873
  • bpo-40280: Emscripten with_ensurepip=no, second attempt (GH-29884) #29884
  • bpo-40280: Optimize ints and and startup on wasm (GH-29887) #29887
  • bpo-40280: Enable assertions in Emscripten debug builds #29892
  • bpo-40280: Update what's new (GH-29893) #29893
  • bpo-40280: Add Tools/wasm with helpers for cross building (GH-29984) #29984
  • bpo-40280: Disable epoll_create in Emscripten config.site (GH-30494) #30494
  • bpo-40280: Add build target for Emscripten/node.js #30495
  • bpo-40280: Skip IPPROTO_SCTP tests on Emscripten #30538
  • bpo-40280: Add --with-emscripten-target to build for browser or node (GH-30552) #30552
  • bpo-40280: Allow to compile _testcapi as builtin module (GH-30559) #30559
  • bpo-40280: Build WASM stdlib bundle and more modules for node (GH-30597) #30597
  • bpo-40280: Block more syscalls that are causing crashes in tests (GH-30601) #30601
  • bpo-40280: Skip subprocess-based tests on wasm32-emscripten (GH-30615) #30615
  • bpo-40280: Change subprocess imports for cleaner error on wasm32 (GH-30620) #30620
  • bpo-40280: Add requires_fork test helper (GH-30622) #30622
  • bpo-40280: Misc fixes for wasm32-emscripten (GH-30722) #30722
  • bpo-40280: Get help() working and more (GH-30858) #30858
  • bpo-40280: Use presence of msvcrt module to detect Windows #30930
  • bpo-40280: Address more test failures on Emscripten (GH-31050) #31050
  • bpo-40280: Block more non-working syscalls in Emscripten (GH-31757) #31757
  • bpo-40280: Skip dysfunctional pipe tests on Emscripten (GH-31770) #31770
  • bpo-40280: Skip more tests/features that don't apply to Emscripten (GH-31791) #31791
  • bpo-40280: Disable AF_UNIX, AF_PACKET, SO_REUSE* on Emscripten #31829
  • bpo-40280: select: Use NULL for empty fdset (GH-31865) #31865
  • bpo-40280: Detect presence of time.tzset and thread_time clock (GH-31898) #31898
  • bpo-40280: Skip wakeup_fd pipe tests on Emscripten (GH-31909) #31909
  • bpo-40280: Skip more tests on Emscripten (GH-31947) #31947
  • bpo-40280: Skip socket, fork, subprocess tests on Emscripten #31986
  • bpo-40280: Add wasm32-emscripten and wasm32-wasi SOABI #32095
  • bpo-40280: Emscripten fork_exec now fails early (GH-32224) #32224
  • bpo-40280: Add debug Emscripten flavors (GH-32233) #32233
  • bpo-40280: Enable most file-at() and nanosleep APIs again (GH-32238) #32238
  • bpo-40280: Detect if WASM platform supports threading #32243
  • bpo-40280: Add --enable-wasm-dynamic-linking (GH-32253) #32253
  • bpo-46315: Use fopencookie only on Emscripten 3.x and newer (GH-32266) #32266
  • bpo-40280: Add limited Emscripten REPL (GH-32284) #32284
  • bpo-40280: Detect missing threading on WASM platforms (GH-32352) #32352
  • bpo-40280: WASM defaults to no dynamic linking (GH-32360) #32360
  • bpo-40280: WASM docs and smaller browser builds (GH-32412) #32412
  • Dependencies
  • bpo-23325: Turn SIG_DFL and SIG_IGN into functions
  • bpo-33393: update config.guess and config.sub
  • bpo-41498: Undefinied _Py_Sigset_Converter function when HAVE_SIGSET_T not set
  • bpo-45881: Cross compiling on Linux is untested, undocumented, and broken
  • bpo-45886: Fix Program/freeze_module for cross compiling Python
  • bpo-45898: ctypes cfield.c defines duplicate ffi_type* symbols
  • bpo-46383: _zoneinfo module_free has invalid function signature
  • bpo-46390: Multiple test failures on Alpine 3.15 / musl-1.2.2-r7
  • bpo-46408: signal module wrongly relies on small int singletons
  • bpo-47162: Add call trampoline to work around bad fpcasts on Emscripten
  • bpo-47176: Interrupt handling for wasm32-emscripten builds without pthreads
  • bpo-47196: Function pointer cast in test_imp
  • bpo-47197: ctypes mishandles void return type
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2020-04-14.07:11:35.905>
    labels = ['type-feature', 'build', '3.11']
    title = 'Consider supporting emscripten/webassembly as a build target'
    updated_at = <Date 2022-04-08.10:17:32.793>
    user = 'https://bugs.python.org/SimonBiggs'

    bugs.python.org fields:

    activity = <Date 2022-04-08.10:17:32.793>
    actor = 'christian.heimes'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Build']
    creation = <Date 2020-04-14.07:11:35.905>
    creator = 'Simon Biggs'
    dependencies = ['23325', '33393', '41498', '45881', '45886', '45898', '46383', '46390', '46408', '47162', '47176', '47196', '47197']
    files = []
    hgrepos = []
    issue_num = 40280
    keywords = ['patch']
    message_count = 65.0
    messages = ['366369', '366374', '366375', '366379', '369598', '394081', '406985', '406986', '407011', '407012', '407013', '407014', '407015', '407018', '407020', '407021', '407030', '407046', '407048', '407049', '407052', '407080', '407264', '407284', '407484', '407498', '407519', '407524', '407541', '408855', '410138', '410400', '410423', '410554', '410577', '410647', '410727', '410743', '411039', '411514', '411560', '411847', '412595', '414748', '414769', '414780', '414845', '414940', '415136', '415259', '415297', '415398', '415757', '415976', '416494', '416509', '416541', '416542', '416579', '416681', '416763', '416865', '416916', '416933', '416934']
    nosy_count = 14.0
    nosy_names = ['barry', 'brett.cannon', 'terry.reedy', 'christian.heimes', 'mcepl', 'pmpp', 'rdb', 'ethan smith', 'corona10', 'miss-islington', 'Roman Yurchak', 'xtreak', 'erlendaasland', 'Simon Biggs']
    pr_nums = ['29771', '29784', '29789', '29794', '29795', '29834', '29842', '29872', '29873', '29884', '29887', '29892', '29893', '29984', '30494', '30495', '30538', '30552', '30559', '30597', '30601', '30615', '30620', '30622', '30722', '30858', '30930', '31050', '31757', '31770', '31791', '31829', '31865', '31898', '31909', '31947', '31986', '32095', '32224', '32233', '32238', '32243', '32253', '32266', '32284', '32352', '32360', '32412']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue40280'
    versions = ['Python 3.11']

    @SimonBiggs
    Copy link
    Mannequin Author

    SimonBiggs mannequin commented Apr 14, 2020

    Since asm.js came on the scene, and now Web Assembly people have created CPython patches to support building CPython with emscripten. See:

    To ease the compiling of CPython with emscripten it would be helpful if patches that achieved these ends for the compiling to Web Assembly with emscripten were built into the upstream source repository itself.

    If web assembly were to became a supported compilation target of the upstream CPython repository this would significantly reduce the friction of allowing CPython, and the latest CPython, to become a language readily usable within the browser.

    Cheers,
    Simon

    @SimonBiggs SimonBiggs mannequin added 3.9 only security fixes build The build process and cross-build type-feature A feature request or enhancement labels Apr 14, 2020
    @serhiy-storchaka
    Copy link
    Member

    Do you want to provide a pull request?

    @pmp-p
    Copy link
    Mannequin

    pmp-p mannequin commented Apr 14, 2020

    you can add

    (wasm not asm.js, clang-10+ required)

    demo https://pmp-p.github.io/python-next/test.html

    CPython can already run in the browser with very little patching, but major issues are :

    • asyncify'ing the whole wasm VM to have pre-emption over cPython's one to prevent blocking I/O slows down things *a lot* (10x)
      => (very?) bad user experience.

    • the size of vm + stdlib ~ 30 MiB and wasm compilation time.
      => bad user experience on first load or slow connexion.

    • the lack of threading in wasm MinimumViableProduct specification (but this is the browser standard for now), that leads to rewrite bits of stdlib ( like eg asyncio module )
      => adding more maintenance burden on stdlib (!)

    i tested them all and my personnal opinion is : I can see no use case that would favour "stock" cPython wasm versus a blazing fast MicroPytho (or pycopy) wasm flavour or supercharged full stack pyodide.

    @SimonBiggs
    Copy link
    Mannequin Author

    SimonBiggs mannequin commented Apr 14, 2020

    Hi pmp-p and Serhiy,

    I'd be more than happy to attempt a pull request, but I imagine a change
    such as this needs to be discussed first, trying not to "rush to make a
    patch" (https://www.youtube.com/watch?v=voXVTjwnn-U&feature=youtu.be&t=2546).
    Also, I doubt I will do a good job of it... but I am more than happy to try.

    A note regarding "supercharged full stack pyodide", potentially without
    efforts such as upstreaming into CPython and emscripten the relevant
    patches, that supercharged full stack may just unfortunately stagnate. See
    pyodide/pyodide#635 (comment)

    With respect to blocking when running Python as WASM, I have found running
    the WebAssembly CPython within a webworker and signalling data back and
    forth causes there to be no UI issues. It ends up being quite a neat set
    up. Main down side right now however is the set up is currently going
    stale, hence me believing reaching out like this is in the best interests
    of Python going forward.

    Cheers,
    Simon

    On Tue, 14 Apr 2020 at 18:58, pmp-p <report@bugs.python.org> wrote:

    pmp-p <pmpp.pub@gmail.com> added the comment:

    you can add
    *
    https://github.com/pmp-p/pydk/tree/master/sources.em/Python-3.8.0b4.patchset
    -- Python 3.8.x

    (wasm not asm.js, clang-10+ required)

    demo https://pmp-p.github.io/python-next/test.html

    CPython can already run in the browser with very little patching, but
    major issues are :

    • asyncify'ing the whole wasm VM to have pre-emption over cPython's one
      to prevent blocking I/O slows down things *a lot* (10x)
      => (very?) bad user experience.

    • the size of vm + stdlib ~ 30 MiB and wasm compilation time.
      => bad user experience on first load or slow connexion.

    • the lack of threading in wasm MinimumViableProduct specification (but
      this is the browser standard for now), that leads to rewrite bits of stdlib
      ( like eg asyncio module )
      => adding more maintenance burden on stdlib (!)

    i tested them all and my personnal opinion is : I can see no use case that
    would favour "stock" cPython wasm versus a blazing fast MicroPytho (or
    pycopy) wasm flavour or supercharged full stack pyodide.

    ----------
    nosy: +pmpp


    Python tracker <report@bugs.python.org>
    <https://bugs.python.org/issue40280\>


    @Beuc
    Copy link
    Mannequin

    Beuc mannequin commented May 22, 2020

    I've been maintaining a Python Emscripten build for the Ren'Py (game engine) web port:
    https://github.com/python-emscripten/python
    https://renpy.beuc.net/

    I recently tackled Python3 with a minimal/embeddable approach and checking the other ports already pointed in the discussion:
    https://github.com/python-emscripten/python/tree/trunk/3.8/
    (2 patches, and a short pyconfig.h fix-up)

    There is also a Cython module to use the Emscripten C API.

    Here's a demo at:
    https://www.beuc.net/python-emscripten/demo/3/
    (hello-world size: 3MB, with a few common modules: 4MB)

    I can provide a pull request with a first few core changes.
    Should this be done on github?

    cross-compilation handling appears to follow an incorrect logic, in particular by querying 'dpkg' or parsing compiler output to detect include paths -- it is the (cross-)compiler's responsibility to provide the system paths, and detecting them manually causes conflicts. I had to patch setup.py. Let me know if I missed something.

    Usually cross-compiling is triggered by non-matching build-type/host-type. Here cross-compilation logic is apparently triggered when exporting _PYTHON_HOST_PLATFORM=xxx manually (it's in the Makefile but not exported, and breaks normal build when exported). Is this the way it's meant to be used?

    @ethanhs
    Copy link
    Mannequin

    ethanhs mannequin commented May 20, 2021

    I think the first thing we should do is figure out whether we want to support Emscripten or WASI (or both).

    Emscripten uses Javascript polyfills for some syscalls, while WASI makes direct calls the VM it is running in. They both can use WebAssembly for executing the code. This means Emscripten has wider API support, but WASI is lighter weight in many ways.

    I think starting with patches to support Emscripten would be best, as it is easier to target, then add support for WASI later.

    I think supporting WASI has a lot of value, because it can be run deterministically, which would be great for data science (Imagine a jupyter notebook that runs the same everywhere!)

    One issue with WASI, and may be an issue with Emscripten, is threads. In 3.8 (or 3.9?) threadless builds were removed. However, WebAssembly's threading API is not really meant to emulate pthread, and SharedArrayBuffer, the primitive it is built on, is disabled in several browsers due to Spectre concerns.

    Would patches to re-add a threadless build mode be accepted?

    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    I have added wasm32/wasm64 architectures with emscripten/wasi operating system as cross-build targets. The values are based on Rust targets:

    $ rustc --print target-list | grep wasm
    wasm32-unknown-emscripten
    wasm32-unknown-unknown
    wasm32-wasi
    wasm64-unknown-unknown

    wasm (WebAssembly) is "native instruction set" for the JavaScript VM while wasi or emscripten provide operating system facilities like memory management and I/O.

    @tiran tiran added 3.11 only security fixes and removed 3.9 only security fixes labels Nov 25, 2021
    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    Our config.sub is recent enough and has support for wasm32, wasm64, wasi, and emscripten:

    $ grep was[mi] config.sub 
                            | wasm32 | wasm64 \
                 | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \

    @brettcannon
    Copy link
    Member

    LLVM considers was32-wasi an alias for wasm32-unknown-wasi. Verified on the WebAssembly Discover server at https://discord.com/channels/453584038356058112/596492540388179976/898618010221310062.

    @brettcannon
    Copy link
    Member

    My last message had a couple of typos; should have been wasm32-wasi and "Discord", not "Discovery".

    @brettcannon
    Copy link
    Member

    Do we need to care about our config.guess being updated as well? This is a totally ignorant question based on https://github.com/WebAssembly/wasi-sdk#notes-for-autoconf mentioning config.guess.

    @brettcannon
    Copy link
    Member

    To help keep links up-to-date, Pyodide now lives at:

    https://github.com/pyodide/pyodide/tree/main/cpython

    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    Our config.sub agrees with LLVM:

    $ ./config.sub wasm32-wasi
    wasm32-unknown-wasi

    The config.sub and config.guess scripts in main are recent enough for wasm. Just to be sure I created #29781 and plan to backport the changeset to 3.10 and 3.9. It's generally safe to update the files to latest version.

    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    New changeset 1052a39 by Christian Heimes in branch 'main':
    bpo-40280: Add wasm cross build targets (GH-29771)
    1052a39

    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    I have uploaded my config.site override to https://gist.github.com/tiran/5ccffa28723d3e4739db848451bd9efa . It contains overrides based on pyodide and overrides for new features.

    I'm also getting this error with emscripten 2.0.13. _sys_shutdown is the syscall for shutdown(2) used by the socket module.

    error: undefined symbol: __sys_shutdown (referenced by top-level compiled C/C++ code)
    warning: Link with -s LLD_REPORT_UNDEFINED to get more information on undefined symbols
    warning: To disable errors for undefined symbols use -s ERROR_ON_UNDEFINED_SYMBOLS=0
    warning: ___sys_shutdown may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
    Error: Aborting compilation due to previous errors

    @tiran
    Copy link
    Member

    tiran commented Nov 25, 2021

    @tiran
    Copy link
    Member

    tiran commented Nov 26, 2021

    New changeset ee1e2c6 by Christian Heimes in branch 'main':
    bpo-40280: Use Setup.stdlib static for wasm builds (GH-29784)
    ee1e2c6

    @RomanYurchak
    Copy link
    Mannequin

    RomanYurchak mannequin commented Nov 26, 2021

    Thanks a lot for working on this!

    _sys_shutdown is the syscall for shutdown(2) used by the socket module.

    Yes, the issue with Emscripten is that a number of system calls are either not implemented or implemented but not tested. See a list we are using in https://github.com/pyodide/pyodide/blob/main/cpython/pyconfig.undefs.h (though things might have improved since it was created).

    FYI, with Emscripten, the list of CPython unit tests that are currently skipped (as of Python 3.9.5) is in https://github.com/pyodide/pyodide/blob/main/src/tests/python_tests.txt some of those are due to browser VM limitations (e.g. virtual filestem by Emscripten that's not fully POSIX compliant, no processes, no sockets, async only via the browser event loop etc), others because we are not yet using threading since not all browsers support it, and some failures probably need more investigation.

    Also opened pyodide/pyodide#2000 . Let us know if there is anything we can do help with this effort.

    @tiran
    Copy link
    Member

    tiran commented Nov 26, 2021

    New changeset d224e76 by Christian Heimes in branch 'main':
    bpo-40280: clean and ignore .wasm files (GH-29794)
    d224e76

    @tiran
    Copy link
    Member

    tiran commented Nov 26, 2021

    Thanks Roman, I replied on the pyodide issue tracker.

    miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jul 1, 2022
    * Buffer standard input line-by-line
    
    * Add non-root .editorconfig for JS & HTML indent
    
    * Add support for clearing REPL with CTRL+L
    
    * Support unicode in stdout and stderr
    
    * Remove \r\n normalization
    
    * Note that local .editorconfig file extends root
    
    * Only normalize lone \r characters (convert to \n)
    
    * Skip non-printable characters in buffered input
    
    * Fix Safari bug (regex lookbehind not supported)
    
    Co-authored-by: Christian Heimes <christian@python.org>
    (cherry picked from commit a8e333d)
    
    Co-authored-by: Trey Hunner <trey@treyhunner.com>
    tiran added a commit that referenced this issue Jul 1, 2022
    * Buffer standard input line-by-line
    
    * Add non-root .editorconfig for JS & HTML indent
    
    * Add support for clearing REPL with CTRL+L
    
    * Support unicode in stdout and stderr
    
    * Remove \r\n normalization
    
    * Note that local .editorconfig file extends root
    
    * Only normalize lone \r characters (convert to \n)
    
    * Skip non-printable characters in buffered input
    
    * Fix Safari bug (regex lookbehind not supported)
    
    Co-authored-by: Christian Heimes <christian@python.org>
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jul 1, 2022
    …es (pythonGH-93953)
    
    (cherry picked from commit 1df9449)
    
    Co-authored-by: Petr Viktorin <encukou@gmail.com>
    miss-islington added a commit that referenced this issue Jul 1, 2022
    * Buffer standard input line-by-line
    
    * Add non-root .editorconfig for JS & HTML indent
    
    * Add support for clearing REPL with CTRL+L
    
    * Support unicode in stdout and stderr
    
    * Remove \r\n normalization
    
    * Note that local .editorconfig file extends root
    
    * Only normalize lone \r characters (convert to \n)
    
    * Skip non-printable characters in buffered input
    
    * Fix Safari bug (regex lookbehind not supported)
    
    Co-authored-by: Christian Heimes <christian@python.org>
    (cherry picked from commit a8e333d)
    
    Co-authored-by: Trey Hunner <trey@treyhunner.com>
    miss-islington added a commit that referenced this issue Jul 1, 2022
    …-93953)
    
    (cherry picked from commit 1df9449)
    
    Co-authored-by: Petr Viktorin <encukou@gmail.com>
    miss-islington pushed a commit to miss-islington/cpython that referenced this issue Sep 11, 2022
    …ythonGH-96303)
    
    (cherry picked from commit a36235d)
    
    Co-authored-by: Christian Heimes <christian@python.org>
    miss-islington added a commit that referenced this issue Sep 13, 2022
    (cherry picked from commit a36235d)
    
    Co-authored-by: Christian Heimes <christian@python.org>
    vstinner added a commit to vstinner/cpython that referenced this issue Sep 2, 2023
    vstinner pushed a commit to vstinner/cpython that referenced this issue Sep 2, 2023
    …94002)
    
    - Emscripten's default umask is too strict, see
      emscripten-core/emscripten#17269
    - getuid/getgid and geteuid/getegid are stubs that always return 0
      (root). Disable effective uid/gid syscalls and fix tests that use
      chmod() current user.
    - Cannot drop X bit from directory.
    
    (cherry picked from commit 2702e40)
    vstinner added a commit that referenced this issue Sep 3, 2023
    …108820)
    
    * Revert "[3.11] gh-101634: regrtest reports decoding error as failed test (#106169) (#106175)"
    
    This reverts commit d5418e9.
    
    * Revert "[3.11] bpo-46523: fix tests rerun when `setUp[Class|Module]` fails (GH-30895) (GH-103342)"
    
    This reverts commit ecb09a8.
    
    * Revert "gh-95027: Fix regrtest stdout encoding on Windows (GH-98492)"
    
    This reverts commit b2aa28e.
    
    * Revert "[3.11] gh-94026: Buffer regrtest worker stdout in temporary file (GH-94253) (GH-94408)"
    
    This reverts commit 0122ab2.
    
    * Revert "Run Tools/scripts/reindent.py (GH-94225)"
    
    This reverts commit f0f3a42.
    
    * Revert "gh-94052: Don't re-run failed tests with --python option (GH-94054)"
    
    This reverts commit 1347607.
    
    * Revert "[3.11] gh-84461: Fix Emscripten umask and permission issues (GH-94002) (GH-94006)"
    
    This reverts commit 1073184.
    
    * gh-93353: regrtest checks for leaked temporary files (#93776)
    
    When running tests with -jN, create a temporary directory per process
    and mark a test as "environment changed" if a test leaks a temporary
    file or directory.
    
    (cherry picked from commit e566ce5)
    
    * gh-93353: Fix regrtest for -jN with N >= 2 (GH-93813)
    
    (cherry picked from commit 36934a1)
    
    * gh-93353: regrtest supports checking tmp files with -j2 (#93909)
    
    regrtest now also implements checking for leaked temporary files and
    directories when using -jN for N >= 2. Use tempfile.mkdtemp() to
    create the temporary directory. Skip this check on WASI.
    
    (cherry picked from commit 4f85cec)
    
    * gh-84461: Fix Emscripten umask and permission issues (GH-94002)
    
    - Emscripten's default umask is too strict, see
      emscripten-core/emscripten#17269
    - getuid/getgid and geteuid/getegid are stubs that always return 0
      (root). Disable effective uid/gid syscalls and fix tests that use
      chmod() current user.
    - Cannot drop X bit from directory.
    
    (cherry picked from commit 2702e40)
    
    * gh-94052: Don't re-run failed tests with --python option (#94054)
    
    (cherry picked from commit 0ff7b99)
    
    * Run Tools/scripts/reindent.py (#94225)
    
    Reindent files which were not properly formatted (PEP 8: 4 spaces).
    
    Remove also some trailing spaces.
    
    (cherry picked from commit e87ada4)
    
    * gh-94026: Buffer regrtest worker stdout in temporary file (GH-94253)
    
    Co-authored-by: Victor Stinner <vstinner@python.org>
    (cherry picked from commit 199ba23)
    
    * gh-96465: Clear fractions hash lru_cache under refleak testing (GH-96689)
    
    Automerge-Triggered-By: GH:zware
    (cherry picked from commit 9c8f379)
    
    * gh-95027: Fix regrtest stdout encoding on Windows (#98492)
    
    On Windows, when the Python test suite is run with the -jN option,
    the ANSI code page is now used as the encoding for the stdout
    temporary file, rather than using UTF-8 which can lead to decoding
    errors.
    
    (cherry picked from commit ec1f6f5)
    
    * gh-98903: Test suite fails with exit code 4 if no tests ran (#98904)
    
    The Python test suite now fails wit exit code 4 if no tests ran. It
    should help detecting typos in test names and test methods.
    
    * Add "EXITCODE_" constants to Lib/test/libregrtest/main.py.
    * Fix a typo: "NO TEST RUN" becomes "NO TESTS RAN"
    
    (cherry picked from commit c76db37)
    
    * gh-100086: Add build info to test.libregrtest (#100093)
    
    The Python test runner (libregrtest) now logs Python build information like
    "debug" vs "release" build, or LTO and PGO optimizations.
    
    (cherry picked from commit 3c89202)
    
    * bpo-46523: fix tests rerun when `setUp[Class|Module]` fails (#30895)
    
    Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
    Co-authored-by: Łukasz Langa <lukasz@langa.pl>
    (cherry picked from commit 9953860)
    
    * gh-82054: allow test runner to split test_asyncio to execute in parallel by sharding. (#103927)
    
    This runs test_asyncio sub-tests in parallel using sharding from Cinder. This suite is typically the longest-pole in runs because it is a test package with a lot of further sub-tests otherwise run serially. By breaking out the sub-tests as independent modules we can run a lot more in parallel.
    
    After porting we can see the direct impact on a multicore system.
    
    Without this change:
      Running make test is 5 min 26 seconds
    With this change:
      Running make test takes 3 min 39 seconds
    
    That'll vary based on system and parallelism. On a `-j 4` run similar to what CI and buildbot systems often do, it reduced the overall test suite completion latency by 10%.
    
    The drawbacks are that this implementation is hacky and due to the sorting of the tests it obscures when the asyncio tests occur and involves changing CPython test infrastructure but, the wall time saved it is worth it, especially in low-core count CI runs as it pulls a long tail. The win for productivity and reserved CI resource usage is significant.
    
    Future tests that deserve to be refactored into split up suites to benefit from are test_concurrent_futures and the way the _test_multiprocessing suite gets run for all start methods. As exposed by passing the -o flag to python -m test to get a list of the 10 longest running tests.
    
    ---------
    
    Co-authored-by: Carl Meyer <carl@oddbird.net>
    Co-authored-by: Gregory P. Smith <greg@krypto.org> [Google, LLC]
    (cherry picked from commit 9e011e7)
    
    * Display the sanitizer config in the regrtest header. (#105301)
    
    Display the sanitizers present in libregrtest.
    
    Having this in the CI output for tests with the relevant environment
    variable displayed will help make it easier to do what we need to
    create an equivalent local test run.
    
    (cherry picked from commit 852348a)
    
    * gh-101634: regrtest reports decoding error as failed test (#106169)
    
    When running the Python test suite with -jN option, if a worker stdout
    cannot be decoded from the locale encoding report a failed testn so the
    exitcode is non-zero.
    
    (cherry picked from commit 2ac3eec)
    
    * gh-108223: test.pythoninfo and libregrtest log Py_NOGIL (#108238)
    
    Enable with --disable-gil --without-pydebug:
    
        $ make pythoninfo|grep NOGIL
        sysconfig[Py_NOGIL]: 1
    
        $ ./python -m test
        ...
        == Python build: nogil debug
        ...
    
    (cherry picked from commit 5afe0c1)
    
    * gh-90791: test.pythoninfo logs ASAN_OPTIONS env var (#108289)
    
    * Cleanup libregrtest code logging ASAN_OPTIONS.
    * Fix a typo on "ASAN_OPTIONS" vs "MSAN_OPTIONS".
    
    (cherry picked from commit 3a1ac87)
    
    * gh-108388: regrtest splits test_asyncio package (#108393)
    
    Currently, test_asyncio package is only splitted into sub-tests when
    using command "./python -m test". With this change, it's also
    splitted when passing it on the command line:
    "./python -m test test_asyncio".
    
    Remove the concept of "STDTESTS". Python is now mature enough to not
    have to bother with that anymore. Removing STDTESTS simplify the
    code.
    
    (cherry picked from commit 174e9da)
    
    * regrtest computes statistics (#108793)
    
    test_netrc, test_pep646_syntax and test_xml_etree now return results
    in the test_main() function.
    
    Changes:
    
    * Rewrite TestResult as a dataclass with a new State class.
    * Add test.support.TestStats class and Regrtest.stats_dict attribute.
    * libregrtest.runtest functions now modify a TestResult instance
      in-place.
    * libregrtest summary lists the number of run tests and skipped
      tests, and denied resources.
    * Add TestResult.has_meaningful_duration() method.
    * Compute TestResult duration in the upper function.
    * Use time.perf_counter() instead of time.monotonic().
    * Regrtest: rename 'resource_denieds' attribute to 'resource_denied'.
    * Rename CHILD_ERROR to MULTIPROCESSING_ERROR.
    * Use match/case syntadx to have different code depending on the
      test state.
    
    Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
    (cherry picked from commit d4e534c)
    
    * gh-108822: Add Changelog entry for regrtest statistics (#108821)
    
    ---------
    
    Co-authored-by: Christian Heimes <christian@python.org>
    Co-authored-by: Zachary Ware <zach@python.org>
    Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
    Co-authored-by: Joshua Herman <zitterbewegung@gmail.com>
    Co-authored-by: Gregory P. Smith <greg@krypto.org>
    @github-project-automation github-project-automation bot moved this from Todo to Done in WASI to tier 2 Oct 19, 2023
    arhadthedev added a commit to arhadthedev/cpython that referenced this issue Dec 11, 2023
    arhadthedev added a commit to arhadthedev/cpython that referenced this issue Dec 11, 2023
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.11 only security fixes build The build process and cross-build OS-wasi type-feature A feature request or enhancement
    Projects
    No open projects
    Status: Done
    Development

    No branches or pull requests

    7 participants