#!perl use Config; my $coredir = $ENV{PERL_SRC} || "$Config{archlib}/CORE"; # XXX was installarchlib my $libdir = "$Config{prefix}/lib"; my $useshrplib = $Config{useshrplib}; my $linkargs; my $quiet++ if $ARGV[0] eq '-q'; shift if $quiet; my $debug++ if $ARGV[0] eq '-d'; shift if $debug; eval { require B::C::Flags; }; if (grep(/^-[cES]$/, @ARGV)) { # compile-only with -c -E or -S ; } elsif (grep(/^-Bdynamic$/, @ARGV)) { # force dynamic linking with -Bdynamic use ExtUtils::Embed; @ARGV = grep{ !/^-Bdynamic$/o } @ARGV; $linkargs = ldopts; } elsif (grep(/^-Bstatic$/, @ARGV)) { # force static linking with -Bstatic use ExtUtils::Embed; @ARGV = grep{ !/^-Bstatic$/o } @ARGV; $linkargs = ldopts("-std"); for my $lib ("$libdir/libperl.a", "$coredir/libperl.a") { if (-e $lib) { $linkargs =~ s|-lperl |$lib |; push @ARGV, ("$coredir/DynaLoader.o") if -e "$coredir/DynaLoader.o"; #$linkargs .= " $coredir/Win32CORE.o" if $^O eq 'cygwin' and -e "$coredir/Win32CORE.o"; last; } } } elsif (-e "$coredir/$Config{libperl}" and $Config{libperl} !~ /\.(dll|so)$/) { $linkargs = ldopts("-std"); } elsif ( $useshrplib and -e "$libdir/$Config{libperl}") { # debian: /usr/lib/libperl.so.5.10.1 and broken ExtUtils::Embed::ldopts use ExtUtils::Embed; $linkargs = ldopts('-std'); $linkargs =~ s|-lperl |$libdir/$Config{libperl} |; } elsif ( $useshrplib and -e "$coredir/$Config{libperl}") { # just help cygwin debugging use ExtUtils::Embed; $linkargs = ldopts('-std'); $linkargs =~ s|-lperl |$coredir/$Config{libperl} |; } else { # try dynamic lib if no static lib exists use ExtUtils::Embed; @ARGV = grep{ !/^-Bdynamic$/o } @ARGV; $linkargs = ldopts('-std'); } sub cc_harness_msvc { my @ARGV = @_; use ExtUtils::Embed (); my $obj = "${Output}.obj"; my $compile = ExtUtils::Embed::ccopts." -c -Fo$obj @ARGV "; my $link = "-out:$Output $obj"; $compile .= " -DHAVE_INDEPENDENT_COMALLOC " if $B::C::Flags::have_independent_comalloc; $compile .= $B::C::Flags::extra_cflags; $compile .= " -I".$_ for split /\s+/, opt(I); $link .= " -libpath:".$_ for split /\s+/, opt(L); # TODO: -shared,-static,-sharedxs,-staticxs if ($stash) { my @mods = split /-?u /, $stash; $link .= " ".ExtUtils::Embed::ldopts("-std", \@mods); } else { $link .= " ".ExtUtils::Embed::ldopts("-std"); } $link .= " perl5$Config{PERL_VERSION}.lib kernel32.lib msvcrt.lib"; $link .= $B::C::Flags::extra_libs; print "running $Config{cc} $compile" unless $quiet; system("$Config{cc} $compile"); print "running $Config{ld} $link" unless $quiet; system("$Config{ld} $link"); } if ($^O =~ m/^MSWin/ && $Config{cc} =~ m/^cl/i) { cc_harness_msvc(@ARGV); exit; } # ActivePerl 5.10.0.1004 claims to use MSVC6 but used MSVC8 #if ($Config::Config{ccversion} eq '12.0.8804' and $Config::Config{cc} eq 'cl') { # $linkargs =~ s/ -opt:ref,icf//; #} my $ccflags = $Config{ccflags}; if ($ccflags =~ /-fstack-protector/ and $linkargs =~ /-fstack-protector/) { $linkargs =~ s/-fstack-protector//; } #-pedantic -Wextra -Wconversion $ccflags .= " -ansi -Wall -Wshadow -Wcast-qual -Wwrite-strings" if $debug and $Config{cc} =~ /gcc/ and !$quiet; $ccflags .= " --no-warn -Wl,--warn-once" if $Config{cc} =~ /gcc/ and $quiet and $^O ne 'darwin'; $ccflags .= " -DHAVE_INDEPENDENT_COMALLOC" if $B::C::Flags::have_independent_comalloc; $ccflags .= $B::C::Flags::extra_cflags; $linkargs .= $B::C::Flags::extra_libs; my $cccmd = "$Config{cc} $ccflags -I$coredir @ARGV $linkargs"; print "$cccmd\n" unless $quiet; exec $cccmd;