##########################################################################
# ocaml-gettext: a library to translate messages #
# #
# Copyright (C) 2001 Jean-Christophe FILLIATRE #
# Copyright (C) 2003-2008 Sylvain Le Gall <sylvain@le-gall.net> #
# #
# This library is free software; you can redistribute it and/or #
# modify it under the terms of the GNU Lesser General Public #
# License as published by the Free Software Foundation; either #
# version 2.1 of the License, or (at your option) any later version; #
# with the OCaml static compilation exception. #
# #
# This library is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
# Lesser General Public License for more details. #
# #
# You should have received a copy of the GNU Lesser General Public #
# License along with this library; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 #
# USA #
##########################################################################
# destination dir
DOCHTML=$(DOCDIR)/html
DOCODOC=$(DOCDIR)/html
DOCPDF =$(DOCDIR)/pdf
# programs flags
FOPFLAGS =
XSLTPROCFLAGS = --xinclude
XMLLINTFLAGS = --xinclude --noent --noout --postvalid
OCAMLDOCFLAGS =
ifdef REQUIRES
CLI_REQUIRES = -package "$(REQUIRES)"
endif
ifdef PREDICATES
CLI_PREDICATES = -predicates "$(PREDICATES)"
endif
ifdef SYNTAX
CLI_SYNTAX = -syntax $(SYNTAX)
endif
CLI_OCAMLFIND = $(CLI_REQUIRES) $(CLI_PREDICATES) $(CLI_SYNTAX)
BUILDLIB = $(TMPBUILDDIR)/lib
BUILDBIN = $(TMPBUILDDIR)/bin
BUILDDOC = $(TMPBUILDDIR)/share/doc
BUILDHTML = $(BUILDDOC)/html
BUILDMAN = $(TMPBUILDDIR)/share/man
BUILDODOC = $(BUILDHTML)/api
BUILDPDF = $(BUILDDOC)
BUILDPO = $(TMPBUILDDIR)/share/locale
OCAMLPATH:=$(BUILDLIB)/:$(OCAMLPATH)
export OCAMLPATH
all: $(STUBSLIB) $(if $(NAME),all-$(OCAMLBEST))
all-byte: $(if $(LIBRARY), install-buildlib-byte, install-buildprog-byte)
all-opt: $(if $(LIBRARY), install-buildlib-opt, install-buildprog-opt)
all: install-builddoc-html
all: install-builddoc-man
all: install-builddoc-odoc
all: install-builddoc-pdf
install: all $(if $(NAME),install-$(OCAMLBEST))
install-byte: $(if $(LIBRARY), install-lib-byte, install-prog-byte)
install-opt: $(if $(LIBRARY), install-lib-opt, install-prog-byte)
install: install-doc-html
install: install-doc-man
install: install-doc-odoc
install: install-doc-pdf
uninstall: $(if $(LIBRARY), uninstall-lib, uninstall-prog)
uninstall: uninstall-doc-html
uninstall: uninstall-doc-man
uninstall: uninstall-doc-odoc
uninstall: uninstall-doc-pdf
clean:: $(if $(LIBRARY), clean-lib, clean-prog)
clean:: clean-doc-odoc
clean:: clean-doc-pdf
clean:: clean-doc-html
clean:: clean-doc-man
distclean::
CMX = $(patsubst dll%.so, lib%.a, $(CMO:.cmo=.cmx))
INSTALL_DIR_AUX=$(INSTALL) -d $(2); $(INSTALL_DATA) -t $(2) $(wildcard $(dir $(1))*)
INSTALL_DIR=$(call INSTALL_DIR_AUX,$(1),$(2)/$(notdir $(patsubst %/,%,$(dir $(1)))))
# Build the lib
ONLY_BYTE=$(filter-out %.o,$(filter-out %.a,$(filter-out %.cmx, $(filter-out %.cmxa,$(1))))) $(filter lib%.a,$(1))
ML_OR_MLI=$(if $(wildcard $(1).mli),$(1).mli,$(1).ml)
GET_MLI=$(foreach interf,$(patsubst %.mli,%,$(filter %.mli,$(patsubst %.cmi,%.mli,$(1)))),$(call ML_OR_MLI,$(interf)))
%.cmxa %.a %.so:
$(if $(STUBSOBJS), \
$(OCAMLMKLIB) -o $* $^ $(OCAMLMKLIB_FLAGS), \
$(OCAMLOPT) -g -a -o $*.cmxa $^ \
)
%.cma %.a %.so:
$(if $(STUBSOBJS), \
$(OCAMLMKLIB) -o $* $^ $(OCAMLMKLIB_FLAGS), \
$(OCAMLC) -a -o $*.cma $^ \
)
install-buildlib-byte: REAL_INSTALLIB = $(call ONLY_BYTE,$(INSTALLIB))
install-buildlib-byte: $(call ONLY_BYTE,$(INSTALLIB))
install-buildlib-byte: install-buildlib-common
install-buildlib-opt: REAL_INSTALLIB = $(INSTALLIB)
install-buildlib-opt: $(INSTALLIB)
install-buildlib-opt: install-buildlib-common
install-buildlib-common: $(call GET_MLI,$(INSTALLIB))
$(INSTALL) -d $(BUILDLIB)
-$(OCAMLFIND) remove -destdir $(BUILDLIB) $(NAME)
$(OCAMLFIND) install -ldconf ignore -destdir $(BUILDLIB) -patch-version $(VERSION) $(NAME) \
$(REAL_INSTALLIB) $(call GET_MLI, $(REAL_INSTALLIB))
install-lib-byte: REAL_INSTALLIB = $(call ONLY_BYTE,$(INSTALLIB))
install-lib-byte: $(call ONLY_BYTE,$(INSTALLIB))
install-lib-byte: install-lib-common
install-lib-opt: REAL_INSTALLIB = $(INSTALLIB)
install-lib-opt: $(INSTALLIB)
install-lib-opt: install-lib-common
install-lib-common: $(call GET_MLI,$(INSTALLIB))
-$(OCAMLFIND) remove $(OCAMLFIND_REMOVE_FLAGS) $(NAME)
$(OCAMLFIND) install $(OCAMLFIND_INSTALL_FLAGS) -patch-version $(VERSION) $(NAME) \
$(REAL_INSTALLIB) $(call GET_MLI,$(INSTALLIB))
uninstall-lib:
-$(OCAMLFIND) remove $(OCAMLFIND_REMOVE_FLAGS) $(NAME)
clean-lib:
-$(OCAMLFIND) remove -destdir $(BUILDLIB) $(NAME)
# Build the executable
BLIBS = $(addsuffix .cma,$(LIBS))
install-buildprog-byte: $(CMO)
$(OCAMLC) -o $(NAME) $(INCLUDES) -package "$(REQUIRES)" -linkpkg \
-predicates "$(PREDICATES)" $(BLIBS) $(CMO)
$(INSTALL) -d $(BUILDBIN)
$(INSTALL_SCRIPT) -t $(BUILDBIN) $(NAME)
install-prog-byte: install-buildprog-byte
$(INSTALL) -d $(BINDIR)
$(INSTALL_SCRIPT) -t $(BINDIR) $(NAME)
OLIBS = $(addsuffix .cmxa,$(LIBS))
install-buildprog-opt: $(CMX)
$(OCAMLOPT) -g -o $(NAME) $(INCLUDES) -package "$(REQUIRES)" -linkpkg \
-predicates "$(PREDICATES)" $(OLIBS) $(CMX)
$(INSTALL) -d $(BUILDBIN)
$(INSTALL_SCRIPT) -t $(BUILDBIN) $(NAME)
install-prog-opt: install-buildprog-opt
$(INSTALL) -d $(BINDIR)
$(INSTALL_SCRIPT) -t $(BINDIR)/ $(NAME)
uninstall-prog:
$(if $(NAME),-$(RM) $(BINDIR)/$(NAME))
clean-prog:
-$(RM) $(NAME)
# Build PDF files
PDF_TARGET=$(patsubst %.xml,$(BUILDPDF)/%.pdf,$(1))
$(BUILDPDF)/%.pdf: %.fo
$(INSTALL) -d $(dir $@)
$(FOP) $(FOPFLAGS) -fo $^ -pdf $@
%.fo: %.xml
$(XMLLINT) $(XMLLINTFLAGS) $^
$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $(FOXSL) $^
install-builddoc-pdf: $(PDF_TARGETS)
clean-doc-pdf:
install-doc-pdf:
$(if $(PDF_TARGETS),$(INSTALL) -d $(DOCPDF))
$(if $(PDF_TARGETS),$(INSTALL_DATA) -t $(DOCPDF) $(PDF_TARGETS))
uninstall-doc-pdf:
-$(if $(PDF_TARGETS),$(RM) $(foreach i,$(PDF_TARGETS),$(DOCPDF)/$(notdir $(i))))
# Build OCaml documentaiton
ODOC_TARGET=$(BUILDODOC)/$(1)/index.html
TARGET_ODOC=$(notdir $(patsubst %/index.html,%,$(1)))
$(BUILDODOC)/%/index.html:
$(INSTALL) -d $(dir $@)
EXTRAFLAGS=`$(OCAMLFIND) query -i-format -r $(REQUIRES)`; \
$(OCAMLDOC) $(OCAMLDOCFLAGS) $$EXTRAFLAGS -d $(dir $@) -html $^
$(if $(EXTRAFILES),$(INSTALL_DATA) -t $(dir $@) $(EXTRAFILES))
install-builddoc-odoc: $(ODOC_TARGETS)
clean-doc-odoc:
install-doc-odoc:
$(if $(ODOC_TARGETS),$(foreach i,$(ODOC_TARGETS), $(INSTALL) -d $(DOCODOC)/$(call TARGET_ODOC,$(i));))
$(if $(ODOC_TARGETS),$(foreach i,$(ODOC_TARGETS), $(INSTALL_DATA) -t $(DOCODOC)/$(call TARGET_ODOC,$(i)) $(wildcard $(dir $(i))/*);))
uninstall-doc-odoc: clean-doc-odoc
-$(if $(ODOC_TARGETS),$(RM) -r $(foreach i,$(ODOC_TARGETS),$(DOCODOC)/$(call TARGET_ODOC,$(i))))
# Build HTML files
HTML_TARGET=$(patsubst %.xml,$(BUILDHTML)/%/index.html,$(1))
TARGET_HTML=$(notdir $(patsubst %/index.html,%,$(1)))
$(BUILDHTML)/%/index.html: %.xml
$(XMLLINT) $(XMLLINTFLAGS) $^
$(INSTALL) -d $(dir $@)
$(XSLTPROC) $(XSLTPROCFLAGS) --stringparam base.dir "$(dir $@)" $(HTMLXSL) $^
$(if $(IMAGES),$(INSTALL_DATA) -t $(dir $@) $(IMAGES))
install-builddoc-html: $(HTML_TARGETS)
clean-doc-html:
install-doc-html: install-builddoc-html
$(if $(HTML_TARGETS),$(foreach i,$(HTML_TARGETS),$(call INSTALL_DIR,$(i),$(DOCHTML));))
uninstall-doc-html: clean-doc-html
-$(if $(HTML_TARGETS),$(RM) -r $(foreach i,$(HTML_TARGETS),$(DOCHTML)/$(call TARGET_HTML,$(i))))
# Build MAN files
MAN_SECTION=man$(patsubst .%,%,$(suffix $(1)))
MAN_BUILD_TARGETS=$(BUILDMAN)/$(call MAN_SECTION,$(1))/$(1)
MAN_INSTALL_TARGETS=$(MANDIR)/$(call MAN_SECTION,$(1))/$(1)
define PROCESS_MAN
$(XMLLINT) $(XMLLINTFLAGS) $^
$(XSLTPROC) $(XSLTPROCFLAGS) $(MANXSL) $^
$(INSTALL) -d $(dir $(call MAN_BUILD_TARGETS,$@))
$(INSTALL_DATA) $@ $(call MAN_BUILD_TARGETS,$@)
endef
%.1:
$(PROCESS_MAN)
%.2:
$(PROCESS_MAN)
%.3:
$(PROCESS_MAN)
%.4:
$(PROCESS_MAN)
%.5:
$(PROCESS_MAN)
%.6:
$(PROCESS_MAN)
%.7:
$(PROCESS_MAN)
%.8:
$(PROCESS_MAN)
%.9:
$(PROCESS_MAN)
install-builddoc-man: $(MAN_TARGETS)
clean-doc-man:
install-doc-man: install-builddoc-man
$(if $(MAN_TARGETS),$(foreach i,$(MAN_TARGETS),$(INSTALL) -d $(dir $(call MAN_INSTALL_TARGETS,$(i)));))
$(if $(MAN_TARGETS),$(foreach i,$(MAN_TARGETS),$(INSTALL_DATA) $(call MAN_BUILD_TARGETS,$(i)) $(call MAN_INSTALL_TARGETS,$(i));))
uninstall-doc-man: clean-doc-man
-$(if $(MAN_TARGETS),$(RM) $(foreach i,$(MAN_TARGETS),$(call MAN_INSTALL_TARGETS,$(i))))
# Extra files
.SUFFIXES: .mli .ml .cmi .cmo .cmx .mll .mly .zog .idl .h .o
%.ml %.mli %.h %_stubs.c: %.idl
$(CAMLIDL) -nocpp -no-include $<
.c.o:
$(OCAMLC) $(INCLUDES) -c $<
.mli.cmi:
$(OCAMLC) $(INCLUDES) $(CLI_OCAMLFIND) -c $<
.ml.cmo:
$(OCAMLC) $(INCLUDES) $(CLI_OCAMLFIND) -c $<
.ml.o:
$(OCAMLOPT) -g $(INCLUDES) $(CLI_OCAMLFIND) -c $<
.ml.cmx:
$(OCAMLOPT) -g $(INCLUDES) $(CLI_OCAMLFIND) -c $<
.mll.ml:
$(OCAMLLEX) $<
.mly.ml:
$(OCAMLYACC) -v $<
.mly.mli:
$(OCAMLYACC) -v $<
#.ml.mli:
# $(OCAMLC) $(INCLUDES) $(CLI_OCAMLFIND) -i $< > $@ || $(RM) $@
# # Set date of the target to the date of the source
# touch -r $< $@
clean:: $(if $(LIBRARY),clean-lib,clean-prog)
-$(RM) *.cm[ioxa] *.o *.cmxa *.a *.so
-$(RM) $(GENERATED) *.output
distclean:: clean