Setting -Werror in a Makefile.am affects the handling of Makefile.am files treated later by the same automake process (more precisely, the same thread):
sub/Makefile.am: AUTOMAKE_OPTIONS = -Werror # no warnings happen in this file Makefile.am: AUTOMAKE_OPTIONS = -Wall # redefined variable warning VAR = 1 VAR = 2 AUTOMAKE_JOBS=2 automake # zero exit status unset AUTOMAKE_JOBS; automake # nonzero automake Makefile # zero because we see no -Werror I'm pushing this fix to maint, for master and branch-1.11. Thanks, Ralf Fix per-Makefile.am setting of -Werror. Before this patch, 'AUTOMAKE_OPTIONS = -Werror' in one Makefile.am would carry over to other Makefile.am files treated afterwards by the same thread, causing inconsistent and unstable exit status values. * lib/Automake/Channels.pm (dup_channel_setup) (drop_channel_setup): Save and restore the setting of $warnings_are_errors. * tests/werror3.test: New test. * tests/Makefile.am: Adjust. * NEWS: Update. diff --git a/NEWS b/NEWS index 5af2439..fee7f83 100644 --- a/NEWS +++ b/NEWS @@ -31,6 +31,8 @@ Bugs fixed in 1.11.0a: - Several scripts as well as the parallel-tests testsuite driver now exit with the right exit status upon receiving a signal. + - A per-Makefile.am setting of -Werror does not carry over to the + handling of other Makefile.am files any more. New in 1.11: diff --git a/lib/Automake/Channels.pm b/lib/Automake/Channels.pm index 223d8d2..050ba05 100644 --- a/lib/Automake/Channels.pm +++ b/lib/Automake/Channels.pm @@ -710,8 +710,9 @@ entry, while C<drop_channel_setup ()> just deletes it. =cut -use vars qw (@_saved_channels); +use vars qw (@_saved_channels @_saved_werrors); @_saved_channels = (); +...@_saved_werrors = (); sub dup_channel_setup () { @@ -721,12 +722,14 @@ sub dup_channel_setup () $channels_copy{$k1} = {%{$channels{$k1}}}; } push @_saved_channels, \%channels_copy; + push @_saved_werrors, $warnings_are_errors; } sub drop_channel_setup () { my $saved = pop @_saved_channels; %channels = %$saved; + $warnings_are_errors = pop @_saved_werrors; } =item C<buffer_messages (@types)>, C<flush_messages ()> diff --git a/tests/Makefile.am b/tests/Makefile.am index 7e14b1c..eb63337 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -746,6 +746,7 @@ vtexi2.test \ warnopts.test \ werror.test \ werror2.test \ +werror3.test \ whoami.test \ xsource.test \ xz.test \ diff --git a/tests/werror3.test b/tests/werror3.test new file mode 100755 index 0000000..96b4ff3 --- /dev/null +++ b/tests/werror3.test @@ -0,0 +1,49 @@ +#! /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/>. + +# Make sure a per-Makefile.am -Werror setting is not carried over +# to another Makefile.am. + +. ./defs || Exit 1 + +set -e + +cat >>configure.in <<\END +AC_CONFIG_FILES([sub/Makefile]) +AC_OUTPUT +END + +mkdir sub +cat >sub/Makefile.am <<\END +AUTOMAKE_OPTIONS = -Werror +END +cat >Makefile.am <<\END +VAR = foo +VAR = bar +END + +$ACLOCAL + +# The issue would not manifest with threaded execution. +unset AUTOMAKE_JOBS || : +AUTOMAKE_run 0 -Wno-error +grep 'VAR multiply defined' stderr + +AUTOMAKE_JOBS=2 +export AUTOMAKE_JOBS +AUTOMAKE_run 0 -Wno-error +grep 'VAR multiply defined' stderr +: