Index: lib/MsgUtils/CMakeLists.txt =================================================================== diff -u -r401d8ad0e5c070f9c6ecb41ed3ba25ba3d1c69a0 -r864d025811eb43fd2592bde174e5cb41fa10d783 --- lib/MsgUtils/CMakeLists.txt (.../CMakeLists.txt) (revision 401d8ad0e5c070f9c6ecb41ed3ba25ba3d1c69a0) +++ lib/MsgUtils/CMakeLists.txt (.../CMakeLists.txt) (revision 864d025811eb43fd2592bde174e5cb41fa10d783) @@ -17,12 +17,63 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network SerialBus) set(MSGUTILS_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/scripts) + +# 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() + include(cmake/MsgUtils.cmake) +# 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 ${Python3_EXECUTABLE} -m pip install -e ${MSGUTILS_SCRIPTS_DIR} --quiet + COMMAND ${MSGUTILS_PYTHON} -m pip install -e ${MSGUTILS_SCRIPTS_DIR} --quiet RESULT_VARIABLE _pip_result ) if(NOT _pip_result EQUAL 0)