Will Coleda <[EMAIL PROTECTED]> wrote:

> dyld: ./parrot Undefined symbols:
> _Parrot_tclobject_morph
> _Parrot_tclobject_set_pmc

Ah yes. That's ugly. So here we go:

0) The PMCs were pre-ICU. I've adapted them. Should I check it in or
send it back to you?

1) dynamic PMCs need a "dynpmc" flag on the class definition line. This
causes the PMC compiler to add additional code for dynamic loading:

  pmclass TclString extends tclobject dynpmc {

2) Nasty dependencies. I got around that by changing the Makefile like
so:

tclobject$(SO) : tclobject.c
        $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS) -Wl,-E -o $@ \
                -I../include -I../classes \
                -L../blib/lib -lparrot $<
        $(PERL) -MFile::Copy=cp -e 'cp q|$@|, q|../runtime/parrot/dynext/$@|'
        cd ../runtime/parrot/dynext; ln -sf tclobject.so libtclobject.so

%$(SO) : %.c
        $(LD) $(LD_SHARED) $(LD_SHARED_FLAGS) $(LDFLAGS) -Wl,-E -o $@ \
                -I../include -I../classes \
                -L../blib/lib -lparrot -L../runtime/parrot/dynext \
                -ltclobject $<
        $(PERL) -MFile::Copy=cp -e 'cp q|$@|, q|../runtime/parrot/dynext/$@

(and disabling non-tcl shared classes for now)

That is for all tcl* but tclobject libtclobject.so is added as a
library. This might also need the LD_LIBRARY_PATH to contain
F<runtime/parrot/dynext>.

I don't know how we do that platform independend.

It might be simpler to have a utility that copies all tcl*.c together
into one and chains the Parrot_lib_<type>_load() functions. So only one
shared lib would be loaded that registers all classes. Should be a
rather simple script.

E.g. merge-classes -o tcl-all.c tclobject.c tclstring.c ...

Then compile and loadlib only the tcl-all. This would need a
Parrot_lib_tcl-all_load() function that calls _load() for all contained
PMCs.

3) For now
$ cat tcl.pasm
  loadlib P10, "tclobject"
  print "ok 1\n"
  loadlib P11, "tclstring"
  print "ok 2\n"
  new P1, .TclString
  set P1, "ok 3\n"
  set S1, P1
  print S1
  end

$ parrot tcl.pasm
ok 1
ok 2
ok 3

leo

Reply via email to