mirror of
https://github.com/boostorg/redis.git
synced 2026-01-19 04:42:09 +00:00
Improves CMakeLists.txt with packaging.
This commit is contained in:
@@ -1,6 +1,11 @@
|
||||
# At the moment the official build system is still autotools and this
|
||||
# file is meant to support Aedis on windows.
|
||||
|
||||
# BOOST_ROOT=/opt/boost_1_79_0/ cmake -DCMAKE_CXX_FLAGS="-g -O0
|
||||
# -std=c++20 -Wall -Wextra --coverage -fkeep-inline-functions
|
||||
# -fkeep-static-functions" -DCMAKE_EXE_LINKER_FLAGS="--coverage"
|
||||
# ~/my/aedis
|
||||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
project(
|
||||
@@ -20,6 +25,9 @@ include_directories(${Boost_INCLUDE_DIRS})
|
||||
enable_testing()
|
||||
include_directories(include)
|
||||
|
||||
# Executables
|
||||
#=======================================================================
|
||||
|
||||
add_executable(chat_room examples/chat_room.cpp)
|
||||
add_executable(containers examples/containers.cpp)
|
||||
add_executable(echo_server examples/echo_server.cpp)
|
||||
@@ -32,6 +40,9 @@ add_executable(test_low_level tests/low_level.cpp)
|
||||
add_executable(test_connection tests/connection.cpp)
|
||||
add_executable(low_level_sync tests/low_level_sync.cpp)
|
||||
|
||||
# Tests
|
||||
#=======================================================================
|
||||
|
||||
add_test(containers containers)
|
||||
add_test(intro intro)
|
||||
add_test(intro_sync intro_sync)
|
||||
@@ -40,11 +51,60 @@ add_test(test_low_level test_low_level)
|
||||
add_test(test_connection test_connection)
|
||||
add_test(low_level_sync low_level_sync)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
# Install
|
||||
#=======================================================================
|
||||
|
||||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/boost
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
DESTINATION include
|
||||
FILES_MATCHING
|
||||
PATTERN "*.hpp"
|
||||
PATTERN "*.ipp"
|
||||
)
|
||||
|
||||
# Doxygen
|
||||
#=======================================================================
|
||||
|
||||
set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/doc")
|
||||
|
||||
configure_file(doc/Doxyfile.in doc/Doxyfile @ONLY)
|
||||
|
||||
add_custom_target(
|
||||
doc
|
||||
COMMAND doxygen "${PROJECT_BINARY_DIR}/doc/Doxyfile"
|
||||
COMMENT "Building documentation using Doxygen"
|
||||
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
# Coverage
|
||||
#=======================================================================
|
||||
|
||||
set(
|
||||
COVERAGE_TRACE_COMMAND
|
||||
lcov --capture
|
||||
-output-file "${PROJECT_BINARY_DIR}/coverage.info"
|
||||
--directory "${PROJECT_BINARY_DIR}"
|
||||
--include "${PROJECT_SOURCE_DIR}/include/*"
|
||||
)
|
||||
|
||||
set(
|
||||
COVERAGE_HTML_COMMAND
|
||||
genhtml --legend -f -q
|
||||
"${PROJECT_BINARY_DIR}/coverage.info"
|
||||
--prefix "${PROJECT_SOURCE_DIR}"
|
||||
--output-directory "${PROJECT_BINARY_DIR}/coverage_html"
|
||||
)
|
||||
|
||||
add_custom_target(
|
||||
coverage
|
||||
COMMAND ${COVERAGE_TRACE_COMMAND}
|
||||
COMMAND ${COVERAGE_HTML_COMMAND}
|
||||
COMMENT "Generating coverage report"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
# Distribution
|
||||
#=======================================================================
|
||||
|
||||
include(CPack)
|
||||
|
||||
|
||||
@@ -32,19 +32,19 @@ DOXYFILE_ENCODING = UTF-8
|
||||
# title of most generated pages and in a few other places.
|
||||
# The default value is: My Project.
|
||||
|
||||
PROJECT_NAME = "@PACKAGE_NAME@"
|
||||
PROJECT_NAME = "@PROJECT_NAME@"
|
||||
|
||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = "@PACKAGE_VERSION@"
|
||||
PROJECT_NUMBER = "@PROJECT_VERSION@"
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
# quick idea about the purpose of the project. Keep the description short.
|
||||
|
||||
PROJECT_BRIEF = "High level Redis client"
|
||||
PROJECT_BRIEF = "@PROJECT_DESCRIPTION@"
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
@@ -58,7 +58,7 @@ PROJECT_LOGO =
|
||||
# entered, it will be relative to the location where doxygen was started. If
|
||||
# left blank the current directory will be used.
|
||||
|
||||
OUTPUT_DIRECTORY = ../aedis-gh-pages
|
||||
OUTPUT_DIRECTORY = "@DOXYGEN_OUTPUT_DIRECTORY@"
|
||||
|
||||
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
|
||||
# directories (in 2 levels) under the output directory of each output format and
|
||||
@@ -170,7 +170,7 @@ FULL_PATH_NAMES = YES
|
||||
# will be relative from the directory where doxygen is started.
|
||||
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
|
||||
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_PATH = "@PROJECT_SOURCE_DIR@/include" "@PROJECT_SOURCE_DIR@"
|
||||
|
||||
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
|
||||
# path mentioned in the documentation of a class, which tells the reader which
|
||||
@@ -823,7 +823,7 @@ WARN_LOGFILE =
|
||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||
# Note: If this tag is empty the current directory is searched.
|
||||
|
||||
INPUT = include benchmarks/benchmarks.md CHANGELOG.md examples
|
||||
INPUT = include benchmarks/benchmarks.md CHANGELOG.md examples
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
|
||||
@@ -31,103 +31,19 @@
|
||||
\li Healthy checks, back pressure and low latency.
|
||||
\li Hides most of the low level asynchronous operations away from the user.
|
||||
|
||||
Let us have a look a some code snippets
|
||||
It is worth having a look into some examples to apreciate the
|
||||
simplicity Aedis brings
|
||||
|
||||
@subsection Async
|
||||
@li intro.cpp: Basic steps with Aedis.
|
||||
@li intro_sync.cpp: Synchronous version of intro.cpp.
|
||||
@li containers.cpp: Shows how to send and receive stl containers.
|
||||
@li serialization.cpp: Shows how to serialize your own types.
|
||||
@li subscriber.cpp: Shows how to use pubsub.
|
||||
@li subscriber_sync.cpp: Synchronous version of subscriber.cpp.
|
||||
@li echo_server.cpp: A simple TCP echo server that uses coroutines.
|
||||
@li chat_room.cpp: A simple chat room that uses coroutines.
|
||||
|
||||
The code below sends a ping command to Redis and quits (see intro.cpp)
|
||||
|
||||
@code
|
||||
int main()
|
||||
{
|
||||
net::io_context ioc;
|
||||
connection db{ioc};
|
||||
|
||||
request req;
|
||||
req.push("PING");
|
||||
req.push("QUIT");
|
||||
|
||||
std::tuple<std::string, aedis::ignore> resp;
|
||||
db.async_run(req, adapt(resp), net::detached);
|
||||
|
||||
ioc.run();
|
||||
|
||||
std::cout << std::get<0>(resp) << std::endl;
|
||||
}
|
||||
@endcode
|
||||
|
||||
The connection class maintains a healthy connection with Redis
|
||||
over which users can execute their commands, without any need of
|
||||
queuing. For example, to execute more than one request
|
||||
|
||||
@code
|
||||
int main()
|
||||
{
|
||||
...
|
||||
net::io_context ioc;
|
||||
connection db{ioc};
|
||||
|
||||
db.async_exec(req1, adapt(resp1), handler1);
|
||||
db.async_exec(req2, adapt(resp2), handler2);
|
||||
db.async_exec(req3, adapt(resp3), handler3);
|
||||
|
||||
db.async_run(net::detached);
|
||||
|
||||
ioc.run();
|
||||
...
|
||||
}
|
||||
@endcode
|
||||
|
||||
The `connection::async_exec` functions above can be called from different
|
||||
places in the code without knowing about each other, see for
|
||||
example echo_server.cpp. Server-side pushes are supported on the
|
||||
same connection where commands are executed, a typical subscriber
|
||||
will look like
|
||||
(see subscriber.cpp)
|
||||
|
||||
@code
|
||||
net::awaitable<void> reader(std::shared_ptr<connection> db)
|
||||
{
|
||||
for (std::vector<node_type> resp;;) {
|
||||
co_await db->async_receive_event(adapt(resp));
|
||||
// Use resp and clear it.
|
||||
resp.clear();
|
||||
}
|
||||
}
|
||||
@endcode
|
||||
|
||||
@subsection Sync
|
||||
|
||||
The `connection` class offers only an asynchronous API.
|
||||
Synchronous communications with redis is provided by the `aedis::sync`
|
||||
wrapper class. (see intro_sync.cpp)
|
||||
|
||||
@code
|
||||
int main()
|
||||
{
|
||||
net::io_context ioc{1};
|
||||
auto work = net::make_work_guard(ioc);
|
||||
std::thread t1{[&]() { ioc.run(); }};
|
||||
|
||||
sync<connection> conn{work.get_executor()};
|
||||
std::thread t2{[&]() { boost::system::error_code ec; conn.run(ec); }};
|
||||
|
||||
request req;
|
||||
req.push("PING");
|
||||
req.push("QUIT");
|
||||
|
||||
std::tuple<std::string, aedis::ignore> resp;
|
||||
conn.exec(req, adapt(resp));
|
||||
std::cout << "Response: " << std::get<0>(resp) << std::endl;
|
||||
|
||||
work.reset();
|
||||
|
||||
t1.join();
|
||||
t2.join();
|
||||
}
|
||||
@endcode
|
||||
|
||||
\subsection using-aedis Installation
|
||||
\section using-aedis Installation
|
||||
|
||||
To install and use Aedis you will need
|
||||
|
||||
@@ -168,7 +84,7 @@
|
||||
$ make
|
||||
```
|
||||
|
||||
@subsubsection using_aedis Using Aedis
|
||||
@subsection using_aedis Using Aedis
|
||||
|
||||
When writing you own applications include the following header
|
||||
|
||||
@@ -179,14 +95,14 @@
|
||||
|
||||
in no more than one source file in your applications.
|
||||
|
||||
@subsubsection sup-comp Supported compilers
|
||||
@subsection sup-comp Supported compilers
|
||||
|
||||
Aedis has been tested with the following compilers
|
||||
|
||||
- Tested with gcc: 12, 11.
|
||||
- Tested with clang: 14, 13, 11.
|
||||
|
||||
\subsubsection Developers
|
||||
@subsection Developers
|
||||
|
||||
To generate the build system clone the repository and run
|
||||
|
||||
@@ -200,7 +116,7 @@
|
||||
compiler with coverage support run
|
||||
|
||||
```
|
||||
$ CXX=clang++-14 \
|
||||
$ CXX=gcc++-11 \
|
||||
CXXFLAGS="-g -std=c++20 -Wall -Wextra --coverage -fkeep-inline-functions -fkeep-static-functions" \
|
||||
LDFLAGS="--coverage" \
|
||||
./configure --with-boost=/opt/boost_1_79_0
|
||||
@@ -481,19 +397,6 @@
|
||||
|
||||
In addition to the above users can also use unordered versions of the containers. The same reasoning also applies to sets e.g. `SMEMBERS`.
|
||||
|
||||
\section examples Examples
|
||||
|
||||
The examples listed below cover most use cases presented in the documentation above.
|
||||
|
||||
@li intro.cpp: Basic steps with Aedis.
|
||||
@li intro_sync.cpp: Synchronous version of intro.cpp.
|
||||
@li containers.cpp: Shows how to send and receive stl containers.
|
||||
@li serialization.cpp: Shows how to serialize your own types.
|
||||
@li subscriber.cpp: Shows how to use pubsub.
|
||||
@li subscriber_sync.cpp: Synchronous version of subscriber.cpp.
|
||||
@li echo_server.cpp: A simple TCP echo server that uses coroutines.
|
||||
@li chat_room.cpp: A simple chat room that uses coroutines.
|
||||
|
||||
\section why-aedis Why Aedis
|
||||
|
||||
At the time of this writing there are seventeen Redis clients
|
||||
|
||||
Reference in New Issue
Block a user