All pastes #480544 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-05-10 10:21 UTC
rendered paste body
# $Id: Makefile 1723 2007-03-29 21:32:04Z andres $

# Instructions:
# You can compile a debug bytecode app by specifying DEBUG=-g
# You can compile a profiled bytecode app by specifying
#      OCAMLC=ocamlcp DEBUG="-p a"
# You can compile a profiled native app by specifying PROFILE=-p

# Change whatever options (compilers, compiler options, and so on) in this file
-include ../config

# Cleanup spaces so that we recognize proper options
USEPARALLEL := $(strip $(USEPARALLEL))
USEINTERFACE := $(strip $(USEINTERFACE))
USEGRAPHICS := $(strip $(USEGRAPHICS))
USEWIN32 := $(strip $(USEWIN32))
USESHAREDHD := $(strip $(USESHAREDHD))

OCAMLMPI = ../ocamlmpi/
OCAML_INCLUDES := -I $(OCAMLMPI) -I +camlp4 -I ./grappa -I ./graphps $(LABLTK)

ifeq ($(USEWIN32), true)
	CCOPT := -ccopt -mno-cygwin $(CCOPT)
endif

-include $(PWD)/$(DEPEND)

GRAPHICS :=
ifeq ($(USEINTERFACE), ncurses)
	INTERFACE = status_ncurses.cma 
endif
ifeq ($(USEINTERFACE), flat)
	INTERFACE = status_flat.cma 
endif
ifeq ($(USEINTERFACE), gtk2)
	INTERFACE = status_gtk2.cma
	GRAPHICS := lablgtk.cma
	OCAML_INCLUDES := -I +lablgtk2 $(OCAML_INCLUDES)
endif
ifeq ($(USEINTERFACE), cocoa)
	INTERFACE = status_cocoa.cma
	CCOPT := -ccopt "-framework Cocoa" $(CCOPT)
endif

ifeq ($(USEINTERFACE), html)
	INTERFACE = status_html.cma
endif


ifeq ($(USEGRAPHICS), tk)
     GRAPHICS := labltk.cma $(GRAPHICS)
else
ifeq ($(USEGRAPHICS), ocaml)
     GRAPHICS := graphics.cma $(GRAPHICS)
endif
endif

ifeq ($(USEGRAPHICS), tk)
	LABLTK = -I +labltk
else
	LABLTK =
endif

PREPROCESSOR = -pp 'camlp4o pa_extend.cmo'


# Encapsulate all the options
DEFOPTS :=
ifeq ($(USEPARALLEL), true)
	DEFOPTS := $(DEFOPTS) -DUSEPARALLEL
ifeq ($(USENOSHAREDHD), true)
	DEFOPTS := $(DEFOPTS) -DUSENOSHAREDHD
endif
endif


ifeq ($(USEGRAPHICS), tk)
    DEFOPTS := $(DEFOPTS) -DUSEGRAPHICS=2
endif

ifeq ($(USEGRAPHICS), ocaml)
	DEFOPTS := $(DEFOPTS) -DUSEGRAPHICS=1
endif

NCURSES_LIBRARIES := 
ifeq ($(USEINTERFACE), ncurses)
	DEFOPTS := $(DEFOPTS) -DUSENCURSES
	NCURSES_LIBRARIES := -ccopt -lncurses -ccopt -lmenu
endif


ifeq ($(USEWIN32), true)
	DEFOPTS := $(DEFOPTS) -DUSEWIN32
endif

CPREPROCESSOR := -pp 'gcc -x c -E $(DEFOPTS)'


ifeq ($(USEWIN32), true)
	NCURSES_LIBRARIES :=
endif

SUBDIRS = grappa graphps

grappa/grappa.cmxa:
	$(MAKE) -C grappa grappa.cmxa

grappa/grappa.cma:
	$(MAKE) -C grappa grappa.cma

graphps/graphps.cmx: graphps/graphps.mli graphps/graphps.ml
	$(MAKE) -C graphps graphps.cmx

graphps/graphps.cmo: graphps/graphps.mli graphps/graphps.ml
	$(MAKE) -C graphps graphps.cmo

# run as "make target DEBUG=-g" to compile a debug executable
DEBUG = -g

all: mpoy.opt

# Useful groups of components
LANGUAGE = intSpec.cmo alphSpec.cmo wordSpec.cmo specIndex.cmo characSpec.cmo \
	hashedFuncs.cmo data.cmo poyParser.cmo

