summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2023-09-06 22:15:27 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2023-09-06 22:15:44 (GMT)
commitd83d925045484c882527477b01596073f45d3faa (patch)
treec2ee320bfb2c8fa752ccb91655c6169c2a3dc161
parent4771544386302f0642b83194656d14014d600e70 (diff)
downloadCMake-d83d925045484c882527477b01596073f45d3faa.zip
CMake-d83d925045484c882527477b01596073f45d3faa.tar.gz
CMake-d83d925045484c882527477b01596073f45d3faa.tar.bz2
FindFreetype: use `freetype-config.cmake` if available
The official `freetype-config.cmake` provides `Freetype::Freetype` as an `INTERFACE` library to its exported `freetype` target. This ends up causing issues if CMake's Find module is used to define `Freetype::Freetype` before using `freetype-config` because some, but not all, of its defined targets are already available triggering the generated code that detects such situations. Instead, try to use `freetype-config` where possible and provide bridge logic for this module's variable guarantees.
-rw-r--r--Modules/FindFreetype.cmake58
1 files changed, 58 insertions, 0 deletions
diff --git a/Modules/FindFreetype.cmake b/Modules/FindFreetype.cmake
index 82885cb..dcf271d 100644
--- a/Modules/FindFreetype.cmake
+++ b/Modules/FindFreetype.cmake
@@ -65,6 +65,64 @@ directory of a Freetype installation.
# I'm going to attempt to cut out the middleman and hope
# everything still works.
+set(_Freetype_args)
+if (Freetype_FIND_QUIETLY)
+ list(APPEND _Freetype_args
+ QUIET)
+endif ()
+if (Freetype_FIND_VERSION)
+ list(APPEND _Freetype_args
+ "${Freetype_FIND_VERSION}")
+ if (Freetype_FIND_VERSION_EXACT)
+ list(APPEND _Freetype_args
+ EXACT)
+ endif ()
+endif ()
+set(_Freetype_component_req)
+set(_Freetype_component_opt)
+foreach (_Freetype_component IN LISTS Freetype_FIND_COMPONENTS)
+ if (Freetype_FIND_REQUIRE_${_Freetype_component})
+ list(APPEND _Freetype_component_req
+ "${_Freetype_component}")
+ else ()
+ list(APPEND _Freetype_component_opt
+ "${_Freetype_component}")
+ endif ()
+endforeach ()
+unset(_Freetype_component)
+if (_Freetype_component_req)
+ list(APPEND _Freetype_args
+ COMPONENTS "${_Freetype_component_req}")
+endif ()
+unset(_Freetype_component_req)
+if (_Freetype_component_opt)
+ list(APPEND _Freetype_args
+ OPTIONAL_COMPONENTS "${_Freetype_component_opt}")
+endif ()
+unset(_Freetype_component_opt)
+find_package(freetype CONFIG ${_Freetype_args})
+unset(_Freetype_args)
+if (freetype_FOUND)
+ if (NOT TARGET Freetype::Freetype)
+ add_library(Freetype::Freetype IMPORTED INTERFACE)
+ set_target_properties(Freetype::Freetype PROPERTIES
+ INTERFACE_LINK_LIBRARIES freetype)
+ endif ()
+ get_property(FREETYPE_INCLUDE_DIRS TARGET freetype PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+ get_property(FREETYPE_LIBRARIES TARGET freetype PROPERTY INTERFACE_LINK_LIBRARIES)
+ get_property(_Freetype_location TARGET freetype PROPERTY LOCATION)
+ list(APPEND FREETYPE_LIBRARIES
+ "${_Freetype_location}")
+ unset(_Freetype_location)
+ set(Freetype_FOUND 1)
+ set(FREETYPE_VERSION_STRING "${freetype_VERSION}")
+ foreach (_Freetype_component IN LISTS Freetype_FIND_COMPONENTS)
+ set(Freetype_${_Freetype_component}_FOUND "${freetype_${_Freetype_component}_FOUND}")
+ endforeach ()
+ unset(_Freetype_component)
+ return ()
+endif ()
+
set(FREETYPE_FIND_ARGS
HINTS
ENV FREETYPE_DIR