use std::{path::PathBuf, sync::Arc};
use serde::{Deserialize, Serialize};
use strum::EnumString;
#[derive(
Clone,
Copy,
Debug,
Default,
Eq,
PartialEq,
Hash,
Serialize,
Deserialize,
clap::ValueEnum,
EnumString,
)]
pub enum BuildTarget {
#[default]
#[serde(rename = "fuel")]
#[clap(name = "fuel")]
#[strum(serialize = "fuel")]
Fuel,
#[serde(rename = "evm")]
#[clap(name = "evm")]
#[strum(serialize = "evm")]
EVM,
#[serde(rename = "midenvm")]
#[clap(name = "midenvm")]
#[strum(serialize = "midenvm")]
MidenVM,
}
#[derive(Clone)]
pub struct BuildConfig {
pub(crate) build_target: BuildTarget,
pub(crate) canonical_root_module: Arc<PathBuf>,
pub(crate) print_dca_graph: Option<String>,
pub(crate) print_dca_graph_url_format: Option<String>,
pub(crate) print_intermediate_asm: bool,
pub(crate) print_finalized_asm: bool,
pub(crate) print_ir: bool,
pub(crate) include_tests: bool,
pub time_phases: bool,
pub metrics_outfile: Option<String>,
}
impl BuildConfig {
pub fn root_from_file_name_and_manifest_path(
root_module: PathBuf,
canonical_manifest_dir: PathBuf,
build_target: BuildTarget,
) -> Self {
assert!(
canonical_manifest_dir.has_root(),
"manifest dir must be a canonical path",
);
let canonical_root_module = match root_module.has_root() {
true => root_module,
false => {
assert!(
root_module.starts_with(canonical_manifest_dir.file_stem().unwrap()),
"file_name must be either absolute or relative to manifest directory",
);
canonical_manifest_dir
.parent()
.expect("unable to retrieve manifest directory parent")
.join(&root_module)
}
};
Self {
build_target,
canonical_root_module: Arc::new(canonical_root_module),
print_dca_graph: None,
print_dca_graph_url_format: None,
print_intermediate_asm: false,
print_finalized_asm: false,
print_ir: false,
include_tests: false,
time_phases: false,
metrics_outfile: None,
}
}
pub fn print_dca_graph(self, a: Option<String>) -> Self {
Self {
print_dca_graph: a,
..self
}
}
pub fn print_dca_graph_url_format(self, a: Option<String>) -> Self {
Self {
print_dca_graph_url_format: a,
..self
}
}
pub fn print_intermediate_asm(self, a: bool) -> Self {
Self {
print_intermediate_asm: a,
..self
}
}
pub fn print_finalized_asm(self, a: bool) -> Self {
Self {
print_finalized_asm: a,
..self
}
}
pub fn print_ir(self, a: bool) -> Self {
Self {
print_ir: a,
..self
}
}
pub fn time_phases(self, a: bool) -> Self {
Self {
time_phases: a,
..self
}
}
pub fn metrics(self, a: Option<String>) -> Self {
Self {
metrics_outfile: a,
..self
}
}
pub fn include_tests(self, include_tests: bool) -> Self {
Self {
include_tests,
..self
}
}
pub fn canonical_root_module(&self) -> Arc<PathBuf> {
self.canonical_root_module.clone()
}
}