#################################################################################
#                Cameleon                                                         #
#                                                                               #
#    Copyright (C) 2005 Institut National de Recherche en Informatique et       #
#    en Automatique. All rights reserved.                                       #
#                                                                               #
#    This program is free software; you can redistribute it and/or modify       #
#    it under the terms of the GNU General Public License as published          #
#    by the Free Software Foundation; either version 2.1 of the License, or     #
#    any later version.                                                         #
#                                                                               #
#    This program 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 General Public License          #
#    along with this program; if not, write to the Free Software                #
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                   #
#    02111-1307  USA                                                            #
#                                                                               #
#    Contact: Maxence.Guesdon@inria.fr                                          #
#                                                                               #
#################################################################################

include ../master.Makefile

INCLUDES=-I +lablgtk2 \
	-I +ocamldoc \
	-I ocaml/parsing \
	-I ocaml/typing \
	-I ocaml/driver \
	-I ocaml/utils \
	-I okey \
	-I utils \
	-I tmpl-engine \
	-I config_file \
	-I configwin \
	-I report \
	-I dbforge \
	-I ocamlcvs \
	-I cameleon \
	-I camtop \
	-I plugins

COMPFLAGS=-rectypes $(INCLUDES)
LINKFLAGS=$(INCLUDES)
LINKFLAGS_BYTE=$(INCLUDES)

OCAMLPP=-pp "camlp4o "

TOOLS=$(REPORT) $(REPORT_GUI) $(TMPL_ENGINE) \
	$(DBFORGE) $(DBFORGE_GUI) \
	$(OCAMLCVS) \
	$(CAMELEON) $(CAM_CONFIG) $(DOCBROWSER)
TOOLS_BYTE=$(REPORT_BYTE) $(REPORT_GUI_BYTE) \
	$(TMPL_ENGINE_BYTE) \
	$(DBFORGE_BYTE) $(DBFORGE_GUI_BYTE) \
	$(OCAMLCVS_BYTE) \
	$(CAMELEON_BYTE) $(CAM_CONFIG_BYTE) $(DOCBROWSER_BYTE) $(CAMTOP)

UTILS=utils/gstuff.cmx utils/gmylist.cmx utils/gdir.cmx utils/ffind.cmx
UTILS_BYTE=utils/gstuff.cmo utils/gmylist.cmo utils/gdir.cmo utils/ffind.cmo

PLUGINS=plugins/test.cmo plugins/dep_view.cma

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

# Cameleon

CAMELEON_COMMON_CMOFILES=\
	cameleon/cam_installation.cmo \
	cameleon/cam_config.cmo \
	cameleon/cam_messages.cmo \
	cameleon/cam_constant.cmo \
	cameleon/cam_dbg.cmo \
	cameleon/cam_misc.cmo\
	cameleon/cam_rc.cmo \
	cameleon/cam_hooks.cmo \
	cameleon/cam_gui_base.cmo \
	cameleon/cam_gui.cmo \
	cameleon/cam_com_history.cmo \
	cameleon/cam_commands.cmo \
	cameleon/cam_keymaps.cmo \
	cameleon/cam_view.cmo \
	cameleon/cam_dir_view.cmo \
	cameleon/cam_doc.cmo \
	cameleon/cam_doc_gui.cmo

PRE_CAMELEON_CMOFILES=$(CAMELEON_COMMON_CMOFILES) \
	cameleon/cam_files.cmo \
	cameleon/cam_cvs_view.cmo \
	cameleon/cam_files_view.cmo \
	cameleon/cam_modules_view.cmo \
	cameleon/cam_multiview.cmo \
	cameleon/cam_bbar.cmo \
	cameleon/cam_new_project.cmo \
	cameleon/cam_menus.cmo \
	cameleon/cam_args.cmo\
	cameleon/cam_log.cmo \
	cameleon/cam_server.cmo \
	cameleon/cam_plug.cmo

CAMELEON_CMOFILES=$(PRE_CAMELEON_CMOFILES) \
	cameleon/cam_dynlink.cmo \
	cameleon/cam_main.cmo

CAMELEON_CMXFILES=$(PRE_CAMELEON_CMOFILES:.cmo=.cmx) \
	cameleon/cam_main.cmx

CAMELEON_CMIFILES= $(CAMELEON_CMOFILES:.cmo=.cmi)

CAM_CONFIG_CMOFILES=\
	cameleon/cam_installation.cmo \
	cameleon/cam_config.cmo\
	cameleon/cam_config_main.cmo

CAM_CONFIG_CMXFILES=$(CAM_CONFIG_CMOFILES:.cmo=.cmx)
CAM_CONFIG_CMIFILES=$(CAM_CONFIG_CMOFILES:.cmo=.cmi)

DOCBROWSER_CMOFILES=$(CAMELEON_COMMON_CMOFILES) \
	cameleon/cam_docbrowser.cmo

DOCBROWSER_CMXFILES= $(DOCBROWSER_CMOFILES:.cmo=.cmx)
DOCBROWSER_CMIFILES= $(DOCBROWSER_CMOFILES:.cmo=.cmi)

# Okey

LIBOKEY=okey/okey.cmx
LIBOKEY_BYTE=$(LIBOKEY:.cmx=.cmo)
LIBOKEY_CMI=$(LIBOKEY:.cmx=.cmi)
LIBOKEY_O=$(LIBOKEY:.cmx=.o)

OKEY_LIBS=$(LIBOKEY) $(LIBOKEY_BYTE) $(LIBOKEY_CMI) $(LIBOKEY_O)

# Config_file

LIBCF=config_file/config_file.cmx
LIBCF_BYTE=$(LIBCF:.cmx=.cmo)
LIBCF_CMI=$(LIBCF:.cmx=.cmi)
LIBCF_O=$(LIBCF:.cmx=.o)

CF_LIBS=$(LIBCF) $(LIBCF_BYTE) $(LIBCF_CMI) $(LIBCF_O)

# Configwin

CW_COMMON_CMOFILES=\
	configwin/configwin_keys.cmo\
	configwin/configwin_types.cmo\
	configwin/configwin_messages.cmo\
	configwin/configwin_ihm.cmo

LIBCW_CMOFILES=$(CW_COMMON_CMOFILES) configwin/configwin.cmo
LIBCW_CMIFILES=$(LIBCW_CMOFILES:.cmo=.cmi)
LIBCW_CMXFILES=$(LIBCW_CMOFILES:.cmo=.cmx)

LIBCW=configwin/configwin.cmxa
LIBCW_BYTE=$(LIBCW:.cmxa=.cma)
LIBCW_CMI=$(LIBCW:.cmxa=.cmi)
LIBCW_A=$(LIBCW:.cmxa=.a)

CW_LIBS=$(LIBCW) $(LIBCW_BYTE) $(LIBCW_CMI) $(LIBCW_A)

# Tmpl-engine

TMPL_COMMON_CMOFILES=\
	tmpl-engine/template.cmo \
	tmpl-engine/tmplParser.cmo \
	tmpl-engine/tmplLexer.cmo \
	tmpl-engine/tmplIO.cmo


TMPL_CMOFILES=$(TMPL_COMMON_CMOFILES) \
	tmpl-engine/main.cmo
TMPL_CMXFILES= $(TMPL_CMOFILES:.cmo=.cmx)
TMPL_CMIFILES= $(TMPL_CMOFILES:.cmo=.cmi)

TMPL_LIB_CMOFILES=$(TMPL_COMMON_CMOFILES)
TMPL_LIB_CMXFILES= $(TMPL_LIB_CMOFILES:.cmo=.cmx)
TMPL_LIB_CMIFILES= $(TMPL_LIB_CMOFILES:.cmo=.cmx)

LIBTMPL=tmpl-engine/tmpl-engine.cmxa
LIBTMPL_BYTE=$(LIBTMPL:.cmxa=.cma)
LIBTMPL_CMI=$(LIBTMPL:.cmxa=.cmi)
LIBTMPL_A=$(LIBTMPL:.cmxa=.a)

TMPL_LIBS=$(LIBTMPL) $(LIBTMPL_BYTE) $(LIBTMPL_A) #$(LIBTMPL_CMI)

# Report

REPORT_COMMON_CMOFILES=\
	report/rep_installation.cmo\
	report/rep_messages.cmo\
	report/rep_misc.cmo \
	report/rep_args.cmo\
	report/rep_desc.cmo\
	report/rep_buffer.cmo\
	report/rep_types.cmo\
	report/rep_io.cmo \
	report/rep_gen.cmo


REPORT_CMOFILES=$(REPORT_COMMON_CMOFILES) \
	report/rep_gen_code.cmo \
	report/rep_main.cmo
REPORT_CMXFILES= $(REPORT_CMOFILES:.cmo=.cmx)
REPORT_CMIFILES= $(REPORT_CMOFILES:.cmo=.cmi)

REPORT_GUI_CMOFILES=$(REPORT_COMMON_CMOFILES) \
	report/rep_gui_base.cmo \
	report/rep_gui.cmo \
	report/rep_gui_main.cmo
REPORT_GUI_CMXFILES= $(REPORT_GUI_CMOFILES:.cmo=.cmx)
REPORT_GUI_CMIFILES= $(REPORT_GUI_CMOFILES:.cmo=.cmi)

REPORT_LIB_CMOFILES=$(REPORT_COMMON_CMOFILES) \
	report/report.cmo
REPORT_LIB_CMXFILES= $(REPORT_LIB_CMOFILES:.cmo=.cmx)
REPORT_LIB_CMIFILES= $(REPORT_LIB_CMOFILES:.cmo=.cmi)

REPORT_LIB_GUI_CMOFILES=$(REPORT_COMMON_CMOFILES) \
	report/rep_gui_base.cmo \
	report/rep_gui.cmo \
	report/report_gui.cmo
REPORT_LIB_GUI_CMXFILES=$(REPORT_LIB_GUI_CMOFILES:.cmo=.cmx)
REPORT_LIB_GUI_CMIFILES=$(REPORT_LIB_GUI_CMOFILES:.cmo=.cmi)

LIBREPORT=report/report.cmxa
LIBREPORT_BYTE=$(LIBREPORT:.cmxa=.cma)
LIBREPORT_CMI=$(LIBREPORT:.cmxa=.cmi)
LIBREPORT_A=$(LIBREPORT:.cmxa=.a)

LIBREPORT_GUI=report/report_gui.cmxa
LIBREPORT_GUI_BYTE=$(LIBREPORT_GUI:.cmxa=.cma)
LIBREPORT_GUI_CMI=$(LIBREPORT_GUI:.cmxa=.cmi)
LIBREPORT_GUI_A=$(LIBREPORT_GUI:.cmxa=.a)

REPORT_LIBS=$(LIBREPORT) $(LIBREPORT_BYTE) $(LIBREPORT_CMI) $(LIBREPORT_A) \
	$(LIBREPORT_GUI) $(LIBREPORT_GUI_BYTE) $(LIBREPORT_GUI_CMI) $(LIBREPORT_GUI_A)

# Topcameleon

CAMTOP_COMMON_CMOFILES=\
	cameleon/cam_installation.cmo \
	cameleon/cam_messages.cmo \
	camtop/camtop_installation.cmo\
	camtop/camtop_messages.cmo \
	camtop/camtop_outvalue.cmo \
	camtop/camtop_toplevel_base.cmo

CAMTOP_CMOFILES=$(CAMTOP_COMMON_CMOFILES)\
	camtop/camtop_toplevel.cmo
CAMTOP_CMI=camtop/camtop_toplevel.cmi
CAMTOP_CMO=$(CAMTOP_CMI:.cmi=.cmo)
CAMTOP_CMIFILES= $(CAMTOP_CMOFILES:.cmo=.cmi)

CAMTOP_LIB_CMOFILES=$(CAMTOP_COMMON_CMOFILES)

CAMTOP_LIB_CMIFILES= $(CAMTOP_LIB_CMOFILES:.cmo=.cmi)

LIBCAMTOP_BYTE=camtop/topcameleon.cma
LIBCAMTOP_CMI=$(LIBCAMTOP_BYTE:.cma=.cmi)

CAMTOP_LIBS=$(LIBCAMTOP_BYTE) $(LIBCAMTOP_CMI) $(CAMTOP_CMO)

# DBForge

DBFORGE_COMMON_CMOFILES=\
	dbforge/dbf_installation.cmo \
	dbforge/dbf_misc.cmo \
	dbforge/dbf_sql.cmo \
	dbforge/dbf_sql_gen.cmo \
	dbforge/dbf_sql_vgen.cmo \
	dbforge/dbf_sql_io.cmo

DBFORGE_COMMON_GUI_CMOFILES=$(DBFORGE_COMMON_CMOFILES) \
	dbforge/dbf_gtk2Misc.cmo \
	dbforge/dbf_gladeWidgets.cmo \
	dbforge/dbf_dbStores.cmo \
	dbforge/dbf_selectWidget.cmo \
	dbforge/dbf_dbWidget.cmo \
	dbforge/dbf_columnGUI.cmo \
	dbforge/dbf_indexGUI.cmo \
	dbforge/dbf_virtualTableGUI.cmo \
	dbforge/dbf_tableGUI.cmo \
	dbforge/dbf_gui.cmo

DBFORGE_CMOFILES= $(DBFORGE_COMMON_CMOFILES)\
	dbforge/dbf_dbforge.cmo
DBFORGE_CMXFILES= $(DBFORGE_CMOFILES:.cmo=.cmx)
DBFORGE_CMIFILES= $(DBFORGE_CMOFILES:.cmo=.cmi)

DBFORGE_GUI_CMOFILES=$(DBFORGE_COMMON_GUI_CMOFILES) \
	dbforge/dbf_main.cmo
DBFORGE_GUI_CMXFILES= $(DBFORGE_GUI_CMOFILES:.cmo=.cmx)
DBFORGE_GUI_CMIFILES= $(DBFORGE_GUI_CMOFILES:.cmo=.cmi)

DBFORGE_LIB_GUI_CMOFILES=$(DBFORGE_COMMON_GUI_CMOFILES) \
	dbforge/dbforge_gui.cmo

DBFORGE_LIB_GUI_CMXFILES=$(DBFORGE_LIB_GUI_CMOFILES:.cmo=.cmx)
DBFORGE_LIB_GUI_CMIFILES=$(DBFORGE_LIB_GUI_CMOFILES:.cmo=.cmi)

LIBDBFORGE_GUI=dbforge/dbforge_gui.cmxa
LIBDBFORGE_GUI_BYTE=$(LIBDBFORGE_GUI:.cmxa=.cma)
LIBDBFORGE_GUI_CMI=$(LIBDBFORGE_GUI:.cmxa=.cmi)
LIBDBFORGE_GUI_A=$(LIBDBFORGE_GUI:.cmxa=.a)

DBFORGE_LIBS=$(LIBDBFORGE_GUI) $(LIBDBFORGE_GUI_BYTE) $(LIBDBFORGE_GUI_CMI) $(LIBDBFORGE_GUI_A)

# CamlCVS

OCAMLCVS_COMMON_CMOFILES=\
	ocamlcvs/ocvs_messages.cmo\
	ocamlcvs/odiff_types.cmo\
	ocamlcvs/odiff_parser.cmo\
	ocamlcvs/odiff_lexer.cmo\
	ocamlcvs/ocvs_types.cmo\
	ocamlcvs/ocvs_misc.cmo\
	ocamlcvs/ocvs_config.cmo\
	ocamlcvs/ocvs_revision.cmo\
	ocamlcvs/ocvs_commands.cmo\
	ocamlcvs/odiff_merge.cmo\
	ocamlcvs/ocvs_behav.cmo\
	ocamlcvs/odiff_gui.cmo\
	ocamlcvs/ocvs_list.cmo\
	ocamlcvs/ocvs_tree.cmo

OCAMLCVS_CMOFILES=$(OCAMLCVS_COMMON_CMOFILES) \
	ocamlcvs/ocvs.cmo
OCAMLCVS_CMXFILES= $(OCAMLCVS_CMOFILES:.cmo=.cmx)
OCAMLCVS_CMIFILES= $(OCAMLCVS_CMOFILES:.cmo=.cmi)

OCAMLCVS_LIB_CMOFILES=$(OCAMLCVS_COMMON_CMOFILES) \
	ocamlcvs/ocamlcvs.cmo
OCAMLCVS_LIB_CMXFILES= $(OCAMLCVS_LIB_CMOFILES:.cmo=.cmx)
OCAMLCVS_LIB_CMIFILES= $(OCAMLCVS_LIB_CMOFILES:.cmo=.cmx)

LIBOCAMLCVS=ocamlcvs/ocamlcvs.cmxa
LIBOCAMLCVS_BYTE=$(LIBOCAMLCVS:.cmxa=.cma)
LIBOCAMLCVS_CMI=$(LIBOCAMLCVS:.cmxa=.cmi)
LIBOCAMLCVS_A=$(LIBOCAMLCVS:.cmxa=.a)

OCAMLCVS_LIBS=$(LIBOCAMLCVS) $(LIBOCAMLCVS_BYTE) $(LIBOCAMLCVS_CMI) $(LIBOCAMLCVS_A)

opt: libs tools
byte: libs_byte tools_byte
libs: $(UTILS) libcf libokey $(LIBCW) $(LIBREPORT) $(LIBREPORT_GUI) \
	$(LIBTMPL) $(LIBDBFORGE_GUI) $(LIBOCAMLCVS)
libs_byte: $(UTILS_BYTE) libcf_byte libokey_byte $(LIBCW_BYTE) \
	$(LIBREPORT_BYTE) $(LIBREPORT_GUI_BYTE) \
	$(LIBTMPL_BYTE) $(LIBDBFORGE_GUI_BYTE) \
	$(LIBOCAMLCVS_BYTE)

tools: libs $(TOOLS)
tools_byte: libs_byte $(TOOLS_BYTE)

all: byte plugins opt

libcf: $(LIBCF_INT) $(LIBCF)
libcf_byte: $(LIBCF_INT) $(LIBCF_BYTE)

libokey: $(LIBOKEY_INT) $(LIBOKEY)
libokey_byte: $(LIBOKEY_INT) $(LIBOKEY_BYTE)

plugins: $(PLUGINS)

$(CAMELEON): $(LIBOCAMLCVS) $(LIBOKEY) $(LIBCF) $(LIBCW) \
	$(CAMELEON_CMIFILES) $(CAMELEON_CMXFILES) utils/gmylist.cmx
	$(OCAMLOPT) -o $@ $(LINKFLAGS) str.cmxa unix.cmxa \
	odoc_info.cmxa lablgtk.cmxa lablglade.cmxa xml-light.cmxa \
	okey.cmx config_file.cmx configwin.cmxa gstuff.cmx gmylist.cmx gdir.cmx ffind.cmx \
	ocamlcvs.cmxa $(CAMELEON_CMXFILES)

$(CAMELEON_BYTE): $(LIBOCAMLCVS_BYTE) $(LIBOKEY_BYTE) $(LIBCF_BYTE) $(LIBCW_BYTE) \
	$(CAMELEON_CMIFILES) $(CAMELEON_CMOFILES)  utils/gmylist.cmo
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) -linkall str.cma unix.cma dynlink.cma \
	odoc_info.cma lablgtk.cma lablglade.cma xml-light.cma \
	okey.cmo config_file.cmo configwin.cma gstuff.cmo gmylist.cmo gdir.cmo ffind.cmo \
	ocamlcvs.cma $(CAMELEON_CMOFILES)

$(CAM_CONFIG): $(CAM_CONFIG_CMIFILES) $(CAM_CONFIG_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) unix.cmxa $(CAM_CONFIG_CMXFILES)

$(CAM_CONFIG_BYTE): $(CAM_CONFIG_CMIFILES) $(CAM_CONFIG_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) unix.cma $(CAM_CONFIG_CMOFILES)

$(DOCBROWSER): $(DOCBROWSER_CMIFILES) $(DOCBROWSER_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) str.cmxa unix.cmxa \
	odoc_info.cmxa lablgtk.cmxa lablglade.cmxa xml-light.cmxa \
	okey.cmx config_file.cmx configwin.cmxa gstuff.cmx gdir.cmx $(DOCBROWSER_CMXFILES)

$(DOCBROWSER_BYTE): $(DOCBROWSER_CMIFILES) $(DOCBROWSER_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) str.cma unix.cma \
	odoc_info.cma lablgtk.cma lablglade.cma xml-light.cma \
	okey.cmo config_file.cmo configwin.cma gstuff.cmo gdir.cmo $(DOCBROWSER_CMOFILES)

$(LIBCW): $(LIBCW_CMIFILES) $(LIBCW_CMXFILES)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(LIBCW_CMXFILES)
$(LIBCW_BYTE): $(LIBCW_CMIFILES) $(LIBCW_CMOFILES)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(LIBCW_CMOFILES)


$(REPORT): $(REPORT_CMIFILES) $(REPORT_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa xml-light.cmxa \
	$(REPORT_CMXFILES)

$(REPORT_BYTE): $(REPORT_CMIFILES) $(REPORT_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma xml-light.cma \
	$(REPORT_CMOFILES)

$(REPORT_GUI): $(REPORT_GUI_CMIFILES) $(REPORT_GUI_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa lablgtk.cmxa lablglade.cmxa config_file.cmx \
	okey.cmx configwin.cmxa xml-light.cmxa \
	$(REPORT_GUI_CMXFILES)

$(REPORT_GUI_BYTE): $(REPORT_GUI_CMIFILES) $(REPORT_GUI_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma lablgtk.cma lablglade.cma config_file.cmo \
	okey.cmo configwin.cma xml-light.cma \
	$(REPORT_GUI_CMOFILES)

$(LIBREPORT): $(REPORT_LIB_CMIFILES) $(REPORT_LIB_CMXFILES) $(LIBREPORT_CMI)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(REPORT_LIB_CMXFILES)
$(LIBREPORT_BYTE): $(REPORT_LIB_CMIFILES) $(REPORT_LIB_CMOFILES) $(LIBREPORT_CMI)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(REPORT_LIB_CMOFILES)

$(LIBREPORT_GUI): $(REPORT_LIB_GUI_CMIFILES) $(REPORT_LIB_GUI_CMXFILES) $(LIBREPORT_GUI_CMI)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(REPORT_LIB_GUI_CMXFILES)
$(LIBREPORT_GUI_BYTE): $(REPORT_LIB_GUI_CMIFILES) $(REPORT_LIB_GUI_CMOFILES) $(LIBREPORT_GUI_CMI)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(REPORT_LIB_GUI_CMOFILES)

$(CAMTOP): $(CAMTOP_CMIFILES) $(CAMTOP_CMOFILES) $(LIBCAMTOP_BYTE)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	ocaml/utils/config.cmo\
        ocaml/utils/clflags.cmo\
	toplevellib.cma \
	unix.cma lablgtk.cma lablglade.cma \
	okey.cmo config_file.cmo configwin.cma gmylist.cmo \
	$(CAMTOP_CMOFILES)

$(LIBCAMTOP_BYTE): $(CAMTOP_LIB_CMIFILES) $(CAMTOP_LIB_CMOFILES)
	$(OCAMLC) -a -o $@ $(LINKFLAGS_BYTE) \
	ocaml/utils/config.cmo\
        ocaml/utils/clflags.cmo\
	toplevellib.cma \
	unix.cma lablgtk.cma lablglade.cma \
	okey.cmo config_file.cmo configwin.cma gmylist.cmo \
	$(CAMTOP_LIB_CMOFILES)
	$(CP) $(CAMTOP_CMI) $(LIBCAMTOP_CMI)


$(DBFORGE): $(DBFORGE_CMIFILES) $(DBFORGE_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa xml-light.cmxa \
	$(DBFORGE_CMXFILES)

$(DBFORGE_BYTE): $(DBFORGE_CMIFILES) $(DBFORGE_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma xml-light.cma \
	$(DBFORGE_CMOFILES)

$(DBFORGE_GUI): $(DBFORGE_GUI_CMIFILES) $(DBFORGE_GUI_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa lablgtk.cmxa lablglade.cmxa config_file.cmx \
	okey.cmx configwin.cmxa xml-light.cmxa \
	$(DBFORGE_GUI_CMXFILES)

$(DBFORGE_GUI_BYTE): $(DBFORGE_GUI_CMIFILES) $(DBFORGE_GUI_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma lablgtk.cma lablglade.cma config_file.cmo \
	okey.cmo configwin.cma xml-light.cma \
	$(DBFORGE_GUI_CMOFILES)

$(LIBDBFORGE_GUI): $(DBFORGE_LIB_GUI_CMIFILES) $(DBFORGE_LIB_GUI_CMXFILES) $(LIBDBFORGE_GUI_CMI)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(DBFORGE_LIB_GUI_CMXFILES)
$(LIBDBFORGE_GUI_BYTE): $(DBFORGE_LIB_GUI_CMIFILES) $(DBFORGE_LIB_GUI_CMOFILES) $(LIBDBFORGE_GUI_CMI)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(DBFORGE_LIB_GUI_CMOFILES)


$(TMPL_ENGINE): $(TMPL_CMIFILES) $(TMPL_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa \
	$(TMPL_CMXFILES)

$(TMPL_ENGINE_BYTE): $(TMPL_CMIFILES) $(TMPL_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma \
	$(TMPL_CMOFILES)

$(LIBTMPL): $(LIBTMPL_CMIFILES) $(LIBTMPL_CMXFILES) #$(LIBTMPL_CMI)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(LIBTMPL_CMXFILES)
$(LIBTMPL_BYTE): $(LIBTMPL_CMIFILES) $(LIBTMPL_CMOFILES) #$(LIBTMPL_CMI)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(LIBTMPL_CMOFILES)

$(OCAMLCVS): $(OCAMLCVS_CMIFILES) $(OCAMLCVS_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa unix.cmxa lablgtk.cmxa gstuff.cmx \
	$(OCAMLCVS_CMXFILES)

$(OCAMLCVS_BYTE): $(OCAMLCVS_CMIFILES) $(OCAMLCVS_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma unix.cma lablgtk.cma gstuff.cmo \
	$(OCAMLCVS_CMOFILES)

$(OCAMLCVS_GUI): $(OCAMLCVS_GUI_CMIFILES) $(OCAMLCVS_GUI_CMXFILES)
	$(OCAMLOPT) -o $@ $(LINKFLAGS) \
	str.cmxa lablgtk.cmxa lablglade.cmxa config_file.cmx \
	okey.cmx configwin.cmxa xml-light.cmxa \
	$(OCAMLCVS_GUI_CMXFILES)

$(OCAMLCVS_GUI_BYTE): $(OCAMLCVS_GUI_CMIFILES) $(OCAMLCVS_GUI_CMOFILES)
	$(OCAMLC) -o $@ $(LINKFLAGS_BYTE) \
	str.cma lablgtk.cma lablglade.cma config_file.cmo \
	okey.cmo configwin.cma xml-light.cma \
	$(OCAMLCVS_GUI_CMOFILES)

$(LIBOCAMLCVS): $(OCAMLCVS_LIB_CMIFILES) $(OCAMLCVS_LIB_CMXFILES) $(LIBOCAMLCVS_CMI)
	$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLCVS_LIB_CMXFILES)
$(LIBOCAMLCVS_BYTE): $(OCAMLCVS_LIB_CMIFILES) $(OCAMLCVS_LIB_CMOFILES) $(OCAMLCVS_LIB_CMI)
	$(OCAMLC) -a -custom -o $@ $(LINKFLAGS_BYTE) $(OCAMLCVS_LIB_CMOFILES)

plugins/dep_view.cma: cameleon/cam_plug.cmi plugins/dep_view.cmo
	$(OCAMLC) -a -o $@ plugins/dep_view.cmo
# Documentation :
#################
dump.odoc: cameleon/*.ml cameleon/*.mli \
	utils/*.ml utils/*.mli \
	tmpl-engine/*.ml \
	config_file/*.ml config_file/*.mli \
	okey/*.ml okey/*.mli \
	configwin/*.ml configwin/*.mli \
	report/*.ml report/*.mli \
	dbforge/*.ml dbforge/*.mli \
	ocamlcvs/*.ml ocamlcvs/*.mli
	$(OCAMLDOCOPT) $(INCLUDES) -keep-code $(OCAMLPP) $(COMPFLAGS) -sort -dump $@ \
	`ls $^ | grep -v "/example.ml"`

$(ROOT)/doc/cameleon.odoc:cameleon/*.ml cameleon/*.mli \
	utils/*.ml utils/*.mli \
	tmpl-engine/*.ml \
	config_file/*.ml config_file/*.mli \
	okey/*.ml okey/*.mli \
	configwin/*.ml configwin/*.mli \
	report/*.ml report/*.mli \
	dbforge/*.ml dbforge/*.mli \
	ocamlcvs/*.ml ocamlcvs/*.mli
	$(OCAMLDOCOPT) $(INCLUDES) -keep-code $(OCAMLPP) $(COMPFLAGS) -sort -dump $@ \
	ocamlcvs/ocamlcvs.mli \
	okey/okey.mli\
	configwin/configwin.mli\
	config_file/config_file.mli \
	utils/gdir.mli \
	utils/gmylist.mli \
	utils/gstuff.mli \
	utils/ffind.mli \
	report/report.mli report/report_gui.mli \
	dbforge/dbforge_gui.mli \
	cameleon/cam_plug.mli

dumps.odoc:
	for i in cameleon utils config_file okey \
	configwin report dbforge ocamlcvs; do\
	$(OCAMLDOCOPT) $(INCLUDES) -keep-code $(OCAMLPP) $(COMPFLAGS) -sort -dump $$i/dump.odoc \
	$$i/*.ml $$i/*.mli; done

doc: all dump.odoc
	$(MKDIR) ocamldoc
	$(OCAMLDOCOPT) $(OCAMLPP) $(COMPFLAGS) \
	-html \
	-load dump.odoc \
	-intro $(ROOT)/doc/reference_doc_intro.text \
	-d ocamldoc -v

websitedoc: $(ROOT)/doc/cameleon.odoc
	$(MKDIR) $(ROOT)/web/site/refdoc
	$(OCAMLDOCOPT) $(OCAMLPP) $(COMPFLAGS) \
	-html \
	-load $< \
	-intro $(ROOT)/doc/reference_doc_intro.text \
	-d $(ROOT)/web/site/refdoc -v

todo: dump.odoc
	$(MKDIR) ocamldoc
	$(OCAMLDOC) -d ocamldoc -o ocamldoc/todo.html \
	-g $(ROOT)/utils/odoc_todo.cmo \
	-load $^ -t "To-do list"

dot: dep.dot
dep.dot: dump.odoc
	$(OCAMLDOCOPT) -load $< -o $@ -dot -dot-reduce
dep.ps:dep.dot
	dot -Tps -o $@ $<

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

GENERATED_FILES= \
	report/rep_gui_base.ml \
	dbforge/dbf_gladeWidgets.ml \
	tmpl-engine/tmplParser.ml \
	tmpl-engine/tmplParser.mli \
	ocamlcvs/odiff_parser.ml \
	ocamlcvs/odiff_parser.mli \
	ocamlcvs/odiff_lexer.ml

cleanocamldoc:
	$(RM) -r ocamldoc
	$(MKDIR) ocamldoc

distclean: clean
	$(RM) cameleon/cam_installation.ml
	$(MAKE) cleanocamldoc

clean:: dummy
	$(RM) *~ \#*\#
	$(RM) */*.a */*.so
	$(RM) $(TOOLS) $(TOOLS_BYTE)
	$(RM) $(GENERATED_FILES)
	(cd utils && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd tmpl-engine && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd config_file && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd okey && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd configwin && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd report && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd dbforge && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd ocamlcvs && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd cameleon && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd camtop && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	(cd plugins && $(RM) *~ \#*\# *.cmo *.cmi *.cmx *.a *.o *.cma *.cmxa *.annot)
	$(RM) tmpl-engine/tmplParser.output

cleaninterface:
	$(RM) $(LDAP_INTERFACE) $(LP_INTERFACE)

.depend depend:
	$(RM) .depend
	$(OCAMLDEP) $(OCAMLPP) \
	-I utils -I tmpl-engine \
	-I config_file -I okey -I configwin -I report \
	-I dbforge -I ocamlcvs -I cameleon \
	-I plugins \
	cameleon/*.ml cameleon/*.mli \
	camtop/*.ml \
	utils/*.ml utils/*.mli \
	tmpl-engine/*.ml tmpl-engine/*.mli \
	config_file/*.ml config_file/*.mli \
	okey/*.ml okey/*.mli \
	configwin/*.ml configwin/*.mli \
	report/*.ml report/*.mli \
	dbforge/*.ml dbforge/*.mli \
	ocamlcvs/*.ml ocamlcvs/*.mli \
	plugins/*.ml \
	  > .depend

alldepend: $(GENERATED_FILES)
	$(MAKE) depend
dummy:

include .depend

#################
# Installation
#################
install: installtools installlibs installplugins

installtools: dummy
	@echo
	@echo Installing tools to $(BINDIR)...
	@echo
	@$(MKDIR) $(BINDIR)
	@for i in $(TOOLS) $(TOOLS_BYTE); do \
	if test -f $$i; then \
		$(CP) $$i $(BINDIR); echo $(BINDIR)/`basename $$i` installed; \
	else \
		echo $$i NOT installed ; \
	fi; done
	@$(MKDIR) $(GLADEDIR)
	@$(MKDIR) $(DTDDIR)
	@$(CP) report/report.glade $(GLADEDIR) && echo $(GLADEDIR)/report.glade installed
	@$(CP) dbforge/dbforge.glade $(GLADEDIR)  && echo $(GLADEDIR)/dbforge.glade installed
	@$(CP) dbforge/db.dtd $(DTDDIR)  && echo $(DTDDIR)/db.dtd installed
	@$(CP) cameleon/cameleon.glade $(GLADEDIR) && echo $(GLADEDIR)/cameleon.glade installed
	@$(CP) camtop/camtop.glade $(GLADEDIR) && echo $(GLADEDIR)/camtop.glade installed
	@if test -f $(CAMTOP); then \
		$(CP) camtop/cam-mktop $(BINDIR); echo $(BINDIR)/cam-mktop installed; \
	fi

installlibs: dummy
	@echo
	@echo Installing libraries to $(LIBDIR)...
	@echo
	@$(MKDIR) $(LIBDIR)
	@for i in $(OKEY_LIBS) $(CF_LIBS) $(CW_LIBS) $(TMPL_LIBS) \
	$(REPORT_LIBS) $(DBFORGE_LIBS) $(OCAMLCVSLIBS) \
	$(UTILS:.cmx=.cmi) $(UTILS:.cmx=.o) $(UTILS) $(UTILS_BYTE) $(CAMTOP_LIBS) \
	cameleon/cam_plug.cmi ; do \
	if test -f $$i; then \
		$(CP) $$i $(LIBDIR); echo $(LIBDIR)/`basename $$i` installed; \
	else \
		echo $$i NOT installed ; \
	fi; done

installplugins: dummy
	@echo
	@echo Installing plugins to $(PLUGINSDIR)...
	@echo
	@$(MKDIR) $(PLUGINSDIR)
	@for i in $(PLUGINS); do \
	if test -f $$i; then \
		$(CP) $$i $(PLUGINSDIR); echo $(PLUGINSDIR)/`basename $$i` installed; \
	else \
		echo $$i NOT installed ; \
	fi; done

###########################
# additional dependencies
###########################

report/rep_gui_base.ml: report/report.glade
	$(LABLGLADECC) -hide-default $< > $@

camtop/camtop_toplevel_base.ml: camtop/camtop.glade
	$(LABLGLADECC) -hide-default $< > $@

dbforge/dbf_gladeWidgets.ml: dbforge/dbforge.glade
	$(LABLGLADECC) -hide-default $< > $@

dbforge/dbf_sql_gen.ml: dbforge/templates/sql_table.tmpl.ml $(TMPL_ENGINE_BYTE)
	$(ROOT)/src/$(TMPL_ENGINE_BYTE) $< > $@

dbforge/dbf_sql_vgen.ml: dbforge/templates/sql_vtable.tmpl.ml $(TMPL_ENGINE_BYTE)
	$(ROOT)/src/$(TMPL_ENGINE_BYTE) $< > $@

cameleon/cam_gui_base.ml: cameleon/cameleon.glade
	$(LABLGLADECC) -hide-default $< > $@

cameleon/cam_plug.mli: cameleon/cam_plug.ml
	$(OCAMLC) -i $(INCLUDES) $< > $@

camtop/camtop_toplevel.cmo:camtop/camtop_outvalue.cmo

ocamlcvs/odiff_parser.cmo: ocamlcvs/odiff_parser.cmi
ocamlcvs/odiff_parser.cmx: ocamlcvs/odiff_parser.cmi
ocamlcvs/odiff_lexer.cmi: ocamlcvs/odiff_parser.cmi
ocamlcvs/odiff_lexer.cmo: ocamlcvs/odiff_parser.cmo