From d972b08b6f1510455f911e8b3ddd60bd237ee268 Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Sat, 2 Nov 2024 02:46:48 +0300 Subject: [PATCH] feat: Added CPython and pybind11 libraries --- .gitmodules | 8 ++++ CMakeLists.txt | 90 ++++++++++++++++++++++++++++++++++--- dependencies/CMakeLists.txt | 1 + dependencies/cpython | 1 + dependencies/pybind11 | 1 + 5 files changed, 96 insertions(+), 5 deletions(-) create mode 160000 dependencies/cpython create mode 160000 dependencies/pybind11 diff --git a/.gitmodules b/.gitmodules index 7c4aa63..3b348e3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,11 @@ [submodule "dependencies/sqapi"] path = dependencies/sqapi url = https://gitlab.com/GothicMultiplayerTeam/dependencies/sqapi.git +[submodule "dependencies/pybind11"] + path = dependencies/pybind11 + url = https://github.com/pybind/pybind11.git + branch = master +[submodule "dependencies/cpython"] + path = dependencies/cpython + url = https://github.com/python/cpython.git + branch = 3.12 \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index a9da10c..a112b11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,80 @@ cmake_minimum_required(VERSION 3.21) - -project(squirrel-template) +include(${CMAKE_ROOT}/Modules/ExternalProject.cmake) +project(PyG2O) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) -file(GLOB_RECURSE SRC +# Specify build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() +set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel") + +if (CMAKE_BUILD_TYPE MATCHES "Debug") + set(CPYTHON_BUILD_TYPE Debug) +else () + set(CPYTHON_BUILD_TYPE Release) +endif() + +# Add the cpython as an external project that will be included in the build +if(MSVC) + if(CMAKE_CL_64) + set(CPYTHON_PLATFORM x64) + set(CPYTHON_BUILD_DIR amd64) + else() + set(CPYTHON_PLATFORM x86) + set(CPYTHON_BUILD_DIR win32) + endif() + ExternalProject_Add(CPYTHON + DOWNLOAD_COMMAND "" + SOURCE_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython + CONFIGURE_COMMAND "" + BUILD_COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/cpython && MSBuild.exe /p:Configuration=${CPYTHON_BUILD_TYPE} /property:Platform=${CPYTHON_PLATFORM} "PCBuild/python.vcxproj" /nologo /verbosity:minimal /consoleloggerparameters:summar + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +else() + ExternalProject_Add(CPYTHON + DOWNLOAD_COMMAND "" + SOURCE_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython + CONFIGURE_COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/cpython && ./configure --disable-static --enable-shared + BUILD_COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/cpython && make + INSTALL_COMMAND "" + TEST_COMMAND "" + ) +endif() + +set(CPYTHON_STDLIB_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython/Lib) +if(MSVC) + set(CPYTHON_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython/Include ${CMAKE_SOURCE_DIR}/dependencies/cpython/PC) + set(CPYTHON_LIBRARY_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython/PCBuild/${CPYTHON_BUILD_DIR}) + if(CMAKE_BUILD_TYPE MATCHES "Debug") + set(CPYTHON_BIN ${CMAKE_SOURCE_DIR}/dependencies/cpython/PCBuild/${CPYTHON_BUILD_DIR}/python314_d.dll) + else() + set(CPYTHON_BIN ${CMAKE_SOURCE_DIR}/dependencies/cpython/PCBuild/${CPYTHON_BUILD_DIR}/python314.dll) + endif() +else() + set(CPYTHON_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython/Include ${CMAKE_SOURCE_DIR}/dependencies/cpython) + set(CPYTHON_LIBRARY_DIR ${CMAKE_SOURCE_DIR}/dependencies/cpython) + set(CPYTHON_LIBRARY python3.8m) + set(CPYTHON_BIN ${CMAKE_SOURCE_DIR}/dependencies/dependencies/libpython3.8m.so) +endif() + +file(GLOB_RECURSE SOURCE "include/*.h" "src/*.h" "src/*.cpp" ) -add_library(${PROJECT_NAME} SHARED ${SRC}) +# Linking directories +link_directories(${CPYTHON_LIBRARY_DIR}) + +add_library(${PROJECT_NAME} SHARED ${SOURCE}) + +# Dependencies +add_dependencies(${PROJECT_NAME} CPYTHON) target_compile_definitions(${PROJECT_NAME} PRIVATE @@ -34,4 +96,22 @@ if(DEFINED OUT_FILE_SUFFIX) ) endif() -add_subdirectory(dependencies) \ No newline at end of file +add_subdirectory(dependencies) +target_link_libraries(${PROJECT_NAME} ${CPYTHON_LIBRARY}) +target_link_libraries(${PROJECT_NAME} PRIVATE pybind11::embed) + +# Copy Python DLL to the build folder if different +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + -E copy_if_different ${CPYTHON_BIN} $ +) + +# Copy the Python stdlib into the build folder (needed by the embedded python) +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + -E copy_directory ${CPYTHON_STDLIB_DIR} $/lib +) \ No newline at end of file diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt index a262054..41cabd2 100644 --- a/dependencies/CMakeLists.txt +++ b/dependencies/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(sqapi) +add_subdirectory(pybind11) target_link_libraries(${PROJECT_NAME} PRIVATE diff --git a/dependencies/cpython b/dependencies/cpython new file mode 160000 index 0000000..d07dcce --- /dev/null +++ b/dependencies/cpython @@ -0,0 +1 @@ +Subproject commit d07dcce6935364cab807e0df931ed09b088ade69 diff --git a/dependencies/pybind11 b/dependencies/pybind11 new file mode 160000 index 0000000..75e48c5 --- /dev/null +++ b/dependencies/pybind11 @@ -0,0 +1 @@ +Subproject commit 75e48c5f959b4f0a49d8c664e059b6fb4b497102