########################################################################## # ocaml-gettext: a library to translate messages # # # # Copyright (C) 2001 Jean-Christophe FILLIATRE # # Copyright (C) 2003-2008 Sylvain Le Gall # # # # 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) -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) -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) $(INCLUDES) $(CLI_OCAMLFIND) -c $< .ml.cmx: $(OCAMLOPT) $(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