
include config.make

OCAMLNET     := ocamlnet-0.97.1
EXTLIB       := extlib-1.3

MLINCDIRS_LOCAL = -I $(OCAMLNET) -I mlsqlite -I $(EXTLIB) -I glib -I crypto
MLINCDIRS       = -I $(LABLGTK_DIR) $(MLINCDIRS_LOCAL)
GTK_CFLAGS := $(shell pkg-config gtk+-2.0 --cflags)
GNOMECANVAS_CFLAGS := $(shell pkg-config libgnomecanvas-2.0 --cflags)


SRC = $(OCAMLNET)/base64.ml $(OCAMLNET)/base64.mli \
      mlsqlite/sqlite3.ml mlsqlite/sqlite3.mli \
      $(EXTLIB)/IO.mli $(EXTLIB)/IO.ml $(EXTLIB)/unzip.ml $(EXTLIB)/unzip.mli \
      glib/gspawn.ml glib/gspawn.mli glib/giochannel.ml glib/giochannel.mli \
      glib/viz_gmisc.ml glib/gpattern.ml \
      crypto/crypto.ml crypto/crypto.mli \
      viz_misc.ml viz_misc.mli viz_types.ml viz_types.mli \
      q.ml q.mli \
      dot_lexer.ml dot_parser.ml dot_parser.mli \
      revision_types.mli revision_lexer.ml revision_parser.ml revision_parser.mli \
      subprocess.ml subprocess.mli \
      components.ml schema_lexer.ml \
      database.ml database.mli agraph.ml agraph.mli \
      autocolor.ml autocolor.mli viz_style.ml viz_style.mli \
      icon.ml ui.ml ui.mli unidiff.ml unidiff.mli \
      view.ml view.mli query.ml query.mli app.ml app.mli version.ml main.ml

C_OBJ = mlsqlite/ocaml-sqlite3.o \
        glib/ocaml-gspawn.o glib/ocaml-giochannel.o \
        glib/ocaml-misc.o glib/ocaml-gdate.o glib/ocaml-gpattern.o \
        crypto/ocaml-openssl.o \
        gnomecanvas_hack.o

USE_P4 = viz_style.ml

OBJ  = $(patsubst %.ml,%.cmo,$(filter %.ml, $(SRC)))
OBJX = $(patsubst %.ml,%.cmx,$(filter %.ml, $(SRC)))

DISTSRC = Makefile configure.ac config.make.in ocaml.m4 configure aclocal.m4 \
          monotone-viz.style.sample README INSTALL NEWS COPYING version.ml.in \
          viz_misc.ml viz_misc.mli viz_types.ml viz_types.mli q.ml q.mli \
          autocolor.ml autocolor.mli viz_style.ml viz_style.mli \
          dot_types.mli dot_lexer.mll dot_parser.mly \
          subprocess.ml subprocess.mli icon.ml ui.ml ui.mli \
          revision_types.mli revision_lexer.mll revision_parser.mly \
          components.ml schema_lexer.mll database.ml database.mli agraph.ml agraph.mli \
          unidiff.ml unidiff.mli gnomecanvas_hack.c view.ml view.mli \
          query.ml query.mli app.mli app.ml main.ml \
          mlsqlite/sqlite3.ml mlsqlite/sqlite3.mli \
          mlsqlite/config.h mlsqlite/ocaml-sqlite3.h mlsqlite/ocaml-sqlite3.c \
          ocamlnet-0.97.1/base64.ml ocamlnet-0.97.1/base64.mli ocamlnet-0.97.1/LICENSE \
          extlib-1.3/IO.ml extlib-1.3/IO.mli extlib-1.3/unzip.ml extlib-1.3/unzip.mli \
          glib/gspawn.ml glib/gspawn.mli glib/giochannel.ml glib/giochannel.mli \
          glib/viz_gmisc.ml glib/gpattern.ml \
          glib/ocaml-gspawn.c glib/ocaml-giochannel.c \
          glib/ocaml-misc.c glib/ocaml-gdate.c glib/ocaml-gpattern.c \
          glib/gspawn_tags.var glib/giochannel_tags.var \
          crypto/ocaml-openssl.c crypto/crypto.ml crypto/crypto.mli
