Add Meson build definitions

Fixes #490

http://mesonbuild.com
This commit is contained in:
Mathieu Duponchelle 2018-05-17 01:28:53 +02:00 committed by Ebrahim Byagowi
parent 0615c7b64b
commit 920efc0ef7
11 changed files with 723 additions and 0 deletions

View File

@ -0,0 +1,6 @@
void memory_barrier (void) { __sync_synchronize (); }
int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
void mutex_unlock (int *m) { __sync_lock_release (m); }
int main(void) { return 0;}

View File

@ -0,0 +1,8 @@
#include <atomic.h>
/* This requires Solaris Studio 12.2 or newer: */
#include <mbarrier.h>
void memory_barrier (void) { __machine_rw_barrier (); }
int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
int main(void) { return 0; }

189
meson.build Normal file
View File

@ -0,0 +1,189 @@
project('harfbuzz', 'c', 'cpp',
version: '1.7.6')
cpp = meson.get_compiler('cpp')
python3 = import('python').find_installation('python3')
check_headers = [
['unistd.h'],
['sys/mman.h'],
['xlocale.h'],
['stdbool.h'],
]
check_funcs = [
['atexit'],
['mprotect'],
['sysconf'],
['getpagesize'],
['mmap'],
['isatty'],
['newlocale'],
['strtod_l'],
['round'],
]
check_freetype_funcs = [
['FT_Get_Var_Blend_Coordinates'],
['FT_Set_Var_Blend_Coordinates'],
['FT_Done_MM_Var'],
]
check_alignofs = [
['struct{char;}', {'conf-name': 'ALIGNOF_STRUCT_CHAR__'}]
]
freetype_dep = dependency('freetype2', required: false)
glib_dep = dependency('glib-2.0', required: false)
gobject_dep = dependency('gobject-2.0', required: false)
cairo_dep = dependency('cairo', required: false)
cairo_ft_dep = dependency('cairo-ft', required: false)
fontconfig_dep = dependency('fontconfig', required: false)
graphite2_dep = dependency('graphite2', required: false)
icu_dep = dependency('icu-uc', required: false)
m_dep = cpp.find_library('m')
deps = [m_dep]
conf = configuration_data()
incbase = include_directories('.')
cpp_args = ['-DHAVE_CONFIG_H']
warn_cflags = [
'-Wno-non-virtual-dtor',
]
cpp_args += cpp.get_supported_arguments(warn_cflags)
if glib_dep.found()
conf.set('HAVE_GLIB', 1)
deps += [glib_dep]
endif
if gobject_dep.found()
conf.set('HAVE_GOBJECT', 1)
deps += [gobject_dep]
endif
if cairo_dep.found()
conf.set('HAVE_CAIRO', 1)
deps += [cairo_dep]
endif
if cairo_ft_dep.found()
conf.set('HAVE_CAIRO_FT', 1)
deps += [cairo_ft_dep]
endif
if graphite2_dep.found()
conf.set('HAVE_GRAPHITE2', 1)
deps += [graphite2_dep]
endif
if icu_dep.found()
conf.set('HAVE_ICU', 1)
conf.set('HAVE_ICU_BUILTIN', 1)
deps += [icu_dep]
endif
if freetype_dep.found()
conf.set('HAVE_FREETYPE', 1)
deps += [freetype_dep]
if freetype_dep.type_name() == 'internal'
foreach func: check_freetype_funcs
name = func[0]
conf.set('HAVE_@0@'.format(name.to_upper()), 1)
endforeach
else
check_funcs += check_freetype_funcs
endif
endif
if fontconfig_dep.found()
conf.set('HAVE_FONTCONFIG', 1)
deps += [fontconfig_dep]
endif
if host_machine.system() != 'windows'
thread_dep = dependency('threads', required: false)
if thread_dep.found()
conf.set('HAVE_PTHREAD', 1)
deps += [thread_dep]
else
check_headers += ['sched.h']
check_funcs += ['sched_yield', {'link_with': 'rt'}]
endif
endif
conf.set('HAVE_OT', true)
conf.set('HAVE_FALLBACK', true)
conf.set_quoted('PACKAGE_NAME', 'HarfBuzz')
conf.set_quoted('PACKAGE_VERSION', meson.project_version())
foreach check : check_headers
name = check[0]
if cpp.has_header(name)
conf.set('HAVE_@0@'.format(name.to_upper().underscorify()), 1)
endif
endforeach
foreach check : check_funcs
name = check[0]
opts = check.length() > 1 ? check[1] : {}
link_withs = opts.get('link_with', [])
extra_deps = []
found = true
# First try without linking
found = cpp.has_function(name)
if not found and link_withs.length() > 0
found = true
foreach link_with : link_withs
dep = cpp.find_library(link_with, required: false)
if dep.found()
extra_deps += dep
else
found = false
endif
endforeach
if found
found = cpp.has_function(name, dependencies: extra_deps)
endif
endif
if found
deps += extra_deps
conf.set('HAVE_@0@'.format(name.to_upper()), 1)
endif
endforeach
foreach check : check_alignofs
type = check[0]
opts = check.length() > 1 ? check[1] : {}
conf_name = opts.get('conf-name', 'ALIGNOF_@0@'.format(type.to_upper()))
conf.set(conf_name, cpp.alignment(type))
endforeach
if cpp.links(files('meson-cc-tests/intel-atomic-primitives-test.c'), name: 'Intel atomics')
conf.set('HAVE_INTEL_ATOMIC_PRIMITIVES', 1)
endif
if cpp.links(files('meson-cc-tests/solaris-atomic-operations.c'), name: 'Solaris atomic ops')
conf.set('HAVE_SOLARIS_ATOMIC_OPS', 1)
endif
subdir('src')
subdir('util')
subdir('test')
configure_file(output: 'config.h', configuration: conf)

