# 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 ...] [...]) 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 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 ` 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.")