summaryrefslogtreecommitdiffstats
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build407
1 files changed, 407 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..2f79065
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,407 @@
+project(
+ 'libass',
+ 'c',
+ license: 'ISC',
+ meson_version: '>= 0.64.0',
+ default_options: [
+ 'c_std=c99',
+ 'buildtype=debugoptimized',
+ 'warning_level=2',
+ 'default_library=static',
+ ],
+ version: '0.17.1',
+)
+
+conf = configuration_data()
+deps = []
+test_deps = []
+
+host_system = host_machine.system()
+
+# Compiler setup
+
+cc = meson.get_compiler('c')
+
+cc_warnings = []
+cc_features = []
+
+if cc.get_id() != 'msvc'
+ cc_features += '-D_POSIX_C_SOURCE=200809L'
+endif
+
+if cc.get_argument_syntax() == 'gcc'
+ cc_warnings += [
+ '-Wno-sign-compare',
+ '-Wno-unused-parameter',
+ '-Werror-implicit-function-declaration',
+ '-Wstrict-prototypes',
+ '-Wpointer-arith',
+ '-Wredundant-decls',
+ '-Wno-missing-field-initializers',
+ ]
+endif
+
+add_project_arguments(
+ cc.get_supported_arguments(cc_warnings + cc_features),
+ language: 'c',
+)
+
+# Configuration
+
+str_check_functions = ['strdup', 'strndup']
+
+foreach name : str_check_functions
+ if (
+ cc.has_function(name)
+ and cc.has_header_symbol('string.h', name, args: cc_features)
+ )
+ conf.set('HAVE_@0@'.format(name.to_upper()), 1)
+ endif
+endforeach
+
+if (
+ cc.has_function('fstat')
+ and cc.has_header_symbol(
+ 'sys/stat.h',
+ 'fstat',
+ args: cc_features,
+ prefix: '#include <sys/types.h>',
+ )
+)
+ conf.set('HAVE_FSTAT', 1)
+endif
+
+# Dependencies
+
+deps += cc.find_library('m', required: false)
+
+iconv_dep = dependency('iconv', required: false)
+if iconv_dep.found()
+ deps += iconv_dep
+ conf.set('CONFIG_ICONV', 1)
+endif
+
+freetype_dep = dependency(
+ 'freetype2',
+ version: '>= 9.17.3',
+ default_options: ['harfbuzz=disabled'],
+)
+if freetype_dep.found()
+ deps += freetype_dep
+ conf.set('CONFIG_FREETYPE', 1)
+endif
+
+fribidi_dep = dependency(
+ 'fribidi',
+ version: '>= 0.19.1',
+ default_options: ['docs=false', 'tests=false'],
+)
+if fribidi_dep.found()
+ deps += fribidi_dep
+ conf.set('CONFIG_FRIBIDI', 1)
+endif
+
+harfbuzz_options = [
+ 'tests=disabled',
+ 'cairo=disabled',
+ 'gobject=disabled',
+ 'glib=disabled',
+ 'freetype=disabled',
+]
+harfbuzz_dep = dependency(
+ 'harfbuzz',
+ version: '>= 1.2.3',
+ default_options: harfbuzz_options,
+)
+if harfbuzz_dep.found()
+ deps += harfbuzz_dep
+ conf.set('CONFIG_HARFBUZZ', 1)
+endif
+
+libunibreak_dep = dependency(
+ 'libunibreak',
+ version: '>= 1.1',
+ required: get_option('libunibreak'),
+)
+if libunibreak_dep.found()
+ deps += libunibreak_dep
+ conf.set('CONFIG_UNIBREAK', 1)
+endif
+
+if get_option('test')
+ test_deps += dependency('libpng', version: '>= 1.2.0')
+ conf.set('CONFIG_LIBPNG', 1)
+endif
+
+font_providers = []
+
+fontconfig_dep = dependency(
+ 'fontconfig',
+ version: '>= 2.10.92',
+ required: get_option('fontconfig'),
+)
+fontconfig = fontconfig_dep.found()
+if fontconfig
+ deps += fontconfig_dep
+ conf.set('CONFIG_FONTCONFIG', 1)
+ font_providers += ['Fontconfig']
+endif
+
+# CoreText
+coretext = false
+if not get_option('coretext').disabled()
+ appservices_dep = dependency(
+ 'appleframeworks',
+ modules: ['ApplicationServices', 'CoreFoundation'],
+ required: false,
+ )
+ # this intentionally includes a leading newline
+ coretext_check = '''
+ int main(void) {
+ CTFontDescriptorCopyAttribute(NULL, kCTFontNameAttribute);
+ return 0;
+ }
+ '''
+ appservices_snippet = (
+ '#include <ApplicationServices/ApplicationServices.h>' + coretext_check
+ )
+
+ if appservices_dep.found() and cc.compiles(appservices_snippet)
+ deps += appservices_dep
+ conf.set('CONFIG_CORETEXT', 1)
+ coretext = true
+ font_providers += ['CoreText']
+ else
+ coretext_dep = dependency(
+ 'appleframeworks',
+ modules: ['CoreText', 'CoreFoundation'],
+ required: false,
+ )
+ coretext_snippet = '#include <CoreText/CoreText.h>' + coretext_check
+ if coretext_dep.found() and cc.compiles(coretext_snippet)
+ deps += coretext_dep
+ conf.set('CONFIG_CORETEXT', 1)
+ coretext = true
+ font_providers += ['CoreText']
+ endif
+ endif
+endif
+
+# DirectWrite
+directwrite = false
+if not get_option('directwrite').disabled()
+ if cc.has_header('windows.h', required: false)
+ directwrite = true
+ conf.set('CONFIG_DIRECTWRITE', 1)
+ code = '''#include <windows.h>
+ #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+ #error Win32 desktop APIs are available
+ #endif'''
+ if cc.compiles(code)
+ # WinRT/UWP/app build: GDI and LoadLibrary are unavailable,
+ # but DirectWrite is always present
+ deps += cc.find_library('dwrite', required: true)
+ font_providers += ['DirectWrite (WinRT/UWP)']
+ else
+ # Win32/desktop build: GDI is always present;
+ # DirectWrite is optional but can be loaded via LoadLibrary
+ deps += cc.find_library('gdi32', required: true)
+ font_providers += ['DirectWrite and GDI (Win32)']
+ endif
+ endif
+endif
+
+if get_option('directwrite').enabled() and directwrite == false
+ error(
+ 'DirectWrite support was requested, but it was not found.',
+ )
+endif
+
+if get_option('coretext').enabled() and coretext == false
+ error(
+ 'CoreText support was requested, but it was not found.',
+ )
+endif
+
+if get_option('require-system-font-provider')
+ if font_providers.length() == 0
+ error(
+ 'Either DirectWrite (on Windows), CoreText (on OSX), or Fontconfig (Linux, ' +
+ 'other) is required. If you really want to compile without a system font ' +
+ 'provider, set -Drequire-system-font-provider=false',
+ )
+ endif
+else
+ if font_providers.length() == 0
+ font_providers += 'none'
+ endif
+endif
+
+# ASM
+enable_asm = false
+# used in libass/meson.build
+asm_is_nasm = false
+asm_args = []
+
+# ASM architecture variables
+asm_option = get_option('asm')
+cpu_subfamily = host_machine.cpu_family()
+if cpu_subfamily.startswith('x86')
+ cpu_family = 'x86'
+else
+ cpu_family = cpu_subfamily
+endif
+
+if not asm_option.disabled()
+ if cpu_family == 'x86'
+ asm_is_nasm = add_languages(
+ 'nasm',
+ required: false,
+ native: false,
+ )
+ if not asm_is_nasm
+ warning(
+ 'nasm was not found; ASM functions are disabled. Install nasm ' +
+ '>= 2.10 for a significantly faster libass build.',
+ )
+ else
+ nasm_ver = meson.get_compiler('nasm').version()
+ if nasm_ver.version_compare('< 2.10')
+ warning(
+ 'nasm is too old (found @0@); ASM functions are disabled. '.format(
+ nasm_ver,
+ ) + 'Install nasm >= 2.10 for a significantly faster libass build.',
+ )
+ asm_is_nasm = false
+ endif
+ endif
+ enable_asm = asm_is_nasm
+ if enable_asm
+ conf.set('ARCH_X86', 1)
+ nasm_args = ['-Dprivate_prefix=ass', '-DPIC=1']
+
+ if cpu_subfamily == 'x86_64'
+ conf.set('ARCH_X86_64', 1)
+ nasm_args += '-DARCH_X86_64=1'
+ else
+ nasm_args += '-DARCH_X86_64=0'
+ endif
+
+ if host_system in ['windows', 'cygwin']
+ if cpu_subfamily == 'x86'
+ nasm_args += '-DPREFIX'
+ endif
+ elif host_system == 'darwin'
+ nasm_args += ['-DPREFIX', '-DSTACK_ALIGNMENT=16']
+ elif host_system in ['linux', 'sunos', 'haiku', 'gnu']
+ nasm_args += ['-DSTACK_ALIGNMENT=16']
+ elif host_system == 'dragonfly' or host_system.endswith('bsd')
+ nasm_args += []
+ else
+ error(
+ 'Please contact libass upstream to figure out if ASM support ' +
+ 'for your platform can be added. In the meantime you will need ' +
+ 'to use -Dasm=disabled.',
+ )
+ endif
+
+ add_project_arguments(nasm_args, language: 'nasm')
+ endif
+ elif cpu_subfamily == 'aarch64'
+ enable_asm = true
+ conf.set('ARCH_AARCH64', 1)
+ if host_system == 'darwin'
+ asm_args += '-DPREFIX'
+ endif
+ else
+ warning(
+ 'Assembly optimizations are not yet supported for the "@0@" architecture; disabling.'.format(
+ cpu_subfamily,
+ ),
+ )
+ endif
+
+ if enable_asm
+ conf.set('CONFIG_ASM', 1)
+ elif asm_option.enabled()
+ error(
+ 'Assembly was requested, but cannot be built; see prior messages.',
+ )
+ endif
+endif
+
+conf.set('CONFIG_LARGE_TILES', get_option('large-tiles').to_int())
+
+conf.set('CONFIG_SOURCEVERSION', '"meson, commit: @VCS_TAG@"')
+
+config_h_in = configure_file(output: 'config.h.in.in', configuration: conf)
+
+config_h_intermediate = vcs_tag(
+ command: [
+ 'git',
+ 'describe',
+ '--tags',
+ '--long',
+ '--always',
+ '--broken',
+ '--abbrev=40',
+ ],
+ fallback: '@VCS_TAG_FALLBACK@',
+ input: config_h_in,
+ output: 'config.h.in',
+)
+
+# Fallback command for older git versions (< 2.13.0) that don't support --broken
+config_h = vcs_tag(
+ command: [
+ 'git',
+ 'describe',
+ '--tags',
+ '--long',
+ '--always',
+ '--dirty',
+ '--abbrev=40',
+ ],
+ replace_string: '@VCS_TAG_FALLBACK@',
+ fallback: 'failed to determine (>= @0@)'.format(meson.project_version()),
+ input: config_h_intermediate,
+ output: 'config.h',
+)
+
+incs = include_directories('.', 'libass')
+
+subdir('libass')
+
+default_library = get_option('default_library')
+
+if default_library == 'both'
+ libass_for_tools = libass.get_static_lib()
+else
+ libass_for_tools = libass
+endif
+
+if get_option('test')
+ subdir('test')
+endif
+if get_option('profile')
+ subdir('profile')
+endif
+
+# libass.pc
+pkg = import('pkgconfig')
+pkg.generate(
+ libass,
+ name: 'libass',
+ description: 'libass is an SSA/ASS subtitles rendering library',
+)
+# `libass_dep` comes from subdir('libass')
+meson.override_dependency('libass', libass_dep)
+
+if default_library != 'static' and host_system != 'windows'
+ warning(
+ 'this build does not properly support symbol visibility and the resulting shared lib is not suitable for distribution!',
+ )
+endif
+
+summary('Font providers', font_providers)
+summary('ASM optimizations', enable_asm, bool_yn: true)