blob: 4d9eecc335a7eaabc7dd2f4df9f1ab67ff3d497e [file] [log] [blame]
project('ots', 'c', 'cpp',
version: '8.1.2',
default_options : ['cpp_std=c++11', 'default_library=static'],
)
cxx = meson.get_compiler('cpp')
conf = configuration_data()
conf.set_quoted('PACKAGE', meson.project_name())
conf.set_quoted('VERSION', meson.project_version())
if get_option('debug')
conf.set('OTS_DEBUG', 1)
endif
if get_option('graphite')
conf.set('OTS_GRAPHITE', 1)
endif
freetype = dependency('freetype2', required: false)
if freetype.found()
conf.set('HAVE_FREETYPE', 1)
endif
coretext = dependency('appleframeworks', modules: 'applicationservices',
required: false)
if coretext.found()
conf.set('HAVE_CORETEXT', 1)
endif
gdi32 = cxx.find_library('gdi32', required: false)
if gdi32.found()
conf.set('HAVE_WIN32', 1)
endif
configure_file(output: 'config.h',
configuration: conf)
brotli_c_args = []
if 'undefined' in get_option('b_sanitize').split(',')
# brotli depends on undefined behavior otherwise.
brotli_c_args += '-DBROTLI_BUILD_PORTABLE'
endif
brotli_includes = ['third_party/brotli/c/include']
libbrotli = library('brotli',
'third_party/brotli/c/common/constants.h',
'third_party/brotli/c/common/dictionary.c',
'third_party/brotli/c/common/dictionary.h',
'third_party/brotli/c/common/transform.c',
'third_party/brotli/c/common/transform.h',
'third_party/brotli/c/common/version.h',
'third_party/brotli/c/dec/bit_reader.c',
'third_party/brotli/c/dec/bit_reader.h',
'third_party/brotli/c/dec/decode.c',
'third_party/brotli/c/dec/huffman.c',
'third_party/brotli/c/dec/huffman.h',
'third_party/brotli/c/dec/prefix.h',
'third_party/brotli/c/dec/state.c',
'third_party/brotli/c/dec/state.h',
'third_party/brotli/c/include/brotli/decode.h',
'third_party/brotli/c/include/brotli/port.h',
'third_party/brotli/c/include/brotli/types.h',
include_directories: include_directories(brotli_includes),
c_args: brotli_c_args,
)
woff2_cpp_args = []
if 'undefined' in get_option('b_sanitize').split(',')
# XXX Horrible hack XXX
# woff2 depends on undefined behavior otherwise.
woff2_cpp_args += '-U__BYTE_ORDER__'
endif
woff2_includes = ['third_party/brotli/c/include', 'third_party/woff2/include']
libwoff2 = library('woff2',
'third_party/woff2/include/woff2/decode.h',
'third_party/woff2/include/woff2/output.h',
'third_party/woff2/src/buffer.h',
'third_party/woff2/src/port.h',
'third_party/woff2/src/round.h',
'third_party/woff2/src/store_bytes.h',
'third_party/woff2/src/table_tags.cc',
'third_party/woff2/src/table_tags.h',
'third_party/woff2/src/variable_length.cc',
'third_party/woff2/src/variable_length.h',
'third_party/woff2/src/woff2_common.cc',
'third_party/woff2/src/woff2_common.h',
'third_party/woff2/src/woff2_dec.cc',
'third_party/woff2/src/woff2_out.cc',
include_directories: include_directories(woff2_includes),
cpp_args: woff2_cpp_args,
)
ots_includes = [
'include',
'third_party/woff2/include',
]
ots_sources = [
'src/avar.cc',
'src/avar.h',
'src/cff.cc',
'src/cff.h',
'src/cff_charstring.cc',
'src/cff_charstring.h',
'src/cmap.cc',
'src/cmap.h',
'src/cvar.cc',
'src/cvar.h',
'src/cvt.cc',
'src/cvt.h',
'src/fpgm.cc',
'src/fpgm.h',
'src/fvar.cc',
'src/fvar.h',
'src/gasp.cc',
'src/gasp.h',
'src/gdef.cc',
'src/gdef.h',
'src/glyf.cc',
'src/glyf.h',
'src/gpos.cc',
'src/gpos.h',
'src/gsub.cc',
'src/gsub.h',
'src/gvar.cc',
'src/gvar.h',
'src/hdmx.cc',
'src/hdmx.h',
'src/head.cc',
'src/head.h',
'src/hhea.cc',
'src/hhea.h',
'src/hmtx.h',
'src/hvar.cc',
'src/hvar.h',
'src/kern.cc',
'src/kern.h',
'src/layout.cc',
'src/layout.h',
'src/loca.cc',
'src/loca.h',
'src/ltsh.cc',
'src/ltsh.h',
'src/math.cc',
'src/math_.h',
'src/maxp.cc',
'src/maxp.h',
'src/metrics.cc',
'src/metrics.h',
'src/mvar.cc',
'src/mvar.h',
'src/name.cc',
'src/name.h',
'src/os2.cc',
'src/os2.h',
'src/ots.cc',
'src/ots.h',
'src/post.cc',
'src/post.h',
'src/prep.cc',
'src/prep.h',
'src/stat.cc',
'src/stat.h',
'src/variations.cc',
'src/variations.h',
'src/vdmx.cc',
'src/vdmx.h',
'src/vhea.cc',
'src/vhea.h',
'src/vmtx.h',
'src/vorg.cc',
'src/vorg.h',
'src/vvar.cc',
'src/vvar.h',
]
ots_libs = [libbrotli, libwoff2]
if get_option('graphite')
ots_includes += ['third_party/lz4/lib']
ots_sources += [
'src/feat.cc',
'src/feat.h',
'src/glat.cc',
'src/glat.h',
'src/gloc.cc',
'src/gloc.h',
'src/graphite.h',
'src/sile.h',
'src/sile.cc',
'src/silf.h',
'src/silf.cc',
'src/sill.h',
'src/sill.cc',
]
liblz4 = library('lz4',
'third_party/lz4/lib/lz4.c',
'third_party/lz4/lib/lz4.h',
)
ots_libs += [liblz4]
endif
zlib = dependency('zlib', fallback : ['zlib', 'zlib_dep'])
libots = library('ots',
ots_sources,
include_directories: include_directories(ots_includes),
link_with: ots_libs,
cpp_args : '-DHAVE_CONFIG_H',
dependencies: zlib,
)
executable('ots-sanitize',
'util/ots-sanitize.cc',
'util/test-context.h',
include_directories: include_directories('include'),
link_with: libots,
install: true,
)
fuzzer_ldflags = []
fuzzer_defines = []
if get_option('fuzzer_ldflags') != ''
fuzzer_ldflags += get_option('fuzzer_ldflags').split()
fuzzer_defines += ['-DOTS_FUZZER_NO_MAIN']
endif
executable('ots-fuzzer',
'util/ots-fuzzer.cc',
include_directories: include_directories(['include', 'src']),
cpp_args: fuzzer_defines,
link_with: libots,
link_args: fuzzer_ldflags,
)
if freetype.found() or coretext.found() or gdi32.found()
deps = [freetype, gdi32]
if coretext.found()
deps += [coretext]
endif
executable('ots-idempotent',
'util/ots-idempotent.cc',
'util/test-context.h',
include_directories: include_directories('include'),
link_with: libots,
dependencies: deps,
install: true,
)
test_good_fonts = find_program('tests/test_good_fonts.sh')
test('test_good_fonts',
test_good_fonts,
timeout: 9999,
env: [
'top_srcdir=@0@'.format(meson.current_source_dir()),
'top_builddir=@0@'.format(meson.current_build_dir()),
]
)
endif
if freetype.found() or coretext.found()
deps = [freetype]
if coretext.found()
deps += [coretext]
endif
executable('ots-validator-checker',
'util/ots-validator-checker.cc',
include_directories: include_directories('include'),
link_with: libots,
dependencies: deps,
install: true,
)
endif
if freetype.found()
executable('ots-side-by-side',
'util/ots-side-by-side.cc',
include_directories: include_directories('include'),
link_with: libots,
dependencies: freetype,
install: true,
)
endif
if cxx.has_header('sys/time.h')
executable('ots-perf',
'util/ots-perf.cc',
include_directories: include_directories('include'),
link_with: libots,
install: true,
)
endif
install_man('docs/ots-sanitize.1')
gtest = subproject('gtest').get_variable('gtest_main_dep')
cff_charstring = executable('cff_charstring',
'tests/cff_charstring_test.cc',
include_directories: include_directories(['include', 'src']),
link_with: libots,
dependencies: gtest,
)
test('cff_charstring', cff_charstring)
layout_common_table = executable('layout_common_table',
'tests/layout_common_table_test.cc',
include_directories: include_directories(['include', 'src']),
link_with: libots,
dependencies: gtest,
)
test('layout_common_table', layout_common_table)
test('test_bad_fonts',
find_program('tests/test_bad_fonts.sh'),
env: [
'top_srcdir=@0@'.format(meson.current_source_dir()),
'top_builddir=@0@'.format(meson.current_build_dir()),
]
)
test('test_fuzzed_fonts',
find_program('tests/test_fuzzed_fonts.sh'),
timeout: 9999,
env: [
'top_srcdir=@0@'.format(meson.current_source_dir()),
'top_builddir=@0@'.format(meson.current_build_dir()),
]
)