1 ###########################################################################
3 # Copyright (C) 1999-2007 Markus Mottl
6 # http://www.ocaml.info/home/ocaml_sources.html
8 ###########################################################################
10 # Modified by damien for .glade.ml compilation
12 # Set these variables to the names of the sources to be processed and
13 # the result variable. Order matters during linkage!
21 RES_CLIB_SUF := _stubs
28 export RESULT := $(strip $(RESULT))
33 DOC_FILES := $(filter %.mli, $(SOURCES))
36 FIRST_DOC_FILE := $(firstword $(DOC_FILES))
46 # Eventually set include- and library-paths, libraries to link,
47 # additional compilation-, link- and ocamlyacc-flags
48 # Path- and library information needs not be written with "-I" and such...
49 # Define THREADS if you need it, otherwise leave it unset (same for
61 export OCAML_DEFAULT_DIRS
75 export OCAMLMKLIB_FLAGS
95 export OCAMLFIND_INSTFLAGS
101 # Add a list of optional trash files that should be deleted by "make clean"
109 LFLAGS := $(LFLAGS) -q
110 YFLAGS := $(YFLAGS) -q
113 #################### variables depending on your OCaml-installation
118 CFLAGS_WIN32 := -mno-cygwin
124 CPPFLAGS_WIN32 := -DCAML_DLL
126 CFLAGS_WIN32 += -nologo
130 # work around GNU Make default value
138 # work around GNU Make default value
161 CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
173 RPATH_FLAG := $(ELF_RPATH_FLAG)
185 PIC_CPPFLAGS := -DPIC
192 BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
193 NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
194 TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
197 OCAMLFIND := ocamlfind
212 OCAMLMKTOP := ocamlmktop
232 OCAMLYACC := ocamlyacc
237 OCAMLMKLIB := ocamlmklib
242 OCAML_GLADECC := lablgladecc2
246 ifndef OCAML_GLADECC_FLAGS
247 OCAML_GLADECC_FLAGS :=
249 export OCAML_GLADECC_FLAGS
251 ifndef CAMELEON_REPORT
252 CAMELEON_REPORT := report
254 export CAMELEON_REPORT
256 ifndef CAMELEON_REPORT_FLAGS
257 CAMELEON_REPORT_FLAGS :=
259 export CAMELEON_REPORT_FLAGS
261 ifndef CAMELEON_ZOGGY
262 CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
264 export CAMELEON_ZOGGY
266 ifndef CAMELEON_ZOGGY_FLAGS
267 CAMELEON_ZOGGY_FLAGS :=
269 export CAMELEON_ZOGGY_FLAGS
282 CAMLIDLDLL := camlidldll
287 MAYBE_IDL_HEADER := -header
298 ifndef REAL_OCAMLFIND
306 space := $(empty) $(empty)
309 PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
310 PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
311 OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
312 # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
313 OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
314 OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
316 OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
317 OCAML_DEP_PACKAGES :=
319 OCAML_FIND_LINKPKG := -linkpkg
320 REAL_OCAMLFIND := $(OCAMLFIND)
324 export OCAML_FIND_PACKAGES
325 export OCAML_DEP_PACKAGES
326 export OCAML_FIND_LINKPKG
327 export REAL_OCAMLFIND
350 OCAMLMAKEFILE := OCamlMakefile
356 $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/local/lib/ocaml)
360 ifndef OCAML_LIB_INSTALL
361 OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
363 export OCAML_LIB_INSTALL
365 ###########################################################################
367 #################### change following sections only if
368 #################### you know what you are doing!
370 # delete target files when a build command fails
371 .PHONY: .DELETE_ON_ERROR
374 # for pedants using "--warn-undefined-variables"
385 export CPPFLAGS_WIN32
395 FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.m %.$(EXT_CXX) %.rep %.zog %.glade
397 FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
398 SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
400 FILTERED_REP := $(filter %.rep, $(FILTERED))
401 DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
402 AUTO_REP := $(FILTERED_REP:.rep=.ml)
404 FILTERED_ZOG := $(filter %.zog, $(FILTERED))
405 DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
406 AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
408 FILTERED_GLADE := $(filter %.glade, $(FILTERED))
409 DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
410 AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
412 FILTERED_ML := $(filter %.ml, $(FILTERED))
413 DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
415 FILTERED_MLI := $(filter %.mli, $(FILTERED))
416 DEP_MLI := $(FILTERED_MLI:.mli=.di)
418 FILTERED_MLL := $(filter %.mll, $(FILTERED))
419 DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
420 AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
422 FILTERED_MLY := $(filter %.mly, $(FILTERED))
423 DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
424 AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
426 FILTERED_IDL := $(filter %.idl, $(FILTERED))
427 DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
428 C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
430 C_IDL += $(FILTERED_IDL:.idl=.h)
432 OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
433 AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
435 FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
436 DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
437 AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
439 FILTERED_C_CXX := $(filter %.c %.m %.$(EXT_CXX), $(FILTERED))
440 OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
441 OBJ_C_CXX := $(OBJ_C_CXX:.m=.$(EXT_OBJ))
442 OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
444 PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
446 ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
448 MLDEPS := $(filter %.d, $(ALL_DEPS))
449 MLIDEPS := $(filter %.di, $(ALL_DEPS))
450 BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
451 NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
453 ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
455 IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
456 IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
457 $(basename $(file)).cmi $(basename $(file)).cmo)
458 IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
459 IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
461 IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
463 INTF := $(filter %.cmi, $(IMPLO_INTF))
464 IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
465 IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
466 IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
467 IMPL_S := $(IMPL_CMO:.cmo=.s)
469 OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
470 OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
472 EXECS := $(addsuffix $(EXE), \
473 $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
475 EXECS += $(BCRESULT).dll $(NCRESULT).dll
478 CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
479 ifneq ($(strip $(OBJ_LINK)),)
480 RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
484 DLLSONAME := $(CLIB_BASE).dll
486 DLLSONAME := dll$(CLIB_BASE).so
489 NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
490 $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
491 $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
492 $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
493 $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
494 $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
497 NONEXECS += $(DLLSONAME)
500 ifndef LIBINSTALL_FILES
501 LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
502 $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
504 ifneq ($(strip $(OBJ_LINK)),)
505 LIBINSTALL_FILES += $(DLLSONAME)
510 export LIBINSTALL_FILES
513 # some extra stuff is created while linking DLLs
514 NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
517 TARGETS := $(EXECS) $(NONEXECS)
519 # If there are IDL-files
520 ifneq ($(strip $(FILTERED_IDL)),)
521 MAYBE_IDL := -cclib -lcamlidl
526 $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/local/lib/camlp4)
527 INCFLAGS := -I $(CAMLP4PATH)
528 CINCFLAGS := -I$(CAMLP4PATH)
531 DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
532 INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
533 CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
536 CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
537 $(EXTLIBDIRS:%=-L%) $(OCAML_DEFAULT_DIRS:%=-L%)
539 ifeq ($(ELF_RPATH), yes)
540 CLIBFLAGS += $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%)
545 INTF_OCAMLC := $(OCAMLC)
548 INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
550 # OCaml does not support profiling byte code
551 # with threads (yet), therefore we force an error.
553 $(error Profiling of multithreaded byte code not yet supported by OCaml)
555 INTF_OCAMLC := $(OCAMLC)
560 COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
561 $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
562 $(EXTLIBDIRS:%=-ccopt -Wl $(OCAML_DEFAULT_DIRS:%=-ccopt -L%))
564 ifeq ($(ELF_RPATH),yes)
565 COMMON_LDFLAGS += $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%)
568 COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
569 $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
570 $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
573 CLIBS_OPTS := $(CLIBS:%=-cclib -l%) $(CFRAMEWORKS:%=-cclib '-framework %')
576 # MSVC libraries do not have 'lib' prefix
577 CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
581 ifneq ($(strip $(OBJ_LINK)),)
583 OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
585 OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
588 OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
591 # If we have to make byte-code
595 # EXTRADEPS is added dependencies we have to insert for all
596 # executable files we generate. Ideally it should be all of the
597 # libraries we use, but it's hard to find the ones that get searched on
598 # the path since I don't know the paths built into the compiler, so
599 # just include the ones with slashes in their names.
600 EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
601 SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
603 REAL_OCAMLC := $(INTF_OCAMLC)
605 REAL_IMPL := $(IMPL_CMO)
606 REAL_IMPL_INTF := $(IMPLO_INTF)
610 MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
613 override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
614 override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
616 ifneq ($(strip $(OBJ_LINK)),)
617 MAKEDLL := $(DLLSONAME)
618 ALL_LDFLAGS := -dllib $(DLLSONAME)
624 ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS) $(CFRAMEWORKS))" ""
625 ALL_LDFLAGS += -custom
629 ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
630 $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
635 THREAD_FLAG := -vmthread
637 THREAD_FLAG := -thread
639 ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
641 ifndef REAL_OCAMLFIND
642 ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
647 # we have to make native-code
649 EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
651 SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
654 SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
658 REAL_IMPL := $(IMPL_CMX)
659 REAL_IMPL_INTF := $(IMPLX_INTF)
662 override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
665 MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
667 ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
668 $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
669 CAMLIDLDLLFLAGS := -opt
672 ALL_LDFLAGS += $(LIBS:%=%.cmxa)
674 override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
675 override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
679 THREAD_FLAG := -thread
680 ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
682 ifndef REAL_OCAMLFIND
683 ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
692 ANNOT_FLAG := -dtypes
696 ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
697 $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
700 -include $(MAKE_DEPS)
704 ###########################################################################
707 # Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
710 # generates byte-code (default)
711 byte-code: $(PRE_TARGETS)
712 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
713 REAL_RESULT="$(BCRESULT)" make_deps=yes
716 byte-code-nolink: $(PRE_TARGETS)
717 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
718 REAL_RESULT="$(BCRESULT)" make_deps=yes
719 bcnl: byte-code-nolink
722 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
723 REAL_RESULT="$(BCRESULT)" make_deps=yes
725 # generates native-code
727 native-code: $(PRE_TARGETS)
728 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
729 REAL_RESULT="$(NCRESULT)" \
730 REAL_OCAMLC="$(OCAMLOPT)" \
734 native-code-nolink: $(PRE_TARGETS)
735 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
736 REAL_RESULT="$(NCRESULT)" \
737 REAL_OCAMLC="$(OCAMLOPT)" \
739 ncnl: native-code-nolink
741 # generates byte-code libraries
742 byte-code-library: $(PRE_TARGETS)
743 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
744 $(RES_CLIB) $(BCRESULT).cma \
745 REAL_RESULT="$(BCRESULT)" \
748 bcl: byte-code-library
750 # generates native-code libraries
751 native-code-library: $(PRE_TARGETS)
752 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
753 $(RES_CLIB) $(NCRESULT).cmxa \
754 REAL_RESULT="$(NCRESULT)" \
755 REAL_OCAMLC="$(OCAMLOPT)" \
758 ncl: native-code-library
761 # generates byte-code dll
762 byte-code-dll: $(PRE_TARGETS)
763 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
764 $(RES_CLIB) $(BCRESULT).dll \
765 REAL_RESULT="$(BCRESULT)" \
769 # generates native-code dll
770 native-code-dll: $(PRE_TARGETS)
771 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
772 $(RES_CLIB) $(NCRESULT).dll \
773 REAL_RESULT="$(NCRESULT)" \
774 REAL_OCAMLC="$(OCAMLOPT)" \
779 # generates byte-code with debugging information
780 debug-code: $(PRE_TARGETS)
781 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
782 REAL_RESULT="$(BCRESULT)" make_deps=yes \
783 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
784 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
787 debug-code-nolink: $(PRE_TARGETS)
788 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
789 REAL_RESULT="$(BCRESULT)" make_deps=yes \
790 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
791 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
792 dcnl: debug-code-nolink
794 # generates byte-code with debugging information (native code)
795 debug-native-code: $(PRE_TARGETS)
796 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
797 REAL_RESULT="$(NCRESULT)" make_deps=yes \
798 REAL_OCAMLC="$(OCAMLOPT)" \
799 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
800 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
801 dnc: debug-native-code
803 debug-native-code-nolink: $(PRE_TARGETS)
804 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
805 REAL_RESULT="$(NCRESULT)" make_deps=yes \
806 REAL_OCAMLC="$(OCAMLOPT)" \
807 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
808 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
809 dncnl: debug-native-code-nolink
811 # generates byte-code libraries with debugging information
812 debug-code-library: $(PRE_TARGETS)
813 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
814 $(RES_CLIB) $(BCRESULT).cma \
815 REAL_RESULT="$(BCRESULT)" make_deps=yes \
817 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
818 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
819 dcl: debug-code-library
821 # generates byte-code libraries with debugging information (native code)
822 debug-native-code-library: $(PRE_TARGETS)
823 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
824 $(RES_CLIB) $(NCRESULT).cma \
825 REAL_RESULT="$(NCRESULT)" make_deps=yes \
826 REAL_OCAMLC="$(OCAMLOPT)" \
828 OCAMLFLAGS="-g $(OCAMLFLAGS)" \
829 OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
830 dncl: debug-native-code-library
832 # generates byte-code for profiling
833 profiling-byte-code: $(PRE_TARGETS)
834 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
835 REAL_RESULT="$(BCRESULT)" PROFILING="y" \
837 pbc: profiling-byte-code
839 # generates native-code
841 profiling-native-code: $(PRE_TARGETS)
842 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
843 REAL_RESULT="$(NCRESULT)" \
844 REAL_OCAMLC="$(OCAMLOPT)" \
847 pnc: profiling-native-code
849 # generates byte-code libraries
850 profiling-byte-code-library: $(PRE_TARGETS)
851 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
852 $(RES_CLIB) $(BCRESULT).cma \
853 REAL_RESULT="$(BCRESULT)" PROFILING="y" \
856 pbcl: profiling-byte-code-library
858 # generates native-code libraries
859 profiling-native-code-library: $(PRE_TARGETS)
860 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
861 $(RES_CLIB) $(NCRESULT).cmxa \
862 REAL_RESULT="$(NCRESULT)" PROFILING="y" \
863 REAL_OCAMLC="$(OCAMLOPT)" \
866 pncl: profiling-native-code-library
868 # packs byte-code objects
869 pack-byte-code: $(PRE_TARGETS)
870 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
871 REAL_RESULT="$(BCRESULT)" \
872 PACK_LIB=yes make_deps=yes
875 # packs native-code objects
876 pack-native-code: $(PRE_TARGETS)
877 $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
878 $(NCRESULT).cmx $(NCRESULT).o \
879 REAL_RESULT="$(NCRESULT)" \
880 REAL_OCAMLC="$(OCAMLOPT)" \
881 PACK_LIB=yes make_deps=yes
882 panc: pack-native-code
884 # generates HTML-documentation
885 htdoc: $(DOC_DIR)/$(RESULT)/html/index.html
887 # generates Latex-documentation
888 ladoc: $(DOC_DIR)/$(RESULT)/latex/doc.tex
890 # generates PostScript-documentation
891 psdoc: $(DOC_DIR)/$(RESULT)/latex/doc.ps
893 # generates PDF-documentation
894 pdfdoc: $(DOC_DIR)/$(RESULT)/latex/doc.pdf
896 # generates all supported forms of documentation
897 doc: htdoc ladoc psdoc pdfdoc
899 ###########################################################################
902 $(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
903 $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
904 $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
905 $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
908 nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
911 $(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
912 $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
916 %$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
917 $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
918 $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
919 $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
922 .SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
923 .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .m .$(EXT_CXX) .h .so \
928 $(DLLSONAME): $(OBJ_LINK)
929 $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
930 -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
931 $(OCAMLLIBPATH)/ocamlrun.a \
932 -Wl,--export-all-symbols \
933 -Wl,--no-whole-archive
936 $(DLLSONAME): $(OBJ_LINK)
937 link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
938 $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
939 $(OCAMLLIBPATH)/ocamlrun.lib
942 $(DLLSONAME): $(OBJ_LINK)
943 $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
944 -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) $(CFRAMEWORKS:%=-framework %) \
951 $(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
952 $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL)
954 $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
955 $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL)
958 $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
959 $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(OCAMLLDFLAGS) $(REAL_IMPL)
961 $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
962 $(REAL_OCAMLFIND) $(OCAMLOPT) -pack -o $(LIB_PACK_NAME).cmx $(OCAMLLDFLAGS) $(REAL_IMPL)
965 $(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
966 $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmo
968 $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
969 $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(filter-out -custom, $(ALL_LDFLAGS)) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmx
972 $(RES_CLIB): $(OBJ_LINK)
974 ifneq ($(strip $(OBJ_LINK)),)
975 $(AR) rcs $@ $(OBJ_LINK)
978 ifneq ($(strip $(OBJ_LINK)),)
979 lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
983 .mli.cmi: $(EXTRADEPS)
984 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
985 if [ -z "$$pp" ]; then \
986 $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
987 -c $(THREAD_FLAG) $(ANNOT_FLAG) \
988 $(OCAMLFLAGS) $(INCFLAGS) $<; \
989 $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
990 -c $(THREAD_FLAG) $(ANNOT_FLAG) \
991 $(OCAMLFLAGS) $(INCFLAGS) $<; \
993 $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
994 -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
995 $(OCAMLFLAGS) $(INCFLAGS) $<; \
996 $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
997 -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
998 $(OCAMLFLAGS) $(INCFLAGS) $<; \
1001 .ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
1002 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
1003 if [ -z "$$pp" ]; then \
1004 $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
1005 -c $(ALL_OCAMLCFLAGS) $<; \
1006 $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
1007 -c $(ALL_OCAMLCFLAGS) $<; \
1009 $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
1010 -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
1011 $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
1012 -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
1016 $(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
1017 $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
1018 $(OBJS_LIBS) -o $@ $(REAL_IMPL)
1023 $(OCAMLLEX) $(LFLAGS) $<
1025 .PRECIOUS: %.ml %.mli
1027 $(OCAMLYACC) $(YFLAGS) $<
1028 $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
1029 if [ ! -z "$$pp" ]; then \
1030 mv $*.ml $*.ml.temporary; \
1031 echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
1032 cat $*.ml.temporary >> $*.ml; \
1033 rm $*.ml.temporary; \
1034 mv $*.mli $*.mli.temporary; \
1035 echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
1036 cat $*.mli.temporary >> $*.mli; \
1037 rm $*.mli.temporary; \
1043 $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
1047 $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
1051 $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
1053 .PRECIOUS: %.ml %.mli
1054 %.ml %.mli: %.oxridl
1057 .PRECIOUS: %.ml %.mli %_stubs.c %.h
1058 %.ml %.mli %_stubs.c %.h: %.idl
1059 $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
1061 $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
1064 $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
1065 $(CPPFLAGS) $(CPPFLAGS_WIN32) \
1066 $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
1069 $(CC) -c $(CFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
1070 -I'$(OCAMLLIBPATH)' \
1073 .$(EXT_CXX).$(EXT_OBJ):
1074 $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
1075 -I'$(OCAMLLIBPATH)' \
1078 $(MLDEPDIR)/%.d: %.ml
1079 $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
1080 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
1081 if [ -z "$$pp" ]; then \
1082 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
1083 $(DINCFLAGS) $< \> $@; \
1084 $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
1085 $(DINCFLAGS) $< > $@; \
1087 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
1088 -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
1089 $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
1090 -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
1093 $(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
1094 $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
1095 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
1096 if [ -z "$$pp" ]; then \
1097 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
1098 $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
1100 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
1101 -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
1102 $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
1103 -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
1106 $(DOC_DIR)/$(RESULT)/html:
1109 $(DOC_DIR)/$(RESULT)/html/index.html: $(DOC_DIR)/$(RESULT)/html $(DOC_FILES)
1111 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
1112 if [ -z "$$pp" ]; then \
1113 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
1114 $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
1116 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -html -d $< $(OCAMLDOCFLAGS) \
1117 $(INCFLAGS) $(DOC_FILES); \
1118 $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -html -d $< $(OCAMLDOCFLAGS) \
1119 $(INCFLAGS) $(DOC_FILES); \
1122 $(DOC_DIR)/$(RESULT)/latex:
1125 $(DOC_DIR)/$(RESULT)/latex/doc.tex: $(DOC_DIR)/$(RESULT)/latex $(DOC_FILES)
1127 $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
1128 if [ -z "$$pp" ]; then \
1129 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
1130 $(DOC_FILES) -o $@; \
1131 $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
1134 $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
1135 $(INCFLAGS) $(DOC_FILES) -o $@; \
1136 $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
1137 $(INCFLAGS) $(DOC_FILES) -o $@; \
1140 $(DOC_DIR)/$(RESULT)/latex/doc.ps: $(DOC_DIR)/$(RESULT)/latex/doc.tex
1141 cd $(DOC_DIR)/$(RESULT)/latex && \
1142 $(LATEX) doc.tex && \
1143 $(LATEX) doc.tex && \
1144 $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
1146 $(DOC_DIR)/$(RESULT)/latex/doc.pdf: $(DOC_DIR)/$(RESULT)/latex/doc.ps
1147 cd $(DOC_DIR)/$(RESULT)/latex && $(PS2PDF) $(<F)
1152 $$(eval $$(call PROJ_$(1)))
1153 $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
1154 $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
1158 $(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
1161 subprojs: $(SUBPROJS:%=subproj_%)
1163 ###########################################################################
1164 # (UN)INSTALL RULES FOR LIBRARIES
1168 $(QUIET)printf "\nInstalling library with ocamlfind\n"
1169 $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
1170 $(QUIET)printf "\nInstallation successful.\n"
1172 .PHONY: libinstall-byte-code
1173 libinstall-byte-code: all
1174 $(QUIET)printf "\nInstalling byte-code library with ocamlfind\n"
1175 $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
1176 $(filter-out $(RESULT).$(EXT_LIB) $(RESULT).cmxa, $(LIBINSTALL_FILES))
1177 $(QUIET)printf "\nInstallation successful.\n"
1179 .PHONY: libinstall-native-code
1180 libinstall-native-code: all
1181 $(QUIET)printf "\nInstalling native-code library with ocamlfind\n"
1182 $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
1183 $(filter-out $(DLLSONAME) $(RESULT).cma, $(LIBINSTALL_FILES))
1184 $(QUIET)printf "\nInstallation successful.\n"
1186 .PHONY: libuninstall
1188 $(QUIET)printf "\nUninstalling library with ocamlfind\n"
1189 $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
1190 $(QUIET)printf "\nUninstallation successful.\n"
1194 $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
1195 -install -d $(OCAML_LIB_INSTALL)
1196 for i in $(LIBINSTALL_FILES); do \
1197 if [ -f $$i ]; then \
1198 install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
1201 $(QUIET)printf "\nInstallation successful.\n"
1203 .PHONY: rawuninstall
1205 $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
1206 cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
1207 $(QUIET)printf "\nUninstallation successful.\n"
1209 ###########################################################################
1214 rm -f $(TARGETS) $(TRASH)
1215 rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
1219 rm -f $(NONEXECS) $(TRASH)
1220 rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
1224 rm -rf $(DOC_DIR)/$(RESULT)
1227 clean-all:: clean clean-doc
1231 rm -f *.bak *~ *.dup