this patch adds support for the freely availabe borland c++ 5.5.1 compiler
depends on:
- josh's patch to remove ssize_t from CPrederef.pm
- working borland compiler (compiler must know where to find headers and libs)
- Perl's Config.pm modified to use cc='bcc32.exe' not of cc='cl.exe'
- a working make utility (borland make doesn't work, nmake does)
changes:
- add bcc in hints/mswin32.pl
- clean up for msvc++ in hints/mswin32.pl
- remove a space from Configure.pl (very very important for bcc)
- add a O_BINARY flag to open() in pdump.c, embed.c (required by bcc)
- define O_BINARY 0 when it's not defined (win32 knows it, linux not)
and the why:
- parrot is MUCH faster when compiled with borland c (make test on p2-450, 320MB):
* msvc++: 313 seconds
* bcc: 251 seconds
Index: Configure.pl
===================================================================
RCS file: /cvs/public/parrot/Configure.pl,v
retrieving revision 1.92
diff -u -r1.92 Configure.pl
--- Configure.pl 15 Feb 2002 23:20:31 -0000 1.92
+++ Configure.pl 20 Feb 2002 23:05:29 -0000
@@ -876,7 +876,7 @@
sub compiletestc {
my ($name) = @_;
- my $cmd = "$c{cc} $c{ccflags} -I./include -c $c{ld_out} $name$c{o} $name.c";
+ my $cmd = "$c{cc} $c{ccflags} -I./include -c $c{ld_out}$name$c{o} $name.c";
system($cmd) and die "C compiler died! Command was '$cmd'\n";
$cmd = "$c{ld} $c{ldflags} $name$c{o} $c{cc_exe_out}$name$c{exe} $c{libs}";
Index: embed.c
===================================================================
RCS file: /cvs/public/parrot/embed.c,v
retrieving revision 1.11
diff -u -r1.11 embed.c
--- embed.c 18 Feb 2002 08:26:03 -0000 1.11
+++ embed.c 20 Feb 2002 23:05:30 -0000
@@ -96,7 +96,7 @@
return NULL;
}
- fd = open(filename, O_RDONLY);
+ fd = open(filename, O_RDONLY | O_BINARY);
if (!fd) {
fprintf(stderr, "Parrot VM: Can't open %s, code %i.\n", filename, errno);
return NULL;
Index: pdump.c
===================================================================
RCS file: /cvs/public/parrot/pdump.c,v
retrieving revision 1.10
diff -u -r1.10 pdump.c
--- pdump.c 18 Feb 2002 08:26:03 -0000 1.10
+++ pdump.c 20 Feb 2002 23:05:30 -0000
@@ -30,7 +30,7 @@
printf("can't stat %s, code %i\n", argv[1], errno);
return 1;
}
- fd = open(argv[1], O_RDONLY);
+ fd = open(argv[1], O_RDONLY | O_BINARY);
if (!fd) {
printf("Can't open, error %i\n", errno);
return 1;
Index: hints/mswin32.pl
===================================================================
RCS file: /cvs/public/parrot/hints/mswin32.pl,v
retrieving revision 1.9
diff -u -r1.9 mswin32.pl
--- hints/mswin32.pl 31 Jan 2002 21:46:43 -0000 1.9
+++ hints/mswin32.pl 20 Feb 2002 23:05:30 -0000
@@ -1,6 +1,7 @@
{
my $is_msvc = grep { $c{cc} eq $_ } ( qw(cl cl.exe) );
my $is_mingw = grep { $c{cc} eq $_ } ( qw(gcc gcc.exe) );
+ my $is_bcc = grep { $c{cc} eq $_ } ( qw(bcc32 bcc32.exe) );
$c{rm_f} = '$(PERL) -MExtUtils::Command -e rm_f';
$c{rm_rf} = '$(PERL) -MExtUtils::Command -e rm_rf';
@@ -9,8 +10,6 @@
$c{o} = '.obj';
$c{cc_o_out} = '-Fo';
$c{cc_exe_out} = '-Fe';
- $c{ld_out} = '/OUT:';
- $c{cc_ldflags} = '/link';
$c{cc_ldflags} = '/link';
$c{cc_debug} = '-Zi';
$c{ld_debug} = '-debug';
@@ -27,6 +26,25 @@
# The logo gets printed to STDERR; hence the redirection.
my $cc_output = `$c{cc} 2>&1`;
$c{ccflags} =~ s/-O1 // if $cc_output =~ m/Standard/;
+ }
+ if( $is_bcc ) {
+ $c{o} = '.obj';
+ $c{ccflags} = '-O2 -w-8066 -DWIN32 -DNO_STRICT -DNDEBUG -D_CONSOLE';
+ $c{cc_o_out} = '-o';
+ $c{cc_exe_out} = '-e';
+ $c{cc_debug} = '-v';
+
+ $c{ld} = 'bcc32.exe';
+ $c{ldflags} = '';
+ $c{ld_out} = '-e';
+ $c{cc_ldflags} = '';
+ $c{ld_debug} = '-v';
+ $c{ld_shard} = '-WD';
+ $c{libs} = 'import32.lib cw32.lib';
+
+ $c{platform} = 'win32';
+ $c{cp} = 'copy';
+ $c{slash} = '\\';
}
elsif( $is_mingw ) {
$c{ld} = 'gcc';
Index: include/parrot/parrot.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/parrot.h,v
retrieving revision 1.26
diff -u -r1.26 parrot.h
--- include/parrot/parrot.h 18 Feb 2002 08:26:10 -0000 1.26
+++ include/parrot/parrot.h 20 Feb 2002 23:05:30 -0000
@@ -92,6 +92,12 @@
#endif
#endif
+/* On Win32 we need the constant O_BINARY for open() (at least for Borland C),
+ but on UNIX it doesn't exist, so set it to 0 if it's not defined
+ */
+#ifndef O_BINARY
+ #define O_BINARY 0
+#endif
/* define a macro to acknowledge an unused argument, and silence a "helpful"
compiler warning. gcc will emit a warning on an empty if body unless {} is