From dd094d4ab324fc5ea1d611edeaad85e68d20da71 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 18 Dec 2019 21:44:15 +0000 Subject: [PATCH] Syntax: Line joining with &\ make has a weird rule for line joining in recipes, where the \ is retained. This is very annoying espcially when writing little scripts in other languages in recipes. The GNU make documentation suggests using a `define' block, in which the \ are still necessary, but vanish. But that separates out the recipe from the rule, and also demands that the recipe text be given a name. (Note that .ONESHELL offers an alternative but sadly is not available on a per-rule basis. This is even less sensible with non-recursive make, where you might want different directories to have different settings.) So, provide &\ which does the other thing, swallowing the newline and discarding the &\, even in rules. Add a test case too. Signed-off-by: Ian Jackson --- README | 1 + generate | 1 + tests/filter/sub/dir/Subdir.mk.expected | 2 ++ tests/filter/sub/dir/Subdir.sd.mk | 3 +++ 4 files changed, 7 insertions(+) diff --git a/README b/README index fd10056..6d9091b 100644 --- a/README +++ b/README @@ -250,6 +250,7 @@ So pathname syntax is a subset of: &\& => & general escaping mechanism &\$ => $ +&\NEWLINE eats the newline and vanishes &$VARIABLE => $(sub_dir_VARIABLE) or $(TOP_VARIABLE) VARIABLE is ASCII starting with a letter and matching \w+ diff --git a/generate b/generate index e853912..747bb0c 100755 --- a/generate +++ b/generate @@ -165,6 +165,7 @@ sub process_input_mk ($$$$$$$$$) { o $1; if (s{^\\$esc}{}) { o "$$esclitr" } elsif (s{^\\\$}{}) { o '$' } + elsif (s{^\\\s+$}{}) { } elsif (s{^$esc}{}) { o "$$esclitr$$esclitr" } elsif (m{^(?=$caps_re)}) { o $var_prefix } elsif (s{^\$([A-Za-z]\w+)}{}) { o "\$(${var_prefix}$1)" } diff --git a/tests/filter/sub/dir/Subdir.mk.expected b/tests/filter/sub/dir/Subdir.mk.expected index a524ea2..fbf813f 100644 --- a/tests/filter/sub/dir/Subdir.mk.expected +++ b/tests/filter/sub/dir/Subdir.mk.expected @@ -7,6 +7,8 @@ sub/dir/ sub_dir_TARGETS_sometarget1 sub_dir_TARGETS_sometarget2 +line joining + # doctests: sub/dir/all:: $(sub_dir_TARGETS) diff --git a/tests/filter/sub/dir/Subdir.sd.mk b/tests/filter/sub/dir/Subdir.sd.mk index f2bfa20..0cba54a 100644 --- a/tests/filter/sub/dir/Subdir.sd.mk +++ b/tests/filter/sub/dir/Subdir.sd.mk @@ -7,5 +7,8 @@ &TARGETS_sometarget1 &TARGETS_sometarget2 +line &\ +joining + # doctests: &:include &doctest.sd.mk -- 2.30.2