[PATCH] cmake: implement support for FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC
Ozkan Sezer <[email protected]> Tue, 3 Jun 2025 23:25:48 +0300
| Newsgroups | gmane.comp.fonts.freetype.devel |
|---|---|
| Message-ID | <CAA2C=vDKsYaOYi+4AH-gD6ZJzZACdOcUqcEk_nyCz5otiDmx0A@mail.gmail.com> |
Regards. -- O.S.
0001-cmake-implement-support-for-FT_CONFIG_OPTION_USE_HAR.patch
(application/octet-stream, 4.6 KB)
From 3fa4ce560c4c21ce8904caa77cbbffe0dc9805d3 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer <[email protected]> Date: Tue, 3 Jun 2025 23:15:32 +0300 Subject: [PATCH] cmake: implement support for FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC --- CMakeLists.txt | 46 +++++++++++++++++++++++++++++++++++++++++++--- docs/CHANGES | 8 ++++---- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b14e813..6a6dfc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 +# 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,33 @@ 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 +370,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 +565,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 () diff --git a/docs/CHANGES b/docs/CHANGES index a2a5dbc..76db3c8 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -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