The later bump worked - the build reached staging. Three new problems:
- renv restores concurrently and not always in dependency order: forecast
was lazy-loaded while vctrs was still compiling ('there is no package
called vctrs', six lines before 'vctrs 0.7.3 built from source in 52s').
That aborts the whole sapply() loop, so one race cost 20 modules. Retry
the pass up to three times; renv skips what is installed, so each pass
converges.
- The guard only required a non-empty Modules/local, so a build with 2 of
22 modules passed it and went on to stage and package. It now requires
the full expected count and lists what it did get.
- bundle-libs.sh crashed on the dynamic loader: ldd prints it as
'/lib64/ld-linux-x86-64.so.2 => ...', so the first column is a path and
the ld-linux* denylist entry never matched. Basename the soname before
the check.
Bundling R alone was not enough: R links libicuuc, and Arch moves ICU
regularly. The obvious fix - pinning 'icu>=78 <79' in depends - is worse
than the disease on a rolling distro, because pacman would then refuse to
upgrade ICU while JASP is installed, blocking the user's whole system
upgrade until a rebuild lands.
So bundle-libs.sh copies every non-system shared library into
/opt/jasp-desktop/lib and rewrites rpaths, by denylist rather than
allowlist. depends now carries no version constraints at all.
Qt6 stays system-provided on purpose - Qt is binary compatible across Qt 6
minors, and bundling QtWebEngine would add ~500 MB. That also means the
only rebuild triggers left are a new JASP release and a Qt major bump;
rebuilding for anything else would cost users a 1.7 GB re-download.
Also fixes check-upstream.py querying only repo=Extra, which silently
returned nothing for icu (it lives in core).