From 52e6404590f0a8824cf5f9522a2dc3151c2af9f3 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini Date: Sun, 21 Jul 2013 17:58:05 +0100 Subject: automake: account for perl hash order randomization Try to explicitly order the keys of some perl hashes when looping on them to do sanity/correctness checks and possibly display warning messages; this should ensure a more reproducible output. Not really a big deal, but I prefer to keep the order of such output reproducible if possible. Issue revealed by spurious testsuite failures with perl 5.18, as reported in automake bug#14891. See also: * lib/Automake/Variable.pm (variables): Explicitly order the values of the returned Automake::Variable instances. (variables_dump): Simplify, using the knowledge that 'variables()' now sorts its output. * t/preproc-errmsg.sh: Adjust. Signed-off-by: Stefano Lattarini --- NEWS | 4 ++++ lib/Automake/Variable.pm | 14 +++++++------- t/preproc-errmsg.sh | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index aaec7c0da..31e4f6ff4 100644 --- a/NEWS +++ b/NEWS @@ -114,6 +114,10 @@ New in 1.14.1: was only relevant when the number of python files was high (which is unusual in practice). + - Automake try to offer a more reproducible output for warning messages, + in the face of the newly-introduced randomization for hash keys order + in Perl 5.18. + - The 'test-driver' script now actually error out with a clear error message on the most common invalid usages. diff --git a/lib/Automake/Variable.pm b/lib/Automake/Variable.pm index f1559f58c..4751563a3 100644 --- a/lib/Automake/Variable.pm +++ b/lib/Automake/Variable.pm @@ -317,21 +317,21 @@ use vars '%_variable_dict', '%_primary_dict'; sub variables (;$) { my ($suffix) = @_; + my @vars = (); if ($suffix) { if (exists $_primary_dict{$suffix}) { - return values %{$_primary_dict{$suffix}}; - } - else - { - return (); + @vars = values %{$_primary_dict{$suffix}}; } } else { - return values %_variable_dict; + @vars = values %_variable_dict; } + # The behaviour of the 'sort' built-in is undefined in scalar + # context, hence we need an ad-hoc handling for such context. + return wantarray ? sort { $a->name cmp $b->name } @vars : scalar @vars; } =item C @@ -1080,7 +1080,7 @@ For debugging. sub variables_dump () { my $text = "all variables:\n{\n"; - foreach my $var (sort { $a->name cmp $b->name } variables) + foreach my $var (variables()) { $text .= $var->dump; } diff --git a/t/preproc-errmsg.sh b/t/preproc-errmsg.sh index 704562dcd..87bcf8161 100644 --- a/t/preproc-errmsg.sh +++ b/t/preproc-errmsg.sh @@ -58,11 +58,11 @@ Makefile.am:2: 'sub/local.mk' included from here sub/local.mk:3: 'sub-two.a' is not a standard library name sub/local.mk:3: did you mean 'libsub-two.a'? Makefile.am:2: 'sub/local.mk' included from here -Makefile.am:1: variable 'x1_SOURCES' is defined but no program or -Makefile.am:1: library has 'x1' as canonical name (possible typo) sub/local.mk:4: variable 'sub_x2_SOURCES' is defined but no program or sub/local.mk:4: library has 'sub_x2' as canonical name (possible typo) Makefile.am:2: 'sub/local.mk' included from here +Makefile.am:1: variable 'x1_SOURCES' is defined but no program or +Makefile.am:1: library has 'x1' as canonical name (possible typo) END # We need to break these substitutions into multiple sed invocations -- cgit v1.2.1