# This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

include(CheckCSourceCompiles)
include(CheckFunctionExists)
include(CheckSymbolExists)

if(CMAKE_CXX_BYTE_ORDER STREQUAL "BIG_ENDIAN")
  set(JEMALLOC_BIG_ENDIAN)
endif()

try_run(JEMALLOC_SYSTEM_INFO_DETECTED JEMALLOC_SYSTEM_INFO_COMPILED ${CMAKE_BINARY_DIR}
  SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/Configure.c"
  RUN_OUTPUT_VARIABLE JEMALLOC_SYSTEM_INFO_RUN_OUTPUT
)

string(JSON LG_SIZEOF_PTR GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_SIZEOF_PTR")
string(JSON LG_SIZEOF_INT GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_SIZEOF_INT")
string(JSON LG_SIZEOF_LONG GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_SIZEOF_LONG")
string(JSON LG_SIZEOF_LONG_LONG GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_SIZEOF_LONG_LONG")
string(JSON LG_SIZEOF_INTMAX_T GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_SIZEOF_INTMAX_T")
string(JSON LG_VADDR GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_VADDR")
string(JSON LG_PAGE GET "${JEMALLOC_SYSTEM_INFO_RUN_OUTPUT}" "LG_PAGE")
set(LG_HUGEPAGE 21)

set(HAVE_CPU_SPINWAIT 1)
if(TRINITY_SYSTEM_PROCESSOR MATCHES "arm")
  if(MSVC)
    set(CPU_SPINWAIT "__isb(_ARM64_BARRIER_SY)")
  else()
    set(CPU_SPINWAIT "__asm__ volatile\(\"isb\"\)")
  endif()
else()
  if(MSVC)
    set(CPU_SPINWAIT "_mm_pause()")
  else()
    set(CPU_SPINWAIT "__asm__ volatile\(\"pause\"\)")
    set(JEMALLOC_HAVE_RDTSCP 1)
  endif()
endif()

# git describe --long --abbrev=40
set(JEMALLOC_VERSION "5.3.1-12-gee4d7b7f9a5c1b48d462be2b65c16e4ead8e3396")
set(JEMALLOC_VERSION_MAJOR 5)
set(JEMALLOC_VERSION_MINOR 3)
set(JEMALLOC_VERSION_BUGFIX 1)
set(JEMALLOC_VERSION_NREV 12)
set(JEMALLOC_VERSION_GID "ee4d7b7f9a5c1b48d462be2b65c16e4ead8e3396")
set(JEMALLOC_VERSION_GID_IDENT ee4d7b7f9a5c1b48d462be2b65c16e4ead8e3396)

set(JEMALLOC_MAPS_COALESCE 1)
set(JEMALLOC_TLS 1)
set(SYM_PREFIX "")
set(JEMALLOC_EXTRA_DEFINES "-D_REENTRANT")
set(JEMALLOC_INTERNAL_UNREACHABLE "__builtin_unreachable()")
if(APPLE)
  set(SYM_PREFIX "_")
  set(JEMALLOC_HAVE_VM_MAKE_TAG 1)
  set(JEMALLOC_OS_UNFAIR_LOCK 1)
  set(JEMALLOC_PREFIX "je_")
  set(JEMALLOC_ZONE 1)
  unset(JEMALLOC_TLS)
  check_symbol_exists(mach_absolute_time "mach/mach_time.h" JEMALLOC_HAVE_MACH_ABSOLUTE_TIME)
  if(LG_SIZEOF_PTR STREQUAL "3")
    set(JEMALLOC_RETAIN 1)
  endif()
elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
  set(JEMALLOC_DSS 1)
  unset(JEMALLOC_TLS)
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  set(JEMALLOC_DSS 1)
  set(JEMALLOC_SYSCTL_VM_OVERCOMMIT)
  set(JEMALLOC_EXTRA_DEFINES "${JEMALLOC_EXTRA_DEFINES} -D_BSD_SOURCE")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  set(JEMALLOC_DSS 1)
  set(JEMALLOC_HAS_ALLOCA_H 1)
  set(JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY 1)
  set(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS 1)
  set(JEMALLOC_THREADED_INIT 1)
  set(JEMALLOC_USE_CXX_THROW 1)
  set(JEMALLOC_ZERO_REALLOC_DEFAULT_FREE 1)
  set(JEMALLOC_EXTRA_DEFINES "${JEMALLOC_EXTRA_DEFINES} -D_GNU_SOURCE")
  if(LG_SIZEOF_PTR STREQUAL "3")
    set(JEMALLOC_RETAIN 1)
  endif()
elseif(CMAKE_SYSTEM_NAME MATCHES "^Windows")
  unset(JEMALLOC_MAPS_COALESCE)
  unset(JEMALLOC_TLS)
  set(JEMALLOC_INTERNAL_UNREACHABLE "__assume(false)")
  set(JEMALLOC_PREFIX "je_")
  set(JEMALLOC_ZERO_REALLOC_DEFAULT_FREE 1)
  if(LG_SIZEOF_PTR STREQUAL "3")
    set(JEMALLOC_RETAIN 1)
  endif()
endif()

check_c_source_compiles("
#include <malloc.h>
#include <stddef.h>
size_t malloc_usable_size(const void *ptr);
" JEMALLOC_USABLE_SIZE_CONST)

if(JEMALLOC_USABLE_SIZE_CONST)
  set(JEMALLOC_USABLE_SIZE_CONST "const")
else()
  set(JEMALLOC_USABLE_SIZE_CONST "")
endif()

if(NOT MSVC)
  set(JEMALLOC_GCC_ATOMIC_ATOMICS 1)
  set(JEMALLOC_GCC_U8_ATOMIC_ATOMICS 1) # don't bother detecting atomic support, all TC-supported compilers (excluding msvc) have gcc-like atomics
  set(JEMALLOC_HAVE_ATTR 1)
  set(JEMALLOC_TLS_MODEL "__attribute__\(\(tls_model\(\"initial-exec\"\)\)\)")
  set(JEMALLOC_HAVE_ATTR_DEPRECATED 1)
  set(JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF 1)
  set(JEMALLOC_HAVE_ATTR_FORMAT_PRINTF 1)
  set(JEMALLOC_HAVE_ATTR_FORMAT_ARG 1)
  set(JEMALLOC_HAVE_ATTR_FALLTHROUGH 1)
  set(JEMALLOC_HAVE_ATTR_COLD 1)
  set(JEMALLOC_HAVE_BUILTIN_CLZ 1)
  set(JEMALLOC_INTERNAL_FFS "__builtin_ffs")
  set(JEMALLOC_INTERNAL_FFSL "__builtin_ffsl")
  set(JEMALLOC_INTERNAL_FFSLL "__builtin_ffsll")
  set(JEMALLOC_INTERNAL_POPCOUNT "__builtin_popcount")
  set(JEMALLOC_INTERNAL_POPCOUNTL "__builtin_popcountl")
  set(JEMALLOC_INTERNAL_POPCOUNTLL "__builtin_popcountll")
else()
  set(JEMALLOC_INTERNAL_FFS "ffs")
  set(JEMALLOC_INTERNAL_FFSL "ffsl")
  set(JEMALLOC_INTERNAL_FFSLL "ffsll")
  set(JEMALLOC_INTERNAL_POPCOUNT "__popcnt")
  set(JEMALLOC_INTERNAL_POPCOUNTL "__popcnt")
  set(JEMALLOC_INTERNAL_POPCOUNTLL "__popcnt64")
endif()

if(NOT JEMALLOC_PREFIX)
  set(JEMALLOC_IS_MALLOC 1)
else()
  string(TOUPPER "${JEMALLOC_PREFIX}" JEMALLOC_CPREFIX)
endif()

set(JEMALLOC_CACHE_OBLIVIOUS 1)
set(JEMALLOC_CONFIG_MALLOC_CONF "")
set(JEMALLOC_C11_ATOMICS 1)
set(JEMALLOC_ENABLE_CXX 1)
set(JEMALLOC_FILL 1)
set(JEMALLOC_HAVE_CXX_EXCEPTIONS 1)
set(JEMALLOC_PRIVATE_NAMESPACE "je_")
set(JEMALLOC_STATS 1)
unset(JEMALLOC_CONFIG_ENV)
unset(JEMALLOC_CONFIG_FILE)
unset(JEMALLOC_LOG)
unset(JEMALLOC_OPT_SAFETY_CHECKS)
unset(JEMALLOC_OPT_SIZE_CHECKS)
unset(JEMALLOC_PAGEID)
unset(JEMALLOC_READLINKAT)
unset(JEMALLOC_UAF_DETECTION)
unset(JEMALLOC_UTRACE)
unset(JEMALLOC_UTRACE_LABEL)
unset(JEMALLOC_XMALLOC)

set(CMAKE_REQUIRED_DEFINITIONS ${JEMALLOC_EXTRA_DEFINES})

check_symbol_exists(memalign "malloc.h" JEMALLOC_OVERRIDE_MEMALIGN)
check_symbol_exists(valloc "stdlib.h" JEMALLOC_OVERRIDE_VALLOC)
check_symbol_exists(pvalloc "malloc.h" JEMALLOC_OVERRIDE_PVALLOC)
check_symbol_exists(malloc_size "malloc/malloc.h" JEMALLOC_HAVE_MALLOC_SIZE)

set(wrap_syms "")
if(NOT JEMALLOC_PREFIX)
  check_function_exists(__libc_calloc JEMALLOC_OVERRIDE___LIBC_CALLOC)
  if(JEMALLOC_OVERRIDE___LIBC_CALLOC)
    list(APPEND wrap_syms "__libc_calloc")
  endif()
  check_function_exists(__libc_free JEMALLOC_OVERRIDE___LIBC_FREE)
  if(JEMALLOC_OVERRIDE___LIBC_FREE)
    list(APPEND wrap_syms "__libc_free")
  endif()
  check_function_exists(__libc_free_sized JEMALLOC_OVERRIDE___LIBC_FREE_SIZED)
  if(JEMALLOC_OVERRIDE___LIBC_FREE_SIZED)
    list(APPEND wrap_syms "__libc_free_sized")
  endif()
  check_function_exists(__libc_free_aligned_sized JEMALLOC_OVERRIDE___LIBC_FREE_ALIGNED_SIZED)
  if(JEMALLOC_OVERRIDE___LIBC_FREE_ALIGNED_SIZED)
    list(APPEND wrap_syms "__libc_free_aligned_sized")
  endif()
  check_function_exists(__libc_malloc JEMALLOC_OVERRIDE___LIBC_MALLOC)
  if(JEMALLOC_OVERRIDE___LIBC_MALLOC)
    list(APPEND wrap_syms "__libc_malloc")
  endif()
  check_function_exists(__libc_memalign JEMALLOC_OVERRIDE___LIBC_MEMALIGN)
  if(JEMALLOC_OVERRIDE___LIBC_MEMALIGN)
    list(APPEND wrap_syms "__libc_memalign")
  endif()
  check_function_exists(__libc_realloc JEMALLOC_OVERRIDE___LIBC_REALLOC)
  if(JEMALLOC_OVERRIDE___LIBC_REALLOC)
    list(APPEND wrap_syms "__libc_realloc")
  endif()
  check_function_exists(__libc_valloc JEMALLOC_OVERRIDE___LIBC_VALLOC)
  if(JEMALLOC_OVERRIDE___LIBC_VALLOC)
    list(APPEND wrap_syms "__libc_valloc")
  endif()
  check_function_exists(__libc_pvalloc JEMALLOC_OVERRIDE___LIBC_PVALLOC)
  if(JEMALLOC_OVERRIDE___LIBC_PVALLOC)
    list(APPEND wrap_syms "__libc_pvalloc")
  endif()
  check_function_exists(__posix_memalign JEMALLOC_OVERRIDE___POSIX_MEMALIGN)
  if(JEMALLOC_OVERRIDE___POSIX_MEMALIGN)
    list(APPEND wrap_syms "__posix_memalign")
  endif()
endif()

if(NOT WIN32)
  set(JEMALLOC_HAVE_DLSYM 1)
  set(JEMALLOC_HAVE_PTHREAD 1)
  list(APPEND wrap_syms "pthread_create")

  check_symbol_exists(pthread_atfork "pthread.h" JEMALLOC_HAVE_PTHREAD_ATFORK)
  check_symbol_exists(pthread_setname_np "pthread.h" JEMALLOC_HAVE_PTHREAD_SETNAME_NP)
  check_symbol_exists(pthread_getname_np "pthread.h" JEMALLOC_HAVE_PTHREAD_GETNAME_NP)
  check_symbol_exists(pthread_set_name_np "pthread_np.h" JEMALLOC_HAVE_PTHREAD_SET_NAME_NP)
  check_symbol_exists(pthread_get_name_np "pthread_np.h" JEMALLOC_HAVE_PTHREAD_GET_NAME_NP)
  check_c_source_compiles("
  #include <pthread.h>
  int main()
  {
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ADAPTIVE_NP);
    pthread_mutexattr_destroy(&attr);
  }
  " JEMALLOC_HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
  check_symbol_exists(gettid "unistd.h" JEMALLOC_HAVE_GETTID)
  check_symbol_exists(CLOCK_MONOTONIC_COARSE "time.h" JEMALLOC_HAVE_CLOCK_MONOTONIC_COARSE)
  check_symbol_exists(CLOCK_MONOTONIC "time.h" JEMALLOC_HAVE_CLOCK_MONOTONIC)
  check_symbol_exists(CLOCK_REALTIME "time.h" JEMALLOC_HAVE_CLOCK_REALTIME)
  check_symbol_exists(clock_gettime_nsec_np "time.h" JEMALLOC_HAVE_CLOCK_GETTIME_NSEC_NP)

  set(CMAKE_REQUIRED_FLAGS "-Werror")
  check_c_source_compiles("
  #include <sys/syscall.h>
  #include <unistd.h>
  int main() { syscall(SYS_write, 2, \"hello\", 5); }
  " JEMALLOC_USE_SYSCALL)
  unset(CMAKE_REQUIRED_FLAGS)

  check_symbol_exists(secure_getenv "stdlib.h" JEMALLOC_HAVE_SECURE_GETENV)
  check_symbol_exists(sched_getcpu "sched.h" JEMALLOC_HAVE_SCHED_GETCPU)
  check_symbol_exists(sched_setaffinity "sched.h" JEMALLOC_HAVE_SCHED_SETAFFINITY)
  check_symbol_exists(pthread_setaffinity_np "pthread.h" JEMALLOC_HAVE_PTHREAD_SETAFFINITY_NP)
  check_symbol_exists(issetugid "unistd.h" JEMALLOC_HAVE_ISSETUGID)
  check_symbol_exists(_malloc_thread_cleanup "pthread.h" JEMALLOC_MALLOC_THREAD_CLEANUP)
  if(JEMALLOC_MALLOC_THREAD_CLEANUP)
    list(APPEND wrap_syms "_malloc_thread_cleanup")
    list(APPEND wrap_syms "_malloc_tsd_cleanup_register")
    set(JEMALLOC_TLS 1)
  endif()

  check_symbol_exists(_pthread_mutex_init_calloc_cb "pthread.h" JEMALLOC_MUTEX_INIT_CB)
  if(JEMALLOC_MUTEX_INIT_CB)
    list(APPEND wrap_syms "_malloc_prefork")
    list(APPEND wrap_syms "_malloc_postfork")
  endif()

  check_symbol_exists(memcntl "sys/types.h;sys/mman.h" JEMALLOC_HAVE_MEMCNTL)
  check_symbol_exists(prctl "sys/prctl.h" JEMALLOC_HAVE_PRCTL)
  check_symbol_exists(madvise "sys/mman.h" JEMALLOC_HAVE_MADVISE)
  if(JEMALLOC_HAVE_MADVISE)
    check_symbol_exists(MADV_FREE "sys/mman.h" JEMALLOC_PURGE_MADVISE_FREE)
    if(NOT JEMALLOC_PURGE_MADVISE_FREE AND CMAKE_SYSTEM_NAME STREQUAL "Linux" AND TRINITY_SYSTEM_PROCESSOR MATCHES "x86|amd64")
      set(JEMALLOC_PURGE_MADVISE_FREE 1)
      set(JEMALLOC_DEFINE_MADVISE_FREE 1)
    endif()
    check_symbol_exists(MADV_DONTNEED "sys/mman.h" JEMALLOC_PURGE_MADVISE_DONTNEED)
    check_symbol_exists(MADV_DONTDUMP "sys/mman.h" JEMALLOC_MADVISE_DONTDUMP)
    check_symbol_exists(MADV_NOCORE "sys/mman.h" JEMALLOC_MADVISE_NOCORE)
    check_symbol_exists(MADV_COLLAPSE "sys/mman.h" JEMALLOC_HAVE_MADVISE_COLLAPSE)
    if(TRINITY_SYSTEM_PROCESSOR MATCHES "x86|amd64")
      check_symbol_exists(MADV_HUGEPAGE "sys/mman.h" JEMALLOC_HAVE_MADVISE_HUGE)
    endif()
    check_symbol_exists(SYS_process_madvise "sys/syscall.h" JEMALLOC_HAVE_PROCESS_MADVISE)
  else()
    check_symbol_exists(posix_madvise "sys/mman.h" JEMALLOC_HAVE_POSIX_MADVISE)
    if(JEMALLOC_HAVE_POSIX_MADVISE)
      check_symbol_exists(POSIX_MADV_DONTNEED "sys/mman.h" JEMALLOC_PURGE_POSIX_MADVISE_DONTNEED)
    endif()
  endif()

  check_symbol_exists(mprotect "sys/mman.h" JEMALLOC_HAVE_MPROTECT)
  if(NOT APPLE)
    set(JEMALLOC_BACKGROUND_THREAD 1)
  endif()

  set(CMAKE_REQUIRED_FLAGS "-Werror")
  check_c_source_compiles("
  #include <errno.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  int main()
  {
    char *buffer = (char *) malloc(100);
    char *error = strerror_r(EINVAL, buffer, 100);
    printf(\"%s\", error);
  }
  " JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE)
  unset(CMAKE_REQUIRED_FLAGS)
  check_c_source_compiles("
  int main()
  {
    __int128 temp = 0;
    return temp;
  }
  " JEMALLOC_HAVE_INT128)
endif()

unset(CMAKE_REQUIRED_DEFINITIONS)

set(je_ "je_")

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/include/jemalloc/jemalloc.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/include/jemalloc/jemalloc.h
  @ONLY
)

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/include/jemalloc/internal/jemalloc_internal_defs.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/include/jemalloc/internal/jemalloc_internal_defs.h
  @ONLY
)

add_library(jemalloc STATIC
  ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/arena.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/background_thread.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/base.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/bin.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/bin_info.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/bitmap.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/buf_writer.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/cache_bin.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/ckh.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/conf.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/counter.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/ctl.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/decay.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/div.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/ecache.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/edata.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/edata_cache.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/ehooks.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/emap.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/eset.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/exp_grow.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/extent.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_dss.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/extent_mmap.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/fxp.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/san.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/san_bump.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hook.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hpa.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hpa_central.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hpa_hooks.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hpa_utils.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/hpdata.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/inspect.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/large.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/log.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/malloc_io.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/mutex.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/nstime.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/pa.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/pa_extra.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/pac.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/pages.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/peak_event.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_data.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_log.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_recent.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_stack_range.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_stats.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/prof_sys.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/psset.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/rtree.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/safety_check.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/sc.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/sec.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/stats.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/sz.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/tcache.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/test_hooks.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/thread_event.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/thread_event_registry.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/ticker.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/tsd.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/util.c 
  ${CMAKE_CURRENT_SOURCE_DIR}/src/witness.c)

if(APPLE)
  target_sources(jemalloc
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/src/zone.c)
endif()

target_include_directories(jemalloc
  PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR}/include
  PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/include/jemalloc/internal
    ${CMAKE_CURRENT_SOURCE_DIR}/include)

if(MSVC)
  target_include_directories(jemalloc
    PUBLIC
      ${CMAKE_CURRENT_SOURCE_DIR}/include/msvc_compat)

  target_compile_definitions(jemalloc
    PRIVATE
      DLLEXPORT)
else()
  target_sources(jemalloc
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/src/jemalloc_cpp.cpp)
endif()

target_compile_definitions(jemalloc
  PRIVATE
    ${JEMALLOC_EXTRA_DEFINES})

target_link_libraries(jemalloc
  PRIVATE
    trinity-dependency-interface
  PUBLIC
    threads
    valgrind
    ${CMAKE_DL_LIBS})

set_target_properties(jemalloc
  PROPERTIES
    FOLDER
      "dep")
