diff --git a/src/lib.rs b/src/lib.rs index b6900e01..87294ccc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -173,7 +173,7 @@ pub fn run_book( // cancel the run if a problem is detected. eprint!("{diagnostics}"); - let out = run_hvm(&core_book, cmd)?; + let out = run_hvm(&core_book, cmd, &run_opts)?; let (net, stats) = parse_hvm_output(&out)?; let (term, diags) = readback_hvm_net(&net, &book, &labels, run_opts.linear_readback, compile_opts.adt_encoding); @@ -198,7 +198,7 @@ pub fn readback_hvm_net( } /// Runs an HVM book by invoking HVM as a subprocess. -fn run_hvm(book: &::hvm::ast::Book, cmd: &str) -> Result { +fn run_hvm(book: &::hvm::ast::Book, cmd: &str, run_opts: &RunOpts) -> Result { fn filter_hvm_output( mut stream: impl std::io::Read + Send, mut output: impl std::io::Write + Send, @@ -247,7 +247,7 @@ fn run_hvm(book: &::hvm::ast::Book, cmd: &str) -> Result { let out_path = ".out.hvm"; std::fs::write(out_path, display_hvm_book(book).to_string()).map_err(|x| x.to_string())?; - let mut process = std::process::Command::new("hvm") + let mut process = std::process::Command::new(run_opts.hvm_path.clone()) .arg(cmd) .arg(out_path) .stdout(std::process::Stdio::piped()) @@ -281,10 +281,17 @@ fn parse_hvm_output(out: &str) -> Result<(::hvm::ast::Net, String), String> { Ok((net, stats.to_string())) } -#[derive(Clone, Copy, Debug, Default)] +#[derive(Clone, Debug)] pub struct RunOpts { pub linear_readback: bool, pub pretty: bool, + pub hvm_path: String, +} + +impl Default for RunOpts { + fn default() -> Self { + RunOpts { linear_readback: false, pretty: false, hvm_path: "hvm".to_string() } + } } #[derive(Clone, Copy, Debug, Default)] diff --git a/src/main.rs b/src/main.rs index 35d61b64..dd341195 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,6 +20,9 @@ struct Cli { #[arg(short, long, global = true)] pub verbose: bool, + #[arg(long, global = true, default_value = "hvm", help = "Path to hvm binary")] + pub hvm_path: String, + #[arg(short = 'e', long, global = true, help = "Use other entrypoint rather than main or Main")] pub entrypoint: Option, } @@ -303,7 +306,7 @@ fn execute_cli_mode(mut cli: Cli) -> Result<(), Diagnostics> { .map_err(|x| x.to_string())?; let gen_fn = |out_path: &str| { - let mut process = std::process::Command::new("hvm"); + let mut process = std::process::Command::new(cli.hvm_path); process.arg(gen_cmd).arg(out_path); process.output().map_err(|e| format!("While running hvm: {e}")) }; @@ -350,7 +353,7 @@ fn execute_cli_mode(mut cli: Cli) -> Result<(), Diagnostics> { compile_opts.check_for_strict(); - let run_opts = RunOpts { linear_readback: linear, pretty }; + let run_opts = RunOpts { linear_readback: linear, pretty, hvm_path: cli.hvm_path }; let book = load_book(&path)?; if let Some((term, stats, diags)) = diff --git a/tests/golden_tests.rs b/tests/golden_tests.rs index 101caac3..4ef815c9 100644 --- a/tests/golden_tests.rs +++ b/tests/golden_tests.rs @@ -175,7 +175,8 @@ fn run_file() { for adt_encoding in [AdtEncoding::NumScott, AdtEncoding::Scott] { let compile_opts = CompileOpts { adt_encoding, ..CompileOpts::default() }; - let (term, _, diags) = run_book_simple(book.clone(), run_opts, compile_opts, diagnostics_cfg, None)?; + let (term, _, diags) = + run_book_simple(book.clone(), run_opts.clone(), compile_opts, diagnostics_cfg, None)?; res.push_str(&format!("{adt_encoding}:\n{diags}{term}\n\n")); } Ok(res)