Compare commits

...

2 Commits

Author SHA1 Message Date
07b0403e9b Make exit code propagate 2025-08-17 17:48:40 +03:00
28934ea6fc Add run-subcommand 2025-08-17 17:44:44 +03:00
2 changed files with 49 additions and 8 deletions

View File

@ -104,3 +104,15 @@ fn find_objectfile(name: &str) -> String {
.unwrap() .unwrap()
.to_owned() .to_owned()
} }
pub fn execute(path: &PathBuf) -> Option<i32> {
let output = Command::new(path.clone()).output().expect("Unable to execute {path}");
if !output.status.success() {
let code = output.status.code().unwrap_or(255);
log::error!("{path:?} exited with code {code}");
println!("{}", unsafe { String::from_utf8_unchecked(output.stderr) });
}
output.status.code()
}

View File

@ -1,8 +1,12 @@
use std::{fs, path::PathBuf}; use std::{fs, path::PathBuf, process};
use argh::FromArgs; use argh::FromArgs;
use log::*; use log::*;
use reid::{compile_simple, ld::LDRunner, CustomIRs}; use reid::{
compile_simple,
ld::{execute, LDRunner},
CustomIRs,
};
use reid_lib::compile::CompileOutput; use reid_lib::compile::CompileOutput;
#[derive(FromArgs, PartialEq, Debug)] #[derive(FromArgs, PartialEq, Debug)]
@ -23,6 +27,7 @@ struct Options {
#[argh(subcommand)] #[argh(subcommand)]
enum Command { enum Command {
Build(BuildOpts), Build(BuildOpts),
Run(RunOpts),
} }
#[derive(FromArgs, PartialEq, Debug)] #[derive(FromArgs, PartialEq, Debug)]
@ -36,6 +41,17 @@ struct BuildOpts {
path: PathBuf, path: PathBuf,
} }
#[derive(FromArgs, PartialEq, Debug)]
/// Build and then execute the executable
#[argh(subcommand, name = "run")]
struct RunOpts {
#[argh(option, long = "lib", short = 'l')]
/// additional libraries to link against (with ld)
libraries: Vec<String>,
#[argh(positional)]
path: PathBuf,
}
fn main() { fn main() {
let options: Options = argh::from_env(); let options: Options = argh::from_env();
let mut errlog = stderrlog::new(); let mut errlog = stderrlog::new();
@ -45,12 +61,12 @@ fn main() {
} }
errlog.init().unwrap(); errlog.init().unwrap();
match options.command { match &options.command {
Command::Build(build) => { Command::Build(BuildOpts { libraries, path }) | Command::Run(RunOpts { libraries, path }) => {
let cpu = std::env::var("CPU").unwrap_or("generic".to_owned()); let cpu = std::env::var("CPU").unwrap_or("generic".to_owned());
let features = std::env::var("REIDFLAGS").unwrap_or("".to_owned()); let features = std::env::var("REIDFLAGS").unwrap_or("".to_owned());
let path = match build.path.canonicalize() { let path = match path.canonicalize() {
Ok(path) => path, Ok(path) => path,
Err(e) => { Err(e) => {
error!("{e}"); error!("{e}");
@ -64,6 +80,7 @@ fn main() {
let llir_path = parent.with_extension("llir"); let llir_path = parent.with_extension("llir");
let mir_path = parent.with_extension("mir"); let mir_path = parent.with_extension("mir");
let asm_path = parent.with_extension("asm"); let asm_path = parent.with_extension("asm");
let out_path = object_path.with_extension("out");
let before = std::time::SystemTime::now(); let before = std::time::SystemTime::now();
@ -108,13 +125,25 @@ fn main() {
let linker = std::env::var("LD").unwrap_or("ld".to_owned()); let linker = std::env::var("LD").unwrap_or("ld".to_owned());
let mut linker = LDRunner::from_command(&linker).with_library("c").with_library("m"); let mut linker = LDRunner::from_command(&linker).with_library("c").with_library("m");
for library in build.libraries { for library in libraries {
linker = linker.with_library(&library); linker = linker.with_library(&library);
} }
linker.invoke(&object_path, &object_path.with_extension("out")); linker.invoke(&object_path, &out_path);
}
Err(e) => {
log::error!("{e}");
return;
} }
Err(e) => panic!("{}", e),
}; };
match &options.command {
Command::Build(_) => {}
Command::Run(_) => {
if let Some(code) = execute(&out_path) {
process::exit(code);
}
}
}
} }
} }
} }