3 # Copyright (C) 2013-2020 by
4 # David Turner, Robert Wilhelm, and Werner Lemberg.
6 # Written originally by John Cary <cary@txcorp.com>
8 # This file is part of the FreeType project, and may only be used, modified,
9 # and distributed under the terms of the FreeType project license,
10 # LICENSE.TXT. By continuing to use, modify, or distribute this file you
11 # indicate that you have read the license and understand and accept it
15 # The following will 1. create a build directory and 2. change into it and
16 # call cmake to configure the build with default parameters as a static
17 # library. See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
18 # for information about Debug, Release, etc. builds.
20 # cmake -B build -D CMAKE_BUILD_TYPE=Release
22 # For a dynamic library, use
24 # cmake -B build -D BUILD_SHARED_LIBS=true -D CMAKE_BUILD_TYPE=Release
26 # For a framework on OS X, use
28 # cmake -E chdir build cmake -G Xcode -D BUILD_FRAMEWORK:BOOL=true ..
30 # For an iOS static library, use
32 # cmake -E chdir build cmake -G Xcode -D IOS_PLATFORM=OS ..
36 # cmake -E chdir build cmake -G Xcode -D IOS_PLATFORM=SIMULATOR ..
40 # cmake -E chdir build cmake -G Xcode -D IOS_PLATFORM=SIMULATOR64 ..
42 # Finally, build the project with:
48 # (sudo) cmake --build build --target install
50 # A binary distribution can be made with
52 # cmake --build build --config Release --target package
54 # Please refer to the cmake manual for further options, in particular, how
55 # to modify compilation and linking parameters.
59 # . `cmake' creates configuration files in
61 # <build-directory>/include/freetype/config
63 # which should be further modified if necessary.
65 # . You can use `cmake' directly on a freshly cloned FreeType git
68 # . `CMakeLists.txt' is provided as-is since it is normally not used by the
71 # . Set the `FT_WITH_ZLIB', `FT_WITH_BZIP2', `FT_WITH_PNG',
72 # `FT_WITH_HARFBUZZ', and `FT_WITH_BROTLI' CMake variables to `ON' to
73 # force using a dependency. Leave a variable undefined (which is the
74 # default) to use the dependency only if it is available. Example:
76 # cmake -B build -D FT_WITH_ZLIB=ON \
77 # -D FT_WITH_BZIP2=ON \
79 # -D FT_WITH_HARFBUZZ=ON \
80 # -D FT_WITH_BROTLI=ON [...]
82 # Set `CMAKE_DISABLE_FIND_PACKAGE_XXX=TRUE' to disable a dependency completely
83 # (where `XXX' is a CMake package name like `BZip2'). Example for disabling all
86 # cmake -B build -D CMAKE_DISABLE_FIND_PACKAGE_ZLIB=TRUE \
87 # -D CMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE \
88 # -D CMAKE_DISABLE_FIND_PACKAGE_PNG=TRUE \
89 # -D CMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE \
90 # -D CMAKE_DISABLE_FIND_PACKAGE_BrotliDec=TRUE [...]
92 # . Installation of FreeType can be controlled with the CMake variables
93 # `SKIP_INSTALL_HEADERS', `SKIP_INSTALL_LIBRARIES', and `SKIP_INSTALL_ALL'
94 # (this is compatible with the same CMake variables in zlib's CMake
97 # FreeType explicitly marks the API to be exported and relies on the compiler
98 # to hide all other symbols. CMake supports a C_VISBILITY_PRESET property
99 # starting with 2.8.12.
100 cmake_minimum_required(VERSION 2.8.12)
102 if (NOT CMAKE_VERSION VERSION_LESS 3.3)
103 # Allow symbol visibility settings also on static libraries. CMake < 3.3
104 # only sets the property on a shared library build.
105 cmake_policy(SET CMP0063 NEW)
108 include(CheckIncludeFile)
110 # CMAKE_TOOLCHAIN_FILE must be set before `project' is called, which
111 # configures the base build environment and references the toolchain file
113 if (DEFINED IOS_PLATFORM)
114 if (NOT "${IOS_PLATFORM}" STREQUAL "OS"
115 AND NOT "${IOS_PLATFORM}" STREQUAL "SIMULATOR"
116 AND NOT "${IOS_PLATFORM}" STREQUAL "SIMULATOR64")
118 "IOS_PLATFORM must be set to either OS, SIMULATOR, or SIMULATOR64")
120 if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
121 message(AUTHOR_WARNING
122 "You should use Xcode generator with IOS_PLATFORM enabled to get Universal builds.")
124 if (BUILD_SHARED_LIBS)
126 "BUILD_SHARED_LIBS can not be on with IOS_PLATFORM enabled")
130 "BUILD_FRAMEWORK can not be on with IOS_PLATFORM enabled")
133 # iOS only uses static libraries
134 set(BUILD_SHARED_LIBS OFF)
136 set(CMAKE_TOOLCHAIN_FILE
137 ${CMAKE_SOURCE_DIR}/builds/cmake/iOS.cmake)
140 if (DEFINED IOS_PLATFORM)
141 message(FATAL_ERROR "IOS_PLATFORM is not supported on this platform")
148 set(VERSION_MAJOR "2")
149 set(VERSION_MINOR "10")
150 set(VERSION_PATCH "4")
152 # Generate LIBRARY_VERSION and LIBRARY_SOVERSION.
153 set(LIBTOOL_REGEX "version_info='([0-9]+):([0-9]+):([0-9]+)'")
154 file(STRINGS "${PROJECT_SOURCE_DIR}/builds/unix/configure.raw"
156 REGEX ${LIBTOOL_REGEX})
158 ${LIBTOOL_REGEX} "\\1"
159 LIBTOOL_CURRENT "${VERSION_INFO}")
161 ${LIBTOOL_REGEX} "\\2"
162 LIBTOOL_REVISION "${VERSION_INFO}")
164 ${LIBTOOL_REGEX} "\\3"
165 LIBTOOL_AGE "${VERSION_INFO}")
167 # This is what libtool does internally on Unix platforms.
168 math(EXPR LIBRARY_SOVERSION "${LIBTOOL_CURRENT} - ${LIBTOOL_AGE}")
169 set(LIBRARY_VERSION "${LIBRARY_SOVERSION}.${LIBTOOL_AGE}.${LIBTOOL_REVISION}")
171 # External dependency library detection is automatic. See the notes at the top
172 # of this file, for how to force or disable dependencies completely.
173 option(FT_WITH_ZLIB "Use system zlib instead of internal library." OFF)
174 option(FT_WITH_BZIP2 "Support bzip2 compressed fonts." OFF)
175 option(FT_WITH_PNG "Support PNG compressed OpenType embedded bitmaps." OFF)
176 option(FT_WITH_HARFBUZZ "Improve auto-hinting of OpenType fonts." OFF)
177 option(FT_WITH_BROTLI "Support compressed WOFF2 fonts." OFF)
180 # Disallow in-source builds
181 if ("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
183 "In-source builds are not permitted! Make a separate folder for"
185 " cmake -E make_directory build\n"
186 " cmake -E chdir build cmake ..\n"
187 "Before that, remove the files created by this failed run with\n"
188 " cmake -E remove CMakeCache.txt\n"
189 " cmake -E remove_directory CMakeFiles")
193 # Add local cmake modules
194 list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/builds/cmake)
198 if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
200 "You should use Xcode generator with BUILD_FRAMEWORK enabled")
202 set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
203 set(BUILD_SHARED_LIBS ON)
208 set(HARFBUZZ_MIN_VERSION "1.8.0")
209 if (FT_WITH_HARFBUZZ)
210 find_package(HarfBuzz ${HARFBUZZ_MIN_VERSION} REQUIRED)
212 find_package(HarfBuzz ${HARFBUZZ_MIN_VERSION})
216 find_package(PNG REQUIRED)
222 find_package(ZLIB REQUIRED)
228 find_package(BZip2 REQUIRED)
234 find_package(BrotliDec REQUIRED)
236 find_package(BrotliDec)
239 # Create the configuration file
241 check_include_file("unistd.h" HAVE_UNISTD_H)
242 check_include_file("fcntl.h" HAVE_FCNTL_H)
244 file(READ "${PROJECT_SOURCE_DIR}/builds/unix/ftconfig.h.in"
248 "#undef +(HAVE_UNISTD_H)" "#define \\1 1"
249 FTCONFIG_H "${FTCONFIG_H}")
253 "#undef +(HAVE_FCNTL_H)" "#define \\1 1"
254 FTCONFIG_H "${FTCONFIG_H}")
257 file(READ "${PROJECT_SOURCE_DIR}/include/freetype/config/ftconfig.h"
261 set(FTCONFIG_H_NAME "${PROJECT_BINARY_DIR}/include/freetype/config/ftconfig.h")
262 if (EXISTS "${FTCONFIG_H_NAME}")
263 file(READ "${FTCONFIG_H_NAME}" ORIGINAL_FTCONFIG_H)
265 set(ORIGINAL_FTCONFIG_H "")
267 if (NOT (ORIGINAL_FTCONFIG_H STREQUAL FTCONFIG_H))
268 file(WRITE "${FTCONFIG_H_NAME}" "${FTCONFIG_H}")
272 # Create the options file
273 file(READ "${PROJECT_SOURCE_DIR}/include/freetype/config/ftoption.h"
277 "/\\* +(#define +FT_CONFIG_OPTION_SYSTEM_ZLIB) +\\*/" "\\1"
278 FTOPTION_H "${FTOPTION_H}")
282 "/\\* +(#define +FT_CONFIG_OPTION_USE_BZIP2) +\\*/" "\\1"
283 FTOPTION_H "${FTOPTION_H}")
287 "/\\* +(#define +FT_CONFIG_OPTION_USE_PNG) +\\*/" "\\1"
288 FTOPTION_H "${FTOPTION_H}")
292 "/\\* +(#define +FT_CONFIG_OPTION_USE_HARFBUZZ) +\\*/" "\\1"
293 FTOPTION_H "${FTOPTION_H}")
297 "/\\* +(#define +FT_CONFIG_OPTION_USE_BROTLI) +\\*/" "\\1"
298 FTOPTION_H "${FTOPTION_H}")
301 set(FTOPTION_H_NAME "${PROJECT_BINARY_DIR}/include/freetype/config/ftoption.h")
302 if (EXISTS "${FTOPTION_H_NAME}")
303 file(READ "${FTOPTION_H_NAME}" ORIGINAL_FTOPTION_H)
305 set(ORIGINAL_FTOPTION_H "")
307 if (NOT (ORIGINAL_FTOPTION_H STREQUAL FTOPTION_H))
308 file(WRITE "${FTOPTION_H_NAME}" "${FTOPTION_H}")
312 file(GLOB PUBLIC_HEADERS "include/ft2build.h" "include/freetype/*.h")
313 file(GLOB PUBLIC_CONFIG_HEADERS "include/freetype/config/*.h")
314 file(GLOB PRIVATE_HEADERS "include/freetype/internal/*.h")
318 src/autofit/autofit.c
347 src/pshinter/pshinter.c
348 src/psnames/psnames.c
352 src/truetype/truetype.c
355 src/winfonts/winfnt.c
359 list(APPEND BASE_SRCS "builds/unix/ftsystem.c")
361 list(APPEND BASE_SRCS "src/base/ftsystem.c")
366 list(APPEND BASE_SRCS builds/windows/ftdebug.c
369 list(APPEND BASE_SRCS builds/wince/ftdebug.c)
371 list(APPEND BASE_SRCS src/base/ftdebug.c)
375 list(APPEND BASE_SRCS builds/mac/freetype-Info.plist)
379 if (NOT DISABLE_FORCE_DEBUG_POSTFIX)
380 set(CMAKE_DEBUG_POSTFIX d)
386 ${PUBLIC_CONFIG_HEADERS}
391 set_target_properties(
393 C_VISIBILITY_PRESET hidden)
395 target_compile_definitions(
396 freetype PRIVATE FT2_BUILD_LIBRARY)
399 target_compile_definitions(
400 freetype PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS)
401 if (BUILD_SHARED_LIBS)
402 target_compile_definitions(
403 freetype PRIVATE DLL_EXPORT)
407 if (BUILD_SHARED_LIBS)
408 set_target_properties(freetype PROPERTIES
409 VERSION ${LIBRARY_VERSION}
410 SOVERSION ${LIBRARY_SOVERSION})
413 # Pick up ftconfig.h and ftoption.h generated above, first.
414 target_include_directories(
417 $<INSTALL_INTERFACE:include/freetype2>
418 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
419 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
421 ${CMAKE_CURRENT_BINARY_DIR}/include
422 ${CMAKE_CURRENT_SOURCE_DIR}/include
424 # Make <ftconfig.h> available for builds/unix/ftsystem.c.
425 ${CMAKE_CURRENT_BINARY_DIR}/include/freetype/config
430 set_property(SOURCE ${PUBLIC_CONFIG_HEADERS}
431 PROPERTY MACOSX_PACKAGE_LOCATION Headers/config
433 set_target_properties(freetype PROPERTIES
435 MACOSX_FRAMEWORK_INFO_PLIST builds/mac/freetype-Info.plist
436 PUBLIC_HEADER "${PUBLIC_HEADERS}"
437 XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
442 set(PKG_CONFIG_REQUIRED_PRIVATE "")
445 target_link_libraries(freetype PRIVATE ${ZLIB_LIBRARIES})
446 target_include_directories(freetype PRIVATE ${ZLIB_INCLUDE_DIRS})
447 list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "zlib")
450 target_link_libraries(freetype PRIVATE ${BZIP2_LIBRARIES})
451 target_include_directories(freetype PRIVATE ${BZIP2_INCLUDE_DIR}) # not BZIP2_INCLUDE_DIRS
452 list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "bzip2")
455 target_link_libraries(freetype PRIVATE ${PNG_LIBRARIES})
456 target_compile_definitions(freetype PRIVATE ${PNG_DEFINITIONS})
457 target_include_directories(freetype PRIVATE ${PNG_INCLUDE_DIRS})
458 list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libpng")
461 target_link_libraries(freetype PRIVATE ${HARFBUZZ_LIBRARIES})
462 target_include_directories(freetype PRIVATE ${HARFBUZZ_INCLUDE_DIRS})
463 list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "harfbuzz >= ${HARFBUZZ_MIN_VERSION}")
466 target_link_libraries(freetype PRIVATE ${BROTLIDEC_LIBRARIES})
467 target_compile_definitions(freetype PRIVATE ${BROTLIDEC_DEFINITIONS})
468 target_include_directories(freetype PRIVATE ${BROTLIDEC_INCLUDE_DIRS})
469 list(APPEND PKG_CONFIG_REQUIRED_PRIVATE "libbrotlidec")
474 include(GNUInstallDirs)
476 if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
478 # Note the trailing slash in the argument to `DIRECTORY'!
479 DIRECTORY ${PROJECT_SOURCE_DIR}/include/
480 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freetype2
482 PATTERN "internal" EXCLUDE
483 PATTERN "ftconfig.h" EXCLUDE
484 PATTERN "ftoption.h" EXCLUDE)
486 FILES ${PROJECT_BINARY_DIR}/include/freetype/config/ftconfig.h
487 ${PROJECT_BINARY_DIR}/include/freetype/config/ftoption.h
488 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freetype2/freetype/config
492 if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
493 # Generate the pkg-config file
495 file(READ "${PROJECT_SOURCE_DIR}/builds/unix/freetype2.in" FREETYPE2_PC_IN)
497 string(REPLACE ";" ", " PKG_CONFIG_REQUIRED_PRIVATE "${PKG_CONFIG_REQUIRED_PRIVATE}")
499 string(REPLACE "%prefix%" ${CMAKE_INSTALL_PREFIX}
500 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
501 string(REPLACE "%exec_prefix%" "\${prefix}"
502 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
503 string(REPLACE "%libdir%" "\${prefix}/${CMAKE_INSTALL_LIBDIR}"
504 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
505 string(REPLACE "%includedir%" "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}"
506 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
507 string(REPLACE "%ft_version%" "${LIBTOOL_CURRENT}.${LIBTOOL_REVISION}.${LIBTOOL_AGE}"
508 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
509 string(REPLACE "%REQUIRES_PRIVATE%" "${PKG_CONFIG_REQUIRED_PRIVATE}"
510 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
511 string(REPLACE "%LIBS_PRIVATE%" "" # All libs support pkg-config
512 FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
514 set(FREETYPE2_PC_IN_NAME "${PROJECT_BINARY_DIR}/freetype2.pc")
515 if (EXISTS "${FREETYPE2_PC_IN_NAME}")
516 file(READ "${FREETYPE2_PC_IN_NAME}" ORIGINAL_FREETYPE2_PC_IN)
518 set(ORIGINAL_FREETYPE2_PC_IN "")
520 if (NOT (ORIGINAL_FREETYPE2_PC_IN STREQUAL FREETYPE2_PC_IN))
521 file(WRITE "${FREETYPE2_PC_IN_NAME}" ${FREETYPE2_PC_IN})
525 FILES ${PROJECT_BINARY_DIR}/freetype2.pc
526 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
530 include(CMakePackageConfigHelpers)
531 write_basic_package_version_file(
532 ${PROJECT_BINARY_DIR}/freetype-config-version.cmake
533 VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
534 COMPATIBILITY SameMajorVersion)
538 EXPORT freetype-targets
539 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
540 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
541 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
542 FRAMEWORK DESTINATION Library/Frameworks
545 EXPORT freetype-targets
546 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/freetype
547 FILE freetype-config.cmake
550 FILES ${PROJECT_BINARY_DIR}/freetype-config-version.cmake
551 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/freetype
557 set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
558 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The FreeType font rendering library.")
559 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
560 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/docs/LICENSE.TXT")
562 set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
563 set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
564 set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
565 set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
568 set(CPACK_GENERATOR ZIP)
570 set(CPACK_GENERATOR TGZ)
573 set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
574 set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C/C++ Headers")
575 set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION
576 "Library used to build programs which use FreeType")
577 set(CPACK_COMPONENT_HEADERS_DESCRIPTION
578 "C/C++ header files for use with FreeType")
579 set(CPACK_COMPONENT_HEADERS_DEPENDS libraries)
580 set(CPACK_COMPONENT_LIBRARIES_GROUP "Development")
581 set(CPACK_COMPONENT_HEADERS_GROUP "Development")