#![allow(clippy::unwrap_used, clippy::expect_used)]
use std::path::PathBuf;
fn manifest_dir() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
}
#[test]
fn c_header_compiles_with_strict_c11() {
let tests_dir = manifest_dir().join("tests").join("c");
let include_dir = manifest_dir().join("include");
let out_dir = manifest_dir()
.join("target")
.join("tests")
.join("abi_c_smoke");
std::fs::create_dir_all(&out_dir).expect("create scratch out dir");
unsafe { std::env::set_var("OUT_DIR", &out_dir) };
unsafe {
std::env::set_var(
"HOST",
std::env::var("HOST").unwrap_or_else(|_| current_target()),
)
};
unsafe {
std::env::set_var(
"TARGET",
std::env::var("TARGET").unwrap_or_else(|_| current_target()),
)
};
unsafe { std::env::set_var("OPT_LEVEL", "0") };
let mut build = cc::Build::new();
build
.file(tests_dir.join("smoke.c"))
.include(&include_dir)
.warnings(true)
.extra_warnings(true)
.flag_if_supported("-std=c11")
.flag_if_supported("-Wall")
.flag_if_supported("-Wextra")
.flag_if_supported("-Wpedantic")
.flag_if_supported("-Werror")
.flag_if_supported("-Wno-zero-length-array")
.flag_if_supported("/W4")
.flag_if_supported("/WX")
.flag_if_supported("/wd4200")
.flag_if_supported("/wd4820")
.cargo_metadata(false);
match build.try_compile("tinyquant_c_smoke") {
Ok(()) => {}
Err(e) => {
eprintln!(
"abi_c_smoke skipped: cc failed to compile tinyquant.h: {e}. \
This is informational; run locally with a C11 toolchain to \
enforce header parseability."
);
}
}
}
fn current_target() -> String {
let arch = std::env::consts::ARCH;
let os = std::env::consts::OS;
match os {
"windows" => format!("{arch}-pc-windows-msvc"),
"macos" => format!("{arch}-apple-darwin"),
"linux" => format!("{arch}-unknown-linux-gnu"),
other => format!("{arch}-unknown-{other}"),
}
}