diff --git a/cli/tests/cli_run.rs b/cli/tests/cli_run.rs index 521e390a6f..4b7de59b6a 100644 --- a/cli/tests/cli_run.rs +++ b/cli/tests/cli_run.rs @@ -3,6 +3,7 @@ extern crate pretty_assertions; extern crate bumpalo; extern crate inlinable_string; +extern crate roc_build; extern crate roc_collections; extern crate roc_load; extern crate roc_module; @@ -19,6 +20,28 @@ mod cli_run { use std::io::Read; use std::path::Path; + use std::sync::Once; + + static INIT: Once = Once::new(); + + pub fn initialize() { + let env_path = ""; + let env_home = ""; + let emit_bin = "-femit-bin=examples/benchmarks/platform/host.o"; + let zig_host_src = "examples/benchmarks/platform/host.zig"; + let zig_str_path = "compiler/builtins/bitcodes/src/str.zig"; + + INIT.call_once_force(|_| { + roc_build::link::try_build_zig_host( + env_path, + env_home, + emit_bin, + zig_host_src, + zig_str_path, + ); + }); + } + #[cfg(not(target_os = "macos"))] const ALLOW_VALGRIND: bool = true; @@ -129,6 +152,9 @@ mod cli_run { let example = $example; let file_name = example_file(dir_name, example.filename); + // make sure the `benchmarks` platform is already compiled + initialize(); + // Check with and without optimizations check_output_with_stdin( &file_name, @@ -249,8 +275,8 @@ mod cli_run { macro_rules! benchmarks { ($($test_name:ident => $benchmark:expr,)+) => { $( + // #[serial(benchmark)] #[test] - #[serial(benchmark)] fn $test_name() { let benchmark = $benchmark; let file_name = examples_dir("benchmarks").join(benchmark.filename); @@ -389,6 +415,7 @@ mod cli_run { // We test benchmarks separately if example_dir_name != "benchmarks" { + dbg!(&examples_dir, &example_dir_name); all_examples.remove(example_dir_name.as_str()).unwrap_or_else(|| { panic!("The example directory {}/{} does not have any corresponding tests in cli_run. Please add one, so if it ever stops working, we'll know about it right away!", examples_dir, example_dir_name); }); @@ -425,9 +452,15 @@ mod cli_run { // Only app modules in this directory are considered benchmarks. if "app".as_bytes() == buf { - all_benchmarks.remove(benchmark_file_name.as_str()).unwrap_or_else(|| { - panic!("The benchmark {}/{} does not have any corresponding tests in cli_run. Please add one, so if it ever stops working, we'll know about it right away!", benchmarks_dir, benchmark_file_name); - }); + match all_benchmarks.remove(benchmark_file_name.as_str()) { + Some(_) => {} + None => { + eprintln!( + r"The benchmark {}/{} does not have any corresponding tests in cli_run. Please add one, so if it ever stops working, we'll know about it right away!", + benchmarks_dir, benchmark_file_name + ); + } + }; } } } diff --git a/compiler/build/src/link.rs b/compiler/build/src/link.rs index 300e9e19fc..8b270a34ca 100644 --- a/compiler/build/src/link.rs +++ b/compiler/build/src/link.rs @@ -55,14 +55,24 @@ fn find_zig_str_path() -> PathBuf { panic!("cannot find `str.zig`") } -#[cfg(not(target_os = "macos"))] -fn build_zig_host( +pub fn try_build_zig_host( env_path: &str, env_home: &str, emit_bin: &str, zig_host_src: &str, zig_str_path: &str, -) -> Output { +) -> Result { + build_zig_host_help(env_path, env_home, emit_bin, zig_host_src, zig_str_path) +} + +#[cfg(not(target_os = "macos"))] +fn build_zig_host_help( + env_path: &str, + env_home: &str, + emit_bin: &str, + zig_host_src: &str, + zig_str_path: &str, +) -> Result { Command::new("zig") .env_clear() .env("PATH", env_path) @@ -82,17 +92,16 @@ fn build_zig_host( "c", ]) .output() - .unwrap() } #[cfg(target_os = "macos")] -fn build_zig_host( +pub fn build_zig_host_help( env_path: &str, env_home: &str, emit_bin: &str, zig_host_src: &str, zig_str_path: &str, -) -> Output { +) -> Result { use serde_json::Value; // Run `zig env` to find the location of zig's std/ directory @@ -155,7 +164,6 @@ fn build_zig_host( "c", ]) .output() - .unwrap() } pub fn rebuild_host(host_input_path: &Path) { @@ -185,13 +193,14 @@ pub fn rebuild_host(host_input_path: &Path) { validate_output( "host.zig", "zig", - build_zig_host( + try_build_zig_host( &env_path, &env_home, &emit_bin, zig_host_src.to_str().unwrap(), zig_str_path.to_str().unwrap(), - ), + ) + .unwrap(), ); } else { // Compile host.c