#################################################################################
#                                                                               #
#   lablgtksourceview, OCaml binding for the GtkSourceView text widget          #
#                                                                               #
#   Copyright (C) 2005  Stefano Zacchiroli <zack@cs.unibo.it>                   #
#   Copyright (C) 2006  Stefano Zacchiroli <zack@cs.unibo.it>                   #
#                       Maxence Guesdon <maxence.guesdon@inria.fr>              #
#                                                                               #
#   This library is free software; you can redistribute it and/or modify        #
#   it under the terms of the GNU Lesser General Public License as              #
#   published by the Free Software Foundation; either version 2.1 of the        #
#   License, or (at your option) any later version.                             #
#                                                                               #
#   This library is distributed in the hope that it will be useful, but         #
#   WITHOUT ANY WARRANTY; without even the implied warranty of                  #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           #
#   Lesser General Public License for more details.                             #
#                                                                               #
#   You should have received a copy of the GNU Lesser General Public            #
#   License along with this library; if not, write to the Free Software         #
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307         #
#   USA                                                                         #
#                                                                               #
#################################################################################

include master.Makefile

ARCHIVE = $(PACKAGE)
DLL = dll$(ARCHIVE).so

C_OBJECTS = gtk_sourceview_tags.o ml_gtk_sourceview.o
ML_OBJECTS =	\
	gtkSourceViewProps.cmo	\
	ogtkSourceViewProps.cmo	\
	gtk_sourceview.cmo	\
	gtk_sourceviewEnums.cmo	\
	gtkSourceView.cmo	\
	gSourceView.cmo		\
	$(NULL)
ML_OBJECTS_OPT = $(patsubst %.cmo,%.cmx,$(ML_OBJECTS))
GENERATED_FILES =	\
	gtkSourceViewProps.ml	\
	ogtkSourceViewProps.ml	\
	gtk_sourceview_tags.h	\
	gtk_sourceview_tags.c	\
	gtk_sourceviewEnums.ml
EXTRA_INST =	\
	META			\
	gSourceView.mli		\
	gSourceView.cmi		\
	gtkSourceView.cmi	\
	gtk_sourceview.cmi	\
	$(NULL)
DIST_FILES =	\
	master.Makefile.in	\
	Makefile		\
	checkocaml.ml		\
	configure.in		\
	configure		\
	gSourceView.ml		\
	gSourceView.mli		\
	gtkSourceView.ml	\
	gtk_sourceview.ml	\
	ml_gtk_sourceview.c	\
	gtk_sourceview_tags.var	\
	META.in			\
	.depend			\
	debian/			\
	test/			\
	gtkSourceView.props	\
	ACKNOWLEDGEMENTS	\
	AUTHORS			\
	CHANGES			\
	COPYING			\
	LICENSE			\
	README			\
	$(NULL)

BYTE_INST = $(ARCHIVE).cma lib$(ARCHIVE).a $(C_OBJECTS) $(DLL)
OPT_INST = $(BYTE_INST) $(ARCHIVE).cmxa $(ARCHIVE).a


# Compilation
#############

ifeq ($(NATIVE),yes)
world: all opt
else
world: all
endif

all: $(ARCHIVE).cma lib$(ARCHIVE).a $(DLL) $(TESTDIR)/test
opt: $(ARCHIVE).cmxa $(ARCHIVE).a $(TESTDIR)/test.opt

test/test.opt:
	$(MAKE) -C $(TESTDIR) test.opt
test/test:
	$(MAKE) -C $(TESTDIR) test

CCOMPILER = $(OCAMLC) -c -ccopt "$(GCCINCLUDES) $(GTKSOURCEVIEW_CFLAGS)"

ml_gtk_sourceview.o: ml_gtk_sourceview.c gtk_sourceview_tags.h
	$(CCOMPILER) $<
gtk_sourceview_tags.o: gtk_sourceview_tags.c
	$(CCOMPILER) $<

$(GENERATED_FILES): gtkSourceView.props gtk_sourceview_tags.var

%Props.ml o%Props.ml: %.props
	$(PROPCC) $<

gtk_sourceview_tags.h gtk_sourceview_tags.c gtk_sourceviewEnums.ml: gtk_sourceview_tags.var
	$(VARCC) $<
	@cp gtk_sourceview_tags.c __t.c
	@echo "#include <wrappers.h>" > gtk_sourceview_tags.c
	@echo "#include \"gtk_sourceview_tags.h\"" >> gtk_sourceview_tags.c
	@echo "#include <gtksourceview/gtksourceiter.h>" >> gtk_sourceview_tags.c
	@cat __t.c >> gtk_sourceview_tags.c
	@cp gtk_sourceview_tags.h __t.h
	@echo "#include <wrappers.h>" > gtk_sourceview_tags.h
	@cat __t.h >> gtk_sourceview_tags.h
	@rm -f __t.c __t.h

$(ARCHIVE).cma: $(ML_OBJECTS)
	$(OCAMLMKLIB) -custom -o $(ARCHIVE) $^ $(GTKSOURCEVIEW_LIBS)
$(ARCHIVE).cmxa: $(ML_OBJECTS_OPT)
	$(OCAMLMKLIB) -o $(ARCHIVE) $^ $(GTKSOURCEVIEW_LIBS)
lib$(ARCHIVE).a $(DLL): $(C_OBJECTS)
	$(OCAMLMKLIB) -o $(ARCHIVE) $^ $(GTKSOURCEVIEW_LIBS)

# Documentation :
#################
ocamldoc:
	$(MKDIR) doc
	$(OCAMLDOC) $(OCOMPFLAGS) -d doc -html \
	gSourceView.mli gtk_sourceviewEnums.ml

# myself

master.Makefile: master.Makefile.in config.status
	./config.status

config.status: configure master.Makefile.in
	./config.status --recheck

configure: configure.in
	autoconf

# headers :
###########
HEADFILES= configure.in configure \
	master.Makefile.in Makefile \
	*.ml *.mli \
	test/test.ml test/Makefile \
	checkocaml.ml \
	gtk_sourceview_tags.var	\
	gtkSourceView.props \
	ml_gtk_sourceview.c

headers:
	echo $(HEADFILES)
	headache -h header -c .headache_config `ls $(HEADFILES)`

noheaders:
	headache -r -c .headache_config `ls $(HEADFILES)`

# backup, clean and depend :
############################

distclean: clean
	make -C $(TESTDIR) distclean
	$(RM) config.cache config.log config.status configure.lineno config.status.lineno
	$(RM) master.Makefile
	$(RM) config_check.log ocaml_config.sh
	$(RM) autom4te.cache
	$(RM) META
	$(RM) -r doc

clean::
	$(RM) *~ \#*\#
	$(RM) *.a *.so *.o *.cm* *.annot $(GENERATED_FILES)
	make -C $(TESTDIR) clean

depend: *.ml *.mli $(GENERATED_FILES)
	$(RM) .depend
	$(OCAMLDEP) $(OCAMLPP) *.ml *.mli > .depend

include .depend



#################
# installation
#################

CLASSIC_INSTALL_DIR=$(DESTDIR)/`$(OCAMLC) -where`/lablgtksourceview/
EXTRA_INST_NO_META=`ls $(EXTRA_INST) | grep -v META`

ifeq ($(DESTDIR),)
INSTALLER = $(OCAMLFIND) install -ldconf /dev/null
UNINSTALLER = $(OCAMLFIND) remove -ldconf /dev/null
else
INSTALLER = $(OCAMLFIND) install -destdir $(DESTDIR) -ldconf /dev/null
UNINSTALLER = $(OCAMLFIND) remove -destdir $(DESTDIR) -ldconf /dev/null
install: world installmkdir
endif

ifeq ($(NATIVE),yes)
install: installworld
else
install: installbyte
endif

ifeq ($(WITH_OCAMLFIND),yes)
installmkdir:
	$(MKDIR) $(DESTDIR)
else
installmkdir:
	$(MKDIR) $(CLASSIC_INSTALL_DIR)
endif

ifeq ($(WITH_OCAMLFIND),yes)
installbyte: installmkdir
	$(INSTALLER) $(PACKAGE) $(BYTE_INST) $(EXTRA_INST)
installworld: installmkdir
	$(INSTALLER) $(PACKAGE) $(OPT_INST) $(EXTRA_INST)
uninstall:
	$(UNINSTALLER) $(PACKAGE)
else

installbyte: installmkdir
	$(CP) $(BYTE_INST) $(EXTRA_INST_NO_META) $(CLASSIC_INSTALL_DIR)
installworld: installmkdir
	$(CP) $(OPT_INST) $(EXTRA_INST_NO_META) $(CLASSIC_INSTALL_DIR)

uninstall:
	for i in $(OPT_INST) $(EXTRA_INST_NO_META); do \
	$(RM) $(CLASSIC_INSTALL_DIR)/$$i; done
endif

dist: distclean
	rm -rf $(DIST_DIR)/
	mkdir -p $(DIST_DIR)/
	cp -a $(DIST_FILES) $(EXTRA_DIST) $(DIST_DIR)/
	-find $(DIST_DIR) -name .svn -type d -exec rm -rf {} \;
	tar cvfz $(DIST_DIR).tar.gz $(DIST_DIR)/
	rm -rf $(DIST_DIR)/

deb: dist
	rm -rf $(DIST_DIR)
	tar xvzf $(DIST_DIR).tar.gz
	(cd $(DIST_DIR)/ && debuild)
	rm -rf $(DIST_DIR)

.PHONY: world uninstall clean distclean test/test test/test.opt
.PHONY: install installmkdir installbyte installworld
.PHONY: headers noheaders ocamldoc
