diff options
author | Melody Horn <melody@boringcactus.com> | 2024-11-11 17:15:08 -0700 |
---|---|---|
committer | Melody Horn <melody@boringcactus.com> | 2024-11-11 17:15:08 -0700 |
commit | 4f9299b4639802e05e1cb27d8eb40305ff8e110e (patch) | |
tree | 0da5529c68c82e97aed67d842e50f6285e79e6c2 /src/makefile/mod.rs | |
parent | fbbcf325b8bbe72f924da6a7cdb128d973ef0026 (diff) | |
download | makers-4f9299b4639802e05e1cb27d8eb40305ff8e110e.tar.gz makers-4f9299b4639802e05e1cb27d8eb40305ff8e110e.zip |
implement rule-specific macros for targets
Diffstat (limited to 'src/makefile/mod.rs')
-rw-r--r-- | src/makefile/mod.rs | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/src/makefile/mod.rs b/src/makefile/mod.rs index 9b2f626..4a0c5e3 100644 --- a/src/makefile/mod.rs +++ b/src/makefile/mod.rs @@ -8,7 +8,9 @@ use std::rc::Rc; use eyre::{bail, eyre, Result, WrapErr}; use command_line::CommandLine; -use inference_rules::InferenceRule; +#[cfg(feature = "full")] +use functions::NO_EVAL; +use inference_rules::{InferenceRule, InferenceRuleSet}; use input::FinishedMakefileReader; pub use input::MakefileReader; use lookup_internal::LookupInternal; @@ -19,8 +21,6 @@ use target::{DynamicTargetSet, Target}; use token::TokenString; use crate::args::Args; -#[cfg(feature = "full")] -use crate::makefile::functions::NO_EVAL; mod command_line; #[cfg(feature = "full")] @@ -34,6 +34,7 @@ mod input; mod lookup_internal; mod r#macro; mod macro_scope; +mod parse; mod pattern; mod target; mod token; @@ -52,7 +53,7 @@ pub enum ItemSource { } pub struct Makefile<'a> { - inference_rules: Vec<InferenceRule>, + inference_rules: InferenceRuleSet, builtin_inference_rules: Vec<InferenceRule>, pub macros: MacroSet, targets: DynamicTargetSet, @@ -132,7 +133,7 @@ impl<'a> Makefile<'a> { } Makefile { - inference_rules: vec![], + inference_rules: InferenceRuleSet::default(), builtin_inference_rules: inference_rules, macros, targets, @@ -144,11 +145,7 @@ impl<'a> Makefile<'a> { pub fn extend(&mut self, new: FinishedMakefileReader) -> Result<()> { self.inference_rules.extend(new.inference_rules); - self.macros.extend( - new.macros, - #[cfg(feature = "full")] - new.macro_exports, - ); + self.macros.extend(new.macros); for (_, target) in new.targets { self.targets.put(target); } @@ -212,7 +209,12 @@ impl<'a> Makefile<'a> { .inference_rules .iter() .chain(self.builtin_inference_rules.iter()) - .filter(|rule| !banned_rules.contains(rule)) + .filter(|rule| { + !banned_rules.iter().any(|banned_rule| { + banned_rule.products == rule.products + && banned_rule.prerequisites == rule.prerequisites + }) + }) .filter(|rule| rule.matches(name).unwrap_or(false)); for rule in inference_rule_candidates { log::trace!( @@ -271,6 +273,7 @@ impl<'a> Makefile<'a> { .first_match(name)? .and_then(|x| x.get(1).map(|x| x.as_str().to_owned())), already_updated: Cell::new(false), + macros: MacroSet::new(), }); break; } @@ -313,6 +316,7 @@ impl<'a> Makefile<'a> { commands, stem: None, already_updated: Cell::new(false), + macros: MacroSet::new(), }); } else { // if it already exists, it counts as up-to-date @@ -323,6 +327,7 @@ impl<'a> Makefile<'a> { commands: vec![], stem: None, already_updated: Cell::new(true), + macros: MacroSet::new(), }); } } @@ -355,6 +360,7 @@ impl<'a> Makefile<'a> { MacroScopeStack::default() .with_scope(&self.macros) .with_scope(&LookupInternal::new(target, &|name| self.get_target(name))) + .with_scope(&target.map(|target| &target.macros)) .expand( text, #[cfg(feature = "full")] @@ -409,6 +415,7 @@ fn builtin_inference_rules() -> Vec<InferenceRule> { prepend_dot!($($second)?).into(), concat!(".", stringify!($first)).into(), vec![$(CommandLine::from($cmd.parse().unwrap())),+], + MacroSet::new(), ) ),+] }; @@ -464,6 +471,7 @@ fn builtin_targets() -> Vec<Target> { commands: vec![], stem: None, already_updated: Cell::new(false), + macros: MacroSet::new(), }] } @@ -482,9 +490,10 @@ mod test { products: vec!["this-is-a-%-case".to_owned()], prerequisites: vec![], commands: vec![], + macros: MacroSet::new(), }; let file = Makefile { - inference_rules: vec![rule], + inference_rules: vec![rule].into(), builtin_inference_rules: vec![], macros: MacroSet::new(), targets: Default::default(), @@ -508,6 +517,7 @@ mod test { commands: vec![], stem: None, already_updated: Cell::new(false), + macros: MacroSet::new(), }; let phony = Target { name: ".PHONY".to_string(), @@ -515,13 +525,14 @@ mod test { commands: vec![], stem: None, already_updated: Cell::new(false), + macros: MacroSet::new(), }; let targets = DynamicTargetSet::default(); targets.put(target); targets.put(phony); let file = Makefile { - inference_rules: vec![], + inference_rules: InferenceRuleSet::default(), builtin_inference_rules: vec![], macros: MacroSet::new(), targets, |