File::Spec::VMS fixup for tmpdir from Craig Berry.
[p5sagit/p5-mst-13.2.git] / utils / perlcc.PL
index 99e9b51..f0636f6 100644 (file)
@@ -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;