forked from valkey-io/valkey
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add CMake build system for valkey (valkey-io#1196)
With this commit, users are able to build valkey using `CMake`. ## Example usage: Build `valkey-server` in Release mode with TLS enabled and using `jemalloc` as the allocator: ```bash mkdir build-release cd $_ cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/tmp/valkey-install \ -DBUILD_MALLOC=jemalloc -DBUILD_TLS=1 make -j$(nproc) install # start valkey /tmp/valkey-install/bin/valkey-server ``` Build `valkey-unit-tests`: ```bash mkdir build-release-ut cd $_ cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_MALLOC=jemalloc -DBUILD_UNIT_TESTS=1 make -j$(nproc) # Run the tests ./bin/valkey-unit-tests ``` Current features supported by this PR: - Building against different allocators: (`jemalloc`, `tcmalloc`, `tcmalloc_minimal` and `libc`), e.g. to enable `jemalloc` pass `-DBUILD_MALLOC=jemalloc` to `cmake` - OpenSSL builds (to enable TLS, pass `-DBUILD_TLS=1` to `cmake`) - Sanitizier: pass `-DBUILD_SANITIZER=<address|thread|undefined>` to `cmake` - Install target + redis symbolic links - Build `valkey-unit-tests` executable - Standard CMake variables are supported. e.g. to install `valkey` under `/home/you/root` pass `-DCMAKE_INSTALL_PREFIX=/home/you/root` Why using `CMake`? To list *some* of the advantages of using `CMake`: - Superior IDE integrations: cmake generates the file `compile_commands.json` which is required by `clangd` to get a compiler accuracy code completion (in other words: your VScode will thank you) - Out of the source build tree: with the current build system, object files are created all over the place polluting the build source tree, the best practice is to build the project on a separate folder - Multiple build types co-existing: with the current build system, it is often hard to have multiple build configurations. With cmake you can do it easily: - It is the de-facto standard for C/C++ project these days More build examples: ASAN build: ```bash mkdir build-asan cd $_ cmake .. -DBUILD_SANITIZER=address -DBUILD_MALLOC=libc make -j$(nproc) ``` ASAN with jemalloc: ```bash mkdir build-asan-jemalloc cd $_ cmake .. -DBUILD_SANITIZER=address -DBUILD_MALLOC=jemalloc make -j$(nproc) ``` As seen by the previous examples, any combination is allowed and co-exist on the same source tree. ## Valkey installation With this new `CMake`, it is possible to install the binary by running `make install` or creating a package `make package` (currently supported on Debian like distros) ### Example 1: build & install using `make install`: ```bash mkdir build-release cd $_ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/valkey-install -DCMAKE_BUILD_TYPE=Release make -j$(nproc) install # valkey is now installed under $HOME/valkey-install ``` ### Example 2: create a `.deb` installer: ```bash mkdir build-release cd $_ cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) package # ... CPack deb generation output sudo gdebi -n ./valkey_8.1.0_amd64.deb # valkey is now installed under /opt/valkey ``` ### Example 3: create installer for non Debian systems (e.g. FreeBSD or macOS): ```bash mkdir build-release cd $_ cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) package mkdir -p /opt/valkey && ./valkey-8.1.0-Darwin.sh --prefix=/opt/valkey --exclude-subdir # valkey-server is now installed under /opt/valkey ``` Signed-off-by: Eran Ifrah <[email protected]>
- Loading branch information
1 parent
af842ca
commit 771e070
Showing
22 changed files
with
1,252 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
format: | ||
_help_line_width: | ||
- How wide to allow formatted cmake files | ||
line_width: 120 | ||
_help_tab_size: | ||
- How many spaces to tab for indent | ||
tab_size: 4 | ||
_help_use_tabchars: | ||
- If true, lines are indented using tab characters (utf-8 | ||
- 0x09) instead of <tab_size> space characters (utf-8 0x20). | ||
- In cases where the layout would require a fractional tab | ||
- character, the behavior of the fractional indentation is | ||
- governed by <fractional_tab_policy> | ||
use_tabchars: false | ||
_help_separate_ctrl_name_with_space: | ||
- If true, separate flow control names from their parentheses | ||
- with a space | ||
separate_ctrl_name_with_space: true | ||
_help_min_prefix_chars: | ||
- If the statement spelling length (including space and | ||
- parenthesis) is smaller than this amount, then force reject | ||
- nested layouts. | ||
min_prefix_chars: 4 | ||
_help_max_prefix_chars: | ||
- If the statement spelling length (including space and | ||
- parenthesis) is larger than the tab width by more than this | ||
- amount, then force reject un-nested layouts. | ||
max_prefix_chars: 10 | ||
_help_max_lines_hwrap: | ||
- If a candidate layout is wrapped horizontally but it exceeds | ||
- this many lines, then reject the layout. | ||
max_lines_hwrap: 2 | ||
_help_line_ending: | ||
- What style line endings to use in the output. | ||
line_ending: unix | ||
_help_command_case: | ||
- Format command names consistently as 'lower' or 'upper' case | ||
command_case: lower | ||
_help_keyword_case: | ||
- Format keywords consistently as 'lower' or 'upper' case | ||
keyword_case: unchanged | ||
_help_always_wrap: | ||
- A list of command names which should always be wrapped | ||
always_wrap: [] | ||
_help_enable_sort: | ||
- If true, the argument lists which are known to be sortable | ||
- will be sorted lexicographicall | ||
enable_sort: true | ||
_help_autosort: | ||
- If true, the parsers may infer whether or not an argument | ||
- list is sortable (without annotation). | ||
autosort: false | ||
_help_require_valid_layout: | ||
- By default, if cmake-format cannot successfully fit | ||
- everything into the desired linewidth it will apply the | ||
- last, most agressive attempt that it made. If this flag is | ||
- True, however, cmake-format will print error, exit with non- | ||
- zero status code, and write-out nothing | ||
require_valid_layout: false | ||
_help_layout_passes: | ||
- A dictionary mapping layout nodes to a list of wrap | ||
- decisions. See the documentation for more information. | ||
layout_passes: {} | ||
encode: | ||
_help_emit_byteorder_mark: | ||
- If true, emit the unicode byte-order mark (BOM) at the start | ||
- of the file | ||
emit_byteorder_mark: false | ||
_help_input_encoding: | ||
- Specify the encoding of the input file. Defaults to utf-8 | ||
input_encoding: utf-8 | ||
_help_output_encoding: | ||
- Specify the encoding of the output file. Defaults to utf-8. | ||
- Note that cmake only claims to support utf-8 so be careful | ||
- when using anything else | ||
output_encoding: utf-8 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,3 +49,5 @@ nodes*.conf | |
tests/cluster/tmp/* | ||
tests/rdma/rdma-test | ||
tags | ||
build-debug/ | ||
build-release/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
cmake_minimum_required(VERSION 3.20) | ||
|
||
# Must be done first | ||
if (APPLE) | ||
# Force clang compiler on macOS | ||
find_program(CLANGPP "clang++") | ||
find_program(CLANG "clang") | ||
if (CLANG AND CLANGPP) | ||
message(STATUS "Found ${CLANGPP}, ${CLANG}") | ||
set(CMAKE_CXX_COMPILER ${CLANGPP}) | ||
set(CMAKE_C_COMPILER ${CLANG}) | ||
endif () | ||
endif () | ||
|
||
# Options | ||
option(BUILD_UNIT_TESTS "Build valkey-unit-tests" OFF) | ||
option(BUILD_TEST_MODULES "Build all test modules" OFF) | ||
option(BUILD_EXAMPLE_MODULES "Build example modules" OFF) | ||
|
||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") | ||
project("valkey") | ||
|
||
set(CMAKE_C_STANDARD 11) | ||
set(CMAKE_C_STANDARD_REQUIRED ON) | ||
set(CMAKE_C_EXTENSIONS ON) | ||
|
||
include(ValkeySetup) | ||
add_subdirectory(src) | ||
add_subdirectory(tests) | ||
|
||
# Include the packaging module | ||
include(Packaging) | ||
|
||
# Clear cached variables from the cache | ||
unset(BUILD_TESTS CACHE) | ||
unset(CLANGPP CACHE) | ||
unset(CLANG CACHE) | ||
unset(BUILD_RDMA_MODULE CACHE) | ||
unset(BUILD_TLS_MODULE CACHE) | ||
unset(BUILD_UNIT_TESTS CACHE) | ||
unset(BUILD_TEST_MODULES CACHE) | ||
unset(BUILD_EXAMPLE_MODULES CACHE) | ||
unset(USE_TLS CACHE) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.