11if (UNIX )
2- set (PYTHON_COMPONENTS Development.Module)
2+ set (PYTHON_COMPONENTS Interpreter Development.Module)
33endif ()
44
55include (${JRL_CMAKE_MODULES} /python.cmake)
66include (${JRL_CMAKE_MODULES} /python-helpers.cmake)
77
8- findpython(REQUIRED Development.Module)
8+ option (GENERATE_PYTHON_STUBS "Generate Python stubs" OFF )
9+
10+ findpython(REQUIRED)
11+ set (Python_INCLUDE_DIRS ${Python3_INCLUDE_DIRS} )
12+ # Nanobind expects these targets instead of Python3::*
13+ # https://github.com/jrl-umi3218/jrl-cmakemodules/issues/708
14+ add_library (Python::Module ALIAS Python3::Module)
15+ add_executable (Python::Interpreter ALIAS Python3::Interpreter)
916
1017if (IS_ABSOLUTE ${PYTHON_SITELIB} )
1118 set (${PYWRAP} _INSTALL_DIR ${PYTHON_SITELIB} /${PROJECT_NAME} )
@@ -14,11 +21,21 @@ else()
1421 ${CMAKE_INSTALL_PREFIX} /${PYTHON_SITELIB} /${PROJECT_NAME} )
1522endif ()
1623
17- find_package (pybind11 CONFIG)
18- if (NOT pybind11_FOUND)
19- file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /external/pybind11)
20- add_subdirectory (external/pybind11
21- ${CMAKE_CURRENT_BINARY_DIR} /external/pybind11)
24+ cmake_policy (PUSH)
25+ cmake_policy (SET CMP0074 NEW)
26+ # Detect the installed nanobind package and import it into CMake
27+ execute_process (
28+ COMMAND "${Python_EXECUTABLE} " -m nanobind --cmake_dir
29+ OUTPUT_STRIP_TRAILING_WHITESPACE
30+ OUTPUT_VARIABLE nanobind_ROOT)
31+ find_package (nanobind CONFIG)
32+ cmake_policy (POP)
33+ if (NOT nanobind_FOUND)
34+ file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /external/nanobind)
35+ add_subdirectory (external/nanobind
36+ ${CMAKE_CURRENT_BINARY_DIR} /external/nanobind)
37+ else ()
38+ message (STATUS "Found installed nanobind." )
2239endif ()
2340
2441add_custom_target (${PROJECT_NAME} _python)
@@ -29,14 +46,12 @@ file(GLOB_RECURSE PYWRAP_SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp)
2946
3047# Add simd feature detectors for current intel CPU
3148if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "(x86)|(X86)|(amd64)|(AMD64)" )
32- python3_add_library (instructionset MODULE helpers/instruction-set.cpp)
49+ nanobind_add_module (instructionset helpers/instruction-set.cpp)
3350 add_dependencies (${PROJECT_NAME} _python instructionset)
34- target_link_libraries (instructionset PRIVATE proxsuite pybind11::module )
51+ target_link_libraries (instructionset PRIVATE proxsuite)
3552 set_target_properties (
3653 instructionset
3754 PROPERTIES OUTPUT_NAME instructionset
38- PREFIX ""
39- SUFFIX ${PYTHON_EXT_SUFFIX}
4055 LIBRARY_OUTPUT_DIRECTORY
4156 "${PROJECT_BINARY_DIR} /bindings/python/${PROJECT_NAME} "
4257 LIBRARY_OUTPUT_DIRECTORY_RELEASE
@@ -58,6 +73,20 @@ if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
5873 TARGETS instructionset
5974 EXPORT ${TARGETS_EXPORT_NAME}
6075 DESTINATION ${${PYWRAP} _INSTALL_DIR})
76+ if (GENERATE_PYTHON_STUBS)
77+ nanobind_add_stub(
78+ instructionset_stub
79+ MODULE
80+ instructionset
81+ OUTPUT
82+ instructionset.pyi
83+ PYTHON_PATH
84+ $<TARGET_FILE_DIR:instructionset>
85+ DEPENDS
86+ instructionset)
87+ install (FILES ${CMAKE_CURRENT_BINARY_DIR} /instructionset.pyi
88+ DESTINATION ${${PYWRAP} _INSTALL_DIR})
89+ endif ()
6190endif ()
6291
6392function (list_filter list regular_expression dest_list)
@@ -72,12 +101,12 @@ function(list_filter list regular_expression dest_list)
72101endfunction (list_filter)
73102
74103function (CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies)
75- python3_add_library (${target_name} MODULE ${PYWRAP_SOURCES} ${PYWRAP_HEADERS} )
104+ nanobind_add_module (${target_name} ${PYWRAP_SOURCES} ${PYWRAP_HEADERS} )
76105 add_dependencies (${PROJECT_NAME} _python ${target_name} )
77106
78- target_link_libraries (${target_name} PUBLIC ${dependencies} pybind11::module )
107+ target_link_libraries (${target_name} PUBLIC ${dependencies} )
79108 target_compile_options (${target_name} PRIVATE ${COMPILE_OPTIONS} )
80- target_link_libraries (${target_name} PRIVATE proxsuite pybind11::module )
109+ target_link_libraries (${target_name} PRIVATE proxsuite)
81110 target_compile_definitions (${target_name}
82111 PRIVATE PYTHON_MODULE_NAME=${target_name} )
83112
@@ -104,8 +133,6 @@ function(CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies)
104133 set_target_properties (
105134 ${target_name}
106135 PROPERTIES OUTPUT_NAME ${target_name}
107- PREFIX ""
108- SUFFIX ${PYTHON_EXT_SUFFIX}
109136 LIBRARY_OUTPUT_DIRECTORY
110137 "${PROJECT_BINARY_DIR} /bindings/python/${PROJECT_NAME} "
111138 LIBRARY_OUTPUT_DIRECTORY_RELEASE
@@ -126,6 +153,20 @@ function(CREATE_PYTHON_TARGET target_name COMPILE_OPTIONS dependencies)
126153 endif ()
127154
128155 install (TARGETS ${target_name} DESTINATION ${${PYWRAP} _INSTALL_DIR})
156+ if (GENERATE_PYTHON_STUBS)
157+ nanobind_add_stub(
158+ ${target_name} _stub
159+ MODULE
160+ ${target_name}
161+ OUTPUT
162+ ${target_name} .pyi
163+ PYTHON_PATH
164+ $<TARGET_FILE_DIR:${target_name} >
165+ DEPENDS
166+ ${target_name} )
167+ install (FILES ${CMAKE_CURRENT_BINARY_DIR} /${target_name} .pyi
168+ DESTINATION ${${PYWRAP} _INSTALL_DIR})
169+ endif ()
129170endfunction ()
130171
131172if (CMAKE_CXX_COMPILER_ID MATCHES MSVC )
0 commit comments