Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
51b0aae
feat: add emscripten-wasm32 support with rmw_zenoh_pico
Tobias-Fischer Sep 9, 2026
3882e6c
fix: pick up vinca's MODULE-library pthreads fix, rcutils dlopen guards
Tobias-Fischer Sep 9, 2026
0f4f76d
chore: pick up vinca's post-refactor merge, regenerate rosdistro snap…
Tobias-Fischer Sep 9, 2026
b60d7be
Merge remote-tracking branch 'origin/codex/cross-distro-sync' into fe…
Tobias-Fischer Sep 9, 2026
0f46d45
style: run pixi sort after the cross-distro-sync merge
Tobias-Fischer Sep 9, 2026
2ae59fb
fix: preserve pinned tags when backfilling the snapshot schema; sbg_d…
Tobias-Fischer Sep 9, 2026
0731d85
Merge remote-tracking branch 'origin/codex/cross-distro-sync' into fe…
Tobias-Fischer Sep 9, 2026
1996721
fix: declare rosidl_typesupport_microxrcedds_c/cpp as real deps
Tobias-Fischer Sep 10, 2026
3b667f6
fix: commit extra_recipes/{microcdr,zenoh-pico}/build.sh
Tobias-Fischer Sep 10, 2026
1975af6
fix: test_msgs/example_interfaces microxrcedds deps + tolerate the _E…
Tobias-Fischer Sep 10, 2026
e6f1ffd
chore: bump vinca pin to the pre-find-typesupport fix
Tobias-Fischer Sep 10, 2026
2a981e4
chore: bump vinca pin to the typesupport pre-find ordering fix
Tobias-Fischer Sep 10, 2026
61f99ed
docs: correct the _Event-gap rebuild grouping in build-emscripten's c…
Tobias-Fischer Sep 10, 2026
61a0dfe
fix: patch the rosidl_typesupport_microxrcedds_cpp _Event codegen gap…
Tobias-Fischer Sep 10, 2026
9c12dca
fix: sync-native-bootstrap-mirror breaks on a genuinely empty output/
Tobias-Fischer Sep 10, 2026
6accfce
fix: force a full reindex in sync-native-bootstrap-mirror
Tobias-Fischer Sep 10, 2026
5d5bfb1
feat: add geometry_msgs and sensor_msgs to the wasm32 closure
Tobias-Fischer Sep 10, 2026
53761c9
fix: detect the native platform instead of hardcoding osx-arm64
Tobias-Fischer Sep 10, 2026
3c95518
fix: pull in vinca's explicit-refs/tags/ fix for ambiguous raw.github…
Tobias-Fischer Sep 10, 2026
e366f57
fix: export rmw_zenoh_pico's runtime-config extension functions on wa…
Tobias-Fischer Sep 11, 2026
15486b5
fix: drop pthreads from emscripten-wasm32, use Asyncify; fix rmw_zeno…
Tobias-Fischer Sep 11, 2026
f00feae
fix: session_connect() must not fail when read/lease tasks can't start
Tobias-Fischer Sep 12, 2026
eccaf42
fix: rebuild numpy without native wasm exceptions for Asyncify compat
Tobias-Fischer Sep 12, 2026
68950c5
fix: drop pthreads from microcdr's own emscripten build, use Asyncify
Tobias-Fischer Sep 12, 2026
22bd0ca
fix: bump zenoh-pico to 1.7.0 to fix multi-publisher write-filter bug
Tobias-Fischer Sep 12, 2026
c97e7c1
fix: pump zenoh-pico network unconditionally in rmw_wait to stop rclp…
Tobias-Fischer Sep 12, 2026
e905878
Add temporary CI diagnostic: cross-platform xeus-python build comparison
Tobias-Fischer Sep 13, 2026
8076455
Add push trigger to diagnostic workflow (workflow_dispatch alone needs
Tobias-Fischer Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions .github/workflows/diagnose-xeus-python-platform.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
name: Diagnose xeus-python cross-platform build (temporary)

# Throwaway diagnostic workflow, manually triggered only. Investigates
# whether the "null function or function signature mismatch"
# indirect-call-table-corruption bug seen when locally recompiling
# xeus-python on a macOS ARM64 (osx-arm64) host is specific to that build
# platform -- as opposed to the currently-published, working stock
# xeus-python-0.19.0 package on the emscripten-forge-4x channel, which was
# almost certainly built on a Linux x86_64 CI runner. Builds the exact same
# scratch diagnostic recipe (zero xeus-python source patches, stock
# xeus/xeus-lite/pyjs-dev/python host deps -- the same "stockdeps-test"
# config already confirmed to crash when built locally on osx-arm64) on
# both ubuntu-latest (linux-64) and macos-15 (osx-arm64, matching the local
# dev machine) for direct comparison, and uploads the resulting
# xpython.js/xpython.wasm from each as build artifacts.
#
# See ~/robot/ros-rolling-emscripten-zenoh/AGENTS.md's "BREAKTHROUGH
# 2026-09-13" sections (search for "null function" and "toolchain
# non-determinism") for the full background on why this test exists.
#
# Safe to delete this file once the investigation concludes either way.

on:
workflow_dispatch:
# workflow_dispatch alone can't be triggered via the API/CLI unless the
# workflow file also exists on the repo's default branch (a real GitHub
# restriction) -- this repo's default branch is a separate, regularly
# RoboStack-synced `main`, unrelated to this feature branch's work, so
# touching it just for this throwaway diagnostic isn't worth it. A push
# trigger scoped to just this branch works instead, without needing
# anything on `main`.
push:
branches:
- feature/emscripten-wasm32-zenoh-pico
paths:
- '.github/workflows/diagnose-xeus-python-platform.yml'
- 'scratch_test_recipes/xeus-python-stockdeps/**'

jobs:
build-xeus-python-diagnostic:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
platform: linux-64
- os: macos-15
platform: osx-arm64

runs-on: ${{ matrix.os }}

steps:
- name: Checkout ros-rolling-emscripten-zenoh
uses: actions/checkout@v6
with:
persist-credentials: false
fetch-depth: 1

- uses: prefix-dev/setup-pixi@v0.9.4
with:
frozen: true

- name: Checkout emscripten-forge/recipes (for cross-python/compiler/pytester toolchain packages)
uses: actions/checkout@v6
with:
repository: emscripten-forge/recipes
path: emscripten_forge_recipes
persist-credentials: false
fetch-depth: 1

- name: Build emscripten toolchain packages (compiler, cross-python, pytester)
shell: bash -l {0}
working-directory: emscripten_forge_recipes
run: |
pixi run rattler-build build \
--package-format tar-bz2 \
-c https://repo.prefix.dev/emscripten-forge-4x \
-c microsoft \
-c conda-forge \
--skip-existing all \
-m variant.yaml \
--recipe recipes/recipes/emscripten_emscripten-wasm32
pixi run rattler-build build \
--package-format tar-bz2 \
-c https://repo.prefix.dev/emscripten-forge-4x \
-c microsoft \
-c conda-forge \
--skip-existing all \
-m variant.yaml \
--recipe recipes/recipes/cross-python_emscripten-wasm32
pixi run rattler-build build \
--package-format tar-bz2 \
-c https://repo.prefix.dev/emscripten-forge-4x \
-c microsoft \
-c conda-forge \
--skip-existing all \
-m variant.yaml \
--recipe recipes/recipes/pytester

- name: Build diagnostic xeus-python (zero patches, stock host deps)
shell: bash -l {0}
run: |
pixi run rattler-build build \
--package-format tar-bz2 \
-r ./scratch_test_recipes/xeus-python-stockdeps/recipe.yaml \
-m ./conda_build_config.yaml \
--output-dir ./ci_output \
-c https://repo.prefix.dev/conda-forge \
-c https://repo.prefix.dev/emscripten-forge-4x \
-c "file://${{ github.workspace }}/emscripten_forge_recipes/output" \
-c microsoft \
-c robostack-staging \
--target-platform emscripten-wasm32 \
--test skip \
--channel-priority disabled

- name: Extract xpython.js/xpython.wasm for upload
shell: bash -l {0}
run: |
mkdir -p extracted_artifact
tar xjf ./ci_output/emscripten-wasm32/xeus-python-stockdeps-test-*.tar.bz2 -C extracted_artifact
# also record a sha256 of the wasm binary directly in the log, for
# a quick eyeball diff between the two matrix legs without needing
# to download both artifacts
shasum -a 256 extracted_artifact/bin/xpython.wasm extracted_artifact/bin/xpython.js

- name: Upload xpython.js/xpython.wasm
uses: actions/upload-artifact@v4
with:
name: xeus-python-diagnostic-${{ matrix.platform }}
path: |
extracted_artifact/bin/xpython.js
extracted_artifact/bin/xpython.wasm
retention-days: 7
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ recipes_only_patch/
*.sh
*.ps1
*.json
# The blanket *.sh above is meant for vinca-generated build scripts, but it
# also silently swallowed extra_recipes/*/build.sh -- hand-written source
# for the microcdr/zenoh-pico recipes, not generated output. Caught by a
# real CI run doing a genuinely fresh checkout: neither build.sh ever
# actually made it into a commit, so build-emscripten failed with
# "build.sh: command not found" once it reached either recipe.
!extra_recipes/**/*.sh
# Same deal: a genuine, hand-written, committed helper script, not
# generated output -- caught this one myself before it repeated the
# extra_recipes mistake above (2026-09-10).
!/sync_native_bootstrap_mirror.sh
.DS_Store
# pixi environments
.pixi
Expand Down
135 changes: 74 additions & 61 deletions conda_build_config.yaml
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
# Generated by vinca-pinning-render from vinca_pinning.yaml.
# Do not edit this file directly.
c_compiler:
- gcc # [linux]
- clang # [osx]
- vs2022 # [win]
# Please remember to update gcc_compiler_version & clang_compiler_version too.
- gcc # [linux]
- clang # [osx]
- vs2022 # [win]
- emscripten # [emscripten]
c_compiler_version: # [unix]
- 15 # [linux]
- 21 # [osx]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 15 # [linux]
- 21 # [osx]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
# Matches emscripten-forge/recipes' variant.yaml c_compiler_version; refresh
# alongside cxx_compiler_version and emscripten_emscripten-wasm32 (below) when
# emscripten-forge bumps their emscripten SDK version.
- 4.0.9 # [emscripten]
c_stdlib:
- sysroot # [linux]
- macosx_deployment_target # [osx]
Expand All @@ -18,29 +22,47 @@ m2w64_c_stdlib: # [win]
m2w64_c_stdlib_version: # [win]
- 12 # [win]
c_stdlib_version: # [unix]
- 2.28 # [linux and not riscv64]
- 2.39 # [linux and riscv64]
- 2.28 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 14.0 # [osx]
- 2.28 # [linux and not riscv64]
- 2.39 # [linux and riscv64]
- 2.28 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 14.0 # [osx]
cxx_compiler:
- gxx # [linux]
- clangxx # [osx]
- vs2022 # [win]
# Please remember to update gxx_compiler_version & clangxx_compiler_version too.
- gxx # [linux]
- clangxx # [osx]
- vs2022 # [win]
- emscripten # [emscripten]
cxx_compiler_version: # [unix]
- 15 # [linux]
- 21 # [osx]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 15 # [linux]
- 21 # [osx]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 4.0.9 # [emscripten]
# emscripten-wasm32 support: vinca's own selector namespace (v1_selectors.py)
# treats "unix" as linux OR osx OR emscripten OR wasi OR freebsd OR zos, so the
# base conda-forge-pinning zip_keys group -- [c_stdlib_version,
# c_compiler_version, cxx_compiler_version, fortran_compiler_version,
# cuda_compiler_version], all scoped [unix] -- silently applies to emscripten too,
# even though conda-forge itself never builds for that platform. Since emscripten
# needs its own compiler but has no Fortran toolchain, no libc sysroot, and no
# CUDA, simply adding an emscripten branch to c_compiler_version/
# cxx_compiler_version would leave them non-empty while c_stdlib_version/
# fortran_compiler_version/cuda_compiler_version stay empty for that platform --
# a zip-length mismatch ("Zip key elements do not all have same length"). Fixed
# by (1) restricting fortran_compiler_version's selector from [unix] to
# [linux or osx] so it no longer nominally covers emscripten, and (2) splitting
# zip_keys (below) into a [c_compiler_version, cxx_compiler_version] group
# (valid for linux/osx/emscripten alike, always 1 entry each) separate from the
# [c_stdlib_version, fortran_compiler_version, cuda_compiler_version] group
# (linux/osx only, always 0 entries -- i.e. absent -- on emscripten).
llvm_openmp: # [osx]
- 21 # [osx]
fortran_compiler: # [unix or win]
- gfortran # [unix]
- flang # [win]
fortran_compiler_version: # [unix or win]
- 15 # [unix]
- 5 # [win64]
- 22 # [win and arm64]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 15 # [linux or osx]
- 5 # [win64]
- 22 # [win and arm64]
- 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
m2w64_c_compiler: # [win]
- gcc # [win]
m2w64_c_compiler_version: # [win]
Expand Down Expand Up @@ -80,7 +102,7 @@ cuda_compiler:
- cuda-nvcc
cuda_compiler_version:
- None
- 12.9 # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- 12.9 # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
cuda_compiler_version_min:
- None # [not ((linux and (x86_64 or aarch64)) or win64)]
- 12.9 # [((linux and (x86_64 or aarch64)) or win64)]
Expand Down Expand Up @@ -169,23 +191,11 @@ docker_image: # [os.environ.get("BUILD_PLA
- quay.io/condaforge/linux-anvil-ppc64le:alma10 # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma10"]

zip_keys:
# [unix]
- - c_compiler_version # [unix]
- cxx_compiler_version # [unix]
- fortran_compiler_version # [unix]
# CUDA 13.x requires newer glibc than our current baseline
- c_stdlib_version # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- cuda_compiler_version # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
- - python
- is_python_min
- - libarrow
- libarrow_all
- - root_base
- root_cxx_standard

# armv7l specifics because conda-build sets many things to centos 6
# this can probably be removed when conda-build gets updated defaults
# for aarch64
- - c_compiler_version
- cxx_compiler_version
- - c_stdlib_version # [linux or osx]
- fortran_compiler_version # [linux or osx]
- cuda_compiler_version # [linux or osx]
cdt_arch: armv7l # [armv7l]
BUILD: armv7-conda_cos7-linux-gnueabihf # [armv7l]

Expand Down Expand Up @@ -433,16 +443,8 @@ googleapis_cpp:
gpgme:
- '1.24'
graphviz:
- '14'
# Harfbuzz guarantees total ABI compatibiblity
# The first version to have this new ABI pin is 11.0.1
# https://github.com/conda-forge/harfbuzz-feedstock/pull/125
# But as of 2025/08/03, 11.0.1 is quite "old" and it is pretty safe
# to release the pin
# We are leaving this comment here to discourage others from adding
# a harfbuzz global pin, as it is not needed.
# harfbuzz:
# - '11'
- 15.1.0 # [emscripten]
- '14' # [not emscripten]
hepmc2:
- '2.06'
hepmc3:
Expand Down Expand Up @@ -568,7 +570,8 @@ libevent:
libexactreal:
- '4'
libffi:
- '3.5'
- 3.4.6 # [emscripten]
- '3.5' # [not emscripten]
libflac:
- '1.5'
libflatsurf:
Expand Down Expand Up @@ -976,10 +979,15 @@ pythia8:
python:
# conda-forge supports only 3.14+ for win-arm64 and linux-riscv64
# part of a zip_keys: python, is_python_min
- 3.14.* *_cp314
- 3.13.* *_cp313 # [emscripten]
- 3.14.* *_cp314 # [not emscripten]
python_impl:
- cpython

- cpython # Needed for cross-compiled targets: emitted whenever a recipe's
# `packages_select_by_deps`/host deps expand `cross-python_${{ target_platform }}`
# with target_platform == emscripten-wasm32. Not a conda-forge-pinning key at
# all (conda-forge doesn't cross-compile to emscripten), so it must be added
# here rather than merely overridden. Matches emscripten-forge/recipes'
# variant.yaml.
python_min:
# minimum supported python version per CFEP-25
# bump to next minor version when we drop python versions
Expand All @@ -989,7 +997,8 @@ is_freethreading:
- false
is_python_min:
# part of a zip_keys: python, is_python_min
- false
- false # [emscripten]
- false # [not emscripten]
is_abi3:
- true
pytorch:
Expand Down Expand Up @@ -1170,11 +1179,15 @@ zstd:
libzenohc:
- 1.9.0
libzenohcxx:
- 1.9.0
# conda-forge published sip 6.16.1 on 2026-09-08, which broke ABI targeting for
# packages like qt_gui_cpp_sip that build against PyQt-sip's fixed ABI v12
# (hit this on humble/jazzy first; rolling also builds qt_gui_cpp via
# pyqt6/sip so it's equally exposed). Pin back to the last known-good line
# until upstream fixes it.
- 1.9.0 # emscripten-forge/recipes only publishes graphviz 15.1.0 -- our regular
# graphviz pin (from conda-forge-pinning) has no candidates there. Keep the
# base '14' pin for every other platform (if/then replaces the whole list,
# so the non-emscripten branch must be spelled out too).
sip:
- 6.15
cross-python_emscripten-wasm32:
- 3.13.1 # The emscripten SDK/toolchain package version itself, keyed by vinca's
# `<pkgname>_<target_platform>` convention for cross-compilation toolchain
# packages. Keep in sync with c_compiler_version/cxx_compiler_version above.
emscripten_emscripten-wasm32:
- 4.0.9
Loading