PARALLEL = methods.cmo 

# ftol.cmo register.cmo process.cmo comm.cmo parallel.cmo 

CHROM_OBJS = grappa/grappa.cma utl.cmo chromPam.cmo staMat.cmo utlPoy.cmo \
	utlGrappa.cmo incList.cmo sufNode.cmo sufTree.cmo subseq.cmo \
	seed.cmo block.cmo genAli.cmo aliMap.cmo chromAli.cmo chrom.cmo chromCS.cmo 


GENOME_OBJS = grappa/grappa.cma utl.cmo chromPam.cmo staMat.cmo utlPoy.cmo \
	utlGrappa.cmo genomeAli.cmo genome.cmo genomeCS.cmo


BREAKINV_OBJS = grappa/grappa.cma utl.cmo utlPoy.cmo \
	utlGrappa.cmo genAli.cmo breakinvAli.cmo breakinv.cmo breakinvCS.cmo

ANNCHROM_OBJS = grappa/grappa.cma utl.cmo utlPoy.cmo \
	utlGrappa.cmo genAli.cmo annchromAli.cmo annchrom.cmo annchromCS.cmo


CHARACTER = sleep.o timer.cmo array_ops.cmo char_add.cmo char_nonadd.cmo \
	sankCS.cmo seqCS.cmo chromCS.cmo genomeCS.cmo  breakinvCS.cmo annchromCS.cmo \
	dynamicCS.cmo nodeSig.cmo node.cmo allDirNode.cmo edge.cmo \
	characterScripting.cmo  metric.cmo

PARSER = parser.cmo $(LANGUAGE) 

ifeq ($(USEGRAPHICS), tk)
      TREEOUTPUT = asciiTree.cmo graphTree.cmo graphicTK.cmo graphicsPs.cmo
else 
ifeq ($(USEGRAPHICS), ocaml)
       TREEOUTPUT = asciiTree.cmo graphTree.cmo graphicsScreen.cmo graphicsPs.cmo	
else 
       TREEOUTPUT = asciiTree.cmo graphTree.cmo graphicsPs.cmo 
endif
endif

TREE = enum.cmo bitSet.cmo tree.cmo rtree.cmo hash_tbl.cmo gen_rtree.cmo \
	graphps/graphps.cmo $(TREEOUTPUT) ptree.cmo searchInformation.cmo \
	chartree.cmo sparceMatrix.cmo unionTree.cmo allDirChar.cmo sampler.cmo \
	queues.cmo tabus.cmo treeSearch.cmo impliedAlignment.cmo charTransform.cmo \
	mst.cmo build.cmo 

DISTANCE_LIBS = character.cmo addCS.cmo memstack.o add.o nonaddCS8.cmo \
	nonaddCSc8.o nonaddCS16.cmo nonaddCSc16.o nonaddCS32.cmo nonaddCSc32.o

SEQUENCE = all_sets.cmo alphabet.cmo cost_matrix.cmo matrix.cmo \
	primes.cmo fingerPrint.cmo sequence.cmo zarr.o avl.o algn.o

# Some personal tests that can be useful for everyone 
CAMLP4PROCESSED = poyParser.ml poyCommand.ml 

GETRUSAGE :=
ifeq ($(USEWIN32), false)
	GETRUSAGE := getrusage.o
endif

BASE_OBJS := sleep.o timer.cmo $(GETRUSAGE) compileFlags.cmo buildNumber.cmo \
	version.cmo sadmanlib.cma $(INTERFACE) \
	sexpr.cmo tags.cmo poyFormaters.cmo fileStream.cmo sequences.cma  \
	$(PARSER) distances.cma \
	$(CHROM_OBJS) $(BREAKINV_OBJS) $(ANNCHROM_OBJS) $(GENOME_OBJS) $(CHARACTER) trees.cma \
	diagnosis.cmo supports.cmo help.cmo helpIndex.cmo methods.cmo \
	analyzer.cmo poyCommand.cmo poyFile.cmo scripting.cmo 

MAIN_OBJS = $(BASE_OBJS) arguments.cmo compileFlags.cmo main.cmo

BASE_OBJS_OPT = $(patsubst %.cmo,%.cmx, $(patsubst %.cma,%.cmxa, $(BASE_OBJS)))

