Skip to content

Commit a73f4f0

Browse files
committed
Use scikit-build-core
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
1 parent 6d2e143 commit a73f4f0

File tree

4 files changed

+252
-41
lines changed

4 files changed

+252
-41
lines changed

CMakeLists.txt

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
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_INCLUDE_DIR ${LIBBACKTRACE_DIR}/install/include)
51+
set(LIBBACKTRACE_LIB_DIR ${LIBBACKTRACE_DIR}/install/lib)
52+
53+
# Add custom command to build libbacktrace
54+
add_custom_command(
55+
OUTPUT ${LIBBACKTRACE_LIB_DIR}/libbacktrace.a
56+
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace_build
57+
COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBBACKTRACE_INSTALL_DIR}
58+
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace_build
59+
${LIBBACKTRACE_DIR}/configure
60+
--with-pic
61+
--prefix=${LIBBACKTRACE_INSTALL_DIR}
62+
--includedir=${LIBBACKTRACE_INSTALL_DIR}/include/libbacktrace
63+
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace_build make -j
64+
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace_build make install
65+
DEPENDS ${LIBBACKTRACE_DIR}/configure
66+
)
67+
add_custom_target(libbacktrace DEPENDS ${LIBBACKTRACE_LIB_DIR}/libbacktrace.a)
68+
69+
# _memray extension
70+
71+
add_custom_command(
72+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_memray.cpp
73+
COMMAND Python::Interpreter -m cython
74+
--cplus
75+
-3
76+
-I ${CMAKE_SOURCE_DIR}/src/memray/
77+
${CMAKE_SOURCE_DIR}/src/memray/_memray.pyx
78+
-o ${CMAKE_CURRENT_BINARY_DIR}/_memray.cpp
79+
DEPENDS ${CMAKE_SOURCE_DIR}/src/memray/_memray.pyx
80+
VERBATIM
81+
)
82+
set(MEMRAY_SOURCES
83+
src/memray/_memray/compat.cpp
84+
src/memray/_memray/hooks.cpp
85+
src/memray/_memray/tracking_api.cpp
86+
src/memray/_memray/${BINARY_FORMAT}_shenanigans.cpp
87+
src/memray/_memray/logging.cpp
88+
src/memray/_memray/python_helpers.cpp
89+
src/memray/_memray/source.cpp
90+
src/memray/_memray/sink.cpp
91+
src/memray/_memray/records.cpp
92+
src/memray/_memray/record_reader.cpp
93+
src/memray/_memray/record_writer.cpp
94+
src/memray/_memray/snapshot.cpp
95+
src/memray/_memray/socket_reader_thread.cpp
96+
src/memray/_memray/native_resolver.cpp
97+
)
98+
python_add_library(_memray MODULE WITH_SOABI ${MEMRAY_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/_memray.cpp)
99+
target_include_directories(_memray PRIVATE
100+
${CMAKE_SOURCE_DIR}/src/memray/_memray
101+
${LIBBACKTRACE_INCLUDE_DIR}
102+
${LZ4_INCLUDE_DIRS}
103+
)
104+
target_link_libraries(_memray PRIVATE ${LZ4_LIBRARIES} dl ${LIBUNWIND_LIBRARIES} ${LIBBACKTRACE_LIB_DIR}/libbacktrace.a)
105+
target_link_options(_memray PRIVATE ${LZ4_LDFLAGS})
106+
target_compile_options(_memray PRIVATE ${COMPILER_FLAGS})
107+
target_link_options(_memray PRIVATE ${LINKER_FLAGS})
108+
add_dependencies(_memray libbacktrace)
109+
110+
# _test_utils extension
111+
112+
add_custom_command(
113+
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_memray_test_utils.cpp
114+
COMMAND Python::Interpreter -m cython
115+
--cplus
116+
-3
117+
-I ${CMAKE_SOURCE_DIR}/src/memray/
118+
${CMAKE_SOURCE_DIR}/src/memray/_memray_test_utils.pyx
119+
-o ${CMAKE_CURRENT_BINARY_DIR}/_memray_test_utils.cpp
120+
--module-name memray._test_utils
121+
DEPENDS ${CMAKE_SOURCE_DIR}/src/memray/_memray_test_utils.pyx
122+
VERBATIM
123+
)
124+
python_add_library(_test_utils MODULE WITH_SOABI ${CMAKE_CURRENT_BINARY_DIR}/_memray_test_utils.cpp)
125+
target_include_directories(_test_utils PRIVATE
126+
${CMAKE_SOURCE_DIR}/src/memray/_memray
127+
)
128+
129+
# _inject extension
130+
131+
set(INJECT_SOURCES
132+
src/memray/_memray/inject.cpp
133+
)
134+
python_add_library(_inject MODULE WITH_SOABI USE_SABI 3.7 ${INJECT_SOURCES})
135+
target_include_directories(_inject PRIVATE
136+
${CMAKE_SOURCE_DIR}/src/memray
137+
)
138+
target_compile_options(_test_utils PRIVATE ${COMPILER_FLAGS})
139+
target_link_options(_test_utils PRIVATE ${LINKER_FLAGS})
140+
target_compile_options(_inject PRIVATE ${COMPILER_FLAGS})
141+
target_link_options(_inject PRIVATE ${LINKER_FLAGS})
142+
143+
144+
# Install targets
145+
install(TARGETS _memray _test_utils _inject LIBRARY DESTINATION memray)

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ build: build-js build-ext ## (default) Build package extensions and assets in-p
2525

2626
.PHONY: build-ext
2727
build-ext: ## Build package extensions in-place
28-
$(PYTHON) setup.py build_ext --inplace
28+
$(PYTHON) -m pip install --no-build-isolation --config-settings=editable.rebuild=true -Cbuild-dir=build -ve.
2929

3030
$(reporters_path)/templates/assets/%.js: $(reporters_path)/assets/%.js
3131
$(NPM) install

pyproject.toml

Lines changed: 101 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,92 @@
1-
[build-system]
1+
[project]
2+
name = "memray"
3+
version = "1.11.0"
4+
description = "A memory profiler for Python applications"
5+
readme = "README.md"
6+
requires-python = ">=3.7.0"
7+
license = { text = "Apache 2.0" }
8+
authors = [{ name = "Pablo Galindo Salgado" }]
9+
classifiers = [
10+
"Intended Audience :: Developers",
11+
"License :: OSI Approved :: Apache Software License",
12+
"Operating System :: POSIX :: Linux",
13+
"Operating System :: MacOS",
14+
"Programming Language :: Python :: 3.8",
15+
"Programming Language :: Python :: 3.9",
16+
"Programming Language :: Python :: 3.10",
17+
"Programming Language :: Python :: 3.11",
18+
"Programming Language :: Python :: 3.12",
19+
"Programming Language :: Python :: Implementation :: CPython",
20+
"Topic :: Software Development :: Debuggers",
21+
]
22+
dependencies = [
23+
"jinja2 >= 2.9",
24+
"typing_extensions; python_version < '3.8.0'",
25+
"rich >= 11.2.0",
26+
"textual >= 0.41.0",
27+
]
228

3-
requires = [
4-
"setuptools",
5-
"wheel",
6-
"pkgconfig",
7-
"Cython>=0.29.31"
29+
[project.optional-dependencies]
30+
test = [
31+
"Cython",
32+
"greenlet; python_version < '3.12'",
33+
"pytest",
34+
"pytest-cov",
35+
"ipython",
36+
"setuptools; python_version >= '3.12'",
37+
"pytest-textual-snapshot",
38+
]
39+
docs = [
40+
"IPython",
41+
"bump2version",
42+
"sphinx",
43+
"furo",
44+
"sphinx-argparse",
45+
"towncrier",
46+
]
47+
lint = ["black", "flake8", "isort", "mypy", "check-manifest"]
48+
benchmark = ["asv"]
49+
dev = [
50+
"Cython",
51+
"greenlet; python_version < '3.12'",
52+
"pytest",
53+
"pytest-cov",
54+
"ipython",
55+
"setuptools; python_version >= '3.12'",
56+
"pytest-textual-snapshot",
57+
"black",
58+
"flake8",
59+
"isort",
60+
"mypy",
61+
"check-manifest",
62+
"IPython",
63+
"bump2version",
64+
"sphinx",
65+
"furo",
66+
"sphinx-argparse",
67+
"towncrier",
68+
"asv",
869
]
970

10-
build-backend = 'setuptools.build_meta'
71+
[project.urls]
72+
Homepage = "https://github.com/bloomberg/memray"
73+
74+
[project.scripts]
75+
memray = "memray.__main__:main"
76+
"memray3.7" = "memray.__main__:main"
77+
"memray3.8" = "memray.__main__:main"
78+
"memray3.9" = "memray.__main__:main"
79+
"memray3.10" = "memray.__main__:main"
80+
"memray3.11" = "memray.__main__:main"
81+
"memray3.12" = "memray.__main__:main"
82+
83+
[build-system]
84+
requires = ["scikit-build-core", "cython"]
85+
build-backend = "scikit_build_core.build"
86+
87+
[tool.scikit-build]
88+
wheel.packages = ["src/memray"]
89+
1190

1291
[tool.ruff]
1392
line-length = 95
@@ -17,7 +96,7 @@ fix = true
1796
[tool.ruff.isort]
1897
force-single-line = true
1998
known-first-party = ["memray"]
20-
known-third-party=["rich", "elftools", "pytest"]
99+
known-third-party = ["rich", "elftools", "pytest"]
21100

22101
[tool.ruff.per-file-ignores]
23102
"benchmarks/*" = ["C4", "PERF"]
@@ -29,36 +108,32 @@ include_trailing_comma = true
29108
force_grid_wrap = 0
30109
use_parentheses = true
31110
line_length = 88
32-
known_first_party=["memray"]
33-
known_third_party=["rich", "elftools", "pytest"]
111+
known_first_party = ["memray"]
112+
known_third_party = ["rich", "elftools", "pytest"]
34113

35114
[tool.towncrier]
36115
package = "memray"
37116
package_dir = "src"
38117
filename = "NEWS.rst"
39118
directory = "news"
40119
type = [
41-
{ name = "Features", directory = "feature", showcontent = true },
120+
{ name = "Features", directory = "feature", showcontent = true },
42121
{ name = "Deprecations and Removals", directory = "removal", showcontent = true },
43-
{ name = "Bug Fixes", directory = "bugfix", showcontent = true },
44-
{ name = "Improved Documentation", directory = "doc", showcontent = true },
45-
{ name = "Miscellaneous", directory = "misc", showcontent = true },
122+
{ name = "Bug Fixes", directory = "bugfix", showcontent = true },
123+
{ name = "Improved Documentation", directory = "doc", showcontent = true },
124+
{ name = "Miscellaneous", directory = "misc", showcontent = true },
46125
]
47126
underlines = "-~"
48127

49128
[tool.pytest.ini_options]
50-
markers = [
51-
"valgrind",
52-
]
129+
markers = ["valgrind"]
53130
xfail_strict = true
54131

55132
[tool.check-manifest]
56-
ignore = [
57-
"src/memray/reporters/templates/assets/*.js",
58-
]
133+
ignore = ["src/memray/reporters/templates/assets/*.js"]
59134

60135
[tool.mypy]
61-
exclude="tests/integration/(native_extension|multithreaded_extension)/"
136+
exclude = "tests/integration/(native_extension|multithreaded_extension)/"
62137

63138
[tool.cibuildwheel]
64139
build = ["cp38-*", "cp39-*", "cp310-*", "cp311-*"]
@@ -82,26 +157,19 @@ before-all = [
82157
"git clone --depth 1 --branch v1.9.4 https://github.com/lz4/lz4 lz4",
83158
"cd lz4",
84159
"make",
85-
"make install DESTDIR=/tmp/lz4_install"
160+
"make install DESTDIR=/tmp/lz4_install",
86161
]
87162
before-test = [
88163
"codesign --remove-signature /Library/Frameworks/Python.framework/Versions/*/bin/python3 || true",
89164
"codesign --remove-signature /Library/Frameworks/Python.framework/Versions/*/Resources/Python.app/Contents/MacOS/Python || true",
90165
]
91166

92167
[tool.coverage.run]
93-
plugins = [
94-
"Cython.Coverage",
95-
]
96-
source = [
97-
"src/memray",
98-
"tests/",
99-
]
168+
plugins = ["Cython.Coverage"]
169+
source = ["src/memray", "tests/"]
100170
branch = true
101171
parallel = true
102-
omit = [
103-
"*__init__.py",
104-
]
172+
omit = ["*__init__.py"]
105173

106174
[tool.coverage.report]
107175
skip_covered = true
@@ -111,6 +179,4 @@ show_missing = true
111179
# Override the default linux before-all for musl linux
112180
[[tool.cibuildwheel.overrides]]
113181
select = "*-musllinux*"
114-
before-all = [
115-
"apk add --update libunwind-dev lz4-dev gdb lldb",
116-
]
182+
before-all = ["apk add --update libunwind-dev lz4-dev gdb lldb"]

src/memray/_memray.pyx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ from libcpp.unordered_map cimport unordered_map
6868
from libcpp.utility cimport move
6969
from libcpp.vector cimport vector
7070

71-
from ._destination import Destination
72-
from ._destination import FileDestination
73-
from ._destination import SocketDestination
74-
from ._metadata import Metadata
75-
from ._stats import Stats
71+
from memray._destination import Destination
72+
from memray._destination import FileDestination
73+
from memray._destination import SocketDestination
74+
from memray._metadata import Metadata
75+
from memray._stats import Stats
7676

7777

7878
def set_log_level(int level):

0 commit comments

Comments
 (0)