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_global_arguments('-std=c++2a', language: 'cpp') add_global_link_arguments('-lstdc++fs', language: 'cpp') add_global_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 = [] ### Setup a directory to hold built sources we may need to export to clients. ##set (PREFIX "cruft/util") ##file (MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/prefix/${PREFIX}") ##target_include_directories( ## cruft ## PUBLIC ## "${CMAKE_CURRENT_BINARY_DIR}/prefix/" ##) ## ## ### Preemptively define an identity panic macro so that TCL doens't fuck us over ### by renaming a commonly used symbol. ##target_compile_definitions(cruft PUBLIC "-Dpanic=panic") ## ## ################################################################################# 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 ####----------------------------------------------------------------------------- #### We shouldn't be building into the source directory, but I can't stand trying #### to coax CMake into behaving here any longer. Feel free to fix it. ##add_custom_command ( ##OUTPUT ## "${CMAKE_CURRENT_BINARY_DIR}/prefix/${PREFIX}/preprocessor.hpp" ##COMMENT ## "[preprocessor.py] preprocessor.hpp" ##COMMAND ## "${PYTHON_EXECUTABLE}" ## "${CMAKE_CURRENT_SOURCE_DIR}/preprocessor.py" ## "${CMAKE_CURRENT_BINARY_DIR}/prefix/${PREFIX}/preprocessor.hpp" ## 320 ##DEPENDS ## "${CMAKE_CURRENT_SOURCE_DIR}/preprocessor.py" ##) preprocessor_hpp = custom_target( 'preprocessor.hpp', output: 'preprocessor.hpp', input: 'preprocessor.py', command: [python, '@INPUT@', '@OUTPUT@', '320'], ) ################################################################################# ### 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 (WIN32) ## list ( ## APPEND UTIL_FILES ## 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 ## ) ## ## target_link_libraries (cruft 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', ] else error('Unknown platform for threading') endif ##elseif (WIN32) ## list (APPEND UTIL_FILES ## 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 () ## list (APPEND UTIL_FILES ## thread/flag_std.cpp ## thread/flag_std.hpp ## ) ##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', '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/fwd.hpp', 'coord/base.hpp', 'coord.hpp', 'coord/init.hpp', 'coord/iostream.hpp', 'coord/ops.hpp', 'coord/store.hpp', 'coord/traits.hpp', 'cpp.cpp', 'cpp.hpp', 'cpuid.cpp', 'cpuid.hpp', 'cpuid_x86.cpp', 'cpuid_x86.hpp', 'debug.cpp', 'debug.hpp', 'encode/number.hpp', 'encode/base.cpp', 'encode/base.hpp', 'endian.cpp', 'endian.hpp', 'except.cpp', 'except.hpp', 'exe.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/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/wang.hpp', 'hash/xxhash.cpp', 'hash/xxhash.hpp', 'introspection.cpp', 'introspection.hpp', 'io.cpp', 'io.hpp', 'iterator.hpp', 'job/fwd.hpp', 'job/dispatch.hpp', 'job/queue.cpp', 'job/queue.hpp', 'kmeans.hpp', 'library.hpp', 'log.cpp', 'log.hpp', 'maths.cpp', 'maths.hpp', 'maths/fast.hpp', 'matrix.cpp', 'matrix2.cpp', 'matrix3.cpp', 'matrix4.cpp', 'matrix.hpp', 'memory/deleter.cpp', 'memory/deleter.hpp', 'nocopy.hpp', 'parallel/queue.cpp', 'parallel/queue.hpp', 'parse.cpp', 'parse.hpp', 'platform.hpp', 'point.cpp', 'point.hpp', 'pointer.hpp', 'polynomial.cpp', 'polynomial.hpp', 'pool.cpp', 'pool.hpp', #'"${CMAKE_CURRENT_BINARY_DIR}/prefix/${PREFIX}/preprocessor.hpp"', preprocessor_hpp, 'quaternion.cpp', 'quaternion.hpp', 'rand/lcg.cpp', 'rand/lcg.hpp', 'rand/xorshift.cpp', 'rand/xorshift.hpp', 'rand/mwc64x.cpp', 'rand/mwc64x.hpp', 'random.cpp', 'random.hpp', 'range.cpp', 'range.hpp', 'rational.cpp', 'rational.hpp', 'region.cpp', 'region.hpp', 'roots/bisection.hpp', 'scoped.hpp', 'si.cpp', 'signal.cpp', 'signal.hpp', 'si.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', '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/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', ] libcruft = library('cruft', sources) ## ##option (SIMD "enable simd support" OFF) ## ##if (SIM) ## list (APPEND UTIL_FILES ## "coord/simd.cpp" ## "coord/simd.hpp" ## "coord/simd_sse.hpp" ## "coord/simd_neon.hpp" ## ) ##endif () ## ## ## ################################################################################# ##target_sources(cruft PRIVATE ${UTIL_FILES}) ##add_library(cruft-util ALIAS cruft) ##target_include_directories(cruft PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") ## ## ##search_libs (SHM_LIBS shm_open rt) ##search_libs (DL_LIBS dlopen dl) ##search_libs (CLOCK_LIBS clock_gettime rt c) ##search_libs (MATH_LIBS cos m) ## ##target_link_libraries(cruft ${SHM_LIBS}) ##target_link_libraries(cruft ${DL_LIBS}) ##target_link_libraries(cruft ${CLOCK_LIBS}) ##target_link_libraries(cruft ${MATH_LIBS}) ## ### HACK: -ldl isn't getting discovered correctly so we add it unconditionally ### for the time being. ##if (NOT WIN32) ## target_link_libraries(cruft dl) ##endif () ## ## ################################################################################# ##foreach (tool cpuid poisson macro scratch) ## add_executable (util_${tool} tools/${tool}.cpp) ## set_target_properties (util_${tool} PROPERTIES OUTPUT_NAME ${tool}) ## target_link_libraries (util_${tool} cruft) ## target_include_directories(util_${tool} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) ##endforeach () ## ## ################################################################################# ##option (TESTS "enable unit testing" ON) ## ##if (TESTS) ## include(CTest) ## enable_testing() ## ## list ( ## APPEND TEST_BIN ## 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 ## extent ## fixed ## float ## format ## geom/aabb ## geom/ellipse ## geom/frustum ## geom/line ## geom/plane ## geom/ray ## geom/segment ## geom/sphere ## hash/checksum ## hash/crc ## hash/fasthash ## hash/fnv1a ## hash/murmur ## hash/siphash ## hash/xxhash ## hton ## io ## introspection ## iterator ## job/queue ## kmeans ## maths ## maths/fast ## matrix ## memory/deleter ## parallel/queue ## parse ## point ## polynomial ## pool ## preprocessor ## quaternion ## rand/buckets ## random ## range ## rational ## region ## roots/bisection ## 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/tagged ## uri ## utf8 ## vector ## version ## view ## ) ## ## if (NOT WIN32) ## list (APPEND TEST_BIN ## buffer/circular ## buffer/paged ## ) ## endif () ## ## if (SIMD) ## list (APPEND TEST_BIN ## coord/simd ## ) ## endif() ## ## foreach(t ${TEST_BIN}) ## string(REPLACE "/" "_" name "test/${t}") ## add_executable(util_${name} test/${t}.cpp) ## target_link_libraries(util_${name} PRIVATE cruft) ## target_include_directories(util_${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) ## add_test(NAME util_${name} COMMAND util_${name}) ## set_tests_properties(util_${name} PROPERTIES FAIL_REGULAR_EXPRESSION "not ok -") ## endforeach(t) ## ## 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 () ## ## ################################################################################# ##configure_file(libcruft.pc.in libcruft.pc) ##configure_file(Doxyfile.in Doxyfile)