summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile118
1 files changed, 118 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f4c728d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,118 @@
+################################################################################
+## USER CONFIGURATION OPTIONS ##################################################
+################################################################################
+## Main Directories
+SRC_DIR ?= ${CURDIR}/src
+CONFIG_DIR ?= ${CURDIR}/conf
+
+## Optional Directories
+BIN_DIR ?= ${CURDIR}/ebin
+INCLUDE_DIR ?= ${CURDIR}/include
+
+## Local only?
+#ERL_NAME_VS_SNAME ?= -name
+ERL_NAME_VS_SNAME ?= -sname
+
+## Binaries
+ERLC ?= erlc
+ERLC_OPTS ?=
+
+DIALYZER ?= dialyzer
+DIALYZER_OPTS ?=
+
+M4 ?= m4
+M4_OPTS ?=
+
+## Filenames
+DIALYZER_BASE_PLT_FILE ?= base.plt
+DIALYZER_PLT_FILE ?= ataxia.plt
+
+
+################################################################################
+## MAKEFILE MAGIC ##############################################################
+################################################################################
+## General
+OPTIONAL_DIRS = $(BIN_DIR) $(INCLUDE_DIR)
+
+## Preprocessor
+PREPROCESSOR_CONFIG_FILES = $(shell find -L $(CONFIG_DIR) -name "*.m4.conf")
+PREPROCESSABLE_FILES = $(shell find -L ${CURDIR} -name "*.m4")
+PREPROCESSED_FILES = $(patsubst %.m4,%,$(PREPROCESSABLE_FILES))
+
+## Erlang
+PREPROCESSED_ERL_SRC_FILES = $(filter %.erl,$(PREPROCESSED_FILES))
+CURRENT_ERL_SRC_FILES = $(shell find -L $(SRC_DIR) -name "*.erl")
+ERL_SRC_FILES = \
+ $(filter-out $(PREPROCESSED_ERL_SRC_FILES),$(CURRENT_ERL_SRC_FILES)) \
+ $(PREPROCESSED_ERL_SRC_FILES)
+ERL_BIN_FILES = $(patsubst $(SRC_DIR)%.erl,$(BIN_DIR)/%.beam,$(ERL_SRC_FILES))
+
+## Binaries
+ERLC_EXEC = $(ERLC) $(ERLC_OPTS)
+ERL_EXEC = $(ERL) $(ERL_OPTS)
+DIALYZER_EXEC = $(DIALYZER) $(DIALYZER_OPTS)
+M4_EXEC = $(M4) $(M4_OPTS)
+
+################################################################################
+## SANITY CHECKS ###############################################################
+################################################################################
+
+################################################################################
+## PREPROCESSOR-VISIBLE MAKEFILE VARIABLES #####################################
+################################################################################
+MAKEFILE_TO_M4 = \
+ --define=__MAKEFILE_BIN_DIR=$(BIN_DIR) \
+ --define=__MAKEFILE_LOG_DIR=$(LOG_DIR) \
+ --define=__MAKEFILE_INCLUDE_DIR=$(INCLUDE_DIR)
+
+################################################################################
+## TARGET RULES ################################################################
+################################################################################
+all: build
+
+debug: debug_run
+
+build: $(OPTIONAL_DIRS) $(PREPROCESSED_FILES) $(ERL_BIN_FILES)
+
+clean:
+ # Preprocessor
+ rm -rf $(PREPROCESSED_FILES)
+ # Erlang
+ rm -rf $(BIN_DIR)/*
+
+reset:
+ # Preprocessor
+ rm -rf $(PREPROCESSED_FILES)
+ rm -rf $(OPTIONAL_DIRS)
+
+################################################################################
+## INTERNAL RULES ##############################################################
+################################################################################
+debug_rebuild:
+ $(MAKE) clean
+ $(MAKE) ERLC_OPTS="$(ERLC_OPTS) +debug_info"
+
+$(DIALYZER_BASE_PLT_FILE):
+ $(DIALYZER_EXEC) --build_plt --apps erts kernel stdlib crypto mnesia \
+ --output_plt $@
+
+debug_run: $(DIALYZER_BASE_PLT_FILE)
+ $(MAKE) debug_rebuild
+ cp $< $(DIALYZER_PLT_FILE)
+ $(DIALYZER_EXEC) --add_to_plt --get_warnings --plt $(DIALYZER_PLT_FILE) -r $(BIN_DIR)
+ $(DIALYZER_EXEC) --check_plt --plt $(DIALYZER_PLT_FILE)
+ $(DIALYZER_EXEC) --get_warnings $(ERL_SRC_FILES) $(PREPROCESSED_ERL_SRC_FILES)\
+ --src --plt $(DIALYZER_PLT_FILE)
+
+$(PREPROCESSED_FILES): %: %.m4 .PHONY
+ $(M4_EXEC) -P $(MAKEFILE_TO_M4) $(PREPROCESSOR_CONFIG_FILES) $< > $@
+
+$(OPTIONAL_DIRS): %:
+ mkdir -p $@
+
+$(ERL_BIN_FILES): $(BIN_DIR)/%.beam: $(SRC_DIR)/%.erl
+ mkdir -p $(dir $@)
+ $(ERLC_EXEC) -o $(dir $@) $<
+
+.PHONY:
+