-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathCMakeLists.txt
194 lines (160 loc) · 6.43 KB
/
CMakeLists.txt
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
cmake_minimum_required(VERSION 3.17)
include(FetchContent)
include(ExternalProject)
# Detect the system architecture
EXECUTE_PROCESS(
COMMAND uname -m
COMMAND tr -d '\n'
OUTPUT_VARIABLE ARCHITECTURE
)
if("${ARCHITECTURE}" STREQUAL "x86_64" OR "${ARCHITECTURE}" STREQUAL "aarch64")
message("Building valkey-json for ${ARCHITECTURE}")
else()
message(FATAL_ERROR "Unsupported architecture: ${ARCHITECTURE}. valkey-json is only supported on x86_64 and aarch64.")
endif()
# Project definition
project(ValkeyJSONModule VERSION 99.99.99 LANGUAGES C CXX) # Version is 99.99.99 for unstable branch
# ASAN build option
option(ENABLE_ASAN "Enable Address Sanitizer" OFF)
# ASan flags configuration
if(ENABLE_ASAN)
message("Building with Address Sanitizer enabled")
set(ASAN_FLAGS "-fsanitize=address")
endif()
# Set the name of the JSON shared library
set(JSON_MODULE_LIB json)
# Define the Valkey directories
set(VALKEY_DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/_deps/valkey-src")
set(VALKEY_BIN_DIR "${CMAKE_BINARY_DIR}/_deps/valkey-src/src/valkey/src")
# Valkey version
if(NOT VALKEY_VERSION)
set(VALKEY_VERSION unstable)
endif()
message("Valkey version: ${VALKEY_VERSION}")
# Compiler flags that can be overridden in command line
if(NOT CFLAGS)
# Include debug symbols and set optimize level
set(CFLAGS "-g -O3 -fno-omit-frame-pointer -Wall -Werror -Wextra")
endif()
# Add ASan flags if enabled
if(ENABLE_ASAN)
set(CFLAGS "${CFLAGS} ${ASAN_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ASAN_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ASAN_FLAGS}")
endif()
message("CFLAGS: ${CFLAGS}")
if(ENABLE_ASAN)
message("Building Valkey engine with Address Sanitizer enabled")
set(BUILD_CMD make distclean && make -j SANITIZER=address)
else()
set(BUILD_CMD make distclean && make -j)
endif()
# Download and build Valkey with ASAN if enabled
ExternalProject_Add(
valkey
GIT_REPOSITORY https://github.com/valkey-io/valkey.git
GIT_TAG ${VALKEY_VERSION}
PREFIX ${VALKEY_DOWNLOAD_DIR}
CONFIGURE_COMMAND ""
BUILD_COMMAND ${BUILD_CMD}
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
# Define the paths for the copied files
set(VALKEY_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/include")
set(VALKEY_BINARY_DEST "${CMAKE_CURRENT_SOURCE_DIR}/tst/integration/.build/binaries/${VALKEY_VERSION}")
ExternalProject_Add_Step(
valkey
copy_header_files
COMMENT "Copying header files to include/ directory"
DEPENDEES download
DEPENDERS configure
COMMAND ${CMAKE_COMMAND} -E make_directory ${VALKEY_INCLUDE_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${VALKEY_DOWNLOAD_DIR}/src/valkey/src/valkeymodule.h ${VALKEY_INCLUDE_DIR}/valkeymodule.h
ALWAYS 1
)
# Copy header and binary after Valkey make
add_custom_command(TARGET valkey
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${VALKEY_BINARY_DEST}
COMMAND ${CMAKE_COMMAND} -E copy ${VALKEY_BIN_DIR}/valkey-server ${VALKEY_BINARY_DEST}/valkey-server
COMMENT "Copied valkeymodule.h and valkey-server to destination directories"
)
# Define valkey-test-framework commit id
set(VALKEY_TEST_FRAMEWORK_COMMIT "9fb28b74efd122324db00498a2fde6e5d281c90f" CACHE STRING "Valkey-test-framework commit to use")
# Set the download directory for Valkey-test-framework
set(VALKEY_TEST_FRAMEWORK_DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR}/_deps/valkey-test-framework-src")
# Download valkey-test-framework
ExternalProject_Add(
valkey-test-framework
GIT_REPOSITORY https://github.com/valkey-io/valkey-test-framework.git
GIT_TAG ${VALKEY_TEST_FRAMEWORK_COMMIT}
GIT_SHALLOW TRUE
PREFIX "${VALKEY_TEST_FRAMEWORK_DOWNLOAD_DIR}"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
# Step to copy pytest files
ExternalProject_Add_Step(
valkey-test-framework
copy_pytest_files
COMMENT "Copying pytest files to tst/integration directory"
DEPENDEES build
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/tst/integration
COMMAND ${CMAKE_COMMAND} -E copy_directory ${VALKEY_TEST_FRAMEWORK_DOWNLOAD_DIR}/src/valkey-test-framework/src ${CMAKE_CURRENT_SOURCE_DIR}/tst/integration/valkeytests
)
# Enable instrumentation options if requested
if("$ENV{INSTRUMENT_V2PATH}" STREQUAL "yes")
add_compile_definitions(INSTRUMENT_V2PATH)
message("Enabled INSTRUMENT_V2PATH")
endif()
# Disable Doxygen documentation generation
set(BUILD_DOCUMENTATION OFF)
# When CODE_COVERAGE is ON, the package is built twice, once for debug and once for release.
# To fix the problem, disable the code coverage.
set(CODE_COVERAGE OFF)
# Fix for linking error when code coverage is enabled on ARM
if(CODE_COVERAGE AND CMAKE_BUILD_TYPE STREQUAL "Debug")
add_link_options("--coverage")
endif()
# Set C & C++ standard versions
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Additional flags for all architectures
set(ADDITIONAL_FLAGS "-fPIC")
# RapidJSON SIMD optimization
if("${ARCHITECTURE}" STREQUAL "x86_64")
set(ADDITIONAL_FLAGS "${ADDITIONAL_FLAGS} -march=nehalem")
elseif("${ARCHITECTURE}" STREQUAL "aarch64")
set(ADDITIONAL_FLAGS "${ADDITIONAL_FLAGS} -march=armv8-a")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CFLAGS} ${ADDITIONAL_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CFLAGS} ${ADDITIONAL_FLAGS}")
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
# Fetch RapidJSON
FetchContent_Declare(
rapidjson
GIT_REPOSITORY https://github.com/Tencent/rapidjson.git
GIT_TAG ebd87cb468fb4cb060b37e579718c4a4125416c1
)
# Disable RapidJSON tests and examples
set(RAPIDJSON_BUILD_TESTS OFF CACHE BOOL "Build rapidjson tests" FORCE)
set(RAPIDJSON_BUILD_EXAMPLES OFF CACHE BOOL "Build rapidjson examples" FORCE)
set(RAPIDJSON_BUILD_DOC OFF CACHE BOOL "Build rapidjson documentation" FORCE)
# Make Rapidjson available
FetchContent_MakeAvailable(rapidjson)
add_subdirectory(src)
add_subdirectory(tst)
add_custom_target(test
COMMENT "Run valkey-json integration tests"
USES_TERMINAL
COMMAND rm -rf ${CMAKE_BINARY_DIR}/tst/integration
COMMAND mkdir -p ${CMAKE_BINARY_DIR}/tst/integration
COMMAND cp -rp ${CMAKE_SOURCE_DIR}/tst/integration/. ${CMAKE_BINARY_DIR}/tst/integration/
COMMAND echo "[TARGET] begin integration tests"
COMMAND ${CMAKE_SOURCE_DIR}/tst/integration/run.sh "test" ${CMAKE_SOURCE_DIR}
COMMAND echo "[TARGET] end integration tests")