Преглед на файлове

cmake: Add finders for Asio and WebSocket++

WebSocket++ does provide a CMake package, but version check is broken.
tytan652 преди 2 години
родител
ревизия
8c11b0caad
променени са 2 файла, в които са добавени 207 реда и са изтрити 0 реда
  1. 105 0
      cmake/Modules/FindAsio.cmake
  2. 102 0
      cmake/Modules/FindWebsocketpp.cmake

+ 105 - 0
cmake/Modules/FindAsio.cmake

@@ -0,0 +1,105 @@
+#[=======================================================================[.rst
+FindAsio
+----------
+
+FindModule for Asio and the associated library
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+.. versionadded:: 2.0
+
+This module defines the :prop_tgt:`IMPORTED` target ``Asio::Asio``.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module sets the following variables:
+
+``Asio_FOUND``
+  True, if the library was found.
+``Asio_VERSION``
+  Detected version of found Asio library.
+
+Cache variables
+^^^^^^^^^^^^^^^
+
+The following cache variables may also be set:
+
+``Asio_INCLUDE_DIR``
+  Directory containing ``asio.hpp``.
+
+#]=======================================================================]
+
+# cmake-format: off
+# cmake-lint: disable=C0103
+# cmake-lint: disable=C0301
+# cmake-format: on
+
+include(FindPackageHandleStandardArgs)
+
+find_package(PkgConfig QUIET)
+if(PKG_CONFIG_FOUND)
+  pkg_search_module(PC_Asio QUIET asio)
+endif()
+
+find_path(
+  Asio_INCLUDE_DIR
+  NAMES asio.hpp
+  HINTS ${PC_Asio_INCLUDE_DIRS}
+  PATHS /usr/include /usr/local/include
+  DOC "Asio include directory")
+
+if(PC_Asio_VERSION VERSION_GREATER 0)
+  set(Asio_VERSION ${PC_Asio_VERSION})
+elseif(EXISTS "${Asio_INCLUDE_DIR}/asio/version.hpp")
+  file(
+    STRINGS "${Asio_INCLUDE_DIR}/asio/version.hpp" _version_string
+    REGEX
+      "#define[ \t]+ASIO_VERSION[ \t]+[0-9]+[ \t]+\/\/[ \t][0-9]+\.[0-9]+\.[0-9]+"
+  )
+
+  string(
+    REGEX
+    REPLACE
+      "#define[ \t]+ASIO_VERSION[ \t]+[0-9]+[ \t]+\/\/[ \t]([0-9]+\.[0-9]+\.[0-9]+)"
+      "\\1"
+      Asio_VERSION
+      "${_version_string}")
+else()
+  if(NOT Asio_FIND_QUIETLY)
+    message(AUTHOR_WARNING "Failed to find Asio version.")
+  endif()
+  set(Asio_VERSION 0.0.0)
+endif()
+
+if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows")
+  set(Asio_ERROR_REASON
+      "Ensure that obs-deps is provided as part of CMAKE_PREFIX_PATH.")
+elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD")
+  set(Asio_ERROR_REASON
+      "Ensure Asio library is available in local include paths.")
+endif()
+
+find_package_handle_standard_args(
+  Asio
+  REQUIRED_VARS Asio_INCLUDE_DIR
+  VERSION_VAR Asio_VERSION REASON_FAILURE_MESSAGE "${Asio_ERROR_REASON}")
+mark_as_advanced(Asio_INCLUDE_DIR)
+unset(Asio_ERROR_REASON)
+
+if(Asio_FOUND)
+  if(NOT TARGET Asio::Asio)
+    add_library(Asio::Asio INTERFACE IMPORTED)
+    set_target_properties(Asio::Asio PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+                                                "${Asio_INCLUDE_DIR}")
+  endif()
+endif()
+
+include(FeatureSummary)
+set_package_properties(
+  Asio PROPERTIES
+  URL "http://think-async.com/Asio"
+  DESCRIPTION
+    "Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach."
+)

+ 102 - 0
cmake/Modules/FindWebsocketpp.cmake

@@ -0,0 +1,102 @@
+#[=======================================================================[.rst
+FindWebsocketpp
+----------
+
+FindModule for WebSocket++ and the associated library
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+.. versionadded:: 2.0
+
+This module defines the :prop_tgt:`IMPORTED` target ``Websocketpp::Websocketpp``.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module sets the following variables:
+
+``Websocketpp_FOUND``
+  True, if the library was found.
+``Websocketpp_VERSION``
+  Detected version of found Websocketpp library.
+
+Cache variables
+^^^^^^^^^^^^^^^
+
+The following cache variables may also be set:
+
+``Websocketpp_INCLUDE_DIR``
+  Directory containing ``websocketpp/client.hpp``.
+
+#]=======================================================================]
+
+# cmake-format: off
+# cmake-lint: disable=C0103
+# cmake-lint: disable=C0301
+# cmake-format: on
+
+include(FindPackageHandleStandardArgs)
+
+find_path(
+  Websocketpp_INCLUDE_DIR
+  NAMES websocketpp/client.hpp
+  PATHS /usr/include /usr/local/include
+  DOC "WebSocket++ include directory")
+
+if(EXISTS "${Websocketpp_INCLUDE_DIR}/websocketpp/version.hpp")
+  file(STRINGS "${Websocketpp_INCLUDE_DIR}/websocketpp/version.hpp"
+       _version_string
+       REGEX "^.*(major|minor|patch)_version[ \t]+=[ \t]+[0-9]+")
+
+  string(REGEX REPLACE ".*major_version[ \t]+=[ \t]+([0-9]+).*" "\\1"
+                       _version_major "${_version_string}")
+  string(REGEX REPLACE ".*minor_version[ \t]+=[ \t]+([0-9]+).*" "\\1"
+                       _version_minor "${_version_string}")
+  string(REGEX REPLACE ".*patch_version[ \t]+=[ \t]+([0-9]+).*" "\\1"
+                       _version_patch "${_version_string}")
+
+  set(Websocketpp_VERSION
+      "${_version_major}.${_version_minor}.${_version_patch}")
+  unset(_version_major)
+  unset(_version_minor)
+  unset(_version_patch)
+else()
+  if(NOT Websocketpp_FIND_QUIETLY)
+    message(AUTHOR_WARNING "Failed to find WebSocket++ version.")
+  endif()
+  set(Websocketpp_VERSION 0.0.0)
+endif()
+
+if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows")
+  set(Websocketpp_ERROR_REASON
+      "Ensure that obs-deps is provided as part of CMAKE_PREFIX_PATH.")
+elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD")
+  set(Websocketpp_ERROR_REASON
+      "Ensure WebSocket++ library is available in local include paths.")
+endif()
+
+find_package_handle_standard_args(
+  Websocketpp
+  REQUIRED_VARS Websocketpp_INCLUDE_DIR
+  VERSION_VAR Websocketpp_VERSION REASON_FAILURE_MESSAGE
+                                  "${Websocketpp_ERROR_REASON}")
+mark_as_advanced(Websocketpp_INCLUDE_DIR)
+unset(Websocketpp_ERROR_REASON)
+
+if(Websocketpp_FOUND)
+  if(NOT TARGET Websocketpp::Websocketpp)
+    add_library(Websocketpp::Websocketpp INTERFACE IMPORTED)
+    set_target_properties(
+      Websocketpp::Websocketpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+                                          "${Websocketpp_INCLUDE_DIR}")
+  endif()
+endif()
+
+include(FeatureSummary)
+set_package_properties(
+  Websocketpp PROPERTIES
+  URL "https://www.zaphoyd.com/websocketpp/"
+  DESCRIPTION
+    "WebSocket++ is a header only C++ library that implements RFC6455 The WebSocket Protocol."
+)