Merge remote-tracking branch 'paulmenzel/improve-readme.md'
[sdk/tools/heaptrack.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.9)
2 project(heaptrack)
3 enable_testing()
4
5 if(NOT CMAKE_BUILD_TYPE)
6   message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
7   set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
8 endif()
9
10 set(HEAPTRACK_VERSION_MAJOR 1)
11 set(HEAPTRACK_VERSION_MINOR 2)
12 set(HEAPTRACK_VERSION_PATCH 0)
13 set(HEAPTRACK_LIB_VERSION 1.0.0)
14 set(HEAPTRACK_LIB_SOVERSION 1)
15
16 find_package(Boost 1.41.0 REQUIRED COMPONENTS iostreams program_options)
17 find_package(Threads REQUIRED)
18 find_package(ZLIB REQUIRED)
19 include(FeatureSummary)
20
21 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
22
23
24 option(
25   HEAPTRACK_BUILD_GUI
26   "Disable this option to skip building the Qt5 / KF5 based GUI for heaptrack."
27   On
28 )
29
30 if(HEAPTRACK_BUILD_GUI)
31 find_package(Qt5 5.2.0 NO_MODULE OPTIONAL_COMPONENTS Widgets)
32 find_package(ECM 1.0.0 NO_MODULE)
33 if(Qt5_FOUND AND ECM_FOUND)
34     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
35         find_package(KF5 OPTIONAL_COMPONENTS CoreAddons I18n ItemModels ThreadWeaver ConfigWidgets KIO)
36         find_package(KChart "2.6.0")
37         set_package_properties(KChart PROPERTIES TYPE RECOMMENDED PURPOSE "Required for the heaptrack_gui executable. Get it from the kdiagram module.")
38         if (KF5_FOUND)
39             add_subdirectory(gui)
40         endif()
41     endif()
42 endif()
43
44 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
45
46 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wpedantic")
47
48 add_subdirectory(3rdparty)
49
50 check_library_exists (${LIBUNWIND_LIBRARY} unw_backtrace "" HAVE_UNW_BACKTRACE)
51 if (NOT HAVE_UNW_BACKTRACE)
52     message(FATAL_ERROR "Your libunwind version is apparently too old and does not have the unw_backtrace function.")
53 endif()
54
55 check_library_exists (${LIBUNWIND_LIBRARY} _ULx86_64_set_cache_size "" HAVE_UNW_SET_CACHE_SIZE)
56
57 include (CheckCXXSourceCompiles)
58 check_cxx_source_compiles(
59     "#include <unordered_map>
60     #include <atomic>
61     thread_local int tls;
62     int main() { return 0; }"
63     HAVE_CXX11_SUPPORT)
64
65 if (NOT HAVE_CXX11_SUPPORT)
66     message(FATAL_ERROR "Your compiler is too old and does not support the required C++11 features.")
67 endif()
68
69 check_cxx_source_compiles(
70     "#include <stdio_ext.h>
71     #include <fcntl.h>
72     #include <dlfcn.h>
73     #include <link.h>
74     int main() { return 0; }"
75     HAVE_LINUX_HEADERS)
76
77 if (NOT HAVE_LINUX_HEADERS)
78     message(FATAL_ERROR "You are missing some Linux headers required to compile heaptrack.")
79 endif()
80
81 add_subdirectory(tests)
82
83 include_directories(
84     ${CMAKE_CURRENT_BINARY_DIR}
85     ${Boost_INCLUDE_DIRS}
86     3rdparty/
87     ${LIBUNWIND_INCLUDE_DIR}
88     ${ZLIB_INCLUDE_DIRS}
89 )
90
91 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
92     set(HEAPTRACK_DEBUG_BUILD 1)
93 else()
94     set(HEAPTRACK_DEBUG_BUILD 0)
95 endif()
96
97 configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
98
99 add_library(heaptrack_preload MODULE heaptrack_preload.cpp libheaptrack.cpp)
100 target_link_libraries(heaptrack_preload LINK_PRIVATE ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} ${LIBUNWIND_LIBRARY} rt)
101 set_target_properties(heaptrack_preload PROPERTIES VERSION ${HEAPTRACK_LIB_VERSION} SOVERSION ${HEAPTRACK_LIB_SOVERSION})
102 add_library(heaptrack_inject MODULE heaptrack_inject.cpp libheaptrack.cpp)
103 target_link_libraries(heaptrack_inject LINK_PRIVATE ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} ${LIBUNWIND_LIBRARY} rt)
104 set_target_properties(heaptrack_inject PROPERTIES VERSION ${HEAPTRACK_LIB_VERSION} SOVERSION ${HEAPTRACK_LIB_SOVERSION})
105
106 add_executable(heaptrack_interpret heaptrack_interpret.cpp)
107 target_link_libraries(heaptrack_interpret backtrace)
108
109 add_library(sharedprint STATIC accumulatedtracedata.cpp)
110 target_link_libraries(sharedprint LINK_PUBLIC ${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
111 add_executable(heaptrack_print heaptrack_print.cpp)
112 target_link_libraries(heaptrack_print LINK_PRIVATE sharedprint ${CMAKE_THREAD_LIBS_INIT})
113
114 set(BIN_INSTALL_DIR "bin")
115 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
116 set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
117 set(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/heaptrack/libexec")
118
119 file(RELATIVE_PATH LIBEXEC_REL_PATH
120     "${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR}"
121     "${CMAKE_INSTALL_PREFIX}/${LIBEXEC_INSTALL_DIR}")
122
123 file(RELATIVE_PATH LIB_REL_PATH
124     "${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR}"
125     "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/heaptrack")
126
127 configure_file(heaptrack.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/heaptrack @ONLY)
128
129 install(TARGETS heaptrack_print RUNTIME DESTINATION ${BIN_INSTALL_DIR})
130 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/heaptrack DESTINATION ${BIN_INSTALL_DIR})
131 install(TARGETS heaptrack_interpret RUNTIME DESTINATION ${LIBEXEC_INSTALL_DIR})
132 install(TARGETS heaptrack_inject LIBRARY DESTINATION ${LIB_INSTALL_DIR}/heaptrack/)
133 install(TARGETS heaptrack_preload LIBRARY DESTINATION ${LIB_INSTALL_DIR}/heaptrack/)
134 install(FILES heaptrack_api.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
135
136 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)