project('tracy', ['cpp'], version: '0.13.1', meson_version: '>=1.3.0', default_options : ['cpp_std=c++11'])

# internal compiler flags
tracy_compile_args = []

# compiler flags shared between the capture library itself and the code using it
tracy_common_args = []

# dependencies that will be propagated to the users of the capture library
tracy_public_deps = []

if get_option('tracy_enable')
  tracy_common_args += ['-DTRACY_ENABLE']
endif

if get_option('on_demand')
  tracy_common_args += ['-DTRACY_ON_DEMAND']
endif

if get_option('callstack') > 0
  tracy_common_args += ['-DTRACY_CALLSTACK='+get_option('callstack').to_string()]
endif

if get_option('platform_header') != ''
  tracy_common_args += ['-DTRACY_PLATFORM_HEADER="'+get_option('platform_header')+'"']
endif

if get_option('no_callstack')
  tracy_common_args += ['-DTRACY_NO_CALLSTACK']
endif

if get_option('no_callstack_inlines')
  tracy_common_args += ['-DTRACY_NO_CALLSTACK_INLINES']
endif

if get_option('only_localhost')
  tracy_common_args += ['-DTRACY_ONLY_LOCALHOST']
endif

if get_option('no_broadcast')
  tracy_common_args += ['-DTRACY_NO_BROADCAST']
endif

if get_option('only_ipv4')
  tracy_common_args += ['-DTRACY_ONLY_IPV4']
endif

if get_option('no_code_transfer')
  tracy_common_args += ['-DTRACY_NO_CODE_TRANSFER']
endif

if get_option('no_context_switch')
  tracy_common_args += ['-DTRACY_NO_CONTEXT_SWITCH']
endif

if get_option('no_exit')
  tracy_common_args += ['-DTRACY_NO_EXIT']
endif

if get_option('no_sampling')
  tracy_common_args += ['-DTRACY_NO_SAMPLING']
endif

if get_option('no_verify')
  tracy_common_args += ['-DTRACY_NO_VERIFY']
endif

if get_option('no_vsync_capture')
  tracy_common_args += ['-DTRACY_NO_VSYNC_CAPTURE']
endif

if get_option('no_frame_image')
  tracy_common_args += ['-DTRACY_NO_FRAME_IMAGE']
endif

if get_option('no_system_tracing')
  tracy_common_args += ['-DTRACY_NO_SYSTEM_TRACING']
endif

if get_option('patchable_nopsleds')
  tracy_common_args += ['-DTRACY_PATCHABLE_NOPSLEDS']
endif

if get_option('delayed_init')
  tracy_common_args += ['-DTRACY_DELAYED_INIT']
endif

if get_option('manual_lifetime')
  tracy_common_args += ['-DTRACY_MANUAL_LIFETIME']
endif

if get_option('fibers')
  tracy_common_args += ['-DTRACY_FIBERS']
endif

if get_option('timer_fallback')
  tracy_common_args += ['-DTRACY_TIMER_FALLBACK']
endif

if get_option('disallow_hw_timer')
  tracy_common_args += ['-DTRACY_DISALLOW_HW_TIMER']
endif

if get_option('no_crash_handler')
  tracy_common_args += ['-DTRACY_NO_CRASH_HANDLER']
endif

if get_option('libunwind_backtrace')
  tracy_common_args += ['-DTRACY_LIBUNWIND_BACKTRACE']
  tracy_public_deps += dependency('libunwind')
endif

if get_option('symbol_offline_resolve')
  tracy_compile_args += ['-DTRACY_SYMBOL_OFFLINE_RESOLVE']
endif

if get_option('libbacktrace_elf_dynload_support')
  tracy_compile_args += ['-DTRACY_LIBBACKTRACE_ELF_DYNLOAD_SUPPORT']
endif

if get_option('verbose')
  tracy_common_args += ['-DTRACY_VERBOSE']
endif

if get_option('no_internal_message')
  tracy_common_args += ['-DTRACY_NO_INTERNAL_MESSAGE']
endif

if get_option('debuginfod')
  tracy_common_args += ['-DTRACY_DEBUGINFOD']
  tracy_public_deps += dependency('libdebuginfod')
endif

if get_option('ignore_memory_faults')
  tracy_common_args += ['-DTRACY_IGNORE_MEMORY_FAULTS']
