#!perl
use Config;

my $coredir = $ENV{PERL_SRC} || "$Config{installarchlib}/CORE";
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;
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 ( -e "$coredir/$Config{libperl}" and $Config{libperl} !~ /\.(dll|so)$/ ) {
    # prefer static linkage manually, without broken ExtUtils::Embed 
    $linkargs = sprintf("%s $coredir/$Config{libperl} %s",
		        @Config{qw(ldflags libs)});
} 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} |;
} 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};
$ccflags .= " -ansi -pedantic -Wall -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings"
  if $debug and $Config{cc} =~ /gcc/;
$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;
