mirror of
https://github.com/ceph/ceph
synced 2025-02-22 02:27:29 +00:00
build: Fix fmt version check
Currently, when attempting to build ceph on a system with fmt installed, we try to build against it whatever the version. This constantly breaks people's builds, since newer versions of fmt often change the API. This change specifies that versions must be below 10 as well as at or above 8.1.1, so that on systems with a new format, we fall back to using the submodule. It also removes the `Findfmt.cmake` module, as that does not check the installed version. Instead, we use the cmake config file installed by the system package of fmt and does support version checking. Signed-off-by: Adam Emerson <aemerson@redhat.com>
This commit is contained in:
parent
478a058b4d
commit
686dd3d838
@ -1,61 +0,0 @@
|
||||
find_path(fmt_INCLUDE_DIR NAMES fmt/format.h)
|
||||
|
||||
if(fmt_INCLUDE_DIR)
|
||||
set(_fmt_version_file "${fmt_INCLUDE_DIR}/fmt/core.h")
|
||||
if(NOT EXISTS "${_fmt_version_file}")
|
||||
set(_fmt_version_file "${fmt_INCLUDE_DIR}/fmt/format.h")
|
||||
endif()
|
||||
if(EXISTS "${_fmt_version_file}")
|
||||
# parse "#define FMT_VERSION 40100" to 4.1.0
|
||||
file(STRINGS "${_fmt_version_file}" fmt_VERSION_LINE
|
||||
REGEX "^#define[ \t]+FMT_VERSION[ \t]+[0-9]+$")
|
||||
string(REGEX REPLACE "^#define[ \t]+FMT_VERSION[ \t]+([0-9]+)$"
|
||||
"\\1" fmt_VERSION "${fmt_VERSION_LINE}")
|
||||
foreach(ver "fmt_VERSION_PATCH" "fmt_VERSION_MINOR" "fmt_VERSION_MAJOR")
|
||||
math(EXPR ${ver} "${fmt_VERSION} % 100")
|
||||
math(EXPR fmt_VERSION "(${fmt_VERSION} - ${${ver}}) / 100")
|
||||
endforeach()
|
||||
set(fmt_VERSION
|
||||
"${fmt_VERSION_MAJOR}.${fmt_VERSION_MINOR}.${fmt_VERSION_PATCH}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_library(fmt_LIBRARY NAMES fmt)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(fmt
|
||||
REQUIRED_VARS fmt_INCLUDE_DIR fmt_LIBRARY
|
||||
VERSION_VAR fmt_VERSION)
|
||||
mark_as_advanced(
|
||||
fmt_INCLUDE_DIR
|
||||
fmt_LIBRARY
|
||||
fmt_VERSION_MAJOR
|
||||
fmt_VERSION_MINOR
|
||||
fmt_VERSION_PATCH
|
||||
fmt_VERSION_STRING)
|
||||
|
||||
if(fmt_FOUND AND NOT (TARGET fmt::fmt))
|
||||
add_library(fmt-header-only INTERFACE)
|
||||
set_target_properties(fmt-header-only PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${fmt_INCLUDE_DIR}"
|
||||
INTERFACE_COMPILE_DEFINITIONS FMT_HEADER_ONLY=1
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_11)
|
||||
|
||||
add_library(fmt UNKNOWN IMPORTED GLOBAL)
|
||||
set_target_properties(fmt PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${fmt_INCLUDE_DIR}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_11
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${fmt_LIBRARY}")
|
||||
|
||||
if(WITH_FMT_HEADER_ONLY)
|
||||
# please note, this is different from how upstream defines fmt::fmt.
|
||||
# in order to force 3rd party libraries to link against fmt-header-only if
|
||||
# WITH_FMT_HEADER_ONLY is ON, we have to point fmt::fmt to fmt-header-only
|
||||
# in this case.
|
||||
add_library(fmt::fmt ALIAS fmt-header-only)
|
||||
else()
|
||||
add_library(fmt::fmt ALIAS fmt)
|
||||
endif()
|
||||
|
||||
endif()
|
@ -326,13 +326,15 @@ if(NOT TARGET RapidJSON::RapidJSON)
|
||||
endif()
|
||||
|
||||
option(WITH_FMT_HEADER_ONLY "use header-only version of fmt library" OFF)
|
||||
set(WITH_FMT_VERSION "8.1.1" CACHE
|
||||
STRING "build with fmt version")
|
||||
find_package(fmt ${WITH_FMT_VERSION} QUIET)
|
||||
find_package(fmt 8.1.1...<10.0.0)
|
||||
if(fmt_FOUND)
|
||||
include_directories(SYSTEM "${fmt_INCLUDE_DIR}")
|
||||
message(STATUS "Building with system fmt.")
|
||||
if (WITH_FMT_HEADER_ONLY)
|
||||
message(STATUS "Using fmt header-only.")
|
||||
add_library(fmt::fmt ALIAS fmt::fmt-header-only)
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "Could not find fmt, will build it")
|
||||
message(STATUS "Building fmt as submodule")
|
||||
set(old_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
|
||||
set(BUILD_SHARED_LIBS FALSE)
|
||||
add_subdirectory(fmt)
|
||||
|
Loading…
Reference in New Issue
Block a user