Skip to content

Commit

Permalink
Updated modules Findspdlog.cmake and Findfmt.cmake to enable checking…
Browse files Browse the repository at this point in the history
… library versions directly on targets
  • Loading branch information
DavidAce committed May 31, 2021
1 parent ae18d93 commit 61f35a0
Show file tree
Hide file tree
Showing 2 changed files with 167 additions and 28 deletions.
71 changes: 56 additions & 15 deletions cmake/Findfmt.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# FMT_CONFIG_ONLY

# The user can set search directory hints from CMake or environment, such as
# FMT_DIR, fmt_DIR, FMT_ROOT fmt_ROOT, etc.
# fmt_DIR, fmt_ROOT, etc.

if(NOT fmt_FIND_VERSION)
if(NOT fmt_FIND_VERSION_MAJOR)
Expand All @@ -29,9 +29,9 @@ if(NOT fmt_FIND_VERSION)
set(fmt_FIND_VERSION "${fmt_FIND_VERSION_MAJOR}.${fmt_FIND_VERSION_MINOR}.${fmt_FIND_VERSION_PATCH}")
endif()

function(fmt_check_version var)
if (${var} AND EXISTS ${${var}})
set(include ${${var}})
function(fmt_check_version_include incdir)
if (IS_DIRECTORY "${incdir}")
set(include ${incdir})
endif()
if(EXISTS ${include}/fmt/core.h)
set(_fmt_version_file "${include}/fmt/core.h")
Expand All @@ -49,18 +49,52 @@ function(fmt_check_version var)
math(EXPR FMT_VERSION "(${FMT_VERSION} - ${${ver}}) / 100")
endforeach()
set(FMT_VERSION "${FMT_VERSION_MAJOR}.${FMT_VERSION_MINOR}.${FMT_VERSION_PATCH}")
if(${FMT_VERSION} VERSION_LESS ${fmt_FIND_VERSION})
set(FMT_VERSION_OK FALSE)
else()
set(FMT_VERSION_OK TRUE)
endif()
set(FMT_VERSION ${FMT_VERSION} PARENT_SCOPE)
set(FMT_VERSION_OK ${FMT_VERSION_OK} PARENT_SCOPE)
endif()

if(FMT_VERSION VERSION_GREATER_EQUAL fmt_FIND_VERSION)
set(FMT_VERSION ${FMT_VERSION} PARENT_SCOPE)
set(FMT_VERSION_OK TRUE)
set(FMT_VERSION_OK TRUE PARENT_SCOPE)
else()
set(FMT_VERSION_OK FALSE)
set(FMT_VERSION_OK FALSE PARENT_SCOPE)
endif()
endfunction()


function(fmt_check_version_include_genexp genexp_incdir)
string(REGEX REPLACE "BUILD_INTERFACE|INSTALL_INTERFACE|<|>|:" ";" incdirs "${${genexp_incdir}}")
foreach(inc ${incdirs})
if(inc STREQUAL "$") # The regex does not match dollar signs in generator expressions
continue()
endif()
fmt_check_version_include(${inc})
if(FMT_VERSION_OK)
set(FMT_VERSION ${FMT_VERSION} PARENT_SCOPE)
set(FMT_VERSION_OK TRUE PARENT_SCOPE)
break()
endif()
endforeach()
endfunction()

