blob: a4ff560efa30fc22e1399df85e65e4f25c10fc20 (
plain)
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()
|