# Makefile for the Caml Light runtime system

# These options are overriden when called from ../Makefile.
CC=m68k-palmos-coff-gcc
OPTS=-DDEBUG -g -Wall -fno-defer-pop
CFLAGS=-O2 $(OPTS) -I..
LIBS=

# How to invoke ranlib
RANLIB=m68k-palmos-coff-ranlib

#========== End of configuration section

# main.o sys.o 
# No stdio: io.o 
# No support for signal: signals.o 
# Not enough support for double: floats.o
# No debugging support debugcom.o 
# No toplevel: meta.o 
# No compact marshalling: interncp.o externcp.o
# Endianness : fix_code.o 
# Reduce code size (use only streams): parsing.o lexing.o  
# 32k limit extern.o 
OBJS=gc_ctrl.o misc.o interp.o stacks.o fail.o \
  freelist.o major_gc.o minor_gc.o memory.o alloc.o roots.o \
  compare.o ints.o str.o hash.o globals.o \
  intern.o io.o extern.o \
  palmos.o palmio.o clPalmEvents.o clPalmUI.o syspilot.o \
  mainpilot.o

DOBJS=$(OBJS:.o=.d.o) debugger.d.o

# str.o needs to be there because of compare_strings and string_length...
# compare.o also because of Is_in_heap
# extern.o  idem
# hash.o    idem
# and then io.o because of extern.o
# and then syspilot.o because of io.o

# ints.o lexing.o, parsing.o intern.o could be elsewhere, but we have room
OBJS1=freelist.o major_gc.o minor_gc.o memory.o alloc.o roots.o \
      fail.o stacks.o palmos.o misc.o gc_ctrl.o interp.o \
      str.o hash.o io.o extern.o compare.o syspilot.o globals.o \
      ints.o lexing.o parsing.o intern.o 

# primitives
OBJS2= palmio.o clPalmEvents.o clPalm_cvt.o \
       clPalmClip.o clPalmCtl.o clPalmFld.o clPalmFont.o clPalmFrm.o \
       clPalmFtr.o clPalmLst.o clPalmMenu.o clPalmScl.o clPalmTbl.o \
       clPalmUI.o clPalmWin.o \
       clPalmDm.o \
       evloop.o lib1.o

#
OBJS3=mainpilot.o

# externcp.c interncp.c 
# floats.c 
PRIMS1=$(OBJS1:.o=.c)
PRIMS2=$(OBJS2:.o=.c)
PRIMS3=$(OBJS3:.o=.c)

PRIMS=$(PRIMS1) $(PRIMS2) $(PRIMS3)

all: CamlLib.prc CamlPrims.prc \
     camlruns pfix makeat code0001.camlruns.grc \
     primitives

pfix: pfix.c
	make -f Makefile.pfix pfix

makeat: makeat.c
	make -f Makefile.pfix makeat

CLat0000.bin: makeat
	makeat

# Warning: don't use -lclrt if libclrt.sa already exists !
CamlLib.prc libclrt.sa: CLat0000.bin $(OBJS1) prims1.o
	rm -f libclrt.a libclrt.sa
	m68k-palmos-coff-ar rc libclrt.a $(OBJS1) prims1.o
	m68k-palmos-coff-exportlist libclrt.a | grep -v clpalm > clrt.exp
	m68k-palmos-coff-stubgen "Caml Runtime Library" CLRT clrtstub.c clrt.S < clrt.exp
	$(CC) -shared -o CamlLib clrt.S libclrt.a -lc
	m68k-palmos-coff-obj-res -l CamlLib
	build-prc -l $@ "Caml Runtime Library" CLRT *.CamlLib.grc CLat0000.bin
	m68k-palmos-coff-gcc -O5 -c clrtstub.c
	m68k-palmos-coff-ar rcs libclrt.sa clrtstub.o