function(fmt_check_version_target tgt)
if(TARGET ${tgt})
get_target_property(FMT_VERSION ${tgt} VERSION)
get_target_property(FMT_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
set(FMT_INCLUDE_DIR ${FMT_INCLUDE_DIR} PARENT_SCOPE)
if(FMT_VERSION VERSION_GREATER_EQUAL fmt_FIND_VERSION)
set(FMT_VERSION ${FMT_VERSION} PARENT_SCOPE)
set(FMT_VERSION_OK TRUE)
set(FMT_VERSION_OK TRUE PARENT_SCOPE)
else()
fmt_check_version_include_genexp(FMT_INCLUDE_DIR)
set(FMT_VERSION ${FMT_VERSION} PARENT_SCOPE)
set(FMT_VERSION_OK ${FMT_VERSION_OK} PARENT_SCOPE)
endif()
endif()
endfunction()


if(FMT_NO_DEFAULT_PATH)
set(NO_DEFAULT_PATH NO_DEFAULT_PATH)
endif()
Expand All @@ -82,8 +116,7 @@ if(NOT FMT_NO_CONFIG OR FMT_CONFIG_ONLY)
CONFIG QUIET
)
if(TARGET fmt::fmt)
get_target_property(FMT_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
fmt_check_version(FMT_INCLUDE_DIR)
fmt_check_version_target(fmt::fmt)
if(NOT FMT_VERSION_OK OR NOT FMT_VERSION)
message(WARNING "Could not determine the version of fmt.\n"
"However, the target fmt::fmt has already been defined, so it will be used:\n"
Expand All @@ -110,7 +143,7 @@ if(NOT TARGET fmt::fmt AND NOT FMT_CONFIG_ONLY)
${NO_SYSTEM_ENVIRONMENT_PATH}
)
if(FMT_INCLUDE_DIR)
fmt_check_version(FMT_INCLUDE_DIR)
fmt_check_version_include(FMT_INCLUDE_DIR)
# Check if there is a compiled library to go with the headers
find_library(FMT_LIBRARY
NAMES fmt
Expand All @@ -131,7 +164,7 @@ if(NOT TARGET fmt::fmt AND NOT FMT_CONFIG_ONLY)
${NO_DEFAULT_PATH}
${NO_CMAKE_PACKAGE_REGISTRY}
)
fmt_check_version(SPDLOG_FMT_BUNDLED)
fmt_check_version_include(SPDLOG_FMT_BUNDLED)
endif()

if(FMT_VERSION_OK)
Expand All @@ -153,6 +186,14 @@ endif()

if(TARGET fmt::fmt)
set(fmt_FOUND TRUE)
if(FMT_VERSION AND FMT_VERSION_OK)
get_target_property(fmt_aliased fmt::fmt ALIASED_TARGET )
if(fmt_aliased)
set_target_properties(${fmt_aliased} PROPERTIES VERSION ${FMT_VERSION})
else()
set_target_properties(fmt::fmt PROPERTIES VERSION ${FMT_VERSION})
endif()
endif()
endif()


Expand Down
124 changes: 111 additions & 13 deletions cmake/Findspdlog.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# SPDLOG_CONFIG_ONLY

# The user can set search directory hints from CMake or environment, such as
# SPDLOG_DIR, spdlog_DIR, SPDLOG_ROOT spdlog_ROOT, etc.
# spdlog_DIR, spdlog_ROOT, etc.

if(NOT spdlog_FIND_VERSION)
if(NOT spdlog_FIND_VERSION_MAJOR)
Expand All @@ -29,6 +29,70 @@ if(NOT spdlog_FIND_VERSION)
set(spdlog_FIND_VERSION "${spdlog_FIND_VERSION_MAJOR}.${spdlog_FIND_VERSION_MINOR}.${spdlog_FIND_VERSION_PATCH}")
endif()


function(spdlog_check_version_include incdir)
if (IS_DIRECTORY "${incdir}")
set(include ${incdir})
endif()
if(EXISTS ${include}/spdlog/version.h)
file(READ "${include}/spdlog/version.h" _spdlog_version_header)
string(REGEX MATCH "define[ \t]+SPDLOG_VER_MAJOR[ \t]+([0-9]+)" _spdlog_world_version_match "${_spdlog_version_header}")
set(SPDLOG_WORLD_VERSION "${CMAKE_MATCH_1}")
string(REGEX MATCH "define[ \t]+SPDLOG_VER_MINOR[ \t]+([0-9]+)" _spdlog_major_version_match "${_spdlog_version_header}")
set(SPDLOG_MAJOR_VERSION "${CMAKE_MATCH_1}")
string(REGEX MATCH "define[ \t]+SPDLOG_VER_PATCH[ \t]+([0-9]+)" _spdlog_minor_version_match "${_spdlog_version_header}")
set(SPDLOG_MINOR_VERSION "${CMAKE_MATCH_1}")

set(SPDLOG_VERSION ${SPDLOG_WORLD_VERSION}.${SPDLOG_MAJOR_VERSION}.${SPDLOG_MINOR_VERSION})
message(STATUS "Found Spdlog version ${SPDLOG_VERSION}")
endif()


if(SPDLOG_VERSION VERSION_GREATER_EQUAL spdlog_FIND_VERSION)
set(SPDLOG_VERSION ${SPDLOG_VERSION} PARENT_SCOPE)
set(SPDLOG_VERSION_OK TRUE)
set(SPDLOG_VERSION_OK TRUE PARENT_SCOPE)
else()
set(SPDLOG_VERSION_OK FALSE)
set(SPDLOG_VERSION_OK FALSE PARENT_SCOPE)
endif()
endfunction()


function(spdlog_check_version_include_genexp genexp_incdir)
string(REGEX REPLACE "BUILD_INTERFACE|INSTALL_INTERFACE|<|>|:" ";" incdirs "${${genexp_incdir}}")
foreach(inc ${incdirs})
if(inc STREQUAL "$") # The regex does not match dollar signs in generator expressions
continue()
endif()
spdlog_check_version_include(${inc})
if(SPDLOG_VERSION_OK)
set(SPDLOG_VERSION ${SPDLOG_VERSION} PARENT_SCOPE)
set(SPDLOG_VERSION_OK TRUE PARENT_SCOPE)
break()
endif()
endforeach()
endfunction()

function(spdlog_check_version_target tgt)
if(TARGET ${tgt})
get_target_property(SPDLOG_VERSION ${tgt} VERSION)
get_target_property(SPDLOG_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
set(SPDLOG_INCLUDE_DIR ${SPDLOG_INCLUDE_DIR} PARENT_SCOPE)
if(SPDLOG_VERSION VERSION_GREATER_EQUAL spdlog_FIND_VERSION)
set(SPDLOG_VERSION ${SPDLOG_VERSION} PARENT_SCOPE)
set(SPDLOG_VERSION_OK TRUE)
set(SPDLOG_VERSION_OK TRUE PARENT_SCOPE)
else()
spdlog_check_version_include_genexp(SPDLOG_INCLUDE_DIR)
set(SPDLOG_VERSION ${SPDLOG_VERSION} PARENT_SCOPE)
set(SPDLOG_VERSION_OK ${SPDLOG_VERSION_OK} PARENT_SCOPE)
endif()
endif()
endfunction()



function(spdlog_check_version var)
if(var AND EXISTS ${var})
set(include ${var})
Expand Down Expand Up @@ -77,7 +141,7 @@ endif()
# First try finding a config somewhere in the system
if(NOT SPDLOG_NO_CONFIG OR SPDLOG_CONFIG_ONLY)
find_package(spdlog ${spdlog_FIND_VERSION}
HINTS ${spdlog_ROOT} ${CONAN_SPDLOG_ROOT} ${CMAKE_INSTALL_PREFIX}
HINTS ${CONAN_SPDLOG_ROOT} ${CMAKE_INSTALL_PREFIX}
PATH_SUFFIXES include spdlog include/spdlog spdlog/include/spdlog
${NO_DEFAULT_PATH}
${NO_CMAKE_PACKAGE_REGISTRY}
Expand All @@ -86,8 +150,9 @@ if(NOT SPDLOG_NO_CONFIG OR SPDLOG_CONFIG_ONLY)
CONFIG QUIET
)
if(TARGET spdlog::spdlog)
get_target_property(SPDLOG_INCLUDE_DIR spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES)
spdlog_check_version(SPDLOG_INCLUDE_DIR)
spdlog_check_version_target(spdlog::spdlog)
# get_target_property(SPDLOG_INCLUDE_DIR spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES)
# spdlog_check_version(SPDLOG_INCLUDE_DIR)
if(NOT SPDLOG_VERSION_OK OR NOT SPDLOG_VERSION)
message(WARNING "Could not determine the spdlog version.\n"
"However, the target spdlog::spdlog has already been defined, so it will be used:\n"
Expand All @@ -105,7 +170,7 @@ endif()
if(NOT TARGET spdlog::spdlog AND NOT SPDLOG_CONFIG_ONLY)
find_path(SPDLOG_INCLUDE_DIR
NAMES spdlog/spdlog.h
HINTS ${spdlog_ROOT} ${H5PP_CONDA_CANDIDATE_PATHS} ${CMAKE_INSTALL_PREFIX}
HINTS ${H5PP_CONDA_CANDIDATE_PATHS} ${CMAKE_INSTALL_PREFIX}
PATH_SUFFIXES spdlog/include include spdlog include/spdlog spdlog/include/spdlog
${NO_DEFAULT_PATH}
${NO_CMAKE_PACKAGE_REGISTRY}
Expand All @@ -131,7 +196,7 @@ if(NOT TARGET spdlog::spdlog AND NOT SPDLOG_CONFIG_ONLY)
# There may or may not be a compiled library to go with the headers
find_library(SPDLOG_LIBRARY
NAMES spdlog
HINTS ${SPDLOG_INCLUDE_DIR} ${spdlog_ROOT}
HINTS ${SPDLOG_INCLUDE_DIR}
PATH_SUFFIXES spdlog/${CMAKE_INSTALL_LIBDIR} ${CMAKE_INSTALL_LIBDIR}
${NO_DEFAULT_PATH}
${NO_CMAKE_PACKAGE_REGISTRY}
Expand All @@ -149,15 +214,48 @@ if(NOT TARGET spdlog::spdlog AND NOT SPDLOG_CONFIG_ONLY)
endif()
endif()

find_package(fmt QUIET)
if(TARGET fmt::fmt)
target_link_libraries(spdlog::spdlog INTERFACE fmt::fmt)
if(NOT FMT_INCLUDE_DIR)
get_target_property(FMT_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
function(target_set_version tgt vers)
if(TARGET ${tgt})
get_target_property(tgt_alias ${tgt} ALIASED_TARGET )
if(tgt_alias)
set_target_properties(${tgt_alias} PROPERTIES VERSION ${vers})
else()
set_target_properties(${tgt} PROPERTIES VERSION ${vers})
endif()
endif()
if(NOT FMT_INCLUDE_DIR MATCHES "bundled")
target_compile_definitions(spdlog::spdlog INTERFACE SPDLOG_FMT_EXTERNAL)
endfunction()

function(target_link_fmt tgt)
if(TARGET ${tgt})
find_package(fmt QUIET)
if(TARGET fmt::fmt)
get_target_property(tgt_alias ${tgt} ALIASED_TARGET )
if(tgt_alias)
target_link_libraries(${tgt_alias} INTERFACE fmt::fmt)
else()
target_link_libraries(${tgt} INTERFACE fmt::fmt)
endif()

if(NOT SPDLOG_INCLUDE_DIR)
get_target_property(SPDLOG_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
endif()
message(STATUS "SPDLOG_INCLUDE_DIR ${SPDLOG_INCLUDE_DIR}")
if(NOT SPDLOG_INCLUDE_DIR MATCHES "bundled")
if(tgt_alias)
target_compile_definitions(${tgt_alias} INTERFACE SPDLOG_FMT_EXTERNAL)
else()
target_compile_definitions(${tgt} INTERFACE SPDLOG_FMT_EXTERNAL)
endif()
endif()
endif()
endif()
endfunction()


if(TARGET spdlog::spdlog)
set(spdlog_FOUND TRUE)
target_set_version(spdlog::spdlog SPDLOG_VERSION)
target_link_fmt(spdlog::spdlog)
endif()

include(FindPackageHandleStandardArgs)
Expand Down

0 comments on commit 61f35a0

Please sign in to comment.