Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
12 KB
Referenced Files
None
Subscribers
None
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

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)

Event Timeline