Upgrade to Devel::PPPort 3.08_02
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / t / ppphtest.t
CommitLineData
adfe19db 1################################################################################
2#
3# !!!!! Do NOT edit this file directly! !!!!!
4#
5# Edit mktests.PL and/or parts/inc/ppphtest instead.
6#
7################################################################################
8
9BEGIN {
10 if ($ENV{'PERL_CORE'}) {
11 chdir 't' if -d 't';
12 @INC = ('../lib', '../ext/Devel/PPPort/t') if -d '../lib' && -d '../ext';
13 require Config; import Config;
14 use vars '%Config';
a745474a 15 if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
adfe19db 16 print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
17 exit 0;
18 }
19 }
20 else {
21 unshift @INC, 't';
22 }
23
c07deaaf 24 sub load {
25 eval "use Test";
26 require 'testutil.pl' if $@;
adfe19db 27 }
c07deaaf 28
29 if (202) {
30 load();
0d0f8426 31 plan(tests => 202);
adfe19db 32 }
33}
34
35use Devel::PPPort;
36use strict;
37$^W = 1;
38
0d0f8426 39BEGIN {
40 if ($ENV{'SKIP_PPPHTEST'}) {
41 for (1 .. 202) {
42 ok(1);
43 }
44 exit 0;
45 }
46}
47
adfe19db 48use File::Path qw/rmtree mkpath/;
96ad942f 49use Config;
adfe19db 50
51my $tmp = 'ppptmp';
96ad942f 52my $inc = '';
4a582685 53my $isVMS = $^O eq 'VMS';
54my $isMAC = $^O eq 'MacOS';
14e93752 55my $perl = find_perl();
adfe19db 56
57rmtree($tmp) if -d $tmp;
58mkpath($tmp) or die "mkpath $tmp: $!\n";
59chdir($tmp) or die "chdir $tmp: $!\n";
60
adfe19db 61if ($ENV{'PERL_CORE'}) {
87499469 62 if (-d '../../lib') {
4a582685 63 if ($isVMS) {
64 $inc = '"-I../../lib"';
65 }
66 elsif ($isMAC) {
67 $inc = '-I:::lib';
68 }
69 else {
70 $inc = '-I../../lib';
71 }
87499469 72 unshift @INC, '../../lib';
73 }
adfe19db 74}
96ad942f 75if ($perl =~ m!^\./!) {
76 $perl = ".$perl";
77}
adfe19db 78
79END {
cd266515 80 chdir('..') if !-d $tmp && -d "../$tmp";
81 rmtree($tmp) if -d $tmp;
adfe19db 82}
83
84ok(&Devel::PPPort::WriteFile("ppport.h"));
85
4a582685 86sub comment
87{
88 my $c = shift;
89 $c =~ s/^/# | /mg;
90 $c .= "\n" unless $c =~ /[\r\n]$/;
91 print $c;
92}
93
adfe19db 94sub ppport
95{
4a582685 96 my @args = ('ppport.h', @_);
97 unshift @args, $inc if $inc;
98 my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
99 $run .= ' -MMac::err=unix' if $isMAC;
100 for (@args) {
101 $_ = qq("$_") if $isVMS && /^[^"]/;
102 $run .= " $_";
103 }
104 print "# *** running $run ***\n";
105 $run .= ' 2>&1' unless $isMAC;
106 my @out = `$run`;
107 my $out = join '', @out;
108 comment($out);
109 return wantarray ? @out : $out;
adfe19db 110}
111
112sub matches
113{
114 my($str, $re, $mod) = @_;
115 my @n;
116 eval "\@n = \$str =~ /$re/g$mod;";
117 if ($@) {
118 my $err = $@;
119 $err =~ s/^/# *** /mg;
120 print "# *** ERROR ***\n$err\n";
121 }
122 return $@ ? -42 : scalar @n;
123}
124
125sub eq_files
126{
127 my($f1, $f2) = @_;
128 return 0 unless -e $f1 && -e $f2;
129 local *F;
130 for ($f1, $f2) {
131 print "# File: $_\n";
132 unless (open F, $_) {
133 print "# couldn't open $_: $!\n";
134 return 0;
135 }
136 $_ = do { local $/; <F> };
137 close F;
4a582685 138 comment($_);
adfe19db 139 }
140 return $f1 eq $f2;
141}
142
143my @tests;
144
145for (split /\s*={70,}\s*/, do { local $/; <DATA> }) {
146 s/^\s+//; s/\s+$//;
147 my($c, %f);
148 ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/;
149 push @tests, { code => $c, files => \%f };
150}
151
152my $t;
153for $t (@tests) {
154 my $f;
155 for $f (keys %{$t->{files}}) {
156 my @f = split /\//, $f;
157 if (@f > 1) {
158 pop @f;
159 my $path = join '/', @f;
160 mkpath($path) or die "mkpath('$path'): $!\n";
161 }
162 my $txt = $t->{files}{$f};
163 local *F;
164 open F, ">$f" or die "open $f: $!\n";
165 print F "$txt\n";
166 close F;
167 $txt =~ s/^/# | /mg;
168 print "# *** writing $f ***\n$txt\n";
169 }
170
171 eval $t->{code};
172 if ($@) {
173 my $err = $@;
174 $err =~ s/^/# *** /mg;
175 print "# *** ERROR ***\n$err\n";
176 }
177 ok($@, '');
178
179 for (keys %{$t->{files}}) {
180 unlink $_ or die "unlink('$_'): $!\n";
181 }
182}
183
96ad942f 184sub find_perl
185{
186 my $perl = $^X;
4a582685 187
188 return $perl if $isVMS;
189
96ad942f 190 my $exe = $Config{'_exe'} || '';
4a582685 191
96ad942f 192 if ($perl =~ /^perl\Q$exe\E$/i) {
193 $perl = "perl$exe";
194 eval "require File::Spec";
195 if ($@) {
196 $perl = "./$perl";
197 } else {
198 $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
199 }
200 }
4a582685 201
96ad942f 202 if ($perl !~ /\Q$exe\E$/i) {
203 $perl .= $exe;
204 }
4a582685 205
96ad942f 206 warn "find_perl: cannot find $perl from $^X" unless -f $perl;
4a582685 207
96ad942f 208 return $perl;
209}
210
adfe19db 211__DATA__
212
213my $o = ppport(qw(--help));
214ok($o =~ /^Usage:.*ppport\.h/m);
215ok($o =~ /--help/m);
216
217$o = ppport(qw(--nochanges));
4a582685 218ok($o =~ /^Scanning.*test\.xs/mi);
219ok($o =~ /Analyzing.*test\.xs/mi);
220ok(matches($o, '^Scanning', 'm'), 1);
221ok(matches($o, 'Analyzing', 'm'), 1);
adfe19db 222ok($o =~ /Uses Perl_newSViv instead of newSViv/);
223
224$o = ppport(qw(--quiet --nochanges));
225ok($o =~ /^\s*$/);
226
227---------------------------- test.xs ------------------------------------------
228
229Perl_newSViv();
230
231===============================================================================
232
233# check if C and C++ comments are filtered correctly
234
235my $o = ppport(qw(--copy=a));
4a582685 236ok($o =~ /^Scanning.*MyExt\.xs/mi);
237ok($o =~ /Analyzing.*MyExt\.xs/mi);
238ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 239ok($o =~ /^Needs to include.*ppport\.h/m);
240ok($o !~ /^Uses grok_bin/m);
241ok($o !~ /^Uses newSVpv/m);
242ok($o =~ /Uses 1 C\+\+ style comment/m);
243ok(eq_files('MyExt.xsa', 'MyExt.ra'));
244
245# check if C++ are left untouched with --cplusplus
246
247$o = ppport(qw(--copy=b --cplusplus));
4a582685 248ok($o =~ /^Scanning.*MyExt\.xs/mi);
249ok($o =~ /Analyzing.*MyExt\.xs/mi);
250ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 251ok($o =~ /^Needs to include.*ppport\.h/m);
252ok($o !~ /^Uses grok_bin/m);
253ok($o !~ /^Uses newSVpv/m);
254ok($o !~ /Uses \d+ C\+\+ style comment/m);
255ok(eq_files('MyExt.xsb', 'MyExt.rb'));
256
257unlink qw(MyExt.xsa MyExt.xsb);
258
259---------------------------- MyExt.xs -----------------------------------------
4a582685 260
adfe19db 261newSVuv();
262 // newSVpv();
263 XPUSHs(foo);
264/* grok_bin(); */
265
266---------------------------- MyExt.ra -----------------------------------------
4a582685 267
adfe19db 268#include "ppport.h"
269newSVuv();
270 /* newSVpv(); */
271 XPUSHs(foo);
272/* grok_bin(); */
273
274---------------------------- MyExt.rb -----------------------------------------
4a582685 275
adfe19db 276#include "ppport.h"
277newSVuv();
278 // newSVpv();
279 XPUSHs(foo);
280/* grok_bin(); */
281
282===============================================================================
283
284my $o = ppport(qw(--nochanges file1.xs));
4a582685 285ok($o =~ /^Scanning.*file1\.xs/mi);
286ok($o =~ /Analyzing.*file1\.xs/mi);
287ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 288ok($o =~ /^Uses newCONSTSUB/m);
289ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
290ok($o =~ /hint for newCONSTSUB/m);
291ok($o !~ /hint for sv_2pv_nolen/m);
292ok($o =~ /^Looks good/m);
293
294$o = ppport(qw(--nochanges --nohints file1.xs));
4a582685 295ok($o =~ /^Scanning.*file1\.xs/mi);
296ok($o =~ /Analyzing.*file1\.xs/mi);
297ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 298ok($o =~ /^Uses newCONSTSUB/m);
299ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
300ok($o !~ /hint for newCONSTSUB/m);
301ok($o !~ /hint for sv_2pv_nolen/m);
302ok($o =~ /^Looks good/m);
303
304$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
4a582685 305ok($o =~ /^Scanning.*file1\.xs/mi);
306ok($o =~ /Analyzing.*file1\.xs/mi);
307ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 308ok($o !~ /^Uses newCONSTSUB/m);
309ok($o !~ /^Uses SvPV_nolen/m);
310ok($o !~ /hint for newCONSTSUB/m);
311ok($o !~ /hint for sv_2pv_nolen/m);
312ok($o =~ /^Looks good/m);
313
314$o = ppport(qw(--nochanges --quiet file1.xs));
315ok($o =~ /^\s*$/);
316
317$o = ppport(qw(--nochanges file2.xs));
4a582685 318ok($o =~ /^Scanning.*file2\.xs/mi);
319ok($o =~ /Analyzing.*file2\.xs/mi);
320ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 321ok($o =~ /^Uses mXPUSHp/m);
322ok($o =~ /^Needs to include.*ppport\.h/m);
323ok($o !~ /^Looks good/m);
324ok($o =~ /^1 potentially required change detected/m);
325
326$o = ppport(qw(--nochanges --nohints file2.xs));
4a582685 327ok($o =~ /^Scanning.*file2\.xs/mi);
328ok($o =~ /Analyzing.*file2\.xs/mi);
329ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 330ok($o =~ /^Uses mXPUSHp/m);
331ok($o =~ /^Needs to include.*ppport\.h/m);
332ok($o !~ /^Looks good/m);
333ok($o =~ /^1 potentially required change detected/m);
334
335$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
4a582685 336ok($o =~ /^Scanning.*file2\.xs/mi);
337ok($o =~ /Analyzing.*file2\.xs/mi);
338ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 339ok($o !~ /^Uses mXPUSHp/m);
340ok($o !~ /^Needs to include.*ppport\.h/m);
341ok($o !~ /^Looks good/m);
342ok($o =~ /^1 potentially required change detected/m);
343
344$o = ppport(qw(--nochanges --quiet file2.xs));
345ok($o =~ /^\s*$/);
346
347---------------------------- file1.xs -----------------------------------------
348
349#define NEED_newCONSTSUB
350#define NEED_sv_2pv_nolen
351#include "ppport.h"
352
353newCONSTSUB();
354SvPV_nolen();
355
356---------------------------- file2.xs -----------------------------------------
357
358mXPUSHp(foo);
359
360===============================================================================
361
362my $o = ppport(qw(--nochanges));
4a582685 363ok($o =~ /^Scanning.*FooBar\.xs/mi);
364ok($o =~ /Analyzing.*FooBar\.xs/mi);
365ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 366ok($o !~ /^Looks good/m);
367ok($o =~ /^Uses grok_bin/m);
368
369---------------------------- FooBar.xs ----------------------------------------
370
371newSViv();
372XPUSHs(foo);
373grok_bin();
374
375===============================================================================
376
377my $o = ppport(qw(--nochanges));
4a582685 378ok($o =~ /^Scanning.*First\.xs/mi);
379ok($o =~ /Analyzing.*First\.xs/mi);
380ok($o =~ /^Scanning.*second\.h/mi);
381ok($o =~ /Analyzing.*second\.h/mi);
382ok($o =~ /^Scanning.*sub.*third\.c/mi);
383ok($o =~ /Analyzing.*sub.*third\.c/mi);
384ok($o !~ /^Scanning.*foobar/mi);
385ok(matches($o, '^Scanning', 'm'), 3);
adfe19db 386
387---------------------------- First.xs -----------------------------------------
388
389one
390
391---------------------------- foobar.xyz ---------------------------------------
392
393two
394
395---------------------------- second.h -----------------------------------------
396
397three
398
399---------------------------- sub/third.c --------------------------------------
400
401four
402
403===============================================================================
404
405my $o = ppport(qw(--nochanges));
406ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
407
408---------------------------- test.xs ------------------------------------------
409
410#define NEED_foobar
411
412===============================================================================
413
414# And now some complex "real-world" example
415
416my $o = ppport(qw(--copy=f));
417for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
4a582685 418 ok($o =~ /^Scanning.*\Q$_\E/mi);
419 ok($o =~ /Analyzing.*\Q$_\E/i);
adfe19db 420}
4a582685 421ok(matches($o, '^Scanning', 'm'), 6);
adfe19db 422
4a582685 423ok(matches($o, '^Writing copy of', 'm'), 5);
adfe19db 424ok(!-e "mod5.cf");
425
426for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
427 ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
428 ok(-e "${_}f");
429 ok(eq_files("${_}f", "${_}r"));
430 unlink "${_}f";
431}
432
433---------------------------- main.xs ------------------------------------------
434
435#include "EXTERN.h"
436#include "perl.h"
437#include "XSUB.h"
438
439#define NEED_newCONSTSUB
440#define NEED_grok_hex_GLOBAL
441#include "ppport.h"
442
443newCONSTSUB();
444grok_hex();
445Perl_grok_bin(aTHX_ foo, bar);
446
447/* some comment */
448
449perl_eval_pv();
450grok_bin();
451Perl_grok_bin(bar, sv_no);
452
453---------------------------- mod1.c -------------------------------------------
454
455#include "EXTERN.h"
456#include "perl.h"
457#include "XSUB.h"
458
459#define NEED_grok_bin_GLOBAL
460#define NEED_newCONSTSUB
461#include "ppport.h"
462
463newCONSTSUB();
464grok_bin();
465{
466 Perl_croak ("foo");
467 Perl_sv_catpvf(); /* I know it's wrong ;-) */
468}
469
470---------------------------- mod2.c -------------------------------------------
471
472#include "EXTERN.h"
473#include "perl.h"
474#include "XSUB.h"
475
476#define NEED_eval_pv
477#include "ppport.h"
478
479newSViv();
480
481/*
482 eval_pv();
483*/
484
485---------------------------- mod3.c -------------------------------------------
486
487#include "EXTERN.h"
488#include "perl.h"
489#include "XSUB.h"
490
491grok_oct();
492eval_pv();
493
494---------------------------- mod4.c -------------------------------------------
495
496#include "EXTERN.h"
497#include "perl.h"
498#include "XSUB.h"
499
500START_MY_CXT;
501
502---------------------------- mod5.c -------------------------------------------
503
504#include "EXTERN.h"
505#include "perl.h"
506#include "XSUB.h"
507
508#include "ppport.h"
509call_pv();
510
511---------------------------- main.xsr -----------------------------------------
512
513#include "EXTERN.h"
514#include "perl.h"
515#include "XSUB.h"
516
517#define NEED_eval_pv_GLOBAL
518#define NEED_grok_hex
519#define NEED_newCONSTSUB_GLOBAL
520#include "ppport.h"
521
522newCONSTSUB();
523grok_hex();
524grok_bin(foo, bar);
525
526/* some comment */
527
528eval_pv();
529grok_bin();
530grok_bin(bar, PL_sv_no);
531
532---------------------------- mod1.cr ------------------------------------------
533
534#include "EXTERN.h"
535#include "perl.h"
536#include "XSUB.h"
537
538#define NEED_grok_bin_GLOBAL
539#include "ppport.h"
540
541newCONSTSUB();
542grok_bin();
543{
544 Perl_croak (aTHX_ "foo");
545 Perl_sv_catpvf(aTHX); /* I know it's wrong ;-) */
546}
547
548---------------------------- mod2.cr ------------------------------------------
549
550#include "EXTERN.h"
551#include "perl.h"
552#include "XSUB.h"
553
554
555newSViv();
556
557/*
558 eval_pv();
559*/
560
561---------------------------- mod3.cr ------------------------------------------
562
563#include "EXTERN.h"
564#include "perl.h"
565#include "XSUB.h"
566#define NEED_grok_oct
567#include "ppport.h"
568
569grok_oct();
570eval_pv();
571
572---------------------------- mod4.cr ------------------------------------------
573
574#include "EXTERN.h"
575#include "perl.h"
576#include "XSUB.h"
577#include "ppport.h"
578
579START_MY_CXT;
580
581===============================================================================
582
583my $o = ppport(qw(--nochanges));
584ok($o =~ /Uses grok_hex/m);
585ok($o !~ /Looks good/m);
586
587$o = ppport(qw(--nochanges --compat-version=5.8.0));
588ok($o !~ /Uses grok_hex/m);
589ok($o =~ /Looks good/m);
590
591---------------------------- FooBar.xs ----------------------------------------
592
593grok_hex();
594
595===============================================================================
596
597my $o = ppport(qw(--nochanges));
598ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
599
4a582685 600$o = ppport(qw(--nochanges --compat-version=5.5.3));
601ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
602
603$o = ppport(qw(--nochanges --compat-version=5.005_03));
604ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
605
adfe19db 606$o = ppport(qw(--nochanges --compat-version=5.6.0));
607ok($o !~ /Uses SvPVutf8_force/m);
608
4a582685 609$o = ppport(qw(--nochanges --compat-version=5.006));
610ok($o !~ /Uses SvPVutf8_force/m);
611
612$o = ppport(qw(--nochanges --compat-version=5.999.999));
613ok($o !~ /Uses SvPVutf8_force/m);
614
615$o = ppport(qw(--nochanges --compat-version=6.0.0));
616ok($o =~ /Only Perl 5 is supported/m);
617
618$o = ppport(qw(--nochanges --compat-version=5.1000.999));
619ok($o =~ /Invalid version number: 5.1000.999/m);
620
621$o = ppport(qw(--nochanges --compat-version=5.999.1000));
622ok($o =~ /Invalid version number: 5.999.1000/m);
623
adfe19db 624---------------------------- FooBar.xs ----------------------------------------
625
626SvPVutf8_force();
627
96ad942f 628===============================================================================
629
630my $o = ppport(qw(--nochanges));
631ok($o !~ /potentially required change/);
4a582685 632ok(matches($o, '^Looks good', 'm'), 2);
96ad942f 633
634---------------------------- FooBar.xs ----------------------------------------
635
636#define NEED_grok_numeric_radix
637#define NEED_grok_number
638#include "ppport.h"
639
640GROK_NUMERIC_RADIX();
641grok_number();
642
643---------------------------- foo.c --------------------------------------------
644
645#include "ppport.h"
646
647call_pv();
648
4a582685 649===============================================================================
650
651# check --api-info option
652
653my $o = ppport(qw(--api-info=INT2PTR));
654my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
655ok(scalar keys %found, 1);
656ok(exists $found{INT2PTR});
657ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
658ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
659
660$o = ppport(qw(--api-info=Zero));
661%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
662ok(scalar keys %found, 1);
663ok(exists $found{Zero});
664ok(matches($o, '^No portability information available\.', 'm'), 1);
665
666$o = ppport(qw(--api-info=/Zero/));
667%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
668ok(scalar keys %found, 2);
669ok(exists $found{Zero});
670ok(exists $found{ZeroD});
671
672===============================================================================
673
674# check --list-provided option
675
676my @o = ppport(qw(--list-provided));
677my %p;
678my $fail = 0;
679for (@o) {
680 my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
681 exists $p{$name} and $fail++;
682 $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
683}
684ok(@o > 100);
685ok($fail, 0);
686
687ok(exists $p{call_sv});
688ok(not ref $p{call_sv});
689
690ok(exists $p{grok_bin});
691ok(ref $p{grok_bin}, 'HASH');
692ok(scalar keys %{$p{grok_bin}}, 1);
693ok($p{grok_bin}{explicit});
694
695ok(exists $p{gv_stashpvn});
696ok(ref $p{gv_stashpvn}, 'HASH');
697ok(scalar keys %{$p{gv_stashpvn}}, 1);
698ok($p{gv_stashpvn}{hint});
699
700ok(exists $p{sv_catpvf_mg});
701ok(ref $p{sv_catpvf_mg}, 'HASH');
702ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
703ok($p{sv_catpvf_mg}{explicit});
704ok($p{sv_catpvf_mg}{depend});
705
706===============================================================================
707
708# check --list-unsupported option
709
710my @o = ppport(qw(--list-unsupported));
711my %p;
712my $fail = 0;
713for (@o) {
714 my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
715 exists $p{$name} and $fail++;
716 $p{$name} = $ver;
717}
718ok(@o > 100);
719ok($fail, 0);
720
721ok(exists $p{utf8_distance});
722ok($p{utf8_distance}, '5.6.0');
723
724ok(exists $p{save_generic_svref});
725ok($p{save_generic_svref}, '5.005_03');
726
727===============================================================================
728
729# check --nofilter option
730
731my $o = ppport(qw(--nochanges));
732ok($o =~ /^Scanning.*foo\.cpp/mi);
733ok($o =~ /Analyzing.*foo\.cpp/mi);
734ok(matches($o, '^Scanning', 'm'), 1);
735ok(matches($o, 'Analyzing', 'm'), 1);
736
737$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
738ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
739ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
740ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
741ok($o =~ /^Scanning.*foo\.cpp/mi);
742ok($o =~ /Analyzing.*foo\.cpp/mi);
743ok(matches($o, '^Scanning', 'm'), 1);
744ok(matches($o, 'Analyzing', 'm'), 1);
745
746$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
747ok($o =~ /^Scanning.*foo\.cpp/mi);
748ok($o =~ /Analyzing.*foo\.cpp/mi);
749ok($o =~ /^Scanning.*foo\.o/mi);
750ok($o =~ /Analyzing.*foo\.o/mi);
751ok($o =~ /^Scanning.*Makefile/mi);
752ok($o =~ /Analyzing.*Makefile/mi);
753ok(matches($o, '^Scanning', 'm'), 3);
754ok(matches($o, 'Analyzing', 'm'), 3);
755
756---------------------------- foo.cpp ------------------------------------------
757
758newSViv();
759
760---------------------------- foo.o --------------------------------------------
761
762newSViv();
763
764---------------------------- Makefile.PL --------------------------------------
765
766newSViv();
767
0d0f8426 768===============================================================================
769
770# check if explicit variables are handled propery
771
772my $o = ppport(qw(--copy=a));
773ok($o =~ /^Needs to include.*ppport\.h/m);
774ok($o =~ /^Uses PL_signals/m);
775ok($o =~ /^File needs PL_signals, adding static request/m);
776ok(eq_files('MyExt.xsa', 'MyExt.ra'));
777
778unlink qw(MyExt.xsa);
779
780---------------------------- MyExt.xs -----------------------------------------
781
782PL_signals = 123;
783if (PL_signals == 42)
784 foo();
785
786---------------------------- MyExt.ra -----------------------------------------
787
788#define NEED_PL_signals
789#include "ppport.h"
790PL_signals = 123;
791if (PL_signals == 42)
792 foo();
793