Hi,
I spent the last day getting parrot running under Borland. The
attached patch is whats need to get linking and running make test on
both Windows/Borland and Linux/gcc. I'm not sure if its ready for
inclusion in the tree, but I want some feedback on the approach.
The main problem is that Borland can't build a single static library
(at least I did not find out) with two files of the same name. But
there are some name clashes: intlist.o and classes/intlist.o or
stacks.o and languages/imcc/stacks.o. I solved this by seperating
libparrot in three partial libs: classes/classes.a containing all
object-files of classes/ ; languages/imcc/imcc.a containing all
object-files of imcc and blib/lib/libparrot.a for all the rest. (This
names need cleanup; shouldn't they all go to blib/lib?). classes/ is
still build by its own Makefile, this should be integrated in the
root-Makefile, but thats another story.
Next problem is library interdependence. classes.a depends on
libparrot.a and libparrot.a depends on classes.a. This complicates
linking a bit. The gnu linker does not revisit previous files so the
link line has to contain something like
libparrot.a classes.a libparrot.a
A new configure variable parrot_libs takes care of this
Last Windows does no expansion of *.t. Adding glob expansion of ARGV
to t/harness lets make test work again on windows. (I think this part
of the patch can be applied right away because the Irresulte tinderbox
has the same problem)
Comments
b�
? icu/source/test
Index: config/gen/makefiles/classes.in
===================================================================
RCS file: /cvs/public/parrot/config/gen/makefiles/classes.in,v
retrieving revision 1.10
diff -u -r1.10 classes.in
--- config/gen/makefiles/classes.in 12 Sep 2003 21:30:42 -0000 1.10
+++ config/gen/makefiles/classes.in 14 Oct 2003 17:53:36 -0000
@@ -1,4 +1,5 @@
O = ${o}
+A = ${a}
RM_F = ${rm_f}
INC=../include/parrot
@@ -19,11 +20,18 @@
PERL = ${perl}
MAKE_F=${make}
PMC2C=$(PERL) pmc2c.pl
+AR_CR = ${ar} ${ar_flags}
+RANLIB = ${ranlib}
.c$(O):
$(CC) $(CFLAGS) ${cc_o_out}$@ -c $<
-all : $(O_FILES)
+all : classes$(A)
+
+classes$(A) : $(O_FILES)
+ $(RM_F) $@
+ $(AR_CR) ${ar_out}$@ ${ar_extra} $(O_FILES)
+ $(RANLIB) $@
${pmc_build}
Index: config/gen/makefiles/root.in
===================================================================
RCS file: /cvs/public/parrot/config/gen/makefiles/root.in,v
retrieving revision 1.146
diff -u -r1.146 root.in
--- config/gen/makefiles/root.in 14 Oct 2003 11:08:21 -0000 1.146
+++ config/gen/makefiles/root.in 14 Oct 2003 17:53:36 -0000
@@ -168,9 +168,8 @@
nci$(O) cpu_dep$(O) ${asmfun_o} tsq$(O) longopt$(O) events$(O) \
dynext$(O) utils$(O) vtables$(O) mmd$(O) extend$(O)
-O_FILES = $(INTERP_O_FILES) $(IO_O_FILES) $(CLASS_O_FILES) \
- $(ENCODING_O_FILES) $(CHARTYPE_O_FILES) \
- $(IMCC_O_FILES)
+O_FILES = $(INTERP_O_FILES) $(IO_O_FILES) \
+ $(ENCODING_O_FILES) $(CHARTYPE_O_FILES)
OPS_FILES = ${ops} $(GEN_OPSFILES)
@@ -205,7 +204,10 @@
TEST_PROG = ${test_prog}${exe}
TEST_PROG_SO = ${test_prog}_so${exe}
+PARROT_LIBS = ${parrot_libs}
LIBPARROT = ${blib_lib_libparrot_a}
+LIBCLASSES = classes/classes$(A)
+LIBIMCC = $(IMCC_DIR)/imcc$(A)
# utils
DIS=disassemble${exe}
PDUMP = pdump${exe}
@@ -255,8 +257,8 @@
mops : examples/assembly/mops${exe} examples/mops/mops${exe}
-$(TEST_PROG) : $(PARROT_MAIN)$(O) $(GEN_HEADERS) $(LIBPARROT) lib/Parrot/OpLib/core.pm
- $(LINK) ${ld_out}$(TEST_PROG) $(LINKFLAGS) $(PARROT_MAIN)$(O) $(LIBPARROT) $(C_LIBS)
+$(TEST_PROG) : $(PARROT_MAIN)$(O) $(GEN_HEADERS) $(LIBPARROT) $(LIBIMCC) $(LIBCLASSES) lib/Parrot/OpLib/core.pm
+ $(LINK) ${ld_out}$(TEST_PROG) $(LINKFLAGS) $(PARROT_MAIN)$(O) $(PARROT_LIBS) $(C_LIBS)
lib_deps_object : $(O_FILES)
$(PERL) tools/dev/lib_deps.pl object $(O_FILES)
@@ -338,8 +340,8 @@
pdb$(O) : $(GENERAL_H_FILES)
-$(PDB) : pdb$(O) $(LIBPARROT)
- $(LINK) ${ld_out}$(PDB) pdb$(O) $(LINKFLAGS) $(LIBPARROT) $(C_LIBS)
+$(PDB) : pdb$(O) $(LIBPARROT) $(LIBCLASSES)
+ $(LINK) ${ld_out}$(PDB) pdb$(O) $(LINKFLAGS) $(PARROT_LIBS) $(C_LIBS)
#
# Parrot Disassembler
@@ -347,20 +349,20 @@
disassemble$(O) : $(GENERAL_H_FILES)
-$(DIS) : disassemble$(O) $(LIBPARROT)
- $(LINK) ${ld_out}$(DIS) disassemble$(O) $(LINKFLAGS) $(LIBPARROT) $(C_LIBS)
+$(DIS) : disassemble$(O) $(LIBPARROT) $(LIBCLASSES)
+ $(LINK) ${ld_out}$(DIS) disassemble$(O) $(LINKFLAGS) $(PARROT_LIBS) $(C_LIBS)
#
# Parrot Dump
#
-$(PDUMP) : pdump$(O) packdump$(O) $(LIBPARROT)
- $(LINK) ${ld_out}$(PDUMP) pdump$(O) packdump$(O) $(LINKFLAGS) $(LIBPARROT) $(C_LIBS)
+$(PDUMP) : pdump$(O) packdump$(O) $(LIBPARROT) $(LIBCLASSES)
+ $(LINK) ${ld_out}$(PDUMP) pdump$(O) packdump$(O) $(LINKFLAGS) $(PARROT_LIBS) $(C_LIBS)
# pbc_info
-$(PINFO) : pbc_info$(O) $(LIBPARROT)
- $(LINK) ${ld_out}$(PINFO) pbc_info$(O) $(LINKFLAGS) $(LIBPARROT) $(C_LIBS)
+$(PINFO) : pbc_info$(O) $(LIBPARROT) $(LIBCLASSES)
+ $(LINK) ${ld_out}$(PINFO) pbc_info$(O) $(LINKFLAGS) $(PARROT_LIBS) $(C_LIBS)
###############################################################################
#
@@ -388,8 +390,8 @@
examples/assembly/mops.c : examples/assembly/mops.pbc pbc2c.pl
$(PERL) pbc2c.pl examples/assembly/mops.pbc > examples/assembly/mops.c
-examples/assembly/mops${exe} : examples/assembly/mops$(O) $(LIBPARROT)
- $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/mops${exe} examples/assembly/mops$(O) $(LIBPARROT) $(C_LIBS)
+examples/assembly/mops${exe} : examples/assembly/mops$(O) $(LIBPARROT) $(LIBCLASSES) $(LIBIMCC)
+ $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/mops${exe} examples/assembly/mops$(O) $(PARROT_LIBS) $(C_LIBS)
examples/assembly/life.pbc : examples/assembly/life.pasm
$(MAKE_C) examples/assembly life.pbc
@@ -397,8 +399,8 @@
examples/assembly/life.c : examples/assembly/life.pbc pbc2c.pl
$(PERL) pbc2c.pl examples/assembly/life.pbc > examples/assembly/life.c
-examples/assembly/life${exe} : examples/assembly/life$(O) $(LIBPARROT)
- $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/life${exe} examples/assembly/life$(O) $(LIBPARROT) $(C_LIBS)
+examples/assembly/life${exe} : examples/assembly/life$(O) $(LIBPARROT) $(LIBCLASSES) $(LIBIMCC)
+ $(LINK) $(LINKFLAGS) ${ld_out}examples/assembly/life${exe} examples/assembly/life$(O) $(PARROT_LIBS) $(C_LIBS)
###############################################################################
#
@@ -410,7 +412,7 @@
examples/mops/mops${exe} : examples/mops/mops$(O)
$(LINK) $(LINKFLAGS) ${ld_out}examples/mops/mops${exe} \
- examples/mops/mops$(O) $(LIBPARROT) $(C_LIBS)
+ examples/mops/mops$(O) $(PARROT_LIBS) $(C_LIBS)
###############################################################################
@@ -608,6 +610,10 @@
$(IMCC_O_FILES) : $(IMCC_H_FILES) $(ALL_H_FILES)
+$(LIBIMCC) : $(IMCC_O_FILES)
+ $(RM_RF) $@
+ $(AR_CR) ${ar_out}$@ ${ar_extra} $(IMCC_O_FILES)
+ $(RANLIB) $@
################ docs, test and maintainer targets
@@ -629,6 +635,7 @@
$(CLASS_O_FILES) : $(CLASS_PMC_FILES) $(NONGEN_HEADERS)
$(MAKE_C) classes
+$(LIBCLASSES) : $(CLASS_O_FILES)
###############################################################################
#
@@ -833,7 +840,7 @@
###############################################################################
exec : exec_start$(O) $(LIBPARROT)
- $(LINK) ${ld_out}$(EXEC) $(LINKFLAGS) $(EXEC)$(O) exec_start$(O) $(LIBPARROT) $(C_LIBS)
+ $(LINK) ${ld_out}$(EXEC) $(LINKFLAGS) $(EXEC)$(O) exec_start$(O) $(PARROT_LIBS) $(C_LIBS)
exec_so : exec_start$(O) blib/lib/libparrot$(SO)
$(LINK) ${ld_out}$(EXEC) $(LINKFLAGS) $(EXEC)$(O) exec_start$(O) -lparrot $(C_LIBS) -pthread
Index: config/init/data.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/data.pl,v
retrieving revision 1.15
diff -u -r1.15 data.pl
--- config/init/data.pl 2 Oct 2003 12:01:19 -0000 1.15
+++ config/init/data.pl 14 Oct 2003 17:53:36 -0000
@@ -63,6 +63,7 @@
# should we have a dependancy upon arc to generate .a's?
blib_lib_libparrot_a => 'blib/lib/libparrot$(A)',
+ parrot_libs => 'blib/lib/libparrot$(A) classes/classes$(A) blib/lib/libparrot$(A) languages/imcc/imcc$(A)',
perl => $^X,
test_prog => 'parrot',
Index: config/init/hints/mswin32.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/hints/mswin32.pl,v
retrieving revision 1.14
diff -u -r1.14 mswin32.pl
--- config/init/hints/mswin32.pl 2 Oct 2003 12:01:21 -0000 1.14
+++ config/init/hints/mswin32.pl 14 Oct 2003 17:53:36 -0000
@@ -63,7 +63,7 @@
a => '.lib',
so => '.dll',
cc => ${cc},
- ccflags => '-O2 -w-8066 -DWIN32 -DNO_STRICT -DNDEBUG -D_CONSOLE',
+ ccflags => '-q -O2 -w-8066 -DWIN32 -DNO_STRICT -DNDEBUG -D_CONSOLE',
cc_o_out => '-o',
cc_exe_out => '-e',
cc_debug => '-v',
@@ -83,7 +83,7 @@
ar => 'tlib',
ar_flags => '',
ar_out => '',
- ar_extra => '/au',
+ ar_extra => '/a',
slash => '\\',
make_and => "\n\t",
Index: lib/Parrot/Test.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/Test.pm,v
retrieving revision 1.46
diff -u -r1.46 Test.pm
--- lib/Parrot/Test.pm 2 Oct 2003 16:15:23 -0000 1.46
+++ lib/Parrot/Test.pm 14 Oct 2003 17:53:36 -0000
@@ -209,8 +209,8 @@
print SOURCE $source;
close SOURCE;
- my $libparrot = $PConfig{blib_lib_libparrot_a};
- $libparrot =~ s/\$\(A\)/$PConfig{a}/;
+ my $parrot_libs = "$PConfig{parrot_libs}";
+ $parrot_libs =~ s/\$\(A\)/$PConfig{a}/g;
my ($cmd, $exit_code);
$cmd = "$PConfig{cc} $PConfig{ccflags} $PConfig{cc_debug} -I./include -c " .
@@ -219,7 +219,7 @@
$Builder->diag("'$cmd' failed with exit code $exit_code") if $exit_code;
$cmd = "$PConfig{link} $PConfig{linkflags} $PConfig{ld_debug} $obj_f " .
- "$PConfig{ld_out}$exe_f $libparrot $PConfig{libs}";
+ "$PConfig{ld_out}$exe_f $parrot_libs $PConfig{libs}";
$exit_code = _run_command($cmd, 'STDOUT' => $build_f, 'STDERR' => $build_f);
$Builder->diag("'$cmd' failed with exit code $exit_code") if $exit_code;
Index: t/harness
===================================================================
RCS file: /cvs/public/parrot/t/harness,v
retrieving revision 1.14
diff -u -r1.14 harness
--- t/harness 28 Jan 2003 10:17:00 -0000 1.14
+++ t/harness 14 Oct 2003 17:53:36 -0000
@@ -19,5 +19,7 @@
@ARGV = grep $_ ne 'quick', @ARGV;
# Pass in a list of tests to run on the command line, else run all the tests.
-my @tests = @ARGV ? @ARGV : map { glob( "t/$_/*.t" ) } ( qw(src op pmc native_pbc) );
+my @tests = @ARGV
+ ? map { glob $_ } @ARGV
+ : map { glob( "t/$_/*.t" ) } qw(src op pmc native_pbc) ;
runtests(@tests);