From 6983b93961270173d46b79dae4db30e3fb351e03 Mon Sep 17 00:00:00 2001 From: Aliaksei Semianiuk Date: Sat, 14 Mar 2026 16:50:11 +0500 Subject: [PATCH 1/2] build: default bindgen to gnu11 --- Modules/cpython-sys/build.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Modules/cpython-sys/build.rs b/Modules/cpython-sys/build.rs index a97c1413914a02..f4df498f51ee44 100644 --- a/Modules/cpython-sys/build.rs +++ b/Modules/cpython-sys/build.rs @@ -62,6 +62,8 @@ fn generate_c_api_bindings(srcdir: &Path, builddir: Option<&str>, out_path: &Pat // Suppress all clang warnings (deprecation warnings, etc.) builder = builder.clang_arg("-w"); + // Force C mode for CPython headers. + builder = builder.clang_arg("-x").clang_arg("c"); // Tell clang the correct target triple for cross-compilation when we have // an LLVM-specific triple. Otherwise let bindgen translate Cargo's TARGET @@ -80,6 +82,7 @@ fn generate_c_api_bindings(srcdir: &Path, builddir: Option<&str>, out_path: &Pat // - WASI: sysroot in CC, -D_WASI_EMULATED_SIGNAL in CFLAGS // - iOS: -isysroot in CPPFLAGS let mut have_sysroot = false; + let mut std_flag: Option = None; for env_name in ["PY_CC", "PY_CPPFLAGS", "PY_CFLAGS"] { if let Ok(value) = env::var(env_name) && let Some(flags) = shlex::split(&value) @@ -95,16 +98,34 @@ fn generate_c_api_bindings(srcdir: &Path, builddir: Option<&str>, out_path: &Pat { builder = builder.clang_arg(path); } + } else if flag == "-std" { + builder = builder.clang_arg(flag); + if let Some(value) = iter.next() { + builder = builder.clang_arg(value); + std_flag = Some(value.to_string()); + } } else if flag.starts_with("-I") || flag.starts_with("-D") || flag.starts_with("-std=") || flag.starts_with("-isystem") { builder = builder.clang_arg(flag); + if flag.starts_with("-std=") { + std_flag = Some(flag.trim_start_matches("-std=").to_string()); + } } } } } + let needs_c11 = match std_flag.as_deref() { + None => true, + Some("c89" | "c90" | "c99" | "gnu89" | "gnu90" | "gnu99") => true, + _ => false, + }; + if needs_c11 { + // Bindgen needs C11 for stdatomic.h (e.g. mimalloc); override older defaults. + builder = builder.clang_arg("-std=gnu11"); + } // WASI SDK: WASI_SDK_PATH is set by Tools/wasm/wasi/__main__.py. // The sysroot is at $WASI_SDK_PATH/share/wasi-sysroot. From e8b5be0499dc32f4e5e08853bb846f6a76338488 Mon Sep 17 00:00:00 2001 From: Aliaksei Semianiuk Date: Sun, 15 Mar 2026 11:42:09 +0500 Subject: [PATCH 2/2] bindgen: force C11 atomics and avoid x86 intrinsics on non-x86 --- Modules/cpython-sys/build.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Modules/cpython-sys/build.rs b/Modules/cpython-sys/build.rs index f4df498f51ee44..02afeb1f9c2b63 100644 --- a/Modules/cpython-sys/build.rs +++ b/Modules/cpython-sys/build.rs @@ -126,6 +126,17 @@ fn generate_c_api_bindings(srcdir: &Path, builddir: Option<&str>, out_path: &Pat // Bindgen needs C11 for stdatomic.h (e.g. mimalloc); override older defaults. builder = builder.clang_arg("-std=gnu11"); } + // Bindgen parses headers only; force C11 atomics to be available even if + // the target's std headers disable them in freestanding mode. + builder = builder + .clang_arg("-U__STDC_NO_ATOMICS__") + .clang_arg("-D__STDC_NO_ATOMICS__=0") + .clang_arg("-D__STDC_HOSTED__=1"); + // Avoid x86 intrinsic headers on non-x86 targets (they can error in clang's + // builtin headers when the target/sysroot doesn't match). + if !cargo_target.contains("x86_64") && !cargo_target.contains("i686") && !cargo_target.contains("x86") { + builder = builder.clang_arg("-U__SSE2__").clang_arg("-U__MMX__"); + } // WASI SDK: WASI_SDK_PATH is set by Tools/wasm/wasi/__main__.py. // The sysroot is at $WASI_SDK_PATH/share/wasi-sysroot.