tester_dir = tester
queues_dir = queues

tests_dir  = tests
tests_opt_dir = tests_opt

all_queues_cmo = $(patsubst $(queues_dir)/%.ml,%.cmo,$(wildcard $(queues_dir)/*.ml))
all_queues_cmx = $(patsubst $(queues_dir)/%.ml,%.cmx,$(wildcard $(queues_dir)/*.ml))
all_queues_ml  = $(patsubst $(queues_dir)/%.ml,%.ml,$(wildcard $(queues_dir)/*.ml))
all_tests_opt_ml  = $(patsubst $(tests_opt_dir)/%.ml,%.ml,$(wildcard $(tests_opt_dir)/*.ml))
all_tests_opt  = $(patsubst $(tests_opt_dir)/%.ml,%,$(wildcard $(tests_opt_dir)/*.ml))

ocaml_q_test: %.cmo $(all_queues_cmo)
        ocamlmktop -custom -o ocaml_q_test unix.cma Prioqueue.cmo Tester.cmo ParticularTests.cmo $(all_queues_cmo)
        rm -f *.ml *.mli *.cmo *.cma

%.cmo: Prioqueue.ml Tester.ml ParticularTests.ml $(all_queues_ml)
        ocamlc -c $^

%.cmx: Prioqueue.ml Tester.ml ParticularTests.ml $(all_queues_ml) $(all_tests_opt_ml)
        ocamlopt -c $^

Tester.ml: $(tester_dir)/Tester.ml
        install --mode=+rw $(tester_dir)/Tester.ml Tester.ml

Prioqueue.ml: $(tester_dir)/Prioqueue.ml
        install --mode=+rw $(tester_dir)/Prioqueue.ml Prioqueue.ml

ParticularTests.ml: $(tester_dir)/ParticularTests.ml
        install --mode=+rw $(tester_dir)/ParticularTests.ml ParticularTests.ml

%.ml: 
        install --mode=+rw $(wildcard */$@) .

$(all_tests_opt): %.cmx
        ocamlopt -o $@ unix.cmxa Prioqueue.cmx Tester.cmx ParticularTests.cmx $(all_queues_cmx) $@.cmx

opt:  %.cmx $(all_queues_cmx) $(all_tests_opt)
        install --mode=+rx $(all_tests_opt) tests_opt

install:
        install --mode=+rx ocaml_q_test tests
        install --mode=+rx $(wildcard *.cmi) tests

clean_all:
        rm -f *.ml *.mli *.cmo *.cmi *.o *.cmx ocaml_q_test
        rm -f $(tests_dir)/*.cmi $(tests_dir)/ocaml_q_test
        rm -f $(all_tests_opt) 
        rm -f $(patsubst %.ml,%,$(wildcard $(tests_opt_dir)/*.ml))

clean:
        rm -f *.ml *.mli *.cmo *.cmi *.o *.cmx ocaml_q_test
        rm -f $(all_tests_opt)