######################################################################### # # # OCaml # # # # Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # # # # Copyright 2007 Institut National de Recherche en Informatique et # # en Automatique. All rights reserved. This file is distributed # # under the terms of the GNU Library General Public License, with # # the special exception on linking described in file ../LICENSE. # # # ######################################################################### # see 'check-if-preinstalled' target CHECK_IF_PREINSTALLED ?= true # this configuration file is generated from configure.make include Makefile.config ifeq ($(OCAML_NATIVE_TOOLS), true) OCAMLC ?= ocamlc.opt OCAMLOPT ?= ocamlopt.opt OCAMLDEP ?= ocamldep.opt OCAMLLEX ?= ocamllex.opt else OCAMLC ?= ocamlc OCAMLOPT ?= ocamlopt OCAMLDEP ?= ocamldep OCAMLLEX ?= ocamllex endif CP ?= cp COMPFLAGS ?= -w L -w R -w Z -I src -I +unix -safe-string -bin-annot LINKFLAGS ?= -I +unix -I src PACK_CMO= $(addprefix src/,\ const.cmo \ loc.cmo \ discard_printf.cmo \ signatures.cmi \ my_std.cmo \ my_unix.cmo \ tags.cmo \ display.cmo \ log.cmo \ shell.cmo \ bool.cmo \ glob_ast.cmo \ glob_lexer.cmo \ glob.cmo \ lexers.cmo \ param_tags.cmo \ command.cmo \ ocamlbuild_config.cmo \ ocamlbuild_where.cmo \ slurp.cmo \ options.cmo \ pathname.cmo \ configuration.cmo \ flags.cmo \ hygiene.cmo \ digest_cache.cmo \ resource.cmo \ rule.cmo \ solver.cmo \ report.cmo \ tools.cmo \ fda.cmo \ findlib.cmo \ ocaml_arch.cmo \ ocaml_utils.cmo \ ocaml_dependencies.cmo \ ocaml_compiler.cmo \ ocaml_tools.cmo \ ocaml_specific.cmo \ exit_codes.cmo \ plugin.cmo \ hooks.cmo \ main.cmo \ ) EXTRA_CMO=$(addprefix src/,\ ocamlbuild_plugin.cmo \ ocamlbuild_executor.cmo \ ocamlbuild_unix_plugin.cmo \ ) PACK_CMX=$(PACK_CMO:.cmo=.cmx) EXTRA_CMX=$(EXTRA_CMO:.cmo=.cmx) EXTRA_CMI=$(EXTRA_CMO:.cmo=.cmi) INSTALL_LIB=\ src/ocamlbuildlib.cma \ src/ocamlbuild.cmo \ src/ocamlbuild_pack.cmi \ $(EXTRA_CMO:.cmo=.cmi) INSTALL_LIB_OPT=\ src/ocamlbuildlib.cmxa src/ocamlbuildlib$(EXT_LIB) \ src/ocamlbuild.cmx src/ocamlbuild$(EXT_OBJ) \ src/ocamlbuild_pack.cmx \ $(EXTRA_CMO:.cmo=.cmx) $(EXTRA_CMO:.cmo=$(EXT_OBJ)) INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) INSTALL_BINDIR=$(DESTDIR)$(BINDIR) INSTALL_MANDIR=$(DESTDIR)$(MANDIR) INSTALL_SIGNATURES=\ src/signatures.mli \ src/signatures.cmi \ src/signatures.cmti ifeq ($(OCAML_NATIVE), true) all: byte native man else all: byte man endif byte: ocamlbuild.byte src/ocamlbuildlib.cma # ocamlbuildlight.byte ocamlbuildlightlib.cma native: ocamlbuild.native src/ocamlbuildlib.cmxa allopt: all # compatibility alias distclean:: clean # The executables ocamlbuild.byte: src/ocamlbuild_pack.cmo $(EXTRA_CMO) src/ocamlbuild.cmo $(OCAMLC) $(LINKFLAGS) -o $@ unix.cma $^ ocamlbuildlight.byte: src/ocamlbuild_pack.cmo src/ocamlbuildlight.cmo $(OCAMLC) $(LINKFLAGS) -o $@ $^ ocamlbuild.native: src/ocamlbuild_pack.cmx $(EXTRA_CMX) src/ocamlbuild.cmx $(OCAMLOPT) $(LINKFLAGS) -o $@ unix.cmxa $^ # The libraries src/ocamlbuildlib.cma: src/ocamlbuild_pack.cmo $(EXTRA_CMO) $(OCAMLC) -a -o $@ $^ src/ocamlbuildlightlib.cma: src/ocamlbuild_pack.cmo src/ocamlbuildlight.cmo $(OCAMLC) -a -o $@ $^ src/ocamlbuildlib.cmxa: src/ocamlbuild_pack.cmx $(EXTRA_CMX) $(OCAMLOPT) -a -o $@ $^ # The packs # Build artifacts are first placed into tmp/ to avoid a race condition # described in https://caml.inria.fr/mantis/view.php?id=4991. src/ocamlbuild_pack.cmo: $(PACK_CMO) mkdir -p tmp $(OCAMLC) -pack $^ -o tmp/ocamlbuild_pack.cmo mv tmp/ocamlbuild_pack.cmi src/ocamlbuild_pack.cmi mv tmp/ocamlbuild_pack.cmo src/ocamlbuild_pack.cmo src/ocamlbuild_pack.cmi: src/ocamlbuild_pack.cmo src/ocamlbuild_pack.cmx: $(PACK_CMX) mkdir -p tmp $(OCAMLOPT) -pack $^ -o tmp/ocamlbuild_pack.cmx mv tmp/ocamlbuild_pack.cmx src/ocamlbuild_pack.cmx mv tmp/ocamlbuild_pack$(EXT_OBJ) src/ocamlbuild_pack$(EXT_OBJ) # The lexers src/lexers.ml: src/lexers.mll $(OCAMLLEX) src/lexers.mll clean:: rm -f src/lexers.ml beforedepend:: src/lexers.ml src/glob_lexer.ml: src/glob_lexer.mll $(OCAMLLEX) src/glob_lexer.mll clean:: rm -f src/glob_lexer.ml beforedepend:: src/glob_lexer.ml # The config file configure: $(MAKE) -f configure.make all # proxy rule for rebuilding configuration files directly from the main Makefile Makefile.config src/ocamlbuild_config.ml: $(MAKE) -f configure.make $@ clean:: $(MAKE) -f configure.make clean distclean:: $(MAKE) -f configure.make distclean beforedepend:: src/ocamlbuild_config.ml # man page man: man/ocamlbuild.1 man/ocamlbuild.1: man/ocamlbuild.header.1 man/ocamlbuild.options.1 man/ocamlbuild.footer.1 cat $^ > man/ocamlbuild.1 man/ocamlbuild.options.1: man/options_man.byte ./man/options_man.byte > man/ocamlbuild.options.1 clean:: rm -f man/ocamlbuild.options.1 distclean:: rm -f man/ocamlbuild.1 man/options_man.byte: src/ocamlbuild_pack.cmo $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte clean:: rm -f man/options_man.cm* rm -f man/options_man.byte ifdef EXT_OBJ rm -f man/options_man$(EXT_OBJ) endif # Testing test-%: testsuite/%.ml all cd testsuite && ocaml $(CURDIR)/$< test: test-internal test-findlibonly test-external clean:: rm -rf testsuite/_test_* # Installation # The binaries go in BINDIR. We copy ocamlbuild.byte and # ocamlbuild.native (if available), and also copy the best available # binary as BINDIR/ocamlbuild. # The library is put in LIBDIR/ocamlbuild. We copy # - the META file (for ocamlfind) # - src/signatures.{mli,cmi,cmti} (user documentation) # - the files in INSTALL_LIB and INSTALL_LIB_OPT (if available) # We support three installation methods: # - standard {install,uninstall} targets # - findlib-{install,uninstall} that uses findlib for the library install # - producing an OPAM .install file and not actually installing anything install-bin-byte: mkdir -p $(INSTALL_BINDIR) $(CP) ocamlbuild.byte $(INSTALL_BINDIR)/ocamlbuild.byte$(EXE) ifneq ($(OCAML_NATIVE), true) $(CP) ocamlbuild.byte $(INSTALL_BINDIR)/ocamlbuild$(EXE) endif install-bin-native: mkdir -p $(INSTALL_BINDIR) $(CP) ocamlbuild.native $(INSTALL_BINDIR)/ocamlbuild$(EXE) $(CP) ocamlbuild.native $(INSTALL_BINDIR)/ocamlbuild.native$(EXE) ifeq ($(OCAML_NATIVE), true) install-bin: install-bin-byte install-bin-native else install-bin: install-bin-byte endif install-bin-opam: echo 'bin: [' >> ocamlbuild.install echo ' "ocamlbuild.byte" {"ocamlbuild.byte"}' >> ocamlbuild.install ifeq ($(OCAML_NATIVE), true) echo ' "ocamlbuild.native" {"ocamlbuild.native"}' >> ocamlbuild.install echo ' "ocamlbuild.native" {"ocamlbuild"}' >> ocamlbuild.install else echo ' "ocamlbuild.byte" {"ocamlbuild"}' >> ocamlbuild.install endif echo ']' >> ocamlbuild.install echo >> ocamlbuild.install install-lib-basics: mkdir -p $(INSTALL_LIBDIR)/ocamlbuild $(CP) META $(INSTALL_SIGNATURES) $(INSTALL_LIBDIR)/ocamlbuild install-lib-basics-opam: echo ' "opam"' >> ocamlbuild.install echo ' "META"' >> ocamlbuild.install for lib in $(INSTALL_SIGNATURES); do \ echo " \"$$lib\" {\"$$(basename $$lib)\"}" >> ocamlbuild.install; \ done install-lib-byte: mkdir -p $(INSTALL_LIBDIR)/ocamlbuild $(CP) $(INSTALL_LIB) $(INSTALL_LIBDIR)/ocamlbuild install-lib-byte-opam: for lib in $(INSTALL_LIB); do \ echo " \"$$lib\" {\"$$(basename $$lib)\"}" >> ocamlbuild.install; \ done install-lib-native: mkdir -p $(INSTALL_LIBDIR)/ocamlbuild $(CP) $(INSTALL_LIB_OPT) $(INSTALL_LIBDIR)/ocamlbuild install-lib-native-opam: for lib in $(INSTALL_LIB_OPT); do \ echo " \"$$lib\" {\"$$(basename $$lib)\"}" >> ocamlbuild.install; \ done ifeq ($(OCAML_NATIVE), true) install-lib: install-lib-basics install-lib-byte install-lib-native else install-lib: install-lib-basics install-lib-byte endif install-lib-findlib: ifeq ($(OCAML_NATIVE), true) ocamlfind install ocamlbuild \ META $(INSTALL_SIGNATURES) $(INSTALL_LIB) $(INSTALL_LIB_OPT) else ocamlfind install ocamlbuild \ META $(INSTALL_SIGNATURES) $(INSTALL_LIB) endif install-lib-opam: echo 'lib: [' >> ocamlbuild.install $(MAKE) install-lib-basics-opam $(MAKE) install-lib-byte-opam ifeq ($(OCAML_NATIVE), true) $(MAKE) install-lib-native-opam endif echo ']' >> ocamlbuild.install echo >> ocamlbuild.install install-man: mkdir -p $(INSTALL_MANDIR)/man1 cp man/ocamlbuild.1 $(INSTALL_MANDIR)/man1/ocamlbuild.1 install-man-opam: echo 'man: [' >> ocamlbuild.install echo ' "man/ocamlbuild.1" {"man1/ocamlbuild.1"}' >> ocamlbuild.install echo ']' >> ocamlbuild.install echo >> ocamlbuild.install install-doc-opam: echo 'doc: [' >> ocamlbuild.install echo ' "LICENSE"' >> ocamlbuild.install echo ' "Changes"' >> ocamlbuild.install echo ' "Readme.md"' >> ocamlbuild.install echo ']' >> ocamlbuild.install uninstall-bin: rm $(BINDIR)/ocamlbuild rm $(BINDIR)/ocamlbuild.byte ifeq ($(OCAML_NATIVE), true) rm $(BINDIR)/ocamlbuild.native endif uninstall-lib-basics: rm $(LIBDIR)/ocamlbuild/META for lib in $(INSTALL_SIGNATURES); do \ rm $(LIBDIR)/ocamlbuild/`basename $$lib`;\ done uninstall-lib-byte: for lib in $(INSTALL_LIB); do\ rm $(LIBDIR)/ocamlbuild/`basename $$lib`;\ done uninstall-lib-native: for lib in $(INSTALL_LIB_OPT); do\ rm $(LIBDIR)/ocamlbuild/`basename $$lib`;\ done uninstall-lib: $(MAKE) uninstall-lib-basics uninstall-lib-byte ifeq ($(OCAML_NATIVE), true) $(MAKE) uninstall-lib-native endif ls $(LIBDIR)/ocamlbuild # for easier debugging if rmdir fails rmdir $(LIBDIR)/ocamlbuild uninstall-lib-findlib: ocamlfind remove ocamlbuild uninstall-man: rm $(INSTALL_MANDIR)/man1/ocamlbuild.1 install: check-if-preinstalled $(MAKE) install-bin install-lib install-man uninstall: uninstall-bin uninstall-lib uninstall-man findlib-install: check-if-preinstalled $(MAKE) install-bin install-lib-findlib findlib-uninstall: uninstall-bin uninstall-lib-findlib opam-install: check-if-preinstalled $(MAKE) ocamlbuild.install ocamlbuild.install: rm -f ocamlbuild.install touch ocamlbuild.install $(MAKE) install-bin-opam $(MAKE) install-lib-opam $(MAKE) install-man-opam $(MAKE) install-doc-opam check-if-preinstalled: ifeq ($(CHECK_IF_PREINSTALLED), true) if test -d $(shell ocamlc -where)/ocamlbuild; then\ >&2 echo "ERROR: Preinstalled ocamlbuild detected at"\ "$(shell ocamlc -where)/ocamlbuild";\ >&2 echo "Installation aborted; if you want to bypass this"\ "safety check, pass CHECK_IF_PREINSTALLED=false to make";\ exit 2;\ fi endif # The generic rules %.cmo: %.ml $(OCAMLC) $(COMPFLAGS) -c $< %.cmi: %.mli $(OCAMLC) $(COMPFLAGS) -c $< %.cmx: %.ml $(OCAMLOPT) -for-pack Ocamlbuild_pack $(COMPFLAGS) -c $< clean:: rm -rf tmp/ rm -f src/*.cm* *.cm* ifdef EXT_OBJ rm -f src/*$(EXT_OBJ) *$(EXT_OBJ) endif ifdef EXT_LIB rm -f src/*$(EXT_LIB) *$(EXT_LIB) endif rm -f test/test2/vivi.ml distclean:: rm -f ocamlbuild.byte ocamlbuild.native rm -f ocamlbuild.install # The dependencies depend: beforedepend $(OCAMLDEP) -I src src/*.mli src/*.ml > .depend $(EXTRA_CMI): src/ocamlbuild_pack.cmi $(EXTRA_CMO): src/ocamlbuild_pack.cmo src/ocamlbuild_pack.cmi $(EXTRA_CMX): src/ocamlbuild_pack.cmx src/ocamlbuild_pack.cmi include .depend .PHONY: all allopt beforedepend clean configure .PHONY: install installopt installopt_really depend