1pango_sources = [
2  'break.c',
3  'ellipsize.c',
4  'fonts.c',
5  'glyphstring.c',
6  'modules.c',
7  'pango-attributes.c',
8  'pango-bidi-type.c',
9  'pango-color.c',
10  'pango-context.c',
11  'pango-coverage.c',
12  'pango-emoji.c',
13  'pango-engine.c',
14  'pango-fontmap.c',
15  'pango-fontset.c',
16  'pango-glyph-item.c',
17  'pango-gravity.c',
18  'pango-item.c',
19  'pango-language.c',
20  'pango-layout.c',
21  'pango-markup.c',
22  'pango-matrix.c',
23  'pango-renderer.c',
24  'pango-script.c',
25  'pango-tabs.c',
26  'pango-utils.c',
27  'reorder-items.c',
28  'shape.c',
29  'pangofc-shape.c',
30]
31
32pango_headers = [
33  'pango.h',
34  'pango-attributes.h',
35  'pango-bidi-type.h',
36  'pango-break.h',
37  'pango-context.h',
38  'pango-coverage.h',
39  'pango-direction.h',
40  'pango-engine.h',
41  'pango-font.h',
42  'pango-fontmap.h',
43  'pango-fontset.h',
44  'pango-glyph.h',
45  'pango-glyph-item.h',
46  'pango-gravity.h',
47  'pango-item.h',
48  'pango-language.h',
49  'pango-layout.h',
50  'pango-matrix.h',
51  'pango-modules.h',
52  'pango-renderer.h',
53  'pango-script.h',
54  'pango-tabs.h',
55  'pango-types.h',
56  'pango-utils.h',
57]
58
59pango_installed_headers = pango_headers + [ 'pango-version-macros.h' ]
60
61install_headers(pango_installed_headers, subdir: pango_api_path)
62
63# Features header
64pango_features_conf = configuration_data()
65pango_features_conf.set('PANGO_VERSION_MAJOR', pango_major_version)
66pango_features_conf.set('PANGO_VERSION_MINOR', pango_minor_version)
67pango_features_conf.set('PANGO_VERSION_MICRO', pango_micro_version)
68pango_features_conf.set('PANGO_API_VERSION', pango_api_version)
69pango_features_conf.set('PANGO_CURRENT_MINUS_AGE', '0')
70
71pango_features_h = configure_file(
72  input: 'pango-features.h.meson',
73  output: 'pango-features.h',
74  configuration: pango_features_conf,
75  install: true,
76  install_dir: join_paths(pango_includedir, pango_api_path),
77)
78
79# Enumerations for GType
80pango_enums = gnome.mkenums(
81  'pango-enum-types',
82  sources: pango_headers,
83  c_template: 'pango-enum-types.c.template',
84  h_template: 'pango-enum-types.h.template',
85  install_dir: join_paths(pango_includedir, pango_api_path),
86  install_header: true,
87)
88pango_enum_h = pango_enums[1]
89
90if host_system == 'windows'
91  pango_rc = configure_file(
92    input: 'pango.rc.in',
93    output: 'pango.rc',
94    configuration: pango_features_conf,
95  )
96  pango_res = import('windows').compile_resources(pango_rc)
97  pango_sources += pango_res
98endif
99
100pango_cflags = [
101  '-DG_LOG_DOMAIN="Pango"',
102  '-DG_LOG_USE_STRUCTURED=1',
103  '-DPANGO_COMPILATION',
104  '-DSYSCONFDIR="@0@"'.format(pango_sysconfdir),
105  '-DLIBDIR="@0@"'.format(pango_libdir),
106]
107
108pango_inc = include_directories('.')
109
110libpango = library(
111  pango_api_name,
112  sources: pango_sources + pango_enums,
113  version: pango_libversion,
114  soversion: pango_soversion,
115  darwin_versions : pango_osxversion,
116  install: true,
117  dependencies: pango_deps,
118  include_directories: [ root_inc, pango_inc ],
119  c_args: common_cflags + pango_debug_cflags + pango_cflags,
120  link_args: common_ldflags,
121)
122
123pango_dep_sources = [pango_enum_h]
124
125gir = find_program('g-ir-scanner', required : get_option('introspection'))
126build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
127
128if build_gir
129  gir_args = [
130    '--quiet',
131  ]
132  harfbuzz_gobject_dep = dependency('harfbuzz-gobject', version: harfbuzz_req_version, required: false)
133
134  if not harfbuzz_gobject_dep.found() and cc.get_argument_syntax() == 'msvc'
135    # The CMake build files for HarfBuzz (which is used for MSVC builds) do not
136    # generate pkg-config files, so look for harfbuzz-gobject.lib
137    harfbuzz_gobject_dep = cc.find_library('harfbuzz-gobject', has_headers: ['hb-gobject.h'], required: false)
138  endif
139
140  if not harfbuzz_gobject_dep.found()
141    harfbuzz_gobject_dep = dependency('harfbuzz-gobject', version: harfbuzz_req_version, required: false,
142                            fallback: ['harfbuzz', 'libharfbuzz_gobject_dep'])
143  endif
144
145  if harfbuzz_gobject_dep.found()
146    pango_deps += harfbuzz_gobject_dep
147  endif
148  pango_gir = gnome.generate_gir(
149    libpango,
150    sources: pango_sources + pango_headers + [ pango_enum_h, pango_features_h ],
151    namespace: 'Pango',
152    nsversion: pango_api_version,
153    identifier_prefix: 'Pango',
154    symbol_prefix: 'pango',
155    export_packages: 'pango',
156    dependencies: pango_deps,
157    includes: [ 'HarfBuzz-0.0', 'GObject-2.0', 'cairo-1.0', ],
158    header: 'pango/pango.h',
159    install: true,
160    extra_args: gir_args,
161  )
162  pango_gir_dep = declare_dependency(sources: pango_gir)
163  pango_dep_sources += pango_gir
164endif
165
166libpango_dep = declare_dependency(
167  link_with: libpango,
168  include_directories: pango_inc,
169  dependencies: pango_deps,
170  sources: pango_dep_sources,
171)
172meson.override_dependency('pango', libpango_dep)
173
174pango_pkg_requires = ['gobject-2.0']
175if harfbuzz_dep.type_name() == 'pkgconfig'
176  pango_pkg_requires += 'harfbuzz'
177endif
178
179pkgconfig.generate(libpango,
180  name: 'Pango',
181  description: 'Internationalized text handling',
182  requires: pango_pkg_requires,
183  filebase: 'pango',
184  subdirs: pango_api_name,
185)
186
187# FreeType
188if build_pangoft2
189  pangofc_headers = [
190    'pangofc-font.h',
191    'pangofc-fontmap.h',
192    'pangofc-decoder.h',
193  ]
194
195  pangofc_public_sources = [
196    'pangofc-font.c',
197    'pangofc-fontmap.c',
198    'pangofc-decoder.c',
199    'pango-trace.c',
200  ]
201
202  pangoot_headers = [
203    'pango-ot.h',
204  ]
205
206  pangoot_public_sources = [
207    'pango-ot-buffer.c',
208    'pango-ot-info.c',
209    'pango-ot-ruleset.c',
210    'pango-ot-tag.c',
211  ]
212
213  pangoft2_headers = [
214    'pangoft2.h',
215  ]
216
217  pangoft2_public_sources = [
218    'pangoft2-fontmap.c',
219    'pangoft2-render.c',
220    'pangoft2.c',
221  ]
222
223  pangoft2_sources = pangofc_public_sources + pangoot_public_sources + pangoft2_public_sources
224
225  if host_system == 'windows'
226    pangoft2_rc = configure_file(
227      input: 'pangoft2.rc.in',
228      output: 'pangoft2.rc',
229      configuration: pango_features_conf,
230    )
231    pangoft2_res = import('windows').compile_resources(pangoft2_rc)
232    pangoft2_sources += pangoft2_res
233  endif
234
235  install_headers(pangoft2_headers + pangofc_headers + pangoot_headers, subdir: pango_api_path)
236
237  libpangoft2 = library(
238    'pangoft2-@0@'.format(pango_api_version),
239    sources: pangoft2_sources,
240    version: pango_libversion,
241    soversion: pango_soversion,
242    darwin_versions : pango_osxversion,
243    install: true,
244    dependencies: pango_deps + [ libpango_dep ],
245    include_directories: [ root_inc, pango_inc ],
246    c_args: common_cflags + pango_debug_cflags + pango_cflags + [
247      '-DPANGO_DISABLE_DEPRECATION_WARNINGS',
248    ],
249    link_args: common_ldflags,
250  )
251
252  pangoft2_dep_sources = []
253
254  if build_gir
255    pangofc_gir = gnome.generate_gir(
256      libpangoft2,
257      sources: pangofc_headers + pangofc_public_sources,
258      dependencies: [ libpango_dep, pango_gir_dep ],
259      namespace: 'PangoFc',
260      nsversion: pango_api_version,
261      identifier_prefix: 'PangoFc',
262      symbol_prefix: 'pango_fc',
263      export_packages: 'pangofc',
264      includes: [ pango_gir[0], 'fontconfig-2.0', ],
265      header: 'pango/pangofc-fontmap.h',
266      install: true,
267      extra_args: gir_args,
268    )
269    pangofc_gir_dep = declare_dependency(sources: pangofc_gir)
270    pangoft2_dep_sources += pangofc_gir
271
272    # Deprecated API, still needed for PangoXft
273    pangoot_gir = gnome.generate_gir(
274      libpangoft2,
275      sources: pangoot_headers + pangoot_public_sources,
276      dependencies: [ libpango_dep, pango_gir_dep, pangofc_gir_dep ],
277      namespace: 'PangoOT',
278      nsversion: pango_api_version,
279      identifier_prefix: 'PangoOT',
280      symbol_prefix: 'pango_ot',
281      export_packages: 'pangoot',
282      includes: [ pangofc_gir[0], 'freetype2-2.0', ],
283      header: 'pango/pango-ot.h',
284      install: true,
285      extra_args: gir_args,
286    )
287    pangoot_gir_dep = declare_dependency(sources: pangoot_gir)
288    pangoft2_dep_sources += pangoot_gir
289
290    pangoft2_gir = gnome.generate_gir(
291      libpangoft2,
292      sources: pangoft2_headers + pangoft2_public_sources,
293      dependencies: [ libpango_dep, pango_gir_dep, pangofc_gir_dep, pangoot_gir_dep ],
294      namespace: 'PangoFT2',
295      nsversion: pango_api_version,
296      identifier_prefix: 'PangoFT2',
297      symbol_prefix: 'pango_ft2',
298      export_packages: 'pangoft2',
299      includes: [ pangofc_gir[0], 'freetype2-2.0', ],
300      header: 'pango/pangoft2.h',
301      install: true,
302      extra_args: gir_args,
303    )
304    pangoft2_gir_dep = declare_dependency(sources: pangoft2_gir)
305    pangoft2_dep_sources += pangoft2_gir
306  endif
307
308  libpangoft2_dep = declare_dependency(
309    link_with: libpangoft2,
310    include_directories: pango_inc,
311    dependencies: pango_deps + [ libpango_dep ],
312    sources: pangoft2_dep_sources,
313  )
314  meson.override_dependency('pangoft2', libpangoft2_dep)
315
316  pkgconfig.generate(libpangoft2,
317    name: 'Pango FT2 and Pango Fc',
318    description: 'Freetype 2.0 and fontconfig font support for Pango',
319    filebase: 'pangoft2',
320    subdirs: pango_api_name,
321    requires: [ 'pango', freetype2_pc, fontconfig_pc ],
322  )
323
324  # Since we split the introspection data, we also need a split pkg-config
325  # file for Vala
326  pkgconfig.generate(
327    name: 'Pango OT',
328    description: 'OpenType font support for Pango (deprecated)',
329    filebase: 'pangoot',
330    subdirs: pango_api_name,
331    requires: [ 'pangoft2' ],
332  )
333
334  pkgconfig.generate(
335    name: 'Pango FC',
336    description: 'Fontconfig support for Pango',
337    filebase: 'pangofc',
338    subdirs: pango_api_name,
339    requires: [ 'pangoft2' ],
340  )
341else
342  # For usage as a subproject
343  libpangoft2_dep = dependency('', required : false)
344  # Needed for making ft2 no-op while generating pangoxft_gir below
345  pangoft2_gir_dep = dependency('', required : false)
346  pangoft2_gir = [[]]
347endif
348
349# Xft
350if xft_dep.found() and fontconfig_dep.found()
351  pangoxft_headers = [
352    'pangoxft.h',
353    'pangoxft-render.h',
354  ]
355
356  pangoxft_sources = [
357    'pangoxft-font.c',
358    'pangoxft-fontmap.c',
359    'pangoxft-render.c',
360  ]
361
362  install_headers(pangoxft_headers, subdir: pango_api_path)
363
364  libpangoxft = library(
365    'pangoxft-@0@'.format(pango_api_version),
366    sources: pangoxft_sources,
367    version: pango_libversion,
368    soversion: pango_soversion,
369    darwin_versions : pango_osxversion,
370    install: true,
371    dependencies: pango_deps + [ libpango_dep, libpangoft2_dep ],
372    include_directories: [ root_inc, pango_inc ],
373    c_args: common_cflags + pango_debug_cflags + pango_cflags + [
374      '-DPANGO_DISABLE_DEPRECATION_WARNINGS',
375    ],
376    link_args: common_ldflags,
377  )
378  pangoxft_dep_sources = []
379
380  if build_gir
381    pangoxft_gir = gnome.generate_gir(
382      libpangoxft,
383      sources: pangoxft_headers + pangoxft_sources,
384      dependencies: [ libpango_dep, libpangoft2_dep, pango_gir_dep, pangoot_gir_dep, pangoft2_gir_dep ],
385      namespace: 'PangoXft',
386      nsversion: pango_api_version,
387      identifier_prefix: 'PangoXft',
388      symbol_prefix: 'pango_xft',
389      export_packages: 'pangoxft',
390      includes: [ pango_gir[0], pangoot_gir[0], pangoft2_gir[0], 'GObject-2.0', 'xft-2.0', 'xlib-2.0' ],
391      header: 'pango/pangoxft.h',
392      install: true,
393      extra_args: gir_args,
394    )
395    pangoxft_dep_sources += pangoxft_gir
396  endif
397
398  libpangoxft_dep = declare_dependency(
399    link_with: libpangoxft,
400    include_directories: root_inc,
401    dependencies: pango_deps + [ libpango_dep, libpangoft2_dep ],
402    sources: pangoxft_dep_sources,
403  )
404  meson.override_dependency('pangoxft', libpangoxft_dep)
405
406  pkgconfig.generate(libpangoxft,
407    name: 'Pango Xft',
408    description: 'Xft font support for Pango',
409    filebase: 'pangoxft',
410    subdirs: pango_api_name,
411    requires: [ 'pangoft2', 'xft' ],
412  )
413else
414  # For usage as a subproject
415  libpangoxft_dep = dependency('', required: false)
416endif
417
418# Win32
419if host_system == 'windows'
420  pangowin32_headers = [
421    'pangowin32.h',
422  ]
423
424  pangowin32_sources = [
425    'pangowin32.c',
426    'pangowin32-fontcache.c',
427    'pangowin32-fontmap.c',
428  ]
429
430  pangowin32_deps = pango_deps + [
431    libpango_dep,
432    cc.find_library('gdi32'),
433  ]
434
435  pangowin32_rc = configure_file(
436    input: 'pangowin32.rc.in',
437    output: 'pangowin32.rc',
438    configuration: pango_features_conf,
439  )
440  pangowin32_res = import('windows').compile_resources(pangowin32_rc)
441  pangowin32_sources += pangowin32_res
442
443  install_headers(pangowin32_headers, subdir: pango_api_path)
444
445  libpangowin32 = library(
446    'pangowin32-@0@'.format(pango_api_version),
447    sources: pangowin32_sources,
448    version: pango_libversion,
449    soversion: pango_soversion,
450    install: true,
451    dependencies: pangowin32_deps,
452    include_directories: [ root_inc, pango_inc ],
453    c_args: common_cflags + pango_debug_cflags + pango_cflags + [
454      '-DPANGO_DISABLE_DEPRECATION_WARNINGS',
455    ],
456    link_args: common_ldflags,
457  )
458
459  libpangowin32_dep = declare_dependency(
460    link_with: libpangowin32,
461    include_directories: root_inc,
462    dependencies: pango_deps + [ libpango_dep ],
463  )
464  meson.override_dependency('pangowin32', libpangowin32_dep)
465
466  pkgconfig.generate(libpangowin32,
467    name: 'Pango Win32',
468    description: 'Win32 GDI font support for Pango',
469    filebase: 'pangowin32',
470    subdirs: pango_api_name,
471    requires: 'pango',
472  )
473else
474  # For usage as a subproject
475  libpangowin32_dep = dependency('', required: false)
476endif
477
478# Cairo
479if cairo_dep.found()
480  pangocairo_headers = [
481    'pangocairo.h',
482  ]
483
484  pangocairo_sources = [
485    'pangocairo-context.c',
486    'pangocairo-font.c',
487    'pangocairo-fontmap.c',
488    'pangocairo-render.c',
489  ]
490
491  pangocairo_deps = pango_deps + [ libpango_dep ]
492
493  if pango_font_backends.contains('freetype')
494    pangocairo_sources += [
495      'pangocairo-fcfont.c',
496      'pangocairo-fcfontmap.c',
497    ]
498
499    pangocairo_deps += libpangoft2_dep
500  endif
501
502  if host_system == 'windows' and pango_font_backends.contains('win32')
503    pangocairo_sources += [
504      'pangocairo-win32font.c',
505      'pangocairo-win32fontmap.c',
506    ]
507
508    pangocairo_rc = configure_file(
509      input: 'pangocairo.rc.in',
510      output: 'pangocairo.rc',
511      configuration: pango_features_conf,
512    )
513    pangocairo_res = import('windows').compile_resources(pangocairo_rc)
514    pangocairo_sources += pangocairo_res
515
516    pangocairo_deps += cc.find_library('gdi32')
517    pangocairo_deps += libpangowin32_dep
518  endif
519
520  if host_system == 'darwin' and pango_font_backends.contains('quartz')
521    pangocairo_sources += [
522      'pangocoretext.c',
523      'pangocoretext-fontmap.c',
524      'pangocairo-coretextfont.c',
525      'pangocairo-coretextfontmap.c',
526    ]
527  endif
528
529  install_headers(pangocairo_headers, subdir: pango_api_path)
530
531  libpangocairo = library(
532    'pangocairo-@0@'.format(pango_api_version),
533    sources: pangocairo_sources,
534    version: pango_libversion,
535    soversion: pango_soversion,
536    darwin_versions : pango_osxversion,
537    install: true,
538    dependencies: pango_deps + pangocairo_deps,
539    include_directories: [ root_inc, pango_inc ],
540    c_args: common_cflags + pango_debug_cflags + pango_cflags + [
541      '-DPANGO_DISABLE_DEPRECATION_WARNINGS',
542    ],
543    link_args: common_ldflags
544  )
545  pangocairo_dep_sources = []
546
547  if build_gir
548    pangocairo_gir = gnome.generate_gir(
549      libpangocairo,
550      sources: pangocairo_headers + pangocairo_sources,
551      dependencies: [ pangocairo_deps, pango_gir_dep ],
552      namespace: 'PangoCairo',
553      nsversion: pango_api_version,
554      identifier_prefix: 'PangoCairo',
555      symbol_prefix: 'pango_cairo',
556      export_packages: 'pangocairo',
557      includes: [ pango_gir[0], 'GObject-2.0', 'cairo-1.0' ],
558      header: 'pango/pangocairo.h',
559      install: true,
560      extra_args: gir_args,
561    )
562    pangocairo_dep_sources += pangocairo_gir
563  endif
564
565  libpangocairo_dep = declare_dependency(
566    link_with: libpangocairo,
567    include_directories: root_inc,
568    dependencies: pango_deps + [ libpango_dep ],
569    sources: pangocairo_dep_sources,
570  )
571  meson.override_dependency('pangocairo', libpangocairo_dep)
572
573  # Create pangocairo.pc according to whether we found Cairo
574  # manually
575  if ['pkgconfig', 'internal'].contains(cairo_found_type)
576    pango_cairo_requires = [ 'pango', cairo_pc ]
577  else
578    pango_cairo_requires = [ 'pango' ]
579  endif
580
581  pkgconfig.generate(libpangocairo,
582    name: 'Pango Cairo',
583    description: 'Cairo rendering support for Pango',
584    filebase: 'pangocairo',
585    subdirs: pango_api_name,
586    requires: pango_cairo_requires,
587  )
588else
589  # For usage as a subproject
590  libpangocairo_dep = dependency('', required: false)
591endif
592