| 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(()) | |
| } |