Add run-subcommand
This commit is contained in:
		
							parent
							
								
									7dd06567bb
								
							
						
					
					
						commit
						28934ea6fc
					
				| @ -104,3 +104,14 @@ fn find_objectfile(name: &str) -> String { | ||||
|         .unwrap() | ||||
|         .to_owned() | ||||
| } | ||||
| 
 | ||||
| pub fn execute(path: &PathBuf) { | ||||
|     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) }); | ||||
|         return; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,11 @@ use std::{fs, path::PathBuf}; | ||||
| 
 | ||||
| use argh::FromArgs; | ||||
| use log::*; | ||||
| use reid::{compile_simple, ld::LDRunner, CustomIRs}; | ||||
| use reid::{ | ||||
|     compile_simple, | ||||
|     ld::{execute, LDRunner}, | ||||
|     CustomIRs, | ||||
| }; | ||||
| use reid_lib::compile::CompileOutput; | ||||
| 
 | ||||
| #[derive(FromArgs, PartialEq, Debug)] | ||||
| @ -23,6 +27,7 @@ struct Options { | ||||
| #[argh(subcommand)] | ||||
| enum Command { | ||||
|     Build(BuildOpts), | ||||
|     Run(RunOpts), | ||||
| } | ||||
| 
 | ||||
| #[derive(FromArgs, PartialEq, Debug)] | ||||
| @ -36,6 +41,17 @@ struct BuildOpts { | ||||
|     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() { | ||||
|     let options: Options = argh::from_env(); | ||||
|     let mut errlog = stderrlog::new(); | ||||
| @ -45,12 +61,12 @@ fn main() { | ||||
|     } | ||||
|     errlog.init().unwrap(); | ||||
| 
 | ||||
|     match options.command { | ||||
|         Command::Build(build) => { | ||||
|     match &options.command { | ||||
|         Command::Build(BuildOpts { libraries, path }) | Command::Run(RunOpts { libraries, path }) => { | ||||
|             let cpu = std::env::var("CPU").unwrap_or("generic".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, | ||||
|                 Err(e) => { | ||||
|                     error!("{e}"); | ||||
| @ -64,6 +80,7 @@ fn main() { | ||||
|             let llir_path = parent.with_extension("llir"); | ||||
|             let mir_path = parent.with_extension("mir"); | ||||
|             let asm_path = parent.with_extension("asm"); | ||||
|             let out_path = object_path.with_extension("out"); | ||||
| 
 | ||||
|             let before = std::time::SystemTime::now(); | ||||
| 
 | ||||
| @ -108,13 +125,23 @@ fn main() { | ||||
| 
 | ||||
|                     let linker = std::env::var("LD").unwrap_or("ld".to_owned()); | ||||
|                     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.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(_) => { | ||||
|                     execute(&out_path); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user