diff options
| author | Melody Horn <melody@boringcactus.com> | 2021-04-06 14:11:43 -0600 | 
|---|---|---|
| committer | Melody Horn <melody@boringcactus.com> | 2021-04-06 14:11:43 -0600 | 
| commit | 5a101a96ada9ddbd4be54c46cd7d0125825c2283 (patch) | |
| tree | dd5b54a8b0917d53e17e9fbd31b7280669bcc0ec /src/makefile/input.rs | |
| parent | 1602ad07efa6d3c4170928537843a0d61a5cd5e7 (diff) | |
| download | makers-5a101a96ada9ddbd4be54c46cd7d0125825c2283.tar.gz makers-5a101a96ada9ddbd4be54c46cd7d0125825c2283.zip  | |
eagerly expand when appending to eagerly-expanded macros
Diffstat (limited to 'src/makefile/input.rs')
| -rw-r--r-- | src/makefile/input.rs | 56 | 
1 files changed, 37 insertions, 19 deletions
diff --git a/src/makefile/input.rs b/src/makefile/input.rs index 5dfaed7..5883590 100644 --- a/src/makefile/input.rs +++ b/src/makefile/input.rs @@ -16,7 +16,7 @@ use super::command_line::CommandLine;  #[cfg(feature = "full")]  use super::conditional::{Line as ConditionalLine, State as ConditionalState};  use super::inference_rules::InferenceRule; -use super::r#macro::{Set as MacroSet, Source as MacroSource}; +use super::r#macro::{Macro, Set as MacroSet, Source as MacroSource};  use super::target::Target;  use super::token::{tokenize, Token, TokenString}; @@ -162,21 +162,21 @@ impl<'a, 'parent> MakefileReader<'a, 'parent, BufReader<File>> {          path: impl AsRef<Path>,      ) -> Result<Self> {          #[cfg(feature = "full")] -        if let Some((_, mut old_makefile_list)) = macros.pop("MAKEFILE_LIST") { -            old_makefile_list.extend(TokenString::text(format!( +        if let Some(mut old_makefile_list) = macros.pop("MAKEFILE_LIST") { +            old_makefile_list.text.extend(TokenString::text(format!(                  " {}",                  path.as_ref().to_string_lossy()              ))); -            macros.set( -                "MAKEFILE_LIST".to_owned(), -                MacroSource::Builtin, -                old_makefile_list, -            ); +            macros.set("MAKEFILE_LIST".to_owned(), old_makefile_list);          } else {              macros.set(                  "MAKEFILE_LIST".to_owned(), -                MacroSource::Builtin, -                TokenString::text(path.as_ref().to_string_lossy()), +                Macro { +                    source: MacroSource::Builtin, +                    text: TokenString::text(path.as_ref().to_string_lossy()), +                    #[cfg(feature = "full")] +                    eagerly_expanded: false, +                },              );          }          let file = File::open(path); @@ -606,23 +606,41 @@ impl<'a, 'parent, R: BufRead> MakefileReader<'a, 'parent, R> {          match self.macros.get(name) {              // We always let command line or MAKEFLAGS macros override macros from the file. -            Some((MacroSource::CommandLineOrMakeflags, _)) => return Ok(()), +            Some(Macro { +                source: MacroSource::CommandLineOrMakeflags, +                .. +            }) => return Ok(()),              // We let environment variables override macros from the file only if the command-line argument to do that was given -            Some((MacroSource::Environment, _)) if self.args.environment_overrides => return Ok(()), +            Some(Macro { +                source: MacroSource::Environment, +                .. +            }) if self.args.environment_overrides => return Ok(()),              Some(_) if skip_if_defined => return Ok(()),              _ => {}          }          let value = match self.macros.pop(name) { -            Some((_, mut old_value)) if append => { -                // TODO eagerly expand if appending to eagerly-expanded macro -                old_value.extend(TokenString::text(" ")); -                old_value.extend(value); +            Some(mut old_value) if append => { +                #[cfg(feature = "full")] +                let value = if old_value.eagerly_expanded { +                    TokenString::text(self.expand_macros(&value).wrap_err_with(|| { +                        format!("while defining {} on line {}", name, line_number) +                    })?) +                } else { +                    value +                }; +                old_value.text.extend(TokenString::text(" ")); +                old_value.text.extend(value);                  old_value              } -            _ => value, +            _ => Macro { +                source: MacroSource::File, +                text: value, +                #[cfg(feature = "full")] +                eagerly_expanded: expand_value, +            },          }; -        self.macros.set(name.into(), MacroSource::File, value); +        self.macros.set(name.into(), value);          Ok(())      } @@ -652,7 +670,7 @@ impl<'a, 'parent, R: BufRead> MakefileReader<'a, 'parent, R> {  pub struct FinishedMakefileReader {      pub inference_rules: Vec<InferenceRule>, -    pub macros: HashMap<String, (MacroSource, TokenString)>, +    pub macros: HashMap<String, Macro>,      pub targets: HashMap<String, Target>,      pub first_non_special_target: Option<String>,  }  |