MAIN_OBJS_OPT = $(patsubst %.cmo,%.cmx, $(patsubst %.cma,%.cmxa, $(MAIN_OBJS)))

TEST_OBJS = $(BASE_OBJS) sadmanlib.cma test.cmo

TEST_OBJS_OPT = $(patsubst %.cmo,%.cmx, $(patsubst %.cma,%.cmxa, $(TEST_OBJS)))

UNIT_OBJS = $(BASE_OBJS) test_unit.cmo

SADMAN = sadmanOutput.cmo sadman.cmo

all_libs: status_ncurses.cma status_flat.cma sequences.cma distances.cma \
	trees.cma sadmanlib.cma sequences.cmxa distances.cmxa \
	trees.cmxa parsers.cmxa sadmanlib.cmxa

# If you keep a set of personal test programs and their make scripts,
# set them up in Makefile.local, don't add them on this Makefile directly. 
-include Makefile.local

clean:	
	rm -f *.annot *.cmi *.cmo *.cmx* *.o *.a *.so lparser.ml lparser.mli llexer.ml \
	mpoy_console mpoy mpoy.opt *.cma nonaddCS8.ml nonaddCS16.ml nonaddCS32.ml \
	nonaddCSc8.c nonaddCSc16.c nonaddCSc32.c mpoy.opt2 status.ml ocaml-str \
	$(LOCAL_CLEAN) 
	@for subs in $(SUBDIRS); do \
	  cd $$subs; \
	  $(MAKE) clean; \
	  cd ..; \
	done

sadmanOutput.cmo: compileFlags.cmo sadmanOutput.cmi 
sadmanOutput.cmx: compileFlags.cmx sadmanOutput.cmi 

depend: .depend

tags: otags ctags 

otags: *.ml
	otags -o otags $(filter-out poyParser.ml, $(wildcard *.ml))

ctags: *.c
	ctags -o ctags *.c

compileFlags.ml: ../config
	echo "(** automatically generated description of compile-time flags *)" \
	> $@
	echo >> $@
	echo "let cc = \"" `which gcc` `gcc --version` "\"" >> $@
	#echo "let ccopt = \"" $(CCOPT) "\"" >> $@
	echo "let ccopt = \"\"" >> $@
	echo "let ocamlc = \"" `which $(OCAMLC)` `$(OCAMLC) -version` "\"" \
	>> $@
	echo "let ocamlopt = \"" `which $(OCAMLOPT)` `$(OCAMLOPT) -version` \
	"\"" >> $@
	echo "let time = \"" `date -r` "\"" >> $@
	echo "let str_parallel = \"" `grep USEPARALLEL ../config` "\"" >> $@
	echo "let str_interface = \"" `grep USEINTERFACE ../config` "\"" >> $@
	echo "let str_graphics = \"" `grep USEGRAPHICS ../config` "\"" >> $@

# The libraries
status_ncurses.cma : dequeue.cmo status.cmi ncurses.o ncursesML.cmo \
	statusCommon.cmo status_ncurses.ml
	cp status_ncurses.ml status.ml
	$(OCAMLC) $(CCOPT) -custom -g -a -o $(@) $(NCURSES_LIBRARIES) ncurses.o \
	ncursesML.cmo dequeue.cmo statusCommon.cmo status.ml $(MKLIBOPT) $(PROFILE)

status_gtk2.cma: status.cmi statusCommon.cmo status_gtk2.ml
	cp status_gtk2.ml status.ml
	$(OCAMLC) -custom -g -a -o $@ -I +lablgtk2 statusCommon.cmo status.ml \
	$(MKLIBOPT) $(CCOPT) $(PROFILE)

status_cocoa.cma: status.cmi statusCommon.cmo status_cocoa.ml PoyStatus.o \
	PoyController.o CocoaCaml.o
	cp status_cocoa.ml status.ml
	$(OCAMLC) -custom -g -a -o $@ PoyStatus.o PoyController.o \
	CocoaCaml.o statusCommon.cmo status.ml $(MKLIBOPT) $(CCOPT) $(PROFILE)

status_html.cma: status.cmi statusCommon.cmo status_html.ml
	cp status_html.ml status.ml
	$(OCAMLC) -custom -g -a -o $@ statusCommon.cmo status.ml $(MKLIBOPT) \
	$(CCOPT) $(PROFILE)