15
src/fix_get_types.py Normal file
View File

@ -0,0 +1,15 @@
import re
import argparse
if __name__=='__main__':
parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('output')
args = parser.parse_args()
with open(args.input, 'r') as inp:
with open(args.output, 'w') as out:
for l in inp.readlines():
l = re.sub('_t_get_type', '_get_type', l)
l = re.sub('_T \(', ' (', l)
out.write(l)

237
src/meson.build Normal file
View File

@ -0,0 +1,237 @@
hb_base_sources = [
'hb-blob.cc',
'hb-buffer-serialize.cc',
'hb-buffer.cc',
'hb-common.cc',
'hb-face.cc',
'hb-font.cc',
'hb-ot-tag.cc',
'hb-set.cc',
'hb-shape.cc',
'hb-shape-plan.cc',
'hb-shaper.cc',
'hb-unicode.cc',
'hb-warning.cc',
]
hb_base_headers = [
'hb.h',
'hb-blob.h',
'hb-buffer.h',
'hb-common.h',
'hb-deprecated.h',
'hb-face.h',
'hb-font.h',
'hb-set.h',
'hb-shape.h',
'hb-shape-plan.h',
'hb-unicode.h',
'hb-version.h',
]
hb_base_ragel_sources = [
'hb-buffer-deserialize-json.rl',
'hb-buffer-deserialize-text.rl',
]
hb_fallback_sources = [
'hb-fallback-shape.cc',
]
hb_ot_sources = [
'hb-aat-layout.cc',
'hb-ot-font.cc',
'hb-ot-layout.cc',
'hb-ot-color.cc',
'hb-ot-map.cc',
'hb-ot-math.cc',
'hb-ot-shape.cc',
'hb-ot-shape-complex-arabic.cc',
'hb-ot-shape-complex-default.cc',
'hb-ot-shape-complex-hangul.cc',
'hb-ot-shape-complex-hebrew.cc',
'hb-ot-shape-complex-indic.cc',
'hb-ot-shape-complex-indic-table.cc',
'hb-ot-shape-complex-khmer.cc',
'hb-ot-shape-complex-myanmar.cc',
'hb-ot-shape-complex-thai.cc',
'hb-ot-shape-complex-tibetan.cc',
'hb-ot-shape-complex-use.cc',
'hb-ot-shape-complex-use-table.cc',
'hb-ot-shape-normalize.cc',
'hb-ot-shape-fallback.cc',
'hb-ot-var.cc',
]
hb_ot_headers = [
'hb-ot.h',
'hb-ot-font.h',
'hb-ot-layout.h',
'hb-ot-math.h',
'hb-ot-shape.h',
'hb-ot-tag.h',
'hb-ot-var.h',
]
hb_ot_ragel_sources = [
'hb-ot-shape-complex-indic-machine.rl',
'hb-ot-shape-complex-khmer-machine.rl',
'hb-ot-shape-complex-myanmar-machine.rl',
'hb-ot-shape-complex-use-machine.rl',
]
hb_ft_sources = [
'hb-ft.cc',
]
hb_ft_headers = [
'hb-ft.h',
]
hb_glib_sources = [
'hb-glib.cc',
]
hb_glib_headers = [
'hb-glib.h',
]
hb_graphite2_sources = [
'hb-graphite2.cc',
]
hb_graphite2_headers = [
'hb-graphite2.h',
]
hb_coretext_sources = [
'hb-coretext.cc',
]
hb_directwrite_sources = [
'hb-directwrite.cc',
]
hb_uniscribe_sources = [
'hb-uniscribe.cc',
]
hb_ucdn_sources = [
'hb-ucdn.cc',
'hb-ucdn/ucdn.c',
]
hb_icu_sources = [
'hb-icu.cc',
]
hb_icu_headers = [
'hb-icu.h',
]
hb_subset_sources = [
'hb-subset.cc',
'hb-subset-glyf.cc',
'hb-subset-input.cc',
'hb-subset-plan.cc',
]
hb_subset_headers = [
'hb-subset.h',
'hb-subset-glyf.hh',
'hb-subset-plan.hh',
'hb-subset-private.hh',
]
hb_gobject_sources = [
'hb-gobject-structs.cc'
]
hb_gobject_headers = [
'hb-gobject.h',
'hb-gobject-structs.h',
]
conf.set('HAVE_UCDN', 1)
incucdn = include_directories('hb-ucdn')
incsrc = include_directories('.')
hb_sources = hb_base_sources + hb_fallback_sources + hb_ot_sources + hb_ucdn_sources
hb_headers = hb_base_headers + hb_ot_headers + hb_ucdn_sources
if conf.get('HAVE_FREETYPE', 0) == 1
hb_sources += hb_ft_sources
hb_headers += hb_ft_headers
endif
if conf.get('HAVE_GRAPHITE2', 0) == 1
hb_sources += hb_graphite2_sources
hb_headers += hb_graphite2_headers
endif
if conf.get('HAVE_GLIB', 0) == 1
hb_sources += hb_glib_sources
hb_headers += hb_glib_headers
endif
if conf.get('HAVE_ICU', 0) == 1
hb_sources += hb_icu_sources
hb_headers += hb_icu_headers
endif
libharfbuzz = library('harfbuzz', hb_sources,
include_directories: [incbase, incucdn],
dependencies: deps,
cpp_args: cpp_args,
)
libharfbuzz_subset = library('harfbuzz-subset', hb_subset_sources,
include_directories: incbase,
link_with: [libharfbuzz],
cpp_args: cpp_args)
if conf.get('HAVE_GOBJECT', 0) == 1
gnome = import('gnome')
h_templ = configure_file(
input: 'hb-gobject-enums.h.tmpl',
output: 'hb-gobject-enums-tmp.h.tmpl',
configuration: configuration_data(),
format: 'cmake')
cc_templ = configure_file(
input: 'hb-gobject-enums.cc.tmpl',
output: 'hb-gobject-enums-tmp.cc.tmpl',
configuration: configuration_data(),
format: 'cmake')
enums = gnome.mkenums('hb-gobject',
sources: hb_headers,
h_template: h_templ,
c_template: cc_templ,
identifier_prefix: 'hb_',
symbol_prefix: 'hb_gobject',
)
enum_c = custom_target('hb-gobject-enums.cc',
input: enums[0],
output: 'hb-gobject-enums.cc',
command: [python3, files('fix_get_types.py')[0], '@INPUT@', '@OUTPUT@']
)
enum_h = custom_target('hb-gobject-enums.h',
input: enums[1],
output: 'hb-gobject-enums.h',
command: [python3, files('fix_get_types.py')[0], '@INPUT@', '@OUTPUT@']
)
hb_gobject_sources += [enum_c]
hb_gobject_headers += [enum_h]
libharfbuzz_gobject = library('harfbuzz-gobject', [hb_gobject_sources, enum_c, enum_h],
include_directories: incbase,
dependencies: deps,
link_with: [libharfbuzz],
cpp_args: cpp_args)
endif

