[libvirt PATCH] build: workaround behaviour regression in gnu make 4.3

Daniel P. Berrangé posted 1 patch 4 years, 1 month ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20200313184240.1527484-1-berrange@redhat.com
build-aux/syntax-check.mk | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
[libvirt PATCH] build: workaround behaviour regression in gnu make 4.3
Posted by Daniel P. Berrangé 4 years, 1 month ago
We need the "$(space)" variable to contain a single whitespace
character. We do this by assigning and then appending an empty
string to the variable. Variable appends get separated by a
single whitespace historically, but GNU make 4.3 introduced a
behaviour regression.

  https://lists.gnu.org/archive/html/bug-make/2020-01/msg00057.html

[quote]
* WARNING: Backward-incompatibility!
  Previously appending using '+=' to an empty variable would
  result in a value starting with a space.  Now the initial
  space is only added if the variable already contains some
  value.  Similarly, appending an empty string does not
  add a trailing space.
[/quote]

This patch tries a new trick to get a single whitespace by
getting make to expand two non-existant variables separated
by a space.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 build-aux/syntax-check.mk | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index b829c8a18b..3020921be8 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -687,8 +687,7 @@ msg_gen_function += virLastErrorPrefixMessage
 # msg_gen_function += vshPrint
 # msg_gen_function += vshError
 
-space =
-space +=
+space = $(null) $(null)
 func_re= ($(subst $(space),|,$(msg_gen_function)))
 
 # Look for diagnostics that aren't marked for translation.
-- 
2.24.1

Re: [libvirt PATCH] build: workaround behaviour regression in gnu make 4.3
Posted by Eric Blake 4 years, 1 month ago
On 3/13/20 1:42 PM, Daniel P. Berrangé wrote:
> We need the "$(space)" variable to contain a single whitespace
> character. We do this by assigning and then appending an empty
> string to the variable. Variable appends get separated by a
> single whitespace historically, but GNU make 4.3 introduced a
> behaviour regression.
> 
>    https://lists.gnu.org/archive/html/bug-make/2020-01/msg00057.html
> 
> [quote]
> * WARNING: Backward-incompatibility!
>    Previously appending using '+=' to an empty variable would
>    result in a value starting with a space.  Now the initial
>    space is only added if the variable already contains some
>    value.  Similarly, appending an empty string does not
>    add a trailing space.
> [/quote]
> 
> This patch tries a new trick to get a single whitespace by
> getting make to expand two non-existant variables separated
> by a space.

Reviewed-by: Eric Blake <eblake@redhat.com>

https://blog.jgc.org/2007/06/escaping-comma-and-space-in-gnu-make.html 
needs to be updated to cover this change in GNU make, but it also points 
out that GNU make permits:

$(space) = $(null) $(null)

as a way to then write [$( )] or [$ ] instead of [$(space)] (all three 
producing "[ ]"), if you really want to go crazy with odd macro names.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org