Skip to content

v1.3.0: performance fixes, macOS improvements, CI overhaul, Nautilus extension unification#10

Open
bas524 wants to merge 32 commits into
masterfrom
build-on-mac
Open

v1.3.0: performance fixes, macOS improvements, CI overhaul, Nautilus extension unification#10
bas524 wants to merge 32 commits into
masterfrom
build-on-mac

Conversation

@bas524
Copy link
Copy Markdown
Owner

@bas524 bas524 commented May 28, 2026

Summary

  • Performance & correctness fixes in core C++ code
  • macOS build fixes for incremental builds and launch crashes on macOS 15+
  • CI matrix overhaul — fresh OS images, non-x86 architecture support, and broken image replacements
  • Nautilus extension unification — single file supporting all GNOME Nautilus versions
  • Compilation warning cleanup and C++ standard bump to C++17

C++ fixes

  • Thread safety: fillExportTable rewritten — worker threads collect results into a std::vector, main thread populates the widget; eliminates data races on QListWidget
  • Widget batching: fillDependency wraps bulk inserts with setUpdatesEnabled(false/true) to avoid per-item repaints
  • Copy bug: copyExportItem was always copying the current row instead of all selected items
  • Global state: removed both QDir::setCurrent calls that mutated process-wide working directory
  • String build: getInfo rewritten to single-pass construction
  • dynamic_cast cache: result stored once in DemangleRules instead of re-casting on every use
  • QColor("red") replaced with Qt::red (avoids string parse on every tree update)
  • std::result_of (deprecated C++17) → std::invoke_result_t; CMake standard bumped 11 → 17
  • Qt::AA_EnableHighDpiScaling wrapped in #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) to silence Qt6 deprecation warning

macOS

  • ln -s → ln -sf in post-build step to fix failure on incremental builds
  • Added codesign --force --deep --sign - Qldd.app after macdeployqt to fix launch crash (EXC_BAD_ACCESS / CODESIGNING) on macOS 15+ caused by unsigned Homebrew dylibs copied into the bundle

CI

  • Replaced EOL debian:buster with debian:bookworm; removed EOL ubuntu-20-04 job
  • Replaced dead centos:latest (CentOS 8 EOL) with quay.io/centos/centos:stream9; removed CentOS 8 mirror hacks; added CRB + EPEL setup
  • Pinned all non-x86 QEMU matrix entries to ubuntu22.04 — ubuntu_latest (25.04) segfaults in QEMU emulation for ppc64le/s390x/riscv64
  • Re-enabled aarch64/fedora_latest (was commented out); removed dead ppc64le/fedora_latest and s390x/fedora_latest entries (images don't exist)
  • Fixed python3-nautilus → nautilus-python for Fedora/CentOS (correct RPM package name)
  • lsb_release detection made optional: falls back to parsing /etc/os-release, then warns gracefully if neither is present
  • macOS job name updated to reflect ARM64 runner (macos-latest is now Apple Silicon)

Nautilus extension

Replaced the two separate extension files (dependency-viewer.py for Nautilus <43, dependency-viewer-43.py for Nautilus 43+) with a single unified file. Both files registered the same class name, so whichever loaded second silently shadowed the first — breaking
the context menu on half of all distros. The unified file uses *args to handle both API versions.

bas524 and others added 30 commits October 7, 2024 22:33
Documents build commands, architecture, and code style in CLAUDE.md.
Adds 9 task files under tasks/ covering threading safety, debug logging,
widget update batching, and other performance/correctness improvements.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Worker threads now only perform CPU-bound work (demangling, rule
application, filter check) and collect results into a std::vector.
The QListWidget is populated exclusively on the main thread after
all async work completes. Also adds setUpdatesEnabled batching,
removes the toStdString() heap allocation, and guards against
lines with fewer than 3 tokens.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use ln -sf so the lib symlink is replaced rather than erroring when
it already exists from a previous build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
macdeployqt copies Homebrew dylibs (libjpeg, libtiff, etc.) into the
bundle without signing them. macOS 15+ kills the process at launch with
CODESIGNING / Invalid Page when dyld tries to map an unsigned dylib page.

Adding a codesign --force --deep --sign - step after macdeployqt applies
an ad-hoc signature to the entire bundle, satisfying the OS requirement.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The qDebug block was removed when the fillExportTable lambda was
rewritten as part of the task-01 threading fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
toUtf8().constData() was already used in the rewritten fillExportTable
lambda, replacing the toStdString().c_str() heap allocation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…4, task-05)

Wrap the treeWidget population loop with setUpdatesEnabled(false/true)
to eliminate per-item repaints when loading large binaries. Also replace
QColor("red") constructed per line with the Qt::red compile-time constant.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Store MainWindow* as a member _mainWindow, set once in the constructor
from the dynamic_cast already performed there. Replace all subsequent
dynamic_cast<MainWindow*>(parent()) calls in insertNewRow and
on_buttonBox_accepted with the cached pointer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Split and trim each line inline inside the execAndDoOnEveryLine callback,
removing the intermediate QStringList allocation and the second pass over
the data.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Iterate selectedItems() directly instead of looping by index and
fetching currentRow() each time. Multiple selected items are joined
with newlines so the clipboard gets all of them in one copy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Normalize _fileName to an absolute path in the QLdd constructor so ldd/
otool always receives a fully-qualified path regardless of the caller's
working directory. Both QDir::setCurrent calls and the now-unused
_lddDirPath member are removed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All 9 performance/correctness tasks have been resolved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…shing-hammock)

C++ / warnings:
- Bump CMAKE_CXX_STANDARD 11→17 (all CI compilers gcc8+ support it)
- Replace std::result_of with std::invoke_result_t in execAndDoOnEveryLine
- Guard AA_EnableHighDpiScaling with #if QT_VERSION < 6.0.0 to silence
  the Qt6 deprecation warning while keeping Qt5 high-DPI behaviour

CI:
- Enable aarch64/fedora_latest in ubuntu-latest-nonx86 matrix (supported
  by run-on-arch-action); remove dead ppc64le/s390x fedora comments
  (fedora images don't exist for those architectures)
- Remove ubuntu-20-04 job (EOL April 2025; 22.04/24.04 matrix covers LTS)
- Replace debian-buster (EOL June 2024) with debian-bookworm (Debian 12);
  update devel-pkgs: python-nautilus → python3-nautilus
- Fix macOS job name: "macos-latest x86_64" → "macos-latest" (runner is
  now ARM64)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the two separate extension files (pre-43 and 43+) with a single
dependency-viewer.py using *args to handle both Nautilus API versions:
- Nautilus <43: get_file_items(window, files)
- Nautilus 43+: get_file_items(files)

Both files registered the same class name, so whichever loaded second
silently shadowed the first, breaking the extension on half of all distros.
Remove the now-deleted dependency-viewer-43.py install rule from CMakeLists.txt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…kage name

- s390x: ubuntu_latest requires z15 hardware not available in QEMU emulation;
  downgrade to ubuntu22.04 which works on z14
- centos: centos:latest is EOL/gone; replace with quay.io/centos/centos:stream9
  and drop the CentOS 8 vault mirror hacks; enable CRB + EPEL for stream9
- fedora/centos: python3-nautilus no longer exists on Fedora 44+; use
  nautilus-python which is the correct RPM package name (matches CMakeLists.txt)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
redhat-lsb-core is absent from EPEL 9 and redhat-lsb is gone from Fedora 44.
lsb_release is only used for log messages and DEB package naming on Ubuntu/Debian,
neither of which applies to RPM builds. Degrade gracefully with a warning instead
of a fatal cmake error when the binary is not present.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
lsb_release is absent on CentOS Stream 9 and Fedora 44+ by default.
Parse /etc/os-release as a fallback — it is present on all systemd-based
distros. Capitalize the ID field to match lsb_release output so existing
Ubuntu/Debian codename checks downstream continue to work unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chain a second find-and-replace step to strip '/' after ':' is replaced,
so the artifact name contains no invalid characters.

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

- CMakeLists.txt: bump version 1.2.1 -> 1.3.0
- CI: replace chained find-and-replace steps with tr ':/' '--' to correctly
  sanitize quay.io/centos/centos:stream9 into a valid artifact name
- CLAUDE.md: document no-auto-commit/push constraint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ubuntu_latest resolves to Ubuntu 25.04 which includes Python 3.14; QEMU
emulation for ppc64le and s390x segfaults in Python's dpkg postinst.
Pin all four arches (aarch64, ppc64le, s390x, riscv64) to ubuntu22.04
which is stable under QEMU emulation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GCC segfaults (ICE in cc1plus) on ppc64le under QEMU due to the default
stack size limit applied by the emulator. Raising the stack limit to
unlimited gives the compiler enough space to process large translation
units like mainwindow.cpp.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Minimal ppc64le/ubuntu22.04 containers don't include libc6-dev by default,
causing cmake FindThreads to fail with 'Could NOT find pthread.h'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Parallel compilation exhausts memory in QEMU-emulated environments,
causing cc1plus to segfault on aarch64 and ppc64le. Single-threaded
builds are slower but stable under emulation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
bas524 added 2 commits May 29, 2026 11:47
…ncluded but doesnt guarantee pthread headers are available in all configurations, especially on non-x86 architectures.
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