51
test/api/meson.build Normal file
View File

@ -0,0 +1,51 @@
tests = [
['test-blob.c'],
['test-buffer.c'],
['test-common.c'],
['test-font.c'],
['test-object.c'],
['test-set.c'],
['test-shape.c'],
['test-subset.c'],
['test-subset-codepoints.c'],
['test-subset-cmap.c'],
['test-subset-glyf.c'],
['test-subset-hdmx.c'],
['test-subset-hmtx.c'],
['test-subset-os2.c'],
['test-subset-post.c'],
['test-subset-vmtx.c'],
['test-unicode.c'],
['test-version.c'],
['test-ot-color.c'],
['test-ot-tag.c'],
]
if conf.get('HAVE_FREETYPE', 0) == 1
tests += [['test-ot-math.c']]
endif
if conf.get('HAVE_GLIB', 0) == 1
env = environment()
env.set('G_TEST_SRCDIR', meson.current_source_dir())
env.set('G_TEST_BUILDDIR', meson.current_build_dir())
foreach test_data : tests
fname = test_data[0]
opts = test_data.length() > 1 ? test_data[1] : {}
extra_c_args = opts.get('c_args', [])
test_name = fname.split('.')[0].underscorify()
exe = executable(test_name, fname,
cpp_args: cpp_args + extra_c_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz, libharfbuzz_subset],
)
test(test_name, exe,
env: env)
endforeach
endif

