Skip one more level in backtraces in debug builds.
[sdk/tools/heaptrack.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.9)
2 project(heaptrack)
3
4 set(HEAPTRACK_VERSION_MAJOR 0)
5 set(HEAPTRACK_VERSION_MINOR 1)
6 set(HEAPTRACK_VERSION_PATCH 0)
7 set(HEAPTRACK_LIB_VERSION 1.0.0)
8 set(HEAPTRACK_LIB_SOVERSION 1)
9
10 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
11
12 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wpedantic")
13
14 find_package(Boost 1.41.0 REQUIRED COMPONENTS iostreams program_options)
15 find_package(Threads REQUIRED)
16
17 add_subdirectory(3rdparty)
18
19 check_library_exists (${LIBUNWIND_LIBRARY} unw_backtrace "" HAVE_UNW_BACKTRACE)
20 if (NOT HAVE_UNW_BACKTRACE)
21     message(FATAL_ERROR "Your libunwind version is apparently too old and does not have the unw_backtrace function.")
22 endif()
23
24 check_library_exists (${LIBUNWIND_LIBRARY} _ULx86_64_set_cache_size "" HAVE_UNW_SET_CACHE_SIZE)
25
26 include (CheckCXXSourceCompiles)
27 check_cxx_source_compiles(
28     "#include <unordered_map>
29     #include <atomic>
30     thread_local int tls;
31     int main() { return 0; }"
32     HAVE_CXX11_SUPPORT)
33
34 if (NOT HAVE_CXX11_SUPPORT)
35     message(FATAL_ERROR "Your compiler is too old and does not support the required C++11 features.")
36 endif()
37
38 check_cxx_source_compiles(
39     "#include <stdio_ext.h>
40     #include <fcntl.h>
41     #include <dlfcn.h>
42     #include <link.h>
43     int main() { return 0; }"
44     HAVE_LINUX_HEADERS)
45
46 if (NOT HAVE_LINUX_HEADERS)
47     message(FATAL_ERROR "You are missing some Linux headers required to compile heaptrack.")
48 endif()
49
50 add_subdirectory(tests)
51
52 include_directories(
53     ${CMAKE_CURRENT_BINARY_DIR}
54     ${Boost_INCLUDE_DIRS}
55     3rdparty/
56     ${LIBUNWIND_INCLUDE_DIR}
57 )
58
59 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
60     set(HEAPTRACK_DEBUG_BUILD 1)
61 else()
62     set(HEAPTRACK_DEBUG_BUILD 0)
63 endif()
64
65 configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
66
67 add_library(heaptrack_preload MODULE heaptrack_preload.cpp libheaptrack.cpp)
68 target_link_libraries(heaptrack_preload LINK_PRIVATE ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} backtrace rt)
69 set_target_properties(heaptrack_preload PROPERTIES VERSION ${HEAPTRACK_LIB_VERSION} SOVERSION ${HEAPTRACK_LIB_SOVERSION})
70 add_library(heaptrack_inject MODULE heaptrack_inject.cpp libheaptrack.cpp)
71 target_link_libraries(heaptrack_inject LINK_PRIVATE ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} backtrace rt)
72 set_target_properties(heaptrack_inject PROPERTIES VERSION ${HEAPTRACK_LIB_VERSION} SOVERSION ${HEAPTRACK_LIB_SOVERSION})
73
74 add_executable(heaptrack_interpret heaptrack_interpret.cpp)
75 target_link_libraries(heaptrack_interpret backtrace)
76
77 add_executable(heaptrack_print heaptrack_print.cpp)
78 target_link_libraries(heaptrack_print ${Boost_LIBRARIES})
79
80 set(BIN_INSTALL_DIR "bin")
81 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
82 set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
83 set(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/heaptrack/libexec")
84
85 file(RELATIVE_PATH LIBEXEC_REL_PATH
86     "${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR}"
87     "${CMAKE_INSTALL_PREFIX}/${LIBEXEC_INSTALL_DIR}")
88
89 file(RELATIVE_PATH LIB_REL_PATH
90     "${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR}"
91     "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/heaptrack")
92
93 configure_file(heaptrack.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/heaptrack @ONLY)
94
95 install(TARGETS heaptrack_print RUNTIME DESTINATION ${BIN_INSTALL_DIR})
96 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/heaptrack DESTINATION ${BIN_INSTALL_DIR})
97 install(TARGETS heaptrack_interpret RUNTIME DESTINATION ${LIBEXEC_INSTALL_DIR})
98 install(TARGETS heaptrack_inject LIBRARY DESTINATION ${LIB_INSTALL_DIR}/heaptrack/)
99 install(TARGETS heaptrack_preload LIBRARY DESTINATION ${LIB_INSTALL_DIR}/heaptrack/)