diff options
-rw-r--r-- | CMakeLists.txt | 18 | ||||
-rw-r--r-- | bench/CMakeLists.txt | 1 | ||||
-rw-r--r-- | cmake/sanitizers.cmake | 21 | ||||
-rw-r--r-- | cmake/utils.cmake | 41 | ||||
-rw-r--r-- | cmake/version.cmake | 16 | ||||
-rw-r--r-- | example/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 11 |
7 files changed, 57 insertions, 53 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index dcc54309..519233cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,8 @@ cmake_minimum_required(VERSION 3.1) #--------------------------------------------------------------------------------------- # Start spdlog project #--------------------------------------------------------------------------------------- -include(cmake/version.cmake) +include(cmake/utils.cmake) +spdlog_extract_version() project(spdlog VERSION ${SPDLOG_VERSION} LANGUAGES CXX) message(STATUS "Build spdlog: ${SPDLOG_VERSION}") @@ -49,7 +50,6 @@ option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) - find_package(Threads REQUIRED) #--------------------------------------------------------------------------------------- @@ -63,6 +63,7 @@ target_include_directories(spdlog PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>") target_link_libraries(spdlog PUBLIC Threads::Threads) +spdlog_enable_warnings(spdlog) #--------------------------------------------------------------------------------------- # Header only version @@ -75,19 +76,6 @@ target_include_directories(spdlog_header_only INTERFACE "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>") target_link_libraries(spdlog_header_only INTERFACE Threads::Threads) -#--------------------------------------------------------------------------------------- -# Turn on compiler warnings and sanitizers if we build our own project -#--------------------------------------------------------------------------------------- -if(SPDLOG_MASTER_PROJECT) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") - target_compile_options( spdlog PRIVATE -Wall -Wextra -Wconversion -pedantic -Wfatal-errors) - endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - target_compile_options( spdlog PRIVATE /W3 /WX ) - endif() - - include(cmake/sanitizers.cmake) -endif() #--------------------------------------------------------------------------------------- # use fmt package if using exertnal fmt diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt index 6457a89d..d087cf66 100644 --- a/bench/CMakeLists.txt +++ b/bench/CMakeLists.txt @@ -13,6 +13,7 @@ find_package(Threads REQUIRED) find_package(benchmark CONFIG REQUIRED) add_executable(bench bench.cpp) +spdlog_enable_warnings(bench) target_link_libraries(bench PRIVATE spdlog::spdlog) add_executable(async_bench async_bench.cpp) diff --git a/cmake/sanitizers.cmake b/cmake/sanitizers.cmake deleted file mode 100644 index 3b090835..00000000 --- a/cmake/sanitizers.cmake +++ /dev/null @@ -1,21 +0,0 @@ -if(SPDLOG_SANITIZE_THREAD AND SPDLOG_SANITIZE_ADDRESS) - message(FATAL_ERROR "AddressSanitizer is not compatible with ThreadSanitizer.") -endif() - -if(SPDLOG_SANITIZE_ADDRESS) - message(STATUS "AddressSanitizer enabled") - set(SANITIZER_FLAGS "-fsanitize=address,undefined") - add_compile_options("-fno-sanitize=signed-integer-overflow") -endif() - -if(SPDLOG_SANITIZE_THREAD) - message(STATUS "ThreadSanitizer enabled") - set(SANITIZER_FLAGS "-fsanitize=thread") -endif() - -if(SPDLOG_SANITIZE_THREAD OR SPDLOG_SANITIZE_ADDRESS) - add_compile_options(${SANITIZER_FLAGS}) - add_compile_options("-fno-sanitize-recover=all") - add_compile_options("-fno-omit-frame-pointer") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_FLAGS} -fuse-ld=gold") -endif() diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 00000000..5ed8f9ce --- /dev/null +++ b/cmake/utils.cmake @@ -0,0 +1,41 @@ +# Get spdlog version from include/spdlog/version.h and put it in SPDLOG_VERSION
+function(spdlog_extract_version)
+ file(READ "${CMAKE_CURRENT_LIST_DIR}/include/spdlog/version.h" file_contents)
+ string(REGEX MATCH "SPDLOG_VER_MAJOR ([0-9]+)" _ "${file_contents}")
+ set(ver_major ${CMAKE_MATCH_1})
+
+ string(REGEX MATCH "SPDLOG_VER_MINOR ([0-9]+)" _ "${file_contents}")
+ set(ver_minor ${CMAKE_MATCH_1})
+ string(REGEX MATCH "SPDLOG_VER_PATCH ([0-9]+)" _ "${file_contents}")
+ set(ver_patch ${CMAKE_MATCH_1})
+
+ if (NOT ver_major OR NOT ver_minor OR NOT ver_patch)
+ message(FATAL_ERROR "Could not extract valid version from spdlog/version.h")
+ endif()
+ set (SPDLOG_VERSION "${ver_major}.${ver_minor}.${ver_patch}" PARENT_SCOPE)
+endfunction()
+
+
+# Turn on warnings on the given target
+function(spdlog_enable_warnings target_name)
+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") + target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wconversion -pedantic -Wfatal-errors) + endif() + if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + target_compile_options(${target_name} PRIVATE /W4 /WX ) + endif()
+endfunction()
+
+
+# Enable address sanitizer (gcc/clang only)
+function(spdlog_enable_sanitizer target_name) + if (NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + message(FATAL_ERROR "Sanitizer supported only for gcc/clang") + endif() + message(STATUS "Address sanitizer enabled") + target_compile_options(${target_name} "-fsanitize=address,undefined") + target_compile_options(${target_name} "-fno-sanitize=signed-integer-overflow") + target_compile_options(${target_name} "-fno-sanitize-recover=all") + target_compile_options(${target_name} "-fno-omit-frame-pointer") + target_link_libraries(${target_name} "-fsanitize=address,undefined -fuse-ld=gold") +endfunction()
\ No newline at end of file diff --git a/cmake/version.cmake b/cmake/version.cmake deleted file mode 100644 index 4f3f0360..00000000 --- a/cmake/version.cmake +++ /dev/null @@ -1,16 +0,0 @@ -#--------------------------------------------------------------------------------------- -# Get spdlog version from include/spdlog/version.h -#--------------------------------------------------------------------------------------- -file(READ "${CMAKE_CURRENT_LIST_DIR}/../include/spdlog/version.h" SPDLOG_VERSION_FILE) -string(REGEX MATCH "SPDLOG_VER_MAJOR ([0-9]+)" _ "${SPDLOG_VERSION_FILE}") -set(ver_major ${CMAKE_MATCH_1}) - -string(REGEX MATCH "SPDLOG_VER_MINOR ([0-9]+)" _ "${SPDLOG_VERSION_FILE}") -set(ver_minor ${CMAKE_MATCH_1}) -string(REGEX MATCH "SPDLOG_VER_PATCH ([0-9]+)" _ "${SPDLOG_VERSION_FILE}") -set(ver_patch ${CMAKE_MATCH_1}) - -if (NOT ver_major OR NOT ver_minor OR NOT ver_patch) - message(FATAL_ERROR "Could not extract valid version from spdlog/version.h") -endif() -set (SPDLOG_VERSION "${ver_major}.${ver_minor}.${ver_patch}")
\ No newline at end of file diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 994051f9..1f22b990 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -13,12 +13,14 @@ endif() # Example of using pre-compiled library #--------------------------------------------------------------------------------------- add_executable(example example.cpp) +spdlog_enable_warnings(example) target_link_libraries(example spdlog::spdlog) #--------------------------------------------------------------------------------------- # Example of using header-only library #--------------------------------------------------------------------------------------- add_executable(example_header_only example.cpp) +spdlog_enable_warnings(example_header_only) target_link_libraries(example_header_only spdlog::spdlog_header_only) # Create logs directory diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a59cf07b..b4192e79 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -21,13 +21,22 @@ enable_testing() # The compiled library tests if(SPDLOG_BUILD_TESTS) add_executable(spdlog-utests ${SPDLOG_UTESTS_SOURCES}) + spdlog_enable_warnings(spdlog-utests) target_link_libraries(spdlog-utests spdlog) - add_test(NAME spdlog-utests COMMAND spdlog-utests) + if(SPDLOG_SANITIZE_ADDRESS) + spdlog_enable_sanitizer(spdlog-utests) + endif() + add_test(NAME spdlog-utests COMMAND spdlog-utests) + endif() # The header-only library version tests if(SPDLOG_BUILD_HO_TESTS) add_executable(spdlog-utests-ho ${SPDLOG_UTESTS_SOURCES}) + spdlog_enable_warnings(spdlog-utests-ho) target_link_libraries(spdlog-utests-ho spdlog::spdlog_header_only) + if(SPDLOG_SANITIZE_ADDRESS) + spdlog_set_address_sanitizer(spdlog-utests-ho) + endif() add_test(NAME spdlog-utests-ho COMMAND spdlog-utests-ho) endif()
\ No newline at end of file |