#### Generic Makefile for generating a single OCaml library
#### Change these things for your project

# Required
NAME     = unixutils
MODULES	 = $(NAME)
EXPORT_INTERFACES = $(NAME)

# Optional 

PACKAGES = unix pcre
PREDICATES =

C_LIBS   = 
C_OBJS	 = unixutils_stubs.o 

CCLIBS   =
CCOPTS   =
OCAML_OPTS = -pp "camlp4o pa_extend.cmo" -I +camlp4
OCAMLC_OPTS = $(OCAML_OPTS)
OCAMLOPT_OPTS = $(OCAML_OPTS) -compact #-verbose

CLEAN_EXTRAS = 

#### Mostly automatic from here on

OCAMLC   = ocamlfind ocamlc $(OCAMLC_OPTS) -g 
OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPT_OPTS) $(CCOPTS)
OCAMLDEP = ocamldep
OCAMLLEX = ocamllex
OCAMLYACC = ocamlyacc
OCAMLMKTOP = ocamlfind ocamlmktop
OCAMLMKLIB = ocamlmklib -verbose 

OBJECTS  = $(C_OBJS) $(addsuffix .cmo, $(MODULES))
XOBJECTS = $(C_OBJS) $(addsuffix .cmx, $(MODULES))

EXPORT_MLI = $(addsuffix .mli, $(EXPORT_INTERFACES))
EXPORT_CMI = $(addsuffix .cmi, $(EXPORT_INTERFACES))

ARCHIVE  = $(NAME).cma
XARCHIVE = $(NAME).cmxa
DLLNAME  = dll$(NAME)stub.so

OCAMLLIBDIR = $(shell ocamlc -where)
PKGLIBDIR = $(OCAMLLIBDIR)/$(NAME)
DEBINSTALL = install -p -o root -g root -m 644

.PHONY: all opt clean realclean install
all: byte opt
byte: $(ARCHIVE)
opt: $(XARCHIVE)

$(ARCHIVE): $(OBJECTS)
	$(OCAMLMKLIB) -o unixutils -oc unixutilsstub $(OBJECTS)

$(XARCHIVE): $(XOBJECTS)
	$(OCAMLMKLIB) -o unixutils -oc unixutilsstub $(XOBJECTS)

%.mli_: %.ml
	$(OCAMLC) -package "$(PACKAGES)" -c -i $*.ml > $@

.SUFFIXES: .cmo .cmi .cmx .ml .mli  .mly .mll

.ml.cmo:
	$(OCAMLC) -package "$(PACKAGES)" -predicates "$(PREDICATES)" -c $<
.mli.cmi:
	$(OCAMLC) -package "$(PACKAGES)" -predicates "$(PREDICATES)" -c $<
.ml.cmx:
	$(OCAMLOPT) -package "$(PACKAGES)" -predicates "$(PREDICATES)" -c $<

%.ml %.mli: %.mll
	$(OCAMLLEX) $< 

%.ml %.mli: %.mly
	$(OCAMLYACC) $< 

depend: *.ml $(wildcard *.mli) $(patsubst %.mly, %.ml, $(wildcard *.mly)) Makefile
	$(OCAMLDEP) $(OCAML_OPTS) $(patsubst %, %.ml, $(MODULES)) $(patsubst %, %.mli, $(EXPORT_INTERFACES)) >depend
include depend

doc: Makefile $(NAME).ml $(NAME).mli
	install -d doc/html
	ocamldoc `ocamlfind query -i-format $(PACKAGES)` $(OCAML_OPTS)  -colorize-code -html $(NAME).ml $(NAME).mli -d doc/html


META: debian/changelog Makefile META.tmpl
	(VERSION=`head -n 1 debian/changelog | sed -e 's/.* (\(.*\)).*$$/\1/'`; \
	sed -e "s/NAME/$(NAME)/" META.tmpl | \
	sed -e "s/VERSION/$$VERSION/" | \
	sed -e "s/\"PACKAGES/\"$(PACKAGES)/" | \
	sed -e "s/\"ARCHIVE/\"$(ARCHIVE)/" | \
	sed -e "s/\"XARCHIVE/\"$(XARCHIVE)/" | \
	sed -e "s/CCLIBS/$(CCLIBS)/" \
	 > META )

install: all META
	install -d $(DESTDIR)$(PKGLIBDIR)
	$(DEBINSTALL) META $(NAME).cmxa $(NAME).cma $(EXPORT_MLI) $(EXPORT_CMI) $(DESTDIR)$(PKGLIBDIR)
	(test -f $(XARCHIVE) && $(DEBINSTALL) $(XARCHIVE) lib$(NAME)stub.a $(NAME).a $(DESTDIR)$(PKGLIBDIR))
	(test -f $(DLLNAME) && \
		install -d $(DESTDIR)$(OCAMLLIBDIR)/stublibs && \
		$(DEBINSTALL) $(DLLNAME) $(DESTDIR)$(OCAMLLIBDIR)/stublibs)

clean:
	rm -f *.cmi *.cmo *.cmx *.cma *.o *.a *.cma *.cmxa *.so META $(NAME).top *.output
	rm -rf doc
	rm -rf $(patsubst %.mly, %.ml, $(wildcard *.mly)) $(patsubst %.mly, %.mli, $(wildcard *.mly))
	rm -rf $(patsubst %.mll, %.ml, $(wildcard *.mll)) $(patsubst %.mll, %.mli, $(wildcard *.mll))

realclean: clean
	rm -f *~ TAGS


#.PHONY: install uninstall
#install: all
#	{ test ! -f $(XARCHIVE) || extra="$(XARCHIVE) "`basename $(XARCHIVE) .cmxa`.a }; \
#	ocamlfind install $(NAME) *.mli *.cmi $(ARCHIVE) META $$extra -destdir $(DESTDIR)

#uninstall:
#	ocamlfind remove $(NAME)

#Last but not least a cleanup rule:
#
#.PHONY: clean
#         rm -f *.cmi *.cmo *.cmx *.cma *.cmxa *.a


