summaryrefslogtreecommitdiff
path: root/Porting/exercise_makedef.pl
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2011-07-17 08:59:27 +0100
committerNicholas Clark <nick@ccl4.org>2011-08-01 11:53:47 +0200
commite95aa0cbf5ce7c39ec487bb798ee06d4732fe257 (patch)
tree25720e811da96554ab0b885236bdc33b0340dd76 /Porting/exercise_makedef.pl
parentba048c2476d2ae91d15aad15f8e9369dce2d7b1b (diff)
downloadperl-e95aa0cbf5ce7c39ec487bb798ee06d4732fe257.tar.gz
Add a utility to help test makedef.pl
The output of makedef.pl varies too much based on local configuration to allow us to generate any useful pre-canned expectations of correctness. Hence the only real option left is to generate "Golden" results for the local platform prior to any modification, and then compare post modification output with them, to see that nothing (unexpected) changed. exercise_makedef.pl captures all output for (currently) 576 permutations of command line parameters, to enable this testing.
Diffstat (limited to 'Porting/exercise_makedef.pl')
-rw-r--r--Porting/exercise_makedef.pl92
1 files changed, 92 insertions, 0 deletions
diff --git a/Porting/exercise_makedef.pl b/Porting/exercise_makedef.pl
new file mode 100644
index 0000000000..35881920d5
--- /dev/null
+++ b/Porting/exercise_makedef.pl
@@ -0,0 +1,92 @@
+#!./miniperl -w
+use strict;
+use Config;
+use 5.012;
+die "Can't fork" unless $Config{d_fork};
+
+# Brute force testing for makedef.pl
+#
+# To use this...
+#
+# Before modifying makedef.pl, create your golden results:
+#
+# $ mkdir Gold
+# $ ./perl -Ilib Porting/exercise_makedef.pl Gold/
+# $ chmod -R -w Gold/
+# $ mkdr Test
+#
+# then modify makedef.pl
+#
+# then test
+#
+# $ ./perl -Ilib Porting/exercise_makedef.pl Test
+# $ diff -rpu Gold Test
+
+my $prefix = shift;
+die "$0 prefix" unless $prefix;
+die "No such directory $prefix" unless -d $prefix;
+
+my @unlink;
+sub END {
+ unlink @unlink;
+}
+
+$SIG{INT} = sub { die }; # Trigger END processing
+
+{
+ # needed for OS/2, so fake one up
+ my $mpm = 'miniperl.map';
+
+ die "$mpm exists" if -e $mpm;
+
+ open my $in, '<', 'av.c' or die "Can't open av.c: $!";
+ push @unlink, $mpm;
+ open my $out, '>', $mpm or die "Can't open $mpm: $!";
+ while (<$in>) {
+ print $out "f $1\n" if /^(Perl_[A-Za-z_0-9]+)\(pTHX/;
+ }
+ close $out or die "Can't close $mpm: $!";
+}
+
+my @args = (platform => [map {"PLATFORM=$_"} qw(aix win32 wince os2 netware vms)],
+ cflags => ['', 'CCFLAGS=-Dperl=rules -Dzzz'],
+ Deq => ['', '-Dbeer=foamy'],
+ D => ['', '-DPERL_IMPLICIT_SYS'],
+ cctype => ['', map {"CCTYPE=$_"} qw (MSVC60 GCC BORLAND)],
+ filetype => ['', 'FILETYPE=def', 'FILETYPE=imp'],
+ );
+
+sub expand {
+ my ($names, $args, $key, $vals, @rest) = @_;
+ if (defined $key) {
+ my $bad;
+ while (my ($i, $v) = each @$vals) {
+ $bad += expand([@$names, "$key=$i"], [@$args, $v], @rest);
+ }
+ return $bad;
+ }
+ # time to process something:
+ my $name = join ',', @$names;
+ my @args = grep {length} @$args;
+
+ $ENV{PERL5LIB} = join $Config{path_sep}, @INC;
+ my $pid = fork;
+ unless ($pid) {
+ open STDOUT, '>', "$prefix/$name.out"
+ or die "Can't open $prefix/$name.out: $!";
+ open STDERR, '>', "$prefix/$name.err"
+ or die "Can't open $prefix/$name.err: $!";
+ exec $^X, 'makedef.pl', @args;
+ die "Something went horribly wrong: $!";
+ }
+ die "Bad waitpid: $!" unless waitpid $pid, 0 == $pid;
+ if ($?) {
+ print STDERR "`$^X makedef.pl @args` failed with $?\n";
+ print STDERR "See output in $prefix/$name.err\n";
+ return 1;
+ }
+ return 0;
+}
+
+my $bad = expand([], [], @args);
+exit($bad > 255 ? 255 : $bad);