status_flat.cma: status.cmi statusCommon.cmo status_flat.ml
	cp status_flat.ml status.ml
	$(OCAMLC) -custom -g -a -o $@ statusCommon.cmo status.ml $(MKLIBOPT) \
	$(CCOPT) $(PROFILE)

distances.cma: sequences.cma $(DISTANCE_LIBS)
	$(OCAMLC) $(OCAML_INCLUDES) -custom -a -o $@ $(^:sequences.cma=) $(MKLIBOPT) $(CCOPT)

parsers.cma : $(PARSER)
	$(OCAMLC) $(OCAML_INCLUDES) -custom -a -o $@ $^ $(MKLIBOPT) $(CCOPT)

trees.cma : $(CHARACTER) $(TREE)
	$(OCAMLC) $(OCAML_INCLUDES) -custom -a -o $@ $(MKLIBOPT) $(CCOPT) $(TREE)

sequences.cma: $(SEQUENCE)
	$(OCAMLC) $(OCAML_INCLUDES) -custom -a -o $@ $(^:methods.cmo=) $(MKLIBOPT) $(CCOPT)

sadmanlib.cma: $(SADMAN)
	$(OCAMLC) -a -o $@ $^ $(CCOPT) $(MKLIBOPT)

status_ncurses.cmxa : dequeue.cmx status.cmi ncurses.o ncursesML.cmx \
	statusCommon.cmx status_ncurses.ml
	cp status_ncurses.ml status.ml
	$(OCAMLOPT) $(CCOPT) -a -o $@ $(NCURSES_LIBRARIES) \
	ncurses.o dequeue.cmx ncursesML.cmx \
	statusCommon.cmx status.ml $(MKLIBOPT) $(PROFILE)

status_html.cmxa: status.cmi statusCommon.cmx status_html.ml
	cp status_html.ml status.ml
	$(OCAMLOPT) -a -o $@ statusCommon.cmx status.ml $(MKLIBOPT) \
	$(CCOPT) $(PROFILE)

status_flat.cmxa: status.cmi statusCommon.cmx status_flat.ml
	cp status_flat.ml status.ml
	$(OCAMLOPT) -a -o $@ statusCommon.cmx status.ml $(MKLIBOPT) \
	$(CCOPT) $(PROFILE)

status_gtk2.cmxa: status.cmi statusCommon.cmx status_gtk2.ml
	cp status_gtk2.ml status.ml
	$(OCAMLOPT) -a -o $@ -I +lablgtk2 statusCommon.cmx status.ml \
	$(MKLIBOPT) $(CCOPT) $(PROFILE)

status_cocoa.cmxa: status.cmi statusCommon.cmx status_cocoa.ml PoyStatus.o \
	PoyController.o CocoaCaml.o
	cp status_cocoa.ml status.ml
	$(OCAMLOPT) -a -o $@ PoyStatus.o PoyController.o \
	CocoaCaml.o statusCommon.cmx status.ml $(MKLIBOPT) $(CCOPT) $(PROFILE)


sequences.cmxa: $(SEQUENCE:.cmo=.cmx)
	$(OCAMLOPT) -a -o $@ $^ $(MKLIBOPT) $(CCOPT) $(PROFILE)

distances.cmxa: ${DISTANCE_LIBS:.cmo=.cmx}
	$(OCAMLOPT) -a -o $@ $^ $(MKLIBOPT) $(CCOPT) $(PROFILE)

parsers.cmxa : ${PARSER:.cmo=.cmx}
	$(OCAMLOPT) -a -o $@ $^ $(MKLIBOPT) $(CCOPT) $(PROFILE)

trees.cmxa : $(CHARACTER:.cmo=.cmx)  ${TREE:.cmo=.cmx}
	$(OCAMLOPT) $(OCAML_INCLUDES) -a -o $@ $(MKLIBOPT) $(CCOPT) ${TREE:.cmo=.cmx} $(PROFILE)

sadmanlib.cmxa: $(SADMAN:.cmo=.cmx)
	$(OCAMLOPT) -a -o $@ $^ $(MKLIBOPT) $(CCOPT) $(PROFILE)

.PHONY: subdirs $(SUBDIRS) clean driver doc buildNumber.ml

# -d .. puts stuff in prev directory
# -dot outputs dependency graph as .dot
FOR_DOC_FILES = $(filter-out $(wildcard $(CAMLP4PROCESSED:.ml=.mli)), $(wildcard *.mli)) \
	$(filter-out $(CAMLP4PROCESSED), $(wildcard *.ml))

