Skip to content

Commit 42d33f6

Browse files
Merge branch 'main' into perf/qt6-webchannel-latency
2 parents 67bcfcf + f2ae7a7 commit 42d33f6

36 files changed

Lines changed: 432 additions & 182 deletions

.github/actions/build-linux/action.yml

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,6 @@ runs:
5555
run: df -h /
5656
shell: bash
5757

58-
# Rocky 9.8 dropped mesa-libOSMesa{,-devel} from the CRB repo (Mesa upstream
59-
# deprecated OSMesa in favor of llvmpipe via EGL). Pin all subsequent dnf
60-
# calls in this container to the 9.7 minor release until OpenRV migrates off
61-
# OSMesa. 9.7 is now a superseded minor, so the production CDN no longer
62-
# serves it (the default 'extras' repo 404s); point the pinned repos at the
63-
# durable vault archive (dl.rockylinux.org/vault) instead. Remove this whole
64-
# step once OpenRV no longer needs OSMesa.
65-
- name: Pin Rocky 9 to 9.7 minor release (vault)
66-
if: ${{ inputs.rocky-version == '9' }}
67-
run: |
68-
echo "9.7" > /etc/dnf/vars/releasever
69-
sed -i \
70-
-e 's|^mirrorlist=|#mirrorlist=|g' \
71-
-e 's|^#\?baseurl=https\?://dl.rockylinux.org/\$contentdir/|baseurl=https://dl.rockylinux.org/vault/rocky/|g' \
72-
/etc/yum.repos.d/[Rr]ocky*.repo
73-
dnf clean all
74-
shell: bash
75-
7658
- name: Install system dependencies
7759
run: |
7860
retry_count=0
@@ -84,9 +66,14 @@ runs:
8466
if dnf install -y epel-release && \
8567
dnf config-manager --set-enabled ${{ inputs.extra_repo }} devel && \
8668
dnf groupinstall "Development Tools" -y && \
87-
dnf install -y alsa-lib-devel autoconf automake avahi-compat-libdns_sd-devel bison bzip2-devel cmake-gui curl-devel flex gcc gcc-c++ git libXcomposite libXi-devel libaio-devel libffi-devel nasm ncurses-devel nss libtool libxkbcommon libXcomposite libXdamage libXrandr libXtst libXcursor mesa-libOSMesa mesa-libOSMesa-devel meson openssl-devel patch pulseaudio-libs pulseaudio-libs-glib2 ocl-icd ocl-icd-devel opencl-headers qt5-qtbase-devel readline-devel sqlite-devel systemd-devel tcl-devel tcsh tk-devel yasm zip zlib-devel wget patchelf pcsc-lite libxkbfile perl-IPC-Cmd perl-Time-Piece && \
69+
dnf install -y alsa-lib-devel autoconf automake avahi-compat-libdns_sd-devel bison bzip2-devel cmake-gui curl-devel flex gcc gcc-c++ git libXcomposite libXi-devel libaio-devel libffi-devel nasm ncurses-devel nss libtool libxkbcommon libXcomposite libXdamage libXrandr libXtst libXcursor meson openssl-devel patch pulseaudio-libs pulseaudio-libs-glib2 ocl-icd ocl-icd-devel opencl-headers qt5-qtbase-devel readline-devel sqlite-devel systemd-devel tcl-devel tcsh tk-devel yasm zip zlib-devel wget patchelf pcsc-lite libxkbfile perl-IPC-Cmd perl-Time-Piece && \
8870
dnf install -y libX11-devel libXext-devel libXrender-devel libXrandr-devel libXcursor-devel libXi-devel libXxf86vm-devel libxkbcommon-devel && \
8971
dnf install -y xz-devel mesa-libGLU mesa-libGLU-devel && \
72+
if [ "${{ inputs.rocky-version }}" = "9" ]; then \
73+
dnf install -y mesa-compat-libOSMesa mesa-compat-libOSMesa-devel; \
74+
else \
75+
dnf install -y mesa-libOSMesa mesa-libOSMesa-devel; \
76+
fi && \
9077
dnf clean all; then
9178
echo "Dependencies installed successfully"
9279
break

