Skip to content

Commit d72c89a

Browse files
committed
fix(utils): bundle fmt and spdlog dependencies
2 parents 8619ced + 0e524ad commit d72c89a

2 files changed

Lines changed: 123 additions & 18 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 115 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ option(VIX_HEADER_ONLY "Build vix_utils as header-only INTERFACE" OFF)
6363
option(VIX_UTILS_BUILD_EXAMPLES "Build utils examples" OFF)
6464
option(VIX_UTILS_BUILD_TESTS "Build utils CMake regression tests" OFF)
6565
option(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
# --------------------------------------------------------------------
9397
set(_VIX_SPDLOG_TARGET "")
9498
set(_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.
98104
macro(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)
150170
if (TARGET spdlog::spdlog_header_only)
151171
set(_VIX_SPDLOG_TARGET spdlog::spdlog_header_only)
152172

@@ -175,9 +195,12 @@ else()
175195
endif()
176196
endif()
177197

198+
endif()
199+
178200
# -------------------------
179201
# fmt
180202
# -------------------------
203+
if (NOT VIX_UTILS_FORCE_BUNDLED_LOGGING_DEPS)
181204
if (TARGET fmt::fmt-header-only)
182205
set(_VIX_FMT_TARGET fmt::fmt-header-only)
183206

@@ -206,7 +229,10 @@ else()
206229
endif()
207230
endif()
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
)
268294
endif()
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+
270310
set(_VIX_SPDLOG_INSTALL_TARGET spdlog::spdlog_header_only)
271311
if (_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)
278318
endif()
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()
355442
endif()
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
)
444536
endif()
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
447546
if (NOT (DEFINED VIX_UMBRELLA_BUILD AND VIX_UMBRELLA_BUILD))
448547

‎cmake/vix_utilsConfig.cmake.in‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22

33
include(CMakeFindDependencyMacro)
44

5-
find_dependency(spdlog CONFIG REQUIRED)
6-
find_dependency(fmt CONFIG REQUIRED)
5+
if (@VIX_UTILS_PACKAGE_WITH_THREADS@)
6+
find_dependency(Threads REQUIRED)
7+
endif()
8+
9+
if (NOT @VIX_UTILS_LOGGING_DEPS_BUNDLED@)
10+
find_dependency(spdlog CONFIG REQUIRED)
11+
find_dependency(fmt CONFIG REQUIRED)
12+
endif()
713

814
include("${CMAKE_CURRENT_LIST_DIR}/vix_utilsTargets.cmake")
915

0 commit comments

Comments
 (0)