diff --git a/tools/ocaml/Makefile b/tools/ocaml/Makefile new file mode 100644 index 0000000..adc35b4 --- /dev/null +++ b/tools/ocaml/Makefile @@ -0,0 +1,36 @@ +XEN_ROOT = ../.. +include $(XEN_ROOT)/tools/Rules.mk + +SUBDIRS_LIBS = \ + libs/uuid libs/stdext libs/mmap \ + libs/log libs/xc libs/eventchn \ + libs/xb libs/xs + +SUBDIRS_PROGRAMS = xenstored + +SUBDIRS = $(SUBDIRS_LIBS) $(SUBDIRS_PROGRAMS) + +.PHONY: all +all: build + +.PHONY: build $(SUBDIRS) +build: $(SUBDIRS) + +$(SUBDIRS): + @echo " === building $@" + @$(MAKE) --no-print-directory -C $@ + +.PHONY: install install-libs install-program +install: install-libs install-program + +install-program: $(SUBDIRS_PROGRAMS) + $(INSTALL_DIR) $(DESTDIR)$(SBINDIR) + $(INSTALL_PROG) xenstored/oxenstored $(DESTDIR)$(SBINDIR) + +install-libs: $(SUBDIRS_LIBS) + +.PHONY: clean +clean: + @for dir in $(SUBDIRS); do \ + $(MAKE) --no-print-directory -C $$dir clean; \ + done diff --git a/tools/ocaml/Makefile.rules b/tools/ocaml/Makefile.rules new file mode 100644 index 0000000..ee06b73 --- /dev/null +++ b/tools/ocaml/Makefile.rules @@ -0,0 +1,93 @@ +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 + +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 *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot $(LIBS) $(PROGRAMS) $(GENERATED_FILES) .ocamldep.make + +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 .cmxa and .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 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) $(CFLAGS) -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)))) diff --git a/tools/ocaml/common.make b/tools/ocaml/common.make new file mode 100644 index 0000000..3b14dfb --- /dev/null +++ b/tools/ocaml/common.make @@ -0,0 +1,28 @@ +CC ?= gcc +OCAMLOPT ?= ocamlopt +OCAMLC ?= ocamlc +OCAMLMKLIB ?= ocamlmklib +OCAMLDEP ?= ocamldep +OCAMLLEX ?= ocamllex +OCAMLYACC ?= ocamlyacc + +CFLAGS ?= -Wall -fPIC -O2 + +XEN_ROOT ?= $(TOPLEVEL)/../xen-unstable.hg +XEN_DIST_ROOT ?= $(XEN_ROOT)/dist/install +CFLAGS += -I$(XEN_DIST_ROOT)/usr/include + +OCAMLOPTFLAG_G := $(shell $(OCAMLOPT) -h 2>&1 | sed -n 's/^ *\(-g\) .*/\1/p') +OCAMLOPTFLAGS = $(OCAMLOPTFLAG_G) -ccopt "$(LDFLAGS)" -dtypes $(OCAMLINCLUDE) -cc $(CC) -w F -warn-error F +OCAMLCFLAGS += -g $(OCAMLINCLUDE) -w F -warn-error F + +#LDFLAGS = -cclib -L./ + +DESTDIR ?= / +VERSION := echo 0.0 + +OCAMLABI = $(shell $(OCAMLC) -version) +OCAMLLIBDIR = $(shell $(OCAMLC) -where) +OCAMLDESTDIR ?= $(OCAMLLIBDIR) + +o= >$@.new && mv -f $@.new $@