forked from openvm-org/openvm
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuild-elfs.rs
More file actions
101 lines (84 loc) · 2.79 KB
/
Copy pathbuild-elfs.rs
File metadata and controls
101 lines (84 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use std::fs;
use clap::{arg, Parser};
use eyre::Result;
use openvm_benchmarks_utils::{build_elf_with_path, get_elf_path_with_pkg, get_programs_dir};
use openvm_build::get_package;
use tracing_subscriber::{fmt, EnvFilter};
#[derive(Parser)]
#[command(author, version, about = "Build OpenVM benchmark programs")]
struct Cli {
/// Force rebuild even if the output ELF already exists
#[arg(short, long)]
force: bool,
/// Specific program directories to build (builds all if not specified)
#[arg(value_name = "PROGRAM")]
programs: Vec<String>,
/// Programs to skip
#[arg(long, value_name = "PROGRAM")]
skip: Vec<String>,
/// Build profile (debug or release)
#[arg(short, long, default_value = "release")]
profile: String,
/// Enable verbose output
#[arg(short, long)]
verbose: bool,
}
fn main() -> Result<()> {
let cli = Cli::parse();
// Set up logging
let filter = if cli.verbose {
EnvFilter::from_default_env()
} else {
EnvFilter::new("info")
};
fmt::fmt().with_env_filter(filter).init();
let programs_dir = get_programs_dir();
tracing::info!("Building programs from {}", programs_dir.display());
// Collect all available program directories
let available_programs = fs::read_dir(&programs_dir)?
.filter_map(|entry| {
let entry = entry.ok()?;
let path = entry.path();
if path.is_dir() {
let dir_name = path.file_name()?.to_str()?.to_string();
Some((dir_name, path))
} else {
None
}
})
.collect::<Vec<_>>();
// Filter programs if specific ones were requested
let programs_to_build = if cli.programs.is_empty() {
available_programs
} else {
available_programs
.into_iter()
.filter(|(name, _)| cli.programs.contains(name))
.collect()
};
// Filter out skipped programs
let programs_to_build = programs_to_build
.into_iter()
.filter(|(name, _)| !cli.skip.contains(name))
.collect::<Vec<_>>();
if programs_to_build.is_empty() {
tracing::warn!("No matching programs found to build");
return Ok(());
}
// Build each selected program
for (dir_name, path) in programs_to_build {
let pkg = get_package(&path);
let elf_path = get_elf_path_with_pkg(&path, &pkg);
if cli.force || !elf_path.exists() {
tracing::info!("Building: {}", dir_name);
build_elf_with_path(&pkg, &cli.profile, Some(&elf_path))?;
} else {
tracing::info!(
"Skipping existing build: {} (use --force to rebuild)",
dir_name
);
}
}
tracing::info!("Build complete");
Ok(())
}