Skip to content
Open
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
2028fa4
add support for zlib and libpng libraries
mammo0 Dec 22, 2020
2898aa3
updated zlib download URL
mammo0 Apr 6, 2022
e3a0263
added missing include directories for zlib and libpng
mammo0 Apr 6, 2022
e0f8e66
only build static libpng (like harfbuzz)
mammo0 Apr 9, 2022
9056f72
only build static zlib (like harfbuzz and libpng)
mammo0 Apr 9, 2022
0c1219d
fixed name of cmake 'DHARFBUZZ_INCLUDE_DIRS' variable
mammo0 Apr 9, 2022
1ccdc8c
prevent re-export of symbols from harfbuzz, libpng and zlib
mammo0 Apr 9, 2022
8267680
Merge branch 'master' into built_in_zlib_libpng
mammo0 May 12, 2022
6c5c6f2
Merge branch 'master' into built_in_zlib_libpng
HinTak May 22, 2023
bd59b8d
updated libpng version to 1.6.40
mammo0 Nov 8, 2023
ab91497
fixed freetype cmake variable names
mammo0 Nov 8, 2023
e3566dd
clean freetype cmake build dir before final build
mammo0 Nov 19, 2023
9a4ef31
do try to find any system libraries
mammo0 Nov 19, 2023
ac20453
Merge branch 'master' into built_in_zlib_libpng
anthrotype Mar 8, 2024
24d2935
Merge commit 'e9968d040cfba46610970e4090b2ad383a9638e7' into built_in…
mammo0 May 13, 2025
756cb3a
fixed freetype download URL
mammo0 Dec 5, 2024
8f87482
fixed zlib URL
mammo0 May 13, 2025
6d92c6a
updated freetype, zlib and libpng
mammo0 May 13, 2025
00a637d
fixed distutils.spawn.find_executable deprecation
mammo0 May 13, 2025
a3ccb5b
removed unused import
mammo0 May 13, 2025
40ec939
updated zlib to 1.3.2
mammo0 Mar 10, 2026
23929b0
updated freetype to 2.14.2
mammo0 Mar 10, 2026
75cbaaf
updated harfbuzz to 13.0.1
mammo0 Mar 10, 2026
2065b73
updated libpng to 1.6.55
mammo0 Mar 10, 2026
78ce05c
use permanent URL for zlib
mammo0 Mar 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 105 additions & 23 deletions setup-build-freetype.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
# GCC, Visual Studio Community 2017, ...)

import distutils.dir_util
import distutils.file_util
import distutils.spawn
import glob
import hashlib
import os
Expand All @@ -21,18 +19,32 @@
import urllib.request
from os import path
import platform
import fileinput

# Needed for the GitHub Actions macOS CI runner, which appears to come without CAs.
import certifi

FREETYPE_HOST = "https://mirrors.sarata.com/non-gnu/freetype/"
FREETYPE_TARBALL = "freetype-2.13.2.tar.xz"
FREETYPE_HOST = "https://download.savannah.gnu.org/releases/freetype/"
FREETYPE_TARBALL = "freetype-2.14.2.tar.xz"
FREETYPE_URL = FREETYPE_HOST + FREETYPE_TARBALL
FREETYPE_SHA256 = "12991c4e55c506dd7f9b765933e62fd2be2e06d421505d7950a132e4f1bb484d"
HARFBUZZ_HOST = "https://github.com/harfbuzz/harfbuzz/releases/download/8.3.0/"
HARFBUZZ_TARBALL = "harfbuzz-8.3.0.tar.xz"
FREETYPE_SHA256 = "4b62dcab4c920a1a860369933221814362e699e26f55792516d671e6ff55b5e1"
HARFBUZZ_HOST = "https://github.com/harfbuzz/harfbuzz/releases/download/13.0.1/"
HARFBUZZ_TARBALL = "harfbuzz-13.0.1.tar.xz"
HARFBUZZ_URL = HARFBUZZ_HOST + HARFBUZZ_TARBALL
HARFBUZZ_SHA256 = "109501eaeb8bde3eadb25fab4164e993fbace29c3d775bcaa1c1e58e2f15f847"
HARFBUZZ_SHA256 = "3553d943401c34ab9b8c75f35cdb8452ca660233b0e9d4a22395ce5245484bd7"

ZLIB_HOST = "https://web.archive.org/web/20260219053942if_/https://zlib.net/"
ZLIB_TARBALL = "zlib-1.3.2.tar.xz"
ZLIB_URL = ZLIB_HOST + ZLIB_TARBALL
ZLIB_SH256 = "d7a0654783a4da529d1bb793b7ad9c3318020af77667bcae35f95d0e42a792f3"

LIBPNG_HOST = "https://download.sourceforge.net/libpng/"
LIBPNG_TARBALL = "libpng-1.6.55.tar.xz"
LIBPNG_URL = LIBPNG_HOST + LIBPNG_TARBALL
LIBPNG_SH256 = "d925722864837ad5ae2a82070d4b2e0603dc72af44bd457c3962298258b8e82d"

BUILD_ZLIB = os.environ.get("FREETYPEPY_WITH_ZLIB", "")
BUILD_LIBPNG = os.environ.get("FREETYPEPY_WITH_LIBPNG", "")

root_dir = "."
build_dir = path.join(root_dir, "build")
Expand All @@ -41,17 +53,20 @@
lib_dir = path.join(prefix_dir, "lib")
build_dir_ft = path.join(build_dir, FREETYPE_TARBALL.split(".tar")[0], "build")
build_dir_hb = path.join(build_dir, HARFBUZZ_TARBALL.split(".tar")[0], "build")
build_dir_zl = path.join(build_dir, ZLIB_TARBALL.split(".tar")[0], "build")
build_dir_lp = path.join(build_dir, LIBPNG_TARBALL.split(".tar")[0], "build")

CMAKE_GLOBAL_SWITCHES = (
"-DCMAKE_COLOR_MAKEFILE=false "
'-DCMAKE_PREFIX_PATH="{}" '
'-DCMAKE_INSTALL_PREFIX="{}" '
).format(prefix_dir, prefix_dir)
CMAKE_PREVENT_REEXPORT = ""

# Try to use Ninja to build things if it's available. Much faster.
# On Windows, I first need to figure out how to make it aware of VC, bitness,
# etc.
if sys.platform != "win32" and distutils.spawn.find_executable("ninja"):
if sys.platform != "win32" and shutil.which("ninja"):
CMAKE_GLOBAL_SWITCHES += "-G Ninja "

bitness = None
Expand All @@ -67,6 +82,12 @@
print("# Making a 32 bit build.")
bitness = 32

CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libharfbuzz "
if BUILD_ZLIB or BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libz "
if BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libpng "

if sys.platform == "darwin":
print("# Making a 64 bit build.")
CMAKE_GLOBAL_SWITCHES += (
Expand All @@ -77,6 +98,14 @@
)
bitness = 64

# the library path is needed for the '-hidden-lx' option to work
CMAKE_PREVENT_REEXPORT += "-Wl,-L{} ".format(lib_dir)
CMAKE_PREVENT_REEXPORT += "-Wl,-hidden-lharfbuzz "
if BUILD_ZLIB or BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,-hidden-lz "
if BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,-hidden-lpng "

if "linux" in sys.platform:
c_flags = cxx_flags = "-O2"
ld_flags = ""
Expand Down Expand Up @@ -110,6 +139,12 @@
'-DCMAKE_LD_FLAGS="{}" '.format(ld_flags)
)

CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libharfbuzz "
if BUILD_ZLIB or BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libz "
if BUILD_LIBPNG:
CMAKE_PREVENT_REEXPORT += "-Wl,--exclude-libs,libpng "


def shell(cmd, cwd=None):
"""Run a shell command specified by cmd string."""
Expand Down Expand Up @@ -154,18 +189,26 @@ def ensure_downloaded(url, sha256_sum):
distutils.dir_util.mkpath(prefix_dir)
distutils.dir_util.mkpath(build_dir_ft)
distutils.dir_util.mkpath(build_dir_hb)
if BUILD_ZLIB or BUILD_LIBPNG:
distutils.dir_util.mkpath(build_dir_zl)
if BUILD_LIBPNG:
distutils.dir_util.mkpath(build_dir_lp)

ensure_downloaded(FREETYPE_URL, FREETYPE_SHA256)
ensure_downloaded(HARFBUZZ_URL, HARFBUZZ_SHA256)
if BUILD_ZLIB or BUILD_LIBPNG:
ensure_downloaded(ZLIB_URL, ZLIB_SH256)
if BUILD_LIBPNG:
ensure_downloaded(LIBPNG_URL, LIBPNG_SH256)

print("# First, build FreeType without Harfbuzz support")
print("# First, build FreeType without additional libraries")
shell(
"cmake -DBUILD_SHARED_LIBS=OFF "
"-DCMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE -DFT_WITH_HARFBUZZ=OFF "
"-DCMAKE_DISABLE_FIND_PACKAGE_PNG=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_ZLIB=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_BrotliDec=TRUE "
"-DFT_DISABLE_HARFBUZZ=TRUE "
"-DFT_DISABLE_PNG=TRUE "
"-DFT_DISABLE_BZIP2=TRUE "
"-DFT_DISABLE_ZLIB=TRUE "
"-DFT_DISABLE_BROTLI=TRUE "
"{} ..".format(CMAKE_GLOBAL_SWITCHES),
cwd=build_dir_ft,
)
Expand All @@ -182,19 +225,58 @@ def ensure_downloaded(url, sha256_sum):
)
shell("cmake --build . --config Release --target install --parallel", cwd=build_dir_hb)

print("\n# Lastly, rebuild FreeType, this time with Harfbuzz support.")
if BUILD_ZLIB or BUILD_LIBPNG:
print("\n# Next, build zlib.")
# workaround to only build the static library of zlib
# see https://github.com/madler/zlib/issues/359
with fileinput.input(path.join(path.dirname(build_dir_zl), "CMakeLists.txt"), inplace=True) as f:
for line in f:
if "install(TARGETS zlib zlibstatic" in line:
line = line.replace(" install(TARGETS zlib zlibstatic", " install(TARGETS zlibstatic")
print(line, end='')

shell(
"cmake " +
# https://stackoverflow.com/questions/3961446
("-DCMAKE_POSITION_INDEPENDENT_CODE=ON " if bitness > 32 else "") +
"{} ..".format(CMAKE_GLOBAL_SWITCHES),
cwd=build_dir_zl,
)
shell("cmake --build . --config Release --target install --parallel", cwd=build_dir_zl)

if BUILD_LIBPNG:
print("\n# Next, build libpng.")
shell(
"cmake -DPNG_SHARED=OFF " +
# https://stackoverflow.com/questions/3961446
("-DCMAKE_POSITION_INDEPENDENT_CODE=ON " if bitness > 32 else "") +
"{} ..".format(CMAKE_GLOBAL_SWITCHES),
cwd=build_dir_lp,
)
shell("cmake --build . --config Release --target install --parallel", cwd=build_dir_lp)

print("\n# Lastly, rebuild FreeType, this time with additional libraries support.")
# clean cmake build dir for a clean build
distutils.dir_util.remove_tree(build_dir_ft)
distutils.dir_util.mkpath(build_dir_ft)
harfbuzz_includes = path.join(prefix_dir, "include", "harfbuzz")
libpng_includes = path.join(prefix_dir, "include", "libpng16")
zlib_includes = path.join(prefix_dir, "include")
shell(
"cmake -DBUILD_SHARED_LIBS=ON "
"-DCMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=FALSE -DFT_WITH_HARFBUZZ=ON "
"-DCMAKE_DISABLE_FIND_PACKAGE_PNG=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_ZLIB=TRUE "
"-DCMAKE_DISABLE_FIND_PACKAGE_BrotliDec=TRUE "
"-DFT_REQUIRE_HARFBUZZ=TRUE " +
("-DFT_REQUIRE_PNG=TRUE " if BUILD_LIBPNG else "-DFT_DISABLE_PNG=TRUE ") +
"-DFT_DISABLE_BZIP2=TRUE " +
("-DFT_REQUIRE_ZLIB=TRUE " if BUILD_ZLIB or BUILD_LIBPNG else "-DFT_DISABLE_ZLIB=TRUE ") +
"-DFT_DISABLE_BROTLI=TRUE "
'-DPKG_CONFIG_EXECUTABLE="" ' # Prevent finding system libraries
'-DHARFBUZZ_INCLUDE_DIRS="{}" '
'-DHarfBuzz_INCLUDE_DIRS="{}" '
'-DPNG_INCLUDE_DIRS="{}" '
'-DZLIB_INCLUDE_DIRS="{}" '
# prevent re-export of symbols from harfbuzz, libpng and zlib
'-DCMAKE_SHARED_LINKER_FLAGS="{}" '
"-DSKIP_INSTALL_HEADERS=ON "
"{} ..".format(harfbuzz_includes, CMAKE_GLOBAL_SWITCHES),
"{} ..".format(harfbuzz_includes, libpng_includes, zlib_includes, CMAKE_PREVENT_REEXPORT, CMAKE_GLOBAL_SWITCHES),
cwd=build_dir_ft,
)
shell("cmake --build . --config Release --target install --parallel", cwd=build_dir_ft)
Expand Down
Loading