mirror of
https://github.com/gabime/spdlog.git
synced 2026-10-28 17:55:45 +08:00
These messages are useful, but only once, showing them again and again and again as CMake reruns in the same build tree is more annoying than anything else. Skip doing this by defining a helper spdlog_message_once() function and use it instead of message(). Co-authored-by: Gabi Melman <gmelman1@gmail.com>
85 lines
3.7 KiB
CMake
85 lines
3.7 KiB
CMake
# 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}")
|
|
if(NOT CMAKE_MATCH_COUNT EQUAL 1)
|
|
message(FATAL_ERROR "Could not extract major version number from spdlog/version.h")
|
|
endif()
|
|
set(ver_major ${CMAKE_MATCH_1})
|
|
|
|
string(REGEX MATCH "SPDLOG_VER_MINOR ([0-9]+)" _ "${file_contents}")
|
|
if(NOT CMAKE_MATCH_COUNT EQUAL 1)
|
|
message(FATAL_ERROR "Could not extract minor version number from spdlog/version.h")
|
|
endif()
|
|
|
|
set(ver_minor ${CMAKE_MATCH_1})
|
|
string(REGEX MATCH "SPDLOG_VER_PATCH ([0-9]+)" _ "${file_contents}")
|
|
if(NOT CMAKE_MATCH_COUNT EQUAL 1)
|
|
message(FATAL_ERROR "Could not extract patch version number from spdlog/version.h")
|
|
endif()
|
|
set(ver_patch ${CMAKE_MATCH_1})
|
|
|
|
set(SPDLOG_VERSION_MAJOR ${ver_major} PARENT_SCOPE)
|
|
set(SPDLOG_VERSION_MINOR ${ver_minor} PARENT_SCOPE)
|
|
set(SPDLOG_VERSION_PATCH ${ver_patch} PARENT_SCOPE)
|
|
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(SPDLOG_BUILD_WARNINGS)
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|
list(APPEND MSVC_OPTIONS "/W3")
|
|
if(MSVC_VERSION GREATER 1900) # Allow non fatal security warnings for msvc 2015
|
|
list(APPEND MSVC_OPTIONS "/WX")
|
|
endif()
|
|
endif()
|
|
|
|
target_compile_options(
|
|
${target_name}
|
|
PRIVATE $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
|
|
-Wall
|
|
-Wextra
|
|
-Wconversion
|
|
-pedantic
|
|
-Werror
|
|
-Wfatal-errors>
|
|
$<$<CXX_COMPILER_ID:MSVC>:${MSVC_OPTIONS}>)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Enable address sanitizer (gcc/clang only)
|
|
function(spdlog_enable_addr_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} PRIVATE -fsanitize=address,undefined)
|
|
target_compile_options(${target_name} PRIVATE -fno-sanitize=signed-integer-overflow)
|
|
target_compile_options(${target_name} PRIVATE -fno-sanitize-recover=all)
|
|
target_compile_options(${target_name} PRIVATE -fno-omit-frame-pointer)
|
|
target_link_libraries(${target_name} PRIVATE -fsanitize=address,undefined)
|
|
endfunction()
|
|
|
|
# Enable thread sanitizer (gcc/clang only)
|
|
function(spdlog_enable_thread_sanitizer target_name)
|
|
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
|
message(FATAL_ERROR "Sanitizer supported only for gcc/clang")
|
|
endif()
|
|
message(STATUS "Thread sanitizer enabled")
|
|
target_compile_options(${target_name} PRIVATE -fsanitize=thread)
|
|
target_compile_options(${target_name} PRIVATE -fno-omit-frame-pointer)
|
|
target_link_libraries(${target_name} PRIVATE -fsanitize=thread)
|
|
endfunction()
|
|
|
|
# Show a status message during the first CMake run only, as repeating it during
|
|
# the automatic reconfigurations of a parent project including us is just noise.
|
|
# The key identifies the message and has to be unique, the text is shown again
|
|
# if it changes, e.g. when the build type is different from the previous run.
|
|
function(spdlog_message_once key text)
|
|
if(NOT "${text}" STREQUAL "$CACHE{SPDLOG_MESSAGE_${key}}")
|
|
set(SPDLOG_MESSAGE_${key} "${text}" CACHE INTERNAL "")
|
|
message(STATUS "${text}")
|
|
endif()
|
|
endfunction()
|