default: cduce include Makefile.conf include VERSION ifneq ($(ML_INTERFACE), false) OCAMLIFACE=ocamliface/$(ML_INTERFACE_VERSION) else OCAMLIFACE= endif ALL_TARGET=cduce cduce_lib.cma INSTALL_BINARIES=cduce$(EXE) ifneq ($(ML_INTERFACE), false) INSTALL_BINARIES += cduce_mktop endif OUNIT_TESTS=eval cdnum cdsdl misc ifeq ($(NATIVE),true) ALL_TARGET += cduce_lib.cmxa endif PACKAGES = dynlink camlp4 ulex pcre num netstring ALL_ML_IFACE = 3.x 4.01 4.02 # Call make with VERBOSE=true to get a trace of commands VERBOSE?=false ifneq ($(VERBOSE), true) HIDE=@ else HIDE= endif SYNTAX = -I misc/ q_symbol.cmo \ -symbol cduce_version=\"$(VERSION)\" \ -symbol build_date=\"$(shell date +%Y-%m-%d)\" \ -symbol session_dir=\"$(SESSION_DIR)\" \ -loc "_loc" SYNTAX_PARSER = -syntax camlp4o $(SYNTAX:%=-ppopt %) CAMLC_P = ocamlc -g DEPEND_OCAMLDEP = misc/q_symbol.cmo ifeq ($(PROFILE), true) CAMLOPT_P = ocamlopt -p -inline 100 ifeq ($(NATIVE), false) CAMLC_P = ocamlcp -p a SYNTAX_PARSER = DEPEND_OCAMLDEP = endif else CAMLOPT_P = ocamlopt -inline 100 endif OPT = -warn-error FPSXY ANNOT = INTERFACE = ifeq ($(ANNOT), true) OPT += -passopt -dtypes endif ifeq ($(INTERFACE), true) OPT += -passopt -i endif OCAMLFIND = ocamlfind CAMLC = $(OCAMLFIND) $(CAMLC_P) $(OPT) -package "$(PACKAGES)" CAMLOPT = $(OCAMLFIND) $(CAMLOPT_P) $(OPT) -package "$(PACKAGES)" ifeq ($(NATIVE), true) EXTENSION = cmx EXTENSION_LIB = cmxa CAML=ocamlopt COMPILE = $(CAMLOPT) LINK = $(CAMLOPT) -linkpkg ifeq ($(NATDYNLINK), true) LINK += dynlink.cmxa endif ifeq ($(ADDICON), true) LINK += cduceres.o endif LINK += camlp4lib.cmxa SYNTAX += -symbol ocaml_compiler=\"native\" else EXTENSION = cmo EXTENSION_LIB = cma COMPILE = $(CAMLC) CAML=ocamlc LINK = $(CAMLC) -custom -linkpkg camlp4lib.cma SYNTAX += -symbol ocaml_compiler=\"bytecode\" endif ifeq ($(FORPACK),true) FORPACKOPT=-passopt -for-pack -passopt Cduce_lib else FORPACKOPT= endif INSTALL := install -c ifeq ($(NATIVE),true) .PHONY: cduce_lib.cma cduce_lib.cma: $(HIDE)$(MAKE) NATIVE=false $@ endif install: all install_bin install_lib install_doc install_bin: @echo "Install binaries" $(HIDE)mkdir -p $(BINDIR) $(HIDE)$(INSTALL) -m755 $(INSTALL_BINARIES) $(BINDIR)/ install_lib: install_lib: $(HIDE)$(MAKE) NATIVE=true all @echo "Build META" $(HIDE)(sed "s/%REQ%/$(PACKAGES)/" < META.in | sed "s/%VER%/$(VERSION)/" > META) $(HIDE)-$(OCAMLFIND) remove cduce $(HIDE)-$(OCAMLFIND) install cduce META \ lib/cduce_lib.cmi lib/cduce_lib.cma lib/cduce_lib.cmxa lib/cduce_lib.a \ uninstall: rm -f $(BINDIR)/cduce$(EXE) $(BINDIR)/cduce_mktop rm -f $(MANDIR)/man1/cduce.1 rm -Rf $(DOCDIR) ocamlfind remove cduce help: @echo "GOALS" @echo " cduce : compiles the CDuce command line interpreter" @echo " dtd2cduce: compiles the dtd2cduce tools" @echo " doc : build the documentation" @echo " all : build binaries and libraries" @echo " install : install binaries, man pages, documentation" @echo " clean : back to the starting point" @echo " uninstall : remove installed files" # Source directories DIRS_DEPEND = misc parser schema typing types compile runtime driver query win32 CLEAN_DIRS := $(DIRS_DEPEND) tools tests DIRS := $(DIRS_DEPEND) $(OCAMLIFACE) # Objects to build OBJECTS = \ driver/cduce_config.cmo misc/stats.cmo misc/custom.cmo misc/encodings.cmo \ misc/upool.cmo misc/pretty.cmo misc/ns.cmo misc/imap.cmo misc/html.cmo misc/utils.cmo \ \ types/compunit.cmo types/sortedList.cmo misc/bool.cmo types/ident.cmo \ types/intervals.cmo types/chars.cmo types/atoms.cmo types/normal.cmo \ types/var.cmo types/boolVar.cmo types/types.cmo compile/auto_pat.cmo \ types/sequence.cmo types/builtin_defs.cmo \ \ runtime/value.cmo \ \ schema/schema_pcre.cmo schema/schema_types.cmo \ schema/schema_xml.cmo schema/schema_common.cmo \ schema/schema_builtin.cmo schema/schema_validator.cmo \ \ types/patterns.cmo \ compile/print_auto.cmo \ \ compile/lambda.cmo \ runtime/run_dispatch.cmo runtime/explain.cmo runtime/eval.cmo \ \ parser/cduce_loc.cmo parser/url.cmo \ parser/ulexer.cmo parser/ast.cmo parser/parser.cmo \ \ typing/typed.cmo typing/typepat.cmo types/externals.cmo typing/typer.cmo \ compile/compile.cmo \ \ schema/schema_parser.cmo schema/schema_converter.cmo \ runtime/load_xml.cmo runtime/print_xml.cmo compile/operators.cmo types/builtin.cmo \ driver/librarian.cmo types/sample.cmo \ driver/cduce.cmo \ \ runtime/system.cmo query/query_aggregates.cmo schema/schema_types.ml: schema/schema_types.mli cp $^ $@ compile/auto_pat.ml: compile/auto_pat.mli cp $^ $@ ifneq ($(CURL), false) OBJECTS += parser/cduce_curl.cmo PACKAGES += curl endif ifneq ($(NETCLIENT), false) OBJECTS += parser/cduce_netclient.cmo PACKAGES += netclient endif PXP_PACK=pxp-engine pxp-lex-iso88591 ifeq ($(PXP_WLEX), true) PXP_PACK += pxp-wlex-utf8 else PXP_PACK += pxp-lex-utf8 endif ifeq ($(PXP),true) OBJECTS += runtime/cduce_pxp.cmo PACKAGES += $(PXP_PACK) ifeq ($(CGI),true) OBJECTS += runtime/cduce_pxp.cmo PACKAGES += netcgi2 ALL_TARGET += dtd2cduce INSTALL_BINARIES += dtd2cduce endif endif ifeq ($(EXPAT), true) OBJECTS += runtime/cduce_expat.cmo PACKAGES += expat endif ifeq ($(ADDICON), true) OBJECTS += cduceres.o endif all: $(ALL_TARGET) OBJECTS += driver/run.cmo ML_INTERFACE_BASE_OBJS = caml_cduce.cmo mltypes.cmo mlstub.cmo ML_INTERFACE_BASE_SRC = $(ML_INTERFACE_BASE_OBJS:.cmo=.ml) $(ML_INTERFACE_BASE_OBJS:.cmo=.mli) ML_INTERFACE_OBJS = \ $(ML_INTERFACE_BASE_OBJS:%=$(OCAMLIFACE)/%) OBJECTS_NO_MLIFACE := $(OBJECTS) ifneq ($(ML_INTERFACE), false) OBJECTS += $(ML_INTERFACE_OBJS) endif CDUCE = $(OBJECTS) driver/start.cmo ALL_OBJECTS = $(OBJECTS_NO_MLIFACE) \ driver/start.cmo driver/examples.cmo \ driver/webiface.cmo driver/evaluator.cmo \ tools/validate.cmo \ parser/cduce_curl.cmo \ parser/cduce_netclient.cmo \ runtime/cduce_expat.cmo runtime/cduce_pxp.cmo ALL_INTERFACES = schema/schema_types.mli DEPEND = $(ALL_OBJECTS:.cmo=.ml) $(ALL_OBJECTS:.cmo=.mli) $(ALL_INTERFACES) INCLUDES = $(DIRS:%=-I %) INCLUDES_DEPEND = $(DIRS_DEPEND:%=-I %) # -I +camlp4 cduce: $(CDUCE:.cmo=.$(EXTENSION)) @echo "Build $@" $(HIDE)$(LINK) $(INCLUDES) -o $@ $^ $(EXTRA_LINK_OPTS) cduce_packed.ml: $(CDUCE:.cmo=.ml) rm -f cduce_packed.ml ocaml tools/pack.ml $^ > cduce_packed.ml cduce_packed: cduce_packed.$(EXTENSION) $(LINK) $(INCLUDES) -o $@ $^ $(EXTRA_LINK_OPTS) cduce_lib.$(EXTENSION_LIB): $(OBJECTS:.cmo=.$(EXTENSION)) @echo "Pack cduce_lib.$(EXTENSION)" @test -e lib || mkdir lib $(HIDE)$(COMPILE) -o lib/cduce_lib.$(EXTENSION) $(INCLUDES) -pack $^ @echo "Build $@" $(HIDE)$(COMPILE) -a -o lib/$@ lib/cduce_lib.$(EXTENSION) dtd2cduce: tools/dtd2cduce.ml @echo "Build $@" $(HIDE)$(OCAMLFIND) $(CAML) -o $@ -package "$(PXP_PACK) netcgi2" -linkpkg $^ .PHONY: compute_depend compute_depend: $(DEPEND_OCAMLDEP) @echo "Computing dependencies ..." ocamlfind ocamldep -package "$(PACKAGES)" \ $(INCLUDES_DEPEND) $(SYNTAX_PARSER) -ppopt pa_extend.cmo -ppopt q_MLast.cmo $(DEPEND) > depend for i in $(ALL_ML_IFACE); do \ touch ocamliface/$$i/caml_cduce.ml; \ ocamlfind ocamldep -package "$(PACKAGES)" \ $(INCLUDES_DEPEND) -I ocamliface/$$i $(SYNTAX_PARSER) -ppopt pa_extend.cmo -ppopt q_MLast.cmo \ $(ML_INTERFACE_BASE_SRC:%=ocamliface/$$i/%) >> depend;\ rm -f ocamliface/$$i/caml_cduce.ml; \ done clean: for i in $(CLEAN_DIRS); do \ (cd $$i; rm -f *.cmi *.cmo *.cma *.cmx *.o *.a *.cmxa *~); \ done rm -f misc/q_symbol.cmo.stamp test -n "$(OCAMLIFACE)" && (cd $(OCAMLIFACE); $(MAKE) clean) || true rm -f `find . -name "*~"` rm -f *.cmi *.cmo *.cma *.cmx *.a *.cmxa *.o *~ META rm -f cduce$(EXE) ocamlprof.dump rm -f dtd2cduce$(EXE) webiface$(EXE) evaluator$(EXE) rm -Rf prepro package rm -f web/www/*.html web/*~ rm -f web/*.cdo rm -f configure.log rm -rf web/doc rm -f META rm -rf lib $(RM) tests/schema/regtest/test.cd tests/schema/regtest/test.log $(RM) tests/schema/test.cd tests/schema/test.log tests/misc/log tests/misc/memento.html tests/xsltmark/log tests/cql/log $(RM) oUnit-* tests/ocaml/misc/consts.ml tests/ocaml/misc/consts.cdo tests/ocaml/misc/consts.cmi tests/ocaml/misc/consts.cmo tests/ocaml/latypes/latypes2* tests/ocaml/latypes/latypes tests/ocaml/latypes/latypes.c[dm][oxi] tests/ocaml/latypes/latypestest.cm[io] for i in $(OUNIT_TESTS); do $(RM) `echo tests/ocaml/$$i/$$i tests/ocaml/$$i/$$i.ml tests/ocaml/$$i/$$i.c[dm][oxi] tests/ocaml/$$i/$${i}test.cm[io]`; done distclean: clean rm -f Makefile.conf .SUFFIXES: .ml .mli .cmo .cmi .cmx $(OCAMLIFACE)/mltypes.$(EXTENSION): $(OCAMLIFACE)/caml_cduce.$(EXTENSION) $(ALL_INTERFACES): misc/q_symbol.cmo.stamp $(ALL_OBJECTS:.cmo=.cmi): misc/q_symbol.cmo.stamp $(ALL_OBJECTS:.cmo=.cmx) caml_cduce.cmx: misc/q_symbol.cmo.stamp $(ALL_OBJECTS) caml_cduce.cmo: misc/q_symbol.cmo.stamp $(OCAMLIFACE)/mlstub.$(EXTENSION): SYNTAX += q_MLast.cmo misc/q_symbol.cmo.stamp: misc/q_symbol.ml @echo "Build $@" $(HIDE) $(CAMLC) -c -pp camlp4orf $< $(HIDE) sync $(HIDE) touch misc/q_symbol.cmo.stamp types/boolVar.cmo: SYNTAX_PARSER= types/boolVar.cmi: SYNTAX_PARSER= types/boolVar.cmx: SYNTAX_PARSER= parser/parser.$(EXTENSION): PACKAGES += camlp4.extend .ml.cmo: @echo "Build $@" $(HIDE)$(CAMLC) -c $(SYNTAX_PARSER) $(INCLUDES) $< .ml.cmx: @echo "Build $@" $(HIDE) $(CAMLOPT) $(FORPACKOPT) -c $(SYNTAX_PARSER) $(INCLUDES) $< .mli.cmi: @echo "Build $@" $(HIDE) $(CAMLC) -c $(SYNTAX_PARSER) $(INCLUDES) $< include depend cduceres.o: win32/cduce.rc win32/cduce_logo-bw.ico (cd win32; windres -i cduce.rc -o cduceres.o; mv cduceres.o ..) # Documentation doc: cduce web/site.cdo mkdir -p web/doc (cd web; ../cduce --run site.cdo --arg doc.xml -o doc) web/site.cdo: cduce web/xhtml.cdo web/site.cd web/siteTypes.cd ./cduce -I web/ --compile web/site.cd web/xhtml.cdo: cduce web/xhtml.cd ./cduce -I web/ --compile web/xhtml.cd install_doc: doc $(HIDE)mkdir -p $(MANDIR)/man1 $(HIDE)(cd doc; $(MAKE) install INSTALL="$(INSTALL)" MANDIR=$(MANDIR) HIDE=$(HIDE)) mkdir -p $(DOCDIR)/img cp web/doc/*.html $(DOCDIR)/ cp CHANGES INSTALL INSTALL.WIN32 README AUTHORS LICENSE $(DOCDIR)/ cp web/img/left.gif web/img/right.gif $(DOCDIR)/img ### Pack OCaml modules for the CDuce/OCaml interface $(OCAMLIFACE)/caml_cduce.cmo: @echo "Build $@" @cd $(OCAMLIFACE); \ $(MAKE) -s MODE=byte CAMLC="$(OCAMLFIND) $(CAMLC_P)" caml_cduce.cmo $(OCAMLIFACE)/caml_cduce.cmx: @echo "Build $@" @cd $(OCAMLIFACE); \ $(MAKE) -s MODE=opt CAMLOPT="$(OCAMLFIND) $(CAMLOPT_P)" caml_cduce.cmx