From 4a65714f22a4d577bc95a699cf02e64abf39fe05 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Fri, 16 Apr 2021 21:37:07 -0600 Subject: handle macros expanding to multiple command lines gnufully --- src/makefile/command_line.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src') diff --git a/src/makefile/command_line.rs b/src/makefile/command_line.rs index b7c3b23..45ac181 100644 --- a/src/makefile/command_line.rs +++ b/src/makefile/command_line.rs @@ -3,6 +3,8 @@ use std::fmt; use std::process::{Command, ExitStatus}; use eyre::{bail, Error}; +use lazy_static::lazy_static; +use regex::Regex; use super::r#macro::Set as MacroSet; use super::target::Target; @@ -86,6 +88,20 @@ impl CommandLine { }); log::trace!("executing {}", &self.execution_line); let execution_line = file.expand_macros(&self.execution_line, Some(target))?; + // unfortunately, if we had a multiline macro somewhere with non-escaped newlines, now we have to run each of them as separate lines + lazy_static! { + static ref UNESCAPED_NEWLINE: Regex = Regex::new(r"([^\\])\n").unwrap(); + } + if UNESCAPED_NEWLINE.is_match(&execution_line) { + let lines = UNESCAPED_NEWLINE + .split(&execution_line) + .map(|x| Self::from(TokenString::text(x.trim_start()))); + for line in lines { + line.execute(file, target)?; + } + return Ok(()); + } + log::trace!("executing {}", &execution_line); let mut self_ignore_errors = self.ignore_errors; let mut self_silent = self.silent; let mut self_always_execute = self.always_execute; -- cgit v1.2.3