diff --git a/crates/cli_utils/src/helpers.rs b/crates/cli_utils/src/helpers.rs index bff855ef6e..0deb52d548 100644 --- a/crates/cli_utils/src/helpers.rs +++ b/crates/cli_utils/src/helpers.rs @@ -11,7 +11,6 @@ use std::env; use std::ffi::{OsStr, OsString}; use std::io::Read; use std::io::Write; -use std::path::Path; use std::path::PathBuf; use std::process::{Command, ExitStatus, Stdio}; use std::sync::Mutex; @@ -30,62 +29,7 @@ where I: IntoIterator, S: AsRef, { - let roc_binary_path = build_roc_bin_cached(); - - run_roc_with_stdin_and_env(&roc_binary_path, args, stdin_vals, extra_env) -} - -// If we don't already have a /target/release/roc, build it! -pub fn build_roc_bin_cached() -> PathBuf { - let roc_binary_path = path_to_roc_binary(); - - if !roc_binary_path.exists() { - build_roc_bin(&[]); - } - - roc_binary_path -} - -pub fn build_roc_bin(extra_args: &[&str]) -> PathBuf { - let roc_binary_path = path_to_roc_binary(); - - // Remove the /target/release/roc part - let root_project_dir = roc_binary_path - .parent() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap(); - - // cargo build --bin roc - // (with --release iff the test is being built with --release) - let mut args = if cfg!(debug_assertions) { - vec!["build", "--bin", "roc"] - } else { - vec!["build", "--release", "--bin", "roc"] - }; - - args.extend(extra_args); - - let mut cargo_cmd = cargo(); - - cargo_cmd.current_dir(root_project_dir).args(&args); - - let cargo_cmd_str = format!("{:?}", cargo_cmd); - - let cargo_output = cargo_cmd.output().unwrap(); - - if !cargo_output.status.success() { - panic!( - "The following cargo command failed:\n\n {}\n\n stdout was:\n\n {}\n\n stderr was:\n\n {}\n", - cargo_cmd_str, - String::from_utf8(cargo_output.stdout).unwrap(), - String::from_utf8(cargo_output.stderr).unwrap() - ); - } - - roc_binary_path + run_roc_with_stdin_and_env(args, stdin_vals, extra_env) } // Since glue is always compiling the same plugin, it can not be run in parallel. @@ -101,7 +45,7 @@ where { let _guard = GLUE_LOCK.lock().unwrap(); - run_roc_with_stdin(&path_to_roc_binary(), args, &[]) + run_roc_with_stdin(args, &[]) } pub fn has_error(stderr: &str) -> bool { @@ -170,16 +114,15 @@ pub fn strip_colors(str: &str) -> String { .replace(ANSI_STYLE_CODES.color_reset, "") } -pub fn run_roc_with_stdin(path: &Path, args: I, stdin_vals: &[&str]) -> Out +pub fn run_roc_with_stdin(args: I, stdin_vals: &[&str]) -> Out where I: IntoIterator, S: AsRef, { - run_roc_with_stdin_and_env(path, args, stdin_vals, &[]) + run_roc_with_stdin_and_env(args, stdin_vals, &[]) } pub fn run_roc_with_stdin_and_env( - roc_path: &Path, args: I, stdin_vals: &[&str], extra_env: &[(&str, &str)], @@ -188,6 +131,7 @@ where I: IntoIterator, S: AsRef, { + let roc_path = build_roc_bin_cached(); let mut roc_cmd = Command::new(roc_path); for arg in args { @@ -235,6 +179,59 @@ where } } +// If we don't already have a /target/release/roc, build it! +pub fn build_roc_bin_cached() -> PathBuf { + let roc_binary_path = path_to_roc_binary(); + + if !roc_binary_path.exists() { + build_roc_bin(&[]); + } + + roc_binary_path +} + +pub fn build_roc_bin(extra_args: &[&str]) -> PathBuf { + let roc_binary_path = path_to_roc_binary(); + + // Remove the /target/release/roc part + let root_project_dir = roc_binary_path + .parent() + .unwrap() + .parent() + .unwrap() + .parent() + .unwrap(); + + // cargo build --bin roc + // (with --release iff the test is being built with --release) + let mut args = if cfg!(debug_assertions) { + vec!["build", "--bin", "roc"] + } else { + vec!["build", "--release", "--bin", "roc"] + }; + + args.extend(extra_args); + + let mut cargo_cmd = cargo(); + + cargo_cmd.current_dir(root_project_dir).args(&args); + + let cargo_cmd_str = format!("{:?}", cargo_cmd); + + let cargo_output = cargo_cmd.output().unwrap(); + + if !cargo_output.status.success() { + panic!( + "The following cargo command failed:\n\n {}\n\n stdout was:\n\n {}\n\n stderr was:\n\n {}\n", + cargo_cmd_str, + String::from_utf8(cargo_output.stdout).unwrap(), + String::from_utf8(cargo_output.stderr).unwrap() + ); + } + + roc_binary_path +} + pub fn run_cmd<'a, I: IntoIterator, E: IntoIterator>( cmd_name: &str, stdin_vals: I,