Add Meson build definitions
Fixes #490
http://mesonbuild.com
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..f1aa94b
--- /dev/null
+++ b/meson.build
@@ -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)