automake: account for perl hash order randomization
authorStefano Lattarini <stefano.lattarini@gmail.com>
Sun, 21 Jul 2013 16:58:05 +0000 (17:58 +0100)
committerStefano Lattarini <stefano.lattarini@gmail.com>
Thu, 31 Oct 2013 00:26:33 +0000 (00:26 +0000)
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>
NEWS
lib/Automake/Variable.pm
t/preproc-errmsg.sh

diff --git a/NEWS b/NEWS
index aaec7c0..31e4f6f 100644 (file)
--- 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.
 
index f1559f5..4751563 100644 (file)
@@ -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;
     }
index 704562d..87bcf81 100644 (file)
@@ -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