diff options
Diffstat (limited to 'src/makefile/input.rs')
-rw-r--r-- | src/makefile/input.rs | 37 |
1 files changed, 36 insertions, 1 deletions
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::<Result<Vec<String>, _>>()? + } 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::<Result<Vec<String>, _>>()? + } else { + macro_pieces.map(|&x| x.to_owned()).collect::<Vec<String>>() + }; + + Ok(macro_pieces.join(" ")) + }) + .expand(&prerequisites)?; let prerequisites = prerequisites .split_whitespace() .map(|x| x.into()) |