Hi,
I've cross-compiled Gambit Scheme using devkitPPC for a Wii.
I have used the example Wii 'template' program as the basis for my
initial efforts.
My goal is to attempt to produce a Wii executable that has SLIME/EMACS
capability and also has all of the good libraries linked in with FFI
wrappers eg GRRLIB etc. This means that I should be able to run the
Gambit version from the Homebrew Browser and then connect and develop
remotely, ultimately using 'gsc' to produce the final stand-a-lone
executable once the hacking is over.
I've followed the efforts of James Long and managed to incorporate
Gambit into some of my iPhone applications (none for sale yet!) so I
know that it does cross-compile and does work, but for now, I am having
great difficulties in getting *anything* except register dumps when I
call a function defined with (c-define).
I remember having similar issues on the iPhone but it was because on
James' site, he hadn't fully described what he-d done but a few PM-s got
that sorted just fine. Thanks James!
First of all, here is how I built the gsc/gsi tools with devkitPPC,
./configure --prefix=/usr/local/Gambit-C/wii --enable-single-host=yes
--host=powerpc-eabi
That produces for me /usr/local/Gambit-C/wii/lib/libgambc.a and
presumably it is PPC correct with respect to architecture.
I then wrote a small test file called scode.scm in the same folder as
the template.c program:
(c-define (wii_blast ) () void "wii_blast" "extern"
;; stub
42)
and use gsc -link scode.scm to produce the scode.c and scode_.c files
which the Makefile picks up and uses.
In the template.c file I declare it as...
extern void wii_blast();
Every time I call it I get a register dump and I don't know why! I have
reduced the function to void/void so as to remove any possibilities of
stack corruption caused by incorrect push/pops due to a misinterpreted
function signature etc, I cut my teeth 25 years ago with assembler and
you never forget the basics! LOL.
I have included the full template,c at the end of this mail along with
the modified makefile incase anybody could tell me what is wrong. I am
assuming that the build of 'libgambc.a' is fine because my program does
call ___setup() and ___close() with no problems but they would appear to
be native C functions and I am assuming that the wii_blast() function is
maybe a byte-code thing happening or is it truly C code at this time?
That is my ignorance of the internals of GambitC showing now.
My next step is to try to produce a link map and a disassembly of the
wii_blast function and then code a function foo:
void foo(void)
{
}
and compare the pre-call and post-call operations to see what is going
on... in the meantime, if anybody cares to point out what I may/am
doing wrong I would be most grateful as I really want to be able to
build an interactive Wii development toolkit based on scheme, that wraps
GRRLIB and libogc in the first instance.
My *real* problem started from that fact that I wanted to be able to use
the 'gsc -exe' route to build a complete Wii application in one pass
i.e. have a main SCM file that pulls in everything else and then the
--cc-options and --ld-options flags would do the rest.... the problem I
had is that I couldn't work out how to tell the native gsc to use the
target compilers in /opt/devkitpro/devkitPPC/bin !! Is it just setting
'CC' or GAMBC_CC_COMMAND etc etc?
Either way, so far I am pleased with my progress but I am a little stuck
right now! Marc Feely, if you are out there dude, got any tips? :)
Thanks,
Sean Charles.