Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 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
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
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
50 changes: 50 additions & 0 deletions extra_recipes/microcdr/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/usr/bin/env bash
set -eo pipefail

# See extra_recipes/zenoh-pico/build.sh for why this is needed on
# cross-compiling conda-forge toolchains.
unset -f cmake || true

mkdir -p build
cd build

if [[ $target_platform =~ emscripten.* ]]; then
# Building microcdr as a static archive (its own default) causes
# "duplicate symbol" wasm-ld errors once two consumers both link against
# it in the same final module (confirmed with rmw_zenoh_pico, which
# links microcdr directly AND transitively via
# rosidl_typesupport_microxrcedds_c's exported libraries, 2026-09-09) --
# wasm-ld treats the same static archive appearing twice on the link
# line as a hard error, unlike a normal linker. Build a real dynamically
# linked SIDE_MODULE .so instead, same fix as zenoh-pico's own build.sh.
cat > "$SRC_DIR/__vinca_shared_lib_patch.cmake" <<'EOF'
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
add_compile_options("SHELL: -s USE_PTHREADS=1")
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=1 -s ALLOW_MEMORY_GROWTH=1 ")
EOF

emcmake cmake .. \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DCMAKE_TOOLCHAIN_FILE="$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
-DCMAKE_CROSSCOMPILING_EMULATOR="$BUILD_PREFIX/bin/node" \
-DCMAKE_PROJECT_INCLUDE="$SRC_DIR/__vinca_shared_lib_patch.cmake" \
-DCMAKE_C_FLAGS="-pthread" \
-DUCDR_SUPERBUILD=OFF \
-DUCDR_BUILD_TESTS=OFF \
-DUCDR_BUILD_EXAMPLES=OFF \
-DBUILD_SHARED_LIBS=ON
else
cmake .. \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DUCDR_SUPERBUILD=OFF \
-DUCDR_BUILD_TESTS=OFF \
-DUCDR_BUILD_EXAMPLES=OFF \
-DBUILD_SHARED_LIBS=OFF
fi

cmake --build . -j"${CPU_COUNT}"
cmake --install .
37 changes: 37 additions & 0 deletions extra_recipes/microcdr/recipe.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json
#
# Hand-written (not vinca-generated): not a ROS package, no package.xml.

package:
name: microcdr
version: "2.0.2"

source:
git: https://github.com/eProsima/micro-CDR.git
tag: "v2.0.2"

build:
script: build.sh
# Bumped after switching static -> dynamic linking (no version bump).
number: 1

requirements:
build:
- ${{ compiler('cxx') }}
- ${{ compiler('c') }}
- cmake
- ninja
- if: build_platform != target_platform
then:
- emscripten_emscripten-wasm32
host:
run:

about:
license: Apache-2.0
summary: eProsima Micro CDR -- a small CDR (Common Data Representation) serialization library for constrained devices.
homepage: https://github.com/eProsima/micro-CDR

extra:
recipe-maintainers:
- Tobias-Fischer
66 changes: 66 additions & 0 deletions extra_recipes/zenoh-pico/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -eo pipefail

# conda-forge's cross-compilation activation scripts define a `cmake` shell
# function that auto-injects -DCMAKE_TOOLCHAIN_FILE/-DCMAKE_CROSSCOMPILING_EMULATOR
# into every invocation -- including `cmake --build`/`cmake --install`, which
# don't accept -D defines and fail with "Unknown argument". vinca's own
# build_ament_cmake.sh.in does the same `unset -f cmake` before calling the
# real binary directly for anything past the initial configure.
unset -f cmake || true

mkdir -p build
cd build

if [[ $target_platform =~ emscripten.* ]]; then
# Same shared-memory/pthread-ABI fix as every other emscripten-wasm32
# package in this build (see build_ament_cmake.sh.in / the yaml-cpp-vendor
# and spdlog-vendor emscripten patches for the same pattern): without
# explicitly re-enabling TARGET_SUPPORTS_SHARED_LIBS and re-applying
# USE_PTHREADS=1 at every compile step via CMAKE_PROJECT_INCLUDE,
# Emscripten.cmake's own default (TARGET_SUPPORTS_SHARED_LIBS=FALSE)
# silently downgrades BUILD_SHARED_LIBS=ON to a static libzenohpico.a
# compiled without atomics/bulk-memory, which then fails to link with
# "--shared-memory is disallowed ... because it was not compiled with
# 'atomics' or 'bulk-memory' features" into anything that expects a real
# pthread-enabled shared library.
cat > "$SRC_DIR/__vinca_shared_lib_patch.cmake" <<'EOF'
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
add_compile_options("SHELL: -s USE_PTHREADS=1")
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=1 -s ALLOW_MEMORY_GROWTH=1 ")
EOF

emcmake cmake .. \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DCMAKE_TOOLCHAIN_FILE="$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" \
-DCMAKE_CROSSCOMPILING_EMULATOR="$BUILD_PREFIX/bin/node" \
-DCMAKE_PROJECT_INCLUDE="$SRC_DIR/__vinca_shared_lib_patch.cmake" \
-DZP_PLATFORM=emscripten \
-DBUILD_SHARED_LIBS=ON \
-DZ_FEATURE_MULTI_THREAD=1 \
-DZ_FEATURE_LINK_WS=1 \
-DZ_FEATURE_LINK_TCP=0 \
-DZ_FEATURE_LINK_UDP_MULTICAST=0 \
-DZ_FEATURE_LINK_UDP_UNICAST=0 \
-DZ_FEATURE_SCOUTING_UDP=0 \
-DCMAKE_C_FLAGS="-pthread" \
-DCMAKE_EXE_LINKER_FLAGS="-pthread -s USE_PTHREADS=1 -s ALLOW_MEMORY_GROWTH=1 -s MAXIMUM_MEMORY=1024MB" \
-DCMAKE_SHARED_LINKER_FLAGS="-pthread -s USE_PTHREADS=1" \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTING=OFF
else
cmake .. \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DBUILD_SHARED_LIBS=ON \
-DZ_FEATURE_MULTI_THREAD=1 \
-DZ_FEATURE_LINK_WS=1 \
-DZ_BUILD_EXAMPLES=OFF \
-DZ_BUILD_TESTS=OFF
fi

cmake --build . -j"${CPU_COUNT}"
cmake --install .
13 changes: 13 additions & 0 deletions extra_recipes/zenoh-pico/emscripten-longer-ws-open-wait.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/src/system/emscripten/network.c b/src/system/emscripten/network.c
index 870a06c6..7ba6f7e9 100644
--- a/src/system/emscripten/network.c
+++ b/src/system/emscripten/network.c
@@ -104,7 +104,7 @@ z_result_t _z_open_ws(_z_sys_net_socket_t *sock, const _z_sys_net_endpoint_t rep

// WARNING: workaround as connect returns before the websocket is
// actually open.
- z_sleep_ms(100);
+ z_sleep_ms(2000);

if (ret != _Z_RES_OK) {
close(sock->_ws._fd);
Loading