summaryrefslogtreecommitdiff
blob: 143d114c7da8a6f6d33b5fabbedbcca4e824b73f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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 ?= -I $(INCLUDE_DIR)

DIALYZER ?= dialyzer
DIALYZER_OPTS ?= -I $(INCLUDE_DIR)

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: