diff --git a/cmake/modules/FindZeroMQ.cmake b/cmake/modules/FindZeroMQ.cmake --- a/cmake/modules/FindZeroMQ.cmake +++ b/cmake/modules/FindZeroMQ.cmake @@ -1,21 +1,94 @@ -# Try to find the ZeroMQ libraries -# ZMQ_FOUND - system has ZeroMQ lib -# ZMQ_INCLUDE_DIR - the ZeroMQ include directory -# ZMQ_LIBRARY - Libraries needed to use ZeroMQ +# Copyright (c) 2017-2020 The Bitcoin developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. -if(ZMQ_INCLUDE_DIR AND ZMQ_LIBRARY) - # Already in cache, be silent - set(ZMQ_FIND_QUIETLY TRUE) -endif() +# .rst: +# FindZeroMQ +# -------------- +# +# Find the ZeroMQ library. The following conponents are +# available:: +# zmq +# +# This will define the following variables:: +# +# ZeroMQ_FOUND - True if the ZeroMQ library is found. +# ZeroMQ_INCLUDE_DIRS - List of the header include directories. +# ZeroMQ_LIBRARIES - List of the libraries. +# ZeroMQ_VERSION - The library version MAJOR.MINOR.PATCH +# ZeroMQ_VERSION_MAJOR - Major version number +# ZeroMQ_VERSION_MINOR - Minor version number +# ZeroMQ_VERSION_PATCH - Patch version number +# +# And the following imported targets:: +# +# ZeroMQ::zmq -find_path(ZMQ_INCLUDE_DIR NAMES zmq.h) -find_library(ZMQ_LIBRARY NAMES zmq libzmq) -message(STATUS "ZeroMQ lib: " ${ZMQ_LIBRARY}) +find_path(ZeroMQ_INCLUDE_DIR + NAMES zmq.h +) -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ZeroMQ DEFAULT_MSG ZMQ_INCLUDE_DIR ZMQ_LIBRARY) +set(ZeroMQ_INCLUDE_DIRS "${ZeroMQ_INCLUDE_DIR}") +mark_as_advanced(ZeroMQ_INCLUDE_DIR) + +if(NOT DEFINED ZeroMQ_VERSION) + # Extract version information from the zmq.h header. + if(ZeroMQ_INCLUDE_DIR) + # Read the version from file zmq.h into a variable. + file(READ "${ZeroMQ_INCLUDE_DIR}/zmq.h" _ZMQ_HEADER) + + # Parse the version into variables. + string(REGEX REPLACE + ".*ZMQ_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" + ZeroMQ_VERSION_MAJOR + "${_ZMQ_HEADER}" + ) + string(REGEX REPLACE + ".*ZMQ_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" + ZeroMQ_VERSION_MINOR + "${_ZMQ_HEADER}" + ) + # Patch version example on non-crypto installs: x.x.xNC + string(REGEX REPLACE + ".*ZMQ_VERSION_PATCH[ \t]+([0-9]+(NC)?).*" "\\1" + ZeroMQ_VERSION_PATCH + "${_ZMQ_HEADER}" + ) + else() + # Set some garbage values to the versions since we didn't find a file to + # read. + set(ZeroMQ_VERSION_MAJOR "0") + set(ZeroMQ_VERSION_MINOR "0") + set(ZeroMQ_VERSION_PATCH "0") + endif() -mark_as_advanced(ZMQ_INCLUDE_DIR ZMQ_LIBRARY) + # Cache the result. + set(ZeroMQ_VERSION_MAJOR ${ZeroMQ_VERSION_MAJOR} + CACHE INTERNAL "ZeroMQ major version number" + ) + set(ZeroMQ_VERSION_MINOR ${ZeroMQ_VERSION_MINOR} + CACHE INTERNAL "ZeroMQ minor version number" + ) + set(ZeroMQ_VERSION_PATCH ${ZeroMQ_VERSION_PATCH} + CACHE INTERNAL "ZeroMQ patch version number" + ) + # The actual returned/output version variable (the others can be used if + # needed). + set(ZeroMQ_VERSION + "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}" + CACHE INTERNAL "ZeroMQ full version" + ) +endif() + +include(ExternalLibraryHelper) +find_component(ZeroMQ zmq + NAMES zmq + INCLUDE_DIRS ${ZeroMQ_INCLUDE_DIRS} +) -set(ZeroMQ_LIBRARIES ${ZMQ_LIBRARY}) -set(ZeroMQ_INCLUDE_DIRS ${ZMQ_INCLUDE_DIR}) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ZeroMQ + REQUIRED_VARS ZeroMQ_INCLUDE_DIR + VERSION_VAR ZeroMQ_VERSION + HANDLE_COMPONENTS +) diff --git a/doc/dependencies.md b/doc/dependencies.md --- a/doc/dependencies.md +++ b/doc/dependencies.md @@ -29,5 +29,5 @@ | Qt | [5.9.6](https://download.qt.io/official_releases/qt/) | 5.5.1 | No | | | | XCB | | | | | Yes (Linux only) | | xkbcommon | | | | | Yes (Linux only) | -| ZeroMQ | [4.1.5](https://github.com/zeromq/libzmq/releases) | | No | | | +| ZeroMQ | [4.1.5](https://github.com/zeromq/libzmq/releases) | 4.1.5 | No | | | | zlib | [1.2.11](http://zlib.net/) | | | | No | diff --git a/src/zmq/CMakeLists.txt b/src/zmq/CMakeLists.txt --- a/src/zmq/CMakeLists.txt +++ b/src/zmq/CMakeLists.txt @@ -9,9 +9,8 @@ zmqrpc.cpp ) -find_package(ZeroMQ REQUIRED) -target_include_directories(zmq PRIVATE ${ZMQ_INCLUDE_DIR}) -target_link_libraries(zmq util ${ZMQ_LIBRARY}) +find_package(ZeroMQ 4.1.5 REQUIRED) +target_link_libraries(zmq util ZeroMQ::zmq) if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") target_compile_definitions(zmq PUBLIC ZMQ_STATIC)