Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85833274
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
12 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0d0cb14..c321b77 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,149 +1,156 @@
# Do not let the option()s override variables here
cmake_minimum_required(VERSION 3.13)
if(NOT DEFINED PROJECT_NAME)
if(NOT DEFINED libkazv_INSTALL_HEADERS)
set(libkazv_INSTALL_HEADERS ON)
endif()
endif()
project(libkazv)
set(libkazvSourceRoot ${CMAKE_CURRENT_SOURCE_DIR})
set(libkazv_VERSION_MAJOR 0)
set(libkazv_VERSION_MINOR 1)
set(libkazv_VERSION_PATCH 0)
set(libkazv_VERSION_STRING ${libkazv_VERSION_MAJOR}.${libkazv_VERSION_MINOR}.${libkazv_VERSION_PATCH})
set(libkazv_SOVERSION 1)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
option(libkazv_BUILD_TESTS "Build tests" ON)
option(libkazv_BUILD_EXAMPLES "Build examples" ON)
option(libkazv_BUILD_KAZVJOB "Build libkazvjob the async and networking library" ON)
option(libkazv_OUTPUT_LEVEL "Output level: Debug>=90, Info>=70, Quiet>=20, no output=1" 0)
option(libkazv_ENABLE_COVERAGE "Enable code coverage information" OFF)
if(libkazv_ENABLE_COVERAGE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0")
endif()
if((libkazv_BUILD_TESTS OR libkazv_BUILD_EXAMPLES) AND NOT libkazv_BUILD_KAZVJOB)
message(FATAL_ERROR
"You asked kazvjob not to be built, but asked to build tests or examples. Tests and examples both depend on kazvjob. This is not possible.")
endif()
# Build shared libraries by default
if(NOT DEFINED BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON)
endif()
+if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
+ set(LIBKAZV_BUILT_WITH_DEBUG 1)
+else()
+ set(LIBKAZV_BUILT_WITH_DEBUG 0)
+endif()
+
+
find_package(Boost REQUIRED COMPONENTS serialization)
include(FetchContent)
if(libkazv_BUILD_KAZVJOB)
find_package(cpr)
if (NOT cpr_FOUND)
message( STATUS "Using cpr from FetchContent")
set(USE_SYSTEM_CURL ON)
set(BUILD_CPR_TESTS OFF)
FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/whoshuu/cpr.git GIT_TAG c34ddb9b3de2a22fdbd5d318d8b7d1997e6ca0bf)
FetchContent_MakeAvailable(cpr)
endif()
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
endif()
if(libkazv_BUILD_TESTS)
find_package(Catch2)
if (NOT Catch2_FOUND)
message(STATUS "Using Catch2 from FetchContent")
FetchContent_Declare(Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2 GIT_TAG v2.13.0)
FetchContent_MakeAvailable(Catch2)
endif()
endif()
find_package(nlohmann_json)
if (NOT nlohmann_json_FOUND)
message(STATUS "Using nlohmann_json from FetchContent")
set(JSON_BuildTests OFF)
FetchContent_Declare(nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json GIT_TAG v3.9.1)
FetchContent_MakeAvailable(nlohmann_json)
endif()
find_package(Immer)
if(NOT Immer_FOUND)
message(STATUS "Using Immer from FetchContent")
set(immer_BUILD_TESTS OFF)
set(immer_BUILD_EXAMPLES OFF)
set(immer_BUILD_DOCS OFF)
set(immer_BUILD_EXTRAS OFF)
FetchContent_Declare(immer GIT_REPOSITORY https://github.com/arximboldi/immer GIT_TAG
800ddb04e528a3e83e69e8021d7e872e7c34cbcd)
FetchContent_MakeAvailable(immer)
endif()
find_package(Zug)
if(NOT Zug_FOUND)
message(STATUS "Using zug from FetchContent")
set(zug_BUILD_TESTS OFF)
set(zug_BUILD_EXAMPLES OFF)
set(zug_BUILD_DOCS OFF)
FetchContent_Declare(zug GIT_REPOSITORY https://github.com/arximboldi/zug GIT_TAG
266cc7fcc01f546c4fd0dabf3a26c71ddc7f3e7d)
FetchContent_MakeAvailable(zug)
endif()
find_package(Lager)
if(NOT Lager_FOUND)
message(STATUS "Using lager from FetchContent")
set(lager_BUILD_TESTS OFF)
set(lager_BUILD_EXAMPLES OFF)
set(lager_BUILD_DOCS OFF)
set(lager_EMBED_RESOURCES_PATH OFF)
FetchContent_Declare(lager GIT_REPOSITORY https://github.com/arximboldi/lager GIT_TAG
71eca6b0ebbccf3e0e54324b6967f047e49ba92d)
FetchContent_MakeAvailable(lager)
endif()
find_package(cryptopp REQUIRED)
find_package(Olm REQUIRED)
if(libkazv_BUILD_EXAMPLES)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBHTTPSERVER REQUIRED libhttpserver)
endif()
if(libkazv_OUTPUT_LEVEL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLIBKAZV_OUTPUT_LEVEL=${libkazv_OUTPUT_LEVEL}")
endif()
include(GNUInstallDirs)
set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/libkazv)
add_subdirectory(src)
install(EXPORT libkazvTargets
NAMESPACE
libkazv::
DESTINATION
${ConfigPackageLocation}
)
install(
FILES cmake/libkazvConfig.cmake
DESTINATION ${ConfigPackageLocation})
# cpr does not install a good config file.
# We use the find module instead.
install(
FILES cmake/Findcpr.cmake
cmake/Findcryptopp.cmake
DESTINATION ${ConfigPackageLocation})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5e32eed..1aee4de 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,52 +1,53 @@
include(linklibsys)
add_subdirectory(base)
add_subdirectory(store)
add_subdirectory(api)
add_subdirectory(crypto)
add_subdirectory(client)
add_subdirectory(eventemitter)
if(libkazv_BUILD_KAZVJOB)
add_subdirectory(job)
endif()
add_library(kazvall INTERFACE)
add_library(libkazv::kazvall ALIAS kazvall)
add_library(kazv ALIAS kazvall)
add_library(libkazv::kazv ALIAS kazvall)
target_link_libraries(kazvall INTERFACE kazvbase kazvstore kazvapi kazvcrypto kazvclient kazveventemitter)
target_include_directories(kazvall
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include/kazv>
)
install(TARGETS kazvall EXPORT libkazvTargets)
if(libkazv_INSTALL_HEADERS)
+ set(libkazv_HEADER_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/kazv)
install(
DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}/
- DESTINATION include/kazv
+ DESTINATION ${libkazv_HEADER_INSTALL_DIR}
FILES_MATCHING PATTERN "*.hpp"
PATTERN "tests" EXCLUDE
)
endif()
# export(TARGETS kazv)
if(libkazv_BUILD_TESTS)
add_subdirectory(tests)
endif()
if(libkazv_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt
index d09e672..b44e0bd 100644
--- a/src/base/CMakeLists.txt
+++ b/src/base/CMakeLists.txt
@@ -1,27 +1,40 @@
include(linklibsys)
+configure_file(libkazv-defs.hpp.in libkazv-defs.hpp)
+
set(kazvbase_SRCS
debug.cpp
event.cpp
basejob.cpp
file-desc.cpp
)
add_library(kazvbase ${kazvbase_SRCS})
add_library(libkazv::kazvbase ALIAS kazvbase)
set_target_properties(kazvbase PROPERTIES VERSION ${libkazv_VERSION_STRING} SOVERSION ${libkazv_SOVERSION})
target_link_libraries_system(kazvbase
PUBLIC nlohmann_json::nlohmann_json
immer
zug
lager
Boost::serialization)
target_include_directories(kazvbase
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include/kazv/base>
)
+target_include_directories(kazvbase
+ PRIVATE
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
+ )
+
install(TARGETS kazvbase EXPORT libkazvTargets LIBRARY)
+
+if(libkazv_INSTALL_HEADERS)
+ # Install headers not under src/
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libkazv-defs.hpp DESTINATION ${libkazv_HEADER_INSTALL_DIR}/base)
+endif()
diff --git a/src/base/libkazv-config.hpp b/src/base/libkazv-config.hpp
index a6c9dc5..71d1d11 100644
--- a/src/base/libkazv-config.hpp
+++ b/src/base/libkazv-config.hpp
@@ -1,26 +1,28 @@
/*
* Copyright (C) 2021 Tusooa Zhu <tusooa@vista.aero>
*
* This file is part of libkazv.
*
* libkazv is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* libkazv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with libkazv. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
+#include "libkazv-defs.hpp"
+
// https://github.com/arximboldi/zug/issues/24
#ifndef ZUG_VARIANT_BOOST
#define ZUG_VARIANT_BOOST 1
#endif
diff --git a/src/base/libkazv-defs.hpp.in b/src/base/libkazv-defs.hpp.in
new file mode 100644
index 0000000..58ead74
--- /dev/null
+++ b/src/base/libkazv-defs.hpp.in
@@ -0,0 +1,7 @@
+/*
+ * This file is part of libkazv.
+ * SPDX-FileCopyrightText: 2021 Tusooa Zhu <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#define LIBKAZV_BUILT_WITH_DEBUG ${LIBKAZV_BUILT_WITH_DEBUG}
diff --git a/src/client/thread-safety-helper.hpp b/src/client/thread-safety-helper.hpp
index 0709798..ad4f51d 100644
--- a/src/client/thread-safety-helper.hpp
+++ b/src/client/thread-safety-helper.hpp
@@ -1,76 +1,76 @@
/*
* This file is part of libkazv.
* SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#pragma once
#include <libkazv-config.hpp>
-#ifndef NDEBUG
+#if LIBKAZV_BUILT_WITH_DEBUG
#ifndef KAZV_USE_THREAD_SAFETY_HELPER
#define KAZV_USE_THREAD_SAFETY_HELPER
#endif
#endif
#ifdef KAZV_USE_THREAD_SAFETY_HELPER
#include <mutex>
struct ThreadNotMatchException // Don't derive from std::exception to avoid catch-all catch clauses
{
std::string m_what;
std::string what() const;
};
struct EventLoopThreadIdKeeper
{
mutable std::mutex m_mutex;
std::optional<std::thread::id> m_id;
/// This should only be called in the event loop thread.
void set(std::thread::id id) {
std::lock_guard<std::mutex> g(m_mutex);
m_id = id;
}
std::optional<std::thread::id> get() const {
std::lock_guard<std::mutex> g(m_mutex);
return m_id;
}
};
#define KAZV_THREAD_ID_VAR _threadSafetyHelper_threadId
#define KAZV_ON_EVENT_LOOP_VAR _threadSafetyHelper_onEventLoop
#define KAZV_EVENT_LOOP_THREAD_ID_KEEPER_VAR _threadSafetyHelper_eventLoopThreadIdKeeper
#define KAZV_DECLARE_THREAD_ID() bool KAZV_ON_EVENT_LOOP_VAR{false}; \
std::thread::id KAZV_THREAD_ID_VAR = std::this_thread::get_id();
#define KAZV_DECLARE_EVENT_LOOP_THREAD_ID_KEEPER(_initializer) \
EventLoopThreadIdKeeper *KAZV_EVENT_LOOP_THREAD_ID_KEEPER_VAR = _initializer
//#define KAZV_INIT_THREAD_ID_FROM_KEEPER() KAZV_THREAD_ID_VAR(KAZV_EVENT_LOOP_THREAD_ID_KEEPER_VAR.get())
#define KAZV_VERIFY_THREAD_ID() \
do { \
auto _threadSafetyHelper_local_idActual = std::this_thread::get_id(); \
\
if (KAZV_ON_EVENT_LOOP_VAR) { \
auto _threadSafetyHelper_local_idExpected = \
KAZV_EVENT_LOOP_THREAD_ID_KEEPER_VAR ? KAZV_EVENT_LOOP_THREAD_ID_KEEPER_VAR->get() : std::nullopt; \
auto cond = \
_threadSafetyHelper_local_idExpected.has_value() \
? _threadSafetyHelper_local_idExpected.value() == _threadSafetyHelper_local_idActual \
/* if the id is not set yet it means the event loop is not yet run, so it does not matter anyway */ \
: true; \
if (!cond) { \
throw ThreadNotMatchException{"Current object belongs to the event loop, but method is called outside the event loop"}; \
} \
} else { \
if (! (KAZV_THREAD_ID_VAR == _threadSafetyHelper_local_idActual)) { \
throw ThreadNotMatchException{"Current thread id does not match the id of the thread where it belongs"}; \
} \
} \
} while (false)
#else
#define KAZV_DECLARE_THREAD_ID()
#define KAZV_VERIFY_THREAD_ID()
#define KAZV_DECLARE_EVENT_LOOP_THREAD_ID_KEEPER(_initializer)
#endif
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Nov 2, 10:24 AM (10 m, 15 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1804489
Default Alt Text
(12 KB)
Attached To
Mode
rL libkazv
Attached
Detach File
Event Timeline