1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
# 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.
Imported Targets
^^^^^^^^^^^^^^^^
This module defines 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 Xerces-C++ is 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_<n>
# Written by Roger Leigh <rleigh@codelibre.net>
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)
|