X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=utils%2Fperlcc.PL;h=f0636f62bd1b08bbb68a63b4516527b1bfa27270;hb=8c99d73ee7ce90de2561496f683f3850d1269e1d;hp=99e9b5185138058ff6169efae9824ebb468b7d72;hpb=9636a016720fa29929de1fb9fc4ead4cfbfc4af8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/utils/perlcc.PL b/utils/perlcc.PL index 99e9b51..f0636f6 100644 --- a/utils/perlcc.PL +++ b/utils/perlcc.PL @@ -2,6 +2,7 @@ use Config; use File::Basename qw(&basename &dirname); +use File::Spec; use Cwd; # List explicitly here the variables you want Configure to @@ -252,39 +253,47 @@ sub _createCode { my ( $backend, $generated_file, $file, $final_output ) = @_; my $return; + my $output_switch = "o"; + my $max_line_len = ''; local($") = " -I"; - open(GENFILE, "> $generated_file") || die "Can't open $generated_file: $!"; + if ($^O eq 'MSWin32' && $backend =~ /^CC?$/ && $Config{cc} =~ /^cl/i) { + $max_line_len = '-l2000,'; + } if ($backend eq "Bytecode") { require ByteLoader; + open(GENFILE, "> $generated_file") || die "Can't open $generated_file: $!"; + binmode GENFILE; print GENFILE "#!$^X\n" if @_ == 3; print GENFILE "use ByteLoader $ByteLoader::VERSION;\n"; - } + close(GENFILE); - close(GENFILE); + $output_switch ="a"; + } if (@_ == 3) # compiling a program { chmod $generated_file, 0777 & ~umask if $backend eq "Bytecode"; - + my $null=File::Spec->devnull; _print( "$^X -I@INC -MB::Stash -c $file\n", 36); - my $stash=`$^X -I@INC -MB::Stash -c $file 2>/dev/null|tail -1`; + my @stash=`$^X -I@INC -MB::Stash -c $file 2>$null`; + my $stash=$stash[-1]; chomp $stash; - _print( "$^X -I@INC -MO=$backend,$stash $file\n", 36); - $return = _run("$^X -I@INC -MO=$backend,$stash $file >> $generated_file", 9); + _print( "$^X -I@INC -MO=$backend,$max_line_len$stash $file\n", 36); + $return = _run("$^X -I@INC -MO=$backend,$max_line_len$stash,-$output_switch$generated_file $file", 9); $return; } else # compiling a shared object { _print( - "$^X -I@INC -MO=$backend,-m$final_output $file\n", 36); + "$^X -I@INC -MO=$backend,$max_line_len-m$final_output $file\n", 36); $return = - _run("$^X -I@INC -MO=$backend,-m$final_output $file >> $generated_file", 9); + _run("$^X -I@INC -MO=$backend,$max_line_len-m$final_output,-$output_switch$generated_file $file ", 9); $return; } } @@ -340,18 +349,21 @@ sub _ccharness my $sourceprog = shift(@args); my ($libdir, $incdir); + my $L = '-L'; + $L = '-libpath:' if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i; + if (-d "$Config{installarchlib}/CORE") { - $libdir = "-L$Config{installarchlib}/CORE"; + $libdir = "$L$Config{installarchlib}/CORE"; $incdir = "-I$Config{installarchlib}/CORE"; } else { - $libdir = "-L.. -L."; + $libdir = "$L.. $L."; $incdir = "-I.. -I."; } - $libdir .= " -L$options->{L}" if (defined($options->{L})); + $libdir .= " $L$options->{L}" if (defined($options->{L})); $incdir .= " -I$options->{L}" if (defined($options->{L})); my $linkargs = ''; @@ -362,19 +374,32 @@ sub _ccharness if (!grep(/^-[cS]$/, @args)) { my $lperl = $^O eq 'os2' ? '-llibperl' - : $^O eq 'MSWin32' ? "$Config{archlibexp}\\CORE\\perl.lib" + : $^O eq 'MSWin32' ? "$Config{archlibexp}\\CORE\\$Config{libperl}" : '-lperl'; + ($lperl = $Config{libperl}) =~ s/lib(.*)\Q$Config{_a}\E/-l$1/ + if($^O eq 'cygwin'); $optimize = $Config{'optimize'} =~ /-O\d/ ? '' : $Config{'optimize'}; $flags = $type eq 'dynamic' ? $Config{lddlflags} : $Config{ldflags}; $linkargs = "$flags $libdir $lperl @Config{libs}"; + $linkargs = "/link $linkargs" if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i; } my $libs = _getSharedObjects($sourceprog); + @$libs = grep { !(/DynaLoader\.a$/ && ($dynaloader = $_)) } @$libs + if($^O eq 'cygwin'); + + my $args = "@args"; + if ($^O eq 'MSWin32' && $Config{cc} =~ /^bcc/i) { + # BC++ cmd line syntax does not allow space between -[oexz...] and arg + $args =~ s/(^|\s+)-([oe])\s+/$1-$2/g; + } - my $cccmd = "$Config{cc} $Config{ccflags} $optimize $incdir " - ."@args $dynaloader $linkargs @$libs"; + my $ccflags = $Config{ccflags}; + $ccflags .= ' -DUSEIMPORTLIB' if $^O eq 'cygwin'; + my $cccmd = "$Config{cc} $ccflags $optimize $incdir " + ."$args $dynaloader $linkargs @$libs"; _print ("$cccmd\n", 36); _run("$cccmd", 18 ); @@ -390,17 +415,8 @@ sub _getSharedObjects my ($tmpprog); ($tmpprog = $sourceprog) =~ s"(.*)[\\/](.*)"$2"; - my $tempdir; + my $tempdir= File::Spec->tmpdir; - if ($Config{'osname'} eq 'MSWin32') - { - $tempdir = $ENV{TEMP}; - $tempdir =~ s[\\][/]g; - } - else - { - $tempdir = "/tmp"; - } $tmpfile = "$tempdir/$tmpprog.tst"; $incfile = "$tempdir/$tmpprog.val"; @@ -474,12 +490,13 @@ sub _lookforAuto my ($relabs, $relshared); my ($prefix); my $return; - + my $sharedextension = $^O =~ /MSWin32|cygwin|os2/i + ? $Config{_a} : ".$Config{so}"; ($prefix = $file) =~ s"(.*)\.pm"$1"; my ($tmp, $modname) = ($prefix =~ m"(?:(.*)[\\/]){0,1}(.*)"s); - $relshared = "$pathsep$prefix$pathsep$modname.$Config{so}"; + $relshared = "$pathsep$prefix$pathsep$modname$sharedextension"; $relabs = "$pathsep$prefix$pathsep$modname$Config{_a}"; # HACK . WHY DOES _a HAVE A '.' # AND so HAVE NONE?? @@ -614,7 +631,7 @@ sub _checkopts one file the names clash)\n"); } - if ($options->{'e'} && ($options->{'sav'} || $options->{'gen'}) && ò0 + if ($options->{'e'} && ($options->{'sav'} || $options->{'gen'}) && !$options->{'C'}) { push(@errors, @@ -766,7 +783,7 @@ sub _run sub _interruptrun { my ($command) = @_; - my $pid = open (FD, "$command 2|"); + my $pid = open (FD, "$command |"); local($SIG{HUP}) = sub { # kill 9, $pid + 1;