CamlPrims.prc libclpr.a: libclrt.a  $(OBJS2) prims2.o
	rm -f libclpr.a libclpr.sa
	m68k-palmos-coff-ar rc libclpr.a $(OBJS2) prims2.o
	m68k-palmos-coff-exportlist libclpr.a | grep -v clpalm > clpr.exp
	m68k-palmos-coff-stubgen "Caml Primitives Library" CLPR clprstub.c clpr.S < clpr.exp
	$(CC) -shared -o CamlPrims clpr.S libclpr.a -L. -lclrt -lc
	m68k-palmos-coff-obj-res -l CamlPrims
	build-prc -l $@ "Caml Primitives Library" CLPR *.CamlPrims.grc
	m68k-palmos-coff-gcc -O5 -c clprstub.c
	m68k-palmos-coff-ar rcs libclpr.sa clprstub.o


camlruns: $(OBJS3) prims3.o libclrt.a libclpr.a
	$(CC) $(CFLAGS) -g -o $@ $(OBJS3) prims3.o -L. -lclpr -lclrt $(LIBS)

code0001.camlruns.grc: camlruns
	m68k-palmos-coff-obj-res camlruns

#camlrun: $(OBJS) prims.o
#	$(CC) $(CFLAGS) -g -o camlrun prims.o $(OBJS) $(LIBS)

#camlrund: $(DOBJS) prims.o
#	$(CC) -g $(OPTS) -o camlrund prims.o $(DOBJS) $(LIBS) -lm

#libcaml.a: $(OBJS)
#	rm -f libcaml.a
#	m68k-palmos-coff-ar rc libcaml.a $(OBJS)
#	if $(RANLIBTEST); then $(RANLIB) libcaml.a; else true; fi

#libcamld.a: $(DOBJS)
#	rm -f libcamld.a
#	m68k-palmos-coff-ar rc libcamld.a $(DOBJS)
#	if $(RANLIBTEST); then $(RANLIB) libcamld.a; else true; fi

clean:
	rm -f camlrun camlruns camlrund *.o *.a *.sa
	rm -f prims? prims?.c
	rm -f primitives prims.c opnames.h jumptbl.h
	rm -f *.prc *.grc
	rm -f CamlLib CamlPrims

check:
	@echo Sizes
	m68k-palmos-coff-size $(OBJS1)
	m68k-palmos-coff-size CamlLib prims1.o
	m68k-palmos-coff-size $(OBJS2)
	m68k-palmos-coff-size CamlPrims prims2.o
	m68k-palmos-coff-size $(OBJS3)
	m68k-palmos-coff-size camlruns prims3.o
	@echo Undefined
	m68k-palmos-coff-nm -u CamlLib
	m68k-palmos-coff-nm -u CamlPrims
	m68k-palmos-coff-nm -u camlruns

undefined:
	@echo CLRT
	m68k-palmos-coff-nm -u $(OBJS1)
	@echo CLPR
	m68k-palmos-coff-nm -u $(OBJS2)
	@echo APPL
	m68k-palmos-coff-nm -u $(OBJS) prims.o

install:
	cp camlrun $(BINDIR)
	strip $(BINDIR)/camlrun
	cp libcaml.a $(LIBDIR)
	if $(RANLIBTEST); then cd $(LIBDIR); $(RANLIB) libcaml.a; else true; fi
	cp mlvalues.h alloc.h misc.h $(LIBDIR)
	sed -e '/#include ".*\/m.h/r ../../config/m.h' \
            -e '/#include ".*\/s.h/r ../../config/s.h' \
            -e '/#include "/d' config.h > $(LIBDIR)/config.h
	sed -e '/#include ".*gc\.h"/d' \
	    -e '/#define Alloc_small/,/^}/d' \
	    -e '/Modify/,/^}/d' memory.h > $(LIBDIR)/memory.h

# This one is for the linker
primitives : $(PRIMS)
	sed -n -e '/\/\* ML \*\//s/.* \([a-zA-Z0-9_][a-zA-Z0-9_]*\) *(.*/\1/p' \
                $(PRIMS) > primitives2
	sh -c 'if cmp -s primitives primitives2; \
        then rm primitives2; \
        else mv primitives2 primitives; \
        fi'

