ifeq ($(shell test -e gamePrimitives && echo yes),yes)

LOCAL_GAMEPRIMITIVES=1
endif

GOBA_PACKAGES=-package sdl,sdl.sdlttf,sdl.sdlimage,sdl.sdlmixer,unix,threads,sexplib
GOBA_CMA=

REV=`svn info | awk '/^Revision:/ { print $$2 }'`

SERVER_PACKAGES=-package sdl,sdl.sdlttf,sdl.sdlimage,sdl.sdlmixer,unix,threads,sexplib
OCAMLCFLAGS=-thread -g -dtypes
OCAMLOPTFLAGS=-thread

ifdef PROFILING
OCAMLOPTFLAGS:=$(OCAMLOPTFLAGS) -p
endif

OCAMLFIND=ocamlfind
OCAMLC=$(OCAMLFIND) ocamlc
#OCAMLC=$(OCAMLFIND) ocamlcp
OCAMLOPT=$(OCAMLFIND) ocamlopt
OCAMLDSORT=ocamldsort

ifdef LOCAL_GAMEPRIMITIVES
OCAMLCFLAGS:=$(OCAMLCFLAGS) -I gamePrimitives
OCAMLOPTFLAGS:=$(OCAMLOPTFLAGS) -I gamePrimitives
GOBA_CMA=gamePrimitives.cma
GOBA_CMXA=gamePrimitives.cmxa
SERVER_CMA=gamePrimitives.cma
SERVER_CMXA=gamePrimitives.cmxa
else
GOBA_PACKAGES:=$(GOBA_PACKAGES) -package gameprimitives
SERVER_PACKAGES:=$(GOBA_PACKAGES) -package gameprimitives
endif

SYNTAX=-pp "camlp4o -I `ocamlfind query sexplib` pa_sexp_conv.cmo"

all: gfx/grass-00.png goba server toplevel server_toplevel
all.opt: all goba.opt server.opt

bin: goba-bin-linux-x86.tar.gz
src: goba-src.tar.gz

gfx/grass-00.png:
	make -C gfx

INTERFACES=

COMMON_FILES=net.ml player.ml gobaMath.ml vecOps.ml vector.ml gobaUtils.ml \
	sfx.mli sfx.ml objectType.mli objectType.ml \
	collisionMask.ml collision.ml bitmaps.ml object.mli object.ml \
	explosion.ml projectile.ml mine.ml tank.ml base.ml \
	tile.ml mapData.ml mapFile.ml protocol.ml perf.ml

GOBA_FILES=$(COMMON_FILES) sfxSdl.mli sfxSdl.ml menu.ml gobaMap.ml \
	threadUtils.ml \
	client.ml help.ml readInput.ml game.ml goba.ml

SERVER_FILES:=$(COMMON_FILES) sfxNull.mli sfxNull.ml noise.ml perlinNoise.ml mapGenerator.ml server.ml

%.prototype.mli: %.ml
	$(OCAMLC) -c $(OCAMLCFLAGS) $(GOBA_PACKAGES) $(SYNTAX) -i $< > $@

%.cmi: %.mli
	$(OCAMLC) -c $(OCAMLCFLAGS) $(GOBA_PACKAGES) -o $@ $<

%.cmo: %.ml
	$(OCAMLC) -c $(OCAMLCFLAGS) $(GOBA_PACKAGES) $(SYNTAX) -o $@ $<

%.cmx: %.ml
	$(OCAMLOPT) -c $(OCAMLOPTFLAGS) $(GOBA_PACKAGES) $(SYNTAX) -o $@ $<

files: $(GOBA_FILES)
	@echo -n

.depends:
	ocamldep $(SYNTAX) $(GOBA_FILES) $(SERVER_FILES) >.depends

%.ml: %.mll
	ocamllex $<

-include .depends

depend:
	rm -f .depends
	$(MAKE) .depends

goba-src:
	rm -rf goba-$(REV)-src
	mkdir goba-$(REV)-src
	mkdir goba-$(REV)-src/gfx
	mkdir goba-$(REV)-src/sfx
	svn ls | grep -v '/$$' | xargs -i, ln , goba-$(REV)-src/
	svn ls gfx | xargs -i, ln gfx/, goba-$(REV)-src/gfx/
	svn ls sfx | xargs -i, ln sfx/, goba-$(REV)-src/sfx/
	mkdir goba-$(REV)-src/gamePrimitives
	svn ls ../gamePrimitives | xargs -i, ln ../gamePrimitives/, goba-$(REV)-src/gamePrimitives/

goba-src.tar.gz: goba-src
	tar czvf goba-$(REV)-src.tar.gz goba-$(REV)-src

goba-bin-linux-x86: goba.opt server.opt Makefile
	rm -rf goba-$(REV)-bin-linux-x86
	mkdir goba-$(REV)-bin-linux-x86
	mkdir goba-$(REV)-bin-linux-x86/gfx
	mkdir goba-$(REV)-bin-linux-x86/sfx
	ln goba.opt goba-$(REV)-bin-linux-x86/goba
	ln server.opt goba-$(REV)-bin-linux-x86/server
	ln map.txt font.ttf goba-$(REV)-bin-linux-x86/
	ln gfx/*.png goba-$(REV)-bin-linux-x86/gfx
	ln sfx/*.wav goba-$(REV)-bin-linux-x86/sfx

goba-bin-linux-x86.tar.gz: goba-bin-linux-x86
	tar czvf goba-$(REV)-bin-linux-x86.tar.gz goba-$(REV)-bin-linux-x86

mapGeneratorTool: vecOps.cmo vector.cmo noise.cmo perlinNoise.cmo gobaUtils.cmo tile.cmo mapData.cmo mapGenerator.cmo mapGeneratorTool.cmo
	$(OCAMLC) -o $@ $(OCAMLCFLAGS) $(GOBA_PACKAGES) -linkpkg $^

clean:
	rm -f *.cmx *.cmo *.cmi *~ *.annot toplevel goba goba.opt mapGeneratorTool server server_toplevel

goba: $(patsubst %.ml,%.cmo,$(shell $(OCAMLDSORT) $(SYNTAX) $(GOBA_FILES) 2>/dev/null))
	$(OCAMLC) -o $@ $(OCAMLCFLAGS) $(GOBA_PACKAGES) $(GOBA_CMA) -linkpkg $^ 

server: $(patsubst %.ml,%.cmo,$(shell $(OCAMLDSORT) $(SYNTAX) $(SERVER_FILES) 2>/dev/null)) 
	$(OCAMLC) -o $@ $(OCAMLCFLAGS) $(SERVER_PACKAGES) $(SERVER_CMA) -linkpkg $^ 

server.opt: $(patsubst %.ml,%.cmx,$(shell $(OCAMLDSORT) $(SYNTAX) $(SERVER_FILES) 2>/dev/null)) 
	$(OCAMLOPT) -o $@ $(OCAMLOPTFLAGS) $(SERVER_PACKAGES) $(SERVER_CMXA) -linkpkg $^ 

goba.opt: $(patsubst %.ml,%.cmx,$(GOBA_FILES)) 
	$(OCAMLOPT) -o $@ $(OCAMLOPTFLAGS) $(GOBA_PACKAGES) $(GOBA_CMXA) -linkpkg $^ 

toplevel: $(patsubst %.ml,%.cmo,$(GOBA_FILES)) 
	$(OCAMLFIND) ocamlmktop $(OCAMLCFLAGS) $(GOBA_PACKAGES) -linkpkg $(GOBA_CMA) -thread -o $@ $^

server_toplevel: $(patsubst %.ml,%.cmo,$(SERVER_FILES)) 
	$(OCAMLFIND) ocamlmktop $(OCAMLCFLAGS) $(SERVER_PACKAGES) -linkpkg $(SERVER_CMA) -thread -o $@ $^

