Skip to content

os: add support for windows - #107

Open
AmyJeanes wants to merge 6 commits into
commaai:masterfrom
AmyJeanes:windows
Open

os: add support for windows#107
AmyJeanes wants to merge 6 commits into
commaai:masterfrom
AmyJeanes:windows

Conversation

@AmyJeanes

@AmyJeanes AmyJeanes commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Windows (win_amd64) wheels for all fifteen vendored packages, built with clang/lld/libc++ from an MSYS2 CLANG64 shell, so openpilot's PC tooling builds and runs natively on Windows for development. The other PRs in the series consume these wheels.

  • setup.py (every package): win_amd64 wheels; bash resolved via PATH; forward-slash build paths; the build interpreter passed as PYTHON.
  • build.sh notable choices: ffmpeg static with the network layer off (Windows decodes in software; D3D11 is a possible follow-up); acados on the GENERIC BLASFEO/HPIPM targets; zeromq without AF_UNIX; ncurses ships PDCurses under the ncurses names; capnproto/cppcheck link libc++ statically; raylib desktop via clang.
  • setup.sh installs the CLANG64 pacman packages, git and uv included, so nothing outside MSYS2 is needed. A windows-latest build entry, and a test windows job that installs the wheels into a stock Python with no MSYS2 on PATH and runs the smoketests.

Line endings were split out and comma has already merged them.

Part of a six-repo series: commaai/openpilot#38810, commaai/msgq#709, commaai/panda#2427, commaai/opendbc#3724, commaai/rednose#61. This PR merges first; the others' Windows CI installs the wheels it publishes.

Generated with Claude, human-reviewed and tested locally and in CI.

AmyJeanes added a commit to AmyJeanes/panda that referenced this pull request Sep 7, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

This commit is dropped from the PR once the win_amd64 wheels are on PyPI.
Until then it points uv at a GitHub release of the same wheels, built from
that PR's branch on my fork, so the Windows CI entry runs here meanwhile:
comma-deps-gcc-arm-none-eabi and comma-deps-cppcheck for sys_platform ==
'win32'. Linux and macOS resolve from PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/rednose that referenced this pull request Sep 7, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

This commit is dropped from the PR once the win_amd64 wheels are on PyPI.
Until then it points uv at a GitHub release of the same wheels, built from
that PR's branch on my fork, so the Windows CI entry runs here meanwhile:
comma-deps-eigen for sys_platform == 'win32'. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/opendbc that referenced this pull request Sep 7, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

This commit is dropped from the PR once the win_amd64 wheels are on PyPI.
Until then it points uv at a GitHub release of the same wheels, built from
that PR's branch on my fork, so the Windows CI entry runs here meanwhile:
comma-deps-cppcheck for sys_platform == 'win32', and uv.lock relocked
against that index. Linux and macOS resolve from PyPI as before; the lock
is regenerated from PyPI when this commit goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/opendbc that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-cppcheck for win32 from a release on my fork built from that
PR, and uv.lock is relocked from PyPI when this goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/rednose that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Points uv at a GitHub release of the win_amd64 wheels built from that
PR's branch so the Windows CI entry can run before they are on PyPI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/opendbc that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-cppcheck for win32 from a release on my fork built from that
PR, and uv.lock is relocked from PyPI when this goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/panda that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-gcc-arm-none-eabi and comma-deps-cppcheck for win32 from a
release on my fork built from that PR.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/rednose that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Points uv at a GitHub release of the win_amd64 wheels built from that
PR's branch so the Windows CI entry can run before they are on PyPI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
@adeebshihadeh adeebshihadeh mentioned this pull request Sep 9, 2026
adeebshihadeh pushed a commit that referenced this pull request Sep 9, 2026
AmyJeanes added a commit to AmyJeanes/panda that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-gcc-arm-none-eabi and comma-deps-cppcheck for win32 from a
release on my fork built from that PR.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/opendbc that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-cppcheck for win32 from a release on my fork built from that
PR, and uv.lock is relocked from PyPI when this goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/rednose that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Points uv at a GitHub release of the win_amd64 wheels built from that
PR's branch so the Windows CI entry can run before they are on PyPI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes and others added 5 commits September 9, 2026 18:14
Tag the wheels win_amd64, resolve bash on PATH (CreateProcess would find
the WSL launcher in System32 first) and hand build.sh the build
interpreter as PYTHON, so scripts stop assuming a python3 on PATH.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
Per-package changes so every build.sh runs in an MSYS2 CLANG64 shell:
- capnproto/ffmpeg/git-lfs/gcc-arm-none-eabi: .exe names, Windows
  archives, C:/ paths for the native pkgconf; ffmpeg, capnp and cppcheck
  link static so the tools run without the toolchain's DLLs on PATH
- acados: GENERIC BLASFEO/HPIPM targets (the x86 assembly kernels assume
  the SysV ABI), the pinned tera_renderer release binary instead of a
  rust toolchain
- zeromq: no AF_UNIX transport on MinGW (afunix.h is MSVC only)
- raylib: the mingw compiler for the cffi module, through a tracked
  build_ext config
- ncurses: PDCurses' console port shipped under the ncurses names
- shims: run the binary as a child process on every platform, os.exec*
  cannot replace the process on Windows

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
The venv's interpreter lives in Scripts/ there, and MSYS2 puts its own
mingw CPython first on PATH, so pin uv to the managed 3.12 the wheels
are built for.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
pacman installs the toolchain and build tools by MINGW_PACKAGE_PREFIX;
the other MSYS2 environments are refused since the wheels rely on
clang, lld and libc++. git and uv come from MSYS2 too, so the shell
needs nothing from the Windows PATH; the git has to be the native
build, git-lfs mis-resolves the POSIX paths the msys git reports.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
A fourth matrix entry builds on windows-latest in an MSYS2 CLANG64 shell
with only MSYS2's own PATH, the shell the README describes. Only that
entry names its shell: the job default stays `bash -e {0}`, GitHub's
implicit default. A `test windows` job installs the wheels into a venv
of a stock Python with no MSYS2 on PATH and runs the smoketests, the
Windows counterpart of the distro-container test. The publish job
uploads the Windows wheels with the others (bootstrap-icons is a
py3-none-any duplicate, which --skip-existing drops).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 9, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
acados' render_template() quotes the tera arguments but not the t_renderer
path, and runs it through cmd.exe, which strips the command's outer quotes.
Patch acados_template so the executable is quoted and the whole command is
wrapped, matching the other acados_template patches here, so a build path
with spaces works. Cross-platform bug; Windows just hits it far more often.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 10, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/panda that referenced this pull request Sep 10, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-gcc-arm-none-eabi and comma-deps-cppcheck for win32 from a
release on my fork built from that PR.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/opendbc that referenced this pull request Sep 10, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Dropped once the win_amd64 wheels are on PyPI; until then uv takes
comma-deps-cppcheck for win32 from a release on my fork built from that
PR, and uv.lock is relocked from PyPI when this goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
AmyJeanes added a commit to AmyJeanes/openpilot-upstream that referenced this pull request Sep 10, 2026
…ies#107 publishes

--- TODO REMOVE AFTER DEPENDENCY PR MERGES (commaai/dependencies#107) ---

Until the win_amd64 wheels are on PyPI, uv resolves the comma-deps
packages openpilot names for sys_platform == 'win32' from a GitHub
release of the same wheels on my fork. Linux and macOS resolve from
PyPI as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016AgqYZYWLpwE2T5vS3nVEt
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