@@ -50,6 +50,53 @@ if(NOT JEMALLOC_STATIC_LIB)
5050 message (STATUS "Static jemalloc not found, will fall back to dynamic linking" )
5151endif ()
5252
53+ # TCMalloc support via system gperftools package
54+ # gperftools provides libtcmalloc on most Linux distributions
55+ # (Ubuntu: libtcmalloc-minimal4, Fedora: gperftools-libs, NixOS: gperftools)
56+ find_package (Threads REQUIRED )
57+
58+ # Search in common paths including NixOS store
59+ file (GLOB TCMALLOC_NIX_PATHS "/nix/store/*gperftools*/lib" )
60+
61+ # Find static library
62+ set (_old_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES} )
63+ set (CMAKE_FIND_LIBRARY_SUFFIXES .a)
64+ find_library (TCMALLOC_STATIC_LIB
65+ NAMES libtcmalloc_minimal.a libtcmalloc.a tcmalloc_minimal tcmalloc
66+ HINTS ${TCMALLOC_NIX_PATHS}
67+ DOC "Static TCMalloc library (from gperftools)"
68+ )
69+ set (CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes} )
70+
71+ if (NOT TCMALLOC_STATIC_LIB)
72+ message (STATUS "Static TCMalloc not found, will fall back to dynamic linking" )
73+ endif ()
74+
75+ # Find dynamic library
76+ find_package (PkgConfig )
77+ if (PKG_CONFIG_FOUND)
78+ pkg_check_modules (TCMALLOC QUIET libtcmalloc_minimal libtcmalloc )
79+ endif ()
80+
81+ if (NOT TCMALLOC_FOUND)
82+ find_library (TCMALLOC_LIBRARY
83+ NAMES tcmalloc_minimal tcmalloc
84+ HINTS ${TCMALLOC_NIX_PATHS}
85+ DOC "TCMalloc library (from gperftools)"
86+ )
87+ if (TCMALLOC_LIBRARY)
88+ set (TCMALLOC_FOUND TRUE )
89+ set (TCMALLOC_LIBRARIES ${TCMALLOC_LIBRARY} )
90+ endif ()
91+ endif ()
92+
93+ if (TCMALLOC_FOUND OR TCMALLOC_STATIC_LIB)
94+ message (STATUS "Found TCMalloc: static=${TCMALLOC_STATIC_LIB} , dynamic=${TCMALLOC_LIBRARIES} " )
95+ set (TCMALLOC_AVAILABLE ON )
96+ else ()
97+ message (STATUS "TCMalloc not found, tcmalloc test targets will not link correctly" )
98+ endif ()
99+
53100# Target: alloc_cpp_system
54101set (alloc_cpp_system_SOURCES
55102 cmake.toml
@@ -169,3 +216,67 @@ get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} D
169216if (NOT CMKR_VS_STARTUP_PROJECT)
170217 set_property (DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT alloc_cpp_mimalloc_dynamic )
171218endif ()
219+
220+ # Target: alloc_cpp_tcmalloc_static
221+ set (alloc_cpp_tcmalloc_static_SOURCES
222+ cmake.toml
223+ "src/main.cpp"
224+ )
225+
226+ add_executable (alloc_cpp_tcmalloc_static )
227+
228+ target_sources (alloc_cpp_tcmalloc_static PRIVATE ${alloc_cpp_tcmalloc_static_SOURCES} )
229+ source_group (TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${alloc_cpp_tcmalloc_static_SOURCES} )
230+
231+ target_compile_definitions (alloc_cpp_tcmalloc_static PRIVATE
232+ USE_TCMALLOC=1
233+ )
234+
235+ get_directory_property (CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT )
236+ if (NOT CMKR_VS_STARTUP_PROJECT)
237+ set_property (DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT alloc_cpp_tcmalloc_static )
238+ endif ()
239+
240+ set (CMKR_TARGET alloc_cpp_tcmalloc_static)
241+ if (TCMALLOC_STATIC_LIB)
242+ # Use --whole-archive to ensure malloc override symbols are included
243+ target_link_options (alloc_cpp_tcmalloc_static PRIVATE "LINKER:--whole-archive" )
244+ target_link_libraries (alloc_cpp_tcmalloc_static PRIVATE ${TCMALLOC_STATIC_LIB} )
245+ target_link_options (alloc_cpp_tcmalloc_static PRIVATE "LINKER:--no-whole-archive" )
246+ target_link_libraries (alloc_cpp_tcmalloc_static PRIVATE Threads::Threads )
247+ elseif (TCMALLOC_LIBRARIES)
248+ # Fallback to dynamic linking
249+ target_link_libraries (alloc_cpp_tcmalloc_static PRIVATE ${TCMALLOC_LIBRARIES} )
250+ else ()
251+ message (WARNING "TCMalloc not found, alloc_cpp_tcmalloc_static will not link correctly" )
252+ endif ()
253+
254+ # Target: alloc_cpp_tcmalloc_dynamic
255+ set (alloc_cpp_tcmalloc_dynamic_SOURCES
256+ cmake.toml
257+ "src/main.cpp"
258+ )
259+
260+ add_executable (alloc_cpp_tcmalloc_dynamic )
261+
262+ target_sources (alloc_cpp_tcmalloc_dynamic PRIVATE ${alloc_cpp_tcmalloc_dynamic_SOURCES} )
263+ source_group (TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${alloc_cpp_tcmalloc_dynamic_SOURCES} )
264+
265+ target_compile_definitions (alloc_cpp_tcmalloc_dynamic PRIVATE
266+ USE_TCMALLOC=1
267+ )
268+
269+ get_directory_property (CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT )
270+ if (NOT CMKR_VS_STARTUP_PROJECT)
271+ set_property (DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT alloc_cpp_tcmalloc_dynamic )
272+ endif ()
273+
274+ set (CMKR_TARGET alloc_cpp_tcmalloc_dynamic)
275+ if (TCMALLOC_AVAILABLE)
276+ target_link_libraries (alloc_cpp_tcmalloc_dynamic PRIVATE ${TCMALLOC_LIBRARIES} )
277+ if (TCMALLOC_INCLUDE_DIRS)
278+ target_include_directories (alloc_cpp_tcmalloc_dynamic PRIVATE ${TCMALLOC_INCLUDE_DIRS} )
279+ endif ()
280+ else ()
281+ message (WARNING "TCMalloc not found, alloc_cpp_tcmalloc_dynamic will not link correctly" )
282+ endif ()
0 commit comments