-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathglobal_controller.mk
265 lines (198 loc) · 7.64 KB
/
global_controller.mk
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
DYNAMIC_SCHEDULING=0
DEBUG = 1
LOGS = \
INFO \
ERROR \
WARN \
CRITICAL \
CUSTOM \
SCHEDULING_DECISIONS \
#RUNTIME_MESSAGES \
EPOLL_OPS
#RUNTIME_MESSAGES \
SCHEDULING \
#SCHEDULING_DECISIONS \
API_CALLS \
#ALL
NO_LOGS = \
STAT_SERIALIZATION
SRC_DIR = src/
GLC_DIR = $(SRC_DIR)global_controller/
COM_DIR = $(SRC_DIR)common/
TST_DIR = test/
MYSQL_DIR = /usr/local/share/mysql/
LD_RUN_PATH:=${MYSQL_DIR}/lib/
SRC_DIRS = $(GLC_DIR) $(COM_DIR)
TARGET=global_controller
MAIN=$(GLC_DIR)main.c
BLD_DIR = build/
DEP_DIR = $(BLD_DIR)depends/
OBJ_DIR = $(BLD_DIR)objs/
TST_BLD_DIR = $(BLD_DIR)test/
RES_DIR = $(TST_BLD_DIR)reults/
COV_DIR = $(TST_BLD_DIR)coverage/
BLD_DIRS = $(BLD_DIR) $(DEP_DIR) $(OBJ_DIR) $(RES_DIR)
CLEANUP=rm -f
CLEAN_DIR=rm -rf
MKDIR=mkdir -p
OPTIM=0
CC:=gcc
CXX:=g++
COMPILE=$(CC) -c
COMPILE_PP=$(CXX) -c
DEPEND=$(CC) -MM -MF
DEPEND_PP=$(CXX) -MM -MF
FINAL=$(CXX)
FINAL_TEST=$(CC)
SELF=./global_controller.mk
LOG_DEFINES=$(foreach logname, $(LOGS), -DLOG_$(logname)) \
$(foreach logname, $(NO_LOGS), -DNO_LOG_$(logname))
CFLAGS=-Wall -pthread -O$(OPTIM) $(LOG_DEFINES)
CC_EXTRAFLAGS = --std=gnu99
ifeq ($(MAKECMDGOALS), $(filter $(MAKECMDGOALS),coverage init_cov cov-site))
CFLAGS+= -fprofile-arcs -ftest-coverage --coverage
OPTIM=0
endif
ifeq ($(DEBUG), 1)
CFLAGS+=-ggdb
endif
ifeq ($(DYNAMIC_SCHEDULING), 1)
CFLAGS+=-DDYN_SCHED
endif
RESOURCE_EXTS=.txt .json
TST_DIRS = $(subst $(COM_DIR),,$(patsubst $(SRC_DIR)%/, $(TST_DIR)%/, $(SRC_DIRS)))
TSTS = $(foreach TST_D, $(TST_DIRS), $(wildcard $(TST_D)*.c))
TST_MKS = $(foreach TST_D, $(TST_DIRS), $(wildcard $(TST_D)*.mk))
TST_RSCS = $(foreach TST_D, $(TST_DIRS), $(foreach EXT, $(RESOURCE_EXTS), $(wildcard $(TST_D)*$(EXT))))
TST_OBJS = $(patsubst $(TST_DIR)%.c, $(TST_BLD_DIR)%.o, $(TSTS))
SRCS = $(foreach src_dir, $(SRC_DIRS), $(wildcard $(src_dir)*.c))
SRCS_PP = $(foreach src_dir, $(SRC_DIRS), $(wildcard $(src_dir)*.cc))
TST_BLDS = $(patsubst $(TST_DIR)%.c, $(TST_BLD_DIR)%.out, $(TSTS))
TST_COV = $(patsubst $(TST_DIR)%.c, $(TST_BLD_DIR)%.gcda, $(TSTS)) \
$(patsubst $(TST_DIR)%.c, $(TST_BLD_DIR)%.gcno, $(TSTS))
COV_DIRS = $(sort $(dir $(patsubst $(SRC_DIR)%/, $(COV_DIR)%, $(SRC_DIRS)) $(COV_DIR)))
COV_INFOS = $(patsubst $(SRC_DIR)%/, $(COV_DIR)%.info, $(SRC_DIRS))
COV_INDEX = $(COV_DIR)index.html
RESULTS = $(patsubst $(TST_DIR)%.c, $(RES_DIR)%.txt, $(TSTS))
MEM_RESULTS = $(patsubst $(TST_DIR)%.c, $(RES_DIR)%_memcheck.txt, $(TSTS))
TST_BLD_RSCS = $(patsubst $(TST_DIR)%, $(TST_BLD_DIR)%, $(TST_RSCS))
DEP_DIRS = $(patsubst $(SRC_DIR)%/, $(DEP_DIR)%/, $(SRC_DIRS))
DEP_TST = $(patsubst $(TST_DIR)%.c, $(DEP_DIR)%.d, $(TSTS))
DEP_SRC = $(patsubst $(SRC_DIR)%.c, $(DEP_DIR)%.d, $(SRCS)) \
$(patsubst $(SRC_DIR)%.cc, $(DEP_DIR)%.d, $(SRCS_PP))
OBJ_DIRS = $(patsubst $(SRC_DIR)%/, $(OBJ_DIR)%/, $(SRC_DIRS))
OBJECTS = $(patsubst $(SRC_DIR)%.c, $(OBJ_DIR)%.o, $(SRCS)) \
$(patsubst $(SRC_DIR)%.cc, $(OBJ_DIR)%.o, $(SRCS_PP))
OBJECTS_NOMAIN = $(patsubst $(SRC_DIR)%.c, $(OBJ_DIR)%.o, $(filter-out $(MAIN), $(SRCS)))
TST_BLD_DIRS = $(patsubst $(SRC_DIR)%/, $(TST_BLD_DIR)%/, $(SRC_DIRS))
RES_DIRS = $(patsubst $(SRC_DIR)%/, $(RES_DIR)%/, $(SRC_DIRS))
INCS=$(GLC_DIR) $(COM_DIR) $(MYSQL_DIR)include
CFLAGS += $(foreach inc, $(INCS), -I$(inc))
CFLAGS += -L$(MYSQL_DIR)lib -lmysqlclient -lzmq
define test_dep_name
$(notdir $(subst Test_,,$1))_DEPS
endef
define test_filters
$(subst Test_,, $(patsubst $(TST_BLD_DIR)%, $(OBJ_DIR)%.o, $1)) \
$(foreach dep, $($(call test_dep_name, $1)), $(OBJ_DIR)$(dep:.c=.o))
endef
CCFLAGS=$(CFLAGS) $(CC_EXTRAFLAGS)
CPPFLAGS=$(CFLAGS) $(CPP_EXTRAFLAGS)
TEST_CFLAGS= $(CCFLAGS) -I$(TST_DIR) `pkg-config --libs check` -lrt -lc -lm -O0
ifneq ($(MAKECMDGOALS),)
# If goals are present, and they include coverage
ifeq ($(MAKECMDGOALS), $(filter $(MAKECMDGOALS), coverage init_cov cov-site cov))
TEST_CFLAGS+=-fprofile-arcs -ftest-coverage --coverage
endif
endif
DIRS=$(BLD_DIRS) $(OBJ_DIRS) $(DEP_DIRS) $(TST_BLD_DIRS) $(RES_DIRS) $(COV_DIRS)
all: dirs ${TARGET}
dirs: $(DIRS)
depends: $(DEP_DIRS) ${DEP_SRC}
coverage: test $(COV_DIR) $(TST_COV) $(COV_INFOS)
cov-site: coverage
genhtml -o $(COV_DIR) $(shell find $(COV_DIR) -name '*.info' ! -empty)
cd $(COV_DIR) && python2 -m SimpleHTTPServer 8081
$(TST_BLD_DIR)%.gcda: $(TST_BLD_DIR)%.out $(DIRS)
lcov: $(DIRS) $(TST_COV) $(COV_INFOS)
$(COV_DIR)%.info: $(TST_BLD_DIR)%/ $(TST_BLDS)
-lcov --directory $< --capture --output-file $(subst .info,.raw_info,$@) --test-name $(subst .info,,$@)
-lcov --no-recursion --directory $(patsubst $(TST_BLD_DIR)%,$(OBJ_DIR)%,$<) --capture --initial --output-file $(subst .info,.init_info,$@) --test-name $(subst .info,,$@)
-lcov -a $(subst .info,.raw_info,$@) -a $(subst .info,.init_info,$@) -o $(subst .info,.all_info,$@) --test-name $(subst .info,,$@)
-lcov --remove $(subst .info,.all_info,$@) 'test/*' '/usr/*' 'src/legacy/*' -o $@ --test-name $(subst .info,,$@)
$(TARGET): ${OBJECTS} ${LEG_OBJ}
$(FINAL) -o $@ $^ $(CFLAGS) -Wl,-rpath,${LD_RUN_PATH}
test unit: all $(TST_BLD_RSCS) test-results
memcheck: test $(MEM_RESULTS)
@for FILE in $(filter-out test, $^); do \
echo ___ $$FILE ___ ; \
if grep -q "definitely lost: [^0]" "$$FILE"; then \
grep --color=never '\(\*\*\*\*\*.*\*\*\*\*\)\|\(definitely lost: [^0]\)' "$$FILE" | sed s/==/`printf "\\033[032m"==`/g ;\
tput sgr0; \
else \
echo "Nothing definitely lost!"; \
fi \
done;
test-blds: $(TST_OBJS) $(TST_BLDS) $(TST_BLD_RSCS)
test-results: all test-blds $(RESULTS)
@echo "-----------------------\nTEST OUTPUT:\n-----------------------"
@for FILE in $(filter-out all test-blds, $^); do \
if grep -q ":[FE]:" "$$FILE"; then \
echo ___ $$FILE ___ ; \
cat $$FILE; \
else \
echo ___ $$FILE ___ ; \
tail -1 $$FILE; \
fi \
done
@echo "-----------------------\nFAILURES:\n-----------------------"
@-grep -s ":F:" $^; echo "";
@echo "-----------------------\nERRORS:\n-----------------------"
@-grep -s ":E:" $^; echo "";
@echo "\nDONE"
@if grep -q ":[FE]:" $(filter-out all test-blds, $^); then \
false;\
fi
$(RES_DIR)%_memcheck.txt: $(TST_BLD_DIR)%.out
-valgrind --track-origins=yes --leak-check=full $< > $@ 2>&1
# Output the results of the tests by executing each of the builds
# of the tests. Output STDOUT and STDERR to the name of the rule
$(RES_DIR)%.txt: $(TST_BLD_DIR)%.out
-./$< > $@ 2>&1
$(TST_BLD_DIR)%.o:: $(TST_DIR)%.c $(SELF)
$(COMPILE) $(TEST_CFLAGS) $< -o $@
# creates the test executables by linking the test objects with the build objects excluding
# the specific source under test
$(TST_BLD_DIR)%.out:: $(TST_BLD_DIR)%.o $(OBJECTS_NOMAIN) $(LEG_OBJ)
$(FINAL_TEST) -o $@ $(filter-out $(call test_filters, $(@:.out=)), $^) $(TEST_CFLAGS)
$(TST_BLD_DIR)%: $(TST_DIR)%
@cp $^ $@
# Creates object files from the source file
$(OBJ_DIR)%.o:: $(SRC_DIR)%.c $(SELF)
$(COMPILE) $(CCFLAGS) $< -o $@
$(OBJ_DIR)%.o:: $(SRC_DIR)%.cc $(SELF)
$(COMPILE_PP) $(CPPFLAGS) $< -o $@
$(DEP_SRC): $(DEP_DIRS)
$(DEP_DIR)%.d:: $(SRC_DIR)%.cc $(LEG_OBJ)
@$(DEPEND) $@ -MT $(patsubst $(DEP_DIR)%.d, $(OBJ_DIR)%.o, $@) $(CPPFLAGS) $<
$(DEP_DIR)%.d:: $(SRC_DIR)%.c $(LEG_OBJ)
@$(DEPEND) $@ -MT $(patsubst $(DEP_DIR)%.d, $(OBJ_DIR)%.o, $@) $(TEST_CFLAGS) $<
$(DEP_DIR)%.d:: $(TST_DIR)%.c $(LEG_OBJ)
@$(DEPEND) $@ -MT $(patsubst $(DEP_DIR)%.d, $(TST_BLD_DIR)%.o, $@) $(TEST_CFLAGS) $<
$(DIRS):
@$(MKDIR) $@
clean:
$(CLEAN_DIR) $(BLD_DIR)
$(foreach leg_lib, $(LEG_LIBS), $(CLEAN_DIR) $(PATH_SRC_LEG)$(leg_lib)/build)
$(CLEANUP) $(TARGET)
ifneq ($(MAKECMDGOALS), clean)
-include $(DEP_TST)
-include $(DEP_SRC)
-include $(TST_MKS)
endif
.PHONY: all
.PHONY: clean
.PHONY: test
.PHONY: legacy
.PHONY: depends
.PRECIOUS: $(DEP_DIR)%.d $(RES_DIR)%.txt $(OBJ_DIR)%.o $(TST_BLD_DIR)%.out