doc: all_libs
	ocamldoc.opt -v -latex -keep-code -d ../doc/ -sort -stars $(OCAML_INCLUDES) \
	-colorize-code $(FOR_DOC_FILES) || true

graph: all_libs
	ocamldoc -v -dot -d ../doc/dependencies.dot $(OCAML_INCLUDES) \
	$(FOR_DOC_FILES) || true

subdirs: $(SUBDIRS)

# Poy language parser and lexer
lparser.mli lparser.ml: lparser.mly
	$(OCAMLYACC) -v lparser.mly

lparser.cmi lparser.cmo: lparser.ml lparser.mli
	$(OCAMLC) $(DEBUG) -c lparser.mli lparser.ml

lparser.cmx: lparser.ml lparser.mli
	$(OCAMLOPT) -c lparser.mli lparser.ml $(PROFILE) $(CCOPT)

llexer.ml: llexer.mll lparser.ml
	$(OCAMLLEX) llexer.mll

llexer.cmi llexer.cmo: llexer.ml
	$(OCAMLC) $(DEBUG) -c llexer.ml

llexer.cmx: llexer.ml
	$(OCAMLOPT) -c llexer.ml $(PROFILE) $(CCOPT)

parser.cmo: fileStream.cmo parser.cmi parser.ml 
	$(OCAMLC) $(OCAML_INCLUDES:-unsafe=) -c $(DEBUG:-unsafe=) parser.ml

parser.cmx: fileStream.cmx parser.ml 
	$(OCAMLOPT) $(OCAML_INCLUDES:-unsafe=) -c parser.ml $(PROFILE:-unsafe=) $(CCOPT:-unsafe)

status.cma status.cmxa: ../config

# All the libraries specialized for certain size in the character set.
# First we define the sed scripts that will replace the names with the
# approprate needs 
SED8 = sed "s/nonadd_/nonadd8_/g"
SED16 = sed "s/nonadd_/nonadd16_/g"
SED32 = sed "s/nonadd_/nonadd32_/g"

nonaddCS8.ml: nonaddCS.ml
	$(SED8) $< > $@

nonaddCS16.ml: nonaddCS.ml
	$(SED16) $< > $@

nonaddCS32.ml: nonaddCS.ml
	$(SED32) $< > $@

nonaddCSc8.o: nonaddCSc.c
	$(SED8) $< > ${@:.o=.c}
	$(OCAMLOPT) $(CCOPT) -ccopt -DCHARSIZE=8 -c -I $(INCLUDE) ${@:.o=.c} $(PROFILE)

nonaddCSc16.o: nonaddCSc.c
	$(SED16) $< > ${@:.o=.c}
	$(OCAMLOPT) $(CCOPT) -ccopt -DCHARSIZE=16 -c -I $(INCLUDE) ${@:.o=.c} $(PROFILE)

nonaddCSc32.o: nonaddCSc.c
	$(SED32) $< > ${@:.o=.c}
	$(OCAMLOPT) $(CCOPT) -ccopt -DCHARSIZE=32 -c -I $(INCLUDE) ${@:.o=.c} $(PROFILE)

add.o: memstack.o

# Help file gets made using OCaml script
help.txt: compileFlags.cmx sadmanOutput.cmx statusCommon.cmx \
	fileStream.cmx latex.ml ../doc/allcommands.tex
ifeq ($(USEPARALLEL), true)
	$(OCAMLOPT) $(OCAML_INCLUDES) $(CCOPT) -o latex_helper -cclib \
	-L$(OCAMLMPI) -cclib -l$(MPILNAME) \
	mpi.cmxa unix.cmxa compileFlags.cmx \
	sadmanOutput.cmx statusCommon.cmx fileStream.cmx latex.ml
else 
	$(OCAMLOPT) -o latex_helper unix.cmxa compileFlags.cmx \
	sadmanOutput.cmx statusCommon.cmx fileStream.cmx latex.ml
endif
	./latex_helper > help.txt 
	rm latex_helper

help.ml: help.txt ocaml-str helpRead.ml
	./ocaml-str
help.html: help.txt ocaml-str helpRead.ml
	./ocaml-str -html
# Static loading to support OS X and Cygwin...
ocaml-str:
	$(OCAMLC) str.cma helpRead.ml -o ocaml-str

# Poy Parser needs to be preprocessed and remove the unsafe option
poyParser.cmo: poyParser.ml
	ocamlc -g $(PREPROCESSOR:-unsafe=) $(OCAML_INCLUDES:-unsafe=) -c $<
poyCommand.cmo: poyCommand.ml
	ocamlc -g $(PREPROCESSOR:-unsafe=) $(OCAML_INCLUDES:-unsafe=) -c $<
poyParser.cmx: poyParser.ml
	$(OCAMLOPT) $(PREPROCESSOR:-unsafe=) $(OCAML_INCLUDES:-unsafe=) $(CCOPT:-unsafe=) -c $<
poyCommand.cmx: poyCommand.ml
	$(OCAMLOPT) $(PREPROCESSOR:-unsafe=) $(OCAML_INCLUDES:-unsafe=) $(CCOPT:-unsafe=) -c $<
poyParser.cma: poyParser.ml
	$(OCAMLC) -g $(PREPROCESSOR:-unsafe=) -I +camlp4 $(OCAML_INCLUDES:-unsafe=) -c $(DEBUG:-unsafe=) $<
status_gtk2.cmo: status_gtk2.ml
	$(OCAMLC) -g -I +lablgtk2 $(OCAML_INCLUDES) -c $(DEBUG) status_gtk2.ml
main.cmo: arguments.cmo main.ml
	$(OCAMLC) -g $(CPREPROCESSOR) $(OCAML_INCLUDES) -c $(DEBUG) main.ml
main.cmx: arguments.cmx main.ml
	$(OCAMLOPT) $(CPREPROCESSOR) $(OCAML_INCLUDES) -c main.ml
scripting.cmo: scripting.cmi scripting.ml
	$(OCAMLC)   $(CPREPROCESSOR) $(OCAML_INCLUDES) -c $(DEBUG) scripting.ml
scripting.cmx: scripting.cmi scripting.ml
	$(OCAMLOPT) $(CPREPROCESSOR) $(OCAML_INCLUDES) -c scripting.ml
timer.cmo: timer.cmi timer.ml
	$(OCAMLC)   $(CPREPROCESSOR) $(OCAML_INCLUDES) -c $(DEBUG) timer.ml
timer.cmx: timer.cmi timer.ml
	$(OCAMLOPT) $(CPREPROCESSOR) $(OCAML_INCLUDES) -c timer.ml
sampler.cmo: tree.cmi timer.cmi sequence.cmi ptree.cmi nodeSig.cmo edge.cmi \
    all_sets.cmi methods.cmi sampler.ml
	$(OCAMLC)   $(CPREPROCESSOR) $(OCAML_INCLUDES) -c $(DEBUG) sampler.ml
sampler.cmx: tree.cmx timer.cmx sequence.cmx ptree.cmx nodeSig.cmx edge.cmx \
    all_sets.cmx methods.cmx sampler.ml
	$(OCAMLOPT) $(CPREPROCESSOR) $(OCAML_INCLUDES) -c sampler.ml
fileStream.cmo: fileStream.ml
	$(OCAMLC)   $(CPREPROCESSOR) $(OCAML_INCLUDES) -c $(DEBUG) fileStream.ml
fileStream.cmx: fileStream.ml
	$(OCAMLOPT)   $(CPREPROCESSOR) $(OCAML_INCLUDES) -c fileStream.ml


# Generics for all the builds

.SUFFIXES: .ml .mli .cmo .cmx .cmi .c .o

CPREPROCESSED = fileStream.ml sampler.ml timer.ml scripting.ml main.ml
DOCFILTER = $(CAMLP4PROCESSED) $(CPREPROCESSED)

.depend: nonaddCS8.ml nonaddCS16.ml nonaddCS32.ml *.ml *.mli *.c *.h
	$(OCAMLDEP) $(OCAML_INCLUDES) \
	$(filter-out $(DOCFILTER), $(wildcard *.ml)) \
	$(filter-out $(DOCFILTER:.ml=.mli), $(wildcard *.mli)) > .depend 
	$(OCAMLDEP) $(PREPROCESSOR) $(CAMLP4PROCESSED) $(CAMLP4PROCESSED:.ml=.mli) >> .depend
	$(OCAMLDEP) $(CPREPROCESSOR) $(CPREPROCESSED) scripting.mli >> .depend
	$(OCAMLOPT) $(CCOPT) -ccopt -MM *.c >> .depend

ultrametric.cmo: status.cmi ultrametric.cmi ultrametric.ml
	ocamlfind ocamlc -v -g ultrametric.ml -package ocamlgraph -linkpkg
ultrametric.cmx: status.cmx ultrametric.cmi ultrametric.ml
	ocamlfind ocamlopt -v ultrametric.ml -package ocamlgraph -linkpkg

.ml.cmo:
	$(OCAMLC) $(OCAML_INCLUDES) -c $(DEBUG) $<

.ml.cma:
	$(OCAMLC) -I +camlp4 $(OCAML_INCLUDES) -c $(DEBUG) $<

.ml.cmx:
	$(OCAMLOPT) $(OCAML_INCLUDES) $(CCOPT) -c $< $(PROFILE)

.mli.cmi:
	$(OCAMLC) $(OCAML_INCLUDES) $(DEBUG) $<

.m.o:
	$(CC) -I `$(OCAMLC) -where` -c -framework Cocoa $< 

.c.o:
	$(OCAMLOPT) $(CCOPT) -c -I $(INCLUDE) $< $(PROFILE)

mpoy: $(MAIN_OBJS)
ifeq ($(USEPARALLEL), true)
	$(OCAMLC) -custom $(OCAML_INCLUDES) -cc mpicc -cclib -L$(OCAMLMPI) \
		-cclib -l$(MPILNAME) $(OCAMLMPI)/mpi.cma -cclib -l$(MPILNAME) \
		-cclib -lcamlgrappa $(CCOPT) $(DEBUG) -ccopt -L./ -o mpoy \
		$(GRAPHICS) camlp4.cma unix.cma str.cma bigarray.cma $^
else
		$(OCAMLC) -custom $(OCAML_INCLUDES) -cclib -L$(OCAMLMPI) \
		-cclib -lcamlgrappa $(CCOPT) $(DEBUG) -ccopt -L./ -o mpoy \
		$(GRAPHICS) camlp4.cma unix.cma str.cma bigarray.cma $^
endif


mpoy.opt: $(MAIN_OBJS_OPT)
ifeq ($(USEPARALLEL), true)
	$(OCAMLOPT) $(PREPROCESSOR) $(OCAML_INCLUDES) -cclib -L./grappa \
	-cclib -L./graphps -cclib -L./ \
	-cclib -L$(OCAMLMPI) $(CCOPT) $(NCURSES_LIBRARIES) $(PROFILE) \
	-cclib -l$(MPILNAME) -cclib -lcamlgrappa -o $@ mpi.cmxa $(GRAPHICS:.cma=.cmxa) camlp4.cmxa \
	unix.cmxa str.cmxa bigarray.cmxa $^
else
	$(OCAMLOPT) $(PREPROCESSOR) $(OCAML_INCLUDES) -verbose -ccopt -v -cclib -L./grappa \
	-cclib  -L/usr/lib -cclib -L./graphps -cclib -L./  \
	$(CCOPT) -cclib -lcamlgrappa $(NCURSES_LIBRARIES) $(PROFILE) -o mpoy.opt \
	$(GRAPHICS:.cma=.cmxa) camlp4.cmxa unix.cmxa str.cmxa bigarray.cmxa $^
endif

# Interactive console to test various features
#mpoy_console: sequences.cma parsers.cma distances.cma trees.cma 
mpoy_console: $(BASE_OBJS) scripting.cmo 
ifeq ($(USEPARALLEL), true)
	$(OCAMLTOP) $(PREPROCESSOR) $(OCAML_INCLUDES) -cc mpicc -cclib -L./ \
	-I $(OCAMLMPI) -cclib -L./grappa -cclib -L./graphps -custom -cclib \
	-L$(OCAMLMPI) $(CCOPT) $(PROFILE) \
	-cclib -l$(MPILNAME) -cclib -lcamlgrappa -o $@ mpi.cma $(GRAPHICS) camlp4o.cma unix.cma str.cma \
	bigarray.cma $^
else
	$(OCAMLTOP) $(CCOPT) $(PREPROCESSOR) $(OCAML_INCLUDES) -o $@ -cclib -L./grappa \
	-cclib -L./graphps -cclib -L./ -cclib -lcamlgrappa $(GRAPHICS) unix.cma camlp4o.cma str.cma \
	bigarray.cma $^
endif