FindEXPAT.cmake 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindEXPAT
  5. ---------
  6. Find the native Expat headers and library.
  7. Expat is a stream-oriented XML parser library written in C.
  8. Imported Targets
  9. ^^^^^^^^^^^^^^^^
  10. .. versionadded:: 3.10
  11. This module defines the following :prop_tgt:`IMPORTED` targets:
  12. ``EXPAT::EXPAT``
  13. The Expat ``expat`` library, if found.
  14. Result Variables
  15. ^^^^^^^^^^^^^^^^
  16. This module will set the following variables in your project:
  17. ``EXPAT_INCLUDE_DIRS``
  18. where to find expat.h, etc.
  19. ``EXPAT_LIBRARIES``
  20. the libraries to link against to use Expat.
  21. ``EXPAT_FOUND``
  22. true if the Expat headers and libraries were found.
  23. Hints
  24. ^^^^^
  25. ``EXPAT_USE_STATIC_LIBS``
  26. .. versionadded:: 3.28
  27. Set to ``TRUE`` to use static libraries.
  28. #]=======================================================================]
  29. cmake_policy(PUSH)
  30. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  31. find_package(PkgConfig QUIET)
  32. pkg_check_modules(PC_EXPAT QUIET expat)
  33. # Look for the header file.
  34. find_path(EXPAT_INCLUDE_DIR NAMES expat.h HINTS ${PC_EXPAT_INCLUDE_DIRS})
  35. set(EXPAT_NAMES expat expatw)
  36. set(EXPAT_NAMES_DEBUG expatd expatwd)
  37. if(WIN32)
  38. if(EXPAT_USE_STATIC_LIBS)
  39. list(APPEND EXPAT_NAMES expatMT expatwMT)
  40. list(APPEND EXPAT_NAMES_DEBUG expatdMT expatwdMT)
  41. else()
  42. list(APPEND EXPAT_NAMES expatMT expatMD expatwMT expatwMD)
  43. list(APPEND EXPAT_NAMES_DEBUG expatdMT expatdMD expatwdMT expatwdMD)
  44. endif()
  45. endif()
  46. # Allow EXPAT_LIBRARY to be set manually, as the location of the expat library
  47. if(NOT EXPAT_LIBRARY)
  48. if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES)
  49. set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
  50. else()
  51. set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
  52. endif()
  53. if(WIN32)
  54. list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
  55. endif()
  56. # Look for the library.
  57. find_library(EXPAT_LIBRARY_RELEASE NAMES ${EXPAT_NAMES} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
  58. find_library(EXPAT_LIBRARY_DEBUG NAMES ${EXPAT_NAMES_DEBUG} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
  59. # Restore the original find library ordering
  60. if(DEFINED _expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
  61. set(CMAKE_FIND_LIBRARY_PREFIXES "${_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}")
  62. else()
  63. set(CMAKE_FIND_LIBRARY_PREFIXES)
  64. endif()
  65. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  66. select_library_configurations(EXPAT)
  67. endif()
  68. unset(EXPAT_NAMES)
  69. unset(EXPAT_NAMES_DEBUG)
  70. if(EXPAT_INCLUDE_DIR AND EXISTS "${EXPAT_INCLUDE_DIR}/expat.h")
  71. file(STRINGS "${EXPAT_INCLUDE_DIR}/expat.h" expat_version_str
  72. REGEX "^#[\t ]*define[\t ]+XML_(MAJOR|MINOR|MICRO)_VERSION[\t ]+[0-9]+$")
  73. unset(EXPAT_VERSION_STRING)
  74. foreach(VPART MAJOR MINOR MICRO)
  75. foreach(VLINE ${expat_version_str})
  76. if(VLINE MATCHES "^#[\t ]*define[\t ]+XML_${VPART}_VERSION[\t ]+([0-9]+)$")
  77. set(EXPAT_VERSION_PART "${CMAKE_MATCH_1}")
  78. if(EXPAT_VERSION_STRING)
  79. string(APPEND EXPAT_VERSION_STRING ".${EXPAT_VERSION_PART}")
  80. else()
  81. set(EXPAT_VERSION_STRING "${EXPAT_VERSION_PART}")
  82. endif()
  83. endif()
  84. endforeach()
  85. endforeach()
  86. endif()
  87. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  88. FIND_PACKAGE_HANDLE_STANDARD_ARGS(EXPAT
  89. REQUIRED_VARS EXPAT_LIBRARY EXPAT_INCLUDE_DIR
  90. VERSION_VAR EXPAT_VERSION_STRING)
  91. # Copy the results to the output variables and target.
  92. if(EXPAT_FOUND)
  93. set(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
  94. if(NOT EXPAT_LIBRARIES)
  95. set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
  96. endif()
  97. if(NOT TARGET EXPAT::EXPAT)
  98. add_library(EXPAT::EXPAT UNKNOWN IMPORTED)
  99. set_target_properties(EXPAT::EXPAT PROPERTIES
  100. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  101. INTERFACE_INCLUDE_DIRECTORIES "${EXPAT_INCLUDE_DIRS}")
  102. if(EXPAT_USE_STATIC_LIBS)
  103. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  104. INTERFACE_COMPILE_DEFINITIONS "XML_STATIC")
  105. endif()
  106. if(EXPAT_LIBRARY_RELEASE)
  107. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  108. IMPORTED_CONFIGURATIONS RELEASE)
  109. set_target_properties(EXPAT::EXPAT PROPERTIES
  110. IMPORTED_LOCATION_RELEASE "${EXPAT_LIBRARY_RELEASE}")
  111. endif()
  112. if(EXPAT_LIBRARY_DEBUG)
  113. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  114. IMPORTED_CONFIGURATIONS DEBUG)
  115. set_target_properties(EXPAT::EXPAT PROPERTIES
  116. IMPORTED_LOCATION_DEBUG "${EXPAT_LIBRARY_DEBUG}")
  117. endif()
  118. if(NOT EXPAT_LIBRARY_RELEASE AND NOT EXPAT_LIBRARY_DEBUG)
  119. set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
  120. IMPORTED_LOCATION "${EXPAT_LIBRARY}")
  121. endif()
  122. endif()
  123. endif()
  124. mark_as_advanced(EXPAT_INCLUDE_DIR EXPAT_LIBRARY)
  125. cmake_policy(POP)