.github/workflows/conan.yml

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,34 +97,27 @@ jobs:
9797
run: |
9898
df -h /
9999
100-
# Rocky 9.8 dropped mesa-libOSMesa{,-devel} from the CRB repo. Pin all
101-
# subsequent dnf calls in this container to the 9.7 minor release until
102-
# OpenRV migrates off OSMesa. Remove this step once that's done.
103-
- name: Pin Rocky 9 to 9.7 minor release (vault)
104-
if: ${{ matrix.rocky-version == '9' }}
105-
run: |
106-
echo "9.7" > /etc/dnf/vars/releasever
107-
sed -i \
108-
-e 's|^mirrorlist=|#mirrorlist=|g' \
109-
-e 's|^#\?baseurl=https\?://dl.rockylinux.org/\$contentdir/|baseurl=https://dl.rockylinux.org/vault/rocky/|g' \
110-
/etc/yum.repos.d/[Rr]ocky*.repo
111-
dnf clean all
112-
113100
- name: Install system dependencies
114101
run: |
115102
dnf install -y epel-release
116103
dnf config-manager --set-enabled ${{ matrix.extra_repo }} devel
117104
dnf install -y which findutils
118105
dnf groupinstall "Development Tools" -y
119-
dnf install -y alsa-lib-devel autoconf automake avahi-compat-libdns_sd-devel bison bzip2-devel cmake-gui curl-devel flex gcc gcc-c++ git libXcomposite libXi-devel libaio-devel libffi-devel nasm ncurses-devel nss libtool libxkbcommon libXcomposite libXdamage libXrandr libXtst libXcursor mesa-libOSMesa mesa-libOSMesa-devel meson openssl-devel patch pulseaudio-libs pulseaudio-libs-glib2 ocl-icd ocl-icd-devel opencl-headers qt5-qtbase-devel readline-devel sqlite-devel systemd-devel tcl-devel tcsh tk-devel yasm zip zlib-devel wget patchelf pcsc-lite libxkbfile perl-IPC-Cmd perl-Digest-SHA
106+
dnf install -y alsa-lib-devel autoconf automake avahi-compat-libdns_sd-devel bison bzip2-devel cmake-gui curl-devel flex gcc gcc-c++ git libXcomposite libXi-devel libaio-devel libffi-devel nasm ncurses-devel nss libtool libxkbcommon libXcomposite libXdamage libXrandr libXtst libXcursor meson openssl-devel patch pulseaudio-libs pulseaudio-libs-glib2 ocl-icd ocl-icd-devel opencl-headers qt5-qtbase-devel readline-devel sqlite-devel systemd-devel tcl-devel tcsh tk-devel yasm zip zlib-devel wget patchelf pcsc-lite libxkbfile perl-IPC-Cmd perl-Digest-SHA
120107
dnf install -y libX11-devel libXext-devel libXrender-devel libXrandr-devel libXcursor-devel libXi-devel libXxf86vm-devel libxkbcommon-devel
121108
dnf install -y xz-devel mesa-libGLU mesa-libGLU-devel
109+
if [ "${{ matrix.rocky-version }}" = "9" ]; then \
110+
dnf install -y mesa-compat-libOSMesa mesa-compat-libOSMesa-devel; \
111+
else \
112+
dnf install -y mesa-libOSMesa mesa-libOSMesa-devel; \
113+
fi && \
122114
dnf clean all
123115
124116
- name: Install other system dependencies
125117
if: ${{ matrix.rocky-version == '9' }}
126118
run: |
127119
dnf install -y perl-CPAN
120+
128121
cpan FindBin
129122
130123
- name: Install GCC 11 toolchain for Rocky Linux 8

.readthedocs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: 2
22

33
build:
4-
os: "ubuntu-20.04"
4+
os: "ubuntu-lts-latest"
55
tools:
66
python: "3.8"
77

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
---
77