endif

if get_option('opengl_auto_calibration')
  tracy_common_args += ['-DTRACY_OPENGL_AUTO_CALIBRATION']
endif

tracy_shared_libs = get_option('default_library') == 'shared'

if tracy_shared_libs
  tracy_compile_args += ['-DTRACY_EXPORTS']
endif

if host_machine.system() == 'windows'
  tracy_compile_args += ['-DWINVER=0x0A00', '-D_WIN32_WINNT=0x0A00']
endif

includes = [
    'public/tracy/TracyC.h',
    'public/tracy/Tracy.hpp',
    'public/tracy/TracyCUDA.hpp',
    'public/tracy/TracyD3D11.hpp',
    'public/tracy/TracyD3D12.hpp',
    'public/tracy/TracyLua.hpp',
    'public/tracy/TracyOpenCL.hpp',
    'public/tracy/TracyOpenGL.hpp',
    'public/tracy/TracyVulkan.hpp'
]

client_includes = [
    'public/client/tracy_concurrentqueue.h',
    'public/client/tracy_rpmalloc.hpp',
    'public/client/tracy_SPSCQueue.h',
    'public/client/TracyArmCpuTable.hpp',
    'public/client/TracyCallstack.h',
    'public/client/TracyCallstack.hpp',
    'public/client/TracyDebug.hpp',
    'public/client/TracyDxt1.hpp',
    'public/client/TracyFastVector.hpp',
    'public/client/TracyKCore.hpp',
    'public/client/TracyLock.hpp',
    'public/client/TracyMangle.hpp',
    'public/client/TracyProfiler.hpp',
    'public/client/TracyRingBuffer.hpp',
    'public/client/TracyScoped.hpp',
    'public/client/TracyStringHelpers.hpp',
    'public/client/TracySysPower.hpp',
    'public/client/TracySysTime.hpp',
    'public/client/TracySysTrace.hpp',
    'public/client/TracyThread.hpp'
]

common_includes = [
    'public/common/tracy_lz4.hpp',
    'public/common/tracy_lz4hc.hpp',
    'public/common/TracyAlign.hpp',
    'public/common/TracyAlloc.hpp',
    'public/common/TracyApi.h',
    'public/common/TracyColor.hpp',
    'public/common/TracyForceInline.hpp',
    'public/common/TracyMutex.hpp',
    'public/common/TracyProtocol.hpp',
    'public/common/TracyQueue.hpp',
    'public/common/TracySocket.hpp',
    'public/common/TracyStackFrames.hpp',
    'public/common/TracySystem.hpp',
    'public/common/TracyTaggedUserlandAddress.hpp',
    'public/common/TracyWinFamily.hpp',
    'public/common/TracyYield.hpp'
]

tracy_header_files = common_includes + client_includes + includes

tracy_src = [
    'public/TracyClient.cpp'
]

tracy_public_include_dirs = include_directories('public')

compiler = meson.get_compiler('cpp')
override_options = []
# MSVC c++ lib does not work properly with C++11 and compilation may fail
if compiler.has_define('_MSC_VER') and get_option('cpp_std') == 'c++11'
  override_options += 'cpp_std=c++14'
endif

tracy_compile_args += tracy_common_args

tracy_deps = [dependency('threads')] + tracy_public_deps

tracy = library('tracy', tracy_src, tracy_header_files,
    dependencies        : tracy_deps,
    include_directories : tracy_public_include_dirs,
    cpp_args            : tracy_compile_args,
    override_options    : override_options,
    install             : true)

install_headers(includes, subdir : 'tracy/tracy')
install_headers(common_includes, subdir : 'tracy/common')
install_headers(client_includes, subdir : 'tracy/client')

tracy_dep_compile_args = tracy_common_args

if tracy_shared_libs
  tracy_dep_compile_args += [ '-DTRACY_IMPORTS' ]
endif

pkg = import('pkgconfig')
pkg.generate(tracy,
  extra_cflags : tracy_dep_compile_args,
  requires     : tracy_public_deps,
  libraries: [tracy])

tracy_dep = declare_dependency(
    compile_args        : tracy_dep_compile_args,
    link_with           : tracy,
    include_directories : tracy_public_include_dirs)

meson.override_dependency('tracy', tracy_dep)
