mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-01 11:22:21 -06:00
This marks all `<PACKAGENAME>_FOUND` result variables as deprecated where possible (for `<PackageName>` find modules) to make it clearer which variable to use. In CMake 3.3, the FindPackageHandleStandardArgs module was refactored to set both `<PackageName>_FOUND` and uppercase `<PACKAGENAME>_FOUND` result variables to the same values. Before that, the FOUND_VAR argument could be used to set the result variable. * FindMatlab: Uppercased MATLAB_FOUND is not mentioned as it was never documented. * Documentation for FindPythonInterp and FindPythonLibs modules synced accordingly to their deprecation (3.12 instead of 4.2). * OPENGL_FOUND: deprecation version synced with other find modules. * DevIL_FOUND was introduced in CMake 3.8. The uppercased variant not mentioned as it was previously never documented. Fixes: #27242
196 lines
6.0 KiB
CMake
196 lines
6.0 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file LICENSE.rst or https://cmake.org/licensing for details.
|
|
|
|
#[=======================================================================[.rst:
|
|
FindXMLRPC
|
|
----------
|
|
|
|
Finds the native XML-RPC library for C and C++:
|
|
|
|
.. code-block:: cmake
|
|
|
|
find_package(XMLRPC [...] [COMPONENTS <components>...] [...])
|
|
|
|
XML-RPC is a standard network protocol that enables remote procedure calls
|
|
(RPC) between systems. It encodes requests and responses in XML and uses
|
|
HTTP as the transport mechanism.
|
|
|
|
Components
|
|
^^^^^^^^^^
|
|
|
|
The XML-RPC C/C++ library consists of various features (modules) that provide
|
|
specific functionality. The availability of these features depends on the
|
|
installed XML-RPC library version and system configuration. Some features also
|
|
have dependencies on others.
|
|
|
|
To list the available features on a system, the ``xmlrpc-c-config`` command-line
|
|
utility can be used.
|
|
|
|
In CMake, these features can be specified as components with the
|
|
:command:`find_package` command:
|
|
|
|
.. code-block:: cmake
|
|
|
|
find_package(XMLRPC [COMPONENTS <components>...])
|
|
|
|
Components may be:
|
|
|
|
``c++2``
|
|
C++ wrapper API, replacing the legacy ``c++`` feature.
|
|
``c++``
|
|
The legacy C++ wrapper API (superseded by ``c++2``).
|
|
``client``
|
|
XML-RPC client functions (also available as the legacy libwww-based feature
|
|
named ``libwww-client``).
|
|
``cgi-server``
|
|
CGI-based server functions.
|
|
``abyss-server``
|
|
Abyss-based server functions.
|
|
``pstream-server``
|
|
The pstream-based server functions.
|
|
``server-util``
|
|
Basic server functions (they are automatically included with ``*-server``
|
|
features).
|
|
``abyss``
|
|
Abyss HTTP server (not needed with ``abyss-server``).
|
|
``openssl``
|
|
OpenSSL convenience functions.
|
|
|
|
If no components are specified, this module searches for XML-RPC library and
|
|
its include directories without additional features.
|
|
|
|
Result Variables
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
This module defines the following variables:
|
|
|
|
``XMLRPC_FOUND``
|
|
Boolean indicating whether the XML-RPC library and all its requested
|
|
components were found.
|
|
``XMLRPC_INCLUDE_DIRS``
|
|
Include directories containing ``xmlrpc.h`` and other headers needed to use
|
|
the XML-RPC library.
|
|
``XMLRPC_LIBRARIES``
|
|
List of libraries needed for linking to XML-RPC library and its requested
|
|
features.
|
|
|
|
Examples
|
|
^^^^^^^^
|
|
|
|
Finding XML-RPC library and its ``client`` feature, and conditionally
|
|
creating an interface :ref:`imported target <Imported Targets>` that
|
|
encapsulates its usage requirements for linking to a project target:
|
|
|
|
.. code-block:: cmake
|
|
|
|
find_package(XMLRPC REQUIRED COMPONENTS client)
|
|
|
|
if(XMLRPC_FOUND AND NOT TARGET XMLRPC::XMLRPC)
|
|
add_library(XMLRPC::XMLRPC INTERFACE IMPORTED)
|
|
set_target_properties(
|
|
XMLRPC::XMLRPC
|
|
PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${XMLRPC_INCLUDE_DIRS}"
|
|
INTERFACE_LINK_LIBRARIES "${XMLRPC_LIBRARIES}"
|
|
)
|
|
endif()
|
|
|
|
target_link_libraries(example PRIVATE XMLRPC::XMLRPC)
|
|
#]=======================================================================]
|
|
|
|
# First find the config script from which to obtain other values.
|
|
find_program(XMLRPC_C_CONFIG NAMES xmlrpc-c-config)
|
|
|
|
# Check whether we found anything.
|
|
if(XMLRPC_C_CONFIG)
|
|
set(XMLRPC_C_FOUND 1)
|
|
else()
|
|
set(XMLRPC_C_FOUND 0)
|
|
endif()
|
|
|
|
# Lookup the include directories needed for the components requested.
|
|
if(XMLRPC_C_FOUND)
|
|
execute_process(
|
|
COMMAND ${XMLRPC_C_CONFIG} ${XMLRPC_FIND_COMPONENTS} --cflags
|
|
OUTPUT_VARIABLE XMLRPC_C_CONFIG_CFLAGS
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
RESULT_VARIABLE XMLRPC_C_CONFIG_RESULT
|
|
)
|
|
|
|
# Parse the include flags.
|
|
if("${XMLRPC_C_CONFIG_RESULT}" STREQUAL "0")
|
|
# Convert the compile flags to a CMake list.
|
|
string(REGEX REPLACE " +" ";"
|
|
XMLRPC_C_CONFIG_CFLAGS "${XMLRPC_C_CONFIG_CFLAGS}")
|
|
|
|
# Look for -I options.
|
|
# FIXME: Use these as hints to a find_path call to find the headers.
|
|
set(XMLRPC_INCLUDE_DIRS)
|
|
foreach(flag ${XMLRPC_C_CONFIG_CFLAGS})
|
|
if("${flag}" MATCHES "^-I(.+)")
|
|
file(TO_CMAKE_PATH "${CMAKE_MATCH_1}" DIR)
|
|
list(APPEND XMLRPC_INCLUDE_DIRS "${DIR}")
|
|
endif()
|
|
endforeach()
|
|
else()
|
|
message("Error running ${XMLRPC_C_CONFIG}: [${XMLRPC_C_CONFIG_RESULT}]")
|
|
set(XMLRPC_C_FOUND 0)
|
|
endif()
|
|
endif()
|
|
|
|
# Lookup the libraries needed for the components requested.
|
|
if(XMLRPC_C_FOUND)
|
|
execute_process(
|
|
COMMAND ${XMLRPC_C_CONFIG} ${XMLRPC_FIND_COMPONENTS} --libs
|
|
OUTPUT_VARIABLE XMLRPC_C_CONFIG_LIBS
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
RESULT_VARIABLE XMLRPC_C_CONFIG_RESULT
|
|
)
|
|
|
|
# Parse the library names and directories.
|
|
if("${XMLRPC_C_CONFIG_RESULT}" STREQUAL "0")
|
|
string(REGEX REPLACE " +" ";"
|
|
XMLRPC_C_CONFIG_LIBS "${XMLRPC_C_CONFIG_LIBS}")
|
|
|
|
# Look for -L flags for directories and -l flags for library names.
|
|
set(XMLRPC_LIBRARY_DIRS)
|
|
set(XMLRPC_LIBRARY_NAMES)
|
|
foreach(flag ${XMLRPC_C_CONFIG_LIBS})
|
|
if("${flag}" MATCHES "^-L(.+)")
|
|
file(TO_CMAKE_PATH "${CMAKE_MATCH_1}" DIR)
|
|
list(APPEND XMLRPC_LIBRARY_DIRS "${DIR}")
|
|
elseif("${flag}" MATCHES "^-l(.+)")
|
|
list(APPEND XMLRPC_LIBRARY_NAMES "${CMAKE_MATCH_1}")
|
|
endif()
|
|
endforeach()
|
|
|
|
# Search for each library needed using the directories given.
|
|
foreach(name ${XMLRPC_LIBRARY_NAMES})
|
|
# Look for this library.
|
|
find_library(XMLRPC_${name}_LIBRARY
|
|
NAMES ${name}
|
|
HINTS ${XMLRPC_LIBRARY_DIRS}
|
|
)
|
|
mark_as_advanced(XMLRPC_${name}_LIBRARY)
|
|
|
|
# If any library is not found then the whole package is not found.
|
|
if(NOT XMLRPC_${name}_LIBRARY)
|
|
set(XMLRPC_C_FOUND 0)
|
|
endif()
|
|
|
|
# Build an ordered list of all the libraries needed.
|
|
set(XMLRPC_LIBRARIES ${XMLRPC_LIBRARIES} "${XMLRPC_${name}_LIBRARY}")
|
|
endforeach()
|
|
else()
|
|
message("Error running ${XMLRPC_C_CONFIG}: [${XMLRPC_C_CONFIG_RESULT}]")
|
|
set(XMLRPC_C_FOUND 0)
|
|
endif()
|
|
endif()
|
|
|
|
# Report the results.
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(
|
|
XMLRPC
|
|
REQUIRED_VARS XMLRPC_C_FOUND XMLRPC_LIBRARIES
|
|
FAIL_MESSAGE "XMLRPC was not found. Make sure the entries XMLRPC_* are set.")
|