Index: CMakeLists.txt =================================================================== diff -u -rdfe875a4159529de072df08b6c500707e9312d96 -r5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f --- CMakeLists.txt (.../CMakeLists.txt) (revision dfe875a4159529de072df08b6c500707e9312d96) +++ CMakeLists.txt (.../CMakeLists.txt) (revision 5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f) @@ -6,6 +6,7 @@ ) include(cmake/Debug.cmake) +include(cmake/PythonVenv.cmake) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) Index: lib/MsgUtils/CMakeLists.txt =================================================================== diff -u -rfd9c43b00259567ff49a3d9b31b98df75b47bc52 -r5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f --- lib/MsgUtils/CMakeLists.txt (.../CMakeLists.txt) (revision fd9c43b00259567ff49a3d9b31b98df75b47bc52) +++ lib/MsgUtils/CMakeLists.txt (.../CMakeLists.txt) (revision 5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f) @@ -11,74 +11,18 @@ find_package(Protobuf REQUIRED) find_package(absl REQUIRED) -find_package(Python3 REQUIRED COMPONENTS Interpreter) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network SerialBus) set(MSGUTILS_SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/scripts/MsgUtils) -# Create a build-local venv so pip install works on distros that enforce PEP 668 -# (Debian/Ubuntu with Python 3.11+, etc.) without polluting system or user site-packages. -set(MSGUTILS_VENV_DIR ${CMAKE_CURRENT_BINARY_DIR}/msgutils-venv) -set(MSGUTILS_PYTHON ${MSGUTILS_VENV_DIR}/bin/python) -# Probe pip inside the venv — a half-created venv missing python3-venv has python but no pip. -execute_process( - COMMAND ${MSGUTILS_PYTHON} -m pip --version - RESULT_VARIABLE _venv_pip_ok - OUTPUT_QUIET - ERROR_QUIET -) -if(NOT _venv_pip_ok EQUAL 0) - message(STATUS "Creating msgutils Python venv at ${MSGUTILS_VENV_DIR}") - file(REMOVE_RECURSE ${MSGUTILS_VENV_DIR}) - execute_process( - COMMAND ${Python3_EXECUTABLE} -m venv ${MSGUTILS_VENV_DIR} - RESULT_VARIABLE _venv_result - OUTPUT_VARIABLE _venv_output - ERROR_VARIABLE _venv_output - ) - if(NOT _venv_result EQUAL 0 OR NOT EXISTS ${MSGUTILS_PYTHON}) - message(FATAL_ERROR - "Failed to create venv at ${MSGUTILS_VENV_DIR}.\n" - "Install the venv module (e.g. 'sudo apt install python3-venv' or 'python3-full' on Debian/Ubuntu, " - "matching your Python version).\n" - "Output:\n${_venv_output}") - endif() - # Verify pip is actually usable in the new venv. - execute_process( - COMMAND ${MSGUTILS_PYTHON} -m pip --version - RESULT_VARIABLE _venv_pip_ok - OUTPUT_QUIET - ERROR_QUIET - ) - if(NOT _venv_pip_ok EQUAL 0) - message(FATAL_ERROR - "Venv at ${MSGUTILS_VENV_DIR} was created but pip is not available inside it. " - "Install the matching python3-venv package and reconfigure.") - endif() -endif() - +# The project-wide venv ({CMAKE_BINARY_DIR}/.venv) is set up by +# cmake/PythonVenv.cmake at the top level; ${PROJECT_PYTHON} resolves to its +# interpreter. We install the msgutils package editable so the generator +# scripts below can `import msgutils` regardless of how they're invoked. include(cmake/MsgUtils.cmake) +register_python_package(${MSGUTILS_SCRIPTS_DIR}) -# Upgrade pip to ensure pyproject.toml-based editable installs are supported (requires pip >= 21.3). -execute_process( - COMMAND ${MSGUTILS_PYTHON} -m pip install --upgrade pip --quiet - RESULT_VARIABLE _pip_upgrade_result -) -if(NOT _pip_upgrade_result EQUAL 0) - message(FATAL_ERROR "Failed to upgrade pip in msgutils venv (pip returned ${_pip_upgrade_result})") -endif() - -# install the Python package in editable mode so that the generated protobuf files can be imported by the Python scripts -# without needing to be copied to the Python package directory -execute_process( - COMMAND ${MSGUTILS_PYTHON} -m pip install -e ${MSGUTILS_SCRIPTS_DIR} --quiet - RESULT_VARIABLE _pip_result -) -if(NOT _pip_result EQUAL 0) - message(FATAL_ERROR "Failed to install msgutils Python package (pip returned ${_pip_result})") -endif() - # set(DENALI_MSG_CSV ${CMAKE_CURRENT_SOURCE_DIR}/../../data/FW_Messages_List.csv) set(LEAHI_MSG_CSV ${CMAKE_CURRENT_SOURCE_DIR}/../../data/Leahi_Staging_FW_Messages_List.csv) set(LEAHI_MSG_CONF ${CMAKE_CURRENT_SOURCE_DIR}/../../data/LeahiUnhandled.conf) Index: lib/MsgUtils/cmake/MsgUtils.cmake =================================================================== diff -u -r864d025811eb43fd2592bde174e5cb41fa10d783 -r5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f --- lib/MsgUtils/cmake/MsgUtils.cmake (.../MsgUtils.cmake) (revision 864d025811eb43fd2592bde174e5cb41fa10d783) +++ lib/MsgUtils/cmake/MsgUtils.cmake (.../MsgUtils.cmake) (revision 5d7e5fb0ae59ff93b2c5756ade0093eb2d5fe41f) @@ -37,7 +37,7 @@ ${_header_path} ${_source_path} COMMAND - ${MSGUTILS_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateMsgDefsCpp.py + ${PROJECT_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateMsgDefsCpp.py --namespace ${_namespace} --header_dir ${_header_dir} --source_dir ${_source_dir} @@ -79,7 +79,7 @@ OUTPUT ${_protobuf_abs_filename} COMMAND - ${MSGUTILS_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateProtobuf.py + ${PROJECT_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateProtobuf.py --namespace ${_namespace} --output_dir ${_output_path} ${${_input_confs}} @@ -128,7 +128,7 @@ ${_header_path} ${_source_path} COMMAND - ${MSGUTILS_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateMsgDefsCpp.py + ${PROJECT_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateMsgDefsCpp.py --namespace ${_namespace} --header_dir ${_header_dir} --source_dir ${_source_dir} @@ -170,7 +170,7 @@ OUTPUT ${_protobuf_abs_filename} COMMAND - ${MSGUTILS_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateProtobuf.py + ${PROJECT_PYTHON} ${MSGUTILS_SCRIPTS_DIR}/GenerateProtobuf.py --namespace ${_namespace} --output_dir ${_output_path} ${${_input_csvs}}