Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions Modules/cpython-sys/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<String> = 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)
Expand All @@ -95,16 +98,45 @@ 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");
}
// 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.
Expand Down
Loading