Add native build and compiler driver
This commit is contained in:
17 files changed
+833
No files matched your search
@@ -0,0 +1,164 @@
|
||||
PREFIX ?= /usr/local
|
||||
DESTDIR ?=
|
||||
|
||||
BINDIR = $(PREFIX)/bin
|
||||
LIBDIR = $(PREFIX)/lib/delta
|
||||
|
||||
OCAMLC ?= ocamlc
|
||||
OCAMLOPT ?= ocamlopt
|
||||
OCAMLDEP ?= ocamldep
|
||||
OCAMLLEX ?= ocamllex
|
||||
OCAMLYACC ?= ocamlyacc
|
||||
INSTALL ?= install
|
||||
RM = rm -f
|
||||
|
||||
SRC_DIR = src
|
||||
RUNTIME_DIR = runtime
|
||||
TEST_DIR = test
|
||||
BENCH_DIR = bench
|
||||
BUILD = _build
|
||||
|
||||
SRC_ML = $(wildcard $(SRC_DIR)/*.ml)
|
||||
LIB_ML = $(filter-out $(SRC_DIR)/main.ml,$(SRC_ML))
|
||||
RT_ML = $(wildcard $(RUNTIME_DIR)/*.ml)
|
||||
TEST_ML = $(wildcard $(TEST_DIR)/*.ml)
|
||||
BENCH_ML = $(wildcard $(BENCH_DIR)/*.ml)
|
||||
|
||||
LIB_CMX = $(patsubst $(SRC_DIR)/%.ml,$(BUILD)/%.cmx,$(LIB_ML))
|
||||
RT_CMX = $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmx,$(RT_ML))
|
||||
TEST_CMX = $(patsubst $(TEST_DIR)/%.ml,$(BUILD)/%.cmx,$(TEST_ML))
|
||||
|
||||
LIB_ARCHIVE = $(BUILD)/delta.cmxa
|
||||
RUNTIME_ARCHIVE = $(BUILD)/delta_runtime.cmxa
|
||||
RUNTIME_BYTE = $(BUILD)/delta_runtime.cma
|
||||
RUNTIME_NATIVE = $(BUILD)/delta_runtime.a
|
||||
RUNTIME_ARTIFACTS = $(RUNTIME_ARCHIVE) $(RUNTIME_NATIVE) $(RUNTIME_BYTE) \
|
||||
$(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmi,$(RT_ML)) $(RT_CMX)
|
||||
|
||||
ifeq ($(strip $(RT_ML)),)
|
||||
RUNTIME_ARCHIVE =
|
||||
RUNTIME_NATIVE =
|
||||
RUNTIME_ARTIFACTS =
|
||||
endif
|
||||
|
||||
TEST_EXE = $(BUILD)/test_main
|
||||
BENCH_EXE = $(BUILD)/bench
|
||||
|
||||
FLAGS = -I $(BUILD) -I +unix
|
||||
LIBS = unix.cmxa
|
||||
|
||||
.PHONY: all clean test bench install uninstall
|
||||
|
||||
all: deltac $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) $(TEST_EXE)
|
||||
|
||||
$(BUILD):
|
||||
mkdir -p $(BUILD)
|
||||
|
||||
$(BUILD)/%.cmi: $(SRC_DIR)/%.mli | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmo: $(SRC_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmx: $(SRC_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLOPT) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmi: $(RUNTIME_DIR)/%.mli | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmo: $(RUNTIME_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmx: $(RUNTIME_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLOPT) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmi: $(TEST_DIR)/%.mli | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmx: $(TEST_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLOPT) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmx: $(BENCH_DIR)/%.ml | $(BUILD)
|
||||
$(OCAMLOPT) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmx: $(BUILD)/%.ml | $(BUILD)
|
||||
$(OCAMLOPT) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmo: $(BUILD)/%.ml | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
$(BUILD)/%.cmi: $(BUILD)/%.mli | $(BUILD)
|
||||
$(OCAMLC) $(FLAGS) -c $< -o $@
|
||||
|
||||
GEN =
|
||||
ifneq ($(wildcard $(SRC_DIR)/lexer.mll),)
|
||||
GEN += $(BUILD)/lexer.ml
|
||||
endif
|
||||
ifneq ($(wildcard $(SRC_DIR)/parser.mly),)
|
||||
GEN += $(BUILD)/parser.ml $(BUILD)/parser.mli
|
||||
endif
|
||||
|
||||
$(BUILD)/lexer.ml: $(SRC_DIR)/lexer.mll | $(BUILD)
|
||||
$(OCAMLLEX) -o $@ $<
|
||||
|
||||
$(BUILD)/parser.ml: $(SRC_DIR)/parser.mly | $(BUILD)
|
||||
$(OCAMLYACC) -b $(BUILD)/parser $<
|
||||
|
||||
$(BUILD)/parser.mli: $(BUILD)/parser.ml ;
|
||||
|
||||
DEP_INCLUDES = -I $(SRC_DIR) $(if $(wildcard $(RUNTIME_DIR)),-I $(RUNTIME_DIR),) $(if $(wildcard $(TEST_DIR)),-I $(TEST_DIR),) -I $(BUILD)
|
||||
|
||||
INTERFACES = $(wildcard $(SRC_DIR)/*.mli) $(wildcard $(RUNTIME_DIR)/*.mli) $(wildcard $(TEST_DIR)/*.mli)
|
||||
|
||||
$(BUILD)/deps.d: $(SRC_ML) $(INTERFACES) $(RT_ML) $(TEST_ML) $(BENCH_ML) $(GEN) | $(BUILD)
|
||||
$(OCAMLDEP) $(DEP_INCLUDES) $(SRC_ML) $(INTERFACES) $(RT_ML) $(TEST_ML) $(BENCH_ML) $(GEN) > $(BUILD)/deps.tmp
|
||||
sed -e 's|$(SRC_DIR)/|$(BUILD)/|g' -e 's|$(RUNTIME_DIR)/|$(BUILD)/|g' \
|
||||
-e 's|$(TEST_DIR)/|$(BUILD)/|g' -e 's|$(BENCH_DIR)/|$(BUILD)/|g' \
|
||||
$(BUILD)/deps.tmp > $@
|
||||
$(RM) $(BUILD)/deps.tmp
|
||||
|
||||
-include $(BUILD)/deps.d
|
||||
|
||||
$(BUILD)/order.mk: $(SRC_ML) $(RT_ML) $(TEST_ML) | $(BUILD)
|
||||
{ echo -n "LIB_ORDER = " ; $(OCAMLDEP) -sort $(LIB_ML) | sed -e 's|$(SRC_DIR)/\([^ ]*\)\.ml|$(BUILD)/\1.cmx|g' ; echo ; } > $@
|
||||
{ echo -n "RT_ORDER = " ; $(OCAMLDEP) -sort $(RT_ML) | sed -e 's|$(RUNTIME_DIR)/\([^ ]*\)\.ml|$(BUILD)/\1.cmx|g' ; echo ; } >> $@
|
||||
|
||||
-include $(BUILD)/order.mk
|
||||
|
||||
$(LIB_ARCHIVE): $(LIB_CMX) $(BUILD)/order.mk
|
||||
$(OCAMLOPT) -a -o $@ $(LIB_ORDER)
|
||||
|
||||
deltac: $(BUILD)/main.cmx $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE)
|
||||
$(OCAMLOPT) $(FLAGS) -o $@ $(LIBS) $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) $(BUILD)/main.cmx
|
||||
|
||||
$(RUNTIME_ARCHIVE) $(RUNTIME_NATIVE): $(RT_CMX)
|
||||
ifeq ($(strip $(RT_ML)),)
|
||||
@echo "no runtime sources"
|
||||
else
|
||||
$(OCAMLOPT) -a -o $@ $(RT_CMX)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(TEST_ML)),)
|
||||
TEST_EXE =
|
||||
else
|
||||
$(TEST_EXE): $(TEST_CMX) $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE)
|
||||
$(OCAMLOPT) $(FLAGS) -o $@ $(LIBS) $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) $(TEST_CMX)
|
||||
endif
|
||||
|
||||
test: $(TEST_EXE)
|
||||
DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) ./$(TEST_EXE)
|
||||
|
||||
bench: $(BENCH_EXE)
|
||||
DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) ./$(BENCH_EXE)
|
||||
|
||||
install: deltac $(RUNTIME_ARCHIVE)
|
||||
$(INSTALL) -d $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL) -m 755 deltac $(DESTDIR)$(BINDIR)/deltac
|
||||
$(INSTALL) -m 644 $(RUNTIME_ARTIFACTS) $(DESTDIR)$(LIBDIR)/
|
||||
|
||||
uninstall:
|
||||
$(RM) $(DESTDIR)$(BINDIR)/deltac
|
||||
$(RM) $(patsubst $(BUILD)/%,$(DESTDIR)$(LIBDIR)/%,$(RUNTIME_ARTIFACTS))
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD) deltac
|
||||
Reference in new issue
Block a user