1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
4 #[=======================================================================[.rst:
8 Find the native Expat headers and library.
9 Expat is a stream-oriented XML parser library written in C.
14 .. versionadded:: 3.10
16 This module defines the following :prop_tgt:`IMPORTED` targets:
19 The Expat ``expat`` library, if found.
24 This module will set the following variables in your project:
26 ``EXPAT_INCLUDE_DIRS``
27 where to find expat.h, etc.
29 the libraries to link against to use Expat.
31 true if the Expat headers and libraries were found.
36 ``EXPAT_USE_STATIC_LIBS``
38 .. versionadded:: 3.28
40 Set to ``TRUE`` to use static libraries.
42 #]=======================================================================]
45 cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
47 find_package(PkgConfig QUIET)
49 pkg_check_modules(PC_EXPAT QUIET expat)
51 # Look for the header file.
52 find_path(EXPAT_INCLUDE_DIR NAMES expat.h HINTS ${PC_EXPAT_INCLUDE_DIRS})
54 set(EXPAT_NAMES expat expatw)
55 set(EXPAT_NAMES_DEBUG expatd expatwd)
58 if(EXPAT_USE_STATIC_LIBS)
59 list(APPEND EXPAT_NAMES expatMT expatwMT)
60 list(APPEND EXPAT_NAMES_DEBUG expatdMT expatwdMT)
62 list(APPEND EXPAT_NAMES expatMT expatMD expatwMT expatwMD)
63 list(APPEND EXPAT_NAMES_DEBUG expatdMT expatdMD expatwdMT expatwdMD)
67 # Allow EXPAT_LIBRARY to be set manually, as the location of the expat library
69 if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES)
70 set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
72 set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
76 list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
79 # Look for the library.
80 find_library(EXPAT_LIBRARY_RELEASE NAMES ${EXPAT_NAMES} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
81 find_library(EXPAT_LIBRARY_DEBUG NAMES ${EXPAT_NAMES_DEBUG} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
83 # Restore the original find library ordering
84 if(DEFINED _expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
85 set(CMAKE_FIND_LIBRARY_PREFIXES "${_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}")
87 set(CMAKE_FIND_LIBRARY_PREFIXES)
90 include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
91 select_library_configurations(EXPAT)
95 unset(EXPAT_NAMES_DEBUG)
97 if(EXPAT_INCLUDE_DIR AND EXISTS "${EXPAT_INCLUDE_DIR}/expat.h")
98 file(STRINGS "${EXPAT_INCLUDE_DIR}/expat.h" expat_version_str
99 REGEX "^#[\t ]*define[\t ]+XML_(MAJOR|MINOR|MICRO)_VERSION[\t ]+[0-9]+$")
101 unset(EXPAT_VERSION_STRING)
102 foreach(VPART MAJOR MINOR MICRO)
103 foreach(VLINE ${expat_version_str})
104 if(VLINE MATCHES "^#[\t ]*define[\t ]+XML_${VPART}_VERSION[\t ]+([0-9]+)$")
105 set(EXPAT_VERSION_PART "${CMAKE_MATCH_1}")
106 if(EXPAT_VERSION_STRING)
107 string(APPEND EXPAT_VERSION_STRING ".${EXPAT_VERSION_PART}")
109 set(EXPAT_VERSION_STRING "${EXPAT_VERSION_PART}")
116 include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
117 FIND_PACKAGE_HANDLE_STANDARD_ARGS(EXPAT
118 REQUIRED_VARS EXPAT_LIBRARY EXPAT_INCLUDE_DIR
119 VERSION_VAR EXPAT_VERSION_STRING)
121 # Copy the results to the output variables and target.
123 set(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
125 if(NOT EXPAT_LIBRARIES)
126 set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
129 if(NOT TARGET EXPAT::EXPAT)
130 add_library(EXPAT::EXPAT UNKNOWN IMPORTED)
131 set_target_properties(EXPAT::EXPAT PROPERTIES
132 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
133 INTERFACE_INCLUDE_DIRECTORIES "${EXPAT_INCLUDE_DIRS}")
135 if(EXPAT_USE_STATIC_LIBS)
136 set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
137 INTERFACE_COMPILE_DEFINITIONS "XML_STATIC")
140 if(EXPAT_LIBRARY_RELEASE)
141 set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
142 IMPORTED_CONFIGURATIONS RELEASE)
143 set_target_properties(EXPAT::EXPAT PROPERTIES
144 IMPORTED_LOCATION_RELEASE "${EXPAT_LIBRARY_RELEASE}")
147 if(EXPAT_LIBRARY_DEBUG)
148 set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
149 IMPORTED_CONFIGURATIONS DEBUG)
150 set_target_properties(EXPAT::EXPAT PROPERTIES
151 IMPORTED_LOCATION_DEBUG "${EXPAT_LIBRARY_DEBUG}")
154 if(NOT EXPAT_LIBRARY_RELEASE AND NOT EXPAT_LIBRARY_DEBUG)
155 set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
156 IMPORTED_LOCATION "${EXPAT_LIBRARY}")
161 mark_as_advanced(EXPAT_INCLUDE_DIR EXPAT_LIBRARY)