Skip to content

Commit c64c403

Browse files
committed
Fix log macro doesn't work without format args; copy lib in Windows properly
1 parent c7f3492 commit c64c403

File tree

3 files changed

+50
-26
lines changed

3 files changed

+50
-26
lines changed

CHANGELOG

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
- Change include folder structure from include/slick_socket/ to include/slick/
33
- Change namespace from slick_socket to slick::socket
44
- Add GitHub CI workflow
5-
- Fix MacOS build by using kqueue/kevent
5+
- Fix MacOS build
6+
- Fix example log macros doesn't work without format args
67

78
#1.0.0.0 - [09/26/2025]
89
- Initial Release

CMakeLists.txt

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ set(BUILD_VERSION 1.0.0.1)
88
project(slick_socket VERSION ${BUILD_VERSION} LANGUAGES C CXX)
99

1010
if (NOT CMAKE_BUILD_TYPE)
11-
set(CMAKE_BUILD_TYPE Release)
11+
set(CMAKE_BUILD_TYPE Release)
1212
endif()
1313

1414
if (CMAKE_BUILD_TYPE MATCHES Debug)
15-
add_definitions(-DDEBUG)
15+
add_definitions(-DDEBUG)
1616
endif()
1717

1818
if (CMAKE_BUILD_TYPE MATCHES Release)
19-
add_definitions(-DNDEBUG)
19+
add_definitions(-DNDEBUG)
2020
endif()
2121

2222
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
@@ -86,27 +86,36 @@ endif()
8686

8787
# Automatically run install after build in Release mode
8888
if(CMAKE_BUILD_TYPE STREQUAL "Release")
89-
add_custom_target(dist_slick_socket ALL
89+
if (WIN32)
90+
add_custom_target(dist_slick_socket ALL
9091
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/dist/include
92+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}/slick_socket.lib ${CMAKE_BINARY_DIR}/dist/lib/slick_socket.lib
9193
COMMENT "Copying slick_socket headers to dist/include"
9294
VERBATIM
93-
)
95+
)
96+
else()
97+
add_custom_target(dist_slick_socket ALL
98+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/dist/include
99+
COMMENT "Copying slick_socket headers to dist/include"
100+
VERBATIM
101+
)
102+
endif()
94103

95104
if (PROJECT_IS_TOP_LEVEL)
96-
if (WIN32)
97-
add_custom_target(package_slick_socket ALL
98-
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include" "lib"
99-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dist"
100-
COMMENT "Creating zip archive"
101-
)
102-
else()
103-
add_custom_target(package_slick_socket ALL
104-
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include"
105-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dist"
106-
COMMENT "Creating zip archive"
107-
)
108-
endif()
109-
110-
add_dependencies(package_slick_socket dist_slick_socket)
105+
if (WIN32)
106+
add_custom_target(package_slick_socket ALL
107+
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include" "lib"
108+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dist"
109+
COMMENT "Creating zip archive"
110+
)
111+
else()
112+
add_custom_target(package_slick_socket ALL
113+
COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_BINARY_DIR}/dist/slick_socket_${BUILD_VERSION}.zip" --format=zip "include"
114+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dist"
115+
COMMENT "Creating zip archive"
116+
)
117+
endif()
118+
119+
add_dependencies(package_slick_socket dist_slick_socket)
111120
endif()
112121
endif()

examples/logger.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
11
#pragma once
22

3+
// NOTE: This is a simple example logger for demonstration purposes.
4+
// For production use, consider using a proper logging library like spdlog or slick_logger.
5+
36
#include <iostream>
47
#include <chrono>
58
#include <format>
69

7-
#define LOG_DEBUG(fmt, ...) std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now()) << "[DEBUG] " << std::format(fmt __VA_OPT__(,) __VA_ARGS__) << std::endl
8-
#define LOG_INFO(fmt, ...) std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now()) << "[INFO] " << std::format(fmt __VA_OPT__(,) __VA_ARGS__) << std::endl
9-
#define LOG_WARN(fmt, ...) std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now()) << "[WARNING] " << std::format(fmt __VA_OPT__(,) __VA_ARGS__) << std::endl
10-
#define LOG_ERROR(fmt, ...) std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now()) << "[ERROR] " << std::format(fmt __VA_OPT__(,) __VA_ARGS__) << std::endl
11-
#define LOG_TRACE(fmt, ...) std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now()) << "[TRACE] " << std::format(fmt __VA_OPT__(,) __VA_ARGS__) << std::endl
10+
namespace {
11+
// Single function using vformat handles both cases: with and without arguments
12+
template<typename... Args>
13+
void log_impl(const std::string& level, const std::string& fmt, Args&&... args)
14+
{
15+
std::cout << std::format("{:%Y-%m-%d %H:%M:%S} ", std::chrono::system_clock::now())
16+
<< "[" << level << "] " << std::vformat(fmt, std::make_format_args(args...)) << std::endl;
17+
}
18+
}
19+
20+
// Works with any number of arguments
21+
#define LOG_DEBUG(fmt, ...) log_impl("DEBUG", fmt, ##__VA_ARGS__)
22+
#define LOG_INFO(fmt, ...) log_impl("INFO", fmt, ##__VA_ARGS__)
23+
#define LOG_WARN(fmt, ...) log_impl("WARNING", fmt, ##__VA_ARGS__)
24+
#define LOG_ERROR(fmt, ...) log_impl("ERROR", fmt, ##__VA_ARGS__)
25+
#define LOG_TRACE(fmt, ...) log_impl("TRACE", fmt, ##__VA_ARGS__)

0 commit comments

Comments
 (0)