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.
9 # See https://rt.perl.org/rt3/Ticket/Display.html?id=116989
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.
17 unshift @INC, ".." if -f "../TestInit.pm";
20 use TestInit qw(T A); # T is chdir to the top level, A makes paths absolute
24 use File::Path 'rmtree';
29 my $VERBOSE = grep {$_ eq '-v'} @ARGV;
31 ok(try_compile_and_link(<<'CODE'));
36 int main(int argc, char **argv) {
42 # from Time::HiRes's Makefile.PL with minor modifications
43 sub try_compile_and_link {
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} : '');
51 my $tempdir = tempfile();
57 my $obj_ext = $Config{obj_ext} || ".o";
59 if (open(my $tmpc, ">$tmp.c")) {
61 unless (close($tmpc)) {
64 warn "Failing closing code file: $!\n" if $VERBOSE;
68 my $COREincdir = File::Spec->catdir(File::Spec->updir);
70 my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
71 . ' -DPERL_NO_INLINE_FUNCTIONS';
73 if ($^O eq "MSWin32") {
74 $ccflags .= " -I../win32 -I../win32/include";
79 # Include libs to be sure of linking against bufferoverflowU.lib for
80 # the SDK2003 compiler on Windows. See win32/Makefile for more details.
81 if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) {
82 $libs = " /link $Config{'libs'}";
85 my $null = File::Spec->devnull;
87 my $errornull = $VERBOSE ? '' : ">$null 2>$null";
89 # Darwin g++ 4.2.1 is fussy and demands a space.
90 # FreeBSD g++ 4.2.1 does not.
91 # We do not know the reaction of either to the presence of brown M&Ms.
93 if ($^O eq "MSWin32" && $Config{cc} =~ /\bcl\b/i) {
97 my $tmp_exe = "$tmp$ld_exeext";
99 my $cccmd = "$Config{'cc'} $out_opt$tmp_exe $ccflags $tmp.c $libs $errornull";
102 $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c";
106 open( my $cmdfile, ">$tmp.com" );
107 print $cmdfile "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n";
108 print $cmdfile "\$ $cccmd\n";
109 print $cmdfile "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate
111 system("\@ $tmp.com");
118 printf "cccmd = $cccmd\n" if $VERBOSE;
119 my $res = system($cccmd);
120 $ok = defined($res) && $res == 0 && -s $tmp_exe && -x _;