#
#	SmallBASIC makefile for Unices, PalmOS, DOS (cross-tools), Win32 (cross-tools)
#

##########################################
#
#   Unix
#
UCC=gcc

# CHECK_PTRS_LEV2 is a very slowly algorithm to check pointers, needed only for debug
PTRCHECK   =
#PTRCHECK  = -DCHECK_PTRS_LEV2
SHOBJ      = -fPIC
SHEXE      = -Wl,-export-dynamic

CPPFLAGS   = -g -O2 -D_UnixOS -Wall -I/usr/local/include $(PTRCHECK) $(SHOBJ)
CFLAGS     = $(CPPFLAGS)
ULIBS=$(SHEXE) -lm -ldl -lpthread -lreadline

##########################################
#
#   DOS/DJGPP (cross-compile from Unix)
#
DCC = gcc-dos

DCPPFLAGS = -O2 -Wall -D_DOS
DCFLAGS   = $(DCPPFLAGS)

##########################################
#
#   Win32/console (cross-compile from Unix)
#
WCC = gcc-win32
WDRES=/usr/local/cross-tools/bin/i386-mingw32msvc-windres

WCPPFLAGS = -O2 -w -D_Win32
WCFLAGS   = $(WCPPFLAGS)

##########################################
#
#   PalmOS/prc-tools (cross-compile from Unix)
#
PCC = m68k-palmos-gcc
AS  = m68k-palmos-as

IMGS=images/sbpad-small.bmp \
	images/sbpad1.bmp images/sbpad2.bmp images/sbpad4.bmp images/sbpad8.bmp \
	images/sbgo-small.bmp images/sbgo.bmp

# remark the following line if you have not installed the Sony's SDK
#SONYSDK=-DSONY_CLIE
#WARNS=-w -Wimplicit-function-declaration -Wtraditional -Wbad-function-cast -Wpointer-arith -Wconversion -Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-prototypes
WARNS=-Wall
PIMGS=images/sbpad1.bmp images/sbpad2.bmp images/sbpad4.bmp images/sbpad8.bmp

PCFLAGS =-O2 -g -D_PalmOS $(SONYSDK) $(WARNS)
PLIBS=-lgcc

##########################################
#
#   VTOS
#
VTCC = vtos-gcc

VTWARNS=-Wall
VTCFLAGS =-O2 -g -D_VTOS $(VTWARNS)
VTLIBS=-lgcc

##########################################
#
#   EMB
#
EMBCC = emb-gcc

EMBWARNS=-Wall
EMBCFLAGS =-O2 -g -D_FRANKLIN_EBM $(EMBWARNS)
EMBLIBS=-lgcc

##########################################
# directories

# temporaries (objects)
TMPDIR=../tmp
TMPPLM=../tmp/palm
TMPVTS=../tmp/vtos
TMPEBM=../tmp/ebm
TMPUNX=../tmp/unix
TMPDOS=../tmp/dos
TMPW32=../tmp/w32

# executables
BINDIR=../bin

# binary data (resources)
BDTDIR=../data
BDTPLM=../data/palm
BDTVTS=../data/vtos
BDTEBM=../data/ebm
BDTUNX=../data/unix
BDTDOS=../data/dos
BDTW32=../data/dos

# backup
BACKUPDIR=../backup

# Install
INSTALLBIN=/usr/local/bin
INSTALLDOC=/usr/local/doc/SmallBASIC

PILRC = pilrc -q
POBJRES = m68k-palmos-obj-res
POBJDMP = m68k-palmos-objdump
PNM = m68k-palmos-nm
PAS = m68k-palmos-as
BUILDPRC = build-prc
PILOTXFER = pilot-xfer

FONTS   = palm/hkfont.def
#FONTRES = $(BDTPLM)/pFNT03e8.bin
FONTRES = $(BDTPLM)/pFNT0708.bin

sources=\
	brun.c ceval.c eval.c str.c match.c fmt.c kw.c sberr.c \
	mem.c panic.c blib.c bc.c file.c blib_db.c blib_math.c \
	var.c proc.c blib_func.c blib_sound.c inet.c \
	blib_graph.c scan.c circle.c ffill.c pfill.c \
	extlib.c g_line.c \
    fs_stream.c fs_serial.c fs_memo.c fs_pdoc.c fs_socket_client.c fs_irda.c

