|
1 | | -set(JEMALLOC_SOURCE_DIR ${ClickHouse_SOURCE_DIR}/contrib/jemalloc) |
2 | | - |
3 | | -set(SRCS |
4 | | -${JEMALLOC_SOURCE_DIR}/src/arena.c |
5 | | -${JEMALLOC_SOURCE_DIR}/src/background_thread.c |
6 | | -${JEMALLOC_SOURCE_DIR}/src/base.c |
7 | | -${JEMALLOC_SOURCE_DIR}/src/bin.c |
8 | | -${JEMALLOC_SOURCE_DIR}/src/bitmap.c |
9 | | -${JEMALLOC_SOURCE_DIR}/src/ckh.c |
10 | | -${JEMALLOC_SOURCE_DIR}/src/ctl.c |
11 | | -${JEMALLOC_SOURCE_DIR}/src/div.c |
12 | | -${JEMALLOC_SOURCE_DIR}/src/extent.c |
13 | | -${JEMALLOC_SOURCE_DIR}/src/extent_dss.c |
14 | | -${JEMALLOC_SOURCE_DIR}/src/extent_mmap.c |
15 | | -${JEMALLOC_SOURCE_DIR}/src/hash.c |
16 | | -${JEMALLOC_SOURCE_DIR}/src/hook.c |
17 | | -${JEMALLOC_SOURCE_DIR}/src/jemalloc.c |
18 | | -${JEMALLOC_SOURCE_DIR}/src/large.c |
19 | | -${JEMALLOC_SOURCE_DIR}/src/log.c |
20 | | -${JEMALLOC_SOURCE_DIR}/src/malloc_io.c |
21 | | -${JEMALLOC_SOURCE_DIR}/src/mutex.c |
22 | | -${JEMALLOC_SOURCE_DIR}/src/mutex_pool.c |
23 | | -${JEMALLOC_SOURCE_DIR}/src/nstime.c |
24 | | -${JEMALLOC_SOURCE_DIR}/src/pages.c |
25 | | -${JEMALLOC_SOURCE_DIR}/src/prng.c |
26 | | -${JEMALLOC_SOURCE_DIR}/src/prof.c |
27 | | -${JEMALLOC_SOURCE_DIR}/src/rtree.c |
28 | | -${JEMALLOC_SOURCE_DIR}/src/sc.c |
29 | | -${JEMALLOC_SOURCE_DIR}/src/stats.c |
30 | | -${JEMALLOC_SOURCE_DIR}/src/sz.c |
31 | | -${JEMALLOC_SOURCE_DIR}/src/tcache.c |
32 | | -${JEMALLOC_SOURCE_DIR}/src/test_hooks.c |
33 | | -${JEMALLOC_SOURCE_DIR}/src/ticker.c |
34 | | -${JEMALLOC_SOURCE_DIR}/src/tsd.c |
35 | | -${JEMALLOC_SOURCE_DIR}/src/witness.c |
36 | | -) |
37 | | - |
38 | | -if(OS_DARWIN) |
39 | | - list(APPEND SRCS ${JEMALLOC_SOURCE_DIR}/src/zone.c) |
40 | | -endif() |
41 | | - |
42 | | -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
43 | | - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w") |
| 1 | +option (ENABLE_JEMALLOC "Enable jemalloc allocator" ${ENABLE_LIBRARIES}) |
| 2 | + |
| 3 | +if (SANITIZE) |
| 4 | + set (ENABLE_JEMALLOC FALSE) |
| 5 | + message (STATUS "jemalloc is disabled because of sanitizers") |
44 | 6 | endif () |
45 | 7 |
|
46 | | -add_library(jemalloc STATIC ${SRCS}) |
| 8 | +if (ENABLE_JEMALLOC) |
| 9 | + option (USE_INTERNAL_JEMALLOC "Use internal jemalloc library" ${NOT_UNBUNDLED}) |
47 | 10 |
|
48 | | -target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) |
| 11 | + if (USE_INTERNAL_JEMALLOC) |
| 12 | + if (NOT OS_LINUX OR NOT (ARCH_AMD64 OR ARCH_ARM)) |
| 13 | + message (FATAL_ERROR "Internal jemalloc can only be used on Linux with x86_64 or aarch64.") |
| 14 | + endif () |
49 | 15 |
|
50 | | -if (ARCH_AMD64) |
51 | | - target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include_linux_x86_64) |
52 | | -elseif (ARCH_ARM) |
53 | | - target_include_directories(jemalloc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include_linux_aarch64) |
54 | | -else () |
55 | | - message (FATAL_ERROR "jemalloc can only be used on x86_64 or aarch64.") |
56 | | -endif () |
| 16 | + set (LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/jemalloc") |
| 17 | + |
| 18 | + set (SRCS |
| 19 | + ${LIBRARY_DIR}/src/arena.c |
| 20 | + ${LIBRARY_DIR}/src/background_thread.c |
| 21 | + ${LIBRARY_DIR}/src/base.c |
| 22 | + ${LIBRARY_DIR}/src/bin.c |
| 23 | + ${LIBRARY_DIR}/src/bitmap.c |
| 24 | + ${LIBRARY_DIR}/src/ckh.c |
| 25 | + ${LIBRARY_DIR}/src/ctl.c |
| 26 | + ${LIBRARY_DIR}/src/div.c |
| 27 | + ${LIBRARY_DIR}/src/extent.c |
| 28 | + ${LIBRARY_DIR}/src/extent_dss.c |
| 29 | + ${LIBRARY_DIR}/src/extent_mmap.c |
| 30 | + ${LIBRARY_DIR}/src/hash.c |
| 31 | + ${LIBRARY_DIR}/src/hook.c |
| 32 | + ${LIBRARY_DIR}/src/jemalloc.c |
| 33 | + ${LIBRARY_DIR}/src/large.c |
| 34 | + ${LIBRARY_DIR}/src/log.c |
| 35 | + ${LIBRARY_DIR}/src/malloc_io.c |
| 36 | + ${LIBRARY_DIR}/src/mutex.c |
| 37 | + ${LIBRARY_DIR}/src/mutex_pool.c |
| 38 | + ${LIBRARY_DIR}/src/nstime.c |
| 39 | + ${LIBRARY_DIR}/src/pages.c |
| 40 | + ${LIBRARY_DIR}/src/prng.c |
| 41 | + ${LIBRARY_DIR}/src/prof.c |
| 42 | + ${LIBRARY_DIR}/src/rtree.c |
| 43 | + ${LIBRARY_DIR}/src/sc.c |
| 44 | + ${LIBRARY_DIR}/src/stats.c |
| 45 | + ${LIBRARY_DIR}/src/sz.c |
| 46 | + ${LIBRARY_DIR}/src/tcache.c |
| 47 | + ${LIBRARY_DIR}/src/test_hooks.c |
| 48 | + ${LIBRARY_DIR}/src/ticker.c |
| 49 | + ${LIBRARY_DIR}/src/tsd.c |
| 50 | + ${LIBRARY_DIR}/src/witness.c |
| 51 | + ) |
| 52 | + if (OS_DARWIN) |
| 53 | + list(APPEND SRCS ${LIBRARY_DIR}/src/zone.c) |
| 54 | + endif () |
| 55 | + |
| 56 | + add_library(jemalloc STATIC ${SRCS}) |
| 57 | + target_include_directories(jemalloc PRIVATE ${LIBRARY_DIR}/include) |
| 58 | + target_include_directories(jemalloc PUBLIC include) |
| 59 | + if (ARCH_AMD64) |
| 60 | + target_include_directories(jemalloc PUBLIC include_linux_x86_64) |
| 61 | + elseif (ARCH_ARM) |
| 62 | + target_include_directories(jemalloc PUBLIC include_linux_aarch64) |
| 63 | + endif () |
| 64 | + |
| 65 | + target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE) |
57 | 66 |
|
58 | | -target_include_directories(jemalloc PRIVATE |
59 | | - ${JEMALLOC_SOURCE_DIR}/include) |
| 67 | + if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") |
| 68 | + target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_DEBUG=1 -DJEMALLOC_PROF=1) |
60 | 69 |
|
61 | | -target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE) |
| 70 | + if (USE_UNWIND) |
| 71 | + target_compile_definitions (jemalloc PRIVATE -DJEMALLOC_PROF_LIBUNWIND=1) |
| 72 | + target_link_libraries (jemalloc PRIVATE unwind) |
| 73 | + endif () |
| 74 | + endif () |
| 75 | + else () |
| 76 | + find_library(LIBRARY_JEMALLOC jemalloc) |
| 77 | + find_path(INCLUDE_JEMALLOC jemalloc/jemalloc.h) |
62 | 78 |
|
63 | | -if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") |
64 | | - target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_DEBUG=1 -DJEMALLOC_PROF=1) |
| 79 | + add_library (jemalloc STATIC IMPORTED) |
| 80 | + set_property (TARGET jemalloc PROPERTY IMPORTED_LOCATION ${LIBRARY_JEMALLOC}) |
| 81 | + target_include_directories (jemalloc PUBLIC ${INCLUDE_JEMALLOC}) |
65 | 82 |
|
66 | | - if (USE_UNWIND) |
67 | | - target_compile_definitions (jemalloc PRIVATE -DJEMALLOC_PROF_LIBUNWIND=1) |
68 | | - target_link_libraries (jemalloc PRIVATE ${UNWIND_LIBRARIES}) |
| 83 | + set (CMAKE_REQUIRED_LIBRARIES jemalloc) |
| 84 | + check_cxx_source_compiles ( |
| 85 | + " |
| 86 | + #include <jemalloc/jemalloc.h> |
| 87 | +
|
| 88 | + int main() { |
| 89 | + free(mallocx(1, 0)); |
| 90 | + } |
| 91 | + " |
| 92 | + EXTERNAL_JEMALLOC_WORKS |
| 93 | + ) |
| 94 | + |
| 95 | + if (NOT EXTERNAL_JEMALLOC_WORKS) |
| 96 | + message (FATAL_ERROR "jemalloc is unusable: ${LIBRARY_JEMALLOC} ${INCLUDE_JEMALLOC}") |
| 97 | + endif () |
69 | 98 | endif () |
| 99 | + |
| 100 | + target_compile_definitions(jemalloc PUBLIC USE_JEMALLOC=1) |
| 101 | + |
| 102 | + message (STATUS "Using jemalloc") |
| 103 | +else () |
| 104 | + add_library(jemalloc INTERFACE) |
| 105 | + target_compile_definitions(jemalloc INTERFACE USE_JEMALLOC=0) |
| 106 | + |
| 107 | + message (STATUS "Not using jemalloc") |
70 | 108 | endif () |
0 commit comments