FindEXPAT.cmake 5.9 KB

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