# These are for the different runtime layers
prims1.c : $(PRIMS1)
	sed -n -e '/\/\* ML \*\//s/.* \([a-zA-Z0-9_][a-zA-Z0-9_]*\) *(.*/\1/p' \
                $(PRIMS1) > prims1
	(echo '#include "mlvalues.h"'; \
	 echo '#include "prims.h"'; \
	 sed -e 's/.*/extern value &();/' prims1; \
	 echo 'c_primitive cprims1[] = {'; \
	 sed -e 's/.*/  &,/' prims1; \
	 echo '  0 };'; \
         echo -n 'int cprims1n ='; \
         wc -l < prims1; \
	 echo ';') > prims1.c

prims2.c : $(PRIMS2)
	sed -n -e '/\/\* ML \*\//s/.* \([a-zA-Z0-9_][a-zA-Z0-9_]*\) *(.*/\1/p' \
                $(PRIMS2) > prims2
	(echo '#include "mlvalues.h"'; \
	 echo '#include "prims.h"'; \
	 sed -e 's/.*/extern value &();/' prims2; \
	 echo 'c_primitive cprims2[] = {'; \
	 sed -e 's/.*/  &,/' prims2; \
	 echo '  0 };'; \
         echo -n 'int cprims2n ='; \
         wc -l < prims2; \
	 echo ';') > prims2.c

prims3.c : $(PRIMS3)
	sed -n -e '/\/\* ML \*\//s/.* \([a-zA-Z0-9_][a-zA-Z0-9_]*\) *(.*/\1/p' \
                $(PRIMS3) > prims3
	(echo '#include "mlvalues.h"'; \
	 echo '#include "prims.h"'; \
	 sed -e 's/.*/extern value &();/' prims3; \
	 echo 'c_primitive cprims3[] = {'; \
	 sed -e 's/.*/  &,/' prims3; \
	 echo '  0 };'; \
         echo -n 'const int cprims3n ='; \
         wc -l < prims3; \
	 echo ';') > prims3.c

opnames.h : instruct.h
	sed -e '/\/\*/d' \
            -e 's/enum /char * names_of_/' \
            -e 's/{$$/[] = {/' \
            -e 's/\([A-Z][A-Z_0-9]*\)/"\1"/g' instruct.h > opnames.h

# jumptbl.h is required only if you have GCC 2.0 or later
jumptbl.h : instruct.h
	awk -f ../tools/make-jumptbl instruct.h > jumptbl.h

interp.o: jumptbl.h

.SUFFIXES: .d.o

.c.d.o:
	cd .debugobj; $(CC) -c -g -I.. -I../.. -DDEBUG $(OPTS) ../$<
	mv .debugobj/$*.o $*.d.o

