# make all: compile to bytecode
# make opt: compile to native code
# make install: install bytecode and/or native code
#
# See Makefile.config for configurable variables.
# Runtime configurations might also be necessary in the site-lib/*/META
# files.
#----------------------------------------------------------------------

# To package findlib:
PREFIX =

NAME = findlib

OCAMLC = ocamlc
OCAMLOPT = ocamlopt
OCAMLDEP = ocamldep
OCAMLLEX = ocamllex
CAMLP4O =  camlp4 pa_o.cmo pa_op.cmo pr_o.cmo --
#CAMLP4O =  camlp4 pa_o.cmo pa_op.cmo pr_dump.cmo --


OBJECTS        = findlib_config.cmo split.cmo metatoken.cmo meta.cmo \
		 metascanner.cmo topo.cmo
OBJECTS_NONMT  = metacache.cmo findlib.cmo
OBJECTS_MT     = metacache.cmo metacache_mt.cmo mt/findlib.cmo
TOBJECTS       = topfind.cmo
XOBJECTS       = findlib_config.cmx split.cmx metatoken.cmx meta.cmx \
		 metascanner.cmx topo.cmx
XOBJECTS_NONMT = metacache.cmx findlib.cmx
XOBJECTS_MT    = metacache.cmx metacache_mt.cmx mt/findlib.cmx

OCAMLFIND_OBJECTS = metacache_unix.cmo findlib_guess.cmo frontend.cmo
OCAMLFIND_XOBJECTS = metacache_unix.cmx findlib_guess.cmx frontend.cmx

all: ocamlfind$(EXEC_SUFFIX) findlib.cma findlib_mt.cma findlib_top.cma findlib.conf findlib

opt: ocamlfind_opt$(EXEC_SUFFIX) findlib.cmxa findlib_mt.cmxa findlib.conf findlib

ocamlfind$(EXEC_SUFFIX): findlib.cma $(OCAMLFIND_OBJECTS)
	$(OCAMLC) -g -custom -o ocamlfind$(EXEC_SUFFIX) findlib.cma unix.cma \
	          $(OCAMLFIND_OBJECTS)

ocamlfind_opt$(EXEC_SUFFIX): findlib.cmxa  $(OCAMLFIND_XOBJECTS)
	$(OCAMLOPT) -o ocamlfind_opt$(EXEC_SUFFIX) findlib.cmxa unix.cmxa \
		  $(OCAMLFIND_XOBJECTS)

findlib.cma: $(OBJECTS) $(OBJECTS_NONMT)
	$(OCAMLC) -a -o findlib.cma $(OBJECTS) $(OBJECTS_NONMT)

findlib_mt.cma: $(OBJECTS) $(OBJECTS_MT)
	$(OCAMLC) -a -o findlib_mt.cma $(OBJECTS) $(OBJECTS_MT)

findlib_top.cma: $(TOBJECTS)
	$(OCAMLC) -a -o findlib_top.cma $(TOBJECTS)

findlib.cmxa: $(XOBJECTS) $(XOBJECTS_NONMT)
	$(OCAMLOPT) -a -o findlib.cmxa $(XOBJECTS) $(XOBJECTS_NONMT)

findlib_mt.cmxa: $(XOBJECTS) $(XOBJECTS_MT)
	$(OCAMLOPT) -a -o findlib_mt.cmxa $(XOBJECTS) $(XOBJECTS_MT)

findlib_config.ml: findlib_config.mlp Makefile.config
	sed -e 's;@CONFIGFILE@;$(OCAMLFIND_CONF);g' \
	    -e 's;@STDLIB@;$(OCAML_CORE_STDLIB);g' \
	    -e 's;@AUTOLINK@;$(OCAML_AUTOLINK);g' \
	    findlib_config.mlp >findlib_config.ml

findlib.conf: findlib.conf.in Makefile.config
	sed -e 's;@SITELIB@;$(OCAML_SITELIB);g' \
	    findlib.conf.in >findlib.conf

findlib: findlib.p
	sed -e 's;@SITELIB@;$(OCAML_SITELIB);g' \
	    findlib.p >findlib

findlib.ml: findlib.mlp
	sed -e 's:@METACACHE@:Metacache:g' \
	    findlib.mlp >findlib.ml

mt/findlib.mml: findlib.mlp
	mkdir -p mt
	sed -e 's:@METACACHE@:Metacache_mt:g' \
	    findlib.mlp >mt/findlib.mml

mt/findlib.cmo: findlib.cmo metacache_mt.cmo mt/findlib.cmi
mt/findlib.cmx: findlib.cmx metacache_mt.cmx mt/findlib.cmi
metacache_mt.cmo: metacache.cmo
metacache_mt.cmx: metacache.cmx

mt/findlib.cmi: findlib.cmi
	mkdir -p mt
	cp findlib.cmi findlib.mli mt

