Skip to content

fix(appimage): bundle dlopen'd RMW and typesupport libraries - #15

Merged
facontidavide merged 1 commit into
mainfrom
fix/appimage-dlopen-libs
Sep 20, 2026
Merged

facontidavide merged 1 commit into
mainfrom
fix/appimage-dlopen-libs

Conversation

@facontidavide

Copy link
Copy Markdown
Contributor

Fixes #10.

Summary

ldd only reports link-time dependencies. The RMW providers and the rosidl_typesupport_* libraries are loaded with dlopen, so they were never copied into the AppDir and every 0.9.0 AppImage aborted on a clean machine with failed to load any RMW implementations.

  • Bundling moved from inline YAML into packaging/make_appdir.sh, so it can be run and tested locally instead of only in CI.
  • Copies both RMW providers and every typesupport flavour, then walks transitive dependencies from the original files — a copy's $ORIGIN rpath no longer resolves, which silently truncated the closure.
  • No RMW is forced. RMW_IMPLEMENTATION is left to the environment (it has to match the user's other nodes); both providers are shipped so either choice works.
  • Bundled message definitions remain a fallback: AMENT_PREFIX_PATH is appended, so a sourced workspace keeps priority. The AppImage is not self-sufficient for custom message types, by design.

Size goes from ~20 MB to ~20 MB packed (AppDir 49 MB → 69 MB).

Test plan

  • Built a real AppImage locally from the Humble pixi env
  • Runs in a clean ubuntu:24.04 container with no ROS installed — the exact repro from AppImage (all distros) missing RMW provider .so — dlopen'd libs not captured by ldd bundling #10
  • End-to-end: host publishers, bridge in the container, client decodes 3 topics at 20 Hz
  • RMW_IMPLEMENTATION unset and rmw_cyclonedds_cpp both work (matching publishers)
  • Type missing from the bundle: skipped with a clear error without ROS sourced, resolves with a workspace sourced
  • CI builds all three AppImages

🤖 Generated with Claude Code

ldd only reports link-time dependencies, so the RMW providers and the
rosidl typesupport libraries — both loaded with dlopen — were never copied
and every 0.9.0 AppImage aborted at startup with "failed to load any RMW
implementations" on a machine without ROS.

Bundling moves out of the workflow into packaging/make_appdir.sh so it can
be run and tested locally. Dependencies are walked from the original files
because a copy's $ORIGIN rpath no longer resolves.

No RMW is forced: both providers are shipped and RMW_IMPLEMENTATION is left
to the environment, since it has to match the user's other nodes. Bundled
message definitions are a fallback only — AMENT_PREFIX_PATH is appended, so
a sourced workspace keeps priority for custom types.

Verified in a clean ubuntu:24.04 container with no ROS: the AppImage starts
and streams three topics; with a type missing from the bundle that topic is
skipped without ROS sourced, and resolves once a workspace is sourced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@facontidavide
facontidavide merged commit 0fab699 into main Sep 20, 2026
11 checks passed
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.

AppImage (all distros) missing RMW provider .so — dlopen'd libs not captured by ldd bundling

1 participant