diff --git a/repbuild/src/dev.rs b/repbuild/src/dev.rs index f93edd158..91c464477 100644 --- a/repbuild/src/dev.rs +++ b/repbuild/src/dev.rs @@ -62,12 +62,11 @@ impl Package { build_cmd, } } - pub fn build(&self) -> std::io::Result<()> { + pub fn build(&self, out: &mut Vec) -> std::io::Result<()> { if self.binaries.contains(&"hblang".to_string()) { let file = self.build_cmd.split_ascii_whitespace().last().unwrap(); let path = format!("sysdata/programs/{}/{}", self.name, file); - let mut bytes = Vec::new(); // compile here hblang::run_compiler( @@ -76,15 +75,7 @@ impl Package { fmt: true, ..Default::default() }, - &mut bytes, - )?; - - hblang::run_compiler( - &path, - Options { - ..Default::default() - }, - &mut bytes, + out, )?; match std::fs::create_dir("target/programs") { @@ -92,17 +83,27 @@ impl Package { Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => (), Err(e) => panic!("{}", e), } - std::fs::write(format!("target/programs/{}.hbf", self.name), &bytes).unwrap(); - bytes.clear(); + + hblang::run_compiler( + &path, + Options { + ..Default::default() + }, + out, + )?; + std::fs::write(format!("target/programs/{}.hbf", self.name), &out)?; + out.clear(); + hblang::run_compiler( &path, Options { dump_asm: true, ..Default::default() }, - &mut bytes, + out, )?; - std::fs::write(format!("target/programs/{}.hba", self.name), &bytes).unwrap(); + std::fs::write(format!("target/programs/{}.hba", self.name), &out)?; + out.clear(); } Ok(()) } diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs index 19f2d3810..898d1f744 100644 --- a/repbuild/src/main.rs +++ b/repbuild/src/main.rs @@ -1,6 +1,7 @@ mod dev; use { + core::fmt::Write as _, derive_more::Display, dev::Package, error_stack::{bail, report, Context, Report, Result, ResultExt}, @@ -204,6 +205,9 @@ TERM_BACKDROP={} let modules = value.get_mut("modules").unwrap().as_table_mut().unwrap(); // let mut real_modules = modules.clone(); + let mut errors = String::new(); + let mut out = Vec::new(); + modules .into_iter() .map(|(_, value)| -> Result<(), io::Error> { @@ -218,11 +222,26 @@ TERM_BACKDROP={} let p = Package::load_from_file( format!("sysdata/programs/{}/meta.toml", path).to_owned(), ); - p.build()?; + match p.build(&mut out) { + Ok(()) => {} + Err(_) => { + writeln!(errors, "========= while compiling {} =========", path) + .unwrap(); + errors.push_str(core::str::from_utf8(&out).expect("no")); + out.clear(); + } + } } Ok(()) }) .for_each(drop); + + if !errors.is_empty() { + writeln!(errors, "!!! STOPPING DUE TO PREVIOUS ERRORS !!!"); + std::eprint!("{errors}"); + continue; + } + modules.into_iter().for_each(|(_key, value)| { if value.is_table() { let path = value.get("path").expect("You must have `path` as a value"); diff --git a/sysdata/programs/render_example/src/examples/text.hb b/sysdata/programs/render_example/src/examples/text.hb index 71b4d50d5..2f2c29936 100644 --- a/sysdata/programs/render_example/src/examples/text.hb +++ b/sysdata/programs/render_example/src/examples/text.hb @@ -148,4 +148,4 @@ draw_screen := fn(screen: render.Surface, window: render.Surface): void { render.clear(screen, render.light_blue) render.put_surface(screen, window, .(100, 100), false) render.sync(screen) -} \ No newline at end of file +}