summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortobil4sk <tobil4sk@outlook.com>2023-02-18 02:01:20 +0000
committerBrad King <brad.king@kitware.com>2023-02-20 08:48:09 -0500
commit13079f382b480c8fe6a68d98afc2cec716a75e59 (patch)
tree1b3923d994fc454b43bd50d99d627cbb5f22dcce
parent4f45993a5cffee30056847720b010a624683f04b (diff)
downloadcmake-13079f382b480c8fe6a68d98afc2cec716a75e59.tar.gz
FindEXPAT: Fix for debug and other modified builds
Now considers debug builds, and various other build types which result in a modified library name by the upstream build system. Fixes: #24422
-rw-r--r--Modules/FindEXPAT.cmake100
1 files changed, 78 insertions, 22 deletions
diff --git a/Modules/FindEXPAT.cmake b/Modules/FindEXPAT.cmake
index f9cb432078..3bedc73cfc 100644
--- a/Modules/FindEXPAT.cmake
+++ b/Modules/FindEXPAT.cmake
@@ -39,27 +39,62 @@ pkg_check_modules(PC_EXPAT QUIET expat)
# Look for the header file.
find_path(EXPAT_INCLUDE_DIR NAMES expat.h HINTS ${PC_EXPAT_INCLUDE_DIRS})
-# Look for the library.
-find_library(EXPAT_LIBRARY NAMES expat libexpat NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS})
-
-if (EXPAT_INCLUDE_DIR AND EXISTS "${EXPAT_INCLUDE_DIR}/expat.h")
- file(STRINGS "${EXPAT_INCLUDE_DIR}/expat.h" expat_version_str
- REGEX "^#[\t ]*define[\t ]+XML_(MAJOR|MINOR|MICRO)_VERSION[\t ]+[0-9]+$")
-
- unset(EXPAT_VERSION_STRING)
- foreach(VPART MAJOR MINOR MICRO)
- foreach(VLINE ${expat_version_str})
- if(VLINE MATCHES "^#[\t ]*define[\t ]+XML_${VPART}_VERSION[\t ]+([0-9]+)$")
- set(EXPAT_VERSION_PART "${CMAKE_MATCH_1}")
- if(EXPAT_VERSION_STRING)
- string(APPEND EXPAT_VERSION_STRING ".${EXPAT_VERSION_PART}")
- else()
- set(EXPAT_VERSION_STRING "${EXPAT_VERSION_PART}")
- endif()
- endif()
- endforeach()
+set(EXPAT_NAMES expat expatw)
+set(EXPAT_NAMES_DEBUG expatd expatwd)
+
+if(WIN32)
+ list(APPEND EXPAT_NAMES expatMT expatMD expatwMT expatwMD)
+ list(APPEND EXPAT_NAMES_DEBUG expatdMT expatdMD expatwdMT expatwdMD)
+endif()
+
+# Allow EXPAT_LIBRARY to be set manually, as the location of the expat library
+if(NOT EXPAT_LIBRARY)
+ if(DEFINED CMAKE_FIND_LIBRARY_PREFIXES)
+ set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
+ else()
+ set(_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
+ endif()
+
+ if(WIN32)
+ list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+ endif()
+
+ # Look for the library.
+ find_library(EXPAT_LIBRARY_RELEASE NAMES ${EXPAT_NAMES} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
+ find_library(EXPAT_LIBRARY_DEBUG NAMES ${EXPAT_NAMES_DEBUG} NAMES_PER_DIR HINTS ${PC_EXPAT_LIBRARY_DIRS} PATH_SUFFIXES lib)
+
+ # Restore the original find library ordering
+ if(DEFINED _expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
+ set(CMAKE_FIND_LIBRARY_PREFIXES "${_expat_ORIG_CMAKE_FIND_LIBRARY_PREFIXES}")
+ else()
+ set(CMAKE_FIND_LIBRARY_PREFIXES)
+ endif()
+
+ include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
+ select_library_configurations(EXPAT)
+endif()
+
+unset(EXPAT_NAMES)
+unset(EXPAT_NAMES_DEBUG)
+
+if(EXPAT_INCLUDE_DIR AND EXISTS "${EXPAT_INCLUDE_DIR}/expat.h")
+ file(STRINGS "${EXPAT_INCLUDE_DIR}/expat.h" expat_version_str
+ REGEX "^#[\t ]*define[\t ]+XML_(MAJOR|MINOR|MICRO)_VERSION[\t ]+[0-9]+$")
+
+ unset(EXPAT_VERSION_STRING)
+ foreach(VPART MAJOR MINOR MICRO)
+ foreach(VLINE ${expat_version_str})
+ if(VLINE MATCHES "^#[\t ]*define[\t ]+XML_${VPART}_VERSION[\t ]+([0-9]+)$")
+ set(EXPAT_VERSION_PART "${CMAKE_MATCH_1}")
+ if(EXPAT_VERSION_STRING)
+ string(APPEND EXPAT_VERSION_STRING ".${EXPAT_VERSION_PART}")
+ else()
+ set(EXPAT_VERSION_STRING "${EXPAT_VERSION_PART}")
+ endif()
+ endif()
endforeach()
-endif ()
+ endforeach()
+endif()
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(EXPAT
@@ -68,15 +103,36 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(EXPAT
# Copy the results to the output variables and target.
if(EXPAT_FOUND)
- set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
set(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
+ if(NOT EXPAT_LIBRARIES)
+ set(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
+ endif()
+
if(NOT TARGET EXPAT::EXPAT)
add_library(EXPAT::EXPAT UNKNOWN IMPORTED)
set_target_properties(EXPAT::EXPAT PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
- IMPORTED_LOCATION "${EXPAT_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${EXPAT_INCLUDE_DIRS}")
+
+ if(EXPAT_LIBRARY_RELEASE)
+ set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS RELEASE)
+ set_target_properties(EXPAT::EXPAT PROPERTIES
+ IMPORTED_LOCATION_RELEASE "${EXPAT_LIBRARY_RELEASE}")
+ endif()
+
+ if(EXPAT_LIBRARY_DEBUG)
+ set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties(EXPAT::EXPAT PROPERTIES
+ IMPORTED_LOCATION_DEBUG "${EXPAT_LIBRARY_DEBUG}")
+ endif()
+
+ if(NOT EXPAT_LIBRARY_RELEASE AND NOT EXPAT_LIBRARY_DEBUG)
+ set_property(TARGET EXPAT::EXPAT APPEND PROPERTY
+ IMPORTED_LOCATION "${EXPAT_LIBRARY}")
+ endif()
endif()
endif()