@@ -63,6 +63,10 @@ option(VIX_HEADER_ONLY "Build vix_utils as header-only INTERFACE" OFF)
6363option (VIX_UTILS_BUILD_EXAMPLES "Build utils examples" OFF )
6464option (VIX_UTILS_BUILD_TESTS "Build utils CMake regression tests" OFF )
6565option (VIX_UTILS_FETCH_THIRD_PARTY "Auto-fetch spdlog and fmt if not installed" ON )
66+ option (VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS
67+ "Use FetchContent fmt and spdlog header-only providers for an SDK"
68+ OFF
69+ )
6670
6771# --------------------------------------------------------------------
6872# Git / Build metadata
@@ -92,12 +96,15 @@ string(TIMESTAMP VIX_BUILD_DATE "%Y-%m-%d %H:%M:%S UTC" UTC)
9296# --------------------------------------------------------------------
9397set (_VIX_SPDLOG_TARGET "" )
9498set (_VIX_FMT_TARGET "" )
99+ set (_VIX_LOGGING_DEPS_BUNDLED OFF )
100+ set (VIX_UTILS_PACKAGE_WITH_THREADS OFF )
95101
96102# FetchContent options are cache variables, so Vix's private spdlog setup
97103# must not leave configuration behind for a consumer's later add_subdirectory.
98104macro (vix_utils_push_spdlog_fetch_options )
99105 foreach (_vix_option IN ITEMS
100- SPDLOG_FMT_EXTERNAL SPDLOG_BUILD_EXAMPLE SPDLOG_BUILD_EXAMPLES
106+ SPDLOG_FMT_EXTERNAL SPDLOG_FMT_EXTERNAL_HO
107+ SPDLOG_BUILD_EXAMPLE SPDLOG_BUILD_EXAMPLES
101108 SPDLOG_BUILD_TESTS SPDLOG_BUILD_BENCH SPDLOG_INSTALL)
102109 if (DEFINED ${_vix_option} )
103110 set (_VIX_UTILS_${_vix_option} _NORMAL_DEFINED TRUE )
@@ -113,13 +120,25 @@ macro(vix_utils_push_spdlog_fetch_options)
113120 set (_VIX_UTILS_${_vix_option} _CACHE_DEFINED FALSE )
114121 endif ()
115122 endforeach ()
116- set (SPDLOG_FMT_EXTERNAL ON )
123+ if (VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
124+ set (SPDLOG_FMT_EXTERNAL OFF )
125+ set (SPDLOG_FMT_EXTERNAL_HO ON )
126+ else ()
127+ set (SPDLOG_FMT_EXTERNAL ON )
128+ set (SPDLOG_FMT_EXTERNAL_HO OFF )
129+ endif ()
117130 set (SPDLOG_BUILD_EXAMPLE OFF )
118131 set (SPDLOG_BUILD_EXAMPLES OFF )
119132 set (SPDLOG_BUILD_TESTS OFF )
120133 set (SPDLOG_BUILD_BENCH OFF )
121134 set (SPDLOG_INSTALL OFF )
122- set (SPDLOG_FMT_EXTERNAL ON CACHE BOOL "" FORCE )
135+ if (VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
136+ set (SPDLOG_FMT_EXTERNAL OFF CACHE BOOL "" FORCE )
137+ set (SPDLOG_FMT_EXTERNAL_HO ON CACHE BOOL "" FORCE )
138+ else ()
139+ set (SPDLOG_FMT_EXTERNAL ON CACHE BOOL "" FORCE )
140+ set (SPDLOG_FMT_EXTERNAL_HO OFF CACHE BOOL "" FORCE )
141+ endif ()
123142 set (SPDLOG_BUILD_EXAMPLE OFF CACHE BOOL "" FORCE )
124143 set (SPDLOG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE )
125144 set (SPDLOG_BUILD_TESTS OFF CACHE BOOL "" FORCE )
@@ -147,6 +166,7 @@ endmacro()
147166# -------------------------
148167# spdlog
149168# -------------------------
169+ if (NOT VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
150170if (TARGET spdlog::spdlog_header_only)
151171 set (_VIX_SPDLOG_TARGET spdlog::spdlog_header_only)
152172
@@ -175,9 +195,12 @@ else()
175195 endif ()
176196endif ()
177197
198+ endif ()
199+
178200# -------------------------
179201# fmt
180202# -------------------------
203+ if (NOT VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
181204if (TARGET fmt::fmt-header-only)
182205 set (_VIX_FMT_TARGET fmt::fmt-header-only)
183206
@@ -206,7 +229,10 @@ else()
206229 endif ()
207230endif ()
208231
209- if ((NOT _VIX_FMT_TARGET OR NOT _VIX_SPDLOG_TARGET) AND VIX_UTILS_FETCH_THIRD_PARTY)
232+ endif ()
233+
234+ if ((NOT _VIX_FMT_TARGET OR NOT _VIX_SPDLOG_TARGET) AND
235+ (VIX_UTILS_FETCH_THIRD_PARTY OR VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS))
210236 include (FetchContent )
211237
212238 if (NOT _VIX_FMT_TARGET)
@@ -267,6 +293,20 @@ if (NOT _VIX_FMT_TARGET)
267293 )
268294endif ()
269295
296+ if (VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
297+ if (NOT _VIX_FMT_TARGET STREQUAL "fmt::fmt-header-only" OR
298+ NOT _VIX_SPDLOG_TARGET STREQUAL "spdlog::spdlog_header_only" )
299+ message (FATAL_ERROR
300+ "[utils] bundled logging provider requires fmt::fmt-header-only and "
301+ "spdlog::spdlog_header_only."
302+ )
303+ endif ()
304+
305+ set (_VIX_LOGGING_DEPS_BUNDLED ON )
306+ set (_VIX_FMT_BUNDLED_INCLUDE_DIR "${vix_fmt_SOURCE_DIR } /include" )
307+ set (_VIX_SPDLOG_BUNDLED_INCLUDE_DIR "${vix_spdlog_SOURCE_DIR } /include" )
308+ endif ()
309+
270310set (_VIX_SPDLOG_INSTALL_TARGET spdlog::spdlog_header_only)
271311if (_VIX_SPDLOG_TARGET STREQUAL "spdlog::spdlog" )
272312 set (_VIX_SPDLOG_INSTALL_TARGET spdlog::spdlog)
@@ -277,6 +317,18 @@ if (_VIX_FMT_TARGET STREQUAL "fmt::fmt")
277317 set (_VIX_FMT_INSTALL_TARGET fmt::fmt)
278318endif ()
279319
320+ set (_VIX_FMT_BUILD_INTERFACE "$<BUILD_INTERFACE :${_VIX_FMT_TARGET} >" )
321+ set (_VIX_FMT_INSTALL_INTERFACE "$<INSTALL_INTERFACE :${_VIX_FMT_INSTALL_TARGET} >" )
322+ set (_VIX_SPDLOG_BUILD_INTERFACE "$<BUILD_INTERFACE :${_VIX_SPDLOG_TARGET} >" )
323+ set (_VIX_SPDLOG_INSTALL_INTERFACE "$<INSTALL_INTERFACE :${_VIX_SPDLOG_INSTALL_TARGET} >" )
324+
325+ if (_VIX_LOGGING_DEPS_BUNDLED)
326+ set (_VIX_FMT_BUILD_INTERFACE "" )
327+ set (_VIX_FMT_INSTALL_INTERFACE "" )
328+ set (_VIX_SPDLOG_BUILD_INTERFACE "" )
329+ set (_VIX_SPDLOG_INSTALL_INTERFACE "" )
330+ endif ()
331+
280332# --------------------------------------------------------------------
281333# Library target
282334# --------------------------------------------------------------------
@@ -291,17 +343,29 @@ if (VIX_HEADER_ONLY)
291343 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
292344 )
293345
346+ if (_VIX_LOGGING_DEPS_BUNDLED)
347+ target_include_directories (vix_utils INTERFACE
348+ $<BUILD_INTERFACE :${_VIX_FMT_BUNDLED_INCLUDE_DIR} >
349+ )
350+ endif ()
351+
294352 target_compile_definitions (vix_utils INTERFACE
295353 VIX_GIT_HASH= "${VIX_GIT_HASH} "
296354 VIX_BUILD_DATE= "${VIX_BUILD_DATE} "
297355 )
298356
357+ if (_VIX_LOGGING_DEPS_BUNDLED)
358+ target_compile_definitions (vix_utils INTERFACE FMT_HEADER_ONLY=1 )
359+ endif ()
360+
299361 target_compile_features (vix_utils INTERFACE cxx_std_20 )
300362
301- target_link_libraries (vix_utils INTERFACE
302- $<BUILD_INTERFACE :${_VIX_FMT_TARGET} >
303- $<INSTALL_INTERFACE :${_VIX_FMT_INSTALL_TARGET} >
304- )
363+ if (NOT _VIX_LOGGING_DEPS_BUNDLED)
364+ target_link_libraries (vix_utils INTERFACE
365+ ${_VIX_FMT_BUILD_INTERFACE}
366+ ${_VIX_FMT_INSTALL_INTERFACE}
367+ )
368+ endif ()
305369
306370 if (WIN32 )
307371 target_compile_definitions (vix_utils INTERFACE SPDLOG_NO_WIN32_API=1 )
@@ -329,31 +393,59 @@ else()
329393 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
330394 )
331395
396+ if (_VIX_LOGGING_DEPS_BUNDLED)
397+ target_include_directories (vix_utils
398+ PUBLIC
399+ $<BUILD_INTERFACE :${_VIX_FMT_BUNDLED_INCLUDE_DIR} >
400+ PRIVATE
401+ $<BUILD_INTERFACE :${_VIX_SPDLOG_BUNDLED_INCLUDE_DIR} >
402+ )
403+ endif ()
404+
332405 target_compile_definitions (vix_utils PUBLIC
333406 VIX_GIT_HASH= "${VIX_GIT_HASH} "
334407 VIX_BUILD_DATE= "${VIX_BUILD_DATE} "
335408 )
336409
410+ if (_VIX_LOGGING_DEPS_BUNDLED)
411+ target_compile_definitions (vix_utils PUBLIC FMT_HEADER_ONLY=1 )
412+ endif ()
413+
337414 target_compile_definitions (vix_utils PRIVATE
338415 SPDLOG_FMT_EXTERNAL=1
339416 )
340417
341418 target_compile_features (vix_utils PUBLIC cxx_std_20 )
342419
343- target_link_libraries (vix_utils
344- PUBLIC
345- $<BUILD_INTERFACE :${_VIX_FMT_TARGET} >
346- $<INSTALL_INTERFACE :${_VIX_FMT_INSTALL_TARGET} >
347- PRIVATE
348- $<BUILD_INTERFACE :${_VIX_SPDLOG_TARGET} >
349- $<INSTALL_INTERFACE :${_VIX_SPDLOG_INSTALL_TARGET} >
350- )
420+ if (NOT _VIX_LOGGING_DEPS_BUNDLED)
421+ target_link_libraries (vix_utils
422+ PUBLIC
423+ ${_VIX_FMT_BUILD_INTERFACE}
424+ ${_VIX_FMT_INSTALL_INTERFACE}
425+ PRIVATE
426+ ${_VIX_SPDLOG_BUILD_INTERFACE}
427+ ${_VIX_SPDLOG_INSTALL_INTERFACE}
428+ )
429+ endif ()
430+
431+ if (_VIX_LOGGING_DEPS_BUNDLED)
432+ if (NOT TARGET Threads::Threads)
433+ find_package (Threads REQUIRED )
434+ endif ()
435+ target_link_libraries (vix_utils PRIVATE Threads::Threads )
436+ set (VIX_UTILS_PACKAGE_WITH_THREADS ON )
437+ endif ()
351438
352439 if (WIN32 )
353440 target_compile_definitions (vix_utils PRIVATE SPDLOG_NO_WIN32_API=1 )
354441 endif ()
355442endif ()
356443
444+ set_property (TARGET vix_utils PROPERTY
445+ VIX_LOGGING_DEPS_BUNDLED ${_VIX_LOGGING_DEPS_BUNDLED}
446+ )
447+ set (VIX_UTILS_LOGGING_DEPS_BUNDLED ${_VIX_LOGGING_DEPS_BUNDLED} )
448+
357449# --------------------------------------------------------------------
358450# Compiler warnings
359451# Build-only helpers must not leak into exported interfaces.
@@ -443,6 +535,13 @@ else()
443535 )
444536endif ()
445537
538+ if (_VIX_LOGGING_DEPS_BUNDLED)
539+ install (DIRECTORY "${_VIX_FMT_BUNDLED_INCLUDE_DIR} /fmt"
540+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
541+ FILES_MATCHING PATTERN "*.h"
542+ )
543+ endif ()
544+
446545# Standalone package files only outside umbrella
447546if (NOT (DEFINED VIX_UMBRELLA_BUILD AND VIX_UMBRELLA_BUILD))
448547
0 commit comments