FindEXPAT.cmake 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindEXPAT
  5. ---------
  6. Finds the native Expat headers and library:
  7. .. code-block:: cmake
  8. find_package(EXPAT [<version>] [...])
  9. Expat is a stream-oriented XML parser library written in C.
  10. Imported Targets
  11. ^^^^^^^^^^^^^^^^
  12. This module provides the following :ref:`Imported Targets`:
  13. ``EXPAT::EXPAT``
  14. .. versionadded:: 3.10
  15. Target encapsulating the Expat library (``expat``) usage requirements. This
  16. target is available only if Expat is found.
  17. Result Variables
  18. ^^^^^^^^^^^^^^^^
  19. This module defines the following variables:
  20. ``EXPAT_FOUND``
  21. Boolean indicating whether (the requested version of) Expat was found.
  22. ``EXPAT_VERSION``
  23. .. versionadded:: 4.2
  24. The version of Expat found.
  25. ``EXPAT_INCLUDE_DIRS``
  26. Include directories containing ``expat.h`` and related headers needed to use
  27. Expat.
  28. ``EXPAT_LIBRARIES``
  29. Libraries needed to link against to use Expat.
  30. Hints
  31. ^^^^^
  32. This module accepts the following variables:
  33. ``EXPAT_USE_STATIC_LIBS``
  34. .. versionadded:: 3.28
  35. Set to ``TRUE`` to use static libraries.
  36. .. versionadded:: 3.31
  37. Implemented on non-Windows platforms.
  38. Deprecated Variables
  39. ^^^^^^^^^^^^^^^^^^^^
  40. The following variables are provided for backward compatibility:
  41. ``EXPAT_VERSION_STRING``
  42. .. deprecated:: 4.2
  43. Superseded by the ``EXPAT_VERSION``.
  44. The version of Expat found.
  45. Examples
  46. ^^^^^^^^
  47. Finding Expat library and linking it to a project target:
  48. .. code-block:: cmake
  49. find_package(EXPAT)
  50. target_link_libraries(project_target PRIVATE EXPAT::EXPAT)
  51. #]=======================================================================]
  52. cmake_policy(PUSH)
  53. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  54. find_package(PkgConfig QUIET)
  55. if(PkgConfig_FOUND)
  56. pkg_check_modules(PC_EXPAT QUIET expat)
  57. endif()
  58. # Look for the header file.
  59. find_path(EXPAT_INCLUDE_DIR NAMES expat.h HINTS ${PC_EXPAT_INCLUDE_DIRS})
  60. set(EXPAT_NAMES expat expatw)
  61. set(EXPAT_NAMES_DEBUG expatd expatwd)
  62. if(WIN32)
  63. if(EXPAT_USE_STATIC_LIBS)
  64. list(APPEND EXPAT_NAMES expatMT expatwMT)
  65. list(APPEND EXPAT_NAMES_DEBUG expatdMT expatwdMT)
  66. else()
  67. list(APPEND EXPAT_NAMES expatMT expatMD expatwMT expatwMD)
  68. list(APPEND EXPAT_NAMES_DEBUG expatdMT expatdMD expatwdMT expatwdMD)
  69. endif()
  70. endif()
  71. # Allow EXPAT_LIBRARY to be set manually, as the location of the expat library
  72. if(NOT EXPAT_LIBRARY)
  73. if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES)
  74. set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
  75. else()
  76. set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
  77. endif()
  78. if(DEFINED CMAKE_FIND_LIBRARY_SUFFIXES)
  79. set(_expat_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}")
  80. else()
  81. set(_expat_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
  82. endif()
  83. if(WIN32)
  84. list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
  85. endif()
  86. if (EXPAT_USE_STATIC_LIBS)
  87. if(WIN32)
  88. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  89. else()
  90. set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
  91. endif()
  92. endif()
  93. # Look for the library.
  94. find_library(EXPAT_LIBRARY_RELEASE NAMES ${EXPAT_NAMES} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
  95. find_library(EXPAT_LIBRARY_DEBUG NAMES ${EXPAT_NAMES_DEBUG} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
  96. # Restore the original find library ordering
  97. if(DEFINED _expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
  98. set(CMAKE_FIND_LIBRARY_PREFIXES "${_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}")
  99. else()
  100. set(CMAKE_FIND_LIBRARY_PREFIXES)
  101. endif()
  102. if(DEFINED _expat_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
  103. set(CMAKE_FIND_LIBRARY_SUFFIXES "${_expat_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}")
  104. else()
  105. set(CMAKE_FIND_LIBRARY_SUFFIXES)
  106. endif()
  107. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  108. select_library_configurations(EXPAT)
  109. endif()
  110. unset(EXPAT_NAMES)
  111. unset(EXPAT_NAMES_DEBUG)
  112. if(EXPAT_INCLUDE_DIR AND EXISTS "${EXPAT_INCLUDE_DIR}/expat.h")
  113. file(STRINGS "${EXPAT_INCLUDE_DIR}/expat.h" expat_version_str
  114. REGEX "^#[\t ]*define[\t ]+XML_(MAJOR|MINOR|MICRO)_VERSION[\t ]+[0-9]+$")
  115. unset(EXPAT_VERSION)
  116. foreach(VPART MAJOR MINOR MICRO)
  117. foreach(VLINE ${expat_version_str})
  118. if(VLINE MATCHES "^#[\t ]*define[\t ]+XML_${VPART}_VERSION[\t ]+([0-9]+)$")
  119. set(EXPAT_VERSION_PART "${CMAKE_MATCH_1}")
  120. if(EXPAT_VERSION)
  121. string(APPEND EXPAT_VERSION ".${EXPAT_VERSION_PART}")
  122. else()
  123. set(EXPAT_VERSION "${EXPAT_VERSION_PART}")
  124. endif()
  125. endif()
  126. endforeach()
  127. endforeach()
  128. set(EXPAT_VERSION_STRING ${EXPAT_VERSION})
  129. endif()
  130. include(FindPackageHandleStandardArgs)
  131. find_package_handle_standard_args(EXPAT
  132. REQUIRED_VARS EXPAT_LIBRARY EXPAT_INCLUDE_DIR
  133. VERSION_VAR EXPAT_VERSION)
  134. # Copy the results to the output variables and target.
  135. if(EXPAT_FOUND)
  136. set(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
  137. if(NOT EXPAT_LIBRARIES)
  138. set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
  139. endif()
  140. if(NOT TARGET EXPAT::EXPAT)
  141. add_library(EXPAT::EXPAT UNKNOWN IMPORTED)
  142. set_target_properties(EXPAT::EXPAT PROPERTIES
  143. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  144. INTERFACE_INCLUDE_DIRECTORIES "${EXPAT_INCLUDE_DIRS}")
  145. if(EXPAT_USE_STATIC_LIBS)
  146. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  147. INTERFACE_COMPILE_DEFINITIONS "XML_STATIC")
  148. endif()
  149. if(EXPAT_LIBRARY_RELEASE)
  150. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  151. IMPORTED_CONFIGURATIONS RELEASE)
  152. set_target_properties(EXPAT::EXPAT PROPERTIES
  153. IMPORTED_LOCATION_RELEASE "${EXPAT_LIBRARY_RELEASE}")
  154. endif()
  155. if(EXPAT_LIBRARY_DEBUG)
  156. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  157. IMPORTED_CONFIGURATIONS DEBUG)
  158. set_target_properties(EXPAT::EXPAT PROPERTIES
  159. IMPORTED_LOCATION_DEBUG "${EXPAT_LIBRARY_DEBUG}")
  160. endif()
  161. if(NOT EXPAT_LIBRARY_RELEASE AND NOT EXPAT_LIBRARY_DEBUG)
  162. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  163. IMPORTED_LOCATION "${EXPAT_LIBRARY}")
  164. endif()
  165. endif()
  166. endif()
  167. mark_as_advanced(EXPAT_INCLUDE_DIR EXPAT_LIBRARY)
  168. cmake_policy(POP)