* CMakeLists.txt: Add support for `FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC`.

This commit introduces a new CMake option `FT_DYNAMIC_HARFBUZZ`.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b14e813..cad0e3e 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
+#   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 @@
 
 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 @@
 
 # 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 @@
     "/\\* +(#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 @@
   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 @@
 
   - 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