# source files for each platform
palm_src=$(sources) ui.c sbpad.c mathlib.c dev_palm.c device.c
vtos_src=$(sources) helio/helio_iface.c helio/dev_helio.c device.c
ebm_src=$(sources) ebm/dev_ebm.c device.c
unix_src=$(sources) unx_memmgr.c dev_term.c
dos_src=$(sources) unx_memmgr.c dev_term.c
w32_src=$(sources) unx_memmgr.c dev_term.c

# object files for each platform (automatically generated by make)
palm_obj = $(addprefix $(TMPPLM)/, $(addsuffix .o, $(basename $(palm_src))))
vtos_obj = $(addprefix $(TMPVTS)/, $(addsuffix .o, $(basename $(vtos_src))))
ebm_obj  = $(addprefix $(TMPEBM)/, $(addsuffix .o, $(basename $(ebm_src))))
unix_obj = $(addprefix $(TMPUNX)/, $(addsuffix .o, $(basename $(unix_src))))
dos_obj  = $(addprefix $(TMPDOS)/, $(addsuffix .o, $(basename $(unix_src))))
w32_obj  = $(addprefix $(TMPW32)/, $(addsuffix .o, $(basename $(unix_src))))

# default
#all: fb $(BINDIR)/bas2pdb $(BINDIR)/mkpdb
all: $(BINDIR)/bas2pdb $(BINDIR)/mkpdb help

######################
#
#	PalmOS
#

#
#   Driver: dev_palm.c
#

$(TMPPLM)/%.o: %.c
	$(PCC) $(PCFLAGS) -c $< -o $@

$(FONTRES): palm/hkfont.def
	cp palm/hkfont.def $(FONTRES)

$(BINDIR)/sbpad: $(palm_obj)
	multigen sbpad.def
	$(PAS) -o $(TMPPLM)/sbpad-sections.o sbpad-sections.s
	$(PCC) -Wl,-Map,$(TMPPLM)/sbpad.map $(PCFLAGS) $(palm_obj) $(TMPPLM)/sbpad-sections.o sbpad-sections.ld -o $(BINDIR)/sbpad $(PLIBS)
	$(PNM) -u $(BINDIR)/sbpad
#	$(POBJDMP) --section-headers $(BINDIR)/sbpad

