
include config.make

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


SRC = glib/gspawn.ml glib/gspawn.mli glib/giochannel.ml glib/giochannel.mli \
      glib/viz_gmisc.ml glib/gpattern.ml \
      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 \
      basic_io_lexer.mli basic_io_lexer.ml revision.mli revision.ml \
      subprocess.ml subprocess.mli \
      components.ml \
      automate.mli automate.ml monotone.mli monotone.ml \
      agraph.ml agraph.mli \
      autocolor.ml autocolor.mli viz_style.ml viz_style.mli \
      version.ml icon.ml ui.ml ui.mli unidiff.ml unidiff.mli \
      view.ml view.mli query.ml query.mli app.ml app.mli main.ml

C_OBJ = glib/ocaml-gspawn.o glib/ocaml-giochannel.o \
        glib/ocaml-misc.o glib/ocaml-gdate.o glib/ocaml-gpattern.o \
        gnomecanvas_hack.o

USE_P4 = viz_style.ml revision.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 \
          basic_io_lexer.mll basic_io_lexer.mli revision.mli revision.ml \
          components.ml automate.mli automate.ml monotone.mli monotone.ml 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 \
          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
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



LIB3RDPARTY_OBJ = $(C_OBJ)

ifeq ($(OCAMLBEST), opt)
monotone-viz : $(OBJX) lib3rdparty.a
	$(OCAMLOPT) -o $@ -I $(LABLGTK_DIR) $(MLLIBS) $^
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) $^
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)"
gnomecanvas_hack.o       : CINCDIRS = -ccopt "$(GNOMECANVAS_CFLAGS)"

REVISION_FILE := $(shell test -r _MTN/revision && echo _MTN/revision)
REVISION_ID    = $(shell mtn automate get_base_revision_id)
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 basic_io_lexer.ml
	cd glib   && 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 $@
