diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-09-06 22:15:27 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2023-09-06 22:15:44 (GMT) |
commit | d83d925045484c882527477b01596073f45d3faa (patch) | |
tree | c2ee320bfb2c8fa752ccb91655c6169c2a3dc161 | |
parent | 4771544386302f0642b83194656d14014d600e70 (diff) | |
download | CMake-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.cmake | 58 |
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 |