-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
177 lines (137 loc) · 6.05 KB
/
Makefile
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
# Каталоги
IDIR = include
CDIR = src
ODIR = bin
TEXDIR = tex
TEXINCDIR = $(TEXDIR)/include
DOXDIR = doxygen
UDIR = utils
DOTDIR = dot
# Утилитки
MAKE2DOT = $(UDIR)/makefile2dot
MAKESIMPLE = $(UDIR)/makesimple
RE2TEX = $(UDIR)/re2tex
FSM2DOT = $(UDIR)/fsm2dot
CFLOW=cflow --level "0= "
CFLOW2DOT=$(UDIR)/cflow2dot
# Файл cflow.ignore содержит список функций,
# исключаемых из графов вызовов.
SIMPLECFLOW=grep -v -f cflow.ignore
SRC2TEX=$(UDIR)/src2tex
# Главная программа
PROG = rip_router
# Отчёт
REPORT = report.pdf
# Компилятор С
CC = gcc
# Флаги компиляции
CFLAGS = -I$(IDIR) -Wall -std=gnu99
# -Werror
# Флаги сборки
LDFLAGS += $(shell autoopts-config ldflags)
# latex -> pdf
PDFLATEX = pdflatex -interaction=nonstopmode
# Файл с регулярными выражениями
RE_FILE = $(IDIR)/server-re.h
# Файл с графом процесса сборки программы
Makefile_1.dot = $(DOTDIR)/Makefile_1.dot
# По-умолчанию и по make all собираем и отчёт и программу.
# Отдельно отчёт собирается как make report
all: $(PROG) # $(REPORT)
# Добавляются имена сгенерённых файлов.
# GENINCLUDES = $(IDIR)/checkoptn.h $(IDIR)/server-fsm.h
INCLUDES = $(wildcard $(IDIR)/*.h $(IDIR)/lib/*.h) $(IDIR)/checkoptn.h $(IDIR)/server-fsm.h
CSRC = $(wildcard $(CDIR)/*.c $(CDIR)/lib/*.c)
#CSRC = $(addprefix src/, main.c) # $(addprefix src/, checkoptn.c server-fsm.c server.c server-cmd.c server-parse.c server-run.c server-state.c)
# Объектные файлы. Обычно, наоборот, по заданному списку объектных получают
# список исходных файлов. ЕНо мне лень.
OBJS = $(patsubst $(CDIR)/%, $(ODIR)/%, $(patsubst %.c,%.o,$(CSRC)))
TOBJS = $(patsubst $(CDIR)/tests/%, $(ODIR)/tests/%, $(patsubst %.c,%.o,$(TSRC)))
# Файлы latex
TEXS = $(wildcard $(TEXDIR)/*.tex)
# Кодогенерация: разбор параметров командной строки
#$(CDIR)/checkoptn.c: $(CDIR)/checkoptn.def
# cd $(CDIR) && SHELL=/bin/sh autogen checkoptn.def
#$(IDIR)/checkoptn.h: $(CDIR)/checkoptn.def
# cd $(CDIR) && SHELL=/bin/sh autogen checkoptn.def
# mv -f $(CDIR)/checkoptn.h $(IDIR)
# Кодогенерация: конечный автомат
$(CDIR)/rip-fsm.c: $(CDIR)/rip.def
cd $(CDIR) && autogen rip.def
$(IDIR)/rip-fsm.h: $(CDIR)/rip.def
cd $(CDIR) && autogen rip.def
mv -f $(CDIR)/rip-fsm.h $(IDIR)
# Сгенерённый код компилируется особым образом
# (как того требует инструкция).
$(ODIR)/checkoptn.o: $(CDIR)/checkoptn.c
$(CC) -c -I $(IDIR) -DTEST_CHECK_OPTS `autoopts-config cflags` -o $@ $<
# Сгенерённый код компилируется особым образом (костыли).
$(ODIR)/rip-fsm.o: $(CDIR)/rip-fsm.c
$(CC) -I $(IDIR) -Wall -o $@ -c $<
$(DOTDIR)/%_def.dot: $(CDIR)/%.def
$(FSM2DOT) $< > $@
# .dot -> _dot.tex
$(TEXINCDIR)/%_dot.tex: $(DOTDIR)/%.dot
dot2tex -ftikz --autosize --crop $< > $@
# _dot.tex -> _dot.pdf
$(TEXINCDIR)/%_dot.pdf: $(TEXINCDIR)/%_dot.tex
$(PDFLATEX) -output-directory $(TEXINCDIR) $<
$(TEXINCDIR)/%_re.tex: $(RE_FILE)
$(RE2TEX) $(RE_FILE) $(TEXINCDIR)
$(ODIR)/%.o: $(CDIR)/%.c $(INCLUDES) # $(GENINCLUDES)
$(CC) -c $(CFLAGS) -o $@ $<
$(PROG): $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
$(TESTS): $(TOBJS) $(filter-out bin/$(PROG).o, $(OBJS))
$(CC) -o $@ $^ $(LDFLAGS) -lcunit
# Отчёт. PDFLATEX вызывается дважды для нормального
# создания ссылок, это НЕ опечатка.
$(REPORT): $(TEXS) doxygen $(addprefix $(TEXINCDIR)/, Makefile_1_dot.pdf rip_def_dot.pdf checkoptn.def.tex)
# $(addprefix $(TEXINCDIR)/, Makefile_1_dot.pdf re_cmd_quit_re.tex re_cmd_user_re.tex cflow01_dot.pdf cflow02_dot.pdf checkoptn.def.tex)
cd $(TEXDIR) && $(PDFLATEX) report.tex && $(PDFLATEX) report.tex && cp $(REPORT) ..
# Это сокращённый файл параметров программы дял отчёта,
# берутся строки, начиная с восьмой, строки с descrip -- удаляются.
$(TEXINCDIR)/checkoptn.def.tex: $(CDIR)/checkoptn.def
$(SRC2TEX) $< 8 | grep -v descrip > $@
# Файл simplest.mk -- это упрощёный makefile, промежуточная стадия
# для созданя графа сборки программы
simplest.mk: Makefile
sed 's/$$(INCLUDES)//' Makefile | $(MAKESIMPLE) > simplest.mk
$(DOTDIR)/cflow01.dot: $(addprefix $(CDIR)/, server.c server-state.c server-parse.c server-run.c server-fsm.c server-cmd.c)
$(CFLOW) $^ | $(SIMPLECFLOW) | $(CFLOW2DOT) > $@
$(DOTDIR)/cflow02.dot: $(addprefix $(CDIR)/, server-cmd.c server-parse.c server-fsm.c)
$(CFLOW) $^ | $(SIMPLECFLOW) | $(CFLOW2DOT) > $@
$(Makefile_1.dot): $(MAKE2DOT) simplest.mk
$(MAKE2DOT) $(PROG) < simplest.mk > $(Makefile_1.dot)
# Тестирование
.PHONY: tests
tests: test_units test_memory test_style test_system
.PHONY: test_units
test_units: $(TESTS)
#bin/tests/run
.PHONY: test_style
test_style:
echo Сделайте сами на основе astyle.sourceforge.net или checkpatch.pl
echo Для инженеров -- не обязательно
.PHONY: test_memory
test_memory: $(TESTS)
#valgrind ./rip_router
.PHONY: test_system
test_system: $(PROG)
echo Сделайте сами на основе тестирования через netcat и/или скриптов на python/perl/etc.
# ./$(PROG) -p 1025 -f tests/test01.cmds
# Документация
# .PHONY: report
report: $(REPORT)
.PHONY: doxygen
doxygen: doxygen.cfg $(CSRC) $(INCLUDES)
doxygen doxygen.cfg
mkdir -p $(TEXINCDIR)
cp $(DOXDIR)/latex/*.tex $(TEXINCDIR)
cp $(DOXDIR)/latex/*.sty $(TEXDIR)
.PHONY: clean
clean:
rm -rf $(ODIR)/*.o $(CDIR)/*~ $(IDIR)/*~ $(TEXINCDIR)/* $(DOXDIR)/* $(DOTDIR)/*.dot; \
rm simplest.mk *~; \
rm ./rip_router ; \
find $(TEXDIR)/ -type f ! -name "*.tex" -exec rm -f {} \;