Add a "verbose" option to t/porting/extrefs.t for debugging.
[perl.git] / t / porting / extrefs.t
1 #!./perl -w
2
3 # What does this test?
4 # Test that changes to perl header files don't cause external
5 # references by simplying #including them.  This breaks library probe
6 # code on CPAN, and can break cflags.SH.
7 #
8 # Why do we test this?
9 # See https://rt.perl.org/rt3/Ticket/Display.html?id=116989
10 #
11 # It's broken - how do I fix it?
12 # You added an initializer or static function to a header file that
13 # references some symbol you didn't define, you need to remove it.
14
15 BEGIN {
16   require "./test.pl";
17   unshift @INC, ".." if -f "../TestInit.pm";
18 }
19
20 use TestInit qw(T A); # T is chdir to the top level, A makes paths absolute
21 use strict;
22 use warnings;
23 use Config;
24 use File::Path 'rmtree';
25 use Cwd;
26
27 plan(tests => 1);
28
29 my $VERBOSE = grep {$_ eq '-v'} @ARGV;
30
31 ok(try_compile_and_link(<<'CODE'));
32 #include "EXTERN.h"
33 #include "perl.h"
34 #include "XSUB.h"
35
36 int main(int argc, char **argv) {
37   return 0;
38 }
39 CODE
40
41
42 # from Time::HiRes's Makefile.PL with minor modifications
43 sub try_compile_and_link {
44     my ($c, %args) = @_;
45
46     my $ld_exeext = ($^O eq 'cygwin' || $^O eq 'MSWin32' ||
47                  $^O eq 'os2' && $Config{ldflags} =~ /-Zexe\b/) ? '.exe' :
48                 (($^O eq 'vos') ? $Config{exe_ext} : '');
49
50     my ($ok) = 0;
51     my $tempdir = tempfile();
52     my $cwd = getcwd();
53     mkdir $tempdir;
54     chdir $tempdir;
55     my ($tmp) = "temp";
56
57     my $obj_ext = $Config{obj_ext} || ".o";
58
59     if (open(my $tmpc, ">$tmp.c")) {
60         print $tmpc $c;
61         unless (close($tmpc)) {
62             chdir($cwd);
63             rmtree($tempdir);
64             warn "Failing closing code file: $!\n" if $VERBOSE;
65             return 0;
66         }
67
68         my $COREincdir = File::Spec->catdir(File::Spec->updir);
69
70         my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
71          . ' -DPERL_NO_INLINE_FUNCTIONS';
72
73         if ($^O eq "MSWin32") {
74             $ccflags .= " -I../win32 -I../win32/include";
75         }
76
77         my $null = File::Spec->devnull;
78
79         my $errornull = $VERBOSE ? '' : ">$null 2>$null";
80
81         my $out_opt = "-o";
82         if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) {
83             $out_opt = "/Fe";
84         }
85
86         my $tmp_exe = "$tmp$ld_exeext";
87
88         my $cccmd = "$Config{'cc'} $out_opt$tmp_exe $ccflags $tmp.c $errornull";
89
90         if ($^O eq 'VMS') {
91             $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c";
92         }
93
94        if ($^O eq 'VMS') {
95             open( my $cmdfile, ">$tmp.com" );
96             print $cmdfile "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n";
97             print $cmdfile "\$ $cccmd\n";
98             print $cmdfile "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate
99             close $cmdfile;
100             system("\@ $tmp.com");
101             $ok = $?==0;
102             chdir($cwd);
103             rmtree($tempdir);
104         }
105         else
106         {
107             printf "cccmd = $cccmd\n" if $VERBOSE;
108             my $res = system($cccmd);
109             $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _;
110
111             chdir($cwd);
112             rmtree($tempdir);
113         }
114     }
115
116     return $ok;
117 }