#**************************************************************************
#*                                                                        *
#*                                 OCaml                                  *
#*                                                                        *
#*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *
#*                                                                        *
#*   Copyright 1999 Institut National de Recherche en Informatique et     *
#*     en Automatique.                                                    *
#*                                                                        *
#*   All rights reserved.  This file is distributed under the terms of    *
#*   the GNU Lesser General Public License version 2.1, with the          *
#*   special exception on linking described in the file LICENSE.          *
#*                                                                        *
#**************************************************************************

# Common Makefile for otherlibs

ROOTDIR=../..
include $(ROOTDIR)/Makefile.common
include $(ROOTDIR)/Makefile.best_binaries

CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun

CAMLC := $(BEST_OCAMLC) -nostdlib -I $(ROOTDIR)/stdlib
CAMLOPT := $(BEST_OCAMLOPT) -nostdlib -I $(ROOTDIR)/stdlib

ifneq "$(CCOMPTYPE)" "msvc"
OC_CFLAGS += -g
endif

OC_CFLAGS += $(SHAREDLIB_CFLAGS) $(EXTRACFLAGS)
OC_CPPFLAGS += -I$(ROOTDIR)/runtime $(EXTRACPPFLAGS)

# Compilation options
COMPFLAGS=-absname -w +a-4-9-41-42-44-45-48 -warn-error A -bin-annot -g \
          -safe-string -strict-sequence -strict-formats $(EXTRACAMLFLAGS)
ifeq "$(FLAMBDA)" "true"
OPTCOMPFLAGS += -O3
endif
MKLIB=$(CAMLRUN) $(ROOTDIR)/tools/ocamlmklib

# Variables that must be defined by individual libraries:
# LIBNAME
# CAMLOBJS

# Variables that can be defined by individual libraries,
# but have sensible default values:
COBJS ?=
EXTRACFLAGS ?=
EXTRACPPFLAGS ?=
EXTRACAMLFLAGS ?=
LINKOPTS ?=
LDOPTS ?=
HEADERS ?=
CMIFILES ?= $(CAMLOBJS:.cmo=.cmi)
CAMLOBJS_NAT ?= $(CAMLOBJS:.cmo=.cmx)
CLIBNAME ?= $(LIBNAME)

ifeq "$(COBJS)" ""
STUBSLIB=
else
STUBSLIB=lib$(CLIBNAME).$(A)
endif

.PHONY: all allopt opt.opt # allopt and opt.opt are synonyms
all: $(STUBSLIB) $(LIBNAME).cma $(CMIFILES)

allopt: $(STUBSLIB) $(LIBNAME).cmxa $(LIBNAME).$(CMXS) $(CMIFILES)
opt.opt: allopt

$(LIBNAME).cma: $(CAMLOBJS)
ifeq "$(COBJS)" ""
	$(CAMLC) -o $@ -a -linkall $(CAMLOBJS) $(LINKOPTS)
else
	$(MKLIB) -o $(LIBNAME) -oc $(CLIBNAME) -ocamlc '$(CAMLC)' -linkall \
	         $(CAMLOBJS) $(LINKOPTS)
endif

$(LIBNAME).cmxa: $(CAMLOBJS_NAT)
ifeq "$(COBJS)" ""
	$(CAMLOPT) -o $@ -a -linkall $(CAMLOBJS_NAT) $(LINKOPTS)
else
	$(MKLIB) -o $(LIBNAME) -oc $(CLIBNAME) -ocamlopt '$(CAMLOPT)' -linkall \
	         $(CAMLOBJS_NAT) $(LINKOPTS)
endif

$(LIBNAME).cmxs: $(LIBNAME).cmxa $(STUBSLIB)
	$(CAMLOPT_CMD) -shared -o $(LIBNAME).cmxs -I . $(LIBNAME).cmxa

lib$(CLIBNAME).$(A): $(COBJS)
	$(MKLIB_CMD) -oc $(CLIBNAME) $(COBJS) $(LDOPTS)

install::
	if test -f dll$(CLIBNAME)$(EXT_DLL); then \
	  $(INSTALL_PROG) \
	    dll$(CLIBNAME)$(EXT_DLL) "$(INSTALL_STUBLIBDIR)"; \
	fi
ifneq "$(STUBSLIB)" ""
	$(INSTALL_DATA) $(STUBSLIB) "$(INSTALL_LIBDIR)/"
	cd "$(INSTALL_LIBDIR)"; $(RANLIB) lib$(CLIBNAME).$(A)
endif

	$(INSTALL_DATA) \
	  $(LIBNAME).cma $(CMIFILES) \
	  "$(INSTALL_LIBDIR)/"
ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true"
	$(INSTALL_DATA) \
	  $(CMIFILES:.cmi=.mli) \
          $(CMIFILES:.cmi=.cmti) \
	  "$(INSTALL_LIBDIR)/"
endif
	if test -n "$(HEADERS)"; then \
	  $(INSTALL_DATA) $(HEADERS) "$(INSTALL_LIBDIR)/caml/"; \
	fi

installopt:
	$(INSTALL_DATA) \
	   $(CAMLOBJS_NAT) $(LIBNAME).cmxa $(LIBNAME).$(A) \
	   "$(INSTALL_LIBDIR)/"
	cd "$(INSTALL_LIBDIR)"; $(RANLIB) $(LIBNAME).a
	if test -f $(LIBNAME).cmxs; then \
	  $(INSTALL_PROG) $(LIBNAME).cmxs "$(INSTALL_LIBDIR)"; \
	fi

partialclean:
	rm -f *.cm*

clean:: partialclean
	rm -f *.dll *.so *.a *.lib *.o *.obj
	rm -rf $(DEPDIR)

.SUFFIXES: .ml .mli .cmi .cmo .cmx

.mli.cmi:
	$(CAMLC) -c $(COMPFLAGS) $<

.ml.cmo:
	$(CAMLC) -c $(COMPFLAGS) $<

.ml.cmx:
	$(CAMLOPT) -c $(COMPFLAGS) $(OPTCOMPFLAGS) $<

ifeq "$(COMPUTE_DEPS)" "true"
ifneq "$(COBJS)" ""
include $(addprefix $(DEPDIR)/, $(COBJS:.$(O)=.$(D)))
endif
endif

$(DEPDIR)/%.$(D): %.c | $(DEPDIR)
	$(DEP_CC) $(OC_CPPFLAGS) $(CPPFLAGS) $< -MT '$*.$(O)' -MF $@
