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.
This commit is contained in:
Ben Boeckel 2023-09-06 18:15:27 -04:00
parent 4771544386
commit d83d925045

View File

@ -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