-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
107 lines (85 loc) · 3.41 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
SHELL = bash
CXX := $(shell echo $${CXX:-g++}) -std=c++$(shell echo $${ISOCPP:-26})
DEBUG != if (: $${NDEBUG:?}) 2>/dev/null; then :; else echo 1; fi
LOG != if (: $${LOG:?}) 2>/dev/null; then echo 1; fi
OFAST != if (: $${OFAST:?}) 2>/dev/null; then echo 1; fi
CXXDEBUG = -O0 -ggdb -g3 \
-fvar-tracking -gcolumn-info -femit-class-debug-always \
-gstatement-frontiers -fno-eliminate-unused-debug-types \
-fno-merge-debug-strings -ginline-points -gdescribe-dies \
-fno-eliminate-unused-debug-symbols -fno-omit-frame-pointer \
-ftrapv -fsanitize=undefined
CXXDIAGNO = -fdiagnostics-path-format=inline-events \
-fconcepts-diagnostics-depth=99 \
$(intcmp $(shell \
$(CXX) -v |& grep '^gcc version' - | awk -F' ' '{printf $$3}' | awk -F. '{print $$1}' \
), 13, \
, , -fdiagnostics-all-candidates) \
$(if \
$(shell if ((`$(CXX) -v |& grep '^gcc version' - | awk -F' ' '{printf $$3}' | awk -F. '{print $$1}'`>=14)); then echo 1; fi), \
-fdiagnostics-all-candidates)
CXXFLAGS := -Iinclude \
-Wpedantic -Wall -W \
$(if $(DEBUG), $(CXXDIAGNO)) \
$(if $(DEBUG), $(CXXDEBUG), -g0 -O0 -D'NDEBUG') \
$(if $(LOG), -D'IPCATOR_LOG') \
$(if $(OFAST), -D'IPCATOR_OFAST')
LIBS := $(if $(shell \
echo $$'%:if __has_include(<format>)\n%:elif __has_include(<experimental/format>)\n%:else\n"cannot find <format>";\n%:endif\n' \
| $(CXX) -x c++ -E - | grep 'cannot find <format>' - \
),fmt)
LIBARS := $(LIBS:%=lib/archives/lib%.a)
LDFLAGS := -pthread -lrt $(if $(LIBS), -l$(LIBS))
BUILD_INFO := $(if $(LOG),with_log)-$(if $(DEBUG),,nocheck)-$(if $(OFAST),fast)-$(shell basename `echo $(CXX) | awk -F' ' '{printf $$1}'`)-C++$(shell echo $${ISOCPP:-26})
# ----------------------------------------------------------
.PHONY: test
test: bin/test-$(BUILD_INFO).exe
rm -f /dev/shm/ipcator.*
@time $<
.PHONY: ipc
ipc: bin/ipc-writer-$(BUILD_INFO).exe bin/ipc-reader-$(BUILD_INFO).exe
rm -f /dev/shm/ipcator.*
echo
@for exe in $^; do (./$$exe; echo) & done; wait
bin/test-$(BUILD_INFO).exe: src/test.cpp include/ipcator.hpp $(LIBARS) | bin/
time $(CXX) $(CXXFLAGS) $< -L./lib/archives $(LDFLAGS) -o $@
bin/ipc-%-$(BUILD_INFO).exe: src/ipc-%.cpp include/ipcator.hpp $(LIBARS) | bin/
time $(CXX) $(CXXFLAGS) $< -L./lib/archives $(LDFLAGS) -o $@
lib/archives/libfmt.a: | lib/fmt-build/ lib/archives/
cd lib/fmt-build; \
CXX='$(CXX) -g0 -O0 -w' cmake -D'FMT_TEST=false'`#不进行测试, 太浪费时间了` ../fmt; \
make -j$$[1+`nproc`]
mv lib/fmt-build/libfmt.a lib/archives/
%/:
mkdir -p $@
# ----------------------------------------------------------
.PHONY: git
git:
git commit -av
git push
.PHONY: doc
doc: docs/html/index.html
@echo $$'\033[32m文档在 $<\033[0m'
docs/html/index.html: docs/Doxyfile.ini include/ipcator.hpp | docs/
cd docs; \
doxygen $(<F)
.PHONY: clean
clean:
rm -rf bin/
rm -f /dev/shm/ipcator.*
rm -rf lib/?*-build/
rm -rf lib/archives/
rm -rf docs/html/
# 查看一些 Makefile 中定义的变量.
.PHONY: print-vars
print-vars:
@echo CXX = $(CXX)
@echo DEBUG = $(DEBUG)
@echo CXXFLAGS = $(CXXFLAGS)
@echo LIBS = $(LIBS)
@echo LIBARS = $(LIBARS)
@echo LDFLAGS = $(LDFLAGS)
@echo BUILD_INFO = $(BUILD_INFO)
# Local Variables:
# tab-width: 2
# End: