impl MakefileCompressor {
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new() -> Self {
let mut critical_targets = HashSet::new();
critical_targets.insert("all");
critical_targets.insert("build");
critical_targets.insert("test");
critical_targets.insert("install");
critical_targets.insert("clean");
critical_targets.insert("release");
critical_targets.insert("fmt");
critical_targets.insert("format");
critical_targets.insert("lint");
critical_targets.insert("check");
critical_targets.insert("coverage");
critical_targets.insert("docs");
critical_targets.insert("deploy");
critical_targets.insert("run");
critical_targets.insert("serve");
critical_targets.insert("dev");
critical_targets.insert("prod");
critical_targets.insert("dist");
critical_targets.insert("package");
let mut critical_vars = HashSet::new();
critical_vars.insert("PROJECT_NAME");
critical_vars.insert("VERSION");
critical_vars.insert("CC");
critical_vars.insert("CXX");
critical_vars.insert("CARGO");
critical_vars.insert("RUSTC");
critical_vars.insert("PYTHON");
critical_vars.insert("NODE");
critical_vars.insert("NPM");
critical_vars.insert("DOCKER");
critical_vars.insert("KUBECTL");
critical_vars.insert("CFLAGS");
critical_vars.insert("LDFLAGS");
critical_vars.insert("TARGET");
critical_vars.insert("ARCH");
critical_vars.insert("OS");
Self {
critical_targets,
critical_vars,
var_pattern: Regex::new(r"^([A-Z_][A-Z0-9_]*)\s*[:?]?=").expect("Invalid regex"),
target_pattern: Regex::new(r"^([a-zA-Z0-9_\-\.]+):").expect("Invalid regex"),
}
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn compress(&self, content: &str) -> CompressedMakefile {
let mut result = CompressedMakefile::default();
for line in content.lines() {
let trimmed = line.trim();
if let Some(caps) = self.var_pattern.captures(trimmed) {
if let Some(var_name_match) = caps.get(1) {
let var_name = var_name_match.as_str();
if self.critical_vars.contains(var_name) || var_name.starts_with("PROJECT_") {
result.variables.push(line.to_string());
}
}
}
}
let targets = self.parse_targets(content);
for (name, target) in targets {
if self.is_critical_target(&name) {
result.targets.push(MakeTarget {
name: name.clone(),
deps: target.dependencies,
recipe_summary: self.summarize_recipe(&target.recipe),
});
}
}
result.detected_toolchain = self.detect_toolchain(content, &result.targets);
result.key_dependencies = self.extract_dependencies(content);
debug!(
"Compressed Makefile: {} variables, {} targets",
result.variables.len(),
result.targets.len()
);
result
}
fn is_critical_target(&self, name: &str) -> bool {
self.critical_targets.contains(name)
|| name.starts_with("docker")
|| name.starts_with("test-")
|| name.starts_with("build-")
|| name.contains("deploy")
|| name.contains("install")
}
}