Skip to content

Commit c9c9f8f

Browse files
committed
move abi checks to a feature and build the C code at build time
The abi tests are now conditional to the abi-tests feature, when that is enabled, the C code for the abi tests is now built at compile time, using the cc crate rather than having our own Compiler abstraction and having to compile stuff at runtime and deal with temp directories etc.
1 parent 1c7b41a commit c9c9f8f

File tree

13 files changed

+216
-169
lines changed

13 files changed

+216
-169
lines changed

src/codegen/sys/build.rs

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use super::collect_versions;
2-
use crate::{codegen::general, env::Env, file_saver::save_to_file};
2+
use crate::{
3+
codegen::general, env::Env, file_saver::save_to_file, library::MAIN_NAMESPACE, nameutil,
4+
};
35
use log::info;
46
use std::io::{Result, Write};
57

6-
pub fn generate(env: &Env) {
8+
pub fn generate(env: &Env, has_abi_tests: bool) {
79
info!(
810
"Generating sys build script for {}",
911
env.config.library_name
@@ -15,7 +17,7 @@ pub fn generate(env: &Env) {
1517
if !split_build_rs || !path.exists() {
1618
info!("Generating file {:?}", path);
1719
save_to_file(&path, env.config.make_backup, |w| {
18-
generate_build_script(w, env, split_build_rs)
20+
generate_build_script(w, env, split_build_rs, has_abi_tests)
1921
});
2022
}
2123

@@ -29,11 +31,17 @@ pub fn generate(env: &Env) {
2931
}
3032

3133
#[allow(clippy::write_literal)]
32-
fn generate_build_script(w: &mut dyn Write, env: &Env, split_build_rs: bool) -> Result<()> {
34+
fn generate_build_script(
35+
w: &mut dyn Write,
36+
env: &Env,
37+
split_build_rs: bool,
38+
has_abi_tests: bool,
39+
) -> Result<()> {
3340
if !split_build_rs {
3441
general::start_comments(w, &env.config)?;
3542
writeln!(w)?;
3643
}
44+
3745
writeln!(
3846
w,
3947
"{}",
@@ -55,13 +63,61 @@ fn main() {} // prevent linking libraries to avoid documentation failure
5563
5664
#[cfg(not(feature = "dox"))]
5765
fn main() {
58-
if let Err(s) = system_deps::Config::new().probe() {
66+
let deps = system_deps::Config::new().probe();
67+
if let Err(s) = deps {
5968
println!("cargo:warning={}", s);
6069
process::exit(1);
70+
}"##
71+
)?;
72+
73+
if has_abi_tests {
74+
let ns = env.library.namespace(MAIN_NAMESPACE);
75+
let package_name = ns.package_name.as_ref().expect("Missing package name");
76+
let lib_name = nameutil::crate_name(package_name);
77+
78+
write!(
79+
w,
80+
"{}",
81+
r##"
82+
83+
#[cfg(feature = "abi-tests")]
84+
{
85+
let deps = deps.unwrap();
86+
"##
87+
)?;
88+
89+
write!(
90+
w,
91+
" let includes = deps.get(\"{}\").unwrap().include_paths.clone();",
92+
lib_name
93+
)?;
94+
95+
write!(
96+
w,
97+
"{}",
98+
r##"
99+
100+
let mut cc = cc::Build::new();
101+
102+
cc.flag_if_supported("-Wno-deprecated-declarations");
103+
cc.flag_if_supported("/std:c11"); // for _Generic
104+
cc.flag_if_supported("-std=c11"); // for _Generic
105+
106+
cc.file("tests/constant.c");
107+
cc.file("tests/layout.c");
108+
109+
for i in includes {
110+
cc.include(i);
111+
}
112+
113+
cc.compile("cabitests");
114+
}
61115
}
62-
}
63116
"##
64-
)
117+
)
118+
} else {
119+
writeln!(w, "}}")
120+
}
65121
}
66122

67123
fn generate_build_version(w: &mut dyn Write, env: &Env) -> Result<()> {

src/codegen/sys/cargo_toml.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,13 @@ fn fill_in(root: &mut Table, env: &Env) {
8383

8484
{
8585
let build_deps = upsert_table(root, "build-dependencies");
86+
set_string(build_deps, "cc", "1.0.0");
8687
set_string(build_deps, "system-deps", "2.0");
8788
}
8889

8990
{
9091
let dev_deps = upsert_table(root, "dev-dependencies");
9192
set_string(dev_deps, "shell-words", "1.0.0");
92-
set_string(dev_deps, "tempfile", "3");
93-
unset(dev_deps, "tempdir");
9493
}
9594

9695
{
@@ -115,6 +114,7 @@ fn fill_in(root: &mut Table, env: &Env) {
115114
.collect(),
116115
),
117116
);
117+
features.insert("abi-tests".to_string(), Value::Array(Vec::new()));
118118
}
119119

120120
{

src/codegen/sys/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ mod tests;
1313
pub fn generate(env: &Env) {
1414
generate_single_version_file(env);
1515
lib_::generate(env);
16-
build::generate(env);
1716
let crate_name = cargo_toml::generate(env);
18-
tests::generate(env, &crate_name);
17+
let has_abi_tests = tests::generate(env, &crate_name);
18+
build::generate(env, has_abi_tests);
1919
}
2020

2121
pub fn collect_versions(env: &Env) -> BTreeMap<Version, Version> {

0 commit comments

Comments
 (0)