diff --git a/cobot/commands/local_setup.py b/cobot/commands/local_setup.py index f7b5c9d..b8e0133 100644 --- a/cobot/commands/local_setup.py +++ b/cobot/commands/local_setup.py @@ -196,12 +196,13 @@ def _ensure_root_pip_break(p: process.StepProgress) -> None: ">> /root/.config/pip/pip.conf )" ) process.stream(privilege.sudo(["bash", "-c", snippet]), on_line=p.log) - # rosdep calls `pip install -U ` which tries to upgrade all transitive deps, - # including packages installed by apt that have no pip RECORD file. Pre-installing - # them via pip creates the RECORD so the later upgrade can proceed cleanly. + # rosdep calls `pip install -U ` which upgrades every transitive dependency, + # including packages installed by apt that have no pip RECORD file, causing an + # uninstall failure. Pre-installing with --ignore-installed creates pip RECORD + # files for all transitive deps so the subsequent rosdep upgrade succeeds. process.stream( privilege.sudo(["pip3", "install", "--break-system-packages", - "--ignore-installed", "typing-extensions"]), + "--ignore-installed", "fastmcp"]), on_line=p.log, ) diff --git a/scripts/setup_ros2_desktop.sh b/scripts/setup_ros2_desktop.sh index 617202f..7f0085f 100755 --- a/scripts/setup_ros2_desktop.sh +++ b/scripts/setup_ros2_desktop.sh @@ -62,10 +62,11 @@ sudo mkdir -p /root/.config/pip if ! sudo grep -qs 'break-system-packages' /root/.config/pip/pip.conf 2>/dev/null; then printf '[global]\nbreak-system-packages = true\n' | sudo tee -a /root/.config/pip/pip.conf > /dev/null fi -# rosdep uses `pip install -U` which tries to upgrade apt-installed packages that -# have no pip RECORD file (e.g. typing-extensions). Pre-installing via pip creates -# the RECORD so subsequent upgrades succeed. -sudo pip3 install --break-system-packages --ignore-installed typing-extensions +# rosdep calls `pip install -U ` which upgrades every transitive dependency, +# including packages installed by apt that have no pip RECORD file, causing an +# uninstall failure. Pre-installing fastmcp with --ignore-installed creates pip +# RECORD files for all its transitive deps so the later rosdep upgrade succeeds. +sudo pip3 install --break-system-packages --ignore-installed fastmcp PROGRESS 100 "Done" echo "ROS2 Jazzy Desktop installed successfully." diff --git a/scripts/setup_ros2_ros_base.sh b/scripts/setup_ros2_ros_base.sh index 84e2173..e8e79c4 100755 --- a/scripts/setup_ros2_ros_base.sh +++ b/scripts/setup_ros2_ros_base.sh @@ -62,10 +62,11 @@ sudo mkdir -p /root/.config/pip if ! sudo grep -qs 'break-system-packages' /root/.config/pip/pip.conf 2>/dev/null; then printf '[global]\nbreak-system-packages = true\n' | sudo tee -a /root/.config/pip/pip.conf > /dev/null fi -# rosdep uses `pip install -U` which tries to upgrade apt-installed packages that -# have no pip RECORD file (e.g. typing-extensions). Pre-installing via pip creates -# the RECORD so subsequent upgrades succeed. -sudo pip3 install --break-system-packages --ignore-installed typing-extensions +# rosdep calls `pip install -U ` which upgrades every transitive dependency, +# including packages installed by apt that have no pip RECORD file, causing an +# uninstall failure. Pre-installing fastmcp with --ignore-installed creates pip +# RECORD files for all its transitive deps so the later rosdep upgrade succeeds. +sudo pip3 install --break-system-packages --ignore-installed fastmcp PROGRESS 100 "Done" echo "ROS2 Jazzy (ros-base) installed successfully."