-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
181 lines (154 loc) · 7.81 KB
/
Copy pathCMakeLists.txt
File metadata and controls
181 lines (154 loc) · 7.81 KB
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
cmake_minimum_required(VERSION 3.16)
project(RMDB)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_COMMON_FLAGS "-Wall")
message(STATUS "Using ${CMAKE_C_COMPILER_ID}")
option(USE_COVERAGE "Enable coverage" OFF)
if(USE_COVERAGE)
message(STATUS "Enable coverage for ${CMAKE_CXX_COMPILER_ID}")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline -fprofile-arcs -ftest-coverage")
# gcov -> lcov.info
# lcov --capture --directory . --output-file lcov.info
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# https://clang.llvm.net.cn/docs/SourceBasedCodeCoverage.html
# -fcoverage-mcdc
# 这样会生成.gcda
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline -fprofile-arcs -ftest-coverage")
# 这样会生成.profraw
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
# 1. 生成 default.profraw
# LLVM_PROFILE_FILE="default.profraw" ./rmdb db
# 2. 生成 default.profdata
# llvm-profdata merge -sparse default.profraw -o default.profdata
# 合并多次运行
# llvm-profdata merge -sparse default0.profraw default1.profraw -o default.profdata
# llvm-cov show ./rmdb -instr-profile=default.profdata
# llvm-cov report ./rmdb -instr-profile=default.profdata
# 3. 生成 lcov.info
# llvm-cov export -format=lcov ./rmdb -instr-profile=default.profdata > lcov.info
# 4. 过滤deps目录
# lcov --remove lcov.info '*/_deps/*' '*/deps/*' --output-file lcov.info
# 5. 生成 html
# genhtml lcov.info --output-directory coverage
endif()
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -ggdb3")
elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang")
# https://clang.llvm.org/docs/UsersManual.html#controlling-debugger-tuning
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -glldb")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fstandalone-debug")
endif()
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif ()
option(USE_CPP_TRACE "Enable Cpptrace" OFF)
option(USE_PERF "Enable perf" OFF)
option(PERF_NO_INLINE "Enable perf no inline" OFF)
option(USE_LOGGER "Enable logger" OFF)
# SPDLOG_ACTIVE_LEVEL: SPDLOG_LEVEL_TRACE, SPDLOG_LEVEL_DEBUG, SPDLOG_LEVEL_INFO, SPDLOG_LEVEL_WARN, SPDLOG_LEVEL_ERROR, SPDLOG_LEVEL_CRITICAL, SPDLOG_LEVEL_OFF
set(SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_OFF CACHE STRING "SPDLOG_ACTIVE_LEVEL")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Enable Debug")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -O0")
# 修复使用clang编译时lldb打印std::string提示 C++: error: summary string parsing error
# https://clang.llvm.org/docs/UsersManual.html#cmdoption-fstandalone-debug
add_definitions(-DDEBUG)
# turn on USE_CPP_TRACE by default in debug mode
set(USE_LOGGER ON)
set(SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE)
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
message(STATUS "Enable Release")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -O2")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithLog")
message(STATUS "Enable RelWithLog")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -O2")
set(USE_LOGGER ON)
set(SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_WARN)
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithLogError")
message(STATUS "Enable RelWithLogError")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -O2")
set(USE_LOGGER ON)
set(SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_ERROR)
endif()
if(USE_LOGGER)
message(STATUS "Enable logger")
message(STATUS "SPDLOG_ACTIVE_LEVEL: ${SPDLOG_ACTIVE_LEVEL}")
set(USE_CPP_TRACE ON)
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -DUSE_LOGGER")
add_definitions(-DSPDLOG_ACTIVE_LEVEL=${SPDLOG_ACTIVE_LEVEL})
endif()
if(USE_CPP_TRACE)
message(STATUS "Enable Cpptrace")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -DUSE_CPP_TRACE")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-omit-frame-pointer")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-stack-protector")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-optimize-sibling-calls")
set(USE_PERF ON)
endif()
if(USE_PERF)
message(STATUS "Enable perf")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-omit-frame-pointer")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-stack-protector")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-optimize-sibling-calls")
# 对性能有将近一半的损耗
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline-small-functions")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline-functions-called-once")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline-functions-called-once-recursively")
if(PERF_NO_INLINE)
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-inline")
endif()
endif()
# TSAN和ASAN不能同时使用
# TODO: gcc (Ubuntu 13.1.0-8ubuntu1~22.04) 13.1.0下可能产生误报, clang 17.0.6正常
# cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_ASAN=ON ..
option(USE_ASAN "Enable Address Sanitizer" OFF)
if(USE_ASAN)
message(STATUS "Enable ASan")
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-stack-protector -fno-omit-frame-pointer")
# https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fsanitize=address")
# ASAN_OPTIONS=detect_leaks=0
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fsanitize=leak")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fsanitize=undefined")
# set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fsanitize=thread") # The option cannot be combined with -fsanitize=address
endif()
# cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_TSAN=ON ..
option(USE_TSAN "Enable Thread Sanitizer" OFF)
if(USE_TSAN)
message(STATUS "Enable TSan")
# https://stackoverflow.com/questions/77850769/fatal-threadsanitizer-unexpected-memory-mapping-when-running-on-linux-kernels
# 6.12.26-WSL2-LTS+; clang 17.0.6 需要sudo sysctl vm.mmap_rnd_bits=28才能工作, 否则一直"ThreadSanitizer: unexpected memory mapping"
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fno-stack-protector -fno-omit-frame-pointer")
# https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -fsanitize=thread")
endif()
# 和ASAN/TSAN不能够同时使用
option(USE_TCMALLOC "Link tcmalloc" OFF)
option(USE_MIMALLOC "Link mimalloc" ON)
message(STATUS "CMAKE_COMMON_FLAGS: ${CMAKE_COMMON_FLAGS}")
set(CMAKE_CXX_FLAGS ${CMAKE_COMMON_FLAGS})
set(CMAKE_C_FLAGS ${CMAKE_COMMON_FLAGS})
include_directories(deps)
enable_testing()
# add_subdirectory(rmdb_client)
add_subdirectory(src)
add_subdirectory(deps)
execute_process(COMMAND git config core.hooksPath .githooks
RESULT_VARIABLE result_var
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
message(STATUS "githook status: ${result_var}")
set(COMPILE_COMMANDS_JSON_FILE ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json)
set(TARGET_COMPILE_COMMANDS_JSON_FILE ${PROJECT_SOURCE_DIR}/build/compile_commands.json)
set(COMPILE_COMMANDS_JSON_LINK_CMD "rm -f ${TARGET_COMPILE_COMMANDS_JSON_FILE} && ln -s ${COMPILE_COMMANDS_JSON_FILE} ${TARGET_COMPILE_COMMANDS_JSON_FILE}")
message(STATUS "COMPILE_COMMANDS_JSON_LINK_CMD: ${COMPILE_COMMANDS_JSON_LINK_CMD}")
execute_process(COMMAND bash -c "${COMPILE_COMMANDS_JSON_LINK_CMD}"
RESULT_VARIABLE result_var
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
message(STATUS "compile_commands.json status: ${result_var}")