# =====================================================================
# Makefile pour generer ocamlpilot (client + serveur + doc)
# =====================================================================

# mode de compilation : opt = natif, noopt = bytecode
COMPILE_MODE=noopt

# systeme sur lequel on compile : linux ou win32
SYSTEM=linux

# les extensions des executables en fonction du mode de compilation
EXT_BYTECODE=-bytecode
EXT_NATIF=

# les extensions des executables en fonction du systeme d'exploitation
EXT_LINUX=
EXT_WIN32=.exe

# les fichiers a compiler
# ATTENTION : indiquer les noms des sources et des outputs dans le meme ordre
INPUTS  = client.ml serveur.ml
OUTPUTS = ocamlpilot ocamlpilotd

# ou se trouve le ocamldoc_projet.cmo (repertoire + nom de fichier)
OCAMLDOC_PROJET_DIR=.
OCAMLDOC_PROJET_FIC_ML=ocamldoc_projet.ml

# le repertoire dans lequel vont etre ecrites les docs
DOCS_DIR=docs




# =====================================================================
# ne pas editer en dessous de cette ligne
# =====================================================================

# ou se trouvent les fichiers de la librairie Ocaml
ifeq ($(SYSTEM),linux)
	OCAMLLIB=/usr/lib/ocaml
else
	OCAMLLIB="C:\Ocaml\lib"
endif

# le compilateur C (pour compiler le stub du nanosleep
CC=gcc

# options de compil du client et du serveur
ifeq ($(COMPILE_MODE),opt)
	OCAMLC=ocamlopt -I $(OCAMLLIB) -I $(OCAMLLIB)/lablGL -I $(OCAMLLIB)/threads
	OCAMLFLAGS=-ccopt -O2
	OCAMLLIB_EXT=cmxa
	OCAMLOBJ_EXT=cmx
	OUTPUT_EXT=$(EXT_NATIF)
else
	OCAMLC=ocamlc -I $(OCAMLLIB) -I $(OCAMLLIB)/lablGL -I $(OCAMLLIB)/threads
	OCAMLFLAGS=-custom
	OCAMLLIB_EXT=cma
	OCAMLOBJ_EXT=cmo
	OUTPUT_EXT=$(EXT_BYTECODE)
endif

ifeq ($(SYSTEM),win32)
	OUTPUT_EXT:=$(OUTPUT_EXT)$(EXT_WIN32)
	3DDLL=-cclib -lopengl32
else
	OUTPUT_EXT:=$(OUTPUT_EXT)$(EXT_LINUX)
endif

THREADLIBS = $(patsubst %.ml,%.$(OCAMLLIB_EXT),-thread threads.ml)
GRAPHLIBS  = $(patsubst %.ml,%.$(OCAMLLIB_EXT),unix.ml graphics.ml)
3DLIBS     = $(patsubst %.ml,%.$(OCAMLLIB_EXT),unix.ml graphics.ml lablgl.ml lablglut.ml)


# la commande a passer a ocamldoc
OCAMLDOC_PROJET_FIC=$(patsubst %.ml,%.cmo,$(OCAMLDOC_PROJET_FIC_ML))
OCAMLDOC_PROJET=$(OCAMLDOC_PROJET_DIR)/$(OCAMLDOC_PROJET_FIC)
INCOCAMLDOC=-d $(DOCS_DIR) -g $(OCAMLDOC_PROJET) -I +threads -I +lablGL


# =====================================================================
# =====================================================================

.PHONY : clean all depend docs install

all: $(patsubst %,%$(OUTPUT_EXT),$(OUTPUTS)) mytop

docs: $(INPUTS) $(OCAMLDOC_PROJET)
	-rm -rf $(DOCS_DIR) && mkdir $(DOCS_DIR) && \
	ocamldoc $(INCOCAMLDOC) $(subst $(OCAMLDOC_PROJET_FIC),,$^)

clean:
	-rm -rf docs *~ core `for i in $(OUTPUTS); do echo $$i*; done`

depend:
	ocamldep $(INPUTS) | awk -v pilot_in="${INPUTS}" -v pilot_out="${OUTPUTS}" \
	-v ext_linux="${EXT_LINUX}" -v ext_win32="${EXT_WIN32}" \
	-v ext_natif="${EXT_NATIF}" -v ext_bytecode="${EXT_BYTECODE}" \
	-F: -f depend.awk > .depend
	makedepend $(OCAMLLIB) -f .depend *.c


# =====================================================================
# =====================================================================

# a peu pres genere par ocamldep
ocamlpilot-bytecode: jeu.cmi aide_client.cmi aide_client.cmo client.cmo
ocamlpilot-bytecode.exe: jeu.cmi aide_client.cmi aide_client.cmo client.cmo
client.cmo: jeu.cmi aide_client.cmi aide_client.cmo 
ocamlpilot: jeu.cmi aide_client.cmi aide_client.cmx client.cmx
ocamlpilot.exe: jeu.cmi aide_client.cmi aide_client.cmx  client.cmx
client.cmx: jeu.cmi aide_client.cmi aide_client.cmx 

ocamlpilotd-bytecode: jeu.cmi configuration.cmo types_serveur.cmi aide_serveur.cmo serveur.cmo
ocamlpilotd-bytecode.exe: jeu.cmi configuration.cmo types_serveur.cmi aide_serveur.cmo serveur.cmo
serveur.cmo: jeu.cmi configuration.cmo types_serveur.cmi aide_serveur.cmo 
ocamlpilotd: jeu.cmi configuration.cmx types_serveur.cmi aide_serveur.cmx  serveur.cmx
ocamlpilotd.exe: jeu.cmi configuration.cmx types_serveur.cmi aide_serveur.cmx  serveur.cmx
serveur.cmx: jeu.cmi configuration.cmx types_serveur.cmi aide_serveur.cmx 


ocamlpilotd$(OUTPUT_EXT): 
	$(OCAMLC) $(OCAMLFLAGS) -o $@ $(GRAPHLIBS) $(THREADLIBS) $(patsubst %.cmi,,$^)

ocamlpilot$(OUTPUT_EXT): ml_nanosleep.o 
	$(OCAMLC) $(OCAMLFLAGS) -o $@ $(GRAPHLIBS) $(patsubst %.cmi,,$^)

mytop: ml_nanosleep.o configuration.cmo $(wildcard aide_*.$(OCAMLOBJ_EXT))
	ocamlmktop $(OCAMLFLAGS) -o mytop $(GRAPHLIBS) $(THREADLIBS) $^

$(OCAMLDOC_PROJET): $(subst .cmo,.ml,$(OCAMLDOC_PROJET))
	ocamlc -I +ocamldoc -c $<

%.cmi: %.mli
	$(OCAMLC) $(OCAMLFLAGS) -c $<

%.cmo %.cmx: %.ml
	$(OCAMLC) $(OCAMLFLAGS) -c $<

%.o: %.c
	if [ "$(SYSTEM)" = "linux" ] ; then \
		$(CC) -I $(OCAMLLIB) -c $< ; \
	else \
		$(CC) -I $(OCAMLLIB) -DWIN32 -c $< ; \
	fi


