On Friday 05 November 2010, Stefano Lattarini wrote: > I can confirm the bug with latest automake (from git master), with > a much-reduced minimal testcase (see attachment). > > I still haven't looked for an explanation or a fix, though. I've manged to find a very simple fix for the bug (see attached patch).
OK to apply to maint? Regards, Stefano
From b8de299295e081909c6d0a8a1cef957b337e3732 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini <stefano.lattar...@gmail.com> Date: Sat, 6 Nov 2010 12:46:52 +0100 Subject: [PATCH] Fix a bug in variable concatanation with `+='. * lib/Automake/VarDef.pm (append): Remove extra backslash-escaped newlines from the end of the variable's content, before appending to it. * tests/pluseq11.test: New test, exposing the bug. * tests/Makefile.am (TESTS): Update. Reported by Andy Wingo. --- ChangeLog | 10 ++++++++ lib/Automake/VarDef.pm | 13 +--------- tests/Makefile.am | 1 + tests/Makefile.in | 1 + tests/pluseq11.test | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 11 deletions(-) create mode 100755 tests/pluseq11.test diff --git a/ChangeLog b/ChangeLog index 6c17cd3..a928363 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2010-11-06 Stefano Lattarini <stefano.lattar...@gmail.com> + + Fix a bug in variable concatanation with `+='. + * lib/Automake/VarDef.pm (append): Remove extra backslash-escaped + newlines from the end of the variable's content, before appending + to it. + * tests/pluseq11.test: New test, exposing the bug. + * tests/Makefile.am (TESTS): Update. + Reported by Andy Wingo. + 2010-11-01 Ralf Wildenhues <ralf.wildenh...@gmx.de> Fix and document rules to not touch the tree with `make -n'. diff --git a/lib/Automake/VarDef.pm b/lib/Automake/VarDef.pm index d7ba155..568c82a 100644 --- a/lib/Automake/VarDef.pm +++ b/lib/Automake/VarDef.pm @@ -185,17 +185,8 @@ sub append ($$$) # Furthermore keeping `#' would not be portable if the variable is # output on multiple lines. $val =~ s/ ?#.*//; - - if (chomp $val) - { - # Insert a backslash before a trailing newline. - $val .= "\\\n"; - } - elsif ($val) - { - # Insert a separator. - $val .= ' '; - } + # Insert a separator, if required. + $val .= ' ' if $val; $self->{'value'} = $val . $value; # Turn ASIS appended variables into PRETTY variables. This is to # cope with `make' implementation that cannot read very long lines. diff --git a/tests/Makefile.am b/tests/Makefile.am index 9c81564..da81c49 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -570,6 +570,7 @@ pluseq7.test \ pluseq8.test \ pluseq9.test \ pluseq10.test \ +pluseq11.test \ postproc.test \ ppf77.test \ pr2.test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index b568a09..eb461a9 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -837,6 +837,7 @@ pluseq7.test \ pluseq8.test \ pluseq9.test \ pluseq10.test \ +pluseq11.test \ postproc.test \ ppf77.test \ pr2.test \ diff --git a/tests/pluseq11.test b/tests/pluseq11.test new file mode 100755 index 0000000..293270f --- /dev/null +++ b/tests/pluseq11.test @@ -0,0 +1,54 @@ +#!/bin/sh +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Check for bug in variable concatenation with `+=': an extra backslash +# is erroneously retained in the final value. +# See also sister test pluseq11b.test. + +. ./defs || Exit 1 + +set -e + +cat >>configure.in <<'END' +AC_OUTPUT +END + +cat > Makefile.am <<'END' +## Use more line continuation to ensure we are robust and can (hopefully) +## cope any number of them, and not just one +FOO = \ +\ +\ +bar +## Both this two variable additions are required to trigger the bug. +FOO += +FOO += baz + +.PHONY: test +test: + case '$(FOO)' in *\\*) exit 1;; *) exit 0;; esac +END + +$ACLOCAL +$AUTOMAKE + +grep '^ *FOO *=.*\\.' Makefile.in && Exit 1 + +$AUTOCONF +./configure +$MAKE test + +: -- 1.7.1