Skip to content

Commit 704b17c

Browse files
committed
tool: take directory path instead of name prefix in --viper-output
Signed-off-by: Zoltan A. Kocsis <11808286+zaklogician@users.noreply.github.com>
1 parent 0027e70 commit 704b17c

2 files changed

Lines changed: 24 additions & 13 deletions

File tree

tool/microkit/src/argparse.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub fn print_help(sdk: &Sdk) {
2929
);
3030
println!(" --config CONFIG");
3131
println!(" --capdl-json CAPDL_SPEC (JSON format)");
32-
println!(" --viper-output PREFIX");
32+
println!(" --viper-output DIRECTORY_PATH");
3333
println!(" --search-path [SEARCH_PATH ...]");
3434
}
3535

@@ -70,7 +70,7 @@ pub struct Args {
7070
pub config: String,
7171
pub report_path: PathBuf,
7272
pub capdl_json_path: Option<PathBuf>,
73-
pub viper_output_prefix: Option<String>,
73+
pub viper_output_dir: Option<PathBuf>,
7474
pub output_path: PathBuf,
7575
pub search_paths: Vec<PathBuf>,
7676
pub requested_image_type: RequestedImageType,
@@ -169,7 +169,7 @@ impl Args {
169169
let mut output_path = PathBuf::from("loader.img");
170170
let mut report_path = PathBuf::from("report.txt");
171171
let mut capdl_json_path = None;
172-
let mut viper_output_prefix = None;
172+
let mut viper_output_dir = None;
173173
let mut search_paths = Vec::new();
174174

175175
let mut sdf_path = None;
@@ -209,7 +209,7 @@ impl Args {
209209
search_paths.extend(params.into_iter().map(PathBuf::from));
210210
}
211211
"--viper-output" => {
212-
viper_output_prefix = Some(consume_parameter(&mut args, "--viper-output")?);
212+
viper_output_dir = Some(consume_parameter(&mut args, "--viper-output")?.into());
213213
}
214214
"--image-type" => {
215215
let value = consume_parameter(&mut args, "--image-type")?;
@@ -268,7 +268,7 @@ impl Args {
268268
config,
269269
report_path,
270270
capdl_json_path,
271-
viper_output_prefix,
271+
viper_output_dir,
272272
output_path,
273273
search_paths,
274274
requested_image_type,

tool/microkit/src/main.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use microkit_tool::viper;
3333
use microkit_tool::{DisjointMemoryRegion, MemoryRegion};
3434
use std::collections::HashMap;
3535
use std::fs::{self, metadata};
36-
use std::path::{Path, PathBuf};
36+
use std::path::{Path};
3737

3838
const MAX_BUILD_ITERATION: usize = 3;
3939

@@ -695,7 +695,15 @@ fn main() -> Result<(), String> {
695695
fs::write(capdl_json, &serialised).unwrap();
696696
};
697697

698-
if let Some(viper_output_prefix) = args.viper_output_prefix {
698+
if let Some(viper_output_dir) = args.viper_output_dir {
699+
// NB returns Ok if the directory already exists, that's fine
700+
fs::create_dir_all(&viper_output_dir).unwrap_or_else(|source| {
701+
eprintln!(
702+
"ERROR: cannot write Viper output directory {}: {source}",
703+
&viper_output_dir.display()
704+
);
705+
std::process::exit(1);
706+
});
699707
for view in viper::get_combined_views(&spec_container, &system) {
700708
let mut output =
701709
String::from(
@@ -706,13 +714,16 @@ fn main() -> Result<(), String> {
706714
)
707715
);
708716
view.export(&mut output);
709-
let path = PathBuf::from(format!("{}{}.vpr", viper_output_prefix, view.pd_name));
710-
// fs::write(&path, output).map_err(|source| {
711-
// MainError::CannotWriteFile { path, source }
712-
// .to_string()
713-
// })?;
714-
fs::write(&path, output).expect("TODO")
717+
let path = viper_output_dir.join(format!("{}.vpr", view.pd_name));
718+
fs::write(&path, output).unwrap_or_else(|source| {
719+
eprintln!(
720+
"ERROR: cannot write Viper output file {}: {source}",
721+
&path.display()
722+
);
723+
std::process::exit(1);
724+
});
715725
}
726+
716727
}
717728

718729
write_report(&spec_container, &kernel_config, &args.report_path);

0 commit comments

Comments
 (0)