32
test/fuzzing/meson.build Normal file
View File

@ -0,0 +1,32 @@
tests = [
['hb-shape-fuzzer.cc'],
['hb-subset-fuzzer.cc'],
['hb-subset-get-codepoints-fuzzer.cc'],
]
foreach test_data : tests
fname = test_data[0]
test_name = fname.split('.')[0].underscorify()
exe = executable(test_name, [fname, 'main.cc'],
cpp_args: cpp_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz, libharfbuzz_subset],
)
endforeach
test('shape_fuzzer', python3,
args: [
files('run-shape-fuzzer-tests.py')[0],
join_paths(meson.current_build_dir(), 'hb_shape_fuzzer')
],
workdir: meson.current_source_dir())
test('subset_fuzzer', python3,
args: [
files('run-subset-fuzzer-tests.py')[0],
join_paths(meson.current_build_dir(), 'hb_subset_fuzzer'),
join_paths(meson.current_build_dir(), 'hb_subset_get_codepoints_fuzzer'),
],
workdir: meson.current_source_dir())

4
test/meson.build Normal file
View File

@ -0,0 +1,4 @@
subdir('api')
subdir('fuzzing')
subdir('shaping')
subdir('subset')

110
test/shaping/meson.build Normal file
View File

@ -0,0 +1,110 @@
in_house_tests = [
['arabic-fallback-shaping.tests'],
['arabic-feature-order.tests'],
['arabic-like-joining.tests'],
['arabic-mark-order.tests'],
['arabic-stch.tests'],
['automatic-fractions.tests'],
['cluster.tests'],
['color-fonts.tests'],
['context-matching.tests'],
['cursive-positioning.tests'],
['default-ignorables.tests'],
['emoji-flag-tags.tests'],
['fallback-positioning.tests'],
['fuzzed.tests'],
['hangul-jamo.tests'],
['hyphens.tests'],
['indic-consonant-with-stacker.tests'],
['indic-decompose.tests'],
['indic-init.tests'],
['indic-joiner-candrabindu.tests'],
['indic-joiners.tests'],
['indic-old-spec.tests'],
['indic-pref-blocking.tests'],
['indic-script-extensions.tests'],
['indic-special-cases.tests'],
['indic-syllable.tests'],
['language-tags.tests'],
['ligature-id.tests'],
['mark-attachment.tests'],
['mark-filtering-sets.tests'],
['mongolian-variation-selector.tests'],
['myanmar-syllable.tests'],
['none-directional.tests'],
['spaces.tests'],
['simple.tests'],
['tibetan-contractions-1.tests'],
['tibetan-contractions-2.tests'],
['tibetan-vowels.tests'],
['use.tests'],
['use-marchen.tests'],
['use-syllable.tests'],
['variations-rvrn.tests'],
['vertical.tests'],
['zero-width-marks.tests'],
]
text_rendering_tests = [
['AVAR-1.tests'],
['CFF-1.tests'],
['CFF2-1.tests'],
['CFF-2.tests'],
['CMAP-1.tests'],
['CMAP-2.tests'],
['CVAR-1.tests'],
['CVAR-2.tests'],
['GLYF-1.tests'],
['GPOS-1.tests'],
['GPOS-2.tests'],
['GPOS-3.tests'],
['GPOS-4.tests'],
['GPOS-5.tests'],
['GSUB-1.tests'],
['GSUB-2.tests'],
['GVAR-1.tests'],
['GVAR-2.tests'],
['GVAR-3.tests'],
['GVAR-4.tests'],
['GVAR-5.tests'],
['GVAR-6.tests'],
['GVAR-7.tests'],
['GVAR-8.tests'],
['GVAR-9.tests'],
['HVAR-1.tests'],
['HVAR-2.tests'],
['KERN-1.tests'],
['KERN-2.tests'],
['SHBALI-3.tests'],
['SHKNDA-1.tests'],
]
foreach test_data : in_house_tests
fname = test_data[0]
test_name = fname.split('.')[0].underscorify()
test(test_name, python3,
args: [
files('run-tests.py')[0],
hb_shape.full_path(),
join_paths(meson.current_source_dir(), 'data/in-house/tests', fname),
],
workdir: meson.current_source_dir(),
)
endforeach
foreach test_data : text_rendering_tests
fname = test_data[0]
test_name = fname.split('.')[0].underscorify()
test(test_name, python3,
args: [
files('run-tests.py')[0],
hb_shape.full_path(),
join_paths(meson.current_source_dir(), 'data/text-rendering-tests/tests', fname),
],
workdir: meson.current_source_dir(),
)
endforeach

