use std::process::Command;
use glob::glob;
fn rm(p: &str) {
if std::path::Path::new(p).is_file() {
std::fs::remove_file(p).expect(&format!("Could not remove file: {}",p))
}
assert!( !std::path::Path::new(p).is_file() );
}
fn compile_compiler() {
rm("bootstrap");
rm("bootstrap.s");
rm("bootstrap.o");
rm("production");
rm("production.s");
rm("production.o");
let exit = Command::new("as")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("bootstrap.o")
.arg("BOOTSTRAP/cli.s")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("as error code: {}", stderr);
};
let exit = Command::new("ld")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("bootstrap")
.arg("bootstrap.o")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("ld error code: {}", stderr);
};
let exit = Command::new("./bootstrap")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("production.s")
.arg("--debug")
.arg("PRODUCTION/cli.lm")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("lm error code: {}", stderr);
};
let exit = Command::new("as")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("production.o")
.arg("production.s")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("as error code: {}", stderr);
};
let exit = Command::new("ld")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("production")
.arg("production.o")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("ld error code: {}", stderr);
};
}
fn run_unit(unit: &str) {
println!("Run unit test {}", unit);
let exit = Command::new("./production")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("unit.s")
.arg("--debug")
.arg(unit)
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("./production error code: {}", stderr);
};
let exit = Command::new("as")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("unit.o")
.arg("unit.s")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("as error code: {}", stderr);
};
let exit = Command::new("ld")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.arg("-o")
.arg("unit")
.arg("unit.o")
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("ld error code: {}", stderr);
};
let exit = Command::new("./unit")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.spawn()
.expect("failed to execute process")
.wait_with_output()
.expect("failed to wait for process");
if !exit.status.success() {
let stdout = String::from_utf8_lossy(&exit.stdout).to_string();
let stderr = String::from_utf8_lossy(&exit.stderr).to_string();
panic!("./unit error code:\n{}{}", stdout, stderr);
};
}