Merge topic 'cpack-innosetup-linux'
[kiteware-cmake.git] / Modules / FindEXPAT.cmake
blob398a415259a71668ed6ae732e618d89769f5f913
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:
5 FindEXPAT
6 ---------
8 Find the native Expat headers and library.
9 Expat is a stream-oriented XML parser library written in C.
11 Imported Targets
12 ^^^^^^^^^^^^^^^^
14 .. versionadded:: 3.10
16 This module defines the following :prop_tgt:`IMPORTED` targets:
18 ``EXPAT::EXPAT``
19   The Expat ``expat`` library, if found.
21 Result Variables
22 ^^^^^^^^^^^^^^^^
24 This module will set the following variables in your project:
26 ``EXPAT_INCLUDE_DIRS``
27   where to find expat.h, etc.
28 ``EXPAT_LIBRARIES``
29   the libraries to link against to use Expat.
30 ``EXPAT_FOUND``
31   true if the Expat headers and libraries were found.
33 Hints
34 ^^^^^
36 ``EXPAT_USE_STATIC_LIBS``
38   .. versionadded:: 3.28
40   Set to ``TRUE`` to use static libraries.
42 #]=======================================================================]
44 cmake_policy(PUSH)
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)
57 if(WIN32)
58   if(EXPAT_USE_STATIC_LIBS)
59     list(APPEND EXPAT_NAMES expatMT expatwMT)
60     list(APPEND EXPAT_NAMES_DEBUG expatdMT expatwdMT)
61   else()
62     list(APPEND EXPAT_NAMES expatMT expatMD expatwMT expatwMD)
63     list(APPEND EXPAT_NAMES_DEBUG expatdMT expatdMD expatwdMT expatwdMD)
64   endif()
65 endif()
67 # Allow EXPAT_LIBRARY to be set manually, as the location of the expat library
68 if(NOT EXPAT_LIBRARY)
69   if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES)
70     set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
71   else()
72     set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
73   endif()
75   if(WIN32)
76     list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
77   endif()
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}")
86   else()
87     set(CMAKE_FIND_LIBRARY_PREFIXES)
88   endif()
90   include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
91   select_library_configurations(EXPAT)
92 endif()
94 unset(EXPAT_NAMES)
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}")
108         else()
109           set(EXPAT_VERSION_STRING "${EXPAT_VERSION_PART}")
110         endif()
111       endif()
112     endforeach()
113   endforeach()
114 endif()
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.
122 if(EXPAT_FOUND)
123   set(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
125   if(NOT EXPAT_LIBRARIES)
126     set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
127   endif()
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")
138     endif()
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}")
145     endif()
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}")
152     endif()
154     if(NOT EXPAT_LIBRARY_RELEASE AND NOT EXPAT_LIBRARY_DEBUG)
155       set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
156         IMPORTED_LOCATION "${EXPAT_LIBRARY}")
157     endif()
158   endif()
159 endif()
161 mark_as_advanced(EXPAT_INCLUDE_DIR EXPAT_LIBRARY)
163 cmake_policy(POP)