From 3cdc1add989da0efaa77455a1388eb9f9e737984 Mon Sep 17 00:00:00 2001 From: Chris Apple Date: Tue, 24 Dec 2024 08:29:12 -0700 Subject: [PATCH] Make libfmt or stb either/or, change libfmt `LogFmt` to just be `Log` (#31) Limit the build to only supporting the stb version, or the libfmt version by default. This is in an attempt to prevent users from downloading multiple dependencies they don't use. In addition, making a backwards incompatible change, the name of the `LogFmt` method is now just `Log` --- CMakeLists.txt | 3 ++- README.md | 4 ++- examples/everlog/everlogmain.cpp | 23 ++++++++++------ include/rtlog/rtlog.h | 13 +++++++-- test/test_rtlog.cpp | 45 +++++++++++++++++--------------- 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d568be..4925ff3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ if(NOT TARGET readerwriterqueue) FetchContent_MakeAvailable(ReaderWriterQueue) endif() -if(NOT TARGET stb::stb) +if(NOT RTSAN_USE_FMTLIB AND NOT TARGET stb::stb) # Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24: if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") cmake_policy(SET CMP0135 NEW) @@ -98,6 +98,7 @@ target_compile_definitions(rtlog INTERFACE STB_SPRINTF_IMPLEMENTATION $<$:RTLOG_USE_FMTLIB> + $<$>:RTLOG_USE_STB> $<$:DEBUG> $<$:NDEBUG> ) diff --git a/README.md b/README.md index 12463ce..4fe8c51 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,9 @@ RealtimeLogger logger; void SomeRealtimeCallback() { logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Audio}, "Hello, world! %i", 42); - logger.LogFmt({ExampleLogData::Debug, ExampleLogRegion::Audio, FMT_STRING("Hello, world! {}", 42); + + // using RTSAN_USE_LIBFMT + logger.Log({ExampleLogData::Debug, ExampleLogRegion::Audio, FMT_STRING("Hello, world! {}", 42); } ... diff --git a/examples/everlog/everlogmain.cpp b/examples/everlog/everlogmain.cpp index bf29cfc..f28c832 100644 --- a/examples/everlog/everlogmain.cpp +++ b/examples/everlog/everlogmain.cpp @@ -121,6 +121,7 @@ static rtlog::Logger #include +#if !defined(RTLOG_USE_FMTLIB) && !defined(RTLOG_USE_STB) +// The default behavior to match legacy behavior is to use STB +#define RTLOG_USE_STB +#endif + #ifdef RTLOG_USE_FMTLIB #include #endif // RTLOG_USE_FMTLIB #include +#ifdef RTLOG_USE_STB #ifndef STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_IMPLEMENTATION #endif @@ -21,6 +27,7 @@ #endif #include +#endif // RTLOG_USE_STB #if defined(__has_feature) #if __has_feature(realtime_sanitizer) @@ -96,6 +103,7 @@ class Logger { * message was truncated, the function returns * `Status::Error_MessageTruncated`. Otherwise, it returns `Status::Success`. */ +#ifdef RTLOG_USE_STB Status Logv(LogData &&inputData, const char *format, va_list args) noexcept RTLOG_NONBLOCKING { auto retVal = Status::Success; @@ -156,6 +164,7 @@ class Logger { va_end(args); return retVal; } +#endif // RTLOG_USE_STB #ifdef RTLOG_USE_FMTLIB @@ -187,8 +196,8 @@ class Logger { * `Status::Error_MessageTruncated`. Otherwise, it returns `Status::Success`. */ template - Status LogFmt(LogData &&inputData, fmt::format_string fmtString, - T &&...args) noexcept RTLOG_NONBLOCKING { + Status Log(LogData &&inputData, fmt::format_string fmtString, + T &&...args) noexcept RTLOG_NONBLOCKING { auto retVal = Status::Success; InternalLogData dataToQueue; diff --git a/test/test_rtlog.cpp b/test/test_rtlog.cpp index 10818ee..a924a1c 100644 --- a/test/test_rtlog.cpp +++ b/test/test_rtlog.cpp @@ -66,6 +66,8 @@ static auto PrintMessage = [](const ExampleLogData &data, size_t sequenceNumber, using namespace rtlog::test; +#ifdef RTLOG_USE_STB + TEST(RtlogTest, BasicConstruction) { rtlog::Logger @@ -193,6 +195,7 @@ TEST(RtlogTest, ErrorsReturnedFromLog) { }; EXPECT_EQ(truncatedLogger.PrintAndClearLogQueue(InspectLogMessage), 1); } +#endif // RTLOG_USE_STB #ifdef RTLOG_USE_FMTLIB @@ -201,39 +204,39 @@ TEST(LoggerTest, FormatLibVersionWorksAsIntended) { gSequenceNumber> logger; - logger.LogFmt({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, - FMT_STRING("Hello, {}!"), 123l); - logger.LogFmt({ExampleLogLevel::Info, ExampleLogRegion::Game}, - FMT_STRING("Hello, {}!"), 123.0f); - logger.LogFmt({ExampleLogLevel::Warning, ExampleLogRegion::Network}, - FMT_STRING("Hello, {}!"), 123.0); - logger.LogFmt({ExampleLogLevel::Critical, ExampleLogRegion::Audio}, - FMT_STRING("Hello, {}!"), (void *)123); - logger.LogFmt({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, - FMT_STRING("Hello, {}!"), 123); - logger.LogFmt({ExampleLogLevel::Critical, ExampleLogRegion::Audio}, - FMT_STRING("Hello, {}!"), "world"); + logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, + FMT_STRING("Hello, {}!"), 123l); + logger.Log({ExampleLogLevel::Info, ExampleLogRegion::Game}, + FMT_STRING("Hello, {}!"), 123.0f); + logger.Log({ExampleLogLevel::Warning, ExampleLogRegion::Network}, + FMT_STRING("Hello, {}!"), 123.0); + logger.Log({ExampleLogLevel::Critical, ExampleLogRegion::Audio}, + FMT_STRING("Hello, {}!"), (void *)123); + logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, + FMT_STRING("Hello, {}!"), 123); + logger.Log({ExampleLogLevel::Critical, ExampleLogRegion::Audio}, + FMT_STRING("Hello, {}!"), "world"); EXPECT_EQ(logger.PrintAndClearLogQueue(PrintMessage), 6); } -TEST(LoggerTest, LogFmtReturnsSuccessOnNormalEnqueue) { +TEST(LoggerTest, LogReturnsSuccessOnNormalEnqueue) { rtlog::Logger logger; - EXPECT_EQ(logger.LogFmt({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, - FMT_STRING("Hello, {}!"), 123l), + EXPECT_EQ(logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, + FMT_STRING("Hello, {}!"), 123l), rtlog::Status::Success); } -TEST(LoggerTest, LogFmtHandlesLongMessageTruncation) { +TEST(LoggerTest, LogHandlesLongMessageTruncation) { const auto maxMessageLength = 10; rtlog::Logger logger; - EXPECT_EQ(logger.LogFmt({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, - FMT_STRING("Hello, {}! xxxxxxxxxxx"), 123l), + EXPECT_EQ(logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, + FMT_STRING("Hello, {}! xxxxxxxxxxx"), 123l), rtlog::Status::Error_MessageTruncated); auto InspectLogMessage = [=](const ExampleLogData &data, @@ -257,7 +260,7 @@ TEST(LoggerTest, LogFmtHandlesLongMessageTruncation) { EXPECT_EQ(logger.PrintAndClearLogQueue(InspectLogMessage), 1); } -TEST(LoggerTest, LogFmtHandlesQueueFullError) { +TEST(LoggerTest, LogHandlesQueueFullError) { const auto maxNumMessages = 10; rtlog::Logger @@ -266,8 +269,8 @@ TEST(LoggerTest, LogFmtHandlesQueueFullError) { auto status = rtlog::Status::Success; while (status == rtlog::Status::Success) { - status = logger.LogFmt({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, - FMT_STRING("Hello, {}!"), "world"); + status = logger.Log({ExampleLogLevel::Debug, ExampleLogRegion::Engine}, + FMT_STRING("Hello, {}!"), "world"); } EXPECT_EQ(status, rtlog::Status::Error_QueueFull);