diff --git a/cmake/modules/FindJemalloc.cmake b/cmake/modules/FindJemalloc.cmake --- a/cmake/modules/FindJemalloc.cmake +++ b/cmake/modules/FindJemalloc.cmake @@ -35,15 +35,64 @@ set(Jemalloc_INCLUDE_DIRS ${Jemalloc_INCLUDE_DIR}) mark_as_advanced(Jemalloc_INCLUDE_DIR) +function(_Jemalloc_check_build RESULT) + set( + SOURCE_FILE + "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckJemallocBuilds.c" + ) + set( + CMAKE_CONFIGURABLE_FILE_CONTENT + " + int main(int argc, char** argv) { + (void)argv; + return argc + (int)(malloc(42)); + } + " + ) + configure_file( + "${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in" + "${SOURCE_FILE}" + @ONLY + ) + try_compile(${RESULT} + ${CMAKE_BINARY_DIR} + ${SOURCE_FILE} + LINK_LIBRARIES Jemalloc::jemalloc + ) +endfunction() + if(Jemalloc_INCLUDE_DIR) include(ExternalLibraryHelper) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + find_component(Jemalloc jemalloc - NAMES jemalloc + NAMES jemalloc_pic jemalloc HINTS "${BREW_HINT}" INCLUDE_DIRS ${Jemalloc_INCLUDE_DIRS} PATHS ${PC_Jemalloc_LIBRARY_DIRS} + INTERFACE_LINK_LIBRARIES "$<$>:m>" Threads::Threads ) + + # jemalloc might be built with or without libdl support. Check if the link + # succeeds without -ldl, and add the flag otherwise. + if(TARGET Jemalloc::jemalloc) + _Jemalloc_check_build(_Jemalloc_BUILD_WITHOUT_DL) + if(NOT ${_Jemalloc_BUILD_WITHOUT_DL}) + set_property( + TARGET Jemalloc::jemalloc APPEND + PROPERTY INTERFACE_LINK_LIBRARIES "$<$>:dl>" + ) + set(_Jemalloc_NEEDS_DL TRUE) + else() + set(_Jemalloc_NEEDS_DL FALSE) + endif() + + if(NOT Jemalloc_FIND_QUIETLY) + message(STATUS "Check if jemalloc needs libdl - ${_Jemalloc_NEEDS_DL}") + endif() + endif() endif() if(NOT Jemalloc_VERSION)