Re: [PATCH] Re: h2xs [was Re: HEAR YE, HEAR YE!]
[p5sagit/p5-mst-13.2.git] / t / lib / extutils.t
1 #!./perl -w
2
3 print "1..8\n";
4
5 BEGIN {
6     chdir 't' if -d 't';
7     @INC = '../lib';
8 }
9
10 use warnings;
11 use strict;
12 use ExtUtils::MakeMaker;
13 use ExtUtils::Constant qw (constant_types C_constant XS_constant autoload);
14 use Config;
15
16 my $runperl = $^X;
17 my $tobitbucket = ">/dev/null";
18 # my @cleanup;
19 $| = 1;
20
21 my $dir = "ext-$$";
22 mkdir $dir, 0777 or die $!;
23
24 END {
25   system "$Config{rm} -rf $dir";
26 }
27
28 # push @cleanup, $dir;
29
30 my @names = ("THREE", {name=>"OK4", type=>"PV",},
31              {name=>"OK5", type=>"PVN",
32               value=>['"not ok 5\\n\\0ok 5\\n"', 15]},
33              {name => "FARTHING", type=>"NV"},
34              {name => "NOT_ZERO", type=>"UV", value=>~0 . "u"});
35
36 my @names_only = map {(ref $_) ? $_->{name} : $_} @names;
37
38 my $package = "ExtTest";
39 ################ Header
40 my $header = "$dir/test.h";
41 open FH, ">$header" or die $!;
42 print FH <<'EOT';
43 #define THREE 3
44 #define OK4 "ok 4\n"
45 #define OK5 1
46 #define FARTHING 0.25
47 #define NOT_ZERO 1
48 EOT
49 close FH or die $!;
50 # push @cleanup, $header;
51
52 ################ XS
53 my $xs = "$dir/$package.xs";
54 open FH, ">$xs" or die $!;
55
56 print FH <<'EOT';
57 #include "EXTERN.h"
58 #include "perl.h"
59 #include "XSUB.h"
60 EOT
61
62 print FH "#include \"test.h\"\n\n";
63 print FH constant_types(); # macro defs
64 my $types = {};
65 foreach (C_constant (undef, "IV", $types, undef, undef, @names) ) {
66   print FH $_, "\n"; # C constant subs
67 }
68 print FH "MODULE = $package             PACKAGE = $package\n";
69 print FH "PROTOTYPES: ENABLE\n";
70 print FH XS_constant ($package, $types); # XS for ExtTest::constant
71 close FH or die $!;
72 # push @cleanup, $xs;
73
74 ################ PM
75 my $pm = "$dir/$package.pm";
76 open FH, ">$pm" or die $!;
77 print FH "package $package;\n";
78 print FH "use $];\n";
79
80 print FH <<'EOT';
81
82 use strict;
83 use warnings;
84 use Carp;
85
86 require Exporter;
87 require DynaLoader;
88 use AutoLoader;
89 use vars qw ($VERSION @ISA @EXPORT_OK);
90
91 $VERSION = '0.01';
92 @ISA = qw(Exporter DynaLoader);
93 @EXPORT_OK = qw(
94 EOT
95
96 print FH "\t$_\n" foreach (@names_only);
97 print FH ");\n";
98 print FH autoload ($package, $]);
99 print FH "bootstrap $package \$VERSION;\n1;\n__END__\n";
100 close FH or die $!;
101 # push @cleanup, $pm;
102
103 ################ test.pl
104 my $testpl = "$dir/test.pl";
105 open FH, ">$testpl" or die $!;
106
107 print FH "use $package qw(@names_only);\n";
108 print FH <<'EOT';
109
110 my $three = THREE;
111 if ($three == 3) {
112   print "ok 3\n";
113 } else {
114   print "not ok 3 # $three\n";
115 }
116
117 print OK4;
118
119 $_ = OK5;
120 s/.*\0//s;
121 print;
122
123 my $farthing = FARTHING;
124 if ($farthing == 0.25) {
125   print "ok 6\n";
126 } else {
127   print "not ok 6 # $farthing\n";
128 }
129
130 my $not_zero = NOT_ZERO;
131 if ($not_zero > 0 && $not_zero == ~0) {
132   print "ok 7\n";
133 } else {
134   print "not ok 7 # \$not_zero=$not_zero ~0=" . (~0) . "\n";
135 }
136
137
138 EOT
139
140 close FH or die $!;
141 # push @cleanup, $testpl;
142
143 ################ dummy Makefile.PL
144 # Keep the dependancy in the Makefile happy
145 my $makefilePL = "$dir/Makefile.PL";
146 open FH, ">$makefilePL" or die $!;
147 close FH or die $!;
148 # push @cleanup, $makefilePL;
149
150 chdir $dir or die $!; push @INC,  '../../lib';
151 END {chdir ".." or warn $!};
152
153 print "# "; # Grr. MakeMaker hardwired to write its message to STDOUT
154 WriteMakefile(
155               'NAME'            => $package,
156               'VERSION_FROM'    => "$package.pm", # finds $VERSION
157               ($] >= 5.005 ?
158                (#ABSTRACT_FROM => "$package.pm", # XXX add this
159                 AUTHOR     => $0) : ())
160              );
161 if (-f "Makefile") {
162   print "ok 1\n";
163 } else {
164   print "not ok 1\n";
165 }
166
167 my $make = $Config{make};
168 $make = $ENV{MAKE} if exists $ENV{MAKE};
169 print "# make = '$make'\n";
170 if (system "$make $tobitbucket") {
171   print "not ok 2 # $make failed\n";
172   # Bail out?
173 } else {
174   print "ok 2\n";
175 }
176
177 $make .= ' test';
178 # This hack to get a # in front of "PERL_DL_NONLAZY=1 ..." isn't going to work
179 # on VMS mailboxes.
180 print "# make = '$make'\n# ";
181 if (system $make) {
182   print "not ok 8 # $make failed\n";
183 } else {
184   print "ok 8\n";
185 }