* 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 ()