From 2d583f7f8400d94dd9ead13e2fd69630622f7ce8 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 11 Mar 2026 16:25:30 +0100 Subject: [PATCH 1/2] Emscripten: No extra rustc-cdylib-link-args on Rust >= 1.95 We used to have to pass extra flags to build with Emscripten but 1. Emscripten 4.0.0 made WASM_BIGINT automatic 2. Rust version 1.95 learned how to build cdylibs https://github.com/rust-lang/rust/pull/151704 We use Emscripten 3.1.58 to build for Python 3.12 which would be broken by dropping WASM_BIGINT but for Python 3.12 we also use JS eh which doesn't work at all with Rust version >= 1.93 so there's no added breakage. On the other hand, Python 3.13 uses Emscripten 4.0.9 and doesn't need `-sWASM_BIGINT`. --- pyo3-build-config/src/lib.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/pyo3-build-config/src/lib.rs b/pyo3-build-config/src/lib.rs index 156ecd309f6..ad0bd9af5ac 100644 --- a/pyo3-build-config/src/lib.rs +++ b/pyo3-build-config/src/lib.rs @@ -56,19 +56,29 @@ pub fn use_pyo3_cfgs() { /// /// The following link flags are added: /// - macOS: `-undefined dynamic_lookup` -/// - wasm32-unknown-emscripten: `-sSIDE_MODULE=2 -sWASM_BIGINT` +/// - wasm32-unknown-emscripten: for Rust <= 1.95, `-sSIDE_MODULE=2 -sWASM_BIGINT` /// /// All other platforms currently are no-ops, however this may change as necessary /// in future. pub fn add_extension_module_link_args() { - _add_extension_module_link_args(&impl_::target_triple_from_env(), std::io::stdout()) + _add_extension_module_link_args( + &impl_::target_triple_from_env(), + std::io::stdout(), + rustc_minor_version(), + ) } -fn _add_extension_module_link_args(triple: &Triple, mut writer: impl std::io::Write) { +fn _add_extension_module_link_args( + triple: &Triple, + mut writer: impl std::io::Write, + rustc_minor_version: Option, +) { if matches!(triple.operating_system, OperatingSystem::Darwin(_)) { writeln!(writer, "cargo:rustc-cdylib-link-arg=-undefined").unwrap(); writeln!(writer, "cargo:rustc-cdylib-link-arg=dynamic_lookup").unwrap(); - } else if triple == &Triple::from_str("wasm32-unknown-emscripten").unwrap() { + } else if triple == &Triple::from_str("wasm32-unknown-emscripten").unwrap() + && rustc_minor_version.is_some_and(|version| version < 95) + { writeln!(writer, "cargo:rustc-cdylib-link-arg=-sSIDE_MODULE=2").unwrap(); writeln!(writer, "cargo:rustc-cdylib-link-arg=-sWASM_BIGINT").unwrap(); } @@ -415,12 +425,14 @@ mod tests { _add_extension_module_link_args( &Triple::from_str("x86_64-pc-windows-msvc").unwrap(), &mut buf, + None, ); assert_eq!(buf, Vec::new()); _add_extension_module_link_args( &Triple::from_str("x86_64-apple-darwin").unwrap(), &mut buf, + None, ); assert_eq!( std::str::from_utf8(&buf).unwrap(), @@ -432,12 +444,20 @@ mod tests { _add_extension_module_link_args( &Triple::from_str("wasm32-unknown-emscripten").unwrap(), &mut buf, + None, ); assert_eq!( std::str::from_utf8(&buf).unwrap(), "cargo:rustc-cdylib-link-arg=-sSIDE_MODULE=2\n\ cargo:rustc-cdylib-link-arg=-sWASM_BIGINT\n" ); + buf.clear(); + _add_extension_module_link_args( + &Triple::from_str("wasm32-unknown-emscripten").unwrap(), + &mut buf, + Some(95), + ); + assert_eq!(std::str::from_utf8(&buf).unwrap(), ""); } #[cfg(feature = "resolve-config")] From b2c960a9959b7db36639585caf71ba2b31e90ab0 Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Fri, 13 Mar 2026 10:25:57 +0000 Subject: [PATCH 2/2] Update pyo3-build-config/src/lib.rs --- pyo3-build-config/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyo3-build-config/src/lib.rs b/pyo3-build-config/src/lib.rs index ad0bd9af5ac..5fdb5c69065 100644 --- a/pyo3-build-config/src/lib.rs +++ b/pyo3-build-config/src/lib.rs @@ -444,7 +444,7 @@ mod tests { _add_extension_module_link_args( &Triple::from_str("wasm32-unknown-emscripten").unwrap(), &mut buf, - None, + Some(94), ); assert_eq!( std::str::from_utf8(&buf).unwrap(),