# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file LICENSE.rst or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindXercesC ----------- .. versionadded:: 3.1 Finds the Apache Xerces-C++ validating XML parser headers and libraries: .. code-block:: cmake find_package(XercesC [] [...]) Imported Targets ^^^^^^^^^^^^^^^^ This module provides the following :ref:`Imported Targets`: ``XercesC::XercesC`` .. versionadded:: 3.5 Target encapsulating the Xerces-C++ library (``xerces-c``) usage requirements, available only if Xerces-C++ is found. Result Variables ^^^^^^^^^^^^^^^^ This module defines the following variables: ``XercesC_FOUND`` Boolean indicating whether (the requested version of) Xerces-C++ was found. ``XercesC_VERSION`` The version of the found Xerces-C++ library. ``XercesC_INCLUDE_DIRS`` Include directories needed to use Xerces-C++. ``XercesC_LIBRARIES`` Libraries needed to link for using Xerces-C++. ``XercesC_LIBRARY`` The path to the Xerces-C++ library (``xerces-c``), either release or debug variant. Cache Variables ^^^^^^^^^^^^^^^ The following cache variables may also be set: ``XercesC_INCLUDE_DIR`` The directory containing the Xerces-C++ headers. ``XercesC_LIBRARY_RELEASE`` .. versionadded:: 3.4 The path to a release (optimized) variant of the Xerces-C++ library. ``XercesC_LIBRARY_DEBUG`` .. versionadded:: 3.4 The path to a debug variant of the Xerces-C++ library. Examples ^^^^^^^^ Finding the Xerces-C++ library and linking it to a project target: .. code-block:: cmake find_package(XercesC) target_link_libraries(project_target PRIVATE XercesC::XercesC) #]=======================================================================] cmake_policy(PUSH) cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_ # Written by Roger Leigh function(_XercesC_GET_VERSION version_hdr) file(STRINGS ${version_hdr} _contents REGEX "^[ \t]*#define XERCES_VERSION_.*") if(_contents) string(REGEX REPLACE ".*#define XERCES_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" XercesC_MAJOR "${_contents}") string(REGEX REPLACE ".*#define XERCES_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" XercesC_MINOR "${_contents}") string(REGEX REPLACE ".*#define XERCES_VERSION_REVISION[ \t]+([0-9]+).*" "\\1" XercesC_PATCH "${_contents}") if(NOT XercesC_MAJOR MATCHES "^[0-9]+$") message(FATAL_ERROR "Version parsing failed for XERCES_VERSION_MAJOR!") endif() if(NOT XercesC_MINOR MATCHES "^[0-9]+$") message(FATAL_ERROR "Version parsing failed for XERCES_VERSION_MINOR!") endif() if(NOT XercesC_PATCH MATCHES "^[0-9]+$") message(FATAL_ERROR "Version parsing failed for XERCES_VERSION_REVISION!") endif() set(XercesC_VERSION "${XercesC_MAJOR}.${XercesC_MINOR}.${XercesC_PATCH}" PARENT_SCOPE) set(XercesC_VERSION_MAJOR "${XercesC_MAJOR}" PARENT_SCOPE) set(XercesC_VERSION_MINOR "${XercesC_MINOR}" PARENT_SCOPE) set(XercesC_VERSION_PATCH "${XercesC_PATCH}" PARENT_SCOPE) else() message(FATAL_ERROR "Include file ${version_hdr} does not exist or does not contain expected version information") endif() endfunction() # Find include directory find_path(XercesC_INCLUDE_DIR NAMES "xercesc/util/PlatformUtils.hpp" DOC "Xerces-C++ include directory") mark_as_advanced(XercesC_INCLUDE_DIR) if(XercesC_INCLUDE_DIR AND EXISTS "${XercesC_INCLUDE_DIR}/xercesc/util/XercesVersion.hpp") _XercesC_GET_VERSION("${XercesC_INCLUDE_DIR}/xercesc/util/XercesVersion.hpp") endif() if(NOT XercesC_LIBRARY) # Find all XercesC libraries find_library(XercesC_LIBRARY_RELEASE NAMES "xerces-c" "xerces-c_${XercesC_VERSION_MAJOR}" "xerces-c-${XercesC_VERSION_MAJOR}.${XercesC_VERSION_MINOR}" NAMES_PER_DIR DOC "Xerces-C++ libraries (release)") find_library(XercesC_LIBRARY_DEBUG NAMES "xerces-cd" "xerces-c_${XercesC_VERSION_MAJOR}D" "xerces-c_${XercesC_VERSION_MAJOR}_${XercesC_VERSION_MINOR}D" NAMES_PER_DIR DOC "Xerces-C++ libraries (debug)") include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) select_library_configurations(XercesC) mark_as_advanced(XercesC_LIBRARY_RELEASE XercesC_LIBRARY_DEBUG) endif() unset(XercesC_VERSION_MAJOR) unset(XercesC_VERSION_MINOR) unset(XercesC_VERSION_PATCH) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(XercesC REQUIRED_VARS XercesC_LIBRARY XercesC_INCLUDE_DIR XercesC_VERSION VERSION_VAR XercesC_VERSION FAIL_MESSAGE "Failed to find XercesC") if(XercesC_FOUND) set(XercesC_INCLUDE_DIRS "${XercesC_INCLUDE_DIR}") set(XercesC_LIBRARIES "${XercesC_LIBRARY}") # For header-only libraries if(NOT TARGET XercesC::XercesC) add_library(XercesC::XercesC UNKNOWN IMPORTED) if(XercesC_INCLUDE_DIRS) set_target_properties(XercesC::XercesC PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${XercesC_INCLUDE_DIRS}") endif() if(EXISTS "${XercesC_LIBRARY}") set_target_properties(XercesC::XercesC PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" IMPORTED_LOCATION "${XercesC_LIBRARY}") endif() if(EXISTS "${XercesC_LIBRARY_RELEASE}") set_property(TARGET XercesC::XercesC APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_target_properties(XercesC::XercesC PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" IMPORTED_LOCATION_RELEASE "${XercesC_LIBRARY_RELEASE}") endif() if(EXISTS "${XercesC_LIBRARY_DEBUG}") set_property(TARGET XercesC::XercesC APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) set_target_properties(XercesC::XercesC PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX" IMPORTED_LOCATION_DEBUG "${XercesC_LIBRARY_DEBUG}") endif() endif() endif() cmake_policy(POP)