1+ cmake_minimum_required (VERSION 3.7)
2+ project (memray)
3+
4+ set (CMAKE_CXX_STANDARD 17)
5+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
6+
7+ # Find Python
8+ find_package (Python COMPONENTS Interpreter Development.Module Development.SABIModule REQUIRED)
9+
10+ # Find Cython
11+ find_program (CYTHON_EXECUTABLE cython)
12+ if (NOT CYTHON_EXECUTABLE)
13+ message (FATAL_ERROR "Cython not found. Please install Cython." )
14+ endif ()
15+
16+ # Find required packages
17+ find_package (PkgConfig REQUIRED)
18+ pkg_check_modules(LZ4 REQUIRED liblz4)
19+ if (NOT LZ4_FOUND)
20+ message (FATAL_ERROR "LZ4 library not found. Please install liblz4-dev or equivalent." )
21+ endif ()
22+
23+ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux" )
24+ pkg_check_modules(LIBUNWIND REQUIRED libunwind)
25+ endif ()
26+
27+ # Set compiler flags
28+ set (COMPILER_FLAGS "-Wall" )
29+ if (NOT DEFINED ENV{NO_MEMRAY_FAST_TLS})
30+ add_definitions (-DUSE_MEMRAY_TLS_MODEL=1)
31+ endif ()
32+
33+ if (DEFINED ENV{MEMRAY_MINIMIZE_INLINING})
34+ set (COMPILER_FLAGS ${COMPILER_FLAGS} -Og)
35+ else ()
36+ set (COMPILER_FLAGS ${COMPILER_FLAGS} -flto)
37+ set (LINKER_FLAGS ${LINKER_FLAGS} -flto)
38+ endif ()
39+
40+ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux" )
41+ set (BINARY_FORMAT "elf" )
42+ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
43+ set (BINARY_FORMAT "macho" )
44+ else ()
45+ message (FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME} " )
46+ endif ()
47+
48+ # Set up libbacktrace
49+ set (LIBBACKTRACE_DIR ${CMAKE_SOURCE_DIR} /src/vendor/libbacktrace)
50+ set (LIBBACKTRACE_INSTALL_DIR ${LIBBACKTRACE_DIR} /install )
51+ set (LIBBACKTRACE_INCLUDE_DIR ${LIBBACKTRACE_DIR} /install /include )
52+ set (LIBBACKTRACE_LIB_DIR ${LIBBACKTRACE_DIR} /install /lib)
53+
54+ # Add custom command to build libbacktrace
55+ add_custom_command (
56+ OUTPUT ${LIBBACKTRACE_LIB_DIR} /libbacktrace.a
57+ COMMAND mkdir -p ${LIBBACKTRACE_INSTALL_DIR}
58+ COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR} /libbacktrace_build
59+ COMMAND cd ${CMAKE_CURRENT_BINARY_DIR} /libbacktrace_build &&
60+ ${LIBBACKTRACE_DIR} /configure
61+ --with-pic
62+ --prefix =${LIBBACKTRACE_INSTALL_DIR}
63+ --includedir=${LIBBACKTRACE_INSTALL_DIR} /include /libbacktrace
64+ COMMAND cd ${CMAKE_CURRENT_BINARY_DIR} /libbacktrace_build && make -j
65+ COMMAND cd ${CMAKE_CURRENT_BINARY_DIR} /libbacktrace_build && make install
66+ DEPENDS ${LIBBACKTRACE_DIR} /configure
67+ )
68+ add_custom_target (libbacktrace DEPENDS ${LIBBACKTRACE_LIB_DIR} /libbacktrace.a)
69+
70+ # _memray extension
71+
72+ add_custom_command (
73+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /_memray.cpp
74+ COMMAND Python::Interpreter -m cython
75+ --cplus
76+ -3
77+ -I ${CMAKE_SOURCE_DIR} /src/memray/
78+ ${CMAKE_SOURCE_DIR} /src/memray/_memray.pyx
79+ -o ${CMAKE_CURRENT_BINARY_DIR} /_memray.cpp
80+ DEPENDS ${CMAKE_SOURCE_DIR} /src/memray/_memray.pyx
81+ VERBATIM
82+ )
83+ set (MEMRAY_SOURCES
84+ src/memray/_memray/compat.cpp
85+ src/memray/_memray/hooks.cpp
86+ src/memray/_memray/tracking_api.cpp
87+ src/memray/_memray/${BINARY_FORMAT} _shenanigans.cpp
88+ src/memray/_memray/logging.cpp
89+ src/memray/_memray/python_helpers.cpp
90+ src/memray/_memray/source .cpp
91+ src/memray/_memray/sink.cpp
92+ src/memray/_memray/records.cpp
93+ src/memray/_memray/record_reader.cpp
94+ src/memray/_memray/record_writer.cpp
95+ src/memray/_memray/snapshot.cpp
96+ src/memray/_memray/socket_reader_thread.cpp
97+ src/memray/_memray/native_resolver.cpp
98+ )
99+ python_add_library(_memray MODULE WITH_SOABI ${MEMRAY_SOURCES} ${CMAKE_CURRENT_BINARY_DIR} /_memray.cpp)
100+ target_include_directories (_memray PRIVATE
101+ ${CMAKE_SOURCE_DIR} /src/memray/_memray
102+ ${LIBBACKTRACE_INCLUDE_DIR}
103+ ${LZ4_INCLUDE_DIRS}
104+ )
105+ target_link_libraries (_memray PRIVATE ${LZ4_LIBRARIES} dl ${LIBUNWIND_LIBRARIES} ${LIBBACKTRACE_LIB_DIR} /libbacktrace.a)
106+ target_link_options (_memray PRIVATE ${LZ4_LDFLAGS} )
107+ target_compile_options (_memray PRIVATE ${COMPILER_FLAGS} )
108+ target_link_options (_memray PRIVATE ${LINKER_FLAGS} )
109+ add_dependencies (_memray libbacktrace)
110+
111+ # _test_utils extension
112+
113+ add_custom_command (
114+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR} /_memray_test_utils.cpp
115+ COMMAND Python::Interpreter -m cython
116+ --cplus
117+ -3
118+ -I ${CMAKE_SOURCE_DIR} /src/memray/
119+ ${CMAKE_SOURCE_DIR} /src/memray/_memray_test_utils.pyx
120+ -o ${CMAKE_CURRENT_BINARY_DIR} /_memray_test_utils.cpp
121+ --module-name memray._test_utils
122+ DEPENDS ${CMAKE_SOURCE_DIR} /src/memray/_memray_test_utils.pyx
123+ VERBATIM
124+ )
125+ python_add_library(_test_utils MODULE WITH_SOABI ${CMAKE_CURRENT_BINARY_DIR} /_memray_test_utils.cpp)
126+ target_include_directories (_test_utils PRIVATE
127+ ${CMAKE_SOURCE_DIR} /src/memray/_memray
128+ )
129+
130+ # _inject extension
131+
132+ set (INJECT_SOURCES
133+ src/memray/_memray/inject.cpp
134+ )
135+ python_add_library(_inject MODULE WITH_SOABI USE_SABI 3.7 ${INJECT_SOURCES} )
136+ target_include_directories (_inject PRIVATE
137+ ${CMAKE_SOURCE_DIR} /src/memray
138+ )
139+ target_compile_options (_test_utils PRIVATE ${COMPILER_FLAGS} )
140+ target_link_options (_test_utils PRIVATE ${LINKER_FLAGS} )
141+ target_compile_options (_inject PRIVATE ${COMPILER_FLAGS} )
142+ target_link_options (_inject PRIVATE ${LINKER_FLAGS} )
143+
144+
145+ # Install targets
146+ install (TARGETS _memray _test_utils _inject LIBRARY DESTINATION memray)
0 commit comments