Skip to content

pixi support - #324

Open
kevinjin0420 wants to merge 126 commits into
mainfrom
skj/portable
Open

pixi support#324
kevinjin0420 wants to merge 126 commits into
mainfrom
skj/portable

Conversation

@kevinjin0420

@kevinjin0420 kevinjin0420 commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

Summary

Multi-distro and mac support though pixi venv

  • pixi.toml/pixi.lock: portable env (osx-arm64, linux-64) resolved from robostack-jazzy/conda-forge, replaces apt-installed ROS/toolchain/Qt/OpenCV/etc. for this path
  • New entry scripts: bootstrap-portable.sh/setup-portable.sh (mirrors bootstrap.sh/setup.sh, installs Homebrew on macOS, dispatches to apt/dnf/pacman/brew for git/ansible)
  • New ansible/dev-portable.yml/build-portable.yml playbooks and build-portable role
    • role installs pixi itself (Linux only, macOS gets it via Homebrew), runs pixi install, then the same Dawn/manif/imgui download scripts as the native build role, plus bun install for the frontend
    • shared dev role gains a mrover_portable var (ansible/roles/dev/defaults/main.yml) that switches which zshenv gets sourced (scripts/mrover.zshenv vs new scripts/mrover-portable.zshenv)
    • scripts/mrover-portable.zshenv defines a mrover shell function that runs pixi shell-hook, fixes up TERM/HOST/DYLD_LIBRARY_PATH quirks from conda's compiler activation, then sources install/setup.zsh
  • CMakeLists.txt
    • new MROVER_PORTABLE option gates out ZED/CUDA, CAN, and ESW hardware bridges, so a laptop without rover hardware can still build everything else
    • simulator now also builds on macOS arm64 (Dawn is prebuilt for it too), not just Linux x86_64
    • Qt6 lookup switched to find_package(... QUIET); camera_client is skipped with a warning instead of failing configure when Qt6 isn't present
    • link against MANIF::manif instead of the old FetchContent-only target, now that pixi provides it
  • build.sh branches on $PIXI_PROJECT_ROOT: portable path skips the hardcoded clang/CUDA env vars and passes -DMROVER_PORTABLE=ON -DCMAKE_PREFIX_PATH=$CONDA_PREFIX (plus -DCMAKE_OSX_SYSROOT on macOS) instead of colcon's per-profile build/install dirs
  • style.sh drops hardcoded tool version pins (clang-format-18, black==26.5.1, etc.) in favor of whatever pixi/PATH provides, replaces glob-based file lists with find loops that tolerate missing directories, and runs bun install before the frontend type-check
  • pyproject.toml loosens pinned deps to ranges, moves moteus into a new rover extra (not needed for a portable dev-only checkout), bumps target Python 3.10 -> 3.12
  • .github/workflows/ci.yml adds a pixi-based "Build (pixi Ubuntu 26)" job alongside the existing native Ubuntu 24 job; the style job now sets up pixi instead of manually installing pinned black/mypy/clang-format/shellcheck versions
  • .github/workflows/publish-bootstrap.yml also publishes bootstrap-portable.sh
  • bootstrap.sh/setup.sh cleanup: clone check now tests for .git (re-clones into a stale/incomplete dir instead of silently skipping) instead of just dir existence, dropped the redundant --recurse-submodules since the dev role already runs git submodule update --init --recursive
  • New scripts/fix_sudo_rs.sh: Ubuntu 26 defaults to sudo-rs, which Ansible's become can't use yet. Both setup scripts run it before Ansible now — it flips sudo back to the classic binary via update-alternatives, but only if sudo-rs is actually detected

Did you add documentation to the wiki?

not done, will need proper documentation overhaul

Verfied Systems

  • Ubuntu 26
  • Fedora 44
  • Archlinux
  • M1 Mac
  • M2 Mac
  • M3 Mac
  • M4 Mac
  • M5 Mac

Tested System Combinations

  • Fedora 44 KDE Plasma
  • CachyOS KDE Plasma
  • CachyOS Hyprland
  • Kubuntu 26 KDE Plasma
  • MacOS 26 on:
    • M1 Macbook Air
    • M3 Macbook Pro
    • M5 Macbook Pro

Known Issues

  • On M1 macs, uname -m could return x86_64 incorrectly because of a rosetta quirk
    • current workaround is to set $ARCH manually
    • needs a bit more thinking
  • The install manifpy step could fail on first try due to unset serialization protocol
    • current workaround is to retry playbook

@kevinjin0420
kevinjin0420 changed the base branch from skj/native-setup to skj/ubuntu24-native August 25, 2026 18:15
@kevinjin0420
kevinjin0420 changed the base branch from skj/ubuntu24-native to skj/native-setup August 25, 2026 19:23
@kevinjin0420
kevinjin0420 changed the base branch from skj/native-setup to main August 31, 2026 00:06
# Conflicts:
#	.github/workflows/ci.yml
#	.github/workflows/docker-publish.yml
#	CMakeLists.txt
#	Dockerfile
#	ansible.sh
#	ansible/roles/dev/files/home/.zshrc
#	ansible/roles/dev/tasks/main.yml
#	clean.sh
#	scripts/mrover.zshenv
#	style.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant