-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
51 lines (40 loc) · 1.36 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Compiler config
ocamlc ?= ocamlopt
flags ?= -w -8
obj = $(if $(findstring ocamlopt,$(ocamlc)),cmx,cmo)
lib = $(if $(findstring ocamlopt,$(ocamlc)),cmxa,cma)
# Libraries needed
libraries = str
# Source dependencies
lang_deps = utils
enumerate_deps = utils lang
simplify_deps = utils lang
parse_deps = utils lang bark
unparse_deps = lang
demo_deps = utils lang simplify enumerate parse unparse
examples_deps = utils lang simplify parse unparse
parse_tests_deps = utils parse unparse
# Main modules
programs = demo examples parse_tests
outputs = demo.txt examples.md
# Build rules
.PHONY: all clean
all: $(programs) $(outputs)
clean:
rm -rf *.cmi *.cmo *.cmx *.o $(programs) ocamlprof.dump
$(outputs):
./$< <<< "" > $@
$(programs):
$(ocamlc) $(flags) $(libraries:=.$(lib)) $^ -o $@
%.cmi: %.mli
$(ocamlc) -opaque $(flags) -c $<
%.cmi %.$(obj): %.ml
$(ocamlc) $(flags) -c $<
# Dependency helper functions
resolve = $($(1)_deps:=.$(2))
transitive = $(foreach dep,$($(1)_deps),$(call transitive,$(dep),$(2))) $(1).$(2)
# Register dependencies as declared
$(foreach i,$(wildcard *.mli),$(eval $(i:.mli=.$(obj)): $(i:.mli=.cmi)))
$(foreach src,$(wildcard *.ml),$(eval $(src:.ml=.cmi) $(src:.ml=.$(obj)) &: $(call resolve,$(src:.ml=),cmi)))
$(foreach prog,$(programs),$(eval $(prog): $(call transitive,$(prog),$(obj))))
$(foreach out,$(outputs),$(eval $(out): $(basename $(out))))