summaryrefslogtreecommitdiff
path: root/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/meson.build')
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-src/meson.build345
1 files changed, 345 insertions, 0 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/meson.build b/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
new file mode 100644
index 00000000000..e07ee76fc48
--- /dev/null
+++ b/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
@@ -0,0 +1,345 @@
+project('harfbuzz', 'c', 'cpp',
+ meson_version: '>= 0.47.0',
+ default_options : ['cpp_std=c++11'],
+ version: '2.6.6')
+
+warning('Meson is not our main build system yet, don\'t use it for packaging HarfBuzz for *nix distros for now')
+
+hb_version_arr = meson.project_version().split('.')
+hb_version_major = hb_version_arr[0].to_int()
+hb_version_minor = hb_version_arr[1].to_int()
+hb_version_micro = hb_version_arr[2].to_int()
+
+# libtool versioning
+hb_version_int = hb_version_major*10000 + hb_version_minor*100 + hb_version_micro
+if hb_version_minor % 2 == 1
+ hb_libtool_revision = 0 # for unstable releases
+else
+ hb_libtool_revision = hb_version_micro # for stable releases
+endif
+hb_libtool_age = hb_version_int - hb_libtool_revision
+hb_libtool_current = hb_libtool_age
+hb_libtool_version_info = '@0@:@1@:@2@'.format(hb_libtool_current, hb_libtool_revision, hb_libtool_age)
+
+pkgmod = import('pkgconfig')
+cpp = meson.get_compiler('cpp')
+
+if cpp.get_id() == 'msvc'
+ # Ignore several spurious warnings for things HarfBuzz does very commonly.
+ # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
+ # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
+ # NOTE: Only add warnings here if you are sure they're spurious
+ msvc_args = [
+ '/wd4018', # implicit signed/unsigned conversion
+ '/wd4146', # unary minus on unsigned (beware INT_MIN)
+ '/wd4244', # lossy type conversion (e.g. double -> int)
+ '/wd4305', # truncating type conversion (e.g. double -> float)
+ cpp.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
+ ]
+ add_project_arguments(msvc_args, language : ['c', 'cpp'])
+ # Disable SAFESEH with MSVC for libs that use external deps that are built with MinGW
+ # noseh_link_args = ['/SAFESEH:NO']
+endif
+
+add_project_arguments(cpp.get_supported_arguments([
+ '-fno-rtti',
+ '-fno-exceptions',
+ '-fno-threadsafe-statics',
+ '-fvisibility-inlines-hidden', # maybe shouldn't be applied for mingw
+]), language : 'cpp')
+
+if host_machine.cpu_family() == 'arm' and cpp.alignment('struct { char c; }') != 1
+ if cpp.has_argument('-mstructure-size-boundary=8')
+ add_project_arguments('-mstructure-size-boundary=8', language : 'cpp')
+ endif
+endif
+
+python3 = import('python').find_installation('python3')
+
+check_headers = [
+ ['unistd.h'],
+ ['sys/mman.h'],
+ ['stdbool.h'],
+]
+
+check_funcs = [
+ ['atexit'],
+ ['mprotect'],
+ ['sysconf'],
+ ['getpagesize'],
+ ['mmap'],
+ ['isatty'],
+ ['roundf'],
+]
+
+freetype_dep = dependency('freetype2', required: false)
+
+if not freetype_dep.found() and cpp.get_id() == 'msvc'
+ if cpp.has_header('ft2build.h')
+ freetype_dep = cpp.find_library('freetype', required: false)
+ endif
+endif
+
+if not freetype_dep.found() and get_option('freetype').enabled()
+ freetype_dep = dependency('freetype2', fallback: ['freetype2', 'freetype_dep'])
+endif
+
+glib_dep = dependency('glib-2.0', required: get_option('glib'),
+ fallback: ['glib', 'libglib_dep'])
+gobject_dep = dependency('gobject-2.0', required: get_option('gobject'),
+ fallback: ['glib', 'libgobject_dep'])
+cairo_dep = dependency('cairo', required: false)
+fontconfig_dep = dependency('fontconfig', required: get_option('fontconfig'),
+ fallback: ['fontconfig', 'fontconfig_dep'])
+graphite2_dep = dependency('graphite2', required: get_option('graphite'))
+icu_dep = dependency('icu-uc', required: false)
+m_dep = cpp.find_library('m', required: false)
+
+if not icu_dep.found() and get_option('icu').enabled()
+ icu_dep = dependency('icu-uc', required: cpp.get_id() != 'msvc')
+endif
+
+if not icu_dep.found() and cpp.get_id() == 'msvc'
+ if cpp.has_header('unicode/uchar.h') and \
+ cpp.has_header('unicode/unorm2.h') and \
+ cpp.has_header('unicode/ustring.h') and \
+ cpp.has_header('unicode/utf16.h') and \
+ cpp.has_header('unicode/uversion.h') and \
+ cpp.has_header('unicode/uscript.h')
+ if get_option('buildtype') == 'debug'
+ icu_dep = cpp.find_library('icuucd', required: get_option('icu'))
+ else
+ icu_dep = cpp.find_library('icuuc', required: get_option('icu'))
+ endif
+ else
+ if get_option('icu').enabled()
+ error('ICU headers and libraries must be present to build ICU support')
+ endif
+ endif
+endif
+
+if not cairo_dep.found() and cpp.get_id() == 'msvc'
+ if cpp.has_header('cairo.h')
+ cairo_dep = cpp.find_library('cairo')
+ endif
+endif
+
+if not cairo_dep.found() and get_option('cairo').enabled()
+ cairo_dep = dependency('cairo', fallback: ['cairo', 'libcairo_dep'])
+endif
+
+# Ensure that cairo-ft is fetched from the same library as cairo itself
+if cairo_dep.found()
+ if cairo_dep.type_name() == 'pkgconfig'
+ cairo_ft_dep = dependency('cairo-ft', required: get_option('cairo'))
+ else
+ if cpp.has_header('cairo-ft.h') and \
+ cpp.has_function('cairo_ft_font_face_create_for_ft_face', dependencies: cairo_dep)
+ cairo_ft_dep = cairo_dep
+ endif
+ endif
+else
+ # Not-found dependency
+ cairo_ft_dep = dependency('', required: false)
+endif
+
+deps = []
+
+conf = configuration_data()
+incconfig = include_directories('.')
+
+add_project_arguments('-DHAVE_CONFIG_H', language: ['c', 'cpp'])
+
+warn_cflags = [
+ '-Wno-non-virtual-dtor',
+]
+
+cpp_args = cpp.get_supported_arguments(warn_cflags)
+
+if m_dep.found()
+ deps += [m_dep]
+endif
+
+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)
+endif
+
+if get_option('icu-builtin')
+ conf.set('HAVE_ICU_BUILTIN', 1)
+endif
+
+if get_option('experimental-api')
+ conf.set('HB_EXPERIMENTAL_API', 1)
+endif
+
+if freetype_dep.found()
+ conf.set('HAVE_FREETYPE', 1)
+ deps += [freetype_dep]
+ check_freetype_funcs = [
+ ['FT_Get_Var_Blend_Coordinates', {'deps': freetype_dep}],
+ ['FT_Set_Var_Blend_Coordinates', {'deps': freetype_dep}],
+ ['FT_Done_MM_Var', {'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
+
+# GDI (uniscribe) (windows)
+if host_machine.system() == 'windows' and not get_option('gdi').disabled()
+ # TODO: make nicer once we have https://github.com/mesonbuild/meson/issues/3940
+ if cpp.has_header('usp10.h') and cpp.has_header('windows.h')
+ foreach usplib : ['usp10', 'gdi32', 'rpcrt4']
+ deps += [cpp.find_library(usplib, required: true)]
+ endforeach
+ conf.set('HAVE_UNISCRIBE', 1)
+ conf.set('HAVE_GDI', 1)
+ elif get_option('gdi').enabled()
+ error('gdi was enabled explicitly, but some required headers are missing.')
+ endif
+endif
+
+# DirectWrite (windows)
+if host_machine.system() == 'windows' and not get_option('directwrite').disabled()
+ if cpp.has_header('dwrite_1.h')
+ deps += [cpp.find_library('dwrite', required: true)]
+ conf.set('HAVE_DIRECTWRITE', 1)
+ elif get_option('directwrite').enabled()
+ error('DirectWrite was enabled explicitly, but required header is missing.')
+ endif
+endif
+
+# CoreText (macOS) - FIXME: untested
+if host_machine.system() == 'darwin' and not get_option('coretext').disabled()
+ app_services_dep = dependency('appleframeworks', modules : ['ApplicationServices'], required: false)
+ if cpp.has_type('CTFontRef', prefix: '#include <ApplicationServices/ApplicationServices.h>', dependencies: app_services_dep)
+ deps += [app_services_dep]
+ conf.set('HAVE_CORETEXT', 1)
+ # On iOS CoreText and CoreGraphics are stand-alone frameworks
+ # Check for a different symbol to avoid getting cached result
+ else
+ coretext_dep = dependency('appleframeworks', modules : ['CoreText'], required: false)
+ coregraphics_dep = dependency('appleframeworks', modules : ['CoreGraphics'], required: false)
+ corefoundation_dep = dependency('appleframeworks', modules : ['CoreFoundation'], required: false)
+ if cpp.has_type('CTRunRef', prefix: '#include <CoreText/CoreText.h>', dependencies: [coretext_dep, coregraphics_dep, corefoundation_dep])
+ deps += [coretext_dep, coregraphics_dep, corefoundation_dep]
+ conf.set('HAVE_CORETEXT', 1)
+ elif get_option('coretext').enabled()
+ error('CoreText was enabled explicitly, but required headers or frameworks are missing.')
+ endif
+ endif
+endif
+
+# threads
+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', 1)
+conf.set('HAVE_FALLBACK', 1)
+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.get(1, {})
+ link_withs = opts.get('link_with', [])
+ check_deps = opts.get('deps', [])
+ extra_deps = []
+ found = true
+
+ # First try without linking
+
+ found = cpp.has_function(name, dependencies: check_deps)
+
+ 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: check_deps + extra_deps)
+ endif
+ endif
+
+ if found
+ deps += extra_deps
+ conf.set('HAVE_@0@'.format(name.to_upper()), 1)
+ endif
+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')
+
+if not get_option('tests').disabled()
+ subdir('test')
+endif
+
+configure_file(output: 'config.h', configuration: conf)