From f2bb81496304981ac208ad664597172e532b17d5 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Wed, 7 Apr 2021 13:27:37 -0600 Subject: let macros in dependencies use $@ to get targets --- src/makefile/input.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/makefile/input.rs b/src/makefile/input.rs index 460a8a0..beb517a 100644 --- a/src/makefile/input.rs +++ b/src/makefile/input.rs @@ -497,7 +497,42 @@ impl<'a, 'parent, R: BufRead> MakefileReader<'a, 'parent, R> { log::error!("rule-specific macros are not implemented yet"); return Ok(()); } - let prerequisites = self.expand_macros(&prerequisites)?; + let prerequisites = self + .macros + .with_lookup(&|macro_name: &str| { + let macro_pieces = if macro_name.starts_with('@') { + // The $@ shall evaluate to the full target name of the + // current target. + targets.iter() + } else { + bail!("unknown internal macro") + }; + + let macro_pieces = if macro_name.ends_with('D') { + macro_pieces + .map(|x| { + Path::new(x) + .parent() + .ok_or_else(|| eyre!("no parent")) + .map(|x| x.to_string_lossy().into()) + }) + .collect::, _>>()? + } else if macro_name.ends_with('F') { + macro_pieces + .map(|x| { + Path::new(x) + .file_name() + .ok_or_else(|| eyre!("no filename")) + .map(|x| x.to_string_lossy().into()) + }) + .collect::, _>>()? + } else { + macro_pieces.map(|&x| x.to_owned()).collect::>() + }; + + Ok(macro_pieces.join(" ")) + }) + .expand(&prerequisites)?; let prerequisites = prerequisites .split_whitespace() .map(|x| x.into()) -- cgit v1.2.3