From 428fcacc18d576845c26efb9c718b91e3a4fd8c8 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 19 Feb 2025 09:35:47 -0600 Subject: [PATCH] updated build system --- CMakeLists.txt | 5 ++ cmake/versions.cmake | 10 +-- config.sh | 1 + scripts/env.sh | 3 + support/include/utils/error.hpp | 121 ++++++++++++++++++++++++++------ support/src/utils/error.cpp | 53 +++++++++++++- 6 files changed, 166 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b80e84..70a7dd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,10 @@ if(PROJECT_IS_MINGW) endif() endif() +if (PROJECT_ENABLE_V2_ERRORS) + add_definitions(-DPROJECT_ENABLE_V2_ERRORS) +endif() + include(cmake/settings.cmake) include(cmake/flags.cmake) @@ -143,6 +147,7 @@ endif() -DPROJECT_COPYRIGHT=${PROJECT_COPYRIGHT} -DPROJECT_DESC=${PROJECT_DESC} -DPROJECT_DIST_DIR=${PROJECT_DIST_DIR} + -DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS} -DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES} -DPROJECT_ENABLE_BACKWARD_CPP=${PROJECT_ENABLE_BACKWARD_CPP} -DPROJECT_ENABLE_CPP_HTTPLIB=${PROJECT_ENABLE_CPP_HTTPLIB} diff --git a/cmake/versions.cmake b/cmake/versions.cmake index 61c7be1..d57d39e 100644 --- a/cmake/versions.cmake +++ b/cmake/versions.cmake @@ -1,15 +1,15 @@ set(BINUTILS_VERSION 2.43) -set(BOOST2_MAJOR_VERSION 1) -set(BOOST2_MINOR_VERSION 76) -set(BOOST2_PATCH_VERSION 0) set(BOOST_MAJOR_VERSION 1) set(BOOST_MINOR_VERSION 87) set(BOOST_PATCH_VERSION 0) +set(BOOST2_MAJOR_VERSION 1) +set(BOOST2_MINOR_VERSION 76) +set(BOOST2_PATCH_VERSION 0) set(CPP_HTTPLIB_VERSION 0.18.1) -set(CURL2_VERSION 8_11_0) set(CURL_VERSION 8.11.0) -set(EXPAT2_VERSION 2_6_4) +set(CURL2_VERSION 8_11_0) set(EXPAT_VERSION 2.6.4) +set(EXPAT2_VERSION 2_6_4) set(GCC_VERSION 14.2.0) set(GTEST_VERSION 1.15.2) set(ICU_VERSION 76-1) diff --git a/config.sh b/config.sh index d69d1f9..12250b9 100644 --- a/config.sh +++ b/config.sh @@ -23,6 +23,7 @@ PROJECT_STATIC_LINK=ON PROJECT_MINGW64_COPY_DEPENDENCIES+=() PROJECT_MSYS2_PACKAGE_LIST+=() +PROJECT_ENABLE_V2_ERRORS=ON PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF PROJECT_ENABLE_CPP_HTTPLIB=ON diff --git a/scripts/env.sh b/scripts/env.sh index d43bc1c..cd0c8df 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -42,6 +42,7 @@ done PROJECT_APP_LIST=() PROJECT_CMAKE_OPTS="" PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF +PROJECT_ENABLE_V2_ERRORS=OFF PROJECT_IS_ALPINE=0 PROJECT_IS_ARM64=0 PROJECT_MINGW64_COPY_DEPENDENCIES=() @@ -234,6 +235,7 @@ PROJECT_CMAKE_OPTS="-DPROJECT_BUILD_DIR=${PROJECT_BUILD_DIR} ${PROJECT_CMAKE_OPT PROJECT_CMAKE_OPTS="-DPROJECT_BUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_CMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_DIST_DIR=${PROJECT_DIST_DIR} ${PROJECT_CMAKE_OPTS}" +PROJECT_CMAKE_OPTS="-DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_EXTERNAL_BUILD_ROOT} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_GIT_REV=${PROJECT_GIT_REV} ${PROJECT_CMAKE_OPTS}" @@ -305,6 +307,7 @@ export PROJECT_COPYRIGHT export PROJECT_DESC export PROJECT_DIST_DIR export PROJECT_ENABLE_WIN32_LONG_PATH_NAMES +export PROJECT_ENABLE_V2_ERRORS export PROJECT_FILE_PART export PROJECT_GIT_REV export PROJECT_IS_ALPINE diff --git a/support/include/utils/error.hpp b/support/include/utils/error.hpp index 4c577a3..8fa36f6 100644 --- a/support/include/utils/error.hpp +++ b/support/include/utils/error.hpp @@ -25,12 +25,16 @@ #include "utils/config.hpp" namespace monitarr::utils::error { -[[nodiscard]] auto -create_error_message(std::vector items) -> std::string; +[[nodiscard]] auto create_error_message(std::vector items) + -> std::string; -[[nodiscard]] auto -create_exception(std::string_view function_name, - std::vector items) -> std::runtime_error; +[[nodiscard]] auto create_error_message(std::string_view function_name, + std::vector items) + -> std::string; + +[[nodiscard]] auto create_exception(std::string_view function_name, + std::vector items) + -> std::runtime_error; struct i_exception_handler { virtual ~i_exception_handler() {} @@ -40,6 +44,11 @@ struct i_exception_handler { auto operator=(const i_exception_handler &) noexcept = delete; auto operator=(i_exception_handler &&) noexcept = delete; +#if defined(PROJECT_ENABLE_V2_ERRORS) + virtual void handle_debug(std::string_view function_name, + std::string_view msg) const = 0; +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + virtual void handle_error(std::string_view function_name, std::string_view msg) const = 0; @@ -48,56 +57,128 @@ struct i_exception_handler { virtual void handle_exception(std::string_view function_name, const std::exception &ex) const = 0; +#if defined(PROJECT_ENABLE_V2_ERRORS) + virtual void handle_info(std::string_view function_name, + std::string_view msg) const = 0; + + virtual void handle_trace(std::string_view function_name, + std::string_view msg) const = 0; + + virtual void handle_warn(std::string_view function_name, + std::string_view msg) const = 0; +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + protected: i_exception_handler() = default; }; struct iostream_exception_handler final : i_exception_handler { +#if defined(PROJECT_ENABLE_V2_ERRORS) + void handle_debug(std::string_view function_name, + std::string_view msg) const override { + std::cout << create_error_message(function_name, + { + "debug", + msg, + }) + << std::endl; + } +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + void handle_error(std::string_view function_name, std::string_view msg) const override { - std::cerr << create_error_message({ - function_name, - msg, - }) + std::cerr << create_error_message(function_name, + { + "error", + msg, + }) << std::endl; } void handle_exception(std::string_view function_name) const override { - std::cerr << create_error_message({ - function_name, - "exception", - "unknown", - }) + std::cerr << create_error_message(function_name, + { + "error", + "exception", + "unknown", + }) << std::endl; } void handle_exception(std::string_view function_name, const std::exception &ex) const override { - std::cerr << create_error_message({ + std::cerr << create_error_message( function_name, - "exception", - (ex.what() == nullptr ? "unknown" : ex.what()), - }) + { + "error", + "exception", + (ex.what() == nullptr ? "unknown" : ex.what()), + }) << std::endl; } + +#if defined(PROJECT_ENABLE_V2_ERRORS) + void handle_info(std::string_view function_name, + std::string_view msg) const override { + std::cout << create_error_message(function_name, + { + "info", + msg, + }) + << std::endl; + } + + void handle_trace(std::string_view function_name, + std::string_view msg) const override { + std::cout << create_error_message(function_name, + { + "trace", + msg, + }) + << std::endl; + } + + void handle_warn(std::string_view function_name, + std::string_view msg) const override { + std::cout << create_error_message(function_name, + { + "warn", + msg, + }) + << std::endl; + } +#endif // defined(PROJECT_ENABLE_V2_ERRORS) }; + inline const iostream_exception_handler default_exception_handler{}; extern std::atomic exception_handler; #if defined(PROJECT_ENABLE_TESTING) -[[nodiscard]] inline auto -get_exception_handler() -> const i_exception_handler * { +[[nodiscard]] inline auto get_exception_handler() + -> const i_exception_handler * { return exception_handler; } #endif // defined(PROJECT_ENABLE_TESTING) +#if defined(PROJECT_ENABLE_V2_ERRORS) +void handle_debug(std::string_view function_name, std::string_view msg); +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + void handle_error(std::string_view function_name, std::string_view msg); void handle_exception(std::string_view function_name); void handle_exception(std::string_view function_name, const std::exception &ex); +#if defined(PROJECT_ENABLE_V2_ERRORS) +void handle_info(std::string_view function_name, std::string_view msg); + +void handle_trace(std::string_view function_name, std::string_view msg); + +void handle_warn(std::string_view function_name, std::string_view msg); +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + void set_exception_handler(const i_exception_handler *handler); } // namespace monitarr::utils::error diff --git a/support/src/utils/error.cpp b/support/src/utils/error.cpp index fe9ddb1..68c3c99 100644 --- a/support/src/utils/error.cpp +++ b/support/src/utils/error.cpp @@ -38,13 +38,30 @@ auto create_error_message(std::vector items) -> std::string { return stream.str(); } +auto create_error_message(std::string_view function_name, + std::vector items) -> std::string { + items.insert(items.begin(), function_name); + return create_error_message(items); +} + auto create_exception(std::string_view function_name, std::vector items) -> std::runtime_error { - items.insert(items.begin(), function_name); - return std::runtime_error(create_error_message(items)); + return std::runtime_error(create_error_message(function_name, items)); } +#if defined(PROJECT_ENABLE_V2_ERRORS) +void handle_debug(std::string_view function_name, std::string_view msg) { + const i_exception_handler *handler{exception_handler}; + if (handler != nullptr) { + handler->handle_debug(function_name, msg); + return; + } + + default_exception_handler.handle_debug(function_name, msg); +} +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + void handle_error(std::string_view function_name, std::string_view msg) { const i_exception_handler *handler{exception_handler}; if (handler != nullptr) { @@ -76,6 +93,38 @@ void handle_exception(std::string_view function_name, default_exception_handler.handle_exception(function_name, ex); } +#if defined(PROJECT_ENABLE_V2_ERRORS) +void handle_info(std::string_view function_name, std::string_view msg) { + const i_exception_handler *handler{exception_handler}; + if (handler != nullptr) { + handler->handle_info(function_name, msg); + return; + } + + default_exception_handler.handle_info(function_name, msg); +} + +void handle_trace(std::string_view function_name, std::string_view msg) { + const i_exception_handler *handler{exception_handler}; + if (handler != nullptr) { + handler->handle_trace(function_name, msg); + return; + } + + default_exception_handler.handle_trace(function_name, msg); +} + +void handle_warn(std::string_view function_name, std::string_view msg) { + const i_exception_handler *handler{exception_handler}; + if (handler != nullptr) { + handler->handle_warn(function_name, msg); + return; + } + + default_exception_handler.handle_warn(function_name, msg); +} +#endif // defined(PROJECT_ENABLE_V2_ERRORS) + void set_exception_handler(const i_exception_handler *handler) { exception_handler = handler; }