cc_harness 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!perl
  2. use Config;
  3. my $coredir = $ENV{PERL_SRC} || "$Config{archlib}/CORE"; # XXX was installarchlib
  4. my $libdir = "$Config{prefix}/lib";
  5. my $useshrplib = $Config{useshrplib};
  6. my $libs = $Config{libs};
  7. my $linkargs;
  8. my $quiet++ if $ARGV[0] eq '-q';
  9. shift if $quiet;
  10. my $debug++ if $ARGV[0] eq '-d';
  11. shift if $debug;
  12. eval { require B::C::Flags; };
  13. if (grep(/^-[cES]$/, @ARGV)) { # compile-only with -c -E or -S
  14. ;
  15. } elsif (grep(/^-Bdynamic$/, @ARGV)) { # force dynamic linking with -Bdynamic
  16. use ExtUtils::Embed;
  17. @ARGV = grep{ !/^-Bdynamic$/o } @ARGV;
  18. $linkargs = ldopts;
  19. } elsif (grep(/^-Bstatic$/, @ARGV)) { # force static linking with -Bstatic
  20. use ExtUtils::Embed;
  21. @ARGV = grep{ !/^-Bstatic$/o } @ARGV;
  22. $linkargs = ldopts("-std");
  23. for my $lib ("$libdir/libperl.a", "$coredir/libperl.a") {
  24. if (-e $lib) {
  25. $linkargs =~ s|-lperl |$lib |;
  26. push @ARGV, ("$coredir/DynaLoader.o") if -e "$coredir/DynaLoader.o";
  27. #$linkargs .= " $coredir/Win32CORE.o" if $^O eq 'cygwin' and -e "$coredir/Win32CORE.o";
  28. last;
  29. }
  30. }
  31. } elsif (-e "$coredir/$Config{libperl}" and $Config{libperl} !~ /\.(dll|so)$/) {
  32. $linkargs = ldopts("-std");
  33. } elsif ( $useshrplib and -e "$libdir/$Config{libperl}") {
  34. # debian: /usr/lib/libperl.so.5.10.1 and broken ExtUtils::Embed::ldopts
  35. use ExtUtils::Embed;
  36. $linkargs = ldopts('-std');
  37. $linkargs =~ s|-lperl |$libdir/$Config{libperl} |;
  38. } elsif ( $useshrplib and -e "$coredir/$Config{libperl}") {
  39. # just help cygwin debugging
  40. use ExtUtils::Embed;
  41. $linkargs = ldopts('-std');
  42. $linkargs =~ s|-lperl |$coredir/$Config{libperl} |;
  43. } else { # try dynamic lib if no static lib exists
  44. use ExtUtils::Embed;
  45. @ARGV = grep{ !/^-Bdynamic$/o } @ARGV;
  46. $linkargs = ldopts('-std');
  47. }
  48. # Note (probably harmless): No library found for -lnsl
  49. $linkargs = $B::C::Flags::extra_libs . " " . $linkargs;
  50. $linkargs .= " $libs" if index($linkargs,$libs) == -1;
  51. sub cc_harness_msvc {
  52. my @ARGV = @_;
  53. use ExtUtils::Embed ();
  54. my $obj = "${Output}.obj";
  55. my $compile = ExtUtils::Embed::ccopts." -c -Fo$obj @ARGV ";
  56. my $link = "-out:$Output $obj";
  57. $compile .= " -DHAVE_INDEPENDENT_COMALLOC " if $B::C::Flags::have_independent_comalloc;
  58. $compile .= $B::C::Flags::extra_cflags;
  59. $compile .= " -I".$_ for split /\s+/, opt(I);
  60. $link .= " -libpath:".$_ for split /\s+/, opt(L);
  61. # TODO: -shared,-static,-sharedxs,-staticxs
  62. $link .= $B::C::Flags::extra_libs;
  63. if ($stash) {
  64. my @mods = split /-?u /, $stash;
  65. $link .= " ".ExtUtils::Embed::ldopts("-std", \@mods);
  66. } else {
  67. $link .= " ".ExtUtils::Embed::ldopts("-std");
  68. }
  69. $link .= " perl5$Config{PERL_VERSION}.lib kernel32.lib msvcrt.lib";
  70. print "running $Config{cc} $compile" unless $quiet;
  71. system("$Config{cc} $compile");
  72. print "running $Config{ld} $link" unless $quiet;
  73. system("$Config{ld} $link");
  74. }
  75. if ($^O =~ m/^MSWin/ && $Config{cc} =~ m/^cl/i) {
  76. cc_harness_msvc(@ARGV);
  77. exit;
  78. }
  79. # ActivePerl 5.10.0.1004 claims to use MSVC6 but used MSVC8
  80. #if ($Config::Config{ccversion} eq '12.0.8804' and $Config::Config{cc} eq 'cl') {
  81. # $linkargs =~ s/ -opt:ref,icf//;
  82. #}
  83. my $ccflags = $Config{ccflags};
  84. if ($ccflags =~ /-fstack-protector/ and $linkargs =~ /-fstack-protector/) {
  85. $linkargs =~ s/-fstack-protector//;
  86. }
  87. #-pedantic -Wextra -Wconversion
  88. $ccflags .= " -ansi -Wall -Wshadow -Wcast-qual -Wwrite-strings"
  89. if $debug and $Config{cc} =~ /gcc/ and !$quiet;
  90. $ccflags .= " --no-warn -Wl,--warn-once"
  91. if $Config{cc} =~ /gcc/ and $quiet and $^O ne 'darwin';
  92. $ccflags .= " -DHAVE_INDEPENDENT_COMALLOC" if $B::C::Flags::have_independent_comalloc;
  93. $ccflags .= $B::C::Flags::extra_cflags;
  94. my $cccmd = "$Config{cc} $ccflags -I$coredir @ARGV $linkargs";
  95. print "$cccmd\n" unless $quiet;
  96. exec $cccmd;