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)