From 8df0e40b46d6da88177480e6bdec9a77c5ba3fbf Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 2 Aug 2018 19:04:30 +0800 Subject: [PATCH] cmake: require 4.0.0 <= libfmt-dev < 5.0.0 FMT_VERSION is now living in fmt/core.h in libfmt >= 5.0, so we cannot parse fmt/format.h for libfmt's version anymore. also we don't need Findfmt.cmake now. because libfmt-dev 4.0 and up is required by seastar, also it's libfmt-dev 3.x's cmake module which fails to offer fmt::fmt target. in other words, it's safe to drop libfmt 3.x support. but 5.0.0 is not compatible with seastar, we will have failures like: In file included from /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/aligned_buffer.hh:25:0, from /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/reactor.hh:26, from /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/alien.hh:35, from /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/src/core/alien.cc:23: /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/print.hh: In function 'seastar::sstring seastar::format(const char*, A&& ...)': /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/print.hh:135:10: error: 'MemoryWriter' is not a member of 'fmt' fmt::MemoryWriter out; ^~~~~~~~~~~~ /home/smithfarm/src/ceph/smithfarm/ceph/src/seastar/include/seastar/core/print.hh:136:5: error: 'out' was not declared in this scope out.write(fmt, std::forward(a)...); ^~~ so, we should build libfmt even if we have libfmt-dev 5.x Signed-off-by: Kefu Chai --- cmake/modules/Findc-ares.cmake | 5 ++--- cmake/modules/Findfmt.cmake | 31 ++++++++++++++++++------------- src/CMakeLists.txt | 12 ++++++++++-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/cmake/modules/Findc-ares.cmake b/cmake/modules/Findc-ares.cmake index 766b6a3179e1d..6386f9acecb97 100644 --- a/cmake/modules/Findc-ares.cmake +++ b/cmake/modules/Findc-ares.cmake @@ -1,4 +1,4 @@ -find_package(PkgConfig) +find_package(PkgConfig QUIET) pkg_search_module(PC_cares libcares) @@ -13,10 +13,9 @@ find_library(c-ares_LIBRARY set(c-ares_VERSION ${PC_cares_VERSION}) -include (FindPackageHandleStandardArgs) +include(FindPackageHandleStandardArgs) find_package_handle_standard_args(c-ares - FOUND_VAR c-ares_FOUND REQUIRED_VARS c-ares_INCLUDE_DIR c-ares_LIBRARY diff --git a/cmake/modules/Findfmt.cmake b/cmake/modules/Findfmt.cmake index 5573f0380f7eb..244cfe0125f79 100644 --- a/cmake/modules/Findfmt.cmake +++ b/cmake/modules/Findfmt.cmake @@ -1,26 +1,31 @@ find_path(fmt_INCLUDE_DIR NAMES fmt/format.h) -if(fmt_INCLUDE_DIR AND EXISTS "${fmt_INCLUDE_DIR}/fmt/format.h") - # parse "#define FMT_VERSION 40100" to 4.1.0 - file(STRINGS "${fmt_INCLUDE_DIR}/fmt/format.h" 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_STRING +if(fmt_INCLUDE_DIR) + set(_fmt_version_file "${fmt_INCLUDE_DIR}/fmt/format.h") + if(NOT EXISTS "${_fmt_version_file}") + set(_fmt_version_file "${fmt_INCLUDE_DIR}/fmt/core.h") + endif() + if(EXISTS "${_fmt_version_file}") + # parse "#define FMT_VERSION 40100" to 4.1.0 + file(STRINGS "${fmt_INCLUDE_DIR}/fmt/format.h" 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 - FOUND_VAR fmt_FOUND REQUIRED_VARS fmt_INCLUDE_DIR fmt_LIBRARY - VERSION_VAR fmt_VERSION_STRING) + VERSION_VAR fmt_VERSION) mark_as_advanced( fmt_INCLUDE_DIR fmt_LIBRARY diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec08911948411..5d898f743ddf3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -305,12 +305,20 @@ include_directories("${CMAKE_SOURCE_DIR}/src/dmclock/support/src") include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/googletest/googletest/include") if(WITH_SEASTAR) - find_package(fmt 4.0.0) + find_package(fmt 4.0.0 QUIET) if(NOT fmt_FOUND) + message(STATUS "Could not find fmt, will build it") + add_subdirectory(fmt) + elseif(fmt_VERSION VERSION_GREATER_EQUAL 5.0.0) + message(WARNING "Could NOT find fmt: " + "Found unsuitable version \"${fmt_VERSION}\", " + "but required is at most \"5.0.0\" (found ${fmt_INCLUDE_DIR}). " + "Will build it") add_subdirectory(fmt) endif() - find_package(c-ares 1.13.0 QUIET MODULE) + find_package(c-ares 1.13.0 QUIET) if(NOT c-ares_FOUND) + message(STATUS "Could not find c-ares, will build it") include(Buildc-ares) build_c_ares() endif() -- 2.39.5