Skip to content

Commit 4bcac80

Browse files
committed
Tools for calling GCC
1 parent 5b38e7c commit 4bcac80

4 files changed

Lines changed: 48 additions & 4 deletions

File tree

rust_src/driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub fn driver_main(args: &arg_parser::Cli) -> Result<(), Error> {
2727
/// notcc main driver function taking CLI args and parsing them
2828
///
2929
/// **Note**: Unless you're writing a CLI application, you should use `driver_main` instead
30-
pub fn driver_main_cli(args: &mut env::Args) -> Result<(), Error> {
30+
pub fn driver_main_cli(args: impl Iterator<Item = String>) -> Result<(), Error> {
3131
let args: arg_parser::ArgVec = args.collect();
3232
let cli = arg_parser::parse_arguments(args)?;
3333
driver_main(&cli)

rust_src/driver/system_cc.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,55 @@
33
//! The system C compiler is used for preprocessing and final assembly
44
55
use crate::error::Error;
6+
use std::ffi::OsStr;
7+
use std::process::Command;
68

9+
fn run_cc<I, S>(args: I, cc_name: Option<&str>) -> Result<std::process::Output, Error>
10+
where
11+
I: IntoIterator<Item = S>,
12+
S: AsRef<OsStr>,
13+
{
14+
let cc_name = cc_name.unwrap_or("gcc");
15+
let res = Command::new(cc_name).args(args).output();
16+
let res = match res {
17+
Err(e) => return Err(format!("Error launching {cc_name}: {e}")),
18+
Ok(r) => r,
19+
};
20+
if !res.status.success() {
21+
let stderr = String::from_utf8_lossy(&res.stderr);
22+
return Err(stderr.into_owned());
23+
}
24+
Ok(res)
25+
}
726
pub fn preprocess_file(file_name: &str, output_file_name: &str) -> Result<(), Error> {
27+
run_cc(["-E", "-P", file_name, "-o", output_file_name], None)?;
828
Ok(())
929
}
1030

1131
pub fn assemble_output(asm_file: &str, output_exe: &str) -> Result<(), Error> {
32+
run_cc([asm_file, "-o", output_exe], None)?;
1233
Ok(())
1334
}
35+
36+
#[cfg(test)]
37+
mod tests {
38+
use super::*;
39+
40+
#[test]
41+
fn fail_run_cc() {
42+
let args: [&str; 0] = [];
43+
assert!(run_cc(args, Some("bogus_cc_name")).is_err())
44+
}
45+
46+
#[test]
47+
fn preprocess_negative() {
48+
assert!(preprocess_file("bogus_input_file.c", "bogus_input_file.i").is_err());
49+
}
50+
51+
#[test]
52+
fn assemble_negative() {
53+
assert!(assemble_output("bogus_input_file.c", "bogus_input_file.i").is_err());
54+
}
55+
56+
// TODO add some positive tests. Look at the tempfile crate
57+
}

rust_src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![doc = include_str!("README.md")]
2-
mod driver;
32
pub mod error;
43

54
pub use driver::{arg_parser::Cli, driver_main, driver_main_cli};
5+
6+
mod driver;

rust_src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use notcc;
33
use std::env;
44
use std::process;
55
fn main() {
6-
// TODO why mut?
7-
let res = notcc::driver_main_cli(&mut env::args());
6+
let res = notcc::driver_main_cli(env::args());
87
if let Err(s) = res {
98
eprintln!("Error: {s}");
109
process::exit(1);

0 commit comments

Comments
 (0)