mirror of
https://github.com/johnwhitington/cpdf-source.git
synced 2024-12-17 19:31:32 +01:00
1300 lines
34 KiB
Plaintext
1300 lines
34 KiB
Plaintext
###########################################################################
|
|
# OCamlMakefile
|
|
# Copyright (C) 1999- Markus Mottl
|
|
#
|
|
# For updates see:
|
|
# http://www.ocaml.info/home/ocaml_sources.html
|
|
#
|
|
###########################################################################
|
|
|
|
# Modified by damien for .glade.ml compilation
|
|
|
|
# Set these variables to the names of the sources to be processed and
|
|
# the result variable. Order matters during linkage!
|
|
|
|
ifndef SOURCES
|
|
SOURCES := foo.ml
|
|
endif
|
|
export SOURCES
|
|
|
|
ifndef RES_CLIB_SUF
|
|
RES_CLIB_SUF := _stubs
|
|
endif
|
|
export RES_CLIB_SUF
|
|
|
|
ifndef RESULT
|
|
RESULT := foo
|
|
endif
|
|
export RESULT := $(strip $(RESULT))
|
|
|
|
export LIB_PACK_NAME
|
|
|
|
ifndef DOC_FILES
|
|
DOC_FILES := $(filter %.mli, $(SOURCES))
|
|
endif
|
|
export DOC_FILES
|
|
FIRST_DOC_FILE := $(firstword $(DOC_FILES))
|
|
|
|
export BCSUFFIX
|
|
export NCSUFFIX
|
|
|
|
ifndef TOPSUFFIX
|
|
TOPSUFFIX := .top
|
|
endif
|
|
export TOPSUFFIX
|
|
|
|
# Eventually set include- and library-paths, libraries to link,
|
|
# additional compilation-, link- and ocamlyacc-flags
|
|
# Path- and library information needs not be written with "-I" and such...
|
|
# Define THREADS if you need it, otherwise leave it unset (same for
|
|
# USE_CAMLP4)!
|
|
|
|
export THREADS
|
|
export VMTHREADS
|
|
export ANNOTATE
|
|
export USE_CAMLP4
|
|
|
|
export INCDIRS
|
|
export LIBDIRS
|
|
export EXTLIBDIRS
|
|
export RESULTDEPS
|
|
export OCAML_DEFAULT_DIRS
|
|
|
|
export LIBS
|
|
export CLIBS
|
|
export CFRAMEWORKS
|
|
|
|
export OCAMLFLAGS
|
|
export OCAMLNCFLAGS
|
|
export OCAMLBCFLAGS
|
|
|
|
export OCAMLLDFLAGS
|
|
export OCAMLNLDFLAGS
|
|
export OCAMLBLDFLAGS
|
|
|
|
export OCAMLMKLIB_FLAGS
|
|
|
|
ifndef OCAMLCPFLAGS
|
|
OCAMLCPFLAGS := a
|
|
endif
|
|
export OCAMLCPFLAGS
|
|
|
|
ifndef DOC_DIR
|
|
DOC_DIR := doc
|
|
endif
|
|
export DOC_DIR
|
|
|
|
export PPFLAGS
|
|
|
|
export LFLAGS
|
|
export YFLAGS
|
|
export IDLFLAGS
|
|
|
|
export OCAMLDOCFLAGS
|
|
|
|
export OCAMLFIND_INSTFLAGS
|
|
|
|
export DVIPSFLAGS
|
|
|
|
export STATIC
|
|
|
|
# Add a list of optional trash files that should be deleted by "make clean"
|
|
export TRASH
|
|
|
|
ECHO := echo
|
|
|
|
ifdef REALLY_QUIET
|
|
export REALLY_QUIET
|
|
ECHO := true
|
|
LFLAGS := $(LFLAGS) -q
|
|
YFLAGS := $(YFLAGS) -q
|
|
endif
|
|
|
|
#################### variables depending on your OCaml-installation
|
|
|
|
SYSTEM := $(shell ocamlc -config 2>/dev/null | grep system | sed 's/system: //')
|
|
# This may be
|
|
# - mingw
|
|
# - mingw64
|
|
# - win32
|
|
# - cygwin
|
|
# - some other string means Unix
|
|
# - empty means ocamlc does not support -config
|
|
|
|
ifeq ($(SYSTEM),$(filter $(SYSTEM),mingw mingw64))
|
|
MINGW=1
|
|
endif
|
|
ifeq ($(SYSTEM),win32)
|
|
MSVC=1
|
|
endif
|
|
|
|
ifdef MINGW
|
|
export MINGW
|
|
WIN32 := 1
|
|
# The default value 'cc' makes 'ocamlc -cc "cc"' raises the error 'The
|
|
# NTVDM CPU has encountered an illegal instruction'.
|
|
ifndef CC
|
|
MNO_CYGWIN := $(shell gcc -Wextra -v --help 2>/dev/null | grep -q '\-mno-cygwin'; echo $$?)
|
|
CC := gcc
|
|
else
|
|
MNO_CYGWIN := $(shell $$CC -Wextra -v --help 2>/dev/null | grep -q '\-mno-cygwin'; echo $$?)
|
|
endif
|
|
# We are compiling with cygwin tools:
|
|
ifeq ($(MNO_CYGWIN),0)
|
|
CFLAGS_WIN32 := -mno-cygwin
|
|
endif
|
|
# The OCaml C header files use this flag:
|
|
CFLAGS += -D__MINGW32__
|
|
endif
|
|
ifdef MSVC
|
|
export MSVC
|
|
WIN32 := 1
|
|
ifndef STATIC
|
|
CPPFLAGS_WIN32 := -DCAML_DLL
|
|
endif
|
|
CFLAGS_WIN32 += -nologo
|
|
EXT_OBJ := obj
|
|
EXT_LIB := lib
|
|
ifeq ($(CC),gcc)
|
|
# work around GNU Make default value
|
|
ifdef THREADS
|
|
CC := cl -MT
|
|
else
|
|
CC := cl
|
|
endif
|
|
endif
|
|
ifeq ($(CXX),g++)
|
|
# work around GNU Make default value
|
|
CXX := $(CC)
|
|
endif
|
|
CFLAG_O := -Fo
|
|
endif
|
|
ifdef WIN32
|
|
EXT_CXX := cpp
|
|
EXE := .exe
|
|
endif
|
|
|
|
ifndef EXT_OBJ
|
|
EXT_OBJ := o
|
|
endif
|
|
ifndef EXT_LIB
|
|
EXT_LIB := a
|
|
endif
|
|
ifndef EXT_CXX
|
|
EXT_CXX := cc
|
|
endif
|
|
ifndef EXE
|
|
EXE := # empty
|
|
endif
|
|
ifndef CFLAG_O
|
|
CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
|
|
endif
|
|
|
|
export CC
|
|
export CXX
|
|
export CFLAGS
|
|
export CXXFLAGS
|
|
export LDFLAGS
|
|
export CPPFLAGS
|
|
|
|
ifndef RPATH_FLAG
|
|
ifdef ELF_RPATH_FLAG
|
|
RPATH_FLAG := $(ELF_RPATH_FLAG)
|
|
else
|
|
RPATH_FLAG := -R
|
|
endif
|
|
endif
|
|
export RPATH_FLAG
|
|
|
|
ifndef MSVC
|
|
ifndef PIC_CFLAGS
|
|
PIC_CFLAGS := -fPIC
|
|
endif
|
|
ifndef PIC_CPPFLAGS
|
|
PIC_CPPFLAGS := -DPIC
|
|
endif
|
|
endif
|
|
|
|
export PIC_CFLAGS
|
|
export PIC_CPPFLAGS
|
|
|
|
BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
|
|
NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
|
|
TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
|
|
|
|
ifndef OCAMLFIND
|
|
OCAMLFIND := ocamlfind
|
|
endif
|
|
export OCAMLFIND
|
|
|
|
ifndef OCAML
|
|
OCAML := ocaml
|
|
endif
|
|
export OCAML
|
|
|
|
ifndef OCAMLC
|
|
OCAMLC := ocamlc
|
|
endif
|
|
export OCAMLC
|
|
|
|
ifndef OCAMLOPT
|
|
OCAMLOPT := ocamlopt
|
|
endif
|
|
export OCAMLOPT
|
|
|
|
ifndef OCAMLMKTOP
|
|
OCAMLMKTOP := ocamlmktop
|
|
endif
|
|
export OCAMLMKTOP
|
|
|
|
ifndef OCAMLCP
|
|
OCAMLCP := ocamlcp
|
|
endif
|
|
export OCAMLCP
|
|
|
|
ifndef OCAMLDEP
|
|
OCAMLDEP := ocamldep
|
|
endif
|
|
export OCAMLDEP
|
|
|
|
ifndef OCAMLLEX
|
|
OCAMLLEX := ocamllex
|
|
endif
|
|
export OCAMLLEX
|
|
|
|
ifndef OCAMLYACC
|
|
OCAMLYACC := ocamlyacc
|
|
endif
|
|
export OCAMLYACC
|
|
|
|
ifndef OCAMLMKLIB
|
|
OCAMLMKLIB := ocamlmklib
|
|
endif
|
|
export OCAMLMKLIB
|
|
|
|
ifndef OCAML_GLADECC
|
|
OCAML_GLADECC := lablgladecc2
|
|
endif
|
|
export OCAML_GLADECC
|
|
|
|
ifndef OCAML_GLADECC_FLAGS
|
|
OCAML_GLADECC_FLAGS :=
|
|
endif
|
|
export OCAML_GLADECC_FLAGS
|
|
|
|
ifndef CAMELEON_REPORT
|
|
CAMELEON_REPORT := report
|
|
endif
|
|
export CAMELEON_REPORT
|
|
|
|
ifndef CAMELEON_REPORT_FLAGS
|
|
CAMELEON_REPORT_FLAGS :=
|
|
endif
|
|
export CAMELEON_REPORT_FLAGS
|
|
|
|
ifndef CAMELEON_ZOGGY
|
|
CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
|
|
endif
|
|
export CAMELEON_ZOGGY
|
|
|
|
ifndef CAMELEON_ZOGGY_FLAGS
|
|
CAMELEON_ZOGGY_FLAGS :=
|
|
endif
|
|
export CAMELEON_ZOGGY_FLAGS
|
|
|
|
ifndef OXRIDL
|
|
OXRIDL := oxridl
|
|
endif
|
|
export OXRIDL
|
|
|
|
ifndef CAMLIDL
|
|
CAMLIDL := camlidl
|
|
endif
|
|
export CAMLIDL
|
|
|
|
ifndef CAMLIDLDLL
|
|
CAMLIDLDLL := camlidldll
|
|
endif
|
|
export CAMLIDLDLL
|
|
|
|
ifndef NOIDLHEADER
|
|
MAYBE_IDL_HEADER := -header
|
|
endif
|
|
export NOIDLHEADER
|
|
|
|
export NO_CUSTOM
|
|
|
|
ifndef CAMLP4
|
|
CAMLP4 := camlp4
|
|
endif
|
|
export CAMLP4
|
|
|
|
ifndef REAL_OCAMLFIND
|
|
ifdef PACKS
|
|
ifndef CREATE_LIB
|
|
ifdef THREADS
|
|
PACKS += threads
|
|
endif
|
|
endif
|
|
empty :=
|
|
space := $(empty) $(empty)
|
|
comma := ,
|
|
ifdef PREDS
|
|
PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
|
|
PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
|
|
OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
|
|
# OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
|
|
OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
|
|
OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
|
|
else
|
|
OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
|
|
OCAML_DEP_PACKAGES :=
|
|
endif
|
|
OCAML_FIND_LINKPKG := -linkpkg
|
|
REAL_OCAMLFIND := $(OCAMLFIND)
|
|
endif
|
|
endif
|
|
|
|
export OCAML_FIND_PACKAGES
|
|
export OCAML_DEP_PACKAGES
|
|
export OCAML_FIND_LINKPKG
|
|
export REAL_OCAMLFIND
|
|
|
|
ifndef OCAMLDOC
|
|
OCAMLDOC := ocamldoc
|
|
endif
|
|
export OCAMLDOC
|
|
|
|
ifndef LATEX
|
|
LATEX := latex
|
|
endif
|
|
export LATEX
|
|
|
|
ifndef DVIPS
|
|
DVIPS := dvips
|
|
endif
|
|
export DVIPS
|
|
|
|
ifndef PS2PDF
|
|
PS2PDF := ps2pdf
|
|
endif
|
|
export PS2PDF
|
|
|
|
ifndef OCAMLMAKEFILE
|
|
OCAMLMAKEFILE := OCamlMakefile
|
|
endif
|
|
export OCAMLMAKEFILE
|
|
|
|
ifndef OCAMLLIBPATH
|
|
OCAMLLIBPATH := \
|
|
$(shell $(OCAMLC) 2>/dev/null -where || echo /usr/local/lib/ocaml)
|
|
endif
|
|
export OCAMLLIBPATH
|
|
|
|
ifndef OCAML_LIB_INSTALL
|
|
OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
|
|
endif
|
|
export OCAML_LIB_INSTALL
|
|
|
|
###########################################################################
|
|
|
|
#################### change following sections only if
|
|
#################### you know what you are doing!
|
|
|
|
# delete target files when a build command fails
|
|
.PHONY: .DELETE_ON_ERROR
|
|
.DELETE_ON_ERROR:
|
|
|
|
# for pedants using "--warn-undefined-variables"
|
|
export MAYBE_IDL
|
|
export REAL_RESULT
|
|
export CAMLIDLFLAGS
|
|
export THREAD_FLAG
|
|
export RES_CLIB
|
|
export MAKEDLL
|
|
export ANNOT_FLAG
|
|
export C_OXRIDL
|
|
export SUBPROJS
|
|
export CFLAGS_WIN32
|
|
export CPPFLAGS_WIN32
|
|
|
|
INCFLAGS :=
|
|
|
|
SHELL := /bin/sh
|
|
|
|
MLDEPDIR := ._d
|
|
BCDIDIR := ._bcdi
|
|
NCDIDIR := ._ncdi
|
|
|
|
FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.m %.$(EXT_CXX) %.rep %.zog %.glade
|
|
|
|
FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
|
|
SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
|
|
|
|
FILTERED_REP := $(filter %.rep, $(FILTERED))
|
|
DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
|
|
AUTO_REP := $(FILTERED_REP:.rep=.ml)
|
|
|
|
FILTERED_ZOG := $(filter %.zog, $(FILTERED))
|
|
DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
|
|
AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
|
|
|
|
FILTERED_GLADE := $(filter %.glade, $(FILTERED))
|
|
DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
|
|
AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
|
|
|
|
FILTERED_ML := $(filter %.ml, $(FILTERED))
|
|
DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
|
|
|
|
FILTERED_MLI := $(filter %.mli, $(FILTERED))
|
|
DEP_MLI := $(FILTERED_MLI:.mli=.di)
|
|
|
|
FILTERED_MLL := $(filter %.mll, $(FILTERED))
|
|
DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
|
|
AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
|
|
|
|
FILTERED_MLY := $(filter %.mly, $(FILTERED))
|
|
DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
|
|
AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
|
|
|
|
FILTERED_IDL := $(filter %.idl, $(FILTERED))
|
|
DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
|
|
C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
|
|
ifndef NOIDLHEADER
|
|
C_IDL += $(FILTERED_IDL:.idl=.h)
|
|
endif
|
|
OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
|
|
AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
|
|
|
|
FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
|
|
DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
|
|
AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
|
|
|
|
FILTERED_C_CXX := $(filter %.c %.m %.$(EXT_CXX), $(FILTERED))
|
|
OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
|
|
OBJ_C_CXX := $(OBJ_C_CXX:.m=.$(EXT_OBJ))
|
|
OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
|
|
|
|
PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
|
|
|
|
ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
|
|
|
|
MLDEPS := $(filter %.d, $(ALL_DEPS))
|
|
MLIDEPS := $(filter %.di, $(ALL_DEPS))
|
|
BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
|
|
NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
|
|
|
|
ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
|
|
|
|
IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
|
|
IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
|
|
$(basename $(file)).cmi $(basename $(file)).cmo)
|
|
IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
|
|
IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
|
|
|
|
IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
|
|
|
|
INTF := $(filter %.cmi, $(IMPLO_INTF))
|
|
IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
|
|
IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
|
|
IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
|
|
IMPL_S := $(IMPL_CMO:.cmo=.s)
|
|
|
|
OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
|
|
OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
|
|
|
|
EXECS := $(addsuffix $(EXE), \
|
|
$(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
|
|
ifdef WIN32
|
|
EXECS += $(BCRESULT).dll $(NCRESULT).dll
|
|
endif
|
|
|
|
CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
|
|
endif
|
|
|
|
ifdef WIN32
|
|
DLLSONAME := dll$(CLIB_BASE).dll
|
|
else
|
|
DLLSONAME := dll$(CLIB_BASE).so
|
|
endif
|
|
|
|
NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
|
|
$(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
|
|
$(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
|
|
$(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).$(EXT_OBJ) \
|
|
$(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
|
|
$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx \
|
|
$(LIB_PACK_NAME).$(EXT_OBJ)
|
|
|
|
ifndef STATIC
|
|
NONEXECS += $(DLLSONAME)
|
|
endif
|
|
|
|
ifndef LIBINSTALL_FILES
|
|
LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
|
|
$(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
|
|
ifndef STATIC
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
LIBINSTALL_FILES += $(DLLSONAME)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
export LIBINSTALL_FILES
|
|
|
|
ifdef WIN32
|
|
# some extra stuff is created while linking DLLs
|
|
NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
|
|
endif
|
|
|
|
TARGETS := $(EXECS) $(NONEXECS)
|
|
|
|
# If there are IDL-files
|
|
ifneq ($(strip $(FILTERED_IDL)),)
|
|
MAYBE_IDL := -cclib -lcamlidl
|
|
endif
|
|
|
|
ifdef USE_CAMLP4
|
|
CAMLP4PATH := \
|
|
$(shell $(CAMLP4) -where 2>/dev/null || echo /usr/local/lib/camlp4)
|
|
INCFLAGS := -I $(CAMLP4PATH)
|
|
CINCFLAGS := -I$(CAMLP4PATH)
|
|
endif
|
|
|
|
INCFLAGS := $(INCFLAGS) $(INCDIRS:%=-I %) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
|
|
CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
|
|
|
|
ifndef MSVC
|
|
CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
|
|
$(EXTLIBDIRS:%=-L%) $(OCAML_DEFAULT_DIRS:%=-L%)
|
|
|
|
ifeq ($(ELF_RPATH), yes)
|
|
CLIBFLAGS += $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%)
|
|
endif
|
|
endif
|
|
|
|
ifndef PROFILING
|
|
INTF_OCAMLC := $(OCAMLC)
|
|
else
|
|
ifndef THREADS
|
|
INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
|
|
else
|
|
# OCaml does not support profiling byte code
|
|
# with threads (yet), therefore we force an error.
|
|
ifndef REAL_OCAMLC
|
|
$(error Profiling of multithreaded byte code not yet supported by OCaml)
|
|
endif
|
|
INTF_OCAMLC := $(OCAMLC)
|
|
endif
|
|
endif
|
|
|
|
ifndef MSVC
|
|
COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
|
|
$(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
|
|
$(EXTLIBDIRS:%=-ccopt -Wl $(OCAML_DEFAULT_DIRS:%=-ccopt -L%))
|
|
|
|
ifeq ($(ELF_RPATH),yes)
|
|
COMMON_LDFLAGS += $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%)
|
|
endif
|
|
else
|
|
COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
|
|
$(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
|
|
$(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
|
|
endif
|
|
|
|
CLIBS_OPTS := $(CLIBS:%=-cclib -l%) $(CFRAMEWORKS:%=-cclib '-framework %')
|
|
ifdef MSVC
|
|
ifndef STATIC
|
|
# MSVC libraries do not have 'lib' prefix
|
|
CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
ifdef CREATE_LIB
|
|
OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
|
|
else
|
|
OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
|
|
endif
|
|
else
|
|
OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
|
|
endif
|
|
|
|
ifdef LIB_PACK_NAME
|
|
FOR_PACK_NAME := $(shell echo $(LIB_PACK_NAME) | awk '{print toupper(substr($$0,1,1))substr($$0,2)}')
|
|
endif
|
|
|
|
# If we have to make byte-code
|
|
ifndef REAL_OCAMLC
|
|
BYTE_OCAML := y
|
|
|
|
# EXTRADEPS is added dependencies we have to insert for all
|
|
# executable files we generate. Ideally it should be all of the
|
|
# libraries we use, but it's hard to find the ones that get searched on
|
|
# the path since I don't know the paths built into the compiler, so
|
|
# just include the ones with slashes in their names.
|
|
EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
|
|
|
|
|
|
ifndef LIB_PACK_NAME
|
|
SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
|
|
else
|
|
SPECIAL_OCAMLFLAGS := -for-pack $(FOR_PACK_NAME) $(OCAMLBCFLAGS)
|
|
endif
|
|
|
|
REAL_OCAMLC := $(INTF_OCAMLC)
|
|
|
|
REAL_IMPL := $(IMPL_CMO)
|
|
REAL_IMPL_INTF := $(IMPLO_INTF)
|
|
IMPL_SUF := .cmo
|
|
|
|
DEPFLAGS :=
|
|
MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
|
|
|
|
ifdef CREATE_LIB
|
|
override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
|
|
override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
|
|
ifndef STATIC
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
MAKEDLL := $(DLLSONAME)
|
|
ALL_LDFLAGS := -dllib $(DLLSONAME)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifndef NO_CUSTOM
|
|
ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS) $(CFRAMEWORKS))" ""
|
|
ALL_LDFLAGS += -custom
|
|
endif
|
|
endif
|
|
|
|
ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
|
|
$(COMMON_LDFLAGS) $(LIBS:%=%.cma)
|
|
CAMLIDLDLLFLAGS :=
|
|
|
|
ifdef THREADS
|
|
ifdef VMTHREADS
|
|
THREAD_FLAG := -vmthread
|
|
else
|
|
THREAD_FLAG := -thread
|
|
endif
|
|
ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
|
|
ifndef CREATE_LIB
|
|
ifndef REAL_OCAMLFIND
|
|
ALL_LDFLAGS := $(ALL_LDFLAGS)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# we have to make native-code
|
|
else
|
|
EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
|
|
ifndef PROFILING
|
|
SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
|
|
PLDFLAGS :=
|
|
else
|
|
SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
|
|
PLDFLAGS := -p
|
|
endif
|
|
|
|
ifndef LIB_PACK_NAME
|
|
SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
|
|
else
|
|
SPECIAL_OCAMLFLAGS := -for-pack $(FOR_PACK_NAME) $(OCAMLNCFLAGS)
|
|
endif
|
|
REAL_IMPL := $(IMPL_CMX)
|
|
REAL_IMPL_INTF := $(IMPLX_INTF)
|
|
IMPL_SUF := .cmx
|
|
|
|
override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
|
|
|
|
DEPFLAGS := -native
|
|
MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
|
|
|
|
ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
|
|
$(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
|
|
CAMLIDLDLLFLAGS := -opt
|
|
|
|
ifndef CREATE_LIB
|
|
ALL_LDFLAGS += $(LIBS:%=%.cmxa)
|
|
else
|
|
override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
|
|
override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
|
|
endif
|
|
|
|
ifdef THREADS
|
|
THREAD_FLAG := -thread
|
|
ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
|
|
ifndef CREATE_LIB
|
|
ifndef REAL_OCAMLFIND
|
|
ALL_LDFLAGS := $(ALL_LDFLAGS)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
export MAKE_DEPS
|
|
|
|
ifdef ANNOTATE
|
|
ANNOT_FLAG := -annot
|
|
else
|
|
endif
|
|
|
|
ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
|
|
$(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
|
|
|
|
ifdef make_deps
|
|
-include $(MAKE_DEPS)
|
|
PRE_TARGETS :=
|
|
endif
|
|
|
|
###########################################################################
|
|
# USER RULES
|
|
|
|
# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
|
|
QUIET=@
|
|
|
|
# generates byte-code (default)
|
|
byte-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes
|
|
bc: byte-code
|
|
|
|
byte-code-nolink: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes
|
|
bcnl: byte-code-nolink
|
|
|
|
top: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes
|
|
|
|
# generates native-code
|
|
|
|
native-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
make_deps=yes
|
|
nc: native-code
|
|
|
|
native-code-nolink: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
make_deps=yes
|
|
ncnl: native-code-nolink
|
|
|
|
# generates byte-code libraries
|
|
byte-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(BCRESULT).cma \
|
|
REAL_RESULT="$(BCRESULT)" \
|
|
CREATE_LIB=yes \
|
|
make_deps=yes
|
|
bcl: byte-code-library
|
|
|
|
# generates native-code libraries
|
|
native-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(NCRESULT).cmxa \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
CREATE_LIB=yes \
|
|
make_deps=yes
|
|
ncl: native-code-library
|
|
|
|
ifdef WIN32
|
|
# generates byte-code dll
|
|
byte-code-dll: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(BCRESULT).dll \
|
|
REAL_RESULT="$(BCRESULT)" \
|
|
make_deps=yes
|
|
bcd: byte-code-dll
|
|
|
|
# generates native-code dll
|
|
native-code-dll: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(NCRESULT).dll \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
make_deps=yes
|
|
ncd: native-code-dll
|
|
endif
|
|
|
|
# generates byte-code with debugging information
|
|
debug-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dc: debug-code
|
|
|
|
debug-code-nolink: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dcnl: debug-code-nolink
|
|
|
|
# generates byte-code with debugging information (native code)
|
|
debug-native-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
|
|
REAL_RESULT="$(NCRESULT)" make_deps=yes \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dnc: debug-native-code
|
|
|
|
debug-native-code-nolink: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
|
|
REAL_RESULT="$(NCRESULT)" make_deps=yes \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dncnl: debug-native-code-nolink
|
|
|
|
# generates byte-code libraries with debugging information
|
|
debug-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(BCRESULT).cma \
|
|
REAL_RESULT="$(BCRESULT)" make_deps=yes \
|
|
CREATE_LIB=yes \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dcl: debug-code-library
|
|
|
|
# generates byte-code libraries with debugging information (native code)
|
|
debug-native-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(NCRESULT).cmxa \
|
|
REAL_RESULT="$(NCRESULT)" make_deps=yes \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
CREATE_LIB=yes \
|
|
OCAMLFLAGS="-g $(OCAMLFLAGS)" \
|
|
OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
|
|
dncl: debug-native-code-library
|
|
|
|
# generates byte-code for profiling
|
|
profiling-byte-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
|
|
REAL_RESULT="$(BCRESULT)" PROFILING="y" \
|
|
make_deps=yes
|
|
pbc: profiling-byte-code
|
|
|
|
# generates native-code
|
|
|
|
profiling-native-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
PROFILING="y" \
|
|
make_deps=yes
|
|
pnc: profiling-native-code
|
|
|
|
# generates byte-code libraries
|
|
profiling-byte-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(BCRESULT).cma \
|
|
REAL_RESULT="$(BCRESULT)" PROFILING="y" \
|
|
CREATE_LIB=yes \
|
|
make_deps=yes
|
|
pbcl: profiling-byte-code-library
|
|
|
|
# generates native-code libraries
|
|
profiling-native-code-library: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(RES_CLIB) $(NCRESULT).cmxa \
|
|
REAL_RESULT="$(NCRESULT)" PROFILING="y" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
CREATE_LIB=yes \
|
|
make_deps=yes
|
|
pncl: profiling-native-code-library
|
|
|
|
# packs byte-code objects
|
|
pack-byte-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
|
|
REAL_RESULT="$(BCRESULT)" \
|
|
PACK_LIB=yes make_deps=yes
|
|
pabc: pack-byte-code
|
|
|
|
# packs native-code objects
|
|
pack-native-code: $(PRE_TARGETS)
|
|
$(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
|
|
$(NCRESULT).cmx $(NCRESULT).$(EXT_OBJ) \
|
|
REAL_RESULT="$(NCRESULT)" \
|
|
REAL_OCAMLC="$(OCAMLOPT)" \
|
|
PACK_LIB=yes make_deps=yes
|
|
panc: pack-native-code
|
|
|
|
# generates HTML-documentation
|
|
htdoc: $(DOC_DIR)/$(RESULT)/html/index.html
|
|
|
|
# generates Latex-documentation
|
|
ladoc: $(DOC_DIR)/$(RESULT)/latex/doc.tex
|
|
|
|
# generates PostScript-documentation
|
|
psdoc: $(DOC_DIR)/$(RESULT)/latex/doc.ps
|
|
|
|
# generates PDF-documentation
|
|
pdfdoc: $(DOC_DIR)/$(RESULT)/latex/doc.pdf
|
|
|
|
# generates all supported forms of documentation
|
|
doc: htdoc ladoc psdoc pdfdoc
|
|
|
|
###########################################################################
|
|
# LOW LEVEL RULES
|
|
|
|
$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) \
|
|
$(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
|
|
$(OBJS_LIBS) $(ALL_LDFLAGS) -o $@$(EXE) \
|
|
$(REAL_IMPL)
|
|
|
|
nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
|
|
|
|
ifdef WIN32
|
|
$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
|
|
$(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
|
|
-o $@ $(REAL_IMPL)
|
|
endif
|
|
|
|
%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
|
|
$(REAL_OCAMLFIND) $(OCAMLMKTOP) \
|
|
$(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
|
|
$(OBJS_LIBS) $(ALL_LDFLAGS) -o $@$(EXE) \
|
|
$(REAL_IMPL)
|
|
|
|
.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
|
|
.mly .di .d .$(EXT_LIB) .idl %.oxridl .c .m .$(EXT_CXX) .h .so \
|
|
.rep .zog .glade
|
|
|
|
ifndef STATIC
|
|
ifdef MINGW
|
|
# From OCaml 3.11.0, ocamlmklib is available on windows
|
|
OCAMLMLIB_EXISTS = $(shell which $(OCAMLMKLIB))
|
|
ifeq ($(strip $(OCAMLMLIB_EXISTS)),)
|
|
$(DLLSONAME): $(OBJ_LINK)
|
|
$(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
|
|
$(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
|
|
'$(OCAMLLIBPATH)/ocamlrun.a' \
|
|
-Wl,--whole-archive \
|
|
-Wl,--export-all-symbols \
|
|
-Wl,--allow-multiple-definition \
|
|
-Wl,--enable-auto-import
|
|
else
|
|
$(DLLSONAME): $(OBJ_LINK)
|
|
$(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
|
|
-o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
|
|
$(CFRAMEWORKS:%=-framework %) \
|
|
$(OCAMLMKLIB_FLAGS)
|
|
endif
|
|
else
|
|
ifdef MSVC
|
|
$(DLLSONAME): $(OBJ_LINK)
|
|
link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
|
|
$(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
|
|
'$(OCAMLLIBPATH)/ocamlrun.lib'
|
|
|
|
else
|
|
$(DLLSONAME): $(OBJ_LINK)
|
|
$(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
|
|
-o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) $(CFRAMEWORKS:%=-framework %) \
|
|
$(OCAMLMKLIB_FLAGS)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifndef LIB_PACK_NAME
|
|
$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(REAL_IMPL)
|
|
|
|
$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
|
|
$(REAL_OCAMLFIND) $(OCAMLOPT) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(REAL_IMPL)
|
|
else
|
|
# Packing a bytecode library
|
|
LIB_PACK_NAME_MLI = $(wildcard $(LIB_PACK_NAME).mli)
|
|
ifeq ($(LIB_PACK_NAME_MLI),)
|
|
LIB_PACK_NAME_CMI = $(LIB_PACK_NAME).cmi
|
|
else
|
|
# $(LIB_PACK_NAME).mli exists, it likely depends on other compiled interfaces
|
|
LIB_PACK_NAME_CMI =
|
|
$(LIB_PACK_NAME).cmi: $(REAL_IMPL_INTF)
|
|
endif
|
|
ifdef BYTE_OCAML
|
|
$(LIB_PACK_NAME_CMI) $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(OCAMLLDFLAGS) $(REAL_IMPL)
|
|
# Packing into a unit which can be transformed into a library
|
|
# Remember the .ml's must have been compiled with -for-pack $(LIB_PACK_NAME)
|
|
else
|
|
$(LIB_PACK_NAME_CMI) $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
|
|
$(REAL_OCAMLFIND) $(OCAMLOPT) -pack -o $(LIB_PACK_NAME).cmx $(OCAMLLDFLAGS) $(REAL_IMPL)
|
|
endif
|
|
|
|
$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(OBJS_LIBS) $(ALL_LDFLAGS) -o $@ $(LIB_PACK_NAME).cmo
|
|
|
|
$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
|
|
$(REAL_OCAMLFIND) $(OCAMLOPT) -a $(OBJS_LIBS) $(filter-out -custom, $(ALL_LDFLAGS)) -o $@ $(LIB_PACK_NAME).cmx
|
|
endif
|
|
|
|
$(RES_CLIB): $(OBJ_LINK)
|
|
ifndef MSVC
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
$(AR) rcs $@ $(OBJ_LINK)
|
|
endif
|
|
else
|
|
ifneq ($(strip $(OBJ_LINK)),)
|
|
lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
|
|
endif
|
|
endif
|
|
|
|
%.cmi: %.mli $(EXTRADEPS)
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c $(THREAD_FLAG) $(ANNOT_FLAG) \
|
|
$(OCAMLFLAGS) $(INCFLAGS) $<; \
|
|
$(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c $(THREAD_FLAG) $(ANNOT_FLAG) \
|
|
$(OCAMLFLAGS) $(INCFLAGS) $<; \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
|
|
$(OCAMLFLAGS) $(INCFLAGS) $<; \
|
|
$(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
|
|
$(OCAMLFLAGS) $(INCFLAGS) $<; \
|
|
fi
|
|
|
|
%.cmi: %$(IMPL_SUF);
|
|
|
|
%$(IMPL_SUF) %.$(EXT_OBJ): %.ml $(EXTRADEPS)
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c $(ALL_OCAMLCFLAGS) $<; \
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c $(ALL_OCAMLCFLAGS) $<; \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
|
|
$(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
|
|
-c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
|
|
fi
|
|
|
|
.PRECIOUS: %.ml
|
|
%.ml: %.mll
|
|
$(OCAMLLEX) $(LFLAGS) $<
|
|
|
|
.PRECIOUS: %.ml %.mli
|
|
%.ml %.mli: %.mly
|
|
$(OCAMLYACC) $(YFLAGS) $<
|
|
$(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
|
|
if [ ! -z "$$pp" ]; then \
|
|
mv $*.ml $*.ml.temporary; \
|
|
echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
|
|
cat $*.ml.temporary >> $*.ml; \
|
|
rm $*.ml.temporary; \
|
|
mv $*.mli $*.mli.temporary; \
|
|
echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
|
|
cat $*.mli.temporary >> $*.mli; \
|
|
rm $*.mli.temporary; \
|
|
fi
|
|
|
|
|
|
.PRECIOUS: %.ml
|
|
%.ml: %.rep
|
|
$(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
|
|
|
|
.PRECIOUS: %.ml
|
|
%.ml: %.zog
|
|
$(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
|
|
|
|
.PRECIOUS: %.ml
|
|
%.ml: %.glade
|
|
$(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
|
|
|
|
.PRECIOUS: %.ml %.mli
|
|
%.ml %.mli: %.oxridl
|
|
$(OXRIDL) $<
|
|
|
|
.PRECIOUS: %.ml %.mli %_stubs.c %.h
|
|
%.ml %.mli %_stubs.c %.h: %.idl
|
|
$(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
|
|
$(CAMLIDLFLAGS) $<
|
|
$(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
|
|
|
|
%.$(EXT_OBJ): %.c
|
|
$(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
|
|
$(CPPFLAGS) $(CPPFLAGS_WIN32) \
|
|
$(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
|
|
|
|
%.$(EXT_OBJ): %.m
|
|
$(CC) -c $(CFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
|
|
-I'$(OCAMLLIBPATH)' \
|
|
$< $(CFLAG_O)$@
|
|
|
|
%.$(EXT_OBJ): %.$(EXT_CXX)
|
|
$(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
|
|
-I'$(OCAMLLIBPATH)' \
|
|
$< $(CFLAG_O)$@
|
|
|
|
$(MLDEPDIR)/%.d: %.ml
|
|
$(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
|
|
$(INCFLAGS) $< \> $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
|
|
$(INCFLAGS) $< > $@; \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
|
|
-pp \"$$pp $(PPFLAGS)\" $(INCFLAGS) $< \> $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
|
|
-pp "$$pp $(PPFLAGS)" $(INCFLAGS) $< > $@; \
|
|
fi
|
|
|
|
$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
|
|
$(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(INCFLAGS) $< \> $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(INCFLAGS) $< > $@; \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
|
|
-pp \"$$pp $(PPFLAGS)\" $(INCFLAGS) $< \> $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
|
|
-pp "$$pp $(PPFLAGS)" $(INCFLAGS) $< > $@; \
|
|
fi
|
|
|
|
$(DOC_DIR)/$(RESULT)/html:
|
|
mkdir -p $@
|
|
|
|
$(DOC_DIR)/$(RESULT)/html/index.html: $(DOC_DIR)/$(RESULT)/html $(DOC_FILES)
|
|
rm -rf $</*
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
|
|
$(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -html -d $< $(OCAMLDOCFLAGS) \
|
|
$(INCFLAGS) $(DOC_FILES); \
|
|
$(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -html -d $< $(OCAMLDOCFLAGS) \
|
|
$(INCFLAGS) $(DOC_FILES); \
|
|
fi
|
|
|
|
$(DOC_DIR)/$(RESULT)/latex:
|
|
mkdir -p $@
|
|
|
|
$(DOC_DIR)/$(RESULT)/latex/doc.tex: $(DOC_DIR)/$(RESULT)/latex $(DOC_FILES)
|
|
rm -rf $</*
|
|
$(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \
|
|
if [ -z "$$pp" ]; then \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
|
|
$(DOC_FILES) -o $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
|
|
-o $@; \
|
|
else \
|
|
$(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
|
|
$(INCFLAGS) $(DOC_FILES) -o $@; \
|
|
$(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
|
|
$(INCFLAGS) $(DOC_FILES) -o $@; \
|
|
fi
|
|
|
|
$(DOC_DIR)/$(RESULT)/latex/doc.ps: $(DOC_DIR)/$(RESULT)/latex/doc.tex
|
|
cd $(DOC_DIR)/$(RESULT)/latex && \
|
|
$(LATEX) doc.tex && \
|
|
$(LATEX) doc.tex && \
|
|
$(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
|
|
|
|
$(DOC_DIR)/$(RESULT)/latex/doc.pdf: $(DOC_DIR)/$(RESULT)/latex/doc.ps
|
|
cd $(DOC_DIR)/$(RESULT)/latex && $(PS2PDF) $(<F)
|
|
|
|
define make_subproj
|
|
.PHONY:
|
|
subproj_$(1):
|
|
$$(eval $$(call PROJ_$(1)))
|
|
$(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
|
|
$(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
|
|
fi
|
|
endef
|
|
|
|
$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
|
|
|
|
.PHONY:
|
|
subprojs: $(SUBPROJS:%=subproj_%)
|
|
|
|
###########################################################################
|
|
# (UN)INSTALL RULES FOR LIBRARIES
|
|
|
|
.PHONY: libinstall
|
|
libinstall: all
|
|
$(QUIET)printf "\nInstalling library with ocamlfind\n"
|
|
$(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
|
|
$(QUIET)printf "\nInstallation successful.\n"
|
|
|
|
.PHONY: libinstall-byte-code
|
|
libinstall-byte-code: all
|
|
$(QUIET)printf "\nInstalling byte-code library with ocamlfind\n"
|
|
$(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
|
|
$(filter-out $(RESULT).$(EXT_LIB) $(RESULT).cmxa, $(LIBINSTALL_FILES))
|
|
$(QUIET)printf "\nInstallation successful.\n"
|
|
|
|
.PHONY: libinstall-native-code
|
|
libinstall-native-code: all
|
|
$(QUIET)printf "\nInstalling native-code library with ocamlfind\n"
|
|
$(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \
|
|
$(filter-out $(DLLSONAME) $(RESULT).cma, $(LIBINSTALL_FILES))
|
|
$(QUIET)printf "\nInstallation successful.\n"
|
|
|
|
.PHONY: libuninstall
|
|
libuninstall:
|
|
$(QUIET)printf "\nUninstalling library with ocamlfind\n"
|
|
$(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
|
|
$(QUIET)printf "\nUninstallation successful.\n"
|
|
|
|
.PHONY: rawinstall
|
|
rawinstall: all
|
|
$(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
|
|
-install -d $(OCAML_LIB_INSTALL)
|
|
for i in $(LIBINSTALL_FILES); do \
|
|
if [ -f $$i ]; then \
|
|
install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
|
|
fi; \
|
|
done
|
|
$(QUIET)printf "\nInstallation successful.\n"
|
|
|
|
.PHONY: rawuninstall
|
|
rawuninstall:
|
|
$(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
|
|
cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
|
|
$(QUIET)printf "\nUninstallation successful.\n"
|
|
|
|
###########################################################################
|
|
# MAINTENANCE RULES
|
|
|
|
.PHONY: clean
|
|
clean::
|
|
rm -f $(TARGETS) $(TRASH)
|
|
rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
|
|
|
|
.PHONY: cleanup
|
|
cleanup::
|
|
rm -f $(NONEXECS) $(TRASH)
|
|
rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
|
|
|
|
.PHONY: clean-doc
|
|
clean-doc::
|
|
rm -rf $(DOC_DIR)/$(RESULT)
|
|
|
|
.PHONY: clean-all
|
|
clean-all:: clean clean-doc
|
|
|
|
.PHONY: nobackup
|
|
nobackup:
|
|
rm -f *.bak *~ *.dup
|