clean:
	rm -f *.cmi *.cmo *.cma *.cmx *.a *.o *.cmxa findlib.ml findlib_mt.mml \
	  mt/*.* meta.ml findlib_config.ml findlib.mml findlib \
	  ocamlfind$(EXEC_SUFFIX) ocamlfind_opt$(EXEC_SUFFIX)


mrproper: clean
	rm -f metascanner.ml

# distclean: don't remove metascanner.ml; it is distributed

distclean: clean
	rm -f *~ mini/*~ findlib.conf
	cd config; rm -f *.cmi *.cmo *.cma *.cmx *.a *.o *.cmxa *~ testdb.* simple err.out makehelper withtk
	cd scripts; rm -f *~
	cd site-lib; for x in `ls`; do rm -f $$x/*~ $$x/META; done
	$(MAKE) -C doc distclean

RELEASE: META
	awk '/version/ { print substr($$3,2,length($$3)-2) }' META >RELEASE

dist: RELEASE
	test -f metascanner.ml
	r=`head -1 RELEASE`; cd ..; gtar czf $(NAME)-$$r.tar.gz --exclude='*/CVS*' --exclude="*/depend" --exclude="*/Makefile.config" --exclude="*/meta.ml" --exclude="*/findlib.ml" --exclude="*/mt/*" --exclude="*/dl/*" --exclude="*/dl" --exclude="*/dlgen/*" --exclude="*/dlgen" --exclude="*/Mail*" $(NAME)

tag-release: RELEASE
	r=`head -1 RELEASE | sed -e s/\\\./-/g`; cd ..; cvs tag -F $(NAME)-$$r $(NAME)

release: distclean
	$(MAKE) tag-release
	$(MAKE) dist

install: all
	mkdir -p $(PREFIX)$(OCAML_SITELIB)/$(NAME)
	mkdir -p $(PREFIX)$(OCAMLFIND_BIN)
	cp findlib $(PREFIX)$(OCAML_CORE_STDLIB)
	files=`./collect_files Makefile.config findlib.cmi findlib.mli findlib.cma findlib_mt.cma topfind.cmi topfind.mli findlib_top.cma findlib.cmxa findlib.a findlib_mt.cmxa findlib_mt.a META` && \
	cp $$files $(PREFIX)$(OCAML_SITELIB)/$(NAME)
	f="ocamlfind$(EXEC_SUFFIX)"; { test -f ocamlfind_opt$(EXEC_SUFFIX) && f="ocamlfind_opt$(EXEC_SUFFIX)"; }; \
	cp $$f $(PREFIX)$(OCAMLFIND_BIN)/ocamlfind$(EXEC_SUFFIX)
	mkdir -p $(PREFIX)$(OCAMLFIND_MAN)/man1 $(PREFIX)$(OCAMLFIND_MAN)/man3 $(PREFIX)$(OCAMLFIND_MAN)/man5
	cp doc/man/ocamlfind.1 $(PREFIX)$(OCAMLFIND_MAN)/man1
	cp doc/man/Findlib.3 doc/man/Topfind.3 $(PREFIX)$(OCAMLFIND_MAN)/man3
	cp doc/man/META.5 doc/man/site-lib.5 doc/man/findlib.conf.5 $(PREFIX)$(OCAMLFIND_MAN)/man5
	$(MAKE) install-meta
	mkdir -p `dirname $(PREFIX)$(OCAMLFIND_CONF)`
	@if [ ! -f $(PREFIX)$(OCAMLFIND_CONF) ]; then echo "!!! Keeping old $(PREFIX)$(OCAMLFIND_CONF) !!!"; fi
	test -f $(PREFIX)$(OCAMLFIND_CONF) || cp findlib.conf $(PREFIX)$(OCAMLFIND_CONF)

install-meta:
	for x in `ls site-lib`; do if [ "$$x" != "CVS" -a -f "site-lib/$$x/META" ]; then mkdir -p $(PREFIX)$(OCAML_SITELIB)/$$x; cp site-lib/$$x/META $(PREFIX)$(OCAML_SITELIB)/$$x; fi; done


uninstall:
	$(MAKE) uninstall-meta
	rm -f $(PREFIX)$(OCAML_CORE_STDLIB)/findlib
	rm -rf $(PREFIX)$(OCAML_SITELIB)/$(NAME)
	rm -f $(PREFIX)$(OCAMLFIND_BIN)/ocamlfind$(EXEC_SUFFIX)
	rm -f $(PREFIX)$(OCAMLFIND_MAN)/man1/ocamlfind.1
	rm -f $(PREFIX)$(OCAMLFIND_MAN)/man3/Findlib.3
	rm -f $(PREFIX)$(OCAMLFIND_MAN)/man3/Topfind.3
	rm -f $(PREFIX)$(OCAMLFIND_MAN)/man5/META.5
	rm -f $(PREFIX)$(OCAMLFIND_MAN)/man5/site-lib.5

uninstall-meta:
	for x in `ls site-lib`; do if [ "$$x" != "CVS" ]; then rm -rf $(PREFIX)$(OCAML_SITELIB)/$$x; fi; done


depend: *.ml *.mli findlib.ml meta.ml metascanner.ml
	$(OCAMLDEP) *.ml *.mli >depend

Makefile.config:
	./configure

# Some 'make' implementations require that .SUFFIXES must occur before
# the first suffix rule. (E.g. AIX)
.SUFFIXES: .mll .cmo .cmi .cmx .ml .mli .mml .src

.mml.cmo:
	$(OCAMLC) -g -thread -c -impl $<

.mml.cmx:
	$(OCAMLOPT) -thread -c -impl $<

.ml.cmx:
	$(OCAMLOPT) -c $<

.ml.cmo:
	$(OCAMLC) -g -c $<

.mli.cmi:
	$(OCAMLC) -c $<

.src.ml:
	$(CAMLP4O) -impl $< -o $@

# Solaris make does not like the suffix rule .mll.ml,
# so I replaced it by its single application:
meta.ml: meta.mll
	$(OCAMLLEX) meta.mll

# Don't remove metascanner.ml:
.PRECIOUS: metascanner.ml

include Makefile.config
include depend