$(BINDIR)/sbpad.prc: $(BINDIR)/sbpad sbpad.def sbpad.rcp $(IMGS) $(FONTRES) palm/sm9.pfn palm/DOS5x9.pfn palm/DOS4x9.pfn $(PIMGS)
#	-rm -f $(TMPPLM)/*.bin
	$(PILRC) sbpad.rcp $(TMPPLM)
	$(BUILDPRC) sbpad.def $(BINDIR)/sbpad $(TMPPLM)/*.bin $(FONTRES) -o $(BINDIR)/sbpad.prc
	$(POBJDMP) $(BINDIR)/sbpad -h
	ls $(BINDIR)/sbpad.prc -la

palm: $(BINDIR)/sbpad.prc

picons: $(BINDIR)/sbpad.prc build_sbgo_icons.c images/sbgo.bmp images/sbgo-small.bmp
	gcc build_sbgo_icons.c -o build_sbgo_icons
	build_sbgo_icons
	touch sbpad.c
	-@printf "\n\033[7m * %s * \033[0m\n\n" "run 'make palm', again"

######################
#
#	DOS
#   (Actually only DJGPP is supported)

#
#   Graphics drivers:
#       dev_grx.c: GRX20 lib, supports mouse too
#       dev_dos.c: It does not working
#

#
#   Add-on sound drivers:
#       drv_adlib.c: ADLIB or compatible FM chip
#       drv_djspk.c: PC speaker (djgpp only)
#
DOSDRVS=dev_adlib.c
DOSDRVSCMD=-DDRV_SOUND dev_adlib.c

$(TMPDOS)/%.o: %.c
	$(DCC) $(DCFLAGS) -c $< -o $@

$(BINDIR)/sbrdos.exe: $(dos_obj) dev_dos.c dev_genfb.c $(DOSDRVS) unix/rom16.c device.c
	$(DCC) $(DCFLAGS) device.c dev_dos.c dev_genfb.c $(DOSDRVSCMD) $(dos_obj) -o $(BINDIR)/sbrdos.exe -lm -lgcc

$(BINDIR)/sbrgrx.exe: $(dos_obj) dev_grx.c $(DOSDRVS) unix/rom16.c device.c
	$(DCC) $(DCFLAGS) device.c dev_grx.c $(dos_obj) $(DOSDRVSCMD) -o $(BINDIR)/sbrgrx.exe -lm -lgcc -lgrx20

######################
#
#	VTOS
#

$(TMPVTS)/%.o: %.c
	$(VTCC) $(VTCFLAGS) -c $< -o $@

$(BINDIR)/SmallBASIC.app: $(vtos_obj) 
	$(VTCC) $(VTCFLAGS) $(vtos_obj) -o $(BINDIR)/SmallBASIC.app $(VTLIBS)

######################
#
#	EBM
#

$(TMPEBM)/%.o: %.c
	$(EBMCC) $(EBMCFLAGS) -c $< -o $@

$(BINDIR)/SmallBASIC.ebm: $(ebm_obj) 
	$(EBMCC) $(EBMCFLAGS) $(ebm_obj) -o $(BINDIR)/SmallBASIC.ebm $(EBMLIBS)

######################
#
#	WIN32
#

#
#   Graphics drivers:
#

#
#   Add-on sound drivers:
#
W32DRVS=
W32DRVSCMD=

$(TMPW32)/%.o: %.c
	$(WCC) $(WCFLAGS) -c $< -o $@

$(TMPW32)/w32res.o: w32_main.rc
	$(WDRES) w32_main.rc $(TMPW32)/w32res.o

$(BINDIR)/sbrw32.exe: $(w32_obj) w32_main.c dev_w32.c $(W32DRVS) unix/rom16.c device.c $(TMPW32)/w32res.o
	$(WCC) $(WCFLAGS) -mwindows -mthreads device.c w32_main.c dev_w32.c $(TMPW32)/w32res.o $(W32DRVSCMD) $(w32_obj) -o $(BINDIR)/sbrw32.exe -lm -lgcc -lws2_32 

$(BINDIR)/sbrw32f.exe: $(w32_obj) w32_main.c dev_w32f.c dev_genfb.c $(W32DRVS) unix/rom16.c device.c $(TMPW32)/w32res.o
	$(WCC) $(WCFLAGS) -mwindows -mthreads device.c w32_main.c dev_w32f.c dev_genfb.c $(TMPW32)/w32res.o $(W32DRVSCMD) $(w32_obj) -o $(BINDIR)/sbrw32.exe -lm -lgcc -lws2_32

######################
#
#	Unix
#

#
#   Graphics drivers:
#       dev_ndcfb.c/dev_genfb.c:    my framebuffer library
#       dev_uvga.c:     SVGALIB (mouse supported)
#       dev_sdl.c:      SDL graphics lib (sound and mouse supported)
#       dev_ufb.c:      OFBIS framebuffer lib (mouse it does not working on my PC)
#       dev_x.c:        X11, this driver does not working (mouse supported)
#       dev_xf.c:       X11 by using 'generic framebuffer' driver
#


#
#   Add-on sound drivers:
#       dev_oss.c: /dev/dsp, don't use it with SDL driver
#
#   Add-on mouse drivers:
#       dev_gpm.c: it does not working 
#

$(TMPUNX)/%.o: %.c
	$(UCC) $(CFLAGS) -c $< -o $@

#	take a look how we are using a different driver ;)

# unix console/svgalib with OSS sound (dev_uvga.c is the driver, rom16.c is the font)
$(BINDIR)/svgasbasic: $(unix_obj) dev_uvga.c unix/rom16.c dev_oss.c device.c
	$(UCC) $(CFLAGS) -DDRV_SOUND device.c dev_uvga.c dev_oss.c $(unix_obj) -o $(BINDIR)/svgasbasic $(ULIBS) -lvga -lvgagl
	ln -svf $(BINDIR)/svgasbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "SVGA Version ready"

# unix console/framebuffer OFBIS lib (dev_ufb.c is the driver) 
$(BINDIR)/ofbsbasic: $(unix_obj) dev_ufb.c device.c dev_oss.c
	$(UCC) $(CFLAGS) -DDRV_SOUND dev_ufb.c dev_oss.c device.c $(unix_obj) -o $(BINDIR)/ofbsbasic $(ULIBS) -lofbis
	ln -svf $(BINDIR)/ofbsbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "OFBIS Version ready"

# unix console/framebuffer
$(BINDIR)/fbsbasic: $(unix_obj) dev_ndcfb.c dev_genfb.c device.c dev_oss.c
	$(UCC) $(CFLAGS) -DDRV_SOUND dev_ndcfb.c dev_genfb.c dev_oss.c device.c $(unix_obj) -o $(BINDIR)/fbsbasic $(ULIBS)
	ln -svf $(BINDIR)/fbsbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "FrameBuffer Version ready"

# unix console/XWin (dev_x.c is the driver)
$(BINDIR)/xsbasic: $(unix_obj) dev_x.c device.c dev_oss.c
	$(UCC) $(CFLAGS) -DDRV_SOUND dev_x.c device.c dev_oss.c $(unix_obj) -o $(BINDIR)/xsbasic -L/usr/X11R6/lib $(ULIBS) -lX11 -lXext
	ln -svf $(BINDIR)/xsbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "X Version ready, not suggested; try SDL"

# unix console/XWin (dev_xf.c is the driver)
$(BINDIR)/xfsbasic: $(unix_obj) dev_xf.c device.c dev_oss.c
	$(UCC) $(CFLAGS) -DDRV_SOUND dev_xf.c dev_genfb.c device.c dev_oss.c $(unix_obj) -o $(BINDIR)/xfsbasic -L/usr/X11R6/lib $(ULIBS) -lX11 -lXext
	ln -svf $(BINDIR)/xfsbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "X(f) Version ready, not suggested; try SDL"

# unix console/SDL (dev_sdl.c is the driver)
$(BINDIR)/sdlsbasic: $(unix_obj) dev_sdl.c device.c
	$(UCC) $(CFLAGS) dev_sdl.c device.c $(unix_obj) -o $(BINDIR)/sdlsbasic $(ULIBS) -lSDL
	ln -svf $(BINDIR)/sdlsbasic $(BINDIR)/sbasic
	-@printf "\n\033[7m * %s * \033[0m\n\n" "SDL Version ready"

######################
svga: $(BINDIR)/svgasbasic
x: $(BINDIR)/xsbasic
xf: $(BINDIR)/xfsbasic
sdl: $(BINDIR)/sdlsbasic
fb: $(BINDIR)/fbsbasic
ofb: $(BINDIR)/ofbsbasic
dos: $(BINDIR)/sbrdos.exe $(BINDIR)/bas2pdb.exe $(BINDIR)/mkpdb.exe
w32: $(BINDIR)/sbrw32.exe $(BINDIR)/bas2pdb32.exe $(BINDIR)/mkpdb32.exe
w32f: $(BINDIR)/sbrw32f.exe $(BINDIR)/bas2pdb32.exe $(BINDIR)/mkpdb32.exe
dosgrx: $(BINDIR)/sbrgrx.exe $(BINDIR)/bas2pdb.exe $(BINDIR)/mkpdb.exe
vtos: $(BINDIR)/SmallBASIC.app
ebm: $(BINDIR)/SmallBASIC.ebm

######################
#
#	Utilities
#

# DOS
$(BINDIR)/bas2pdb.exe: bas2pdb.cc
	$(DCC) $(DCFLAGS) -D_BAS2PDB bas2pdb.cc -o $(BINDIR)/bas2pdb.exe
	$(DCC) $(DCFLAGS) -D_PDB2BAS bas2pdb.cc -o $(BINDIR)/pdb2bas.exe

$(BINDIR)/mkpdb.exe: mkpdb.c
	$(DCC) $(DCFLAGS) -D_DOS mkpdb.c -o $(BINDIR)/mkpdb.exe

# Win32
$(BINDIR)/bas2pdb32.exe: bas2pdb.cc
	$(WCC) $(WCFLAGS) -D_Win32 -D_BAS2PDB bas2pdb.cc -o $(BINDIR)/bas2pdb32.exe
	$(WCC) $(WCFLAGS) -D_Win32 -D_PDB2BAS bas2pdb.cc -o $(BINDIR)/pdb2bas32.exe

$(BINDIR)/mkpdb32.exe: mkpdb.c
	$(WCC) $(WCFLAGS) -D_Win32 mkpdb.c -o $(BINDIR)/mkpdb32.exe

# Unix
$(BINDIR)/bas2pdb: bas2pdb.cc
	$(UCC) $(CFLAGS) -D_BAS2PDB bas2pdb.cc -o $(BINDIR)/bas2pdb
	$(UCC) $(CFLAGS) -D_PDB2BAS bas2pdb.cc -o $(BINDIR)/pdb2bas

$(BINDIR)/mkpdb: mkpdb.c
	$(UCC) $(CFLAGS) mkpdb.c -o $(BINDIR)/mkpdb

##############

send: $(BINDIR)/sbpad.prc
	$(PILOTXFER) -i $(BINDIR)/sbpad.prc

######################
#
#	Backup
#
zip: backup

backup:
	-rm -f $(BACKUPDIR)/sync-`date +"%Y-%m-%d"`.zip
	zip -r $(BACKUPDIR)/sync-`date +"%Y-%m-%d"`.zip * -x *.bin *.o

######################
#
#	Clean-up
#
clean:
	-rm -f $(BINDIR)/* $(TMPDIR)/* $(TMPPLM)/* $(TMPUNX)/* $(TMPDOS)/* $(TMPW32)/*
	-rm -f $(TMPVTS)/* $(TMPEBM)/*
	-rm -f win32/*.obj win32/*.exe win32/*.tds sbpad.map samples/*.pdb
	-rm -f diff.lst *~ *.bak *sections.* win32/*.~*
	-rm -f build_sbgo_icons

######################
#
#	Install
#
install: all
	cp $(BINDIR)/bas2pdb $(INSTALLBIN)
	cp $(BINDIR)/pdb2bas $(INSTALLBIN)
	cp $(BINDIR)/*sbasic $(INSTALLBIN)
	cp $(BINDIR)/mkpdb $(INSTALLBIN)
	ln -svf $(INSTALLDIR)/fbsbasic     $(INSTALLBIN)/sbasic
	ln -svf $(INSTALLBIN)/sbasic       /usr/bin/sbasic

install_utils: $(BINDIR)/bas2pdb $(BINDIR)/mkpdb
	cp $(BINDIR)/bas2pdb $(INSTALLBIN)
	cp $(BINDIR)/pdb2bas $(INSTALLBIN)
	cp $(BINDIR)/mkpdb   $(INSTALLBIN)

devinstall: all
	ln -svf $(BINDIR)/bas2pdb   $(INSTALLBIN)/bas2pdb
	ln -svf $(BINDIR)/pdb2bas   $(INSTALLBIN)/pdb2bas
	ln -svf $(BINDIR)/sbasic     $(INSTALLBIN)/sbasic
	ln -svf $(BINDIR)/mkpdb     $(INSTALLBIN)/mkpdb
	ln -svf $(BINDIR)/svgasbasic $(INSTALLBIN)/svgasbasic
	ln -svf $(BINDIR)/fbsbasic   $(INSTALLBIN)/fbsbasic
	ln -svf $(BINDIR)/sdlsbasic  $(INSTALLBIN)/sdlsbasic
	ln -svf $(BINDIR)/xsbasic    $(INSTALLBIN)/xsbasic
	ln -svf $(BINDIR)/xfsbasic   $(INSTALLBIN)/xfsbasic
	# rehash

######################
#
#	Help
#
help:
	-@printf "\n\033[7m * %s * \033[0m\n\n" "SmallBASIC - make"
	-@printf "\033[4m%s\033[0m\n" "console: make svga      --- Unix version (with SVGALIB) & utilities (recommended)"
	-@printf "\033[4m%s\033[0m\n" "console: make fb        --- Unix version with my FB lib (recommended/default)"
	-@printf "%s\n" "-------- make ofb       --- Unix version with OFBIS lib"
	-@printf "%s\n" "-------- make x         --- Unix version with X lib"
	-@printf "%s\n" "-------- make xf        --- Unix version with X lib"
	-@printf "\033[4m%s\033[0m\n" "XFree86: make sdl       --- Unix version with SDL lib (recommended)"
	-@printf "\033[4m%s\033[0m\n" "PalmOS:  make palm      --- PalmOS version"
	-@printf "\033[4m%s\033[0m\n" "PalmOS:  make picons    --- PalmOS icons (needed if you change the sbgo*.bmp)"
	-@printf "\033[4m%s\033[0m\n" "VTOS:    make vtos      --- VTOS version"
	-@printf "\033[4m%s\033[0m\n" "EBM:     make ebm       --- Franklin's ebookman version"
	-@printf "%s\n" "-------- make dos       --- DOS(djgpp) version"
	-@printf "%s\n" "-------- make w32       --- Win32 native"
	-@printf "%s\n" "-------- make w32f      --- Win32 (does not working)"
	-@printf "\033[4m%s\033[0m\n" "DOS:     make dosgrx    --- (default for DOS): DOS(djgpp) with GRX20 and Adlib support"
	-@printf "\n"
	-@printf "%s\n" "         make send      --- Installs SmallBASIC to the Palm"
	-@printf "%s\n" "         make install   --- Installs sbasic & utilities to $(INSTALLBIN)"
	-@printf "%s\n" "         make install_utils --- Installs utilities to $(INSTALLBIN)"
	-@printf "%s\n" "         make devinstall -- Installation process for developers"
	-@printf "\n"

# DO NOT DELETE