88
![Supported Versions](https://img.shields.io/badge/python-3.11-blue)
9-
[![Supported VFX Platform Versions](https://img.shields.io/badge/vfx%20platform-2024-lightgrey.svg)](http://www.vfxplatform.com/)
9+
[![Supported VFX Platform Versions](https://img.shields.io/badge/vfx%20platform-2025-lightgrey.svg)](http://www.vfxplatform.com/)
1010
[![docs](https://readthedocs.org/projects/aswf-openrv/badge/?version=latest)](https://aswf-openrv.readthedocs.io/en/latest)
1111

1212
## Overview

cmake/macros/rv_stage.cmake

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,28 @@ FUNCTION(rv_stage)
7878
)
7979
IF(arg_TYPE IN_LIST _rv_stage_binary_types)
8080
RV_GENERATE_SYMBOLS(TARGET ${arg_TARGET})
81+
82+
# Release builds compile with -g so dump_syms can extract Breakpad .sym files (see docs/crash-reporting.md section 7). On Linux the shipped artifact is the
83+
# stage tree itself, so leaving the DWARF in the staged ELF would ship full debug info to customers. Strip it here -- AFTER RV_GENERATE_SYMBOLS has run
84+
# dump_syms on the real ELF, and BEFORE the .bin rename below -- so the shipped binaries carry no DWARF while the symbols live only in the symbols_archive
85+
# zip. --strip-debug keeps .symtab and, crucially, the GNU build-id that the .sym directory tree is keyed on, so offline symbolication still matches. This
86+
# is gated on Release + Linux only (not on the Breakpad version, per contract C6): macOS Mach-O binaries do not embed DWARF (it stays in the dSYM, which
87+
# rv_generate_symbols.cmake produces then deletes), so they are not bloated and need no strip.
88+
#
89+
# strip_debug_safe.sh (not a bare `strip`) guards against a GNU strip bug that corrupts binaries whose layout triggers the "'.dynstr' not in segment"
90+
# warning: it strips to a temp copy and only replaces the original when strip is warning- and error-free, otherwise it leaves the binary unstripped. RV's
91+
# own compiled targets strip cleanly; the guard protects any that do not.
92+
IF(RV_TARGET_LINUX
93+
AND CMAKE_BUILD_TYPE STREQUAL "Release"
94+
)
95+
ADD_CUSTOM_COMMAND(
96+
TARGET ${arg_TARGET}
97+
POST_BUILD
98+
COMMENT "Stripping DWARF debug info from ${arg_TARGET} (symbols archived separately)"
99+
COMMAND bash ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../scripts/strip_debug_safe.sh "$<TARGET_FILE:${arg_TARGET}>"
100+
VERBATIM
101+
)
102+
ENDIF()
81103
ENDIF()
82104

83105
IF(RV_TARGET_LINUX)

cmake/scripts/strip_debug_safe.sh

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/bin/bash
2+
#
3+
# Copyright (C) 2026 Autodesk, Inc. All Rights Reserved.
4+
#
5+
# SPDX-License-Identifier: Apache-2.0
6+
#
7+
# Safely strip DWARF debug info from an ELF binary.
8+
#
9+
# GNU strip has a known bug: for binaries whose layout makes it emit
10+
# "allocated section `.dynstr' not in segment"
11+
# (observed on Google Crashpad's crashpad_handler and some Qt tools such as
12+
# lupdate), it rewrites the program headers incorrectly and produces an
13+
# UNLOADABLE binary (the loader fails with exit 127 / "Connection reset by
14+
# peer" for crashpad_handler). strip can still exit 0 while emitting that
15+
# warning, so a plain in-place `strip` silently corrupts the shipped binary.
16+
#
17+
# This wrapper strips to a temporary copy and only replaces the original when
18+
# strip completed with NO warnings/errors on stderr and a zero exit code.
19+
# Otherwise the original binary is left untouched (it keeps its debug info, but
20+
# it stays loadable). Such binaries typically carry little or no DWARF anyway,
21+
# so the size cost of skipping them is negligible.
22+
#
23+
# Usage: ./strip_debug_safe.sh <elf-binary>
24+
#
25+
26+
TARGET="$1"
27+
28+
if [ -z "${TARGET}" ]; then
29+
echo "strip_debug_safe: usage: $0 <elf-binary>" >&2
30+
exit 2
31+
fi
32+
33+
if [ ! -f "${TARGET}" ]; then
34+
# Nothing to strip (e.g. target produced no file); do not fail the build.
35+
echo "strip_debug_safe: no such file, skipping: ${TARGET}" >&2
36+
exit 0
37+
fi
38+
39+
# Strip to a temp copy in the same directory (same filesystem => atomic mv).
40+
TMP="$(mktemp "${TARGET}.stripXXXXXX")" || exit 1
41+
42+
# Capture stderr while discarding stdout. The command-substitution exit status
43+
# is strip's exit code, which the following test consumes.
44+
if STRIP_ERR="$(strip --strip-debug -o "${TMP}" "${TARGET}" 2>&1 >/dev/null)" && [ -z "${STRIP_ERR}" ]; then
45+
# Clean strip: preserve permissions and replace the original atomically.
46+
chmod --reference="${TARGET}" "${TMP}" 2>/dev/null || true
47+
mv -f "${TMP}" "${TARGET}"
48+
else
49+
rm -f "${TMP}"
50+
echo "strip_debug_safe: keeping ${TARGET} unstripped (strip reported: ${STRIP_ERR:-nonzero exit})" >&2
51+
fi
52+
53+
exit 0

dockerfiles/Dockerfile.Linux-Rocky9-CY2023

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ RUN dnf groupinstall "Development Tools" -y \
6363
libxkbfile \
6464
mesa-libGLU \
6565
mesa-libGLU-devel \
66-
mesa-libOSMesa \
67-
mesa-libOSMesa-devel \
66+
mesa-compat-libOSMesa \
67+
mesa-compat-libOSMesa-devel \
6868
meson \
6969
nasm \
7070
ncurses-devel \
@@ -135,4 +135,4 @@ RUN python -m aqt install-qt linux desktop ${QT_VERSION} gcc_64 -O ~/Qt \
135135
-m ${QT_MODULES} \
136136
--archives ${QT_ARCHIVES}
137137

138-
CMD ["/bin/bash"]
138+
CMD ["/bin/bash"]

dockerfiles/Dockerfile.Linux-Rocky9-CY2024

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ RUN dnf groupinstall "Development Tools" -y \
6363
libxkbfile \
6464
mesa-libGLU \
6565
mesa-libGLU-devel \
66-
mesa-libOSMesa \
67-
mesa-libOSMesa-devel \
66+
mesa-compat-libOSMesa \
67+
mesa-compat-libOSMesa-devel \
6868
meson \
6969
nasm \
7070
ncurses-devel \
@@ -92,6 +92,8 @@ RUN dnf groupinstall "Development Tools" -y \
9292
yasm \
9393
zip \
9494
zlib-devel \
95+
rust \
96+
cargo \
9597
&& dnf clean all
9698

9799
# Disable the devel repo afterwards since dnf will warn about it
@@ -135,4 +137,4 @@ RUN python -m aqt install-qt linux desktop ${QT_VERSION} gcc_64 -O ~/Qt \
135137
-m ${QT_MODULES} \
136138
--archives ${QT_ARCHIVES}
137139

138-
CMD ["/bin/bash"]
140+
CMD ["/bin/bash"]

docs/build_system/config_linux_rocky89.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ sudo dnf install -y libX11-devel libXext-devel libXrender-devel libXrandr-devel
116116
sudo dnf install -y xz-devel mesa-libGLU mesa-libGLU-devel
117117
```
118118

119+
````{tabs}
120+
```{code-tab} bash Rocky 8
121+
sudo dnf install -y mesa-libOSMesa mesa-libOSMesa-devel
122+
```
123+
```{code-tab} bash Rocky 9
124+
sudo dnf install -y mesa-compat-libOSMesa mesa-compat-libOSMesa-devel
125+
```
126+
````
127+
119128
```bash
120129
sudo dnf clean all
121130
```

docs/crash-reporting.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ key: Mu context is function-level (see C2 for why line-level cannot be captured
184184
them from Release installs — the macOS/Linux `symbols/` tree and the Windows `.pdb` files. (Debug
185185
installs keep them for local debugging; the strip is gated on `CMAKE_INSTALL_CONFIG_NAME`.)
186186
Customers never symbolicate, so shipping symbols only bloats the package.
187+
188+
In addition, the *staged binaries themselves* must not embed DWARF. Release compiles with `-g`
189+
(so `dump_syms` can extract the `.sym` above), but on Linux the shipped artifact is the `stage`
190+
tree itself — not a `cmake --install` output — so the install-time strip never runs on it.
191+
Therefore `rv_stage.cmake` runs `strip --strip-debug` on each staged Linux binary in Release,
192+
*after* `dump_syms` has read the DWARF and *before* the `.bin` rename. This keeps `.symtab` and
193+
the GNU build-id (the key for the `symbols/` tree), so the DWARF lives only in the
194+
`symbols_archive` zip while the shipped binaries carry none. macOS Mach-O binaries do not embed
195+
DWARF (it stays in the dSYM), so no equivalent strip is needed there.
187196
3. The `symbols_archive` build target (`rv_archive_symbols.cmake`) instead packages a versioned,
188197
per-platform `RV-<version>-<os>-<arch>-symbols.zip` under `stage/packages/`:
189198
- macOS/Linux: the Breakpad `symbols/` tree plus the symbolication tools (`minidump_stackwalk`,
@@ -239,12 +248,12 @@ violates. This list is a remediation tracker, not part of the permanent design.
239248
entry points (values are set correctly at init via `StartHandler`).
240249
- [x] **C1 — three diverging init paths** for `rv` / `RV` / `rvio` (violated C4). Fixed: all three
241250
now call one shared helper, `TwkApp::initializeCrashHandler(appName, version, executableDir)`
242-
(`src/lib/app/MuTwkApp/CrashHandlerInit.{h,cpp}`), which resolves the handler, initializes, and
243-
enables Mu debugging. The per-`main.cpp` `#ifdef` path blocks are gone.
244-
- [x] **C2 — `rvio` used the bare `crashpad_handler`** (violated C5) and never called
245-
`setDebugging(true)`. Fixed by C1's shared helper: every binary now uses the platform wrapper
246-
(`crashpad_handler_{macos,linux}.sh` / `.exe`) and enables Mu debugging. The leftover
247-
`rvio` `addAnnotation("platform", …)` dead write (B3) was removed in the same change.
251+
(`src/lib/app/MuTwkApp/CrashHandlerInit.{h,cpp}`), which resolves the handler and initializes
252+
it. The per-`main.cpp` `#ifdef` path blocks are gone. (Automatic Mu debugging was later
253+
removed — the `mu_function` annotation carries the script context without it.)
254+
- [x] **C2 — `rvio` used the bare `crashpad_handler`** (violated C5). Fixed by C1's shared helper:
255+
every binary now uses the platform wrapper (`crashpad_handler_{macos,linux}.sh` / `.exe`). The
256+
leftover `rvio` `addAnnotation("platform", …)` dead write (B3) was removed in the same change.
248257
- [x] **D1 — Crashpad wrapper install guarded on `RV_DEPS_BREAKPAD_VERSION`** in
249258
`src/bin/nsapps/RV/CMakeLists.txt` (violated C6). Fixed: split by tool ownership — the Crashpad
250259
wrapper is now guarded on `RV_DEPS_CRASHPAD_VERSION`, `symbolicate_crash.sh` on the Breakpad var.

0 commit comments

Comments
 (0)