165 lines
4.7 KiB
Makefile
165 lines
4.7 KiB
Makefile
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
|