aboutsummaryrefslogtreecommitdiffstats
path: root/tools/ocaml/Makefile.rules
blob: 5e6d81e4e992af820cdb4f6138e7c1b2a6d67e29 (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
ifdef V
  ifeq ("$(origin V)", "command line")
    BUILD_VERBOSE = $(V)
  endif
endif
ifndef BUILD_VERBOSE
  BUILD_VERBOSE = 0
endif
ifeq ($(BUILD_VERBOSE),1)
  E = @true
  Q =
else
  E = @echo
  Q = @
endif

.NOTPARALLEL:

ALL_OCAML_OBJS ?= $(OBJS)

%.cmo: %.ml
	$(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLC,$@)

%.cmi: %.mli
	$(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLI,$@)

%.cmx: %.ml
	$(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -c -o $@ $<,MLOPT,$@)

%.ml: %.mll
	$(call quiet-command, $(OCAMLLEX) -q -o $@ $<,MLLEX,$@)

%.ml: %.mly
	$(call quiet-command, $(OCAMLYACC) -q $<,MLYACC,$@)

%.o: %.c
	$(call quiet-command, $(CC) $(CFLAGS) -c -o $@ $<,CC,$@)

META: META.in
	sed 's/@VERSION@/$(VERSION)/g' < $< $o

ALL_OCAML_OBJ_SOURCES=$(addsuffix .ml, $(ALL_OCAML_OBJS))

.ocamldep.make: $(ALL_OCAML_OBJ_SOURCES) Makefile $(TOPLEVEL)/Makefile.rules
	$(call quiet-command, $(OCAMLDEP) $(ALL_OCAML_OBJ_SOURCES) *.mli $o,MLDEP,)

clean: $(CLEAN_HOOKS)
	$(Q)rm -f .*.d *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot *.spot *.spit $(LIBS) $(PROGRAMS) $(GENERATED_FILES) .ocamldep.make META

quiet-command = $(if $(V),$1,@printf " %-8s %s\n" "$2" "$3" && $1)

mk-caml-lib-native = $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -a -o $1 $2 $3,MLA,$1)
mk-caml-lib-bytecode = $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -a -o $1 $2 $3,MLA,$1)

mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1)
mk-caml-lib-stubs = \
	$(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e 's/^lib//'` $2,MKLIB,$1)

# define a library target <name>.cmxa and <name>.cma
define OCAML_LIBRARY_template
 $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx)
	$(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx))
 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo)
	$(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+)
 $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o)
	$(call mk-caml-stubs,$$@, $$+)
 lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o)
	$(call mk-caml-lib-stubs,$$@, $$+)
endef

define OCAML_NOC_LIBRARY_template
 $(1).cmxa: $(foreach obj,$($(1)_OBJS),$(obj).cmx)
	$(call mk-caml-lib-native,$$@, , $(foreach obj,$($(1)_OBJS),$(obj).cmx))
 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo)
	$(call mk-caml-lib-bytecode,$$@, , $$+)
endef

define OCAML_PROGRAM_template
 $(1): $(foreach obj,$($(1)_OBJS),$(obj).cmx) $($(1)_EXTRA_DEPS)
	$(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -o $$@ $($(1)_LIBS) $$+,MLBIN,$$@)
 $(1).byte: $(foreach obj,$($(1)_OBJS),$(obj).cmo)
	$(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -o $$@ $($(1)_BYTE_LIBS) $$+,MLBIN,$$@)
endef

define C_PROGRAM_template
 $(1): $(foreach obj,$($(1)_OBJS),$(obj).o)
	$(call quiet-command, $(CC) $(LDFLAGS) -o $$@ $$+,BIN,$$@)
endef

-include .ocamldep.make

$(foreach lib,$(OCAML_LIBRARY),$(eval $(call OCAML_LIBRARY_template,$(lib))))
$(foreach lib,$(OCAML_NOC_LIBRARY),$(eval $(call OCAML_NOC_LIBRARY_template,$(lib))))
$(foreach p,$(OCAML_PROGRAM),$(eval $(call OCAML_PROGRAM_template,$(p))))
$(foreach p,$(C_PROGRAM),$(eval $(call C_PROGRAM_template,$(p))))