|
5 | 5 |
|
6 | 6 | # After building modules, create the Python package structure. |
7 | 7 | add_custom_target(python_package ALL |
8 | | - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/teleopcore" |
9 | | - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/teleopcore/xrio" |
10 | | - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/teleopcore/oxr" |
11 | | - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/teleopcore/plugin_manager" |
12 | | - COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/teleopcore/schema" |
13 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../xrio/python/xrio_init.py" "${CMAKE_BINARY_DIR}/python_package/teleopcore/xrio/__init__.py" |
14 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../oxr/python/oxr_init.py" "${CMAKE_BINARY_DIR}/python_package/teleopcore/oxr/__init__.py" |
15 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../plugin_manager/python/plugin_manager_init.py" "${CMAKE_BINARY_DIR}/python_package/teleopcore/plugin_manager/__init__.py" |
16 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../schema/python/schema_init.py" "${CMAKE_BINARY_DIR}/python_package/teleopcore/schema/__init__.py" |
17 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/teleopcore_init.py" "${CMAKE_BINARY_DIR}/python_package/teleopcore/__init__.py" |
18 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml" "${CMAKE_BINARY_DIR}/python_package/" |
19 | | - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.in" "${CMAKE_BINARY_DIR}/python_package/" |
| 8 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore" |
| 9 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/xrio" |
| 10 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/oxr" |
| 11 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/plugin_manager" |
| 12 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/schema" |
| 13 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../xrio/python/xrio_init.py" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/xrio/__init__.py" |
| 14 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../oxr/python/oxr_init.py" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/oxr/__init__.py" |
| 15 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../plugin_manager/python/plugin_manager_init.py" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/plugin_manager/__init__.py" |
| 16 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../schema/python/schema_init.py" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/schema/__init__.py" |
| 17 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/teleopcore_init.py" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/teleopcore/__init__.py" |
| 18 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/" |
| 19 | + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.in" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>/" |
20 | 20 | DEPENDS xrio_py oxr_py plugin_manager_py schema_py |
21 | 21 | COMMENT "Preparing Python package structure" |
22 | 22 | ) |
23 | 23 |
|
| 24 | +# Generate Python type stubs (.pyi) for IDE intellisense |
| 25 | +# Uses the same Python version that built the .so files (via uv --python) |
| 26 | +# Each module is processed separately to avoid import chain issues |
| 27 | +set(STUBGEN_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/generate_stubs.py") |
| 28 | +set(STUBGEN_PACKAGE_DIR "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>") |
| 29 | +set(PY_TYPED_MARKER "${STUBGEN_PACKAGE_DIR}/teleopcore/py.typed") |
| 30 | + |
| 31 | +add_custom_command( |
| 32 | + OUTPUT "${PY_TYPED_MARKER}" |
| 33 | + COMMAND ${CMAKE_COMMAND} -E echo "Generating Python type stubs..." |
| 34 | + |
| 35 | + # Generate stubs for each pybind11 module |
| 36 | + COMMAND uv run --no-project --python ${TELEOPCORE_PYTHON_VERSION} --with pybind11-stubgen |
| 37 | + python "${STUBGEN_SCRIPT}" teleopcore.xrio._xrio "${STUBGEN_PACKAGE_DIR}" |
| 38 | + COMMAND uv run --no-project --python ${TELEOPCORE_PYTHON_VERSION} --with pybind11-stubgen |
| 39 | + python "${STUBGEN_SCRIPT}" teleopcore.oxr._oxr "${STUBGEN_PACKAGE_DIR}" |
| 40 | + COMMAND uv run --no-project --python ${TELEOPCORE_PYTHON_VERSION} --with pybind11-stubgen |
| 41 | + python "${STUBGEN_SCRIPT}" teleopcore.plugin_manager._plugin_manager "${STUBGEN_PACKAGE_DIR}" |
| 42 | + COMMAND uv run --no-project --python ${TELEOPCORE_PYTHON_VERSION} --with pybind11-stubgen |
| 43 | + python "${STUBGEN_SCRIPT}" teleopcore.schema._schema "${STUBGEN_PACKAGE_DIR}" |
| 44 | + |
| 45 | + # Create py.typed marker file (PEP 561) - also serves as build stamp |
| 46 | + COMMAND ${CMAKE_COMMAND} -E touch "${PY_TYPED_MARKER}" |
| 47 | + DEPENDS python_package "${STUBGEN_SCRIPT}" |
| 48 | + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" |
| 49 | + COMMENT "Generating .pyi stub files for teleopcore modules" |
| 50 | +) |
| 51 | + |
| 52 | +add_custom_target(python_stubs |
| 53 | + DEPENDS "${PY_TYPED_MARKER}" |
| 54 | + SOURCES "${STUBGEN_SCRIPT}" |
| 55 | +) |
| 56 | + |
24 | 57 | # Custom target to build the wheel using uv |
25 | 58 | add_custom_target(python_wheel ALL |
26 | 59 | COMMAND ${CMAKE_COMMAND} -E echo "Building Python wheel with uv..." |
27 | 60 | COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/wheels" |
28 | | - COMMAND uv build --wheel --out-dir "${CMAKE_BINARY_DIR}/wheels" "${CMAKE_BINARY_DIR}/python_package" || |
29 | | - python3 -m build --wheel --outdir "${CMAKE_BINARY_DIR}/wheels" "${CMAKE_BINARY_DIR}/python_package" |
| 61 | + COMMAND uv build --wheel --out-dir "${CMAKE_BINARY_DIR}/wheels" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>" || |
| 62 | + python3 -m build --wheel --outdir "${CMAKE_BINARY_DIR}/wheels" "${CMAKE_BINARY_DIR}/python_package/$<CONFIG>" |
30 | 63 | DEPENDS python_package |
| 64 | + DEPENDS python_stubs |
31 | 65 | WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" |
32 | 66 | COMMENT "Building Python wheel with uv (fallback to python -m build)" |
33 | 67 | ) |
|
0 commit comments