depend : prims.c opnames.h jumptbl.h
	mv Makefile Makefile.bak
	(sed -n -e '1,/^### DO NOT DELETE THIS LINE/p' Makefile.bak;	 \
         $(CC) -MM -I.. $(OPTS) *.c; \
         $(CC) -MM -I.. $(OPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/') > Makefile
	rm Makefile.bak

### EVERYTHING THAT GOES BEYOND THIS COMMENT WILL BE ERASED WITHOUT WARNING
### DO NOT DELETE THIS LINE
alloc.o: alloc.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h major_gc.h freelist.h memory.h \
 gc.h minor_gc.h stacks.h
atoms.o: atoms.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h
clPalmDm.o: clPalmDm.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 fail.h alloc.h str.h sys.h
clPalmEvents.o: clPalmEvents.c config.h ../../config/m.h \
 ../../config/s.h mlvalues.h misc.h alloc.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h ui.h
clPalmUI.o: clPalmUI.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h fail.h alloc.h str.h io.h
clPalmUI2.o: clPalmUI2.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h fail.h alloc.h str.h io.h
clprstub.o: clprstub.c
clrtstub.o: clrtstub.c
compare.o: compare.c fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h str.h
evloop.o: evloop.c mlvalues.h config.h ../../config/m.h \
 ../../config/s.h misc.h fail.h
extern.o: extern.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h gc.h intext.h io.h memory.h major_gc.h \
 freelist.h minor_gc.h
fail.o: fail.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h signals.h
freelist.o: freelist.c config.h ../../config/m.h ../../config/s.h \
 debugger.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h major_gc.h
gc_ctrl.o: gc_ctrl.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h gc.h gc_ctrl.h major_gc.h \
 freelist.h minor_gc.h memory.h
globals.o: globals.c config.h ../../config/m.h ../../config/s.h \
 globals.h mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h fail.h prims.h dispatch.h
hash.o: hash.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h str.h
intern.o: intern.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h gc.h intext.h io.h memory.h major_gc.h \
 freelist.h minor_gc.h reverse.h
interncp.o: interncp.c debugger.h fail.h misc.h config.h \
 ../../config/m.h ../../config/s.h mlvalues.h gc.h intext.h io.h \
 memory.h major_gc.h freelist.h minor_gc.h reverse.h
interp.o: interp.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h fail.h instruct.h memory.h \
 gc.h major_gc.h freelist.h minor_gc.h prims.h signals.h stacks.h \
 str.h unalignd.h ui.h dispatch.h
ints.o: ints.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
io.o: io.c config.h ../../config/m.h ../../config/s.h mlvalues.h \
 misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h fail.h sys.h \
 alloc.h io.h
lexing.o: lexing.c mlvalues.h config.h ../../config/m.h \
 ../../config/s.h misc.h stacks.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h str.h
mainpilot.o: mainpilot.c config.h ../../config/m.h ../../config/s.h \
 globals.h mlvalues.h misc.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h gc_ctrl.h stacks.h intext.h io.h sys.h prims.h \
 dispatch.h
major_gc.o: major_gc.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h freelist.h gc.h gc_ctrl.h \
 globals.h major_gc.h roots.h
memory.o: memory.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h \
 memory.h minor_gc.h
meta.o: meta.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h globals.h major_gc.h freelist.h memory.h \
 gc.h minor_gc.h prims.h
minor_gc.o: minor_gc.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h gc.h gc_ctrl.h major_gc.h \
 freelist.h memory.h minor_gc.h roots.h
misc.o: misc.c config.h ../../config/m.h ../../config/s.h debugger.h \
 misc.h ui.h
palmio.o: palmio.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 fail.h sys.h alloc.h io.h
palmos.o: palmos.c config.h ../../config/m.h ../../config/s.h fail.h \
 misc.h mlvalues.h
parsing.o: parsing.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 alloc.h
prims.o: prims.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h prims.h dispatch.h
roots.o: roots.c debugger.h memory.h config.h ../../config/m.h \
 ../../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h \
 minor_gc.h stacks.h
stacks.o: stacks.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
str.o: str.c alloc.h misc.h config.h ../../config/m.h ../../config/s.h \
 mlvalues.h debugger.h
syspilot.o: syspilot.c config.h ../../config/m.h ../../config/s.h \
 alloc.h misc.h mlvalues.h fail.h globals.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
alloc.d.o: alloc.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h major_gc.h freelist.h memory.h \
 gc.h minor_gc.h stacks.h
atoms.d.o: atoms.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h
clPalmDm.d.o: clPalmDm.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 fail.h alloc.h str.h sys.h
clPalmEvents.d.o: clPalmEvents.c config.h ../../config/m.h \
 ../../config/s.h mlvalues.h misc.h alloc.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h ui.h
clPalmUI.d.o: clPalmUI.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h fail.h alloc.h str.h io.h
clPalmUI2.d.o: clPalmUI2.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h fail.h alloc.h str.h io.h
clprstub.d.o: clprstub.c
clrtstub.d.o: clrtstub.c
compare.d.o: compare.c fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h str.h
evloop.d.o: evloop.c mlvalues.h config.h ../../config/m.h \
 ../../config/s.h misc.h fail.h
extern.d.o: extern.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h gc.h intext.h io.h memory.h major_gc.h \
 freelist.h minor_gc.h
fail.d.o: fail.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h signals.h
freelist.d.o: freelist.c config.h ../../config/m.h ../../config/s.h \
 debugger.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h major_gc.h
gc_ctrl.d.o: gc_ctrl.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h gc.h gc_ctrl.h major_gc.h \
 freelist.h minor_gc.h memory.h
globals.d.o: globals.c config.h ../../config/m.h ../../config/s.h \
 globals.h mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h fail.h prims.h dispatch.h
hash.d.o: hash.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h str.h
intern.d.o: intern.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h gc.h intext.h io.h memory.h major_gc.h \
 freelist.h minor_gc.h reverse.h
interncp.d.o: interncp.c debugger.h fail.h misc.h config.h \
 ../../config/m.h ../../config/s.h mlvalues.h gc.h intext.h io.h \
 memory.h major_gc.h freelist.h minor_gc.h reverse.h
interp.d.o: interp.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h debugger.h fail.h instruct.h memory.h \
 gc.h major_gc.h freelist.h minor_gc.h prims.h signals.h stacks.h \
 str.h unalignd.h ui.h dispatch.h
ints.d.o: ints.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
io.d.o: io.c config.h ../../config/m.h ../../config/s.h mlvalues.h \
 misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h fail.h sys.h \
 alloc.h io.h
lexing.d.o: lexing.c mlvalues.h config.h ../../config/m.h \
 ../../config/s.h misc.h stacks.h memory.h gc.h major_gc.h freelist.h \
 minor_gc.h str.h
mainpilot.d.o: mainpilot.c config.h ../../config/m.h ../../config/s.h \
 globals.h mlvalues.h misc.h fail.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h gc_ctrl.h stacks.h intext.h io.h sys.h prims.h \
 dispatch.h
major_gc.d.o: major_gc.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h freelist.h gc.h gc_ctrl.h \
 globals.h major_gc.h roots.h
memory.d.o: memory.c debugger.h fail.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h \
 memory.h minor_gc.h
meta.d.o: meta.c alloc.h misc.h config.h ../../config/m.h \
 ../../config/s.h mlvalues.h globals.h major_gc.h freelist.h memory.h \
 gc.h minor_gc.h prims.h
minor_gc.d.o: minor_gc.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h gc.h gc_ctrl.h major_gc.h \
 freelist.h memory.h minor_gc.h roots.h
misc.d.o: misc.c config.h ../../config/m.h ../../config/s.h debugger.h \
 misc.h ui.h
palmio.d.o: palmio.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 fail.h sys.h alloc.h io.h
palmos.d.o: palmos.c config.h ../../config/m.h ../../config/s.h fail.h \
 misc.h mlvalues.h
parsing.d.o: parsing.c config.h ../../config/m.h ../../config/s.h \
 mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \
 alloc.h
prims.d.o: prims.c mlvalues.h config.h ../../config/m.h ../../config/s.h \
 misc.h prims.h dispatch.h
roots.d.o: roots.c debugger.h memory.h config.h ../../config/m.h \
 ../../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h \
 minor_gc.h stacks.h
stacks.d.o: stacks.c config.h ../../config/m.h ../../config/s.h \
 debugger.h fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
str.d.o: str.c alloc.h misc.h config.h ../../config/m.h ../../config/s.h \
 mlvalues.h debugger.h
syspilot.d.o: syspilot.c config.h ../../config/m.h ../../config/s.h \
 alloc.h misc.h mlvalues.h fail.h globals.h memory.h gc.h major_gc.h \
 freelist.h minor_gc.h
