From 0b57a37ebb1bbab79875ad51397c030b4f8a4699 Mon Sep 17 00:00:00 2001 From: Moritz Heinemann Date: Tue, 12 Aug 2025 18:03:28 +0200 Subject: [PATCH] Refactor python build system --- python/.gitignore | 9 +------ python/CMakeLists.txt | 49 +++++++----------------------------- python/HeaderFixer.txt | 16 ------------ python/pyproject.toml | 29 +++++++++++++++++++++ python/setup.py | 57 ------------------------------------------ 5 files changed, 39 insertions(+), 121 deletions(-) delete mode 100644 python/HeaderFixer.txt create mode 100644 python/pyproject.toml delete mode 100644 python/setup.py diff --git a/python/.gitignore b/python/.gitignore index 0aa3c9b9..704d3075 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -1,8 +1 @@ -*.dylib -*.so.* -build -dist -tracy_client.egg-info -client -common -tracy +*.whl diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index a4a8978e..be867665 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -7,7 +7,7 @@ if(EXTERNAL_PYBIND11) include(FetchContent) - FetchContent_Declare(pybind11 GIT_REPOSITORY "https://github.com/pybind/pybind11.git" GIT_TAG "v2.11.1" GIT_SHALLOW ON TEST_BEFORE_INSTALL ON) + FetchContent_Declare(pybind11 GIT_REPOSITORY "https://github.com/pybind/pybind11.git" GIT_TAG "v2.13.6" GIT_SHALLOW ON) FetchContent_MakeAvailable(pybind11) endif() @@ -20,44 +20,13 @@ target_link_libraries(TracyClientBindings PUBLIC ${Python_LIBRARIES}) target_compile_definitions(TracyClientBindings PUBLIC BUFFER_SIZE=${BUFFER_SIZE}) target_compile_definitions(TracyClientBindings PUBLIC NAME_LENGTH=${NAME_LENGTH}) -set(TRACY_PYTHON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tracy_client) -set(TRACY_LIB_SYMLINK $$$) +if (UNIX) + set_target_properties(TracyClientBindings PROPERTIES + BUILD_RPATH_USE_ORIGIN TRUE + INSTALL_RPATH "\$ORIGIN/lib") +endif () -list(TRANSFORM client_includes REPLACE "^${TRACY_PUBLIC_DIR}" "${TRACY_PYTHON_DIR}" OUTPUT_VARIABLE python_client_includes) -list(TRANSFORM common_includes REPLACE "^${TRACY_PUBLIC_DIR}" "${TRACY_PYTHON_DIR}" OUTPUT_VARIABLE python_common_includes) -list(TRANSFORM tracy_includes REPLACE "^${TRACY_PUBLIC_DIR}" "${TRACY_PYTHON_DIR}" OUTPUT_VARIABLE python_tracy_includes) - -add_custom_command(TARGET TracyClient TracyClientBindings POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${TRACY_PYTHON_DIR}/client - COMMAND ${CMAKE_COMMAND} -E copy ${client_includes} ${TRACY_PYTHON_DIR}/client - COMMAND ${CMAKE_COMMAND} -DFOLDER=${TRACY_PYTHON_DIR}/client -P ${CMAKE_CURRENT_SOURCE_DIR}/HeaderFixer.txt - - COMMAND ${CMAKE_COMMAND} -E make_directory ${TRACY_PYTHON_DIR}/common - COMMAND ${CMAKE_COMMAND} -E copy ${common_includes} ${TRACY_PYTHON_DIR}/common - COMMAND ${CMAKE_COMMAND} -DFOLDER=${TRACY_PYTHON_DIR}/common -P ${CMAKE_CURRENT_SOURCE_DIR}/HeaderFixer.txt - - COMMAND ${CMAKE_COMMAND} -E make_directory ${TRACY_PYTHON_DIR}/tracy - COMMAND ${CMAKE_COMMAND} -E copy ${tracy_includes} ${TRACY_PYTHON_DIR}/tracy - COMMAND ${CMAKE_COMMAND} -DFOLDER=${TRACY_PYTHON_DIR}/tracy -P ${CMAKE_CURRENT_SOURCE_DIR}/HeaderFixer.txt - - COMMAND ${CMAKE_COMMAND} -E copy $ ${TRACY_PYTHON_DIR}/ - - COMMAND ${CMAKE_COMMAND} -E copy $ ${TRACY_PYTHON_DIR}/ - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/../${TRACY_LIB_SYMLINK} ${TRACY_PYTHON_DIR}/ - - BYPRODUCTS ${python_client_includes} ${python_common_includes} ${python_tracy_includes} ${TRACY_PYTHON_DIR}/client ${TRACY_PYTHON_DIR}/common ${TRACY_PYTHON_DIR}/tracy +install(TARGETS TracyClientBindings + RUNTIME DESTINATION . + LIBRARY DESTINATION . ) - -set(TRACY_CLIENT_PYTHON_TARGET "" CACHE STRING "Optional directory to copy python files to") - -if(NOT TRACY_CLIENT_PYTHON_TARGET STREQUAL "") - file(GLOB_RECURSE TRACY_CLIENT_PYTHON_FILES ${TRACY_PYTHON_DIR}/*.py*) - list(TRANSFORM TRACY_CLIENT_PYTHON_FILES REPLACE "^${TRACY_PYTHON_DIR}" "${TRACY_CLIENT_PYTHON_TARGET}" OUTPUT_VARIABLE TRACY_CLIENT_TARGET_PYTHON_FILES) - - add_custom_command(TARGET TracyClientBindings POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${TRACY_CLIENT_PYTHON_TARGET} - COMMAND ${CMAKE_COMMAND} -E copy $ ${TRACY_CLIENT_PYTHON_TARGET}/ - COMMAND ${CMAKE_COMMAND} -E copy ${TRACY_CLIENT_PYTHON_FILES} ${TRACY_CLIENT_PYTHON_TARGET}/ - BYPRODUCTS ${TRACY_CLIENT_TARGET_PYTHON_FILES} - ) -endif() diff --git a/python/HeaderFixer.txt b/python/HeaderFixer.txt deleted file mode 100644 index 45c25d61..00000000 --- a/python/HeaderFixer.txt +++ /dev/null @@ -1,16 +0,0 @@ -function(fix_header FILE) - file(READ ${FILE} FILE_CONTENT) - string(REPLACE "../client" "client" FILE_CONTENT "${FILE_CONTENT}") - string(REPLACE "../common" "common" FILE_CONTENT "${FILE_CONTENT}") - string(REPLACE "../tracy" "tracy" FILE_CONTENT "${FILE_CONTENT}") - file(WRITE ${FILE} "${FILE_CONTENT}") -endfunction() - -function(fix_headers FOLDER) - file(GLOB FILES "${FOLDER}/*.h*") - foreach(FILE ${FILES}) - fix_header(${FILE}) - endforeach() -endfunction() - -fix_headers(${FOLDER}) diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 00000000..436e2e5e --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["scikit-build-core>=0.11"] +build-backend = "scikit_build_core.build" + +[project] +name = "tracy_client" +version = "0.12.2" +description = "A real time, nanosecond resolution, remote telemetry, hybrid frame and sampling profiler for games and other applications." +authors = [ + { name = "Bartosz Taudul", email = "wolf@nereid.pl" }, +] +requires-python = ">=3.10" + +[project.urls] +homepage = "https://github.com/wolfpld/tracy" +source = "https://github.com/wolfpld/tracy" + +[tool.scikit-build] +cmake.version = ">=3.15.0" +ninja.version = ">=1.11" +cmake.source-dir = ".." +cmake.build-type = "Release" +wheel.install-dir = "tracy_client" +wheel.packages = ["tracy_client"] + +[tool.scikit-build.cmake.define] +TRACY_CLIENT_PYTHON = "ON" +TRACY_STATIC = "OFF" +CMAKE_INSTALL_BINDIR = "" diff --git a/python/setup.py b/python/setup.py deleted file mode 100644 index 07d568ad..00000000 --- a/python/setup.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- - -import glob -import os -import shutil - -from typing import List - -from setuptools import setup, find_namespace_packages, Extension -from setuptools.command.build_ext import build_ext - -MODULE_NAME = "tracy_client" - - -def find_files(pattern: str) -> List[str]: - return glob.glob(os.path.join(MODULE_NAME, pattern), recursive=True) - - -class ManualExtension(Extension): - def __init__(self) -> None: - super().__init__(name=MODULE_NAME, sources=[]) - - -class DummyBuild(build_ext): - def build_extension(self, ext) -> None: - extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) - extdir = os.path.join(extdir, MODULE_NAME) - - for entry in find_files("*cpython*"): - shutil.copy( - os.path.abspath(entry), - os.path.join(extdir, os.path.basename(entry)), - ) - - -setup( - name=MODULE_NAME, - version="0.10.0", - author="Bartosz Taudul", - author_email="wolf@nereid.pl", - description="A real time, nanosecond resolution, remote telemetry, hybrid frame and sampling profiler for games and other applications.", - long_description="This package contains the client code only. See the documentation for further details.", - url="https://github.com/wolfpld/tracy", - ext_modules=[ManualExtension()], - cmdclass={"build_ext": DummyBuild}, - package_dir={"": "."}, - packages=find_namespace_packages(where="."), - package_data={"": ["py.typed"]}, - data_files=[ - ("lib", find_files("lib*")), - ("include/client", find_files("client/*.h*")), - ("include/common", find_files("common/*.h*")), - ("include/tracy", find_files("tracy/*.h*")), - ], - include_package_data=True, - zip_safe=False, -)