summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Lattarini <stefano.lattarini@gmail.com>2013-07-21 17:58:05 +0100
committerStefano Lattarini <stefano.lattarini@gmail.com>2013-10-31 00:26:33 +0000
commit52e6404590f0a8824cf5f9522a2dc3151c2af9f3 (patch)
treee4ec826064680c1e7fa867ce6314273335d2f58c
parent073b1fe85068620eb6c06432b1be13c40394a177 (diff)
downloadautomake-52e6404590f0a8824cf5f9522a2dc3151c2af9f3.tar.gz
automake-52e6404590f0a8824cf5f9522a2dc3151c2af9f3.tar.bz2
automake-52e6404590f0a8824cf5f9522a2dc3151c2af9f3.zip
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: <http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Hash_randomization> <http://onionstand.blogspot.ie/2012/12/are-you-relying-on-hash-keys-being.html> * 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 <stefano.lattarini@gmail.com>
-rw-r--r--NEWS4
-rw-r--r--lib/Automake/Variable.pm14
-rw-r--r--t/preproc-errmsg.sh4
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<Automake::Variable::reset>
@@ -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