Commit | Line | Data |
---|---|---|
68fd3ca5 TC |
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 | ||
68fd3ca5 TC |
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 | |
d8846a96 TC |
21 | use strict; |
22 | use warnings; | |
68fd3ca5 TC |
23 | use Config; |
24 | use File::Path 'rmtree'; | |
25 | use Cwd; | |
38321b6f | 26 | use IPC::Cmd qw(can_run); |
68fd3ca5 | 27 | |
38321b6f FP |
28 | if ($Config{'usecrosscompile'} && !can_run($Config{'cc'})) { |
29 | skip_all("compiler not available (cross-compiling)"); | |
30 | } else { | |
31 | plan(tests => 1); | |
32 | } | |
68fd3ca5 | 33 | |
5069e7f0 NC |
34 | my $VERBOSE = grep {$_ eq '-v'} @ARGV; |
35 | ||
68fd3ca5 TC |
36 | ok(try_compile_and_link(<<'CODE')); |
37 | #include "EXTERN.h" | |
38 | #include "perl.h" | |
39 | #include "XSUB.h" | |
40 | ||
41 | int main(int argc, char **argv) { | |
42 | return 0; | |
43 | } | |
44 | CODE | |
45 | ||
46 | ||
47 | # from Time::HiRes's Makefile.PL with minor modifications | |
48 | sub try_compile_and_link { | |
49 | my ($c, %args) = @_; | |
50 | ||
11dc1f92 | 51 | my $ld_exeext = ($^O eq 'cygwin' || $^O eq 'MSWin32' || |
68fd3ca5 TC |
52 | $^O eq 'os2' && $Config{ldflags} =~ /-Zexe\b/) ? '.exe' : |
53 | (($^O eq 'vos') ? $Config{exe_ext} : ''); | |
68fd3ca5 TC |
54 | |
55 | my ($ok) = 0; | |
56 | my $tempdir = tempfile(); | |
57 | my $cwd = getcwd(); | |
58 | mkdir $tempdir; | |
59 | chdir $tempdir; | |
60 | my ($tmp) = "temp"; | |
68fd3ca5 TC |
61 | |
62 | my $obj_ext = $Config{obj_ext} || ".o"; | |
68fd3ca5 | 63 | |
d8846a96 TC |
64 | if (open(my $tmpc, ">$tmp.c")) { |
65 | print $tmpc $c; | |
66 | unless (close($tmpc)) { | |
67 | chdir($cwd); | |
68 | rmtree($tempdir); | |
69 | warn "Failing closing code file: $!\n" if $VERBOSE; | |
70 | return 0; | |
68fd3ca5 TC |
71 | } |
72 | ||
d8846a96 | 73 | my $COREincdir = File::Spec->catdir(File::Spec->updir); |
68fd3ca5 TC |
74 | |
75 | my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir" | |
76 | . ' -DPERL_NO_INLINE_FUNCTIONS'; | |
77 | ||
11dc1f92 TC |
78 | if ($^O eq "MSWin32") { |
79 | $ccflags .= " -I../win32 -I../win32/include"; | |
80 | } | |
81 | ||
24ec451b SH |
82 | my $libs = ''; |
83 | ||
84 | # Include libs to be sure of linking against bufferoverflowU.lib for | |
85 | # the SDK2003 compiler on Windows. See win32/Makefile for more details. | |
86 | if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) { | |
87 | $libs = " /link $Config{'libs'}"; | |
88 | } | |
89 | ||
11dc1f92 TC |
90 | my $null = File::Spec->devnull; |
91 | ||
92 | my $errornull = $VERBOSE ? '' : ">$null 2>$null"; | |
93 | ||
128e8abd NC |
94 | # Darwin g++ 4.2.1 is fussy and demands a space. |
95 | # FreeBSD g++ 4.2.1 does not. | |
96 | # We do not know the reaction of either to the presence of brown M&Ms. | |
97 | my $out_opt = "-o "; | |
11dc1f92 TC |
98 | if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) { |
99 | $out_opt = "/Fe"; | |
100 | } | |
101 | ||
102 | my $tmp_exe = "$tmp$ld_exeext"; | |
d8846a96 | 103 | |
24ec451b | 104 | my $cccmd = "$Config{'cc'} $out_opt$tmp_exe $ccflags $tmp.c $libs $errornull"; |
d8846a96 | 105 | |
68fd3ca5 TC |
106 | if ($^O eq 'VMS') { |
107 | $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c"; | |
108 | } | |
109 | ||
68fd3ca5 | 110 | if ($^O eq 'VMS') { |
d8846a96 TC |
111 | open( my $cmdfile, ">$tmp.com" ); |
112 | print $cmdfile "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n"; | |
113 | print $cmdfile "\$ $cccmd\n"; | |
114 | print $cmdfile "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate | |
115 | close $cmdfile; | |
68fd3ca5 TC |
116 | system("\@ $tmp.com"); |
117 | $ok = $?==0; | |
118 | chdir($cwd); | |
119 | rmtree($tempdir); | |
68fd3ca5 TC |
120 | } |
121 | else | |
122 | { | |
68fd3ca5 TC |
123 | printf "cccmd = $cccmd\n" if $VERBOSE; |
124 | my $res = system($cccmd); | |
125 | $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _; | |
126 | ||
68fd3ca5 TC |
127 | chdir($cwd); |
128 | rmtree($tempdir); | |
68fd3ca5 TC |
129 | } |
130 | } | |
131 | ||
132 | return $ok; | |
133 | } |