libcruft-util/meson.build

723 lines
16 KiB
Meson

project('cruft', 'cpp')
pymod = import('python')
python = pymod.find_installation('python3')
ragel = generator(
find_program('ragel'),
output: '@BASENAME@.cpp',
arguments: [ '@INPUT@', '-o@OUTPUT@', '-G2' ]
)
if host_machine.endian() == 'big'
add_project_arguments('-DWORDS_BIGENDIAN')
endif
add_project_arguments('-std=c++2a', language: 'cpp')
add_project_link_arguments('-lstdc++fs', language: 'cpp')
add_project_arguments('-Drestrict=__restrict', language: 'cpp')
sources = [
ragel.process('uri.cpp.rl'),
ragel.process('version.cpp.rl'),
ragel.process('format.cpp.rl'),
ragel.process('time/parse8601.cpp.rl'),
]
dependencies = [
dependency('threads')
]
### Preemptively define an identity panic macro so that TCL doens't fuck us over
### by renaming a commonly used symbol.
add_project_arguments('-Dpanic=panic', language: 'cpp')
#################################################################################
cpp = meson.get_compiler('cpp')
execinfo = cpp.find_library('execinfo', required: false) # sym:backtrace
dbghelp = cpp.find_library('dbghelp', required: false) # sym:SymFromAddr
capture_stack_backtrace = cpp.has_function('RtlCaptureStackBackTrace')
if execinfo.found()
sources += 'backtrace_execinfo.cpp'
elif dbghelp.found()
sources += 'backtrace_stackwalk.cpp'
dependencies += dbghelp
else
sources += 'backtrace_null.cpp'
endif
sources += custom_target(
'preprocessor.hpp',
output: 'preprocessor.hpp',
input: 'preprocessor.py',
command: [python, '@INPUT@', '@OUTPUT@', '480'],
)
#################################################################################
### Platform wrappers
systems = {
'linux': 'linux',
'freebsd': 'freebsd',
'windows': 'win32'
}
# TODO: handle missing system
sources += 'exe_@0@.cpp'.format(systems[host_machine.system()])
sources += [
'posix/dir.cpp',
'posix/dir.hpp',
'posix/except.cpp',
'posix/except.hpp',
'posix/fd.cpp',
'posix/fd.hpp',
]
if host_machine.system() == 'linux'
sources += [
'thread/event_futex.cpp',
'thread/flag_futex.cpp',
]
endif
if host_machine.system() != 'windows'
sources += [
'buffer/circular.cpp',
'buffer/circular.hpp',
'buffer/paged.cpp',
'buffer/paged.hpp',
'memory/system.cpp',
'memory/system.hpp',
'debug_posix.cpp',
'io_posix.cpp',
'io_posix.hpp',
'library_posix.hpp',
'library_posix.cpp',
'posix/fwd.hpp',
'posix/map.cpp',
'posix/map.hpp',
'posix/socket.cpp',
'posix/socket.hpp',
'time_posix.cpp',
]
endif
####-----------------------------------------------------------------------------
if host_machine.system() == 'windows'
sources += [
'debug_win32.cpp',
'exe_win32.cpp',
'io_win32.cpp',
'io_win32.hpp',
'thread/event_win32.cpp',
'library_win32.cpp',
'library_win32.hpp',
'time_win32.cpp',
'win32/windows.hpp',
'win32/except.cpp',
'win32/except.hpp',
'win32/file.cpp',
'win32/file.hpp',
'win32/handle.cpp',
'win32/handle.hpp',
'win32/registry.cpp',
'win32/registry.hpp',
]
dependencies += cpp.find_library('ws2_32')
endif
sources += [
'thread/event.hpp',
'thread/semaphore.hpp',
'thread/flag.hpp',
]
if host_machine.system() == 'linux'
sources += [
'thread/event_futex.cpp',
'thread/event_futex.hpp',
'thread/semaphore_linux.hpp',
'thread/semaphore_linux.cpp',
'thread/flag_futex.cpp',
'thread/flag_futex.hpp',
]
elif host_name.system() == 'windows'
sources += [
'thread/event_std.cpp',
'thread/event_std.hpp',
'thread/semaphore_win32.hpp',
'thread/semaphore_win32.cpp',
'thread/flag_std.cpp',
'thread/flag_std.hpp',
]
else
error('Unknown platform for threading')
endif
if host_machine.cpu_family() == 'x86_64'
sources += [
'cpuid/x86.cpp',
'cpuid/x86.cpp',
]
else
warning('Unknown architecture @0@. Defaulting to null cpuid'.format(host_machine.cpu_family()))
sources += [
'cpuid/none.cpp',
'cpuid/none.hpp',
]
endif
if host_machine.system() == 'linux'
sources += [
'rand/system_linux.cpp',
'rand/system_linux.hpp',
]
elif host_machine.system() == 'windows'
sources += [
'rand/system_win32.cpp',
'rand/system_win32.hpp',
]
else
error('Unsupported system for rand')
endif
if host_machine.system() == 'linux'
sources += [ 'sysinfo_posix.cpp' ]
elif host_machine.system() == 'windows'
sources += [ 'sysinfo_win32.cpp' ]
else
error('Unsupported system for sysinfo')
endif
#################################################################################
### Common files
sources += [
'adapter.hpp',
'adapter.cpp',
'algo/search.hpp',
'algo/sort.cpp',
'algo/sort.hpp',
'alloc/fwd.hpp',
'alloc/affix.cpp',
'alloc/affix.hpp',
'alloc/aligned/direct.hpp',
'alloc/aligned/foreign.hpp',
'alloc/allocator.cpp',
'alloc/allocator.hpp',
'alloc/easy.hpp',
'alloc/fallback.cpp',
'alloc/fallback.hpp',
'alloc/linear.cpp',
'alloc/linear.hpp',
'alloc/malloc.cpp',
'alloc/malloc.hpp',
'alloc/null.cpp',
'alloc/null.hpp',
'alloc/stack.cpp',
'alloc/stack.hpp',
'alloc/std.hpp',
'alloc/traits.hpp',
'alloc/traits.hpp',
'annotation.hpp',
'array/darray.hpp',
'array/sarray.cpp',
'array/sarray.hpp',
'array/parray.cpp',
'array/parray.hpp',
'array/varray.hpp',
'ascii.hpp',
'backtrace.hpp',
'bezier.cpp',
'bezier1.cpp',
'bezier2.cpp',
'bezier3.cpp',
'bezier.hpp',
'bitwise.cpp',
'bitwise.hpp',
'buffer/simple.cpp',
'buffer/simple.hpp',
'buffer/traits.hpp',
'cast.hpp',
'cmdopt.cpp',
'cmdopt.hpp',
'colour.cpp',
'colour.hpp',
'coord.hpp',
'coord/fwd.hpp',
'coord/base.hpp',
'coord/comparator.hpp',
'coord/init.hpp',
'coord/iostream.hpp',
'coord/ops.hpp',
'coord/store.hpp',
'coord/traits.hpp',
'cpp.cpp',
'cpp.hpp',
'cpuid.cpp',
'cpuid.hpp',
'debug/assert.cpp',
'debug/assert.hpp',
'debug/compiler.cpp',
'debug/compiler.hpp',
'debug/debugger.cpp',
'debug/debugger.hpp',
'debug/panic.cpp',
'debug/panic.hpp',
'debug/system.cpp',
'debug/system.hpp',
'debug/validate.cpp',
'debug/validate.hpp',
'encode/number.hpp',
'encode/base.cpp',
'encode/base.hpp',
'endian.cpp',
'endian.hpp',
'except.cpp',
'except.hpp',
'exe.hpp',
'expected.hpp',
'extent.cpp',
'extent.hpp',
'fixed.cpp',
'fixed.hpp',
'float.cpp',
'float.hpp',
'format.hpp',
'fourcc.cpp',
'fourcc.hpp',
'functor.hpp',
'geom/fwd.hpp',
'geom/aabb.cpp',
'geom/aabb.hpp',
'geom/cylinder.cpp',
'geom/cylinder.hpp',
'geom/ellipse.cpp',
'geom/ellipse.hpp',
'geom/frustum.cpp',
'geom/frustum.hpp',
'geom/iostream.cpp',
'geom/iostream.hpp',
'geom/line.hpp',
'geom/line.cpp',
'geom/ops.cpp',
'geom/ops.hpp',
'geom/plane.cpp',
'geom/plane.hpp',
'geom/ray.cpp',
'geom/ray.hpp',
'geom/rect.cpp',
'geom/rect.hpp',
'geom/sample/fwd.hpp',
'geom/sample/surface.hpp',
'geom/sample/volume.hpp',
'geom/segment.cpp',
'geom/segment.hpp',
'geom/sphere.cpp',
'geom/sphere.hpp',
'geom/tri.cpp',
'geom/tri.hpp',
'hash.hpp',
'hash/fwd.hpp',
'hash/adler.cpp',
'hash/adler.hpp',
'hash/buzhash.hpp',
'hash/bsdsum.cpp',
'hash/bsdsum.hpp',
'hash/crc.cpp',
'hash/crc.hpp',
'hash/fasthash.cpp',
'hash/fasthash.hpp',
'hash/fletcher.cpp',
'hash/fletcher.hpp',
'hash/fnv1a.cpp',
'hash/fnv1a.hpp',
'hash/murmur/common.cpp',
'hash/murmur/common.hpp',
'hash/murmur.hpp',
'hash/murmur/murmur1.cpp',
'hash/murmur/murmur1.hpp',
'hash/murmur/murmur2.cpp',
'hash/murmur/murmur2.hpp',
'hash/murmur/murmur3.cpp',
'hash/murmur/murmur3.hpp',
'hash/siphash.cpp',
'hash/siphash.hpp',
'hash/table.cpp',
'hash/table.hpp',
'hash/wang.hpp',
'hash/xxhash.cpp',
'hash/xxhash.hpp',
'introspection.cpp',
'introspection.hpp',
'io.cpp',
'io.hpp',
'iterator/constant.hpp',
'iterator/counting.hpp',
'iterator/dereference.hpp',
'iterator/discard.hpp',
'iterator/indices.hpp',
'iterator/infix.hpp',
'iterator/iota.hpp',
'iterator/numeric.hpp',
'iterator/referencing.hpp',
'iterator/transform.hpp',
'iterator/unequal.hpp',
'iterator/zip.hpp',
'job/fwd.hpp',
'job/dispatch.hpp',
'job/queue.cpp',
'job/queue.hpp',
'kmeans.hpp',
'library.hpp',
'log.cpp',
'log.hpp',
'map/fixed.cpp',
'map/fixed.hpp',
'maths.cpp',
'maths.hpp',
'maths/fast.hpp',
'matrix.cpp',
'matrix2.cpp',
'matrix3.cpp',
'matrix4.cpp',
'matrix.hpp',
'memory/deleter.cpp',
'memory/deleter.hpp',
'parallel/queue.cpp',
'parallel/queue.hpp',
'parallel/stack.cpp',
'parallel/stack.hpp',
'parse/fwd.hpp',
'parse/enum.cpp',
'parse/enum.hpp',
'parse/time.cpp',
'parse/time.hpp',
'parse/value.cpp',
'parse/value.hpp',
'parse/si.cpp',
'parse/si.hpp',
'platform.hpp',
'point.cpp',
'point.hpp',
'pointer.hpp',
'polynomial.cpp',
'polynomial.hpp',
'pool.cpp',
'pool.hpp',
'quaternion.cpp',
'quaternion.hpp',
'rand/lcg.cpp',
'rand/lcg.hpp',
'rand/xorshift.cpp',
'rand/xorshift.hpp',
'rand/mwc64x.cpp',
'rand/mwc64x.hpp',
'rand/pcg.cpp',
'rand/pcg.hpp',
'rand/rdrand.cpp',
'rand/rdrand.hpp',
'rand/system.hpp',
'random.cpp',
'random.hpp',
'range.cpp',
'range.hpp',
'rational.cpp',
'rational.hpp',
'region.cpp',
'region.hpp',
'registrar.cpp',
'registrar.hpp',
'roots/bisection.hpp',
'scoped.hpp',
'signal.cpp',
'signal.hpp',
'singleton.hpp',
'stats.cpp',
'stats.hpp',
'std.hpp',
'stream.cpp',
'stream.hpp',
'string.cpp',
'string.hpp',
'stringid.cpp',
'stringid.hpp',
'strongdef.cpp',
'strongdef.hpp',
'sysinfo.hpp',
'tap.cpp',
'tap.hpp',
'term.cpp',
'term.hpp',
'thread/event.hpp',
'thread/flag.hpp',
'thread/monitor.cpp',
'thread/monitor.hpp',
'thread/ticketlock.cpp',
'thread/ticketlock.hpp',
'thread/spinlock.cpp',
'thread/spinlock.hpp',
'time.cpp',
'time.hpp',
'time/parse.hpp',
'tuple/index.hpp',
'tuple/type.hpp',
'tuple/value.hpp',
'typeidx.cpp',
'typeidx.hpp',
'types.hpp',
'types/bits.hpp',
'types/comparator.hpp',
'types/description.cpp',
'types/description.hpp',
'types/dispatch.hpp',
'types/string.cpp',
'types/string.hpp',
'types/tagged.hpp',
'types/traits.hpp',
'uri.hpp',
'utf8.cpp',
'utf8.hpp',
'variadic.cpp',
'variadic.hpp',
'vector.cpp',
'vector.hpp',
'version.hpp',
'view.cpp',
'view.hpp',
]
if get_option('simd')
sources += [
'coord/simd.cpp',
'coord/simd.hpp',
'coord/simd_sse.hpp',
'coord/simd_neon.hpp',
]
endif
#################################################################################
rt = cpp.find_library('rt', required: false)
if not cpp.has_function('shm_open', dependencies: [rt])
error('Cannot find shm library')
endif
dependencies += rt
dl = cpp.find_library('dl', required: false)
if not cpp.has_function('dlopen', dependencies: dl)
error ('Cannot find dl library')
endif
dependencies += dl
if not cpp.has_function('clock_gettime', dependencies: rt)
error('Cannot find clock_gettime library')
endif
m = cpp.find_library('m', required: false)
if not cpp.has_function('cos', dependencies: m)
error('Cannot find maths library')
endif
dependencies += m
libcruft = library('cruft', sources, dependencies: dependencies)
libcruft_dep = declare_dependency(
include_directories: include_directories('.'),
link_with: libcruft
)
#################################################################################
foreach tool: ['cpuid', 'poisson', 'macro', 'scratch']
executable(tool, 'tools/@0@.cpp'.format(tool), link_with: libcruft)
endforeach
#################################################################################
tests = [
'ascii',
'algo/search',
'algo/sort',
'alloc/aligned/foreign',
'alloc/aligned/direct',
'alloc/easy',
'alloc/linear',
'alloc/stack',
'affine',
'array/darray',
'array/sarray',
'array/parray',
'backtrace',
'bezier',
'bitwise',
'buffer/simple',
'cmdopt',
'colour',
'comparator',
'coord',
'encode/number',
'encode/base',
'endian',
'exe',
'expected',
'extent',
'fixed',
'float',
'format',
'geom/aabb',
'geom/ellipse',
'geom/frustum',
'geom/line',
'geom/plane',
'geom/ray',
'geom/segment',
'geom/sphere',
'hash/buzhash',
'hash/checksum',
'hash/crc',
'hash/fasthash',
'hash/fnv1a',
'hash/murmur',
'hash/siphash',
'hash/table',
'hash/xxhash',
'hton',
'io',
'introspection',
'iterator',
'job/dispatch',
'job/queue',
'kmeans',
'map/fixed',
'maths',
'maths/fast',
'matrix',
'memory/deleter',
'parallel/queue',
'parallel/stack',
'parse/enum',
'parse/value',
'parse/time',
'parse/si',
'point',
'polynomial',
'pool',
'preprocessor',
'quaternion',
'rand/buckets',
'random',
'range',
'rational',
'region',
'registrar',
'roots/bisection',
'scoped',
'signal',
'singleton',
'stream',
'string',
'stringid',
'strongdef',
'thread/event',
'thread/flag',
'thread/monitor',
'thread/semaphore',
'thread/spinlock',
'thread/ticketlock',
'time/8601',
'traits',
'tuple/index',
'tuple/value',
'tuple/type',
'typeidx',
'types/description',
'types/tagged',
'uri',
'utf8',
'vector',
'version',
'view',
]
if host_machine.system() != 'windows'
tests += [
'buffer/circular',
'buffer/paged',
]
endif
if get_option('simd')
tests += [
'coord/simd'
]
endif
foreach t: tests
test(
t.underscorify(),
executable(
'test_@0@'.format(t.underscorify()),
'test/@0@.cpp'.format(t),
link_with: libcruft,
dependencies: dependencies
),
protocol: 'tap'
)
endforeach
##
## configure_file (test/cpp.py.in util_test_cpp.py @ONLY)
## add_test (NAME util_test_cpp COMMAND ${PYTHON_EXECUTABLE} util_test_cpp.py)
## set_property (TEST util_test_cpp APPEND PROPERTY DEPENDS util_macro)
## set_tests_properties(util_test_cpp PROPERTIES FAIL_REGULAR_EXPRESSION "not ok -")
##endif ()
##
##
#################################################################################
cmake_config = configuration_data()
pkg = import('pkgconfig')
pkg.generate(
libraries: dependencies,
version: meson.project_version(),
name: meson.project_name(),
filebase: 'cruft',
description: 'A simple utility library for C++'
)
configure_file(
input: 'Doxyfile.in',
output: 'Doxyfile',
configuration: {
'CMAKE_PROJECT_NAME': meson.project_name(),
'CMAKE_PROJECT_VERSION': meson.project_version(),
'CMAKE_CURRENT_SOURCE_DIR': meson.current_source_dir(),
'CMAKE_CURRENT_BINARY_DIR': meson.current_build_dir(),
}
)