# Magic
# Copyright (C) 2005: Christophe TROESTLER
#	$Id: Makefile,v 1.3 2006/03/17 10:39:25 chris_77 Exp $	
PKGNAME		= $(shell grep name META | \
			sed -e "s/.*\"\([^\"]*\)\".*/\1/")
PKGVERSION	= $(shell grep version META | \
			sed -e "s/.*\"\([^\"]*\)\".*/\1/")

SRC_WEB		= web
SF_WEB		= /home/groups/o/oc/ocaml-magic/htdocs

include Makefile.config

OCAMLFLAGS 	= -dtypes
OCAMLOPTFLAGS	= -inline 2
OCAMLDOCFLAGS	=

SOURCES = magic.ml
INTERFACES = magic.mli
C_SOURCES = magic_stub.c
DEMOS = file.ml

DISTFILES	= README INSTALL LICENSE META debian/ \
  Makefile Makefile.config $(SOURCES) $(INTERFACES) $(C_SOURCES) $(DEMOS)

PKG_DIR		= OCaml-$(PKGNAME)-$(PKGVERSION)
PKG_TARBALL 	= $(PKG_DIR).tar.gz
ARCHIVE 	= $(shell grep "archive(byte)" META | \
			sed -e "s/.*\"\([^\"]*\)\".*/\1/")
XARCHIVE 	= $(shell grep "archive(native)" META | \
			sed -e "s/.*\"\([^\"]*\)\".*/\1/")

.PHONY: all byte opt install install-byte install-opt doc ps dist
all: byte opt
byte: $(ARCHIVE)
opt: $(XARCHIVE)
doc: html
ex: $(DEMOS:.ml=.exe) $(DEMOS:.ml=.com)

$(ARCHIVE): magic_stub.o magic.ml magic.cmi
	$(OCAMLMKLIB) -o $(basename $@) -oc $(basename $@)_stub -failsafe \
	  -lmagic -L$(MAGIC_A) $(filter %.o, $^) $(filter %.ml, $^)

$(XARCHIVE): $(ARCHIVE)


# Examples
file.exe: file.ml $(ARCHIVE)
	  $(OCAMLC) -o $@ -cclib -L. -dllpath . $(ARCHIVE) $<
file.com: file.ml $(XARCHIVE)
	  $(OCAMLOPT) -o $@ -cclib -L. $(XARCHIVE) $<

# Install
install: install-byte install-opt install-doc
install-byte: byte
	[ -d $(OCAMLLIBDIR) ] || mkdir -p $(OCAMLLIBDIR)
	cp $(ARCHIVE) $(ARCHIVE:.cma=.cmi) $(ARCHIVE:.cma=.mli) $(OCAMLLIBDIR)

install-opt: opt
	[ -d $(OCAMLLIBDIR) ] || mkdir -p $(OCAMLLIBDIR)
	cp $(XARCHIVE) $(XARCHIVE:.cmxa=.cmi) $(XARCHIVE:.cmxa=.mli) \
		$(OCAMLLIBDIR)
install-doc: doc
	[ -d $(DOCDIR) ] || mkdir -p $(DOCDIR)
	cp html/* $(DOCDIR)

# Documentation
.PHONY: html
html: html/index.html

html/index.html: $(INTERFACES) $(INTERFACES:.mli=.cmi)
	[ -d html/ ] || mkdir html
	$(OCAMLDOC) -d html -html $(OCAMLDOCFLAGS) $(INTERFACES)

# Packaging
.PHONY: dist
dist:
	[ -d $(PKG_DIR) ] || mkdir $(PKG_DIR)
	cp --preserve -r $(DISTFILES) $(PKG_DIR)
	tar --exclude "CVS" -zcvf $(PKG_TARBALL) $(PKG_DIR)
	rm -rf $(PKG_DIR)

# Release a Sourceforge tarball and publish the HTML doc 
.PHONY: web upload
web: doc
	@if [ -d html ] ; then \
	  scp -r html shell.sf.net:$(SF_WEB)/ \
	  && echo "*** Published documentation on SF" ; \
	fi
	@ if [ -d $(SRC_WEB)/ ] ; then \
	  scp $(SRC_WEB)/*.html $(SRC_WEB)/*.jpg LICENSE \
	    shell.sf.net:$(SF_WEB) \
	  && echo "*** Published web site ($(SRC_WEB)/) on SF" ; \
	fi

upload: dist
	@ if [ -z "$(PKG_TARBALL)" ]; then \
		echo "PKG_TARBALL not defined"; exit 1; fi
	echo -e "bin\ncd incoming\nput $(PKG_TARBALL)" \
	  | ncftp -p chris_77@users.sf.net upload.sourceforge.net \
	  && echo "*** Uploaded $(PKG_TARBALL) to SF"



# Caml general dependencies
.SUFFIXES: .ml .mli .cmo .cmi .cmx
%.o: %.c
	$(OCAMLC) -c -I $(OCAML_H) $<
%.cmi: %.mli
	$(OCAMLC) $(OCAMLFLAGS) -c $<
%.cmo: %.ml
	$(OCAMLC) $(OCAMLFLAGS) -c $<
%.cma: # Dependencies to be set elsewhere
	$(OCAMLC) -a -o $@ $(OCAMLFLAGS) $(filter %.cmo, $^)
.ml.cmx:
	$(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<
%.cmxa: # Dependencies to be set elsewhere
	$(OCAMLOPT) -a -o $@ $(OCAMLOPTFLAGS) $(filter %.cmx, $^)

.PHONY: depend dep
dep: .depend
depend: .depend
.depend: $(wildcard *.ml) $(wildcard *.mli)
	$(OCAMLDEP) $^ > .depend

include .depend

########################################################################

.PHONY: clean dist-clean
clean:
	rm -f *~ .*~ *.{o,a} *.cm[aiox] *.cmxa *.annot *.css
	rm -f $(PKG_TARBALL) cgi.ps
	find . -not -name *.sh -type f -perm -u=x -exec rm -f {} \;

dist-clean: clean
	rm .depend