On Dec-03, Leopold Toetsch wrote:
> # New Ticket Created by Leopold Toetsch
> # Please include the string: [perl #18832]
> # in the subject line of all future correspondence about this issue.
> # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=18832 >
>
>
> Attached patch tries to append building libnci$(SO) to the test_prep
> target. I don't know the status of building (or trying to build) shared
> libs on different platforms, so I didn't check it in.
> It needs definitely work to integrate libnci.def for msvc.
Here's a messier but somewhat more complete patch which also moves the
shared libs to blib/lib. This works for me on both gcc/linux/i386 and
gcc/darwin/ppc. It uses perl5's cccdlflags to build the shared
library, which might actually work other places. Still no *.def
support, though.
I hope I didn't mess up this patch. It contains some new files in
nonexistent directories, and I don't want to cvs add them because then
they'd never go away. So I manually appended a diff with /dev/null
instead.
Index: config/gen/makefiles/root.in
===================================================================
RCS file: /cvs/public/parrot/config/gen/makefiles/root.in,v
retrieving revision 1.62
diff -a -u -r1.62 root.in
--- config/gen/makefiles/root.in 12 Dec 2002 11:21:06 -0000 1.62
+++ config/gen/makefiles/root.in 16 Dec 2002 05:14:10 -0000
@@ -133,6 +133,8 @@
C_LIBS = ${libs}
CC = ${cc}
+CC_SHARED = ${cc}
+CC_SHARED_FLAGS = ${cccdlflags}
PERL = ${perl}
@@ -167,9 +169,14 @@
${make_set_make}
+.SUFFIXES: .c .o .so
+
.c$(O) :
$(CC) $(CFLAGS) ${cc_o_out}$@ -c $<
+.c$(SO) :
+ $(CC_SHARED) $(CFLAGS) $(CC_SHARED_FLAGS) ${cc_o_out}$@ -c $<
+
all : $(TEST_PROG) docs
mops : examples/assembly/mops${exe} examples/mops/mops${exe}
@@ -200,7 +207,7 @@
blib/lib : blib
-mkdir blib${slash}lib
-shared : $(GEN_HEADERS) blib/lib blib/lib/libparrot$(SO) ${blib_lib_libparrot_a}
+shared : $(GEN_HEADERS) blib/lib blib/lib/libparrot$(SO) ${parrot_static_lib}
# XXX Unix-only for now
blib/lib/libparrot$(A) : blib/lib $(O_DIRS) $(O_FILES)
@@ -208,11 +215,14 @@
$(RANLIB) $@
blib/lib/libparrot$(SO) : blib/lib $(O_DIRS) $(O_FILES)
- $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS)
$(LD_OUT)blib/lib/libparrot$(SO) $(O_FILES) $(C_LIBS)
+ $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS)
+$(LD_OUT)blib${slash}lib${slash}libparrot$(SO) $(O_FILES) $(C_LIBS)
$(TEST_PROG_SO) : test_main$(O) blib/lib/libparrot$(SO) lib/Parrot/OpLib/core.pm
$(LINK) $(LINKFLAGS) $(LD_OUT)$(TEST_PROG) test_main$(O)
blib/lib/libparrot$(A) $(C_LIBS)
+blib/lib/libnci$(SO) : nci_test$(SO)
+ $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS) $(LD_OUT)${nci_shared_lib}
+nci_test$(SO) $(C_LIBS)
+
# XXX The dependancies on SO.MAJOR.MINOR and SO.VERSION are removed
# because those should be done at "make install" and not "make shared"
# It also makes the task of getting this working on win32 much easier. :)
@@ -324,7 +334,7 @@
examples/mops/mops${exe} : examples/mops/mops$(O)
$(LINK) $(LINKFLAGS) ${ld_out}examples/mops/mops${exe} \
- examples/mops/mops$(O) blib/lib/libparrot$(A) $(C_LIBS)
+ examples/mops/mops$(O) ${parrot_static_lib} $(C_LIBS)
###############################################################################
@@ -511,12 +521,12 @@
$(PERL) t/harness $(EXTRA_TEST_ARGS) -g $(TEST_PROG_ARGS) quick
# Common prep for all test targets
-test_prep : ${blib_lib_libparrot_a} assemble.pl
+test_prep : ${parrot_static_lib} ${nci_shared_lib} assemble.pl
test_dummy :
$(PERL) t/harness $(EXTRA_TEST_ARGS) $(TEST_PROG_ARGS)
-testp : $(TEST_PROG) test_prep blib/lib/libcore_prederef$(SO) blib/lib/libparrot$(SO)
$(TEST_PROG_SO) test_dummy_p
+testp : $(TEST_PROG) test_prep blib/lib/libcore_prederef$(SO) ${parrot_shared_lib}
+$(TEST_PROG_SO) test_dummy_p
test_dummy_p :
$(PERL) t/harness $(EXTRA_TEST_ARGS) $(TEST_PROG_ARGS) -P
Index: config/init/data.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/data.pl,v
retrieving revision 1.9
diff -a -u -r1.9 data.pl
--- config/init/data.pl 13 Dec 2002 15:11:24 -0000 1.9
+++ config/init/data.pl 16 Dec 2002 05:14:10 -0000
@@ -24,6 +24,7 @@
# (Usually cc or cl, or something like that.)
cc => $Config{cc},
ccflags => $Config{ccflags},
+ cccdlflags => $Config{cccdlflags},
# Linker, used to link object files (plus libraries) into
# an executable. It is usually $cc on Unix-ish systems.
@@ -61,6 +62,9 @@
# should we have a dependancy upon arc to generate .a's?
blib_lib_libparrot_a => 'blib/lib/libparrot$(A)',
+ parrot_static_lib => 'blib/lib/libparrot$(A)',
+ parrot_shared_lib => 'blib/lib/libparrot$(SO)',
+ nci_shared_lib => 'blib/lib/libnci$(SO)',
perl => $^X,
test_prog => 'parrot',
Index: t/pmc/nci.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/nci.t,v
retrieving revision 1.5
diff -a -u -r1.5 nci.t
--- t/pmc/nci.t 15 Dec 2002 07:05:46 -0000 1.5
+++ t/pmc/nci.t 16 Dec 2002 05:14:10 -0000
@@ -3,11 +3,11 @@
use Parrot::Config;
SKIP: {
-if ($PConfig{jitcpuarch} eq 'i386' && -e "libnci" . $PConfig{so}) {
- $ENV{LD_LIBRARY_PATH} = '.';
+if (-e "blib/lib/libnci" . $PConfig{so}) {
+ $ENV{LD_LIBRARY_PATH} = 'blib/lib';
}
else {
- skip('needs jit/i386 and libnci'.$PConfig{so},
+ skip('needs blib/lib/libnci'.$PConfig{so},
Test::Builder->expected_tests());
}
--- /dev/null Thu Apr 11 07:25:15 2002
+++ config/auto/varargs.pl Sun Dec 15 00:22:50 2002
@@ -0,0 +1,24 @@
+package Configure::Step;
+
+use strict;
+use vars qw($description @args);
+use Parrot::Configure::Step ':auto';
+
+$description="Determining how to access va_list...";
+
+sub runstep {
+ my $method = "unknown";
+ cc_gen('config/auto/varargs/test_c.in');
+ cc_build();
+ $method = "direct" if (cc_run_capture(1) =~ /yes/);
+ $method = "address" if (cc_run_capture(2) =~ /yes/);
+ cc_clean();
+
+ if ($method eq "unknown") {
+ die "Can't determine how to get a ptr to a va_list!\n";
+ }
+
+ Configure::Data->set(va_list_ptr => $method);
+}
+
+1;
--- /dev/null Thu Apr 11 07:25:15 2002
+++ config/auto/varargs/test_c.in Sun Dec 15 00:19:10 2002
@@ -0,0 +1,61 @@
+/*
+ * testvarargs.c - figure out how to get a pointer to a va_list
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#define UNKNOWN 0
+#define ADDRESS_OF 1
+#define DIRECT 2
+
+int
+test_address(int first_arg, ...)
+{
+ va_list args;
+ va_list* ptr;
+ int value;
+ va_start(args, first_arg);
+ ptr = (va_list*) &args;
+ value = va_arg(*ptr, int);
+ va_end(args);
+ return (value == 7531);
+}
+
+int
+test_direct(int first_arg, ...)
+{
+ va_list args;
+ va_list* ptr;
+ int value;
+ va_start(args, first_arg);
+ ptr = (va_list*) args;
+ value = va_arg(*ptr, int);
+ va_end(args);
+ return (value == 7531);
+}
+
+int
+main(int argc, char *argv[])
+{
+ if (argv[1][0] == '1' && test_direct(0, 7531)) {
+ printf("yes\n");
+ return 0;
+ } else if (argv[1][0] == '2' && test_address(0, 7531)) {
+ printf("yes\n");
+ return 0;
+ } else {
+ printf("unknown\n");
+ return 1;
+ }
+}
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */