use parol::parol_runtime::Report;
use parol::{ParolErrorReporter, build::Builder};
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};
use std::{env, process};
fn get_git_version_with_timestamp() -> String {
let output = Command::new("git")
.args(["describe", "--tags", "--always", "--dirty"])
.output();
let base_version = match output {
Ok(o) if o.status.success() => String::from_utf8_lossy(&o.stdout).trim().to_string(),
_ => "unknown".to_string(),
};
if base_version.ends_with("-dirty") {
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs().to_string())
.unwrap_or_else(|_| "0".to_string());
format!("{}-{}", base_version, timestamp)
} else {
base_version
}
}
fn main() {
let git_version = get_git_version_with_timestamp();
let out_dir = env::var("OUT_DIR").unwrap_or_else(|_| ".".to_string());
let marker_file = format!("{}/git_version.txt", out_dir);
let needs_update = std::fs::read_to_string(&marker_file)
.map(|s| s.trim() != git_version)
.unwrap_or(true);
if needs_update {
std::fs::write(&marker_file, &git_version).ok();
}
println!("cargo:rerun-if-changed={}", marker_file);
println!("cargo:rustc-env=RUMOCA_GIT_VERSION={}", git_version);
println!("cargo:rerun-if-changed=src/modelica_grammar/modelica.par");
let rebuild = env::var_os("CARGO_FEATURE_REGEN_PARSER").is_some();
if !rebuild {
return;
}
println!("cargo:warning=Regenerating parser (triggered by feature=regen-parser)");
if let Err(err) = Builder::with_explicit_output_dir("src/modelica_grammar/generated")
.grammar_file("src/modelica_grammar/modelica.par")
.expanded_grammar_output_file("modelica-exp.par")
.parser_output_file("modelica_parser.rs")
.actions_output_file("modelica_grammar_trait.rs")
.user_type_name("ModelicaGrammar")
.user_trait_module_name("modelica_grammar")
.trim_parse_tree()
.minimize_boxed_types()
.generate_parser()
{
ParolErrorReporter::report_error(&err, "src/modelica_grammar/modelica.par")
.unwrap_or_default();
process::exit(1);
}
}