Skip to content

Releases: emscripten-core/emscripten

6.0.8

Choose a tag to compare

@emscripten-bot emscripten-bot released this 20 Aug 18:21
aeb6792

What's Changed

  • The JSPI setting is no longer considered experimental, and the compiler
    diagnostic warning has been removed. (#27559)
  • Added support for epoll (epoll_create1/epoll_ctl/epoll_wait/
    epoll_pwait) on the legacy (non-WASMFS) JS filesystem, including
    level- and edge-triggered modes, EPOLLONESHOT, EPOLLEXCLUSIVE,
    EPOLLRDHUP, nesting, and blocking waits under PROXY_TO_PTHREAD,
    ASYNCIFY, and JSPI. (#27207)
  • The deprecated LEGALIZE_JS_FFI setting was completely removed and moved to
    legacy settings. This behaviour of lowering away i64 values at the
    Wasm bounary is still used when WASM_BIGINT is disabled. However
    disabling of WASM_BIGINT itself should only be needed under -sWASM=0
    (where it is automatically disabled). (#27568)
  • The SOCKET_WEBRTC setting was removed (#27367)
  • WASM_BIGINT was deprecated. BigInt integration is standard and enabled by
    default across all supported engines; it should now only ever be disabled
    implicitly when targeting JavaScript via -sWASM=0. (#27558)

Contributors

Thanks to the following contributors: @sbc100 (10) @guybedford (2) @brendandahl (1)

Full Changelog: 6.0.7...6.0.8

6.0.7

Choose a tag to compare

@emscripten-bot emscripten-bot released this 17 Aug 22:45
4483d70

What's Changed

  • JavaScript library symbols can now use the __force and __export
    decorators to control inclusion and export visibility. (#27436)
  • contrib.glfw3 port upgraded to use the latest version of GLFW 3.5.1
    (#27508)
  • -fwasm-exceptions now links the Wasm EH runtime (libunwind and the
    __cpp_exception tag) independently of C++ linking, so Wasm EH objects from
    non-C++ frontends (e.g. rustc, which links via emcc) link without
    requiring em++ or -sDEFAULT_TO_CXX. (#27496)
  • FreeType was updated to 2.14.3 (#27518)
  • The oldest supported Safari version (MIN_SAFARI_VERSION) was raised from
    14.1 to 15.0, making 15.0 the minimum version that can be targeted. This
    allows assuming bulk-memory, nontrapping-fptoint, and WASM_BIGINT
    (JS_BIGINT_INTEGRATION) are universally available across all supported
    engines, and removes legacy JS polyfills and Binaryen lowering passes.
    (#27542)

Contributors

Thanks to the following contributors: @sbc100 (24) @hoodmane (4) @guybedford (2) @aheejin (1) @HCL-JasonR (1) @HendrikHuebner (1) @kleisauke (1) @ypujante (1)

New Contributors

Full Changelog: 6.0.6...6.0.7

6.0.6

Choose a tag to compare

@emscripten-bot emscripten-bot released this 05 Aug 21:15
ce75e06

What's Changed

  • DEFAULT_TO_CXX is now disabled by default. This means that em++ is now
    required when linking C++ programs, matching the behavior of clang and gcc.
    The old behavior is still available using -sDEFAULT_TO_CXX. (#11121)
  • Added example Meson cross compilation files (wasm32-emscripten.ini and
    wasm64-emscripten.ini) in tools/meson/. (#27478)
  • libcxx and libcxxabi were updated to LLVM 22.1.8. (#27428)

Contributors

Thanks to the following contributors: @sbc100 (29) @aheejin (6) @guybedford (2) @tlively (1)

Full Changelog: 6.0.5...6.0.6

6.0.5

Choose a tag to compare

@emscripten-bot emscripten-bot released this 29 Jul 00:08
1db5137

What's Changed

  • Revert #27397, which changed the way config keys such as NODE_JS were parsed
    when reading the config file. This change broke emsdk installations that
    contained spaces. (#27421)

Contributors

Thanks to the following contributors: @sbc100 (10) @guybedford (1) @jeremy-code (1) @stephenduong1004 (1) @tlively (1)

New Contributors

Full Changelog: 6.0.4...6.0.5

6.0.4

Choose a tag to compare

@emscripten-bot emscripten-bot released this 27 Jul 15:07
fe5be6a

What's Changed

  • The emscripten config file parser can now handle strings that contain
    environment variables (e.g. $HOME) and that use the ~/ prefix. This means
    that it should be possible, in most cases, to avoid the use of python's
    os.path within the the config file itself. (#27215)
  • Legacy support for ancient vendor-prefixed DOM APIs was removed (#27341,
    #27339, #27338, #27340, #27347)
  • Removed legacy JS library symbols symbols: $ALLOC_NORMAL, $ALLOC_STACK,
    and $allocate. (#27378)
  • llvm-libc was updated to LLVM 22.1.8. (#27374)
  • mimalloc was updated to 3.4.1. (#27380)
  • Backport fix for musl's qsort (CVE-2026-40200) (#27029)
  • recvmmsg and sendmmsg are now implemented in terms of recvmsg and
    sendmsg. (#27395)

Contributors

Thanks to the following contributors: @sbc100 (42) @guybedford (7) @aheejin (1) @brendandahl (1) @HCL-JasonR (1) @kleisauke (1) @stephenduong1004 (1)

Full Changelog: 6.0.3...6.0.4

6.0.3

Choose a tag to compare

@emscripten-bot emscripten-bot released this 13 Jul 21:20
283e2d1

What's Changed

  • Fixed UTF8ToString with GROWABLE_ARRAYBUFFERS set. String decoding now
    copies the data when the heap buffer is resizable, just like it does in
    the shared memory case. (#27242)
  • Added support for compiling FMA intrinsics. All 32 FMA intrinsics are
    supported, with 256-bit variants emulated via two 128-bit operations. Pass
    -msimd128 -mfma to enable. With -mrelaxed-simd -mfma, Wasm relaxed
    SIMD FMA is used. (#27183)
  • New AUTO_INIT setting to opt an instance ES module (MODULARIZE=instance or
    WASM_ESM_INTEGRATION) into self-initialization via top-level await on import,
    rather than exporting a default init function. Since there is no
    init/moduleArg, module-level configuration is unavailable:
    INCOMING_MODULE_JS_API is disabled and passing a non-empty one is an error.
  • The async poll()/select() implementation was refactored onto a per-inode
    readiness wait-queue. As part of this, the (undocumented) stream_ops.poll
    FS-backend handler signature changed from poll(stream, timeout) to
    poll(stream) returning the current readiness mask; out-of-tree custom FS
    backends with a poll handler must update. (#27226)
  • compiler-rt and libunwind were updated to LLVM 22.1.8. (#27245, #27246)
  • -fcoverage-mapping is currently broken due to a mismatch between the version
    of LLVM used and the imported version of compiler-rt. We hope to fix this
    in the next release. (#27261)
  • The default value for GROWABLE_ARRAYBUFFERS was reverted to 0 since we
    found issues with Web API compatibility. (#27260)

Contributors

Thanks to the following contributors: @sbc100 (38) @guybedford (11) @aheejin (7) @brendandahl (4) @kleisauke (3) @tlively (2) @duerrbaby (1) @fanchenkong1 (1) @heyparth1 (1) @hoodmane (1) @JAicewizard (1) @pavelsavara (1) @tomayac (1) @WebCoder49 (1) @Young-Lord (1)

New Contributors

Full Changelog: 6.0.2...6.0.3

6.0.2

Choose a tag to compare

@emscripten-bot emscripten-bot released this 01 Jul 19:43
7a2d97d

What's Changed

  • The GROWABLE_ARRAYBUFFERS setting now supports both =1 (auto-detect and
    use the feature) and =2 (unconditionally use the feature, avoiding the
    overhead in multi-threaded builds). It now defaults to =1, meaning the
    feature will be used when available. Note that this only affects programs
    that are built with ALLOW_MEMORY_GROWTH, which is not enabled by default.
    (#27096, #27212)
  • New -sNODERAWSOCKETS setting that backs the POSIX sockets API with real TCP
    (node:net) and UDP (node:dgram) sockets on Node.js, with no ws, proxy
    process, or pthreads required. Supports incoming and outgoing TCP, UDP, IPv6,
    and -pthread with PROXY_TO_PTHREAD. Uses the public node APIs where
    available, falling back to tcp_wrap/udp_wrap on older Node.js. (#27080)
  • The following symbols are no longer included in INCOMING_MODULE_JS_API
    by default:
    • GL_MAX_TEXTURE_IMAGE_UNITS
    • SDL_canPlayWithWebAudio
    • SDL_numSimultaneouslyQueuedBuffers
    • freePreloadedMediaOnUse
    • preinitializedWebGLContext
    • keyboardListeningElement
    • doNotCaptureKeyboard
    • extraStackTrace
    • preloadPlugins
    • postMainLoop
    • preMainLoop
    • forcedAspectRatio
    • mainScriptUrlOrBlob
    • onFullScreen
    • INITIAL_MEMORY
    • wasmMemory
    • wasmBinary
      Anybody using these will see a clear error in their debug builds signaling
      that they now need to be explicitly added to -sINCOMING_MODULE_JS_API.

Contributors

Thanks to the following contributors: @sbc100 (36) @kleisauke (5) @dschuff (3) @guybedford (3) @Diyou (1) @fanchenkong1 (1) @stas-badzi (1) @UnknownHacker1 (1)

New Contributors

Full Changelog: 6.0.1...6.0.2

6.0.1

Choose a tag to compare

@emscripten-bot emscripten-bot released this 22 Jun 21:42
25e4e8d

What's Changed

  • The ability to redirect JS compiler stderr using EMCC_STDERR_FILE was
    removed. These days you can use EMCC_DEBUG and/or EMCC_DEBUG_SAVE to
    preserve all the intermediate JS compiler files. (#27101)
  • The installed versions of the compiler-rt library now follow the upstream
    naming convetion of libclang_rt.<something>.a. (#27089)
  • Dynamic linking now explicitly requires asynchronous Wasm compilation. The
    process of loading side modules at startup currently depends on this. (#27086)
  • New experimental -sCROSS_ORIGIN_STORAGE linker flag integrating the
    proposed Cross-Origin Storage browser API
    as a progressive enhancement for Wasm loading on the web target. See
    docs/compiling/CrossOriginStorage.rst for details. (#27066)
  • The -sUSE_PTHREADS and -sMEMORY64 flags have been deprecated in favor of the
    more standard -pthread and -m64 (or --target=wasm64) flags. (#27025)
  • Adds wasm-bindgen support. When -sWASM_BINDGEN is set, Emscripten will call
    out to wasm-bindgen in the users's path and integrate the wasm-bindgen JS
    with the normal Emscripten JS. Some wasm-bindgen features may not yet be fully
    supported. (#23493)
  • Fixed getentropy/random_get spuriously failing under Node.js and the
    shell environment for small requests. (#27122)
  • The startup process for the generated program now makes use of async /
    await under more circumstances (specifically when using setStatus, or
    run dependencies). This means that errors during startup (or during the
    main() function) will more often show up as unhandled promise rejections
    (onunhandledreject) rather than synchronous errors (onerror). (#27121)

Contributors

Thanks to the following contributors: @sbc100 (48) @brendandahl (3) @hwhsu1231 (3) @kleisauke (3) @Diyou (2) @arsnyder16 (1) @guybedford (1) @hoodmane (1) @iakovgi (1) @juj (1) @stevenwdv (1) @tomayac (1) @valadaptive (1) @walkingeyerobot (1)

New Contributors

Full Changelog: 6.0.0...6.0.1

6.0.0

Choose a tag to compare

@sbc100 sbc100 released this 04 Jun 21:49
afa15e0

What's Changed

  • On Windows, Emscripten now ships .exe tool launchers, rather
    than .bat and/or .ps1. This means that any scripts that explicitly
    reference, e.g. emcc.bat, will need to be updated to just emcc (or
    emcc.exe). For the time being you can still get the old .bat files by
    running tools/maint/create_entry_points.py --bat-files. (#24858)
  • When performing a streaming Fetch operation, the max chunk size of downloaded
    bytes that is handed over to the Wasm side from JS is now capped to maximum
    of 8 megabytes. This ensures that a streaming Fetch stays streaming, rather
    than transferring the whole (potentially large) file as one huge chunk, which
    might not fit in the WebAssembly memory. (#26898)
  • The minimum versions of browser engines supported by emscripten's generated
    code were bumped, allowing us to remove our internal support for transpilation
    via babel:
    MIN_CHROME_VERSION: 74 -> 85
    MIN_FIREFOX_VERSION: 68 -> 79
    MIN_SAFARI_VERSION: 12.2 -> 14.1
    This allows us to assume that features such as mutable-globals and sign-ext
    are universally available. Disabling these is no longer possible in
    emscripten. If you still need to support extremely old browsers, you can
    manually transpile the output of emscripten (e.g. using babel for JS and
    binaryen for wasm). (#26677)
  • musl libc updated from v1.2.5 to v1.2.6. (#26860)
  • libpng port updated from 1.6.55 to 1.6.58. (#26592 and #26983)
  • The -m64 compiler flag is now honored, and works as an alias for
    -sMEMORY64 and/or --target=wasm64. (#26765)
  • The autopersistence feature in IDBFS mount now supports registering a global
    callback IDBFS.onAutoPersistStateChanged = active => {}, which will be
    notified of all IDBFS sync start and end events. (#26895)
  • google-closure-compiler was updated to 20260429.0.0. (#26869)
    Closure compiler now provides a native macOS arm64 binary for Apple Silicon,
    in addition to having native binaries for Win-x64, Linux-x64 and Linux-ARM64.
    For other platforms for which Closure compiler does not ship a native binary,
    e.g. Intel x64 Macs and Windows-on-ARM, downloading Java SE Development Kit
    21.0.11 from https://www.oracle.com/europe/java/technologies/downloads/#java21
    is required in order to use Emscripten's Closure Compiler integration.
  • The FAKE_DYLIBS setting is now disabled by default. This means that
    -shared will produce real dynamic libraries by default (-sSIDE_MODULE is
    implied). Also, if you include real dynamic libraries in your link command
    emscripten will now automatically produce a dynamically linked program
    (-sMAIN_MODULE=2 is implied). (#25930)
  • The PThread.runningWorkers field was removed from the PThread object.
    If you have JS code that was depending on this you can transition to using the
    PThread.pthreads object. (#26998)
  • The POSIX pause() function will now return 0 rather than EINTR. (#27044)

Contributors

Thanks to the following contributors: @sbc100 (106) @juj (26) @kleisauke (19) @brendandahl (5) @aheejin (3) @garymathews (3) @HCL-JasonR (3)
@dschuff (2) @kripken (2) @vittorioromeo (2) @guybedford (1) @soilSpoon (1) @tlively (1)

New Contributors

Full Changelog: 5.0.7...6.0.0