xref: /aosp_15_r20/external/harfbuzz_ng/CMakeLists.txt (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1cmake_minimum_required(VERSION 3.12)
2project(harfbuzz)
3
4message(WARN "HarfBuzz has a Meson port and tries to migrate all the other build systems to it, please consider using it as we might remove our cmake port soon.")
5
6set(CMAKE_CXX_STANDARD 11)
7set(CMAKE_CXX_STANDARD_REQUIRED ON)
8
9## Limit framework build to Xcode generator
10if (BUILD_FRAMEWORK)
11  # for a framework build on macOS, use:
12  # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build
13  if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
14    message(FATAL_ERROR
15      "You should use Xcode generator with BUILD_FRAMEWORK enabled")
16  endif ()
17  set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)")
18  set (CMAKE_MACOSX_RPATH ON)
19  set (BUILD_SHARED_LIBS ON)
20endif ()
21
22
23## Disallow in-source builds, as CMake generated make files can collide with autotools ones
24if (NOT MSVC AND "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
25  message(FATAL_ERROR
26    "
27In-source builds are not permitted!  Make a separate folder for"
28    " building, e.g.,"
29    "
30  mkdir build; cd build; cmake .."
31    "
32Before that, remove the files created by this failed run with"
33    "
34  rm -rf CMakeCache.txt CMakeFiles")
35endif ()
36
37
38## HarfBuzz build configurations
39option(HB_HAVE_CAIRO "Enable cairo interop helpers" OFF)
40option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF)
41option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF)
42option(HB_HAVE_GLIB "Enable glib unicode functions" OFF)
43option(HB_HAVE_ICU "Enable icu unicode functions" OFF)
44if (TARGET freetype)
45  set (HB_HAVE_FREETYPE ON)
46  add_definitions(-DHAVE_FREETYPE=1)
47endif ()
48if (APPLE)
49  option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON)
50  set (CMAKE_MACOSX_RPATH ON)
51endif ()
52if (WIN32)
53  option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF)
54  option(HB_HAVE_GDI "Enable GDI integration helpers on Windows" OFF)
55  option(HB_HAVE_DIRECTWRITE "Enable DirectWrite shaper backend on Windows" OFF)
56endif ()
57option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF)
58if (HB_BUILD_UTILS)
59  set (HB_HAVE_GLIB ON)
60  set (HB_HAVE_FREETYPE ON)
61endif ()
62
63option(HB_BUILD_SUBSET "Build harfbuzz-subset" ON)
64
65option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
66if (HB_HAVE_GOBJECT)
67  set (HB_HAVE_GLIB ON)
68endif ()
69
70option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF)
71if (HB_HAVE_INTROSPECTION)
72  set (HB_HAVE_GOBJECT ON)
73  set (HB_HAVE_GLIB ON)
74endif ()
75
76include_directories(AFTER
77  ${PROJECT_SOURCE_DIR}/src
78  ${PROJECT_BINARY_DIR}/src
79)
80
81# We need Python3_EXECUTABLE to be set for running the tests...
82find_package(Python3 COMPONENTS Interpreter)
83
84## Functions and headers
85include (CheckFunctionExists)
86include (CheckIncludeFile)
87include (CheckIncludeFiles)
88macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
89  foreach (func_name ${ARGN})
90    string(TOUPPER ${func_name} definition_to_add)
91    check_function_exists(${func_name} HAVE_${definition_to_add})
92    if (${HAVE_${definition_to_add}})
93      add_definitions(-DHAVE_${definition_to_add})
94    endif ()
95  endforeach ()
96endmacro ()
97if (UNIX)
98  list(APPEND CMAKE_REQUIRED_LIBRARIES m)
99endif ()
100check_funcs(atexit mprotect sysconf getpagesize mmap isatty)
101check_include_file(unistd.h HAVE_UNISTD_H)
102if (${HAVE_UNISTD_H})
103  add_definitions(-DHAVE_UNISTD_H)
104endif ()
105check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
106if (${HAVE_SYS_MMAN_H})
107  add_definitions(-DHAVE_SYS_MMAN_H)
108endif ()
109check_include_file(stdbool.h HAVE_STDBOOL_H)
110if (${HAVE_STDBOOL_H})
111  add_definitions(-DHAVE_STDBOOL_H)
112endif ()
113
114# These will be used while making pkg-config .pc files
115set(PC_REQUIRES_PRIV "")
116set(PC_LIBS_PRIV "")
117
118if (NOT MSVC)
119  set(THREADS_PREFER_PTHREAD_FLAG ON)
120  find_package(Threads)
121  if (CMAKE_USE_PTHREADS_INIT)
122    add_definitions("-DHAVE_PTHREAD")
123    list(APPEND THIRD_PARTY_LIBS Threads::Threads)
124    list(APPEND PC_LIBS_PRIV -pthread)
125  endif ()
126endif ()
127
128if (MSVC)
129  add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
130  add_definitions(-bigobj)
131endif ()
132
133
134## Detect if we are running inside a distribution or regular repository folder
135# if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
136#   # perhaps we are on dist directory
137#   set (IN_HB_DIST TRUE)
138#   #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
139# endif ()
140
141file(READ meson.build MESONBUILD)
142string(REGEX MATCH "version: '(([0-9]+)\\.([0-9]+)\\.([0-9]+))'," HB_VERSION_MATCH ${MESONBUILD})
143set (HB_VERSION ${CMAKE_MATCH_1})
144set (HB_VERSION_MAJOR ${CMAKE_MATCH_2})
145set (HB_VERSION_MINOR ${CMAKE_MATCH_3})
146set (HB_VERSION_MICRO ${CMAKE_MATCH_4})
147
148## Define sources and headers of the project
149set (project_sources ${PROJECT_SOURCE_DIR}/src/harfbuzz.cc) # use amalgam source
150set (subset_project_sources
151     ${PROJECT_SOURCE_DIR}/src/hb-number.cc
152     ${PROJECT_SOURCE_DIR}/src/hb-number.hh
153     ${PROJECT_SOURCE_DIR}/src/hb-ot-cff1-table.cc
154     ${PROJECT_SOURCE_DIR}/src/hb-ot-cff2-table.cc
155     ${PROJECT_SOURCE_DIR}/src/hb-ot-post-table-v2subset.hh
156     ${PROJECT_SOURCE_DIR}/src/hb-static.cc
157     ${PROJECT_SOURCE_DIR}/src/hb-subset-cff-common.cc
158     ${PROJECT_SOURCE_DIR}/src/hb-subset-cff-common.hh
159     ${PROJECT_SOURCE_DIR}/src/hb-subset-cff1.cc
160     ${PROJECT_SOURCE_DIR}/src/hb-subset-cff2.cc
161     ${PROJECT_SOURCE_DIR}/src/hb-subset-input.cc
162     ${PROJECT_SOURCE_DIR}/src/hb-subset-input.hh
163     ${PROJECT_SOURCE_DIR}/src/hb-subset-instancer-iup.hh
164     ${PROJECT_SOURCE_DIR}/src/hb-subset-instancer-iup.cc
165     ${PROJECT_SOURCE_DIR}/src/hb-subset-instancer-solver.hh
166     ${PROJECT_SOURCE_DIR}/src/hb-subset-instancer-solver.cc
167     ${PROJECT_SOURCE_DIR}/src/hb-subset-accelerator.hh
168     ${PROJECT_SOURCE_DIR}/src/hb-subset-plan.cc
169     ${PROJECT_SOURCE_DIR}/src/hb-subset-plan.hh
170     ${PROJECT_SOURCE_DIR}/src/hb-subset-plan-member-list.hh
171     ${PROJECT_SOURCE_DIR}/src/hb-subset-repacker.cc
172     ${PROJECT_SOURCE_DIR}/src/hb-subset.cc
173     ${PROJECT_SOURCE_DIR}/src/hb-subset.hh
174     ${PROJECT_SOURCE_DIR}/src/hb-repacker.hh
175     ${PROJECT_SOURCE_DIR}/src/graph/graph.hh
176     ${PROJECT_SOURCE_DIR}/src/graph/gsubgpos-graph.hh
177     ${PROJECT_SOURCE_DIR}/src/graph/gsubgpos-context.hh
178     ${PROJECT_SOURCE_DIR}/src/graph/gsubgpos-context.cc
179     ${PROJECT_SOURCE_DIR}/src/graph/coverage-graph.hh
180     ${PROJECT_SOURCE_DIR}/src/graph/classdef-graph.hh
181     ${PROJECT_SOURCE_DIR}/src/graph/pairpos-graph.hh
182     ${PROJECT_SOURCE_DIR}/src/graph/markbasepos-graph.hh
183     ${PROJECT_SOURCE_DIR}/src/graph/split-helpers.hh
184     ${PROJECT_SOURCE_DIR}/src/graph/serialize.hh
185     ${PROJECT_SOURCE_DIR}/src/OT/Color/COLR/colrv1-closure.hh
186)
187set (project_extra_sources)
188set (project_headers
189     ${PROJECT_SOURCE_DIR}/src/hb-aat-layout.h
190     ${PROJECT_SOURCE_DIR}/src/hb-aat.h
191     ${PROJECT_SOURCE_DIR}/src/hb-blob.h
192     ${PROJECT_SOURCE_DIR}/src/hb-buffer.h
193     ${PROJECT_SOURCE_DIR}/src/hb-common.h
194     ${PROJECT_SOURCE_DIR}/src/hb-cplusplus.hh
195     ${PROJECT_SOURCE_DIR}/src/hb-deprecated.h
196     ${PROJECT_SOURCE_DIR}/src/hb-draw.h
197     ${PROJECT_SOURCE_DIR}/src/hb-face.h
198     ${PROJECT_SOURCE_DIR}/src/hb-font.h
199     ${PROJECT_SOURCE_DIR}/src/hb-map.h
200     ${PROJECT_SOURCE_DIR}/src/hb-ot-color.h
201     ${PROJECT_SOURCE_DIR}/src/hb-ot-deprecated.h
202     ${PROJECT_SOURCE_DIR}/src/hb-ot-font.h
203     ${PROJECT_SOURCE_DIR}/src/hb-ot-layout.h
204     ${PROJECT_SOURCE_DIR}/src/hb-ot-math.h
205     ${PROJECT_SOURCE_DIR}/src/hb-ot-meta.h
206     ${PROJECT_SOURCE_DIR}/src/hb-ot-metrics.h
207     ${PROJECT_SOURCE_DIR}/src/hb-ot-name.h
208     ${PROJECT_SOURCE_DIR}/src/hb-ot-shape.h
209     ${PROJECT_SOURCE_DIR}/src/hb-ot-var.h
210     ${PROJECT_SOURCE_DIR}/src/hb-ot.h
211     ${PROJECT_SOURCE_DIR}/src/hb-paint.h
212     ${PROJECT_SOURCE_DIR}/src/hb-set.h
213     ${PROJECT_SOURCE_DIR}/src/hb-shape-plan.h
214     ${PROJECT_SOURCE_DIR}/src/hb-shape.h
215     ${PROJECT_SOURCE_DIR}/src/hb-style.h
216     ${PROJECT_SOURCE_DIR}/src/hb-unicode.h
217     ${PROJECT_SOURCE_DIR}/src/hb-version.h
218     ${PROJECT_SOURCE_DIR}/src/hb.h
219)
220set (subset_project_headers
221     ${PROJECT_SOURCE_DIR}/src/hb-subset.h
222     ${PROJECT_SOURCE_DIR}/src/hb-subset-repacker.h
223)
224
225## Find and include needed header folders and libraries
226if (HB_HAVE_FREETYPE AND NOT TARGET freetype)
227  include (FindFreetype)
228  if (NOT FREETYPE_FOUND)
229    message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix")
230  endif ()
231
232  list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES})
233  include_directories(AFTER ${FREETYPE_INCLUDE_DIRS})
234  add_definitions(-DHAVE_FREETYPE=1)
235
236  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h)
237
238  # So check_funcs can find its headers
239  set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS})
240  set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES})
241
242  check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
243endif ()
244
245if (HB_HAVE_FREETYPE)
246  list(APPEND PC_REQUIRES_PRIV "freetype2 >= 12.0.6")
247endif ()
248
249if (HB_HAVE_GRAPHITE2)
250  add_definitions(-DHAVE_GRAPHITE2)
251
252  find_path(GRAPHITE2_INCLUDE_DIR graphite2/Font.h)
253  find_library(GRAPHITE2_LIBRARY graphite2)
254
255  include_directories(${GRAPHITE2_INCLUDE_DIR})
256
257  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-graphite2.h)
258
259  list(APPEND THIRD_PARTY_LIBS ${GRAPHITE2_LIBRARY})
260
261  list(APPEND PC_REQUIRES_PRIV "graphite2 >= 1.2.0")
262
263  mark_as_advanced(GRAPHITE2_INCLUDE_DIR GRAPHITE2_LIBRARY)
264endif ()
265
266if (HB_HAVE_GLIB)
267  add_definitions(-DHAVE_GLIB)
268
269  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindGLIB.cmake
270  find_package(PkgConfig)
271  pkg_check_modules(PC_GLIB QUIET glib-2.0)
272
273  find_library(GLIB_LIBRARIES NAMES glib-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
274  find_path(GLIBCONFIG_INCLUDE_DIR NAMES glibconfig.h HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/include)
275  find_path(GLIB_INCLUDE_DIR NAMES glib.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)
276
277  include_directories(${GLIBCONFIG_INCLUDE_DIR} ${GLIB_INCLUDE_DIR})
278
279  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-glib.h)
280
281  list(APPEND THIRD_PARTY_LIBS ${GLIB_LIBRARIES})
282
283  list(APPEND PC_REQUIRES_PRIV "glib-2.0 >= 2.19.1")
284
285  mark_as_advanced(GLIB_LIBRARIES GLIBCONFIG_INCLUDE_DIR GLIB_INCLUDE_DIR)
286endif ()
287
288if (HB_HAVE_ICU)
289  add_definitions(-DHAVE_ICU)
290
291  find_package(ICU REQUIRED COMPONENTS uc)
292
293  if (ICU_VERSION VERSION_GREATER_EQUAL 75.1)
294    set(CMAKE_CXX_STANDARD 17)
295  endif ()
296
297  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-icu.h)
298
299  list(APPEND THIRD_PARTY_LIBS ICU::uc)
300endif ()
301
302if (APPLE AND HB_HAVE_CORETEXT)
303  # Apple Advanced Typography
304  add_definitions(-DHAVE_CORETEXT)
305
306  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-coretext.h)
307
308  if (HB_IOS)
309    find_library(COREFOUNDATION CoreFoundation)
310    if (COREFOUNDATION)
311      list(APPEND THIRD_PARTY_LIBS ${COREFOUNDATION})
312      list(APPEND PC_LIBS_PRIV "-framework CoreFoundation")
313    endif ()
314    mark_as_advanced(COREFOUNDATION)
315
316    find_library(CORETEXT CoreText)
317    if (CORETEXT)
318      list(APPEND THIRD_PARTY_LIBS ${CORETEXT})
319      list(APPEND PC_LIBS_PRIV "-framework CoreText")
320    endif ()
321    mark_as_advanced(CORETEXT)
322
323    find_library(COREGRAPHICS CoreGraphics)
324    if (COREGRAPHICS)
325      list(APPEND THIRD_PARTY_LIBS ${COREGRAPHICS})
326      list(APPEND PC_LIBS_PRIV "-framework CoreGraphics")
327    endif ()
328    mark_as_advanced(COREGRAPHICS)
329  else ()
330    find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices)
331    if (APPLICATION_SERVICES_FRAMEWORK)
332      list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK})
333      list(APPEND PC_LIBS_PRIV "-framework ApplicationServices")
334    endif ()
335
336    mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK)
337  endif ()
338endif ()
339
340if (WIN32 AND HB_HAVE_GDI)
341  add_definitions(-DHAVE_GDI)
342  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-gdi.h)
343  list(APPEND THIRD_PARTY_LIBS gdi32)
344  list(APPEND PC_LIBS_PRIV -lgdi32)
345endif ()
346
347if (WIN32 AND HB_HAVE_UNISCRIBE)
348  add_definitions(-DHAVE_UNISCRIBE)
349  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-uniscribe.h)
350  list(APPEND THIRD_PARTY_LIBS usp10 gdi32 rpcrt4)
351  list(APPEND PC_LIBS_PRIV -lusp10 -lgdi32 -lrpcrt4)
352endif ()
353
354if (WIN32 AND HB_HAVE_DIRECTWRITE)
355  if (CMAKE_VERSION VERSION_GREATER 3.12)
356    check_include_files("windows.h;dwrite_1.h" HAVE_DWRITE_1_H LANGUAGE CXX)
357  else ()
358    check_include_files("windows.h;dwrite_1.h" HAVE_DWRITE_1_H)
359  endif ()
360  if (NOT HAVE_DWRITE_1_H)
361    message(FATAL_ERROR "DirectWrite was enabled explicitly, but required header is missing")
362  endif ()
363  add_definitions(-DHAVE_DIRECTWRITE)
364  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h)
365endif ()
366
367if (HB_HAVE_CAIRO)
368  # https://github.com/WebKit/webkit/blob/master/Source/cmake/FindCairo.cmake
369  find_package(PkgConfig)
370  pkg_check_modules(PC_CAIRO QUIET cairo)
371
372  find_path(CAIRO_INCLUDE_DIRS NAMES cairo.h HINTS ${PC_CAIRO_INCLUDEDIR} ${PC_CAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo)
373  find_library(CAIRO_LIBRARIESNAMES cairo HINTS ${PC_CAIRO_LIBDIR} ${PC_CAIRO_LIBRARY_DIRS})
374  if (NOT CAIRO_LIBRARIESNAMES)
375    message(FATAL_ERROR "HB_HAVE_CAIRO is ON but Cairo libraries are not found")
376  endif()
377  include_directories(${CAIRO_INCLUDE_DIRS})
378  mark_as_advanced(CAIRO_INCLUDE_DIRS CAIRO_LIBRARIESNAMES)
379  add_definitions(-DHAVE_CAIRO=1)
380  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-cairo.h)
381  list(APPEND THIRD_PARTY_LIBS ${CAIRO_LIBRARIESNAMES})
382endif()
383
384if (HB_HAVE_GOBJECT)
385  add_definitions(-DHAVE_GOBJECT)
386  include (FindPerl)
387
388  # Use the hints from glib-2.0.pc to find glib-mkenums
389  find_package(PkgConfig)
390  pkg_check_modules(PC_GLIB QUIET glib-2.0)
391  find_program(GLIB_MKENUMS glib-mkenums
392    HINTS ${PC_glib_mkenums}
393  )
394  set (GLIB_MKENUMS_CMD)
395
396  if (WIN32 AND NOT MINGW)
397    # In Visual Studio builds, shebang lines are not supported
398    # in the standard cmd.exe shell that we use, so we need to
399    # first determine whether glib-mkenums is a Python or PERL
400    # script
401    execute_process(COMMAND "${Python3_EXECUTABLE}" "${GLIB_MKENUMS}" --version
402      RESULT_VARIABLE GLIB_MKENUMS_PYTHON
403      OUTPUT_QUIET ERROR_QUIET
404    )
405    if (GLIB_MKENUMS_PYTHON EQUAL 0)
406      message("${GLIB_MKENUMS} is a Python script.")
407      set (GLIB_MKENUMS_CMD "${Python3_EXECUTABLE}" "${GLIB_MKENUMS}")
408    else ()
409      execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version
410        RESULT_VARIABLE GLIB_MKENUMS_PERL
411        OUTPUT_QUIET ERROR_QUIET
412      )
413      if (GLIB_MKENUMS_PERL EQUAL 0)
414        message("${GLIB_MKENUMS} is a PERL script.")
415        set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}")
416      endif ()
417      if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0)
418        message(FATAL_ERROR "Unable to determine type of glib-mkenums script")
419      endif ()
420    endif ()
421  else ()
422    set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}")
423  endif ()
424  if (NOT GLIB_MKENUMS_CMD)
425    message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required")
426  endif ()
427
428  pkg_check_modules(PC_GOBJECT QUIET gobject-2.0)
429
430  find_library(GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${PC_GLIB_LIBDIR} ${PC_GLIB_LIBRARY_DIRS})
431  find_path(GOBJECT_INCLUDE_DIR NAMES glib-object.h HINTS ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0)
432
433  include_directories(${GOBJECTCONFIG_INCLUDE_DIR} ${GOBJECT_INCLUDE_DIR})
434  mark_as_advanced(GOBJECT_LIBRARIES GOBJECT_INCLUDE_DIR)
435
436  list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc)
437  list(APPEND hb_gobject_gen_sources
438    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
439  )
440  list(APPEND hb_gobject_structs_headers
441    ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h
442  )
443  list(APPEND hb_gobject_headers
444    ${PROJECT_SOURCE_DIR}/src/hb-gobject.h
445    ${hb_gobject_structs_headers}
446  )
447  list(APPEND hb_gobject_gen_headers
448    ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
449  )
450
451  add_custom_command(
452    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
453    COMMAND ${GLIB_MKENUMS_CMD}
454      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
455      --identifier-prefix hb_
456      --symbol-prefix hb_gobject
457      ${hb_gobject_structs_headers}
458      ${project_headers}
459      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp
460    COMMAND "${CMAKE_COMMAND}"
461      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h.tmp"
462      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h"
463      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
464    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl
465      ${hb_gobject_header}
466      ${project_headers}
467  )
468
469  add_custom_command(
470    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc
471    COMMAND ${GLIB_MKENUMS_CMD}
472      --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
473      --identifier-prefix hb_
474      --symbol-prefix hb_gobject
475      ${hb_gobject_header}
476      ${project_headers}
477      > ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp
478    COMMAND "${CMAKE_COMMAND}"
479      "-DENUM_INPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc.tmp"
480      "-DENUM_OUTPUT_SRC=${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc"
481      -P ${PROJECT_SOURCE_DIR}/replace-enum-strings.cmake
482    DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl
483      ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h
484      ${hb_gobject_header}
485      ${project_headers}
486  )
487endif ()
488
489
490## Define harfbuzz library
491add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
492target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
493target_include_directories(harfbuzz PUBLIC
494                           "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
495                           "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz>")
496if (HB_HAVE_FREETYPE AND TARGET freetype)
497  target_link_libraries(harfbuzz freetype)
498endif ()
499
500
501## Define harfbuzz-icu library
502if (HB_HAVE_ICU)
503  add_library(harfbuzz-icu ${PROJECT_SOURCE_DIR}/src/hb-icu.cc ${PROJECT_SOURCE_DIR}/src/hb-icu.h)
504  add_dependencies(harfbuzz-icu harfbuzz)
505  target_link_libraries(harfbuzz-icu harfbuzz ${THIRD_PARTY_LIBS})
506
507  if (BUILD_SHARED_LIBS)
508    set_target_properties(harfbuzz harfbuzz-icu PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
509  endif ()
510endif ()
511
512
513## Define harfbuzz-subset library
514if (HB_BUILD_SUBSET)
515  add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
516  list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-subset.h ${PROJECT_SOURCE_DIR}/src/hb-subset-repacker.h)
517  add_dependencies(harfbuzz-subset harfbuzz)
518  target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
519
520  if (BUILD_SHARED_LIBS)
521    set_target_properties(harfbuzz harfbuzz-subset PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
522  endif ()
523endif ()
524
525if (UNIX OR MINGW OR VITA)
526  # Make symbols link locally
527  include (CheckCXXCompilerFlag)
528  CHECK_CXX_COMPILER_FLAG(-Bsymbolic-functions CXX_SUPPORTS_FLAG_BSYMB_FUNCS)
529  if (CXX_SUPPORTS_FLAG_BSYMB_FUNCS)
530    link_libraries(-Bsymbolic-functions)
531  endif ()
532
533  # As of CMake 3.0.0, the compiler id for Apple-provided Clang is now "AppleClang";
534  # thus we use MATCHES instead of STREQUAL to include either regular Clang or AppleClang
535  if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
536    # Make sure we don't link to libstdc++
537    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
538    set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
539    set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
540    set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
541    if (HB_BUILD_SUBSET)
542      set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
543    endif ()
544
545    # No threadsafe statics as we do it ourselves
546    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
547  endif ()
548
549  CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
550  if (COMPILER_SUPPORTS_CXX11)
551    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
552  else()
553    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
554  endif()
555endif ()
556
557
558## Define harfbuzz-gobject library
559if (HB_HAVE_GOBJECT)
560  add_library(harfbuzz-gobject
561    ${hb_gobject_sources}
562    ${hb_gobject_gen_sources}
563    ${hb_gobject_headers}
564    ${hb_gobject_gen_headers}
565  )
566  include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src)
567  add_dependencies(harfbuzz-gobject harfbuzz)
568  target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS})
569
570  if (BUILD_SHARED_LIBS)
571    set_target_properties(harfbuzz-gobject PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
572  endif ()
573endif ()
574
575## Define harfbuzz-cairo library
576if (HB_HAVE_CAIRO)
577  include_directories(${CAIRO_INCLUDE_DIRS})
578  add_library(harfbuzz-cairo ${PROJECT_SOURCE_DIR}/src/hb-cairo.cc ${PROJECT_SOURCE_DIR}/src/hb-static.cc ${PROJECT_SOURCE_DIR}/src/hb-cairo.h)
579  add_dependencies(harfbuzz-cairo harfbuzz)
580  target_link_libraries(harfbuzz-cairo harfbuzz ${THIRD_PARTY_LIBS})
581
582  if (BUILD_SHARED_LIBS)
583    set_target_properties(harfbuzz-cairo PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
584  endif ()
585endif()
586
587if (BUILD_SHARED_LIBS AND WIN32 AND NOT MINGW)
588  add_definitions("-DHB_DLL_EXPORT")
589endif ()
590
591# On Windows, g-ir-scanner requires a DLL build in order for it to work
592if (WIN32)
593  if (NOT BUILD_SHARED_LIBS)
594    message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.")
595    set (HB_HAVE_INTROSPECTION OFF)
596  endif ()
597endif ()
598
599if (HB_HAVE_INTROSPECTION)
600  find_package(PkgConfig)
601  pkg_check_modules(PC_GI QUIET gobject-introspection-1.0)
602
603  find_program(G_IR_SCANNER g-ir-scanner
604    HINTS ${PC_g_ir_scanner}
605  )
606
607  find_program(G_IR_COMPILER g-ir-compiler
608    HINTS ${PC_g_ir_compiler}
609  )
610
611  if (WIN32 AND NOT MINGW)
612    # Note that since we already enable HB_HAVE_GOBJECT
613    # we would already have Python3_EXECUTABLE handy
614    set (G_IR_SCANNER_CMD "${Python3_EXECUTABLE}" "${G_IR_SCANNER}")
615  else ()
616    set (G_IR_SCANNER_CMD "${G_IR_SCANNER}")
617  endif ()
618
619  # We need to account for the varying output directories
620  # when we build using Visual Studio projects
621  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
622    set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
623  else ()
624    set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
625  endif ()
626
627  # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject
628  set (hb_defines_cflags "")
629  foreach (hb_cflag ${hb_cflags})
630    list(APPEND hb_defines_cflags "-D${hb_cflag}")
631  endforeach (hb_cflag)
632
633  # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject
634  set (extra_libs "")
635  foreach (extra_lib ${THIRD_PARTY_LIBS})
636    # We don't want the .lib extension here...
637    string(REPLACE ".lib" "" extra_lib_stripped "${extra_lib}")
638    list(APPEND extra_libs "--extra-library=${extra_lib_stripped}")
639  endforeach ()
640
641  set (introspected_sources)
642  foreach (f
643    ${project_headers}
644    ${project_sources}
645    ${hb_gobject_gen_sources}
646    ${hb_gobject_gen_headers}
647    ${hb_gobject_sources}
648    ${hb_gobject_headers}
649  )
650    if (WIN32)
651      # Nasty issue: We need to make drive letters lower case,
652      # otherwise g-ir-scanner won't like it and give us a bunch
653      # of invalid items and unresolved types...
654      STRING(SUBSTRING "${f}" 0 1 drive)
655      STRING(SUBSTRING "${f}" 1 -1 path)
656      if (drive MATCHES "[A-Z]")
657        STRING(TOLOWER ${drive} drive_lower)
658        list(APPEND introspected_sources "${drive_lower}${path}")
659      else ()
660        list(APPEND introspected_sources "${f}")
661      endif ()
662    else ()
663      list(APPEND introspected_sources "${f}")
664    endif ()
665  endforeach ()
666
667  file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list)
668  foreach (s ${introspected_sources})
669    file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list "${s}\n")
670  endforeach ()
671
672  # Finally, build the introspection files...
673  add_custom_command(
674    TARGET harfbuzz-gobject
675    POST_BUILD
676    COMMAND ${G_IR_SCANNER_CMD}
677      --warn-all --no-libtool --verbose
678      --namespace=HarfBuzz
679      --nsversion=0.0
680      --symbol-prefix=hb
681      --symbol-prefix=hb_gobject
682      --identifier-prefix=hb_
683      --include GObject-2.0
684      --pkg-export=harfbuzz-gobject
685      --c-include=hb-gobject.h
686      --cflags-begin
687      -I${PROJECT_SOURCE_DIR}/src
688      -I${PROJECT_BINARY_DIR}/src
689      ${hb_includedir_cflags}
690      ${hb_defines_cflags}
691      -DHB_NO_SINGLE_HEADER_ERROR
692      -DHB_HAVE_GOBJECT
693      -DHB_EXTERN=
694      --cflags-end
695      --library=harfbuzz-gobject
696      --library=harfbuzz
697      -L${hb_libpath}
698      ${extra_libs}
699      --filelist ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list
700      -o ${hb_libpath}/HarfBuzz-0.0.gir
701    DEPENDS harfbuzz-gobject harfbuzz ${CMAKE_CURRENT_BINARY_DIR}/src/hb_gir_list
702  )
703
704  add_custom_command(
705    TARGET harfbuzz-gobject
706    POST_BUILD
707    COMMAND "${G_IR_COMPILER}"
708      --verbose --debug
709      --includedir ${CMAKE_CURRENT_BINARY_DIR}
710      ${hb_libpath}/HarfBuzz-0.0.gir
711      -o ${hb_libpath}/HarfBuzz-0.0.typelib
712    DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject
713  )
714endif ()
715
716
717## Additional framework build configs
718if (BUILD_FRAMEWORK)
719  set (CMAKE_MACOSX_RPATH ON)
720  set_target_properties(harfbuzz PROPERTIES
721    FRAMEWORK TRUE
722    PUBLIC_HEADER "${project_headers}"
723    XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
724  )
725  set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz")
726  set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}")
727  set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}")
728endif ()
729
730
731## Additional harfbuzz build artifacts
732if (HB_BUILD_UTILS)
733  add_definitions("-DPACKAGE_NAME=\"HarfBuzz\"")
734  add_definitions("-DPACKAGE_VERSION=\"${HB_VERSION}\"")
735
736  if (HB_HAVE_CAIRO)
737    add_executable(hb-view
738        ${PROJECT_SOURCE_DIR}/util/ansi-print.hh
739        ${PROJECT_SOURCE_DIR}/util/face-options.hh
740        ${PROJECT_SOURCE_DIR}/util/font-options.hh
741        ${PROJECT_SOURCE_DIR}/util/hb-view.cc
742        ${PROJECT_SOURCE_DIR}/util/helper-cairo-ansi.hh
743        ${PROJECT_SOURCE_DIR}/util/helper-cairo-ft.hh
744        ${PROJECT_SOURCE_DIR}/util/helper-cairo.hh
745        ${PROJECT_SOURCE_DIR}/util/main-font-text.hh
746        ${PROJECT_SOURCE_DIR}/util/options.hh
747        ${PROJECT_SOURCE_DIR}/util/output-options.hh
748        ${PROJECT_SOURCE_DIR}/util/shape-consumer.hh
749        ${PROJECT_SOURCE_DIR}/util/shape-options.hh
750        ${PROJECT_SOURCE_DIR}/util/text-options.hh
751        ${PROJECT_SOURCE_DIR}/util/view-cairo.hh
752        ${PROJECT_SOURCE_DIR}/util/view-options.hh
753    )
754    target_link_libraries(hb-view harfbuzz-cairo harfbuzz ${CAIRO_LIBRARIESNAMES})
755  endif()
756
757  add_executable(hb-shape
758        ${PROJECT_SOURCE_DIR}/util/batch.hh
759        ${PROJECT_SOURCE_DIR}/util/face-options.hh
760        ${PROJECT_SOURCE_DIR}/util/font-options.hh
761        ${PROJECT_SOURCE_DIR}/util/hb-shape.cc
762        ${PROJECT_SOURCE_DIR}/util/main-font-text.hh
763        ${PROJECT_SOURCE_DIR}/util/options.hh
764        ${PROJECT_SOURCE_DIR}/util/output-options.hh
765        ${PROJECT_SOURCE_DIR}/util/shape-consumer.hh
766        ${PROJECT_SOURCE_DIR}/util/shape-format.hh
767        ${PROJECT_SOURCE_DIR}/util/shape-options.hh
768        ${PROJECT_SOURCE_DIR}/util/shape-output.hh
769        ${PROJECT_SOURCE_DIR}/util/text-options.hh
770  )
771  target_link_libraries(hb-shape harfbuzz)
772
773  add_executable(hb-subset
774        ${PROJECT_SOURCE_DIR}/util/batch.hh
775        ${PROJECT_SOURCE_DIR}/util/face-options.hh
776        ${PROJECT_SOURCE_DIR}/util/hb-subset.cc
777        ${PROJECT_SOURCE_DIR}/util/main-font-text.hh
778        ${PROJECT_SOURCE_DIR}/util/options.hh
779        ${PROJECT_SOURCE_DIR}/util/output-options.hh
780        ${PROJECT_SOURCE_DIR}/util/text-options.hh
781        ${PROJECT_SOURCE_DIR}/util/helper-subset.hh
782  )
783  target_link_libraries(hb-subset harfbuzz harfbuzz-subset)
784
785  add_executable(hb-ot-shape-closure
786        ${PROJECT_SOURCE_DIR}/util/face-options.hh
787        ${PROJECT_SOURCE_DIR}/util/font-options.hh
788        ${PROJECT_SOURCE_DIR}/util/hb-ot-shape-closure.cc
789        ${PROJECT_SOURCE_DIR}/util/main-font-text.hh
790        ${PROJECT_SOURCE_DIR}/util/options.hh
791        ${PROJECT_SOURCE_DIR}/util/text-options.hh
792  )
793  target_link_libraries(hb-ot-shape-closure harfbuzz)
794
795  if (HB_HAVE_GOBJECT)
796    add_executable(hb-info
797        ${PROJECT_SOURCE_DIR}/util/batch.hh
798        ${PROJECT_SOURCE_DIR}/util/face-options.hh
799        ${PROJECT_SOURCE_DIR}/util/font-options.hh
800        ${PROJECT_SOURCE_DIR}/util/hb-info.cc
801        ${PROJECT_SOURCE_DIR}/util/options.hh
802    )
803    target_link_libraries(hb-info harfbuzz-gobject harfbuzz)
804  endif()
805endif ()
806
807
808## Install
809include (GNUInstallDirs)
810
811if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
812  install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
813  if (HB_HAVE_GOBJECT)
814    install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz)
815  endif ()
816endif ()
817
818# get these variables in the required format
819list(REMOVE_DUPLICATES PC_REQUIRES_PRIV)
820string(REPLACE ";" ", " PC_REQUIRES_PRIV "${PC_REQUIRES_PRIV}")
821list(REMOVE_DUPLICATES PC_LIBS_PRIV)
822string(REPLACE ";" " " PC_LIBS_PRIV "${PC_LIBS_PRIV}")
823
824# Macro to write pkg-config .pc configuration files
825macro ( make_pkgconfig_pc_file name )
826  file(READ "${PROJECT_SOURCE_DIR}/src/${name}.pc.in" FSTR)
827
828  string(REPLACE "%prefix%" "${CMAKE_INSTALL_PREFIX}" FSTR ${FSTR})
829  string(REPLACE "%exec_prefix%" "\${prefix}" FSTR ${FSTR})
830
831  if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
832    string(REPLACE "%includedir%" "${CMAKE_INSTALL_INCLUDEDIR}" FSTR ${FSTR})
833  else ()
834    string(REPLACE "%includedir%" "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}" FSTR ${FSTR})
835  endif ()
836
837  if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
838    string(REPLACE "%libdir%" "${CMAKE_INSTALL_LIBDIR}" FSTR ${FSTR})
839  else ()
840    string(REPLACE "%libdir%" "\${prefix}/${CMAKE_INSTALL_LIBDIR}" FSTR ${FSTR})
841  endif ()
842
843  string(REPLACE "%VERSION%" "${HB_VERSION}" FSTR ${FSTR})
844  string(REPLACE "%requires_private%" "${PC_REQUIRES_PRIV}" FSTR ${FSTR})
845  string(REPLACE "%libs_private%" "${PC_LIBS_PRIV}" FSTR ${FSTR})
846
847  file(WRITE "${PROJECT_BINARY_DIR}/${name}.pc" ${FSTR})
848
849  install(
850    FILES "${PROJECT_BINARY_DIR}/${name}.pc"
851    DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
852    COMPONENT pkgconfig
853  )
854endmacro ( make_pkgconfig_pc_file )
855
856# Generate hb-features.h with the features we enabled
857macro (make_hb_features_h)
858  file(READ "${PROJECT_SOURCE_DIR}/src/hb-features.h.in" feature_h_in)
859  foreach(arg cairo coretext directwrite freetype gdi glib gobject graphite icu uniscribe wasm)
860    string(TOUPPER ${arg} feature_caps)
861    set(feature_instring "#mesondefine HB_HAS_${feature_caps}")
862    if (HB_HAVE_${feature_caps})
863      set(feature_outstring "#define HB_HAS_${feature_caps} 1")
864    else ()
865      set(feature_outstring "/* #undef HB_HAS_${feature_caps} */")
866    endif()
867    string(REPLACE ${feature_instring} ${feature_outstring} feature_h_in ${feature_h_in})
868  endforeach()
869  file(WRITE "${PROJECT_BINARY_DIR}/src/hb-features.h" ${feature_h_in})
870  if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
871    install(
872      FILES "${PROJECT_BINARY_DIR}/src/hb-features.h"
873      DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz"
874    )
875  endif()
876endmacro (make_hb_features_h)
877
878if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
879  install(TARGETS harfbuzz
880    EXPORT harfbuzzConfig
881    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
882    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
883    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
884    FRAMEWORK DESTINATION Library/Frameworks
885  )
886  make_pkgconfig_pc_file("harfbuzz")
887  install(EXPORT harfbuzzConfig
888      NAMESPACE harfbuzz::
889      DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/harfbuzz
890  )
891  if (HB_HAVE_ICU)
892    install(TARGETS harfbuzz-icu
893      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
894      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
895      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
896      FRAMEWORK DESTINATION Library/Frameworks
897    )
898    make_pkgconfig_pc_file("harfbuzz-icu")
899  endif ()
900  if (HB_HAVE_CAIRO)
901    install(TARGETS harfbuzz-cairo
902      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
903      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
904      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
905      FRAMEWORK DESTINATION Library/Frameworks
906    )
907    make_pkgconfig_pc_file("harfbuzz-cairo")
908  endif ()
909  if (HB_BUILD_SUBSET)
910    install(TARGETS harfbuzz-subset
911      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
912    )
913    make_pkgconfig_pc_file("harfbuzz-subset")
914  endif ()
915  if (HB_BUILD_UTILS)
916    if (WIN32 AND BUILD_SHARED_LIBS)
917      install(TARGETS harfbuzz-subset
918        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
919      )
920    endif ()
921    if (HB_HAVE_CAIRO)
922      install(TARGETS hb-view
923        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
924      )
925    endif()
926    install(TARGETS hb-subset
927      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
928    )
929
930    install(TARGETS hb-shape
931      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
932    )
933
934    if (HB_HAVE_GOBJECT)
935      install(TARGETS hb-info
936        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
937      )
938    endif()
939
940    install(TARGETS hb-ot-shape-closure
941      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
942    )
943  endif ()
944  if (HB_HAVE_GOBJECT)
945    install(TARGETS harfbuzz-gobject
946      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
947      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
948      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
949    )
950    make_pkgconfig_pc_file("harfbuzz-gobject")
951    if (HB_HAVE_INTROSPECTION)
952      if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*")
953        set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
954      else ()
955        set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>")
956      endif ()
957
958      install(FILES "${hb_libpath}/HarfBuzz-0.0.gir"
959        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0
960      )
961
962      install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib"
963        DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0
964      )
965    endif ()
966  endif ()
967  make_hb_features_h()
968endif ()
969