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

# Required
NAME     = debian
MODULES	 = prelexer \
	debparser \
	deblexer \
	desktopparser \
	desktoplexer \
	libmenuparser \
	libmenulexer \
	logparser \
	loglexer \
	$(NAME) \
	debinfo \
	dh

EXPORT_INTERFACES = debparser desktopparser desktoplexer libmenuparser libmenulexer logparser $(NAME) debinfo

# Optional 

PACKAGES = pcre
PREDICATES =

C_LIBS   = 
C_OBJS	 = debian_c.o

CCLIBS   =
CCOPTS   =
OCAMLC_OPTS =
OCAMLOPT_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)) dh.cmi

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 debian -oc debianstub $(OBJECTS)

$(XARCHIVE): $(XOBJECTS)
	$(OCAMLMKLIB) -o debian -oc debianstub $(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: %.mll
	$(OCAMLLEX) $< 

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

depend: *.ml $(wildcard *.mli) $(patsubst %.mly, %.ml, $(wildcard *.mly)) \
		$(patsubst %.mll, %.ml, $(wildcard *.mll)) Makefile
	$(OCAMLDEP) *.ml *.mli >depend
include depend

doc: Makefile $(NAME).ml $(NAME).mli
	install -d doc/html
	ocamldoc `ocamlfind query -i-format $(PACKAGES)` -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))

realclean: clean
	rm -f *~ TAGS *.mli_


#.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


