mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-28 19:46:01 +00:00
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
use std::ffi::OsStr;
|
|
use std::path::Path;
|
|
|
|
use crate::utils::run_command_with_output;
|
|
|
|
fn show_usage() {
|
|
println!(
|
|
r#"
|
|
`abi-test` command help:
|
|
--help : Show this help"#
|
|
);
|
|
}
|
|
|
|
pub fn run() -> Result<(), String> {
|
|
let mut args = std::env::args().skip(2);
|
|
// FractalFir: In the future, I'd like to add some more subcommands / options.
|
|
// So, this loop ought to stay for that purpose. It should also stay as a while loop(to parse args)
|
|
#[allow(clippy::never_loop, clippy::while_let_on_iterator)]
|
|
while let Some(arg) = args.next() {
|
|
match arg.as_str() {
|
|
"--help" => {
|
|
show_usage();
|
|
return Ok(());
|
|
}
|
|
_ => return Err(format!("Unknown option {arg:?}")),
|
|
}
|
|
}
|
|
// Ensure that we have a cloned version of abi-cafe on hand.
|
|
crate::utils::git_clone(
|
|
"https://github.com/Gankra/abi-cafe.git",
|
|
Some("clones/abi-cafe".as_ref()),
|
|
true,
|
|
)
|
|
.map_err(|err| (format!("Git clone failed with message: {err:?}!")))?;
|
|
// Configure abi-cafe to use the exact same rustc version we use - this is crucial.
|
|
// Otherwise, the concept of ABI compatibility becomes meanignless.
|
|
std::fs::copy("rust-toolchain", "clones/abi-cafe/rust-toolchain")
|
|
.expect("Could not copy toolchain configs!");
|
|
// Get the backend path.
|
|
// We will use the *debug* build of the backend - it has more checks enabled.
|
|
let backend_path = std::path::absolute("target/debug/librustc_codegen_gcc.so").unwrap();
|
|
let backend_arg = format!("--add-rustc-codegen-backend=cg_gcc:{}", backend_path.display());
|
|
// Run ABI cafe using cargo.
|
|
let cmd: &[&dyn AsRef<OsStr>] = &[
|
|
&"cargo",
|
|
&"run",
|
|
&"--release",
|
|
&"--",
|
|
&backend_arg,
|
|
// Test rust-LLVM to Rust-GCC calls
|
|
&"--pairs",
|
|
&"rustc_calls_cg_gcc",
|
|
&"--pairs",
|
|
&"cg_gcc_calls_rustc",
|
|
// Test Rust-GCC to C calls
|
|
&"--pairs",
|
|
&"cg_gcc_calls_c",
|
|
&"--pairs",
|
|
&"c_calls_cg_gcc",
|
|
];
|
|
// Run ABI cafe.
|
|
run_command_with_output(cmd, Some(Path::new("clones/abi-cafe")))?;
|
|
|
|
Ok(())
|
|
}
|