-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
187 lines (150 loc) · 7.14 KB
/
CMakeLists.txt
File metadata and controls
187 lines (150 loc) · 7.14 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
182
183
184
185
186
187
cmake_minimum_required(VERSION 3.10)
project(DKV VERSION 0.1.0 LANGUAGES CXX)
# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置编译选项
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
# 添加AddressSanitizer支持
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
if(ENABLE_ASAN)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
endif()
endif()
# 设置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# Script VM库路径配置
set(SCRIPT_VM_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/include/scriptvm")
set(SCRIPT_VM_LIB_DIR "${CMAKE_SOURCE_DIR}/lib")
# 根据构建类型选择Script VM库
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "")
set(SCRIPT_VM_LIB "${SCRIPT_VM_LIB_DIR}/debug/libdkv_script.so")
else()
set(SCRIPT_VM_LIB "${SCRIPT_VM_LIB_DIR}/release/libdkv_script.so")
endif()
# 查找线程库
find_package(Threads REQUIRED)
# 查找GTest/Google Benchmark库
find_package(GTest)
find_package(benchmark)
# 创建DKV库
file(GLOB_RECURSE DKV_SOURCES "src/*.cpp")
include_directories(include)
include_directories(${SCRIPT_VM_INCLUDE_DIR})
add_library(dkv_lib STATIC ${DKV_SOURCES})
target_link_libraries(dkv_lib Threads::Threads ${SCRIPT_VM_LIB})
# 创建主程序
add_executable(dkv_server src/dkv_main.cpp)
target_link_libraries(dkv_server dkv_lib)
# 创建测试程序
add_executable(test_basic tests/test_basic.cpp)
target_link_libraries(test_basic dkv_lib)
add_executable(test_datatype_string tests/test_datatype_string.cpp)
target_link_libraries(test_datatype_string dkv_lib)
add_executable(test_datatype_hash tests/test_datatype_hash.cpp)
target_link_libraries(test_datatype_hash dkv_lib)
add_executable(test_datatype_list tests/test_datatype_list.cpp)
target_link_libraries(test_datatype_list dkv_lib)
add_executable(test_datatype_set tests/test_datatype_set.cpp)
target_link_libraries(test_datatype_set dkv_lib)
add_executable(test_datatype_zset tests/test_datatype_zset.cpp)
target_link_libraries(test_datatype_zset dkv_lib)
add_executable(test_skiplist tests/test_skiplist.cpp)
target_link_libraries(test_skiplist dkv_lib)
add_executable(test_datatype_bitmap tests/test_datatype_bitmap.cpp)
target_link_libraries(test_datatype_bitmap dkv_lib)
add_executable(test_datatype_hyperloglog tests/test_datatype_hyperloglog.cpp)
target_link_libraries(test_datatype_hyperloglog dkv_lib)
add_executable(test_server_management tests/test_server_management.cpp)
target_link_libraries(test_server_management dkv_lib)
add_executable(test_memory_allocator tests/test_memory_allocator.cpp)
target_link_libraries(test_memory_allocator dkv_lib)
add_executable(test_maxmemory tests/test_maxmemory.cpp)
target_link_libraries(test_maxmemory dkv_lib)
add_executable(test_rdb tests/test_rdb.cpp)
target_link_libraries(test_rdb dkv_lib)
add_executable(test_aof tests/test_aof.cpp)
target_link_libraries(test_aof dkv_lib)
add_executable(test_concurrency tests/test_concurrency.cpp)
target_link_libraries(test_concurrency dkv_lib)
add_executable(test_mvcc tests/test_mvcc.cpp)
target_link_libraries(test_mvcc dkv_lib)
add_executable(test_raft tests/test_raft.cpp)
target_link_libraries(test_raft dkv_lib)
add_executable(test_raft_statemachine tests/test_raft_statemachine.cpp)
target_link_libraries(test_raft_statemachine dkv_lib)
add_executable(test_script tests/test_script.cpp)
target_link_libraries(test_script dkv_lib)
add_executable(test_ttl_raft tests/test_ttl_raft.cpp)
target_link_libraries(test_ttl_raft dkv_lib)
add_executable(test_logical_clock tests/test_logical_clock.cpp)
target_link_libraries(test_logical_clock
dkv_lib
GTest::gtest_main
pthread
)
# 启用测试
enable_testing()
add_test(NAME basic_tests COMMAND test_basic)
add_test(NAME datatype_string_tests COMMAND test_datatype_string)
add_test(NAME datatype_hash_tests COMMAND test_datatype_hash)
add_test(NAME datatype_list_tests COMMAND test_datatype_list)
add_test(NAME datatype_set_tests COMMAND test_datatype_set)
add_test(NAME datatype_zset_tests COMMAND test_datatype_zset)
add_test(NAME skiplist_tests COMMAND test_skiplist)
add_test(NAME datatype_bitmap_tests COMMAND test_datatype_bitmap)
add_test(NAME datatype_hyperloglog_tests COMMAND test_datatype_hyperloglog)
add_test(NAME server_management_tests COMMAND test_server_management)
add_test(NAME memory_allocator_tests COMMAND test_memory_allocator)
# add_test(NAME maxmemory_tests COMMAND test_maxmemory)
add_test(NAME rdb_tests COMMAND test_rdb)
add_test(NAME aof_tests COMMAND test_aof)
add_test(NAME concurrency_tests COMMAND test_concurrency)
add_test(NAME mvcc_tests COMMAND test_mvcc)
add_test(NAME raft_tests COMMAND test_raft)
add_test(NAME raft_statemachine_tests COMMAND test_raft_statemachine)
add_test(NAME ttl_raft_tests COMMAND test_ttl_raft)
add_test(NAME script_tests COMMAND test_script)
add_test(NAME logical_clock_tests COMMAND test_logical_clock)
# benchmark tests
if(benchmark_FOUND)
add_executable(benchmark_hello tests/benchmark_hello.cpp)
target_link_libraries(benchmark_hello dkv_lib pthread)
target_link_libraries(benchmark_hello benchmark::benchmark)
add_test(NAME benchmark_hello COMMAND benchmark_hello)
# 存储高并发基准测试
add_executable(benchmark_storage_high_concurrency tests/benchmark_storage_high_concurrency.cpp)
target_link_libraries(benchmark_storage_high_concurrency dkv_lib pthread)
target_link_libraries(benchmark_storage_high_concurrency benchmark::benchmark)
add_test(NAME benchmark_storage_high_concurrency COMMAND benchmark_storage_high_concurrency)
endif()
# 安装规则
install(TARGETS dkv_server DESTINATION bin)
install(TARGETS dkv_lib DESTINATION lib)
install(DIRECTORY include/ DESTINATION include)
add_custom_target(debug
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/debug
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/debug
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/debug
COMMENT "Building Debug version in build/debug directory"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
add_custom_target(release
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/release
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/release
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/release
COMMENT "Building Release version in build/release directory"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
add_custom_target(clean-all
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}
COMMENT "Removing all build directories"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)