# $Id: Makefile,v 1.81 2001/12/12 10:53:50 garrigue Exp $
# Makefile for lablgtk.

TARGETS = varcc lablgtktop lablgtktop_t lablgtk

all:: $(TARGETS)

opt: lablgtkopt

depend:
	ocamldep *.ml *.mli > .depend

COMPILER = $(CAMLC) $(MLFLAGS) -w s -c
LINKER = $(CAMLC) $(MLFLAGS)
COMPOPT = $(CAMLOPT) $(MLFLAGS) -w s -c
LINKOPT = $(CAMLOPT) $(MLFLAGS)
LIBRARIAN = ocamlmklib
TOPLEVEL = ocamlmktop $(MLFLAGS)
CAMLP4 = camlp4o pr_o.cmo
CONFIG = ../config.make

include $(CONFIG)

LABLGLDIR = $(LIBDIR)/lablGL

MLLIBS = lablgtk.cma
CLIBS = liblablgtk.a
MLLINK = unix.cma str.cma

ifdef DEBUG
CFLAGS = -g $(GTKCFLAGS)
MLLINK += -cclib -lcamlrund
MLFLAGS = -g
else
CFLAGS = -O -DGTK_NO_CHECK_CASTS -DGTK_DISABLE_COMPAT_H $(GTKCFLAGS)
endif

THFLAGS = -thread
THLINK = unix.cma threads.cma

ifdef USE_CC
CCOMPILER = $(CC) -c -I$(LIBDIR) $(CFLAGS)
else
CCOMPILER = ocamlc -c -ccopt "$(CFLAGS)"
endif

ifdef USE_GL
MLFLAGS += -I $(LABLGLDIR)
MLLINK += lablgl.cma
MLLIBS += lablgtkgl.cma
CLIBS += liblablgtkgl.a
GLLINK = -llablgtkgl -lgtkgl
GLMLOBJS = glGtk.cmo
GLCOBJS = ml_gtkgl.o
endif

ifdef USE_GNOME
MLLIBS += lablgnome.cma
CLIBS += liblablgnome.a
GNOMEMLOBJS = gtkXmHTML.cmo gHtml.cmo
GNOMECOBJS = ml_gtkxmhtml.o
endif

ifdef USE_GLADE
MLLIBS += lablglade.cma
CLIBS += liblablglade.a
GLADEMLOBJS = glade.cmo
GLADECOBJS = ml_glade.o
all:: lablgladecc
endif

# Rules
.SUFFIXES: .ml .mli .cmo .cmi .cmx .c .o .var .h .opt .def .ml4
.c.o:
	$(CCOMPILER) $<
.ml.cmo:
	$(COMPILER) $<
.mli.cmi:
	$(COMPILER) $<
.ml.cmx:
	$(COMPOPT) $<
.var.h:
	./varcc $<
.ml4.ml:
	$(CAMLP4) -impl $< -o $@

# Targets
GTKOBJS = ml_gtk.o ml_gtkbin.o ml_gtkbutton.o ml_gtkedit.o ml_gtklist.o \
	ml_gtkmenu.o ml_gtkmisc.o ml_gtknew.o ml_gtkpack.o ml_gtkrange.o \
	ml_gtktree.o
COBJS = ml_gdk.o ml_glib.o wrappers.o $(GTKOBJS)
MLOBJS = gaux.cmo gpointer.cmo glib.cmo gdk.cmo gdkEvent.cmo gdkKeysyms.cmo \
	gtk.cmo gtkArgv.cmo gtkSignal.cmo \
	gtkData.cmo gtkBase.cmo gtkPack.cmo gtkButton.cmo \
	gtkMenu.cmo gtkMisc.cmo gtkWindow.cmo gtkTree.cmo gtkList.cmo \
	gtkBin.cmo gtkEdit.cmo gtkRange.cmo gtkMain.cmo gtkNew.cmo \
	gDraw.cmo \
	gObj.cmo gMain.cmo gData.cmo gContainer.cmo gPack.cmo gButton.cmo \
	gMenu.cmo gMisc.cmo gWindow.cmo gTree.cmo gList.cmo gBin.cmo \
	gEdit.cmo gRange.cmo gUtil.cmo gToolbox.cmo
THOBJS = gtkThread.cmo
INITOBJS = gtkInit.cmo
THINITOBJS = gtkThInit.cmo
ALLOBJS = $(MLOBJS) $(GLMLOBJS) $(GNOMEMLOBJS) $(GLADEMLOBJS) $(INITOBJS)
ALLTHOBJS = $(THOBJS) $(THINITOBJS)

lablgtktop: $(MLLIBS) $(INITOBJS)
	$(TOPLEVEL) -o $@ $(MLLINK) -I . $(MLLIBS) $(INITOBJS) \
	   -dllpath $(INSTALLDIR) -dllpath $(LABLGLDIR)

lablgtktop_t: $(MLLIBS) $(THOBJS) $(INITOBJS) $(THINITOBJS)
	$(TOPLEVEL) $(THFLAGS) -o $@ $(THLINK) $(MLLINK) \
	   -dllpath $(INSTALLDIR) -dllpath $(LABLGLDIR) \
	   -I . $(MLLIBS) $(THOBJS) $(INITOBJS) $(THINITOBJS)

lablgtk: Makefile $(CONFIG) lablgtk.in
	sed -e "s|@INSTALLDIR@|$(INSTALLDIR)|g" \
	    -e "s|@LABLGLDIR@|$(LABLGLDIR)|g" \
	    -e "s|@LIBDIR@|$(LIBDIR)|g" \
	    < lablgtk.in > $@
	chmod 755 $@

lablgtkopt: $(MLLIBS:.cma=.cmxa) $(INITOBJS:.cmo=.cmx) \
	$(THOBJS:.cmo=.cmx)

lablgladecc: xml_lexer.cmo lablgladecc.cmo
	$(LINKER) -o $@ $(MLLINK) xml_lexer.cmo lablgladecc.cmo

testcc: lablgladecc lablgtktop
	./lablgladecc -test > testcc.ml
	./lablgtktop testcc.ml
	rm -f testcc.ml

install:
	if test -d $(INSTALLDIR); then : ; else mkdir -p $(INSTALLDIR); fi
	if test `grep -s -c '^$(INSTALLDIR)$$' $(LIBDIR)/ld.conf` = 0; then \
	    echo $(INSTALLDIR) >> $(LIBDIR)/ld.conf; \
	fi
	cp $(ALLOBJS:.cmo=.cmi) $(THOBJS:.cmo=.cmi) $(INSTALLDIR)
	cp -p *.mli $(INSTALLDIR)
	cp -p $(ALLOBJS:.cmo=.ml) $(ALLTHOBJS:.cmo=.ml) $(INSTALLDIR)
	cp $(MLLIBS) $(THOBJS) $(INITOBJS) $(THINITOBJS) $(INSTALLDIR)
	cp $(CLIBS) $(INSTALLDIR)
	cp lablgtktop lablgtktop_t varcc $(INSTALLDIR)
	cp -p *.h $(INSTALLDIR)
	cp lablgtk $(BINDIR)
	if test -f dlllablgtk.so; then cp $(CLIBS:lib%.a=dll%.so) $(INSTALLDIR); fi
	if test -f lablgladecc; then cp lablgladecc $(BINDIR); fi
	if test -f lablgtk.cmxa; then $(MAKE) installopt; fi

installopt:
	cp $(MLLIBS:.cma=.cmxa) $(MLLIBS:.cma=.a) $(INSTALLDIR)
	cp $(ALLOBJS:.cmo=.cmx) $(INSTALLDIR)
	cp $(INITOBJS:.cmo=.o) $(INSTALLDIR)
	if test -f gtkThread.cmx; then \
	   cp $(THOBJS:.cmo=.cmx) $(THOBJS:.cmo=.o) $(INSTALLDIR); fi

lablgtk.cma: $(MLOBJS) $(COBJS)
	$(LIBRARIAN) -o lablgtk $(MLOBJS) $(COBJS) $(GTKLIBS)
lablgtk.cmxa: lablgtk.cma $(MLOBJS:.cmo=.cmx)
	$(LIBRARIAN) -o lablgtk $(MLOBJS:.cmo=.cmx) $(GTKLIBS)

lablgtkgl.cma: $(GLMLOBJS) $(GLCOBJS)
	$(LIBRARIAN) -o lablgtkgl -lgtkgl $(GLMLOBJS) $(GLCOBJS) \
	    $(GLLIBS) $(GTKLIBS)
lablgtkgl.cmxa: lablgtkgl.cma $(GLMLOBJS:.cmo=.cmx)
	$(LIBRARIAN) -o lablgtkgl $(GLMLOBJS:.cmo=.cmx)

lablgnome.cma: $(GNOMEMLOBJS) $(GNOMECOBJS)
	$(LIBRARIAN) -o lablgnome $(GNOMEMLOBJS) $(GNOMECOBJS) $(GNOMELIBS)
lablgnome.cmxa: lablgnome.cma $(GNOMEMLOBJS:.cmo=.cmx)
	$(LIBRARIAN) -o lablgnome $(GNOMEMLOBJS:.cmo=.cmx) $(GNOMELIBS)

lablglade.cma: $(GLADEMLOBJS) $(GLADECOBJS)
	$(LIBRARIAN) -o lablglade $(GLADEMLOBJS) $(GLADECOBJS) $(GLADELIBS)
lablglade.cmxa: lablglade.cma $(GLADEMLOBJS:.cmo=.cmx)
	$(LIBRARIAN) -o lablglade $(GLADEMLOBJS:.cmo=.cmx) $(GLADELIBS)

gtkThread.cmo: gtkThread.ml
	$(COMPILER) $(THFLAGS) gtkThread.ml

gtkThread.cmx: gtkThread.ml
	if test -f $(LIBDIR)/libthreadsnat.a; then \
	   $(COMPOPT) $(THFLAGS) gtkThread.ml; fi

xml_lexer.ml: xml_lexer.mll
	ocamllex xml_lexer.mll

varcc: varcc.cmo
	$(LINKER) -o $@ $<
	rm -f *_tags.h *_tags.c

clean:
	rm -f *.cm* *.o *.a *_tags.[ch] $(TARGETS)

$(GTKOBJS): gtk_tags.h ml_gtk.h ml_gdk.h wrappers.h
ml_gdk.o: gdk_tags.h ml_gdk.h wrappers.h
ml_gtkgl.o: gtkgl_tags.h ml_gtk.h ml_gdk.h wrappers.h
ml_gtkxmhtml.o: gtkxmhtml_tags.h ml_gtk.h ml_gdk.h wrappers.h

include .depend
