1ifdef V 2 ifeq ("$(origin V)", "command line") 3 BUILD_VERBOSE = $(V) 4 endif 5else 6 V := 1 7 BUILD_VERBOSE := 1 8endif 9ifndef BUILD_VERBOSE 10 BUILD_VERBOSE := 0 11endif 12ifeq ($(BUILD_VERBOSE),1) 13 E := @true 14 Q := 15else 16 E := @echo 17 Q := @ 18endif 19 20.NOTPARALLEL: 21 22ALL_OCAML_OBJS ?= $(OBJS) 23 24%.cmo: %.ml 25 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLC,$@) 26 27%.cmi: %.mli 28 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLI,$@) 29 30%.cmx %.o: %.ml 31 $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -c -o $@ $<,MLOPT,$@) 32 33%.ml: %.mll 34 $(call quiet-command, $(OCAMLLEX) -q -o $@ $<,MLLEX,$@) 35 36%.ml: %.mly 37 $(call quiet-command, $(OCAMLYACC) -q $<,MLYACC,$@) 38 39%.o: %.c 40 $(call quiet-command, $(CC) $(CFLAGS) -c -o $@ $<,CC,$@) 41 42META: META.in 43 sed 's/@VERSION@/$(VERSION)/g' < $< > $@.tmp 44 $(call move-if-changed,$@.tmp,$@) 45 46ALL_OCAML_OBJ_SOURCES=$(addsuffix .ml, $(ALL_OCAML_OBJS)) 47 48ifneq ($(MAKECMDGOALS),clean) 49.ocamldep.make: $(ALL_OCAML_OBJ_SOURCES) Makefile $(OCAML_TOPLEVEL)/Makefile.rules 50 $(call quiet-command, $(OCAMLDEP) $(ALL_OCAML_OBJ_SOURCES) *.mli > $@.tmp; $(call move-if-changed,$@.tmp,$@),MLDEP,) 51endif 52 53clean: $(CLEAN_HOOKS) 54 $(Q)rm -f .*.d *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.cmxs *.annot *.spot *.spit $(LIBS) $(PROGRAMS) $(GENERATED_FILES) .ocamldep.make META 55 56distclean: clean 57 58quiet-command = $(if $(V),$1,@printf " %-8s %s\n" "$2" "$3" && $1) 59 60mk-caml-shared-lib-native = $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -shared -linkall -o $1 $2 $3,MLA,$1) 61mk-caml-lib-native = $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -a -o $1 $2 $3,MLA,$1) 62mk-caml-lib-bytecode = $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -a -o $1 $2 $3,MLA,$1) 63 64mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1) 65mk-caml-lib-stubs = \ 66 $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a | sed -e 's/^lib//'` $2 `echo $3 | sed -e 's/-ccopt -l/-l/g' | sed -e 's/-ccopt -L/-ldopt -L/g'`,MKLIB,$1) 67 68# define a library target <name>.cmxa and <name>.cma 69define OCAML_LIBRARY_template 70 $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) 71 $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) 72 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 73 $(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $$+) 74 $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) 75 $(call mk-caml-stubs,$$@, $$+) 76 lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) 77 $(call mk-caml-lib-stubs,$$@, $$+, $(foreach lib,$(LIBS_$(1)),-ccopt $(lib))) 78endef 79 80# Dynamically linked OCaml libraries ("plugins" in Dynlink parlance) 81# need to compile an .cmxs file 82define OCAML_DYN_LIBRARY_template 83 $(1).cmxs: $(1).cmxa 84 $(call mk-caml-shared-lib-native,$$@, $(1).cmxa) 85 $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) 86 $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) 87 $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) 88 $(call mk-caml-stubs,$$@, $$+) 89 lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) 90 $(call mk-caml-lib-stubs,$$@, $$+) 91endef 92 93define OCAML_NOC_LIBRARY_template 94 $(1).cmxa: $(foreach obj,$($(1)_OBJS),$(obj).cmx) 95 $(call mk-caml-lib-native,$$@, , $(foreach obj,$($(1)_OBJS),$(obj).cmx)) 96 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 97 $(call mk-caml-lib-bytecode,$$@, , $$+) 98endef 99 100define OCAML_PROGRAM_template 101 $(1): $(foreach obj,$($(1)_OBJS),$(obj).cmx) $($(1)_EXTRA_DEPS) 102 $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -o $$@ $($(1)_LIBS) $$+,MLBIN,$$@) 103 $(1).byte: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 104 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -o $$@ $($(1)_BYTE_LIBS) $$+,MLBIN,$$@) 105endef 106 107define C_PROGRAM_template 108 $(1): $(foreach obj,$($(1)_OBJS),$(obj).o) 109 $(call quiet-command, $(CC) $(LDFLAGS) -o $$@ $$+,BIN,$$@) 110endef 111 112-include .ocamldep.make 113 114$(foreach lib,$(OCAML_LIBRARY),$(eval $(call OCAML_LIBRARY_template,$(lib)))) 115$(foreach lib,$(OCAML_DYN_LIBRARY),$(eval $(call OCAML_DYN_LIBRARY_template,$(lib)))) 116$(foreach lib,$(OCAML_NOC_LIBRARY),$(eval $(call OCAML_NOC_LIBRARY_template,$(lib)))) 117$(foreach p,$(OCAML_PROGRAM),$(eval $(call OCAML_PROGRAM_template,$(p)))) 118$(foreach p,$(C_PROGRAM),$(eval $(call C_PROGRAM_template,$(p)))) 119