DIST_LABLGTK= lablgtk/configure lablgtk/configure.in lablgtk/config.make.in \
              lablgtk/COPYING lablgtk/CHANGES lablgtk/README* \
              lablgtk/Makefile lablgtk/src/Makefile lablgtk/src/.depend \
              lablgtk/src/*.ml lablgtk/src/*.ml[il4] lablgtk/src/*.props \
              lablgtk/src/*.[ch] lablgtk/src/*.var lablgtk/src/lablgtk2.in



ifdef SQLITE_LIBS
LIB3RDPARTY_OBJ = $(C_OBJ)
SQLITE_LINK     = -cclib "$(SQLITE_LIBS)"
else
LIB3RDPARTY_OBJ = $(MONOTONE_DIR)/sqlite/lib3rdparty_a-*.o $(C_OBJ)
endif

ifeq ($(OCAMLBEST), opt)
monotone-viz : $(OBJX) lib3rdparty.a
	$(OCAMLOPT) -o $@ -I $(LABLGTK_DIR) $(MLLIBS) $^ $(CRYPTO_LIB) $(SQLITE_LINK)
monotone-viz : MLLIBS = str.cmxa lablgtk.cmxa gtkInit.cmx lablgnomecanvas.cmxa 
ifeq ($(LOCAL_LABLGTK), yes)
$(OBJX) : .lablgtk
endif
else
monotone-viz : $(OBJ) lib3rdparty.a
	$(OCAMLC) -custom -o $@ -I $(LABLGTK_DIR) $(MLLIBS) $^ $(CRYPTO_LIB) $(SQLITE_LINK)
monotone-viz : MLLIBS = str.cma lablgtk.cma gtkInit.cmo lablgnomecanvas.cma 
ifeq ($(LOCAL_LABLGTK), yes)
$(OBJ) : .lablgtk
endif
endif

lib3rdparty.a : $(C_OBJ)
	ar crs lib3rdparty.a $(LIB3RDPARTY_OBJ)

glib/ocaml-gspawn.o : glib/gspawn_tags.c glib/gspawn_tags.h
glib/ocaml-giochannel.o : glib/giochannel_tags.c glib/giochannel_tags.h
glib/ocaml-%.o           : CINCDIRS = -I $(LABLGTK_DIR) -ccopt "$(GTK_CFLAGS)"
ifdef SQLITE_LIBS
mlsqlite/ocaml-sqlite3.o : CINCDIRS = -ccopt "$(SQLITE_CFLAGS)"
else
mlsqlite/ocaml-sqlite3.o : CINCDIRS = -I $(MONOTONE_DIR)/sqlite
endif
crypto/ocaml-openssl.o   : CINCDIRS = -ccopt "$(CRYPTO_CFLAGS)"
gnomecanvas_hack.o       : CINCDIRS = -ccopt "$(GNOMECANVAS_CFLAGS)"
$(EXTLIB)/unzip.%        : MLFLAGS += -w y

REVISION_FILE := $(shell test -r _MTN/revision && echo _MTN/revision)
REVISION_ID    = $(shell mtn automate get_base_revision_id || ( test -r _MTN/revision && cat _MTN/revision ))
version.ml : version.ml.in $(REVISION_FILE)
	sed -e 's/@REVISION@/$(REVISION_ID)/' -e 's/@VERSION@/$(VERSION)/' < $< > $@

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

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

PP = $(if $(findstring $(1),$(USE_P4)),-pp $(CAMLP4O))

%.cmo : %.ml
	$(OCAMLC) $(MLFLAGS) $(MLINCDIRS) $(call PP,$<) -c $<

%.cmx : %.ml
	$(OCAMLOPT) $(MLFLAGS) $(MLINCDIRS) $(call PP,$<) -c $<

%.cmi : %.mli
	$(OCAMLC) $(MLINCDIRS) $<

%.o : %.c
	cd $(<D) ; $(OCAMLC) $(CINCDIRS) $(if $(CPPFLAGS),-ccopt "$(CPPFLAGS)") $(<F)

%.c %.h : %.var
	cd $(<D) ; $(LABLGTK_DIR)/varcc -static $(<F)

clean :
	rm -f *.a *.so *.o *.cm* monotone-viz
	rm -f dot_lexer.ml dot_parser.ml dot_parser.mli
	rm -f revision_lexer.ml revision_parser.ml revision_parser.mli
	rm -f schema_lexer.ml
	cd mlsqlite && rm -f *.a *.so *.o *.cm*
	cd $(OCAMLNET) && rm -f *.o *.cm*
	cd $(EXTLIB) && rm -f *.o *.cm*
	cd glib   && rm -f *.o *.cm*
	cd crypto && rm -f *.o *.cm*

install :
	install -d $(DESTDIR)$(bindir)
	install -m 0755 monotone-viz \
		$(DESTDIR)$(bindir)/`echo monotone-viz | sed '$(transform)'`

uninstall :
	rm -f $(DESTDIR)$(bindir)/`echo monotone-viz | sed '$(transform)'`

.PHONY : clean dist

ifeq ($OCAMLBEST, opt)
DEP_FLAGS = -native
endif

-include .depend
.depend : $(SRC)
	@echo "making deps ..."
	@$(OCAMLDEP) $(DEP_FLAGS) $(MLINCDIRS_LOCAL) $(filter-out $(USE_P4),$^) > $@
	@$(OCAMLDEP) $(DEP_FLAGS) -pp '$(CAMLP4O)' $(USE_P4) >> $@

dist : ../$(NAME)-$(VERSION).tar.gz
dist-nolablgtk : ../$(NAME)-$(VERSION)-nolablgtk.tar.gz
../$(NAME)-$(VERSION).tar.gz : $(DISTSRC)  $(DIST_LABLGTK)
../$(NAME)-$(VERSION)-nolablgtk.tar.gz : $(DISTSRC)
../%.tar.gz :
	export DIRNAME="$${PWD##*/}" ; \
        cd .. && mv "$$DIRNAME" $(NAME)-$(VERSION) && \
        tar zcvf $(@F) $(addprefix $(NAME)-$(VERSION)/,$^) && \
        mv $(NAME)-$(VERSION) "$$DIRNAME"

# no config.make
ifndef OCAMLLEX
$(error run ./configure first (cf README))
endif

.lablgtk :
	$(MAKE) -C lablgtk world
	touch $@
