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 15BEGIN { 16 require "./test.pl"; 17 unshift @INC, ".." if -f "../TestInit.pm"; 18} 19 20use TestInit qw(T A); # T is chdir to the top level, A makes paths absolute 21use strict; 22use warnings; 23use Config; 24use File::Path 'rmtree'; 25use Cwd; 26use IPC::Cmd qw(can_run); 27 28if ($Config{'usecrosscompile'} && !can_run($Config{'cc'})) { 29 skip_all("compiler not available (cross-compiling)"); 30} else { 31 plan(tests => 1); 32} 33 34my $VERBOSE = grep {$_ eq '-v'} @ARGV; 35 36ok(try_compile_and_link(<<'CODE')); 37#include "EXTERN.h" 38#include "perl.h" 39#include "XSUB.h" 40 41int main(int argc, char **argv) { 42 return 0; 43} 44CODE 45 46 47# from Time::HiRes's Makefile.PL with minor modifications 48sub try_compile_and_link { 49 my ($c, %args) = @_; 50 51 my $ld_exeext = ($^O eq 'cygwin' || $^O eq 'MSWin32' || 52 $^O eq 'os2' && $Config{ldflags} =~ /-Zexe\b/) ? '.exe' : 53 (($^O eq 'vos') ? $Config{exe_ext} : ''); 54 55 my ($ok) = 0; 56 my $tempdir = tempfile(); 57 my $cwd = getcwd(); 58 mkdir $tempdir; 59 chdir $tempdir; 60 my ($tmp) = "temp"; 61 62 my $obj_ext = $Config{obj_ext} || ".o"; 63 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; 71 } 72 73 my $COREincdir = File::Spec->catdir(File::Spec->updir); 74 75 my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir" 76 . ' -DPERL_NO_INLINE_FUNCTIONS'; 77 78 if ($^O eq "MSWin32") { 79 $ccflags .= " -I../win32 -I../win32/include"; 80 } 81 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 90 my $null = File::Spec->devnull; 91 92 my $errornull = $VERBOSE ? '' : ">$null 2>$null"; 93 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 "; 98 if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) { 99 $out_opt = "/Fe"; 100 } 101 102 my $tmp_exe = "$tmp$ld_exeext"; 103 104 my $cccmd = "$Config{'cc'} $out_opt$tmp_exe $ccflags $tmp.c $libs $errornull"; 105 106 if ($^O eq 'VMS') { 107 $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c"; 108 } 109 110 if ($^O eq 'VMS') { 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; 116 system("\@ $tmp.com"); 117 $ok = $?==0; 118 chdir($cwd); 119 rmtree($tempdir); 120 } 121 else 122 { 123 printf "cccmd = $cccmd\n" if $VERBOSE; 124 my $res = system($cccmd); 125 $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _; 126 127 chdir($cwd); 128 rmtree($tempdir); 129 } 130 } 131 132 return $ok; 133} 134