Skip to content

Full Rebuild September 2026 + Sync cross-distribution Vinca package coverage - #271

Open
Tobias-Fischer wants to merge 65 commits into
mainfrom
codex/cross-distro-sync
Open

Full Rebuild September 2026 + Sync cross-distribution Vinca package coverage#271
Tobias-Fischer wants to merge 65 commits into
mainfrom
codex/cross-distro-sync

Conversation

@Tobias-Fischer

@Tobias-Fischer Tobias-Fischer commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Synchronizes portable CI/build tooling and the reusable cross-distribution workflow guidance.
  • Aligns released Vinca package seeds while retaining distro-specific platform selectors and release-owned settings.

Validation

  • Configuration sorting and whitespace checks pass.
  • Exact CI Vinca generation completed locally for linux-64, linux-aarch64, osx-arm64, osx-64, and win-64.
  • Patch application checker: 101 passed, 0 failed.

Base automatically changed from full-rebuild-2026-08 to main August 31, 2026 18:51
Tobias-Fischer and others added 24 commits September 2, 2026 09:22
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Port pixi.toml structural changes: update vinca rev to 6aacb6f,
  inline platform-based glibc, pixi-build preview, PYTHONIOENCODING
  activation env (structural changes already in main, ensuring rev sync)
- Sync .github/workflows/testpr.yml: add permissions block, upgrade
  setup-pixi to v0.10.0 (pixi v0.75.0), add 3-attempt recipe-generation
  retry loop, fix delete-outdated-cache-entries exit bug, move
  PYTHONIOENCODING to pixi.toml activation
- Sync check_patches_clean_apply.py: narrow except to AttributeError,
  add git-cache retry on fetch failure, fix sys.exit always returning 2
- Normalize AGENTS.md: use $DISTRO placeholder instead of ros-jazzy-
  hardcoded prefix in all examples

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pixi.lock was stale after removing the corrupted .pixi/envs/default
(pyparsing namespace-package corruption) and running pixi install fresh.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update build_gap_report.py (cross-distro sync)
- Update libg2o, python-qt-binding, qt-gui-cpp patches
- Refresh pixi.lock

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The "Save build cache" step gates on steps.build-recipes.outcome, but
the "Build recipes" step had no id: build-recipes set, so that context
reference was always empty and the always() && (...) condition was
always false. The cache was never being saved regardless of outcome.

Mirrors the same fix applied to ros-humble.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…zy macOS build

Ports the OpenCV5, CMake4, and dependency-config unification work already
landed on humble, and adds fresh fixes surfaced while getting jazzy's macOS
build to complete cleanly:

- OpenCV5 API migration across ~15 packages: legacy CV_* color/type macros
  -> cv::COLOR_*/cv::* equivalents, calib3d -> calib/geometry component
  split, removed C-API headers (types_c.h etc.), and the free
  cv::aruco::detectMarkers()/estimatePoseSingleMarkers() functions replaced
  with the ArucoDetector class (image-proc, image-rotate, cv-bridge,
  image-geometry, compressed-image-transport, rqt-image-view,
  theora-image-transport, grid-map-cv, apriltag-mit, moveit-ros-perception,
  rtabmap).
- Legacy EIGEN3_INCLUDE_DIR (unset by modern Eigen3Config.cmake) replaced
  with the Eigen3::Eigen target across the autoware osqp/qp/kalman-filter
  chain, plus an fmt::fmt link fix for autoware-ekf-localizer.
- Boost modernization: dropped the no-longer-resolvable "system" component
  from find_package(Boost COMPONENTS ...) and ported boost::asio::io_service
  -> io_context / boost::filesystem::complete|extension -> absolute()/
  path::extension() (libpointmatcher, sick-safetyscanners-base).
- libnabo: C++14 bump for modern Eigen, numpy>=2.0 header path, missing
  <cassert>, and OpenMP linked explicitly for clang (plus find_dependency in
  its exported Config.cmake so consumers pick it up too).
- libg2o: switched host Qt dependency from qt-main (Qt5) to qt6-main to
  match the rest of the Qt6 stack and unblock rtabmap's PCL/VTK requirement.
- vinca.yaml: closed the largest gaps in jazzy's package coverage versus
  humble's meta-package tree, bumped vtk to 9.7.0 to match humble.
