Makefile.rules 3.19 KB
Newer Older
Keir Fraser's avatar
Keir Fraser committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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

Keir Fraser's avatar
Keir Fraser committed
17 18
.NOTPARALLEL:

Keir Fraser's avatar
Keir Fraser committed
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
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)
48
	$(Q)rm -f .*.d *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot *.spot *.spit $(LIBS) $(PROGRAMS) $(GENERATED_FILES) .ocamldep.make
Keir Fraser's avatar
Keir Fraser committed
49 50 51 52 53 54 55 56

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 = \
57
	$(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e 's/^lib//'` $2,MKLIB,$1)
Keir Fraser's avatar
Keir Fraser committed
58 59 60 61

# 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)
62
	$(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx))
Keir Fraser's avatar
Keir Fraser committed
63 64 65 66 67
 $(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)
68
	$(call mk-caml-lib-stubs,$$@, $$+)
Keir Fraser's avatar
Keir Fraser committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
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)
87
	$(call quiet-command, $(CC) $(LDFLAGS) -o $$@ $$+,BIN,$$@)
Keir Fraser's avatar
Keir Fraser committed
88 89 90 91 92 93 94 95
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))))