xref: /aosp_15_r20/external/harfbuzz_ng/meson.build (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Workerproject('harfbuzz', 'c', 'cpp',
2*2d1272b8SAndroid Build Coastguard Worker  meson_version: '>= 0.55.0',
3*2d1272b8SAndroid Build Coastguard Worker  version: '10.1.0',
4*2d1272b8SAndroid Build Coastguard Worker  default_options: [
5*2d1272b8SAndroid Build Coastguard Worker    'cpp_eh=none',          # Just to support msvc, we are passing -fno-exceptions also anyway
6*2d1272b8SAndroid Build Coastguard Worker    # 'cpp_rtti=false',     # Do NOT enable, wraps inherit it and ICU needs RTTI
7*2d1272b8SAndroid Build Coastguard Worker    'cpp_std=c++11',
8*2d1272b8SAndroid Build Coastguard Worker    'wrap_mode=nofallback', # Use --wrap-mode=default to revert, https://github.com/harfbuzz/harfbuzz/pull/2548
9*2d1272b8SAndroid Build Coastguard Worker  ],
10*2d1272b8SAndroid Build Coastguard Worker)
11*2d1272b8SAndroid Build Coastguard Worker
12*2d1272b8SAndroid Build Coastguard Workerglib_min_version = '>= 2.30.0'
13*2d1272b8SAndroid Build Coastguard Workercairo_min_version = '>= 1.10.0'
14*2d1272b8SAndroid Build Coastguard Workerchafa_min_version = '>= 1.6.0'
15*2d1272b8SAndroid Build Coastguard Workericu_min_version = '>= 49.0'
16*2d1272b8SAndroid Build Coastguard Workergraphite2_min_version = '>= 1.2.0'
17*2d1272b8SAndroid Build Coastguard Worker
18*2d1272b8SAndroid Build Coastguard Workerfreetype_min_version_actual = '>= 2.4.2'
19*2d1272b8SAndroid Build Coastguard Workerfreetype_min_version = '>= 12.0.6'    # Corresponds to `freetype_min_version_actual`
20*2d1272b8SAndroid Build Coastguard Worker
21*2d1272b8SAndroid Build Coastguard Workerhb_version_arr = meson.project_version().split('.')
22*2d1272b8SAndroid Build Coastguard Workerhb_version_major = hb_version_arr[0].to_int()
23*2d1272b8SAndroid Build Coastguard Workerhb_version_minor = hb_version_arr[1].to_int()
24*2d1272b8SAndroid Build Coastguard Workerhb_version_micro = hb_version_arr[2].to_int()
25*2d1272b8SAndroid Build Coastguard Worker
26*2d1272b8SAndroid Build Coastguard Worker# libtool versioning
27*2d1272b8SAndroid Build Coastguard Workerhb_version_int = 60000 + hb_version_major*100 + hb_version_minor*10 + hb_version_micro
28*2d1272b8SAndroid Build Coastguard Workerhb_libtool_version_info = '@0@:0:@0@'.format(hb_version_int)
29*2d1272b8SAndroid Build Coastguard Worker
30*2d1272b8SAndroid Build Coastguard Workerpkgmod = import('pkgconfig')
31*2d1272b8SAndroid Build Coastguard Workercpp = meson.get_compiler('cpp')
32*2d1272b8SAndroid Build Coastguard Workernull_dep = dependency('', required: false)
33*2d1272b8SAndroid Build Coastguard Worker
34*2d1272b8SAndroid Build Coastguard Worker# Only perform these checks if cpp_std is c++11 as setting -std directly
35*2d1272b8SAndroid Build Coastguard Worker# produces a warning from meson.
36*2d1272b8SAndroid Build Coastguard Workerif get_option('cpp_std') == 'c++11'
37*2d1272b8SAndroid Build Coastguard Worker  # Enforce C++14 requirement for MSVC STL
38*2d1272b8SAndroid Build Coastguard Worker  if cpp.get_id() == 'clang' and cpp.get_define('_MSC_FULL_VER') != ''
39*2d1272b8SAndroid Build Coastguard Worker    add_project_arguments('-std=c++14', language: 'cpp')
40*2d1272b8SAndroid Build Coastguard Worker  elif cpp.get_id() == 'clang-cl'
41*2d1272b8SAndroid Build Coastguard Worker    # Clang-cl produces a warning when using -std=c++14, but not when using /std:c++14
42*2d1272b8SAndroid Build Coastguard Worker    add_project_arguments('/std:c++14', language : 'cpp')
43*2d1272b8SAndroid Build Coastguard Worker  endif
44*2d1272b8SAndroid Build Coastguard Workerendif
45*2d1272b8SAndroid Build Coastguard Worker
46*2d1272b8SAndroid Build Coastguard Workerif cpp.get_argument_syntax() == 'msvc'
47*2d1272b8SAndroid Build Coastguard Worker  # Ignore several spurious warnings for things HarfBuzz does very commonly.
48*2d1272b8SAndroid Build Coastguard Worker  # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
49*2d1272b8SAndroid Build Coastguard Worker  # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
50*2d1272b8SAndroid Build Coastguard Worker  # NOTE: Only add warnings here if you are sure they're spurious
51*2d1272b8SAndroid Build Coastguard Worker  msvc_args = [
52*2d1272b8SAndroid Build Coastguard Worker    '/wd4244', # lossy type conversion (e.g. double -> int)
53*2d1272b8SAndroid Build Coastguard Worker    '/bigobj', # hb-subset.cc -- compile error C1128: number of sections exceeded object file format limit
54*2d1272b8SAndroid Build Coastguard Worker    cpp.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
55*2d1272b8SAndroid Build Coastguard Worker  ]
56*2d1272b8SAndroid Build Coastguard Worker  add_project_arguments(msvc_args, language: ['c', 'cpp'])
57*2d1272b8SAndroid Build Coastguard Worker  # Disable SAFESEH with MSVC for libs that use external deps that are built with MinGW
58*2d1272b8SAndroid Build Coastguard Worker  # noseh_link_args = ['/SAFESEH:NO']
59*2d1272b8SAndroid Build Coastguard Workerendif
60*2d1272b8SAndroid Build Coastguard Worker
61*2d1272b8SAndroid Build Coastguard Workeradd_project_link_arguments(cpp.get_supported_link_arguments([
62*2d1272b8SAndroid Build Coastguard Worker  '-Bsymbolic-functions'
63*2d1272b8SAndroid Build Coastguard Worker]), language: 'c')
64*2d1272b8SAndroid Build Coastguard Worker
65*2d1272b8SAndroid Build Coastguard Workeradd_project_arguments(cpp.get_supported_arguments([
66*2d1272b8SAndroid Build Coastguard Worker  '-fno-exceptions',
67*2d1272b8SAndroid Build Coastguard Worker  '-fno-rtti',
68*2d1272b8SAndroid Build Coastguard Worker  '-fno-threadsafe-statics',
69*2d1272b8SAndroid Build Coastguard Worker  '-fvisibility-inlines-hidden',
70*2d1272b8SAndroid Build Coastguard Worker]), language: 'cpp')
71*2d1272b8SAndroid Build Coastguard Worker
72*2d1272b8SAndroid Build Coastguard Workerif host_machine.cpu_family() == 'arm' and cpp.alignment('struct { char c; }') != 1
73*2d1272b8SAndroid Build Coastguard Worker  if cpp.has_argument('-mstructure-size-boundary=8')
74*2d1272b8SAndroid Build Coastguard Worker    add_project_arguments('-mstructure-size-boundary=8', language: 'cpp')
75*2d1272b8SAndroid Build Coastguard Worker  endif
76*2d1272b8SAndroid Build Coastguard Workerendif
77*2d1272b8SAndroid Build Coastguard Worker
78*2d1272b8SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
79*2d1272b8SAndroid Build Coastguard Worker  add_project_arguments(cpp.get_supported_arguments([
80*2d1272b8SAndroid Build Coastguard Worker    '-Wa,-mbig-obj'
81*2d1272b8SAndroid Build Coastguard Worker  ]), language : 'cpp')
82*2d1272b8SAndroid Build Coastguard Workerendif
83*2d1272b8SAndroid Build Coastguard Worker
84*2d1272b8SAndroid Build Coastguard Workercheck_headers = [
85*2d1272b8SAndroid Build Coastguard Worker  ['unistd.h'],
86*2d1272b8SAndroid Build Coastguard Worker  ['sys/mman.h'],
87*2d1272b8SAndroid Build Coastguard Worker  ['stdbool.h'],
88*2d1272b8SAndroid Build Coastguard Worker  ['xlocale.h'],
89*2d1272b8SAndroid Build Coastguard Worker]
90*2d1272b8SAndroid Build Coastguard Worker
91*2d1272b8SAndroid Build Coastguard Workercheck_funcs = [
92*2d1272b8SAndroid Build Coastguard Worker  ['atexit', {'prefix': '#include <stdlib.h>'}],
93*2d1272b8SAndroid Build Coastguard Worker  ['mprotect', {'prefix': '#include <sys/mman.h>'}],
94*2d1272b8SAndroid Build Coastguard Worker  ['sysconf', {'prefix': '#include <unistd.h>'}],
95*2d1272b8SAndroid Build Coastguard Worker  ['getpagesize', {'prefix': '#include <unistd.h>'}],
96*2d1272b8SAndroid Build Coastguard Worker  ['mmap', {'prefix': '#include <sys/mman.h>'}],
97*2d1272b8SAndroid Build Coastguard Worker  ['isatty', {'prefix': '#include <unistd.h>'}],
98*2d1272b8SAndroid Build Coastguard Worker  ['uselocale', {'prefix': '#include <locale.h>'}],
99*2d1272b8SAndroid Build Coastguard Worker  ['newlocale', {'prefix': '#include <locale.h>'}],
100*2d1272b8SAndroid Build Coastguard Worker  ['sincosf', {'prefix': '#define _GNU_SOURCE\n#include <math.h>'}],
101*2d1272b8SAndroid Build Coastguard Worker]
102*2d1272b8SAndroid Build Coastguard Worker
103*2d1272b8SAndroid Build Coastguard Workerm_dep = cpp.find_library('m', required: false)
104*2d1272b8SAndroid Build Coastguard Worker
105*2d1272b8SAndroid Build Coastguard Workerif meson.version().version_compare('>=0.60.0')
106*2d1272b8SAndroid Build Coastguard Worker  # Sadly, FreeType's versioning schemes are different between pkg-config and CMake
107*2d1272b8SAndroid Build Coastguard Worker  # pkg-config: freetype2, cmake: Freetype
108*2d1272b8SAndroid Build Coastguard Worker  freetype_dep = dependency('freetype2',
109*2d1272b8SAndroid Build Coastguard Worker                            version: freetype_min_version,
110*2d1272b8SAndroid Build Coastguard Worker                            method: 'pkg-config',
111*2d1272b8SAndroid Build Coastguard Worker                            required: false,
112*2d1272b8SAndroid Build Coastguard Worker                            allow_fallback: false)
113*2d1272b8SAndroid Build Coastguard Worker  if not freetype_dep.found()
114*2d1272b8SAndroid Build Coastguard Worker    freetype_dep = dependency('FreeType',
115*2d1272b8SAndroid Build Coastguard Worker                              version: freetype_min_version_actual,
116*2d1272b8SAndroid Build Coastguard Worker                              method: 'cmake',
117*2d1272b8SAndroid Build Coastguard Worker                              required: get_option('freetype'),
118*2d1272b8SAndroid Build Coastguard Worker                              default_options: ['harfbuzz=disabled'],
119*2d1272b8SAndroid Build Coastguard Worker                              allow_fallback: true)
120*2d1272b8SAndroid Build Coastguard Worker  endif
121*2d1272b8SAndroid Build Coastguard Workerelse
122*2d1272b8SAndroid Build Coastguard Worker  # painful hack to handle multiple dependencies but also respect options
123*2d1272b8SAndroid Build Coastguard Worker  freetype_opt = get_option('freetype')
124*2d1272b8SAndroid Build Coastguard Worker  # we want to handle enabled manually after fallbacks, but also handle disabled normally
125*2d1272b8SAndroid Build Coastguard Worker  if freetype_opt.enabled()
126*2d1272b8SAndroid Build Coastguard Worker    freetype_opt = false
127*2d1272b8SAndroid Build Coastguard Worker  endif
128*2d1272b8SAndroid Build Coastguard Worker  # try pkg-config name
129*2d1272b8SAndroid Build Coastguard Worker  freetype_dep = dependency('freetype2', version: freetype_min_version, method: 'pkg-config', required: freetype_opt)
130*2d1272b8SAndroid Build Coastguard Worker  # when disabled, leave it not-found
131*2d1272b8SAndroid Build Coastguard Worker  if not freetype_dep.found() and not get_option('freetype').disabled()
132*2d1272b8SAndroid Build Coastguard Worker    # Try cmake name
133*2d1272b8SAndroid Build Coastguard Worker    freetype_dep = dependency('Freetype', version: freetype_min_version_actual, method: 'cmake', required: false)
134*2d1272b8SAndroid Build Coastguard Worker    # Subproject fallback, `allow_fallback: true` means the fallback will be
135*2d1272b8SAndroid Build Coastguard Worker    # tried even if the freetype option is set to `auto`.
136*2d1272b8SAndroid Build Coastguard Worker    if not freetype_dep.found()
137*2d1272b8SAndroid Build Coastguard Worker      freetype_dep = dependency('freetype2',
138*2d1272b8SAndroid Build Coastguard Worker                                version: freetype_min_version,
139*2d1272b8SAndroid Build Coastguard Worker                                method: 'pkg-config',
140*2d1272b8SAndroid Build Coastguard Worker                                required: get_option('freetype'),
141*2d1272b8SAndroid Build Coastguard Worker                                default_options: ['harfbuzz=disabled'],
142*2d1272b8SAndroid Build Coastguard Worker                                allow_fallback: true)
143*2d1272b8SAndroid Build Coastguard Worker    endif
144*2d1272b8SAndroid Build Coastguard Worker  endif
145*2d1272b8SAndroid Build Coastguard Workerendif
146*2d1272b8SAndroid Build Coastguard Worker
147*2d1272b8SAndroid Build Coastguard Workerglib_dep = dependency('glib-2.0', version: glib_min_version, required: get_option('glib'))
148*2d1272b8SAndroid Build Coastguard Workergobject_dep = dependency('gobject-2.0', version: glib_min_version, required: get_option('gobject'))
149*2d1272b8SAndroid Build Coastguard Workergraphite2_dep = dependency('graphite2', version: graphite2_min_version, required: get_option('graphite2'))
150*2d1272b8SAndroid Build Coastguard Workergraphite_dep = dependency('graphite2', version: graphite2_min_version, required: get_option('graphite'))
151*2d1272b8SAndroid Build Coastguard Workerwasm_dep = cpp.find_library('iwasm', required: get_option('wasm'))
152*2d1272b8SAndroid Build Coastguard Worker# How to check whether iwasm was built, and hence requires, LLVM?
153*2d1272b8SAndroid Build Coastguard Worker#llvm_dep = cpp.find_library('LLVM-15', required: get_option('wasm'))
154*2d1272b8SAndroid Build Coastguard Worker
155*2d1272b8SAndroid Build Coastguard Workerif meson.version().version_compare('>=0.60.0')
156*2d1272b8SAndroid Build Coastguard Worker  # pkg-config: icu-uc, cmake: ICU but with components
157*2d1272b8SAndroid Build Coastguard Worker  icu_dep = dependency('icu-uc', 'ICU',
158*2d1272b8SAndroid Build Coastguard Worker                            version: icu_min_version,
159*2d1272b8SAndroid Build Coastguard Worker                            components: 'uc',
160*2d1272b8SAndroid Build Coastguard Worker                            required: get_option('icu'),
161*2d1272b8SAndroid Build Coastguard Worker                            allow_fallback: true)
162*2d1272b8SAndroid Build Coastguard Workerelse
163*2d1272b8SAndroid Build Coastguard Worker  # painful hack to handle multiple dependencies but also respect options
164*2d1272b8SAndroid Build Coastguard Worker  icu_opt = get_option('icu')
165*2d1272b8SAndroid Build Coastguard Worker  # we want to handle enabled manually after fallbacks, but also handle disabled normally
166*2d1272b8SAndroid Build Coastguard Worker  if icu_opt.enabled()
167*2d1272b8SAndroid Build Coastguard Worker    icu_opt = false
168*2d1272b8SAndroid Build Coastguard Worker  endif
169*2d1272b8SAndroid Build Coastguard Worker  # try pkg-config name
170*2d1272b8SAndroid Build Coastguard Worker  icu_dep = dependency('icu-uc', version: icu_min_version, method: 'pkg-config', required: icu_opt)
171*2d1272b8SAndroid Build Coastguard Worker  # when disabled, leave it not-found
172*2d1272b8SAndroid Build Coastguard Worker  if not icu_dep.found() and not get_option('icu').disabled()
173*2d1272b8SAndroid Build Coastguard Worker    # Try cmake name
174*2d1272b8SAndroid Build Coastguard Worker    icu_dep = dependency('ICU', version: icu_min_version, method: 'cmake', components: 'uc', required: false)
175*2d1272b8SAndroid Build Coastguard Worker    # Try again with subproject fallback. `allow_fallback: true` means the
176*2d1272b8SAndroid Build Coastguard Worker    # fallback will be tried even if the icu option is set to `auto`, but
177*2d1272b8SAndroid Build Coastguard Worker    # we cannot pass this option until Meson 0.59.0, because no wrap file
178*2d1272b8SAndroid Build Coastguard Worker    # is checked into git.
179*2d1272b8SAndroid Build Coastguard Worker    if not icu_dep.found()
180*2d1272b8SAndroid Build Coastguard Worker      icu_dep = dependency('icu-uc',
181*2d1272b8SAndroid Build Coastguard Worker                           version: icu_min_version,
182*2d1272b8SAndroid Build Coastguard Worker                           method: 'pkg-config',
183*2d1272b8SAndroid Build Coastguard Worker                           required: get_option('icu'))
184*2d1272b8SAndroid Build Coastguard Worker    endif
185*2d1272b8SAndroid Build Coastguard Worker  endif
186*2d1272b8SAndroid Build Coastguard Workerendif
187*2d1272b8SAndroid Build Coastguard Worker
188*2d1272b8SAndroid Build Coastguard Workerif icu_dep.found() and icu_dep.version().version_compare('>=75.1') and (get_option('cpp_std') == 'c++11' or get_option('cpp_std') == 'c++14')
189*2d1272b8SAndroid Build Coastguard Worker  cpp17_arg = cpp.get_argument_syntax() == 'msvc' ? '/std:c++17' : '-std=c++17'
190*2d1272b8SAndroid Build Coastguard Worker  add_project_arguments(cpp17_arg, language: 'cpp')
191*2d1272b8SAndroid Build Coastguard Workerendif
192*2d1272b8SAndroid Build Coastguard Worker
193*2d1272b8SAndroid Build Coastguard Workerif icu_dep.found() and icu_dep.type_name() == 'pkgconfig'
194*2d1272b8SAndroid Build Coastguard Worker  icu_defs = icu_dep.get_variable(pkgconfig: 'DEFS', default_value: '').split()
195*2d1272b8SAndroid Build Coastguard Worker  if icu_defs.length() > 0
196*2d1272b8SAndroid Build Coastguard Worker    add_project_arguments(icu_defs, language: ['c', 'cpp'])
197*2d1272b8SAndroid Build Coastguard Worker  endif
198*2d1272b8SAndroid Build Coastguard Workerendif
199*2d1272b8SAndroid Build Coastguard Worker
200*2d1272b8SAndroid Build Coastguard Workercairo_dep = null_dep
201*2d1272b8SAndroid Build Coastguard Workercairo_ft_dep = null_dep
202*2d1272b8SAndroid Build Coastguard Workerif not get_option('cairo').disabled()
203*2d1272b8SAndroid Build Coastguard Worker  cairo_dep = dependency('cairo', version: cairo_min_version, required: false)
204*2d1272b8SAndroid Build Coastguard Worker  cairo_ft_dep = dependency('cairo-ft', version: cairo_min_version, required: false)
205*2d1272b8SAndroid Build Coastguard Worker
206*2d1272b8SAndroid Build Coastguard Worker  if (not cairo_dep.found() and
207*2d1272b8SAndroid Build Coastguard Worker      cpp.get_argument_syntax() == 'msvc' and
208*2d1272b8SAndroid Build Coastguard Worker      cpp.has_header('cairo.h'))
209*2d1272b8SAndroid Build Coastguard Worker    cairo_dep = cpp.find_library('cairo', required: false)
210*2d1272b8SAndroid Build Coastguard Worker    if cairo_dep.found() and cpp.has_function('cairo_ft_font_face_create_for_ft_face',
211*2d1272b8SAndroid Build Coastguard Worker                                              prefix: '#include <cairo-ft.h>',
212*2d1272b8SAndroid Build Coastguard Worker                                              dependencies: cairo_dep)
213*2d1272b8SAndroid Build Coastguard Worker      cairo_ft_dep = cairo_dep
214*2d1272b8SAndroid Build Coastguard Worker    endif
215*2d1272b8SAndroid Build Coastguard Worker  endif
216*2d1272b8SAndroid Build Coastguard Worker
217*2d1272b8SAndroid Build Coastguard Worker  if not cairo_dep.found()
218*2d1272b8SAndroid Build Coastguard Worker    # Note that we don't have harfbuzz -> cairo -> freetype2 -> harfbuzz fallback
219*2d1272b8SAndroid Build Coastguard Worker    # dependency cycle here because we have configured freetype2 above with
220*2d1272b8SAndroid Build Coastguard Worker    # harfbuzz support disabled, so when cairo will lookup freetype2 dependency
221*2d1272b8SAndroid Build Coastguard Worker    # it will be forced to use that one.
222*2d1272b8SAndroid Build Coastguard Worker    cairo_dep = dependency('cairo', version: cairo_min_version, required: get_option('cairo'))
223*2d1272b8SAndroid Build Coastguard Worker    cairo_ft_required = get_option('cairo').enabled() and get_option('freetype').enabled()
224*2d1272b8SAndroid Build Coastguard Worker    cairo_ft_dep = dependency('cairo-ft', version: cairo_min_version, required: cairo_ft_required)
225*2d1272b8SAndroid Build Coastguard Worker  endif
226*2d1272b8SAndroid Build Coastguard Workerendif
227*2d1272b8SAndroid Build Coastguard Worker
228*2d1272b8SAndroid Build Coastguard Workerchafa_dep = dependency('chafa', version: chafa_min_version, required: get_option('chafa'))
229*2d1272b8SAndroid Build Coastguard Worker
230*2d1272b8SAndroid Build Coastguard Workerconf = configuration_data()
231*2d1272b8SAndroid Build Coastguard Workerincconfig = include_directories('.')
232*2d1272b8SAndroid Build Coastguard Worker
233*2d1272b8SAndroid Build Coastguard Workeradd_project_arguments('-DHAVE_CONFIG_H', language: ['c', 'cpp'])
234*2d1272b8SAndroid Build Coastguard Worker
235*2d1272b8SAndroid Build Coastguard Workerwarn_cflags = [
236*2d1272b8SAndroid Build Coastguard Worker  '-Wno-non-virtual-dtor',
237*2d1272b8SAndroid Build Coastguard Worker]
238*2d1272b8SAndroid Build Coastguard Worker
239*2d1272b8SAndroid Build Coastguard Workercpp_args = cpp.get_supported_arguments(warn_cflags)
240*2d1272b8SAndroid Build Coastguard Worker
241*2d1272b8SAndroid Build Coastguard Workerif glib_dep.found()
242*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_GLIB', 1)
243*2d1272b8SAndroid Build Coastguard Workerendif
244*2d1272b8SAndroid Build Coastguard Worker
245*2d1272b8SAndroid Build Coastguard Workerif gobject_dep.found()
246*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_GOBJECT', 1)
247*2d1272b8SAndroid Build Coastguard Workerendif
248*2d1272b8SAndroid Build Coastguard Worker
249*2d1272b8SAndroid Build Coastguard Workerif cairo_dep.found()
250*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_CAIRO', 1)
251*2d1272b8SAndroid Build Coastguard Worker  check_cairo_funcs = [
252*2d1272b8SAndroid Build Coastguard Worker    ['cairo_user_font_face_set_render_color_glyph_func', {'deps': cairo_dep}],
253*2d1272b8SAndroid Build Coastguard Worker    ['cairo_font_options_get_custom_palette_color', {'deps': cairo_dep}],
254*2d1272b8SAndroid Build Coastguard Worker    ['cairo_user_scaled_font_get_foreground_source', {'deps': cairo_dep}],
255*2d1272b8SAndroid Build Coastguard Worker  ]
256*2d1272b8SAndroid Build Coastguard Worker
257*2d1272b8SAndroid Build Coastguard Worker  if cairo_dep.type_name() == 'internal'
258*2d1272b8SAndroid Build Coastguard Worker    foreach func: check_cairo_funcs
259*2d1272b8SAndroid Build Coastguard Worker      name = func[0]
260*2d1272b8SAndroid Build Coastguard Worker      conf.set('HAVE_@0@'.format(name.to_upper()), 1)
261*2d1272b8SAndroid Build Coastguard Worker    endforeach
262*2d1272b8SAndroid Build Coastguard Worker  else
263*2d1272b8SAndroid Build Coastguard Worker    check_funcs += check_cairo_funcs
264*2d1272b8SAndroid Build Coastguard Worker  endif
265*2d1272b8SAndroid Build Coastguard Workerendif
266*2d1272b8SAndroid Build Coastguard Worker
267*2d1272b8SAndroid Build Coastguard Workerif cairo_ft_dep.found()
268*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_CAIRO_FT', 1)
269*2d1272b8SAndroid Build Coastguard Workerendif
270*2d1272b8SAndroid Build Coastguard Worker
271*2d1272b8SAndroid Build Coastguard Workerif chafa_dep.found()
272*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_CHAFA', 1)
273*2d1272b8SAndroid Build Coastguard Workerendif
274*2d1272b8SAndroid Build Coastguard Worker
275*2d1272b8SAndroid Build Coastguard Workerif wasm_dep.found()
276*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_WASM', 1)
277*2d1272b8SAndroid Build Coastguard Worker  conf.set('HB_WASM_MODULE_DIR', '"'+get_option('prefix')+'/'+get_option('libdir')+'/harfbuzz/wasm"')
278*2d1272b8SAndroid Build Coastguard Workerendif
279*2d1272b8SAndroid Build Coastguard Worker
280*2d1272b8SAndroid Build Coastguard Workerif graphite2_dep.found() or graphite_dep.found()
281*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_GRAPHITE2', 1)
282*2d1272b8SAndroid Build Coastguard Workerendif
283*2d1272b8SAndroid Build Coastguard Worker
284*2d1272b8SAndroid Build Coastguard Workerif icu_dep.found()
285*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_ICU', 1)
286*2d1272b8SAndroid Build Coastguard Workerendif
287*2d1272b8SAndroid Build Coastguard Worker
288*2d1272b8SAndroid Build Coastguard Workerif get_option('icu_builtin')
289*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_ICU_BUILTIN', 1)
290*2d1272b8SAndroid Build Coastguard Workerendif
291*2d1272b8SAndroid Build Coastguard Worker
292*2d1272b8SAndroid Build Coastguard Workerif get_option('experimental_api')
293*2d1272b8SAndroid Build Coastguard Worker  conf.set('HB_EXPERIMENTAL_API', 1)
294*2d1272b8SAndroid Build Coastguard Workerendif
295*2d1272b8SAndroid Build Coastguard Worker
296*2d1272b8SAndroid Build Coastguard Workerif freetype_dep.found()
297*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_FREETYPE', 1)
298*2d1272b8SAndroid Build Coastguard Worker  check_freetype_funcs = [
299*2d1272b8SAndroid Build Coastguard Worker    ['FT_Get_Var_Blend_Coordinates', {'deps': freetype_dep}],
300*2d1272b8SAndroid Build Coastguard Worker    ['FT_Set_Var_Blend_Coordinates', {'deps': freetype_dep}],
301*2d1272b8SAndroid Build Coastguard Worker    ['FT_Done_MM_Var', {'deps': freetype_dep}],
302*2d1272b8SAndroid Build Coastguard Worker    ['FT_Get_Transform', {'deps': freetype_dep}],
303*2d1272b8SAndroid Build Coastguard Worker  ]
304*2d1272b8SAndroid Build Coastguard Worker
305*2d1272b8SAndroid Build Coastguard Worker  if freetype_dep.type_name() == 'internal'
306*2d1272b8SAndroid Build Coastguard Worker    foreach func: check_freetype_funcs
307*2d1272b8SAndroid Build Coastguard Worker      name = func[0]
308*2d1272b8SAndroid Build Coastguard Worker      conf.set('HAVE_@0@'.format(name.to_upper()), 1)
309*2d1272b8SAndroid Build Coastguard Worker    endforeach
310*2d1272b8SAndroid Build Coastguard Worker  else
311*2d1272b8SAndroid Build Coastguard Worker    check_funcs += check_freetype_funcs
312*2d1272b8SAndroid Build Coastguard Worker  endif
313*2d1272b8SAndroid Build Coastguard Workerendif
314*2d1272b8SAndroid Build Coastguard Worker
315*2d1272b8SAndroid Build Coastguard Workergdi_uniscribe_deps = []
316*2d1272b8SAndroid Build Coastguard Worker# GDI (Uniscribe) (Windows)
317*2d1272b8SAndroid Build Coastguard Workerif host_machine.system() == 'windows' and not get_option('gdi').disabled()
318*2d1272b8SAndroid Build Coastguard Worker  if (get_option('directwrite').enabled() and
319*2d1272b8SAndroid Build Coastguard Worker      not (cpp.has_header('usp10.h') and cpp.has_header('windows.h')))
320*2d1272b8SAndroid Build Coastguard Worker    error('GDI/Uniscribe was enabled explicitly, but required headers are missing.')
321*2d1272b8SAndroid Build Coastguard Worker  endif
322*2d1272b8SAndroid Build Coastguard Worker
323*2d1272b8SAndroid Build Coastguard Worker  gdi_deps_found = true
324*2d1272b8SAndroid Build Coastguard Worker  foreach usplib : ['usp10', 'gdi32', 'rpcrt4']
325*2d1272b8SAndroid Build Coastguard Worker    dep = cpp.find_library(usplib, required: get_option('gdi'))
326*2d1272b8SAndroid Build Coastguard Worker    gdi_deps_found = gdi_deps_found and dep.found()
327*2d1272b8SAndroid Build Coastguard Worker    gdi_uniscribe_deps += dep
328*2d1272b8SAndroid Build Coastguard Worker  endforeach
329*2d1272b8SAndroid Build Coastguard Worker
330*2d1272b8SAndroid Build Coastguard Worker  if gdi_deps_found
331*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_UNISCRIBE', 1)
332*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_GDI', 1)
333*2d1272b8SAndroid Build Coastguard Worker  endif
334*2d1272b8SAndroid Build Coastguard Workerendif
335*2d1272b8SAndroid Build Coastguard Worker
336*2d1272b8SAndroid Build Coastguard Worker# DirectWrite (Windows)
337*2d1272b8SAndroid Build Coastguard Workerif host_machine.system() == 'windows' and not get_option('directwrite').disabled()
338*2d1272b8SAndroid Build Coastguard Worker  if get_option('directwrite').enabled() and not cpp.has_header('dwrite_1.h')
339*2d1272b8SAndroid Build Coastguard Worker    error('DirectWrite was enabled explicitly, but required header is missing.')
340*2d1272b8SAndroid Build Coastguard Worker  endif
341*2d1272b8SAndroid Build Coastguard Worker
342*2d1272b8SAndroid Build Coastguard Worker  conf.set('HAVE_DIRECTWRITE', 1)
343*2d1272b8SAndroid Build Coastguard Workerendif
344*2d1272b8SAndroid Build Coastguard Worker
345*2d1272b8SAndroid Build Coastguard Worker# CoreText (macOS)
346*2d1272b8SAndroid Build Coastguard Workercoretext_deps = []
347*2d1272b8SAndroid Build Coastguard Workerif host_machine.system() == 'darwin' and not get_option('coretext').disabled()
348*2d1272b8SAndroid Build Coastguard Worker  app_services_dep = dependency('appleframeworks', modules: ['ApplicationServices'], required: false)
349*2d1272b8SAndroid Build Coastguard Worker  if cpp.has_type('CTFontRef', prefix: '#include <ApplicationServices/ApplicationServices.h>', dependencies: app_services_dep)
350*2d1272b8SAndroid Build Coastguard Worker    coretext_deps += [app_services_dep]
351*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_CORETEXT', 1)
352*2d1272b8SAndroid Build Coastguard Worker  # On iOS CoreText and CoreGraphics are stand-alone frameworks
353*2d1272b8SAndroid Build Coastguard Worker  # Check for a different symbol to avoid getting cached result
354*2d1272b8SAndroid Build Coastguard Worker  else
355*2d1272b8SAndroid Build Coastguard Worker    coretext_dep = dependency('appleframeworks', modules: ['CoreText'], required: false)
356*2d1272b8SAndroid Build Coastguard Worker    coregraphics_dep = dependency('appleframeworks', modules: ['CoreGraphics'], required: false)
357*2d1272b8SAndroid Build Coastguard Worker    corefoundation_dep = dependency('appleframeworks', modules: ['CoreFoundation'], required: false)
358*2d1272b8SAndroid Build Coastguard Worker    if cpp.has_type('CTRunRef', prefix: '#include <CoreText/CoreText.h>', dependencies: [coretext_dep, coregraphics_dep, corefoundation_dep])
359*2d1272b8SAndroid Build Coastguard Worker      coretext_deps += [coretext_dep, coregraphics_dep, corefoundation_dep]
360*2d1272b8SAndroid Build Coastguard Worker      conf.set('HAVE_CORETEXT', 1)
361*2d1272b8SAndroid Build Coastguard Worker    elif get_option('coretext').enabled()
362*2d1272b8SAndroid Build Coastguard Worker      error('CoreText was enabled explicitly, but required headers or frameworks are missing.')
363*2d1272b8SAndroid Build Coastguard Worker    endif
364*2d1272b8SAndroid Build Coastguard Worker  endif
365*2d1272b8SAndroid Build Coastguard Workerendif
366*2d1272b8SAndroid Build Coastguard Worker
367*2d1272b8SAndroid Build Coastguard Worker# threads
368*2d1272b8SAndroid Build Coastguard Workerthread_dep = null_dep
369*2d1272b8SAndroid Build Coastguard Workerif host_machine.system() != 'windows'
370*2d1272b8SAndroid Build Coastguard Worker  thread_dep = dependency('threads', required: false)
371*2d1272b8SAndroid Build Coastguard Worker
372*2d1272b8SAndroid Build Coastguard Worker  if thread_dep.found()
373*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_PTHREAD', 1)
374*2d1272b8SAndroid Build Coastguard Worker  endif
375*2d1272b8SAndroid Build Coastguard Workerendif
376*2d1272b8SAndroid Build Coastguard Worker
377*2d1272b8SAndroid Build Coastguard Workerconf.set_quoted('PACKAGE_NAME', 'HarfBuzz')
378*2d1272b8SAndroid Build Coastguard Workerconf.set_quoted('PACKAGE_VERSION', meson.project_version())
379*2d1272b8SAndroid Build Coastguard Worker
380*2d1272b8SAndroid Build Coastguard Workerforeach check : check_headers
381*2d1272b8SAndroid Build Coastguard Worker  name = check[0]
382*2d1272b8SAndroid Build Coastguard Worker
383*2d1272b8SAndroid Build Coastguard Worker  if cpp.has_header(name)
384*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_@0@'.format(name.to_upper().underscorify()), 1)
385*2d1272b8SAndroid Build Coastguard Worker  endif
386*2d1272b8SAndroid Build Coastguard Workerendforeach
387*2d1272b8SAndroid Build Coastguard Worker
388*2d1272b8SAndroid Build Coastguard Workerharfbuzz_extra_deps = []
389*2d1272b8SAndroid Build Coastguard Workerforeach check : check_funcs
390*2d1272b8SAndroid Build Coastguard Worker  name = check[0]
391*2d1272b8SAndroid Build Coastguard Worker  opts = check.get(1, {})
392*2d1272b8SAndroid Build Coastguard Worker  link_withs = opts.get('link_with', [])
393*2d1272b8SAndroid Build Coastguard Worker  check_deps = opts.get('deps', [])
394*2d1272b8SAndroid Build Coastguard Worker  check_prefix = opts.get('prefix', '')
395*2d1272b8SAndroid Build Coastguard Worker  extra_deps = []
396*2d1272b8SAndroid Build Coastguard Worker  found = true
397*2d1272b8SAndroid Build Coastguard Worker
398*2d1272b8SAndroid Build Coastguard Worker  # First try without linking
399*2d1272b8SAndroid Build Coastguard Worker  found = cpp.has_function(name, prefix: check_prefix, dependencies: check_deps)
400*2d1272b8SAndroid Build Coastguard Worker
401*2d1272b8SAndroid Build Coastguard Worker  if not found and link_withs.length() > 0
402*2d1272b8SAndroid Build Coastguard Worker    found = true
403*2d1272b8SAndroid Build Coastguard Worker
404*2d1272b8SAndroid Build Coastguard Worker    foreach link_with : link_withs
405*2d1272b8SAndroid Build Coastguard Worker      dep = cpp.find_library(link_with, required: false)
406*2d1272b8SAndroid Build Coastguard Worker      if dep.found()
407*2d1272b8SAndroid Build Coastguard Worker        extra_deps += dep
408*2d1272b8SAndroid Build Coastguard Worker      else
409*2d1272b8SAndroid Build Coastguard Worker        found = false
410*2d1272b8SAndroid Build Coastguard Worker      endif
411*2d1272b8SAndroid Build Coastguard Worker    endforeach
412*2d1272b8SAndroid Build Coastguard Worker
413*2d1272b8SAndroid Build Coastguard Worker    if found
414*2d1272b8SAndroid Build Coastguard Worker      found = cpp.has_function(name, prefix: check_prefix, dependencies: check_deps + extra_deps)
415*2d1272b8SAndroid Build Coastguard Worker    endif
416*2d1272b8SAndroid Build Coastguard Worker  endif
417*2d1272b8SAndroid Build Coastguard Worker
418*2d1272b8SAndroid Build Coastguard Worker  if found
419*2d1272b8SAndroid Build Coastguard Worker    harfbuzz_extra_deps += extra_deps
420*2d1272b8SAndroid Build Coastguard Worker    conf.set('HAVE_@0@'.format(name.to_upper()), 1)
421*2d1272b8SAndroid Build Coastguard Worker  endif
422*2d1272b8SAndroid Build Coastguard Workerendforeach
423*2d1272b8SAndroid Build Coastguard Worker
424*2d1272b8SAndroid Build Coastguard Worker# CMake support (package install dir)
425*2d1272b8SAndroid Build Coastguard Worker
426*2d1272b8SAndroid Build Coastguard Worker# Equivalent to configure_package_config_file(INSTALL_DESTINATION ...), see
427*2d1272b8SAndroid Build Coastguard Worker# https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html#command:configure_package_config_file.
428*2d1272b8SAndroid Build Coastguard Worker# In certain unusual packaging layouts such as Nixpkgs, the Harfbuzz package
429*2d1272b8SAndroid Build Coastguard Worker# is installed into two Nix store paths, "out" and "dev", where "out" contains
430*2d1272b8SAndroid Build Coastguard Worker# libraries only (i.e. lib/libharfbuzz.so) and "dev" contains development
431*2d1272b8SAndroid Build Coastguard Worker# files, i.e. include and lib/cmake. If CMake package files are installed to
432*2d1272b8SAndroid Build Coastguard Worker# "out", Nixpkgs will move them to "dev", which breaks assumptions about
433*2d1272b8SAndroid Build Coastguard Worker# our file paths. Since we need to figure out relative install paths here
434*2d1272b8SAndroid Build Coastguard Worker# to make a relocatable package, we do need to know the final path of our
435*2d1272b8SAndroid Build Coastguard Worker# CMake files to calculate the correct relative paths.
436*2d1272b8SAndroid Build Coastguard Worker# Of course, this still defaults to $libdir/cmake if unset, which works for
437*2d1272b8SAndroid Build Coastguard Worker# most packaging layouts.
438*2d1272b8SAndroid Build Coastguard Workercmake_package_install_dir = get_option('cmakepackagedir')
439*2d1272b8SAndroid Build Coastguard Worker
440*2d1272b8SAndroid Build Coastguard Workerif cmake_package_install_dir == ''
441*2d1272b8SAndroid Build Coastguard Worker  cmake_package_install_dir = get_option('libdir') / 'cmake'
442*2d1272b8SAndroid Build Coastguard Workerendif
443*2d1272b8SAndroid Build Coastguard Worker
444*2d1272b8SAndroid Build Coastguard Workersubdir('src')
445*2d1272b8SAndroid Build Coastguard Worker
446*2d1272b8SAndroid Build Coastguard Workerif not get_option('utilities').disabled()
447*2d1272b8SAndroid Build Coastguard Worker  subdir('util')
448*2d1272b8SAndroid Build Coastguard Workerendif
449*2d1272b8SAndroid Build Coastguard Worker
450*2d1272b8SAndroid Build Coastguard Workerif not get_option('tests').disabled()
451*2d1272b8SAndroid Build Coastguard Worker  subdir('test')
452*2d1272b8SAndroid Build Coastguard Workerendif
453*2d1272b8SAndroid Build Coastguard Worker
454*2d1272b8SAndroid Build Coastguard Workerif not get_option('benchmark').disabled()
455*2d1272b8SAndroid Build Coastguard Worker  subdir('perf')
456*2d1272b8SAndroid Build Coastguard Workerendif
457*2d1272b8SAndroid Build Coastguard Worker
458*2d1272b8SAndroid Build Coastguard Workerif not get_option('docs').disabled()
459*2d1272b8SAndroid Build Coastguard Worker  subdir('docs')
460*2d1272b8SAndroid Build Coastguard Workerendif
461*2d1272b8SAndroid Build Coastguard Worker
462*2d1272b8SAndroid Build Coastguard Workerconfigure_file(output: 'config.h', configuration: conf)
463*2d1272b8SAndroid Build Coastguard Worker
464*2d1272b8SAndroid Build Coastguard Workeralias_target('lib', libharfbuzz)
465*2d1272b8SAndroid Build Coastguard Workeralias_target('libs', libharfbuzz, libharfbuzz_subset)
466*2d1272b8SAndroid Build Coastguard Worker
467*2d1272b8SAndroid Build Coastguard Workerbuild_summary = {
468*2d1272b8SAndroid Build Coastguard Worker  'Directories':
469*2d1272b8SAndroid Build Coastguard Worker    {'prefix': get_option('prefix'),
470*2d1272b8SAndroid Build Coastguard Worker     'bindir': get_option('bindir'),
471*2d1272b8SAndroid Build Coastguard Worker     'libdir': get_option('libdir'),
472*2d1272b8SAndroid Build Coastguard Worker     'includedir': get_option('includedir'),
473*2d1272b8SAndroid Build Coastguard Worker     'datadir': get_option('datadir'),
474*2d1272b8SAndroid Build Coastguard Worker     'cmakepackagedir': cmake_package_install_dir
475*2d1272b8SAndroid Build Coastguard Worker    },
476*2d1272b8SAndroid Build Coastguard Worker  'Unicode callbacks (you want at least one)':
477*2d1272b8SAndroid Build Coastguard Worker    {'Builtin': true,
478*2d1272b8SAndroid Build Coastguard Worker     'Glib': conf.get('HAVE_GLIB', 0) == 1,
479*2d1272b8SAndroid Build Coastguard Worker     'ICU': conf.get('HAVE_ICU', 0) == 1,
480*2d1272b8SAndroid Build Coastguard Worker    },
481*2d1272b8SAndroid Build Coastguard Worker  'Font callbacks (the more the merrier)':
482*2d1272b8SAndroid Build Coastguard Worker    {'Builtin' : true,
483*2d1272b8SAndroid Build Coastguard Worker     'FreeType': conf.get('HAVE_FREETYPE', 0) == 1,
484*2d1272b8SAndroid Build Coastguard Worker    },
485*2d1272b8SAndroid Build Coastguard Worker  'Dependencies used for command-line utilities':
486*2d1272b8SAndroid Build Coastguard Worker    {'Cairo': conf.get('HAVE_CAIRO', 0) == 1,
487*2d1272b8SAndroid Build Coastguard Worker     'Chafa': conf.get('HAVE_CHAFA', 0) == 1,
488*2d1272b8SAndroid Build Coastguard Worker    },
489*2d1272b8SAndroid Build Coastguard Worker  'Additional shapers':
490*2d1272b8SAndroid Build Coastguard Worker    {'Graphite2': conf.get('HAVE_GRAPHITE2', 0) == 1,
491*2d1272b8SAndroid Build Coastguard Worker     'WebAssembly (experimental)': conf.get('HAVE_WASM', 0) == 1,
492*2d1272b8SAndroid Build Coastguard Worker    },
493*2d1272b8SAndroid Build Coastguard Worker  'Platform shapers (not normally needed)':
494*2d1272b8SAndroid Build Coastguard Worker    {'CoreText': conf.get('HAVE_CORETEXT', 0) == 1,
495*2d1272b8SAndroid Build Coastguard Worker     'DirectWrite (experimental)': conf.get('HAVE_DIRECTWRITE', 0) == 1,
496*2d1272b8SAndroid Build Coastguard Worker     'GDI/Uniscribe': (conf.get('HAVE_GDI', 0) == 1) and (conf.get('HAVE_UNISCRIBE', 0) == 1),
497*2d1272b8SAndroid Build Coastguard Worker    },
498*2d1272b8SAndroid Build Coastguard Worker  'Other features':
499*2d1272b8SAndroid Build Coastguard Worker    {'Documentation': conf.get('HAVE_GTK_DOC', 0) == 1,
500*2d1272b8SAndroid Build Coastguard Worker     'GObject bindings': conf.get('HAVE_GOBJECT', 0) == 1,
501*2d1272b8SAndroid Build Coastguard Worker     'Cairo integration': conf.get('HAVE_CAIRO', 0) == 1,
502*2d1272b8SAndroid Build Coastguard Worker     'Introspection': conf.get('HAVE_INTROSPECTION', 0) == 1,
503*2d1272b8SAndroid Build Coastguard Worker     'Experimental APIs': conf.get('HB_EXPERIMENTAL_API', 0) == 1,
504*2d1272b8SAndroid Build Coastguard Worker    },
505*2d1272b8SAndroid Build Coastguard Worker  'Testing':
506*2d1272b8SAndroid Build Coastguard Worker    {'Tests': get_option('tests').enabled(),
507*2d1272b8SAndroid Build Coastguard Worker     'Benchmark': get_option('benchmark').enabled(),
508*2d1272b8SAndroid Build Coastguard Worker    },
509*2d1272b8SAndroid Build Coastguard Worker}
510*2d1272b8SAndroid Build Coastguard Workerforeach section_title, section : build_summary
511*2d1272b8SAndroid Build Coastguard Worker  summary(section, bool_yn: true, section: section_title)
512*2d1272b8SAndroid Build Coastguard Workerendforeach
513