- Added check_dependency_compat.py (pre-build pin-conflict solver) and
  vinca_pinning.yaml, matching humble's tooling.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Resolved conflicts by hand:
- pkg_additional_info.yaml/vinca.yaml: several hunks were additive on both
  sides at the same insertion point (new package entries); kept the union,
  de-duplicated, and re-sorted with `pixi run sort`. Kept our newer
  hpp_fcl/pinocchio/visp version bumps (with their libboost/conda-forge
  compat comments) over main's older overrides.
- pixi.toml: kept the pinned vinca rev plus curl/go-yq/colordiff (used by
  check_dependency_compat.py); took main's setup-pixi bump.
- pixi.lock: regenerated with `pixi lock` against the merged pixi.toml
  instead of hand-merging the generated lockfile.
- testpr.yml: combined both branches' cache-cleanup steps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…onstraints

Already-built packages pin ros2-distro-mutex 0.16.* jazzy_*; bumping to
0.17.0 (matching the pattern already used on kilted) makes sure a stale
mutex build isn't silently resolved once vtk 9.7.0 lands in the
run_constraints, instead of the constraint mismatch surfacing later as a
confusing solver failure.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Avoid multiple pushes racing multiple full CI matrices in parallel; same
concurrency group already added to ros-humble's testpr.yml this session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…o-mutex

904749d bumped ros2-distro-mutex 0.16.0 -> 0.17.0 for the new vtk 9.7.0
run_constraint, but ros2-ros2cli and ros2-rosidl-cli are already published on
robostack-jazzy with build_number 22, hard-pinned (via run_exports) to
ros2-distro-mutex 0.16.*. vinca's already-built check only compares each
package's remote build_number against this per-package override (or the
global default), so it kept treating both as current and never regenerated
recipes for them -- even though their published build's mutex pin is now
unsatisfiable, breaking the whole solve for anything that depends on them
(e.g. ros-jazzy-rosidl-generator-type-description -> ros2-rosidl-cli).

This isn't the local-cache class of staleness (a testpr.yml cache-bust can't
touch an already-published remote artifact); bumping the per-package
build_number is the mechanism vinca provides for forcing a specific
package's republish without touching the global counter.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same class of issue as 3dc6b32 (ros2cli/rosidl_cli), but a local-cache
staleness rather than a published-remote one: ros2-ros-workspace's cached
artifact is already at build_number 22 (matching current), so vinca's
already-built check treats it as current, but that cached build predates
904749d's ros2-distro-mutex 0.16.0 -> 0.17.0 bump and is hard-pinned to the
now-unsatisfiable old version.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… C:\bld\...

ament_python_install_package()/ament_python_install_module() embed a raw
Windows path (with backslashes, from get_executable_path() and
CMAKE_INSTALL_PREFIX) directly into an install(CODE "...") string. That
string gets written verbatim into cmake_install.cmake and re-parsed as CMake
source at install time, where CMake's own string-escape rules choke on
whatever backslash-letter sequence the path happens to contain -- in this
case "\b" from this workflow's C:/bld/win-64 build root ("Invalid character
escape '\b'", first hit by ros2-ament-cmake-test). Convert both paths via
file(TO_CMAKE_PATH ...) before embedding, the standard fix for this class of
CMake footgun.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same pattern as ddbda94 (ros2-ros-workspace).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tex bump

Individually cache-busting each affected package (ddbda94, 71ff3ad, and
now ros2-ament-cmake-core) as it surfaced was turning into unbounded
whack-a-mole -- this is a systemic issue (any package cached/published at
build_number 22 with the pre-904749dd mutex pin baked in), not isolated bugs
in each one. The comment already left at this line anticipated exactly this
("next build number should be 23"). This is a full-rebuild-triggering
change: every package in the distro will rebuild fresh once its cached
build_number no longer matches, so this CI run will take considerably
longer than the incremental --skip-existing runs tonight.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
crop_foremost.cpp used the legacy C-API CV_THRESH_TOZERO_INV macro,
which OpenCV5 dropped in favor of the cv::THRESH_TOZERO_INV enum
value. Same class of legacy CV_* macro removal already hit elsewhere
this cycle (CV_GRAY2RGB in rqt_image_view).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
disparity_node.cpp included the old-style <opencv2/calib3d/calib3d.hpp>
path; OpenCV5 only ships the flat <opencv2/calib3d.hpp> header. Same
class of header-layout change already hit elsewhere in image_pipeline
this cycle.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
mcap_vendor FetchContent's mcap v1.3.1 (foxglove/mcap); its types.hpp
uses uint16_t/uint64_t/etc without including <cstdint>, which GCC 15's
leaner libstdc++ headers no longer pull in transitively. It's a
downloaded tarball, not a git checkout, so force-include the header via
CMAKE_CXX_FLAGS instead of source-patching, same approach used for
as2_platform_multirotor_simulator.

