Releases: emscripten-core/emscripten
Release list
6.0.8
What's Changed
- The
JSPIsetting 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 underPROXY_TO_PTHREAD,
ASYNCIFY, andJSPI. (#27207) - The deprecated
LEGALIZE_JS_FFIsetting was completely removed and moved to
legacy settings. This behaviour of lowering away i64 values at the
Wasm bounary is still used whenWASM_BIGINTis disabled. However
disabling ofWASM_BIGINTitself should only be needed under-sWASM=0
(where it is automatically disabled). (#27568) - The
SOCKET_WEBRTCsetting was removed (#27367) WASM_BIGINTwas 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
What's Changed
- JavaScript library symbols can now use the
__forceand__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-exceptionsnow links the Wasm EH runtime (libunwind and the
__cpp_exceptiontag) independently of C++ linking, so Wasm EH objects from
non-C++ frontends (e.g. rustc, which links viaemcc) link without
requiringem++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 assumingbulk-memory,nontrapping-fptoint, andWASM_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
- @HendrikHuebner made their first contribution in #27522
Full Changelog: 6.0.6...6.0.7
6.0.6
What's Changed
DEFAULT_TO_CXXis now disabled by default. This means thatem++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.iniand
wasm64-emscripten.ini) intools/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
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
- @jeremy-code made their first contribution in #27412
Full Changelog: 6.0.4...6.0.5
6.0.4
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.pathwithin 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)
recvmmsgandsendmmsgare now implemented in terms ofrecvmsgand
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
What's Changed
- Fixed
UTF8ToStringwithGROWABLE_ARRAYBUFFERSset. 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 -mfmato enable. With-mrelaxed-simd -mfma, Wasm relaxed
SIMD FMA is used. (#27183) - New
AUTO_INITsetting to opt an instance ES module (MODULARIZE=instanceor
WASM_ESM_INTEGRATION) into self-initialization via top-level await on import,
rather than exporting a defaultinitfunction. Since there is no
init/moduleArg, module-level configuration is unavailable:
INCOMING_MODULE_JS_APIis 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 frompoll(stream, timeout)to
poll(stream)returning the current readiness mask; out-of-tree custom FS
backends with apollhandler must update. (#27226) - compiler-rt and libunwind were updated to LLVM 22.1.8. (#27245, #27246)
-fcoverage-mappingis 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_ARRAYBUFFERSwas reverted to0since 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
- @fanchenkong1 made their first contribution in #27183
- @duerrbaby made their first contribution in #27073
- @Young-Lord made their first contribution in #27256
- @heyparth1 made their first contribution in #27242
- @WebCoder49 made their first contribution in #27326
Full Changelog: 6.0.2...6.0.3
6.0.2
What's Changed
- The
GROWABLE_ARRAYBUFFERSsetting 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 withALLOW_MEMORY_GROWTH, which is not enabled by default.
(#27096, #27212) - New
-sNODERAWSOCKETSsetting that backs the POSIX sockets API with real TCP
(node:net) and UDP (node:dgram) sockets on Node.js, with nows, proxy
process, or pthreads required. Supports incoming and outgoing TCP, UDP, IPv6,
and-pthreadwithPROXY_TO_PTHREAD. Uses the public node APIs where
available, falling back totcp_wrap/udp_wrapon 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
- @UnknownHacker1 made their first contribution in #27163
- @stas-badzi made their first contribution in #27192
Full Changelog: 6.0.1...6.0.2
6.0.1
What's Changed
- The ability to redirect JS compiler stderr using
EMCC_STDERR_FILEwas
removed. These days you can useEMCC_DEBUGand/orEMCC_DEBUG_SAVEto
preserve all the intermediate JS compiler files. (#27101) - The installed versions of the compiler-rt library now follow the upstream
naming convetion oflibclang_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_STORAGElinker flag integrating the
proposed Cross-Origin Storage browser API
as a progressive enhancement for Wasm loading on the web target. See
docs/compiling/CrossOriginStorage.rstfor details. (#27066) - The
-sUSE_PTHREADSand-sMEMORY64flags have been deprecated in favor of the
more standard-pthreadand-m64(or--target=wasm64) flags. (#27025) - Adds wasm-bindgen support. When
-sWASM_BINDGENis set, Emscripten will call
out towasm-bindgenin 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_getspuriously failing under Node.js and the
shell environment for small requests. (#27122) - The startup process for the generated program now makes use of
async/
awaitunder more circumstances (specifically when usingsetStatus, 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
What's Changed
- On Windows, Emscripten now ships
.exetool launchers, rather
than.batand/or.ps1. This means that any scripts that explicitly
reference, e.g.emcc.bat, will need to be updated to justemcc(or
emcc.exe). For the time being you can still get the old.batfiles by
runningtools/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
-m64compiler flag is now honored, and works as an alias for
-sMEMORY64and/or--target=wasm64. (#26765) - The autopersistence feature in IDBFS mount now supports registering a global
callbackIDBFS.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_DYLIBSsetting is now disabled by default. This means that
-sharedwill produce real dynamic libraries by default (-sSIDE_MODULEis
implied). Also, if you include real dynamic libraries in your link command
emscripten will now automatically produce a dynamically linked program
(-sMAIN_MODULE=2is implied). (#25930) - The
PThread.runningWorkersfield was removed from thePThreadobject.
If you have JS code that was depending on this you can transition to using the
PThread.pthreadsobject. (#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
- @HCL-JasonR made their first contribution in #26542
- @vittorioromeo made their first contribution in #26846
- @soilSpoon made their first contribution in #26814
- @garymathews made their first contribution in #26891
- @guybedford made their first contribution in #26967
Full Changelog: 5.0.7...6.0.0