* CMakeLists.txt: Add support for FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC.

This commit introduces a new CMake option `FT_DYNAMIC_HARFBUZZ`.
This commit is contained in:
Ozkan Sezer 2025-06-03 23:15:32 +03:00 committed by Werner Lemberg
parent 1518bc83d2
commit 81f839a7d9
2 changed files with 50 additions and 7 deletions

View file

@ -87,6 +87,11 @@
# -D FT_REQUIRE_HARFBUZZ=TRUE \
# -D FT_REQUIRE_BROTLI=TRUE [...]
#
# - Set the `FT_DYNAMIC_HARFBUZZ' CMake variable to `ON' or `TRUE' to load
# the HarfBuzz library dynamically at runtime, if possible. Example:
#
# cmake -B build -D FT_DYNAMIC_HARFBUZZ=TRUE [...]
#
# - Set `FT_DISABLE_XXX=TRUE' to disable a dependency completely (where
# `XXX' is a CMake package name like `BZip2'). Example for disabling all
# dependencies:
@ -197,6 +202,9 @@ cmake_dependent_option(FT_REQUIRE_PNG
option(FT_DISABLE_HARFBUZZ
"Disable HarfBuzz (used for improving auto-hinting of OpenType fonts)." OFF)
cmake_dependent_option(FT_DYNAMIC_HARFBUZZ
"Load HarfBuzz library dynamically at runtime, if possible." ON
"NOT FT_DISABLE_HARFBUZZ" OFF)
cmake_dependent_option(FT_REQUIRE_HARFBUZZ
"Require HarfBuzz for improving auto-hinting of OpenType fonts." OFF
"NOT FT_DISABLE_HARFBUZZ" OFF)
@ -239,10 +247,36 @@ endif ()
# Find dependencies
include(FindPkgConfig)
include(CMakePushCheckState)
include(CheckSymbolExists)
if (NOT FT_DISABLE_HARFBUZZ)
set(HARFBUZZ_MIN_VERSION "2.6.8")
if (FT_REQUIRE_HARFBUZZ)
if (FT_DYNAMIC_HARFBUZZ)
if (WIN32) # Windows uses its own LoadLibrary()
set(FT_DYNAMIC_HARFBUZZ_ENABLED TRUE)
else()
cmake_push_check_state(RESET)
check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBC)
if (NOT HAVE_DLOPEN_IN_LIBC)
set(CMAKE_REQUIRED_LIBRARIES dl)
check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBDL)
endif()
cmake_pop_check_state()
if (HAVE_DLOPEN_IN_LIBC OR HAVE_DLOPEN_IN_LIBDL)
set(FT_DYNAMIC_HARFBUZZ_ENABLED TRUE)
if (HAVE_DLOPEN_IN_LIBDL)
set(FT_NEED_LIBDL TRUE)
endif()
endif()
endif()
endif()
if (FT_DYNAMIC_HARFBUZZ_ENABLED)
message(STATUS "Enabled dynamic loading of HarfBuzz library at runtime.")
elseif (FT_REQUIRE_HARFBUZZ)
find_package(HarfBuzz ${HARFBUZZ_MIN_VERSION} REQUIRED)
else ()
find_package(HarfBuzz ${HARFBUZZ_MIN_VERSION})
@ -339,10 +373,15 @@ if (PNG_FOUND)
"/\\* +(#define +FT_CONFIG_OPTION_USE_PNG) +\\*/" "\\1"
FTOPTION_H "${FTOPTION_H}")
endif ()
if (HARFBUZZ_FOUND)
if (HARFBUZZ_FOUND OR FT_DYNAMIC_HARFBUZZ_ENABLED)
string(REGEX REPLACE
"/\\* +(#define +FT_CONFIG_OPTION_USE_HARFBUZZ) +\\*/" "\\1"
FTOPTION_H "${FTOPTION_H}")
if (FT_DYNAMIC_HARFBUZZ_ENABLED)
string(REGEX REPLACE
"/\\* +(#define +FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC) +\\*/" "\\1"
FTOPTION_H "${FTOPTION_H}")
endif ()
endif ()
if (BROTLIDEC_FOUND)
string(REGEX REPLACE
@ -529,7 +568,11 @@ if (PNG_FOUND)
target_link_libraries(freetype PRIVATE PNG::PNG)
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "libpng")
endif ()
if (HarfBuzz_FOUND)
if (FT_DYNAMIC_HARFBUZZ_ENABLED AND FT_NEED_LIBDL)
target_link_libraries(freetype PRIVATE dl)
list(APPEND PKGCONFIG_LIBS_PRIVATE " -ldl")
endif ()
if (HarfBuzz_FOUND AND (NOT FT_DYNAMIC_HARFBUZZ_ENABLED))
target_link_libraries(freetype PRIVATE HarfBuzz::HarfBuzz)
list(APPEND PKGCONFIG_REQUIRES_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}")
endif ()

View file

@ -4,10 +4,10 @@ CHANGES BETWEEN 2.13.3 and 2.14.0 (2025-Mmm-DD)
- A new configuration macro `FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC`
is available to load the HarfBuzz library dynamically (in addition
to the standard static and dynamic linking modes); both meson and
autotools support have been updated accordingly (but not CMake
yet). Using this new feature makes it possible to avoid the
circular dependency between HarfBuzz and FreeType.
to the standard static and dynamic linking modes); cmake, meson
and autotools support have been updated accordingly. Using this
new feature makes it possible to avoid the circular dependency
between HarfBuzz and FreeType.
A side effect of this change is that FreeType no longer uses
HarfBuzz header files (if HarfBuzz support is activated). To make