Separately, ros2-control-msgs failed on win-64 with sensor_msgs's cmake
config missing, despite ros2-sensor-msgs being present locally -- its
cached .conda was only ~25KB (implausibly small for a message package),
suggesting a prior interrupted/cancelled build (many superseding pushes
via the concurrency group this cycle) got cached in a corrupt state.
Cache-bust it to force a fresh rebuild.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same depthai-core-release tag (2.31.1-1) as humble, hitting the
identical two-layer CMake4 floor violation: its own top-level
cmake_minimum_required(VERSION 3.4), and Hunter's subprocess-spawned
cmake invocation. Port both fixes over: bump the version, set
CMAKE_POLICY_VERSION_MINIMUM as a real env var before HunterGate (env
vars propagate to the child process; a -D cache arg would not), and
proactively add the same additional_cmake_args cache arg for
cmake/CMakeRC.cmake's separate same-process include() later in the
file (confirmed necessary for this exact source on humble).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same depthai-ros-release tag (2.12.2-1) and identical CMakeLists.txt
as humble's depthai_bridge (confirmed via diff) -- hits the same
OpenCV major-version-pin, calib3d->calib+geometry component split, and
hardcoded opencv_calib3d link library issues. Port the same patch over
verbatim.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…al source)

Same depthai-ros-release tag (2.12.2-1) and identical CMakeLists.txt as
humble's depthai_examples (confirmed via diff). Port the same fix over.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same pattern as ros2-sensor-msgs: ros2-rcl failed to find rcl_interfaces's
cmake config despite it being present in the local channel, and its
cached .conda was also only ~25KB. Force a fresh rebuild.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…om source

Building from ROS source fails to find Simde (its vectorization
backend) via find_package. Same fix already applied on humble: skip
the source build and generate a dummy package depending on the
conda-forge proxsuite release directly (also more up to date than the
ROS-packaged version).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Third instance of the same ~25KB corrupt-cache pattern: ros2-hardware-interface
failed to find control_msgs's cmake config despite it being present in
the local channel. Force a fresh rebuild.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same fixes as humble (identical upstream source, ros2-gbp/libg2o-release):
qt isn't declared in package.xml and CMakeLists.txt's find_package(QGLViewer)
is optional, so the qt host dep is dead weight that conflicts with vtk's
now-Qt6-only build (vtk 9.7.0 pinned here too). Also add
-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON for csparse_extension's win-64
LNK1181 (no import .lib generated without it).

Root-caused and verified by a peer session fixing the identical issue
on rolling.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tobias-Fischer and others added 24 commits September 5, 2026 22:55
Same fix the user already applied on ros-humble (c9a28f31): GCC 15's
leaner libstdc++ headers no longer pull in <cstdint> transitively, so
msgpack11.hpp's uint8_t/uint16_t/uint32_t/uint64_t usages fail with
cascading "does not name a type" / template-argument errors. Verified
identical upstream source between humble and jazzy's pinned tags (both
release/*/sick_scan_xd/3.9.0-1) before porting; patch applies cleanly
and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
target_compile_options() unconditionally passes
-Wno-error=maybe-uninitialized (a GCC/Clang-only spelling), which
MSVC's cl.exe rejects outright: "error D8021: invalid numeric
argument '/Wno-error=maybe-uninitialized'". Guard it with if(NOT
MSVC). Verified patch applies cleanly against the pinned release tag
and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
interpolation_utils.hpp uses std::to_string/std::invalid_argument but
never includes <string>; GCC/libstdc++ pulls it in transitively via
<stdexcept>/<vector>, MSVC's STL doesn't, causing cascading C2039/
C3861/C2512 errors. Same fix already applied identically on
ros-humble (pre-existing patch, same upstream source/line numbers) --
ported the identical one-line fix here. Verified applies cleanly
against the pinned release tag and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…der (win-64)

bt3_recorder links against ${BEHAVIOR_TREE_LIBRARY}, which only adds
ZMQ_INCLUDE_DIRS as PRIVATE, so they don't propagate. Works by
accident on Unix (the conda prefix's include dir is already on the
default search path there) but not on MSVC: "error C1083: Cannot open
include file: 'zmq.h'" via the vendored cppzmq wrapper. Add the
include dirs directly to bt3_recorder's own target. Same one-line fix
already exists in ros-humble's (much larger, different-tag) patch for
this package -- applied just this piece here since jazzy pins a
different upstream tag/repo and CI's actual error was purely the
missing include path, not the more extensive vendored-zmq.hpp issues
humble's patch also addresses. Verified applies cleanly and passes
check-patches; may need further porting from humble's patch if CI
surfaces additional issues.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fixed the ZMQ include-path issue for bt3_recorder, but CI progressed
to a second failure in the same package: it uses its own
BUILD_UNIT_TESTS CMake option (default ON) instead of the standard
BUILD_TESTING that rattler-build already passes as OFF, so its test
suite always gets compiled -- failing with "Cannot open include file:
gtest/gtest.h" (the ament_cmake_gtest path here doesn't get the
FetchContent-provided gtest include dir). We only need the library
artifact, not its tests; pass -DBUILD_UNIT_TESTS=OFF explicitly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
node.cpp's object file exceeds MSVC's default section-count limit due
to heavy Boost/Eigen/protobuf template instantiation: "error C1128:
number of sections exceeded object file format limit". Same fix
already applied on ros-humble (identical upstream CMakeLists.txt
context); appended as a new hunk ahead of the existing
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS/glog-version hunk in the same file.
Verified against the pinned release tag and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ion limit)

ros_filter.cpp's object file exceeds MSVC's default section-count
limit due to heavy Eigen template instantiation: "error C1128: number
of sections exceeded object file format limit". Same fix already
applied for cartographer_ros's node.cpp on both distros this session;
added as a new hunk ahead of the existing _USE_MATH_DEFINES/
WINDOWS_EXPORT_ALL_SYMBOLS hunk in the same file. Verified against the
pinned release tag and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… (win-64)

freetype 2.11.1's cmake_minimum_required(VERSION 2.8.12) is below
CMake 4's floor of 3.5, failing freetype_vendor's ExternalProject
configure step: "CMake Error at CMakeLists.txt:112
(cmake_minimum_required)". Same fix already applied to this exact file
for the ogre_vendor sub-build (OGRE_CMAKE_ARGS); added the equivalent
for freetype_vendor's own CMAKE_ARGS list. Verified applies cleanly
and passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Added the usual /bigobj fix for clearpath_diagnostic_updater.cpp's
MSVC section-count limit (same as cartographer_ros and
robot_localization this session). While doing so, discovered and
fixed a latent bug in the existing patch file itself: it was in
git-format-patch/mbox style (From/Date/Subject header + a bare "---"
body separator) immediately followed by a real diff header, which
rattler-build's patch-apply tool misparsed as a single malformed hunk
(confirmed via check-patches: "Failed: 1", "could not find context in
target file" -- even though `git apply --check` had reported this as
fine, since git apply is more lenient about this than the real patch
tool). Rewrote the whole file in the same plain "diff --git" style
used by every other patch in this repo, which both `git apply --check`
and check-patches now agree on ("Failed: 0").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The "Build recipes" step's raw log is often tens of thousands of
lines; finding the actual failure means fetching and grepping the
whole thing by hand. Tee the build output to a file, extract a
compact diagnostic excerpt (the last ~20 error/failure markers with
surrounding context, plus the recipe heading they belong to) into the
job summary, and upload the full log as an artifact for when more
context is needed. Ported from a peer session's identical addition on
ros-rolling (already independently verified there), adapted to this
repo's own "Build recipes" step structure and channel URLs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The file was named ros-jazzy-sick-scan-xd.osx.patch, but the package's
actual resolved build name is ros2-sick-scan-xd (per jazzy's dual
package_name_mode) -- and since ros2-sick-scan-xd.patch ALSO exists as
its own separate file, vinca's add_package_name_variants() cross-link
(a setdefault) never merges the two: the "ros2-sick-scan-xd" dict key
already existed on its own before the variant-linking step runs, so
the osx-specific patch list from the "ros-jazzy-sick-scan-xd" key was
never attached to it. Confirmed via vinca's actual patch-scanning
logic and empirically: regenerating osx-64 recipes showed only
ros2-sick-scan-xd.patch in the "patches:" list, never the .osx.patch,
despite the file existing on disk this whole time.

Concretely this meant the CMakeLists.txt's unconditional
"-fno-var-tracking-assignments" (GCC-only flag) was never actually
stripped for macOS builds, and Apple's clang rejected it outright
("error: unknown argument"), reached now that CI has progressed this
deep into the win-64/osx-64 fix chain this session. Renaming the file
to match the real resolved package name is sufficient -- no source
content change needed, the existing patch already deletes the whole
offending CMake block. Verified via check-patches ("Failed: 0") and
via a small standalone script replicating vinca's exact patch-dict
construction, confirming no OTHER orphaned platform-patch exists on
either distro right now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… visibility (win-64)

LINK : fatal error LNK1189: library limit of 65535 objects exceeded.
Root cause: our own existing win.patch's `set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
ON)` blanket-exports every symbol, including every member of every
ros_gz_bridge::Factory<ROS_T, GZ_T> class template instantiation --
one per bridged ROS<->GZ message type pair across 14 message packages
-- which explodes past MSVC's import-library member-count limit.

This is a known, already-fixed upstream bug: gazebosim/ros_gz#930
(merged 2026-08-21) replaces the blanket export with explicit
GenerateExportHeader-based visibility (ROS_GZ_BRIDGE_VISIBLE) on just
the actual public API. Backported that fix: 18 of 22 upstream-changed
files applied cleanly via `git apply --reject`; CMakeLists.txt and
convert/ros_gz_interfaces.hpp needed manual reconciliation against our
older pinned tag (1.0.23-1 predates even the introduction of the
original WINDOWS_EXPORT_ALL_SYMBOLS line, so upstream's own diff
removing it didn't have a matching context to remove -- our version
never had it upstream at all, only via our own patch). Kept our
existing /bigobj addition, just dropped the
WINDOWS_EXPORT_ALL_SYMBOLS line and added the 18-clean-file visibility
plumbing plus the two manually-reconciled files. Verified the full
combined patch applies cleanly against a fresh pristine clone and
passes check-patches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…heck

vinca.yaml comments: packages_select_by_deps's if-wrapper (primary way
to exclude a package's own recipe), packages_skip_by_deps (transitive
pull-in only, does not stop direct selection), and
packages_remove_from_deps (a third, independent way to fully exclude a
package's own build via resolve_pkgname()/should_skip_pkg -- which also
inseparably strips it from other recipes' deps) are easy to conflate;
this came up repeatedly this session, including a mechanism that was
initially mis-explained. Verified against the vinca revision pinned in
pixi.toml.

check_orphaned_platform_patches.py replicates vinca's exact patch-glob +
add_package_name_variants() logic to catch a real bug class: a
platform-specific patch silently never wired into any recipe because
its filename uses a different name-prefix than another patch for the
same package (setdefault() in add_package_name_variants is a no-op once
either prefix already has its own entry). Wired into `pixi run
check-patches` via a new check-orphaned-patches task dependency so it
runs on every PR.

Running it here found a real (if currently low-impact) instance:
ros-jazzy-apriltag-ros.patch was never applied (package_name_mode: both
always resolves apriltag_ros's own patch lookup to the ros2- prefix),
and had been fully superseded by ros2-apriltag-ros.patch's OpenCV5 fix;
its only content was an APPLE-only guard, moot anyway since apriltag_ros
only builds on linux. Deleted the dead file.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Follow-up to aa7eb95 (which only committed the dead-patch deletion) --
this adds the actual check_orphaned_platform_patches.py script, wires
it into `pixi run check-patches` via pixi.toml, and adds the
explanatory vinca.yaml comment blocks on the three exclusion
mechanisms (packages_select_by_deps / packages_skip_by_deps /
packages_remove_from_deps) described in that commit's message.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Timer.h's non-POSIX (i.e. Windows) branch includes <boost/timer.hpp> and
typedefs the deprecated boost::timer (v1). As of Boost 1.90 (pinned via
libboost 1.90.* in vinca.yaml's mutex run_constraints), that header
hard-errors (C1189) unless BOOST_TIMER_ENABLE_DEPRECATED is defined.
Replaced the typedef with a minimal std::chrono-based struct that keeps
the same interface (default-construct starts, restart(), elapsed()),
avoiding the boost dependency entirely rather than just suppressing the
deprecation warning. Verified via `pixi run vinca --platform win-64` +
`python check_patches_clean_apply.py --recipe ros2-libpointmatcher`
(patch applies and rattler-build's patch phase passes).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…counter

Follow-up to 70c52ec (boost::timer fix unblocked compilation, surfacing
this next error). MSVC's classic /openmp (OpenMP 2.0 subset) requires a
parallelized for-loop's index variable to have signed integral type;
sparsetv.hpp and SpectralDecomposition.cpp use std::size_t loop counters
in all 13 of their #pragma omp parallel for loops (GCC/Clang's OpenMP
3.0+ support allows unsigned there, so this only ever surfaced on
win-64). Changed each to std::ptrdiff_t (matching Eigen::Index's own
default type, so the tensors(i)/col(i) indexing stays natural) with an
explicit static_cast on the nbPts bound. Verified via
`check_patches_clean_apply.py --recipe ros2-libpointmatcher`.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ult override

The shared vinca-generated bld_ament_cmake.bat build script passes
-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON as a CACHE default for every
ament_cmake package. The earlier GenerateExportHeader fix only removed
this package's own `set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)` line, but
simply removing it leaves that cache default in effect (a plain set()
only shadows a cache variable if it actually executes) -- silently
re-enabling blanket symbol export and reintroducing the exact LNK1189
problem this whole fix chain was meant to solve. Added an explicit
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF) right where the old ON used
to be, which does override the cache default. Found while diagnosing
why humble's identical fix still failed on PR #420 (humble additionally
had a legacy base patch redundantly setting the same variable, deleted
there in a separate commit -- jazzy never had that second patch).
Verified via `python check_patches_clean_apply.py --recipe
ros2-ros-gz-bridge` (passes).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tibility

__PRETTY_FUNCTION__ is a GCC/Clang-only builtin (used in 6 RCLCPP_DEBUG
calls purely for the function name); MSVC has no such identifier,
causing C2065 "undeclared identifier" (hit on PR #271's win-64 job).
Added a portable ROS2_PPS_PRETTY_FUNCTION macro (__FUNCSIG__ on MSVC,
__PRETTY_FUNCTION__ elsewhere) and swapped all 6 usages. New patch file
(no existing patch for this package on jazzy, unlike humble's older
1.0.5 release which already carries an RCLCPP_VERSION_MAJOR compat
shim touching the same file -- same fix merged into that patch there).
Verified via `check_patches_clean_apply.py --recipe
ros2-persist-parameter-server`.

Also added a win-64 cache-bust for ros2-ros-gz-bridge in testpr.yml:
--skip-existing matches on name+version+build_number, not patch
content, so a previously-cached (pre-fix) .conda for this package
could otherwise silently mask whether the
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS fix (37393b9) actually works, since
it would never be exercised by a fresh build.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
rosbag2_performance_benchmarking_msgs' generated Python extension
("_s") rosidl typesupport target hits MSVC error C1083 "Cannot open
compiler generated file: ''" on win-64 -- reproduced consistently
across two separate CI runs (a genuine rerun, not just a retry of the
same job), ruling out a one-off flake. This is a known rosidl/
ament_cmake codegen race between the main C library target and its
Python extension sibling both consuming the same generated .c file
without a proper build dependency edge -- the identical error
signature already excluded on ros-humble for iiwa14_moveit_config.

Verified via vinca's own dependency-closure resolver that
rosbag2_performance_benchmarking (the tool) is the ONLY thing that
depends on rosbag2_performance_benchmarking_msgs, so moving the tool
itself into an "if: not win" block (rather than the msgs package)
cleanly and completely excludes both with no other collateral impact.
Confirmed via full recipe regeneration: win-64 drops from 1647 to 1643
recipes (exactly these packages) with no dangling references, while
linux-64 still builds all four (ros-jazzy-/ros2- x tool/msgs) normally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Root-caused the 'No candidates were found for libdc1394 *' solve
failure on PR #271's win-64 job (previously flagged as background
task_7ffbed8a after ruling out robostack.yaml's libpcl-all-dev mapping,
rtabmap's own package.xml, and conda-forge's pcl/vtk metadata as the
source -- all correctly eliminated, since none of those were actually
it).

The real source: patch/dependencies.yaml's `rtabmap: add_host` entry
(a manually-curated list of extra host deps beyond what package.xml
declares) lists "libdc1394" as a plain, unconditional string -- found
by instrumenting vinca's actual generate_output() call chain directly,
since static config inspection alone couldn't locate it (this
mechanism reads patch/dependencies.yaml, not robostack.yaml or
pkg_additional_info.yaml, and isn't obviously discoverable by name).
Confirmed via conda-forge's win-64 repodata that libdc1394 has zero
published builds there (libusb and ceres-solver, the other two
additions, are both fine).

rtabmap's own CMakeLists.txt already treats DC1394 as fully optional
(`option(WITH_DC1394 ... ON)`, `FIND_PACKAGE(DC1394 QUIET)`, every use
guarded by `IF(DC1394_FOUND)`), so it builds fine without it. Wrapped
it in the same Jinja `${{ 'x' if <cond> }}` conditional-list-item
pattern already used for libgl-devel/libopengl-devel in that same
list: `${{ 'libdc1394' if not win }}`. Verified via full recipe
regeneration on both win-64 (renders as a literal conditional,
correctly omitted there) and linux-64 (still included).

Also kept a small robostack.yaml hardening (libdc1394-dev now maps to
an empty list on win64 rather than [libdc1394]) as defense in depth,
in case any other package.xml ever declares it directly via rosdep --
harmless but wasn't the actual fix here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Past the libdc1394 fix (76bf93d), win-64 progressed deep into
rtabmap's own build and hit error C3861: 'CoInitialize': identifier
not found in both app/src/main.cpp and tools/DatabaseViewer/main.cpp.
Both already correctly guard the call with #ifdef WIN32, but neither
includes <objbase.h> (or anything that transitively pulls it in on
this build's include chain) -- CoInitialize is declared there. Added
the missing include, guarded the same way as the call site. Verified
via `check_patches_clean_apply.py --recipe ros2-rtabmap`.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Past the rtabmap fixes, win-64 got much further (rtabmap itself
archived successfully) and hit a new failure: error C2061 'timeval'
undeclared / C2065 'timeout' undeclared in Exceptions.h's
timeout_error(const std::string&, timeval) constructor overload.

struct timeval is a POSIX/BSD sockets type with no automatic
declaration on Windows (needs winsock2.h there, sys/time.h on Unix --
neither is included). Rather than adding a platform-specific socket
header (risky: winsock2.h/windows.h have strict inclusion-order
requirements, and this header doesn't control what else gets included
before it in a given translation unit), traced every call site: all
three throw sites (UDPClient.cpp, TCPClient.cpp x2) actually pass
sick::types::time_duration_t (= boost::posix_time::time_duration),
matching the OTHER timeout_error overload a few lines below. The
timeval-taking overload is entirely dead code, never constructed
anywhere in the package -- deleted it instead of trying to make an
unused signature portable.

Verified via `check_patches_clean_apply.py --recipe
ros2-sick-safetyscanners-base`.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Past the sick_safetyscanners_base fix, win-64 progressed further and
hit LNK1181 "cannot open input file 'mode.lib'" linking
mode_monitor/mode_manager against the mode library. mode is a SHARED
library with no explicit dllexport annotations; on Windows, MSVC does
not generate an import library (.lib) at all for a DLL that exports
zero symbols, so any downstream target linking against it fails to
even find the .lib file. Added set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
to auto-export everything (mode is a small, 5-source-file library, well
under the 65535-object import-library limit that made this same fix
unsuitable for ros_gz_bridge earlier in this session).

ros-humble already carries this exact fix (patch/ros-humble-system-modes.win.patch,
identical one-line diff, from an earlier session) -- confirms this is
the right approach; jazzy just never had it since system_modes had
presumably never been reached on jazzy's win-64 build before. Verified
via `check_patches_clean_apply.py --recipe ros2-system-modes`.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
visp's upstream package.xml declares <depend>zbar</depend>
unconditionally, which resolved through robostack.yaml's flat
zbar mapping into ros2-visp's generated host/run deps. zbar has
zero win-64 builds on conda-forge, so the solve failed with
"No candidates were found for zbar *".

The real external visp conda-forge package (which our dummy
ros2-visp metapackage wraps via a run constraint) has no zbar
dependency on win-64 either, per its own win-64 repodata — so
excluding zbar there is correct, not just a workaround. Matches
humble's existing per-platform zbar mapping, which already
excludes win64 (and linux-aarch64, unrelated to this fix).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@Tobias-Fischer Tobias-Fischer left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments for Claude

Comment thread .github/workflows/testpr.yml Outdated
Comment thread .github/workflows/testpr.yml Outdated
Comment thread patch/dependencies.yaml Outdated
Comment thread patch/dependencies.yaml Outdated
Comment thread pixi.toml
Comment thread vinca.yaml Outdated
Comment thread vinca.yaml Outdated
Comment thread vinca.yaml Outdated
Comment thread vinca.yaml Outdated
Comment thread vinca.yaml Outdated
@Tobias-Fischer Tobias-Fischer changed the title Sync cross-distribution Vinca package coverage Full Rebuild September 2026 + Sync cross-distribution Vinca package coverage Sep 7, 2026
Tobias-Fischer and others added 3 commits September 8, 2026 07:59
Cosmetic-only cleanup per PR review: shorten/remove overly detailed
inline comments added during recent fix commits (kept the substance,
dropped the narration), and drop the now-unnecessary per-package
cache-delete entries in testpr.yml (each one addressed a since-fixed
one-off issue). Moved the "3 ways to exclude a package" reference
block from vinca.yaml into AGENTS.md, condensed. Also dropped the
now-redundant ros2cli/rosidl_cli per-package build_number overrides in
pkg_additional_info.yaml now that the global build_number is already
23.

Verified zero effect on generated output: recipes regenerated for
win-64 and linux-64 are byte-identical to pre-change, sort/orphaned-
patch checks pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both were still built from ROS source (ros2-gbp/*-release). Switch to
dummy metapackages depending on conda-forge's own cyclonedds and
libiceoryx-binding-c/hoofs/posh, matching the pattern already used on
humble (iceoryx) and rolling (both).

cyclonedds excludes win-64: conda-forge's win-64 channel only has
cyclonedds 0.5.0, 0.6.0 and 11.0.1, not the 0.10.x series ROS is
pinned to and rmw_cyclonedds_cpp was built against (11.0 changed
enough that "too much changed since 0.10 to list it all" per
upstream's own release notes, and rmw_cyclonedds_cpp's unpinned
find_package(CycloneDDS) would configure but isn't verified to
compile against it). win-64 keeps building cyclonedds from source
exactly as before. iceoryx needed no such exclusion -- 2.95.8 is
available on every platform including win-64, and humble already
proves the vendored-cyclonedds + dummy-iceoryx combination builds
cleanly on win-64 today.

Removed the now-dead ros-jazzy-iceoryx-{binding-c,hoofs,posh}.win.patch
files: real Windows build fixes for the vendored source, but iceoryx
no longer builds from source on any platform so they can never be
applied again.

Verified via recipe regeneration: iceoryx is a dummy package on every
platform (including win-64); cyclonedds is a dummy package everywhere
except win-64, which is untouched (still the vendored build).
check_orphaned_platform_patches.py and check_dependency_compat.py
show no new issues.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…e too

My previous commit (7b82476) kept cyclonedds vendored on win-64,
believing conda-forge's win-64 channel only had 0.5.0/0.6.0/11.0.1.
That was a version-sort bug in my own verification (lexicographic
string sort put "0.10.5" before "0.5.0", so truncating to the last
few sorted entries silently dropped it) -- 0.10.5 is in fact published
for win-64, matching every other platform. Removing the unnecessary
platform exclusion; cyclonedds is now a dummy metapackage on all
platforms uniformly, same as iceoryx.

Verified via recipe regeneration: win-64 now produces the same dummy
package (cyclonedds >=0.10.5,<0.11.0a0 run constraint) as every other
platform. check_orphaned_platform_patches.py and pixi run sort --check
both clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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