Files

179 lines
5.6 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)) $(patsubst %.ml,%.cmx,$(LIB_GEN_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)) $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmo,$(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) $(RUNTIME_BYTE) $(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 =
LIB_GEN_ML =
ifneq ($(wildcard $(SRC_DIR)/lexer.mll),)
GEN += $(BUILD)/lexer.ml
LIB_GEN_ML += $(BUILD)/lexer.ml
endif
ifneq ($(wildcard $(SRC_DIR)/parser.mly),)
GEN += $(BUILD)/parser.ml $(BUILD)/parser.mli
LIB_GEN_ML += $(BUILD)/parser.ml
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: $(MAKEFILE_LIST) $(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: $(MAKEFILE_LIST) $(SRC_ML) $(RT_ML) $(TEST_ML) $(GEN) | $(BUILD)
{ echo -n "LIB_ORDER = " ; $(OCAMLDEP) -sort $(LIB_ML) $(LIB_GEN_ML) | sed -e 's|$(SRC_DIR)/\([^ ]*\)\.ml|$(BUILD)/\1.cmx|g' -e 's|$(BUILD)/\([^ ]*\)\.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 ; } >> $@
{ echo -n "TEST_ORDER = " ; $(OCAMLDEP) -sort $(TEST_ML) | sed -e 's|$(TEST_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) $(RUNTIME_ARCHIVE) $(LIB_ARCHIVE) $(BUILD)/main.cmx
$(RUNTIME_ARCHIVE) $(RUNTIME_NATIVE): $(RT_CMX)
ifeq ($(strip $(RT_ML)),)
@echo "no runtime sources"
else
$(OCAMLOPT) -a -o $@ $(RT_ORDER)
endif
$(RUNTIME_BYTE): $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmo,$(RT_ML))
$(OCAMLC) -a -o $@ $(patsubst $(RUNTIME_DIR)/%.ml,$(BUILD)/%.cmo,$(RT_ML))
ifeq ($(strip $(TEST_ML)),)
TEST_EXE =
else
$(TEST_EXE): $(TEST_CMX) $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE)
$(OCAMLOPT) $(FLAGS) -o $@ $(LIBS) $(RUNTIME_ARCHIVE) $(LIB_ARCHIVE) $(TEST_ORDER)
endif
ifeq ($(strip $(BENCH_ML)),)
BENCH_EXE =
else
$(BENCH_EXE): $(BUILD)/bench.cmx $(LIB_ARCHIVE) $(RUNTIME_ARCHIVE) deltac
$(OCAMLOPT) $(FLAGS) -o $@ $(LIBS) $(RUNTIME_ARCHIVE) $(LIB_ARCHIVE) $(BUILD)/bench.cmx
endif
test: $(TEST_EXE)
DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) DELTA_RUNTIME_DIR=$(CURDIR)/$(BUILD) DELTA_OCAMLOPT="$(OCAMLOPT)" ./$(TEST_EXE)
bench: $(BENCH_EXE)
DELTA_ROOT=$(CURDIR) DELTA_BUILD_DIR=$(CURDIR)/$(BUILD) DELTA_OCAMLOPT="$(OCAMLOPT)" ./$(BENCH_EXE)
install: deltac $(RUNTIME_ARCHIVE) $(RUNTIME_BYTE)
$(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