1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
# FindSpdlog
# -------
# Finds the Spdlog library
#
# This will define the following target:
#
# spdlog::spdlog - The Spdlog library
macro(buildSpdlog)
if(APPLE)
set(EXTRA_ARGS "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
endif()
if(WIN32 OR WINDOWS_STORE)
set(patches "${CMAKE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/001-windows-pdb-symbol-gen.patch")
generate_patchcommand("${patches}")
set(EXTRA_ARGS -DSPDLOG_WCHAR_SUPPORT=ON
-DSPDLOG_WCHAR_FILENAMES=ON)
set(EXTRA_DEFINITIONS SPDLOG_WCHAR_FILENAMES
SPDLOG_WCHAR_TO_UTF8_SUPPORT)
endif()
set(SPDLOG_VERSION ${${MODULE}_VER})
# spdlog debug uses postfix d for all platforms
set(SPDLOG_DEBUG_POSTFIX d)
set(CMAKE_ARGS -DCMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
-DSPDLOG_BUILD_EXAMPLE=OFF
-DSPDLOG_BUILD_TESTS=OFF
-DSPDLOG_BUILD_BENCH=OFF
-DSPDLOG_FMT_EXTERNAL=ON
${EXTRA_ARGS})
# Set definitions that will be set in the built cmake config file
# We dont import the config file if we build internal (chicken/egg scenario)
set(_spdlog_definitions SPDLOG_COMPILED_LIB
SPDLOG_FMT_EXTERNAL
${EXTRA_DEFINITIONS})
BUILD_DEP_TARGET()
add_dependencies(${MODULE_LC} fmt::fmt)
endmacro()
if(NOT TARGET spdlog::spdlog)
include(cmake/scripts/common/ModuleHelpers.cmake)
# Check for dependencies - Must be done before SETUP_BUILD_VARS
# Todo: We might need a way to do this after SETUP_BUILD_VARS...
if(ENABLE_INTERNAL_SPDLOG)
get_libversion_data("fmt" "target")
find_package(Fmt ${LIB_FMT_VER} MODULE REQUIRED)
endif()
if(TARGET fmt::fmt)
# Check if we want to force a build due to a dependency rebuild
get_property(LIB_FORCE_REBUILD TARGET fmt::fmt PROPERTY LIB_BUILD)
endif()
set(MODULE_LC spdlog)
SETUP_BUILD_VARS()
# Check for existing SPDLOG. If version >= SPDLOG-VERSION file version, dont build
find_package(SPDLOG CONFIG QUIET
HINTS ${DEPENDS_PATH}/lib/cmake
${${CORE_PLATFORM_LC}_SEARCH_CONFIG})
if((SPDLOG_VERSION VERSION_LESS ${${MODULE}_VER} AND ENABLE_INTERNAL_SPDLOG) OR
((CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL freebsd) AND ENABLE_INTERNAL_SPDLOG) OR
LIB_FORCE_REBUILD)
buildSpdlog()
else()
if(NOT TARGET spdlog::spdlog)
find_package(PkgConfig)
# Fallback to pkg-config and individual lib/include file search
if(PKG_CONFIG_FOUND)
pkg_check_modules(PC_SPDLOG spdlog QUIET)
set(SPDLOG_VERSION ${PC_SPDLOG_VERSION})
endif()
find_path(SPDLOG_INCLUDE_DIR NAMES spdlog/spdlog.h
HINTS ${DEPENDS_PATH}/include ${PC_SPDLOG_INCLUDEDIR}
${${CORE_PLATFORM_LC}_SEARCH_CONFIG}
NO_CACHE)
find_library(SPDLOG_LIBRARY_RELEASE NAMES spdlog
HINTS ${DEPENDS_PATH}/lib ${PC_SPDLOG_LIBDIR}
${${CORE_PLATFORM_LC}_SEARCH_CONFIG}
NO_CACHE)
find_library(SPDLOG_LIBRARY_DEBUG NAMES spdlogd
HINTS ${DEPENDS_PATH}/lib ${PC_SPDLOG_LIBDIR}
${${CORE_PLATFORM_LC}_SEARCH_CONFIG}
NO_CACHE)
# Only add -D definitions. Skip -I include as we do a find_path for the header anyway
foreach(_spdlog_cflag IN LISTS PC_SPDLOG_CFLAGS)
if(${_spdlog_cflag} MATCHES "^-D(.*)")
list(APPEND _spdlog_definitions ${CMAKE_MATCH_1})
endif()
endforeach()
endif()
endif()
if(TARGET spdlog::spdlog)
# This is for the case where a distro provides a non standard (Debug/Release) config type
# eg Debian's config file is spdlogConfigTargets-none.cmake
# convert this back to either DEBUG/RELEASE or just RELEASE
# we only do this because we use find_package_handle_standard_args for config time output
# and it isnt capable of handling TARGETS, so we have to extract the info
get_target_property(_SPDLOG_CONFIGURATIONS spdlog::spdlog IMPORTED_CONFIGURATIONS)
foreach(_spdlog_config IN LISTS _SPDLOG_CONFIGURATIONS)
# Some non standard config (eg None on Debian)
# Just set to RELEASE var so select_library_configurations can continue to work its magic
string(TOUPPER ${_spdlog_config} _spdlog_config_UPPER)
if((NOT ${_spdlog_config_UPPER} STREQUAL "RELEASE") AND
(NOT ${_spdlog_config_UPPER} STREQUAL "DEBUG"))
get_target_property(SPDLOG_LIBRARY_RELEASE spdlog::spdlog IMPORTED_LOCATION_${_spdlog_config_UPPER})
else()
get_target_property(SPDLOG_LIBRARY_${_spdlog_config_UPPER} spdlog::spdlog IMPORTED_LOCATION_${_spdlog_config_UPPER})
endif()
endforeach()
get_target_property(SPDLOG_INCLUDE_DIR spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES)
endif()
include(SelectLibraryConfigurations)
select_library_configurations(SPDLOG)
unset(SPDLOG_LIBRARIES)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Spdlog
REQUIRED_VARS SPDLOG_LIBRARY SPDLOG_INCLUDE_DIR
VERSION_VAR SPDLOG_VERSION)
if(Spdlog_FOUND)
if(NOT TARGET spdlog::spdlog)
# Ideally we probably shouldnt be overriding these. We should trust the cmake config file
list(APPEND _spdlog_definitions SPDLOG_DEBUG_ON
SPDLOG_NO_ATOMIC_LEVELS)
add_library(spdlog::spdlog UNKNOWN IMPORTED)
if(SPDLOG_LIBRARY_RELEASE)
set_target_properties(spdlog::spdlog PROPERTIES
IMPORTED_CONFIGURATIONS RELEASE
IMPORTED_LOCATION_RELEASE "${SPDLOG_LIBRARY_RELEASE}")
endif()
if(SPDLOG_LIBRARY_DEBUG)
set_target_properties(spdlog::spdlog PROPERTIES
IMPORTED_CONFIGURATIONS DEBUG
IMPORTED_LOCATION_DEBUG "${SPDLOG_LIBRARY_DEBUG}")
endif()
set_target_properties(spdlog::spdlog PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${SPDLOG_INCLUDE_DIR}")
# We need to append in case the cmake config already has definitions
set_property(TARGET spdlog::spdlog APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS "${_spdlog_definitions}")
endif()
set_property(GLOBAL APPEND PROPERTY INTERNAL_DEPS_PROP spdlog::spdlog)
if(TARGET spdlog)
add_dependencies(spdlog::spdlog spdlog)
endif()
# Add internal build target when a Multi Config Generator is used
# We cant add a dependency based off a generator expression for targeted build types,
# https://gitlab.kitware.com/cmake/cmake/-/issues/19467
# therefore if the find heuristics only find the library, we add the internal build
# target to the project to allow user to manually trigger for any build type they need
# in case only a specific build type is actually available (eg Release found, Debug Required)
# This is mainly targeted for windows who required different runtime libs for different
# types, and they arent compatible
if(_multiconfig_generator)
if(NOT TARGET spdlog)
buildSpdlog()
set_target_properties(spdlog PROPERTIES EXCLUDE_FROM_ALL TRUE)
endif()
add_dependencies(build_internal_depends spdlog)
endif()
endif()
endif()
|