On Fri, 1 Nov 2002 12:53:41 -0500 (EST), Andy Dougherty wrote: >At the moment, the bytecode "fingerprint" is built with Digest::MD5. >Alas, Digest::MD5 wasn't standard with perl versions prior to 5.8.0. >What should happen in those cases? Anybody have any good ideas?
The attached patch is a fleshed-out (and lightly tested) example of my prior post. Invoking 'md5sum' in this way yields the same fingerprint as Digest::MD5. The fallback checksum is just the sum of ASCII values of all the ops, so it does not match the other two, and can be fooled, but it does give a warning in this case. Since the fingerprint is only there to help developers shoot themselves in the foot less often, perhaps this solution is sufficient. BTW, I ran into this same problem recently while trying to build Parrot on a minimally-installed Debian box for a demo. Parrot failed on these missing items: stdio.h (from pkg libc6-dev) Digest/MD5.pm (from pkg libdigest-md5-perl) perldoc (from pkg perl-doc) I recognized the problems quickly, but only because I have been knee-deep in the code for a month. Missing C compilers also sting me frequently, as I am trying to get all the free Win32 compilers to work out-of-the-box with Parrot, and I don't have all my patches submitted yet, and sometimes forget to put the compiler-of-the-day in my PATH, or do a 'perl Configure -cc=bcc32' (note the missing dash). In Configure.pl and friends, I think that "fail early, fail loudly" should be a guiding principle, at least for the things with no workarounds. Unless someone thinks it is a bad idea, I intend to patch in that direction whenever I see relevant Configure code. -- Hope this helps, Bruce Gray
--- fingerprint_c.pl~ Thu Oct 24 09:14:10 2002 +++ fingerprint_c.pl Fri Nov 1 14:50:43 2002 @@ -2,14 +2,32 @@ use strict; use lib 'lib'; -use Digest::MD5 qw(md5_hex); -use Data::Dumper; use Parrot::OpLib::core; my $len = 10; -my $fingerprint = md5_hex join "\n", map { - join '_', $_->{NAME}, @{$_->{ARGS}} + +my $fingerprint = join "\n", map { + join '_', $_->{NAME}, @{$_->{ARGS}} } @$Parrot::OpLib::core::ops; +if (eval {require Digest::MD5}) { + $fingerprint = Digest::MD5::md5_hex $fingerprint; +} +elsif (`md5sum </dev/null` and not $? ) { + use File::Temp; + my ($fh, $filename) = File::Temp::tempfile() or die; + print $fh $fingerprint; + close $fh or die; + $fingerprint = substr(`md5sum $filename`, 0, 32); + die "Failed: Can't get valid checksum" unless $fingerprint and not $?; + unlink $filename or die; +} +else { + $fingerprint = unpack('H*', pack 'L', unpack "%128C*", $fingerprint) x 4; + warn "$0:warning - MD5 checksum not available - " . + "Falling back to a much less secure checksum. " . + "We recommend that you install the Digest::MD5 module, or the 'md5sum' +program.\n"; +} + print << "EOF"; /*