# 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
OBJECTS_UNIX   = metacache_unix.cmo findlib_guess.cmo
TOBJECTS       = topfind.cmo

XOBJECTS       = $(OBJECTS:.cmo=.cmx)
XOBJECTS_NONMT = $(OBJECTS_NONMT:.cmo=.cmx)
XOBJECTS_MT    = $(OBJECTS_MT:.cmo=.cmx)
XOBJECTS_UNIX  = $(OBJECTS_UNIX:.cmo=.cmx)

OCAMLFIND_OBJECTS = frontend.cmo
OCAMLFIND_XOBJECTS = frontend.cmx

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

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

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

ocamlfind_opt$(EXEC_SUFFIX): findlib.cmxa findlib_unix.cmxa $(OCAMLFIND_XOBJECTS)
	$(OCAMLOPT) -o ocamlfind_opt$(EXEC_SUFFIX) findlib.cmxa unix.cmxa \
		  findlib_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_unix.cma: $(OBJECTS_UNIX)
	$(OCAMLC) -a -o findlib_unix.cma $(OBJECTS_UNIX)

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_unix.cmxa: $(XOBJECTS_UNIX)
	$(OCAMLOPT) -a -o findlib_unix.cmxa $(XOBJECTS_UNIX)

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

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

findlib.ml: findlib.mlp
	echo "(* THIS FILE IS GENERATED! DO NOT CHANGE! *)" >findlib.ml
	sed -e 's:@METACACHE@:Metacache:g' \
	    findlib.mlp >>findlib.ml

mt/findlib.mml: findlib.mlp
	mkdir -p mt
	echo "(* THIS FILE IS GENERATED! DO NOT CHANGE! *)" >mt/findlib.mml
	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

mk_toolbox:
	if [ "$(MAKE_TOOLBOX)" = "yes" ]; then      \
		( cd toolbox; make );               \
	fi

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


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
	./release

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

.PHONY: release
release:
	$(MAKE) tag-release
	$(MAKE) dist

install: all
	mkdir -p $(PREFIX)$(OCAML_SITELIB)/$(NAME)
	mkdir -p $(PREFIX)$(OCAMLFIND_BIN)
	cp topfind $(PREFIX)$(OCAML_CORE_STDLIB)
	test -f $(PREFIX)$(OCAML_CORE_STDLIB)/findlib || ln -s topfind $(PREFIX)$(OCAML_CORE_STDLIB)/findlib # compat
	test -f $(PREFIX)$(OCAML_CORE_STDLIB)/ocamlfind || ln -s topfind $(PREFIX)$(OCAML_CORE_STDLIB)/ocamlfind # compat
	files=`./collect_files Makefile.config findlib.cmi findlib.mli findlib.cma findlib_mt.cma findlib_unix.cma topfind.cmi topfind.mli findlib_top.cma findlib.cmxa findlib.a findlib_mt.cmxa findlib_mt.a findlib_unix.cmxa findlib_unix.a META toolbox/make_wizard$(EXEC_SUFFIX) toolbox/make_wizard.pattern` && \
	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

