aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/makefile/command_line.rs16
1 files changed, 16 insertions, 0 deletions
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;