Commit 10ef3196 authored by Taddeüs Kroes's avatar Taddeüs Kroes

Initial AST definition and some template files

parents
._*/
*.cmo
*.cmi
*.cmx
*.swp
*.o
*.tgz
*.tar.gz
coffee
RESULT := coffee
#GLOBALS := ast_coffee
#PHASES :=
#SOURCES := $(addsuffix .mli,$(GLOBALS)) $(addsuffix .ml,$(GLOBALS)) \
# lexer.mll parser.mly main.mli \
# $(patsubst %,phases/%.mli,$(PHASES)) $(patsubst %,phases/%.ml,$(PHASES)) \
# main.ml
SOURCES := util.ml ast_coffee.ml traverse.ml main.ml
LIBS := str unix
# Set debugging flag to enable exception backtraces for OCAMLRUNPARAM=b
OCAMLFLAGS := -g #-pp camlp4o
.PHONY: all
all: native-code
# The Types module needs an implementation file to stop ocamlc from complaining
#types.ml: types.mli
# cp $< $@
include OCamlMakefile
###########################################################################
# 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 := unix.cma threads.cma $(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 := unix.cmxa threads.cmxa $(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
open Util
(* AST nodes *)
type ast = block
and block = stmt list
and stmt =
| Return of value option
| Comment of string
| Expr_stmt of value
and value =
| Fun of value list * block * bool
| Call of value * value list
| Object of (string * value) list
| Array of value list
| Index of value * value
| Range of value option * value option * bool
| Try of block * block * block
| Throw of value
| New of value * value list
| Class of string option * value option * class_body
| Binop of binop * value * value
| Monop of monop * value
| Chainop of value * (binop * value) list
| If of value * block * block
| For of value * value option * binop * value * block
| While of value * block
| Switch of value * (value list * block) list * block
| Assign of value * value
| Property of value * string
| Regex of string * string
| Number of float
| String of string
| Var of string
| Js of string
| This
| Null
| Undefined
| True
| False
| Param of string
| Default of value * value
| Splat of value option
and class_body = class_stmt list
and class_stmt =
| Unnamed_expr of value
| Prototype_property of string * value
and binop =
| Eq | Ne | Gt | Ge | Lt | Le
| And | Or
| In | Of
| Plus | Minus | Times | Div | Mod
| Div_trunc | Pow | Mod_math
and monop =
| Not | Exists
| Neg | Pos
(* Stringification *)
let rec string_of_ast tree = string_of_block tree ^ "\n"
and string_of_block block = cat "\n" string_of_stmt block
and string_of_stmt = function
| Return None -> "return"
| Return (Some value) -> "return " ^ string_of_value value
| Comment comment -> prefix_lines "# " comment
| Expr_stmt value -> string_of_value value
and string_of_value = function
| Fun (params, body, is_bound) ->
let params =
match params with
| [] -> ""
| _ -> "(" ^ cat ", " string_of_value params ^ ") "
in
let glyph = if is_bound then "=>" else "->" in
params ^ glyph ^ inline_block "" body
| Call (fn, args) ->
string_of_value fn ^ "(" ^ cat ", " string_of_value args ^ ")"
| Object key_value_pairs ->
let string_of_pair (key, value) = key ^ string_of_value value in
"{" ^ cat ", " string_of_pair key_value_pairs ^ "}"
| Array elements ->
"[" ^ cat ", " string_of_value elements ^ "]"
| Index (arr, (Range _ as range)) ->
string_of_value arr ^ string_of_value range
| Index (arr, idx) ->
string_of_value arr ^ "[" ^ string_of_value idx ^ "]"
| Range (lbnd, ubnd, inclusive) ->
let splat = if inclusive then ".." else "..." in
let s = function None -> "" | Some v -> string_of_value v in
"[" ^ s lbnd ^ splat ^ s ubnd ^ "]"
| Try (body, catch, finally) ->
let s pre = function [] -> "" | b -> pre ^ indent_block b in
"try" ^ indent_block body ^ "\n" ^
s "catch" catch ^ "\n" ^
s "finally" finally
| Throw value ->
"throw " ^ string_of_value value
| New (cls, args) ->
"new " ^ string_of_value cls ^ "(" ^ cat ", " string_of_value args ^ ")"
| Class (name, parent, body) ->
let cls =
match name with
| None -> "class"
| Some name -> "class " ^ name
in
let extends =
match parent with
| None -> ""
| Some parent -> " extends " ^ string_of_value parent
in
let body =
let string_of_class_stmt = function
| Unnamed_expr value ->
string_of_value value
| Prototype_property (name, value) ->
name ^ ": " ^ string_of_value value
in
match body with
| [] -> failwith "empty body"
| body -> "\n" ^ indent (cat "\n" string_of_class_stmt body)
in
cls ^ extends ^ body
| Binop (op, left, right) ->
"(" ^ string_of_value left ^
" " ^ string_of_binop op ^ " " ^
string_of_value right ^ ")"
| Monop (Exists, opnd) ->
string_of_value opnd ^ "?"
| Monop (op, opnd) ->
let op =
match op with
| Not -> "not"
| Neg -> "-"
| Pos -> "+"
| _ -> failwith "this cannot happen"
in
op ^ string_of_value opnd
| Chainop (hd, tl) ->
let rec s = function
| [] ->
failwith "invalid chained operator"
| [(op, opnd)] ->
string_of_binop op ^ " " ^ string_of_value opnd
| (op, opnd) :: tl ->
string_of_binop op ^ " " ^ string_of_value opnd ^ " " ^ s tl
in
string_of_value hd ^ " " ^ s tl
| If (cond, [], _) ->
failwith "empty if-body"
(*
| If (cond, [if_expr], []) ->
"if " ^ string_of_value cond ^ " then " ^ string_of_value if_expr
| If (cond, [if_expr], [else_expr]) ->
"if " ^ string_of_value cond ^ " then " ^ string_of_value if_expr ^
" else " ^ string_of_value else_expr
*)
| If (cond, if_body, []) ->
"if " ^ string_of_value cond ^ indent_block if_body
| If (cond, if_body, else_body) ->
"if " ^ string_of_value cond ^ indent_block if_body ^
"\nelse" ^ indent_block else_body
| For (value, index, op, arr, body) ->
let preamble =
let iterator =
let value = string_of_value value in
match index with
| None -> value
| Some index -> value ^ ", " ^ string_of_value index
in
"for " ^ iterator ^ " " ^ string_of_binop op ^ " " ^ string_of_value arr
in
begin
match body with
| [] -> failwith "empty loop body"
| [stmt] -> string_of_stmt stmt ^ preamble
| _ -> preamble ^ indent_block body
end
| While (cond, body) ->
"while " ^ string_of_value cond ^ indent_block body
| Switch (value, when_cases, default_case) ->
let string_of_when (match_values, body) =
"\nwhen " ^ cat ", " string_of_value match_values ^
inline_block "then" body
in
"switch " ^ string_of_value value ^
indent (cat "" string_of_when when_cases) ^
inline_block "else" default_case
| Assign (left, right) ->
string_of_value left ^ " = " ^ string_of_value right
| Property (obj, prop) ->
string_of_value obj ^ "." ^ prop
| Regex (pattern, modifiers) ->
"/" ^ pattern ^ "/" ^ modifiers
| Number n -> string_of_number n
| String s -> "\"" ^ s ^ "\""
| Var name -> name
| Js js -> "`" ^ js ^ "`"
| This -> "this"
| Null -> "null"
| Undefined -> "undefined"
| True -> "true"
| False -> "false"
| Param name -> name
| Default (Param name, value) ->
name ^ "=" ^ string_of_value value
| Default _ ->
failwith "Default can only have Param as first child"
| Splat None ->
"..."
| Splat (Some value) ->
string_of_value value ^ "..."
and string_of_number n = string_of_float n (* FIXME *)
and string_of_binop = function
| Eq -> "is"
| Ne -> "isnt"
| Gt -> ">"
| Ge -> ">="
| Lt -> "<"
| Le -> "<="
| And -> "and"
| Or -> "or"
| In -> "in"
| Of -> "of"
| Plus -> "+"
| Minus -> "-"
| Times -> "*"
| Div -> "/"
| Mod -> "%"
| Div_trunc -> "//"
| Pow -> "**"
| Mod_math -> "%%"
and indent_block = function
| [] -> failwith "empty block"
| stmts -> "\n" ^ indent (string_of_block stmts)
and inline_block prefix = function
| [] -> ""
| [stmt] -> prefix ^ " " ^ string_of_stmt stmt
| stmts -> indent_block stmts
open Ast_coffee
let () =
let f = Chainop (Var "a", [(Lt, Var "b"); (Le, Var "c"); (Eq, Var "d")]) in
print_endline (string_of_value f)
module C = Ast_coffee
type location = int * int * int * int
type location_box =
| Loc_stmt of C.stmt
| Loc_class_stmt of C.class_stmt
| Loc_value of C.value
type location_pair = location * location_box
let tab = " "
let prefix_lines prefix = Str.global_replace (Str.regexp "^\\(.\\)") (prefix ^ "\\1")
let indent = prefix_lines tab
let rec cat sep fn = function
| [] -> ""
| [hd] -> fn hd
| hd :: tl -> fn hd ^ sep ^ cat sep fn tl
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment