integrate cfgperl contents into mainline
[p5sagit/p5-mst-13.2.git] / utils / perlcc.PL
index a585580..f0636f6 100644 (file)
@@ -253,20 +253,27 @@ 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   
     {
@@ -277,16 +284,16 @@ sub _createCode
        my $stash=$stash[-1];
         chomp $stash;
 
-        _print( "$^X -I@INC -MO=$backend,$stash $file\n", 36);
-        $return =  _run("$^X -I@INC -MO=$backend,$stash,-o$generated_file $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,-o$generated_file $file  ", 9);
+        _run("$^X -I@INC -MO=$backend,$max_line_len-m$final_output,-$output_switch$generated_file $file  ", 9);
         $return;
     }
 }
@@ -342,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 = '';
@@ -364,21 +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 $ccflags = $Config{ccflags};
-    $ccflags .= ' -DUSEIMPORTLIB' if $Config{osname} =~ /cygwin/i;
+    $ccflags .= ' -DUSEIMPORTLIB' if $^O eq 'cygwin';
     my $cccmd = "$Config{cc} $ccflags $optimize $incdir "
-               ."@args $dynaloader $linkargs @$libs";
+               ."$args $dynaloader $linkargs @$libs";
 
     _print ("$cccmd\n", 36);
     _run("$cccmd", 18 );