20
test/subset/meson.build Normal file
View File

@ -0,0 +1,20 @@
tests = [
['basics.tests'],
['full-font.tests'],
['japanese.tests'],
]
foreach test_data : tests
fname = test_data[0]
test_name = fname.split('.')[0].underscorify()
test(test_name, python3,
args: [
files('run-tests.py')[0],
hb_subset.full_path(),
join_paths(meson.current_source_dir(), 'data/tests', fname),
],
workdir: meson.current_source_dir(),
)
endforeach

51
util/meson.build Normal file
View File

@ -0,0 +1,51 @@
hb_view_sources = [
'hb-view.cc',
'options.cc',
'ansi-print.cc',
'helper-cairo.cc',
'helper-cairo-ansi.cc',
'view-cairo.cc',
]
hb_shape_sources = [
'hb-shape.cc',
'options.cc',
]
hb_ot_shape_closure_sources = [
'hb-ot-shape-closure.cc',
'options.cc',
]
hb_subset_cli_sources = [
'hb-subset.cc',
'options.cc',
]
hb_view = executable('hb-view', hb_view_sources,
cpp_args: cpp_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz]
)
hb_shape = executable('hb-shape', hb_shape_sources,
cpp_args: cpp_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz]
)
hb_subset = executable('hb-subset', hb_subset_cli_sources,
cpp_args: cpp_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz, libharfbuzz_subset]
)
hb_ot_shape_closure = executable('hb-ot-shape-closure', hb_ot_shape_closure_sources,
cpp_args: cpp_args,
include_directories: [incbase, incsrc],
dependencies: deps,
link_with: [libharfbuzz]
)