From c7813c431743948c11037c801a6134a6dbc18e28 Mon Sep 17 00:00:00 2001 From: Alex Sears Date: Tue, 27 Oct 2026 14:43:47 -0400 Subject: [PATCH 1/2] fix(research): preserve required WebKitGTK RPM dependencies --- .../frontend/src-tauri/tauri.conf.json | 3 ++ docs/repository-workflows.md | 5 +++ scripts/ci/_common.sh | 12 ++++++ scripts/ci/test_linux_rpm_packaging.py | 41 +++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/apps/maple-research/frontend/src-tauri/tauri.conf.json b/apps/maple-research/frontend/src-tauri/tauri.conf.json index 82558f706..7c018fa65 100644 --- a/apps/maple-research/frontend/src-tauri/tauri.conf.json +++ b/apps/maple-research/frontend/src-tauri/tauri.conf.json @@ -72,6 +72,9 @@ "icons/icon.ico" ], "linux": { + "rpm": { + "depends": ["webkit2gtk4.1"] + }, "appimage": { "bundleMediaFramework": true, "files": { diff --git a/docs/repository-workflows.md b/docs/repository-workflows.md index 3102e24cd..802f39076 100644 --- a/docs/repository-workflows.md +++ b/docs/repository-workflows.md @@ -276,6 +276,11 @@ macOS 13.4 and iOS 16.0. Research Linux packaging builds AppImage and DEB with Tauri, then the RPM from the normalized DEB payload. `scripts/ci/sccache-stats.sh` reports compiler-cache statistics with the build's own cache configuration. +The RPM builder preserves explicit `bundle.linux.rpm.depends` from the Tauri +configuration. WebKitGTK (`webkit2gtk4.1`) is required on Fedora, including KDE; +package verification rejects RPMs missing that requirement. Install a downloaded +RPM through Discover or `sudo dnf install ./Maple--1.x86_64.rpm` so the +package manager resolves dependencies, rather than using `rpm --nodeps`. For a side-by-side hosted Dev installation, use `nix run --no-update-lock-file .#research-dev-desktop`, not an ordinary Research diff --git a/scripts/ci/_common.sh b/scripts/ci/_common.sh index c91ca1620..76d7c88ca 100755 --- a/scripts/ci/_common.sh +++ b/scripts/ci/_common.sh @@ -3828,10 +3828,22 @@ verify_linux_appimage_executable_metadata() { return "${status}" } +verify_linux_rpm_package_dependencies() { + local package="$1" + local requires + + requires="$(rpm -qp --requires "${package}")" || return 1 + if ! grep -Fxq 'webkit2gtk4.1' <<< "${requires}"; then + echo "RPM is missing the required webkit2gtk4.1 dependency: ${package}" >&2 + return 1 + fi +} + verify_linux_rpm_package_executable_metadata() { local rpm="$1" local tmp status + verify_linux_rpm_package_dependencies "${rpm}" || return 1 tmp="$(mktemp -d)" status=0 ( diff --git a/scripts/ci/test_linux_rpm_packaging.py b/scripts/ci/test_linux_rpm_packaging.py index 1ac45af51..f805569ed 100644 --- a/scripts/ci/test_linux_rpm_packaging.py +++ b/scripts/ci/test_linux_rpm_packaging.py @@ -167,6 +167,47 @@ def test_built_dev_rpm_declares_the_runtime_capability(self): self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", requires) self.assertNotIn("webkit2gtk4.1", requires) + def test_rpm_preserves_configured_runtime_dependencies(self): + config = json.loads((ROOT / "apps/maple-research/frontend/src-tauri/tauri.conf.json").read_text()) + self.assertIn("webkit2gtk4.1", config["bundle"]["linux"]["rpm"]["depends"]) + (self.tauri / "tauri.conf.json").write_text(json.dumps(config)) + self.fake_rpmbuild(0) + result = self.run_factory() + self.assertEqual(result.returncode, 0, result.stderr) + spec = (self.tauri / "maple.spec").read_text() + self.assertIn("Requires: webkit2gtk4.1\n", spec) + + def test_rpm_dependency_verification(self): + for requires, expected in (("webkit2gtk4.1", 0), ("rpmlib(PayloadFilesHavePrefix) <= 4.0-1", 1), ("webkit2gtk4.0", 1)): + with self.subTest(requires=requires): + result = self.run_shell(f''' +rpm() {{ printf '%s\\n' '{requires}'; }} +verify_linux_rpm_package_dependencies fixture.rpm +''') + self.assertEqual(result.returncode, expected, result.stderr) + + @unittest.skipUnless(shutil.which("rpmbuild") and shutil.which("rpm"), "RPM tools are unavailable") + def test_built_rpm_declares_webkit_dependency(self): + config = json.loads((ROOT / "apps/maple-research/frontend/src-tauri/tauri.conf.json").read_text()) + config["version"] = "1.2.3" + (self.tauri / "tauri.conf.json").write_text(json.dumps(config)) + result = self.run_factory() + self.assertEqual(result.returncode, 0, result.stderr) + requires = subprocess.run( + ["rpm", "-qp", "--requires", str(self.rpm)], + capture_output=True, text=True, check=True, + ).stdout.splitlines() + self.assertIn("webkit2gtk4.1", requires) + verified = self.run_shell(f'verify_linux_rpm_package_dependencies "{self.rpm}"') + self.assertEqual(verified.returncode, 0, verified.stderr) + + def test_rpm_query_failure_is_rejected(self): + result = self.run_shell(''' +rpm() { return 19; } +verify_linux_rpm_package_dependencies fixture.rpm +''') + self.assertNotEqual(result.returncode, 0) + def test_failed_final_move_is_not_hidden_by_cleanup(self): self.fake_rpmbuild(0) result = self.run_factory('mv() { return 19; }\n') From 06f7021b94c3b361ff06205042ca98f6306d97dd Mon Sep 17 00:00:00 2001 From: Alex Sears Date: Wed, 28 Oct 2026 10:28:12 -0400 Subject: [PATCH 2/2] fix(research): require cross-distro WebKitGTK RPM capability --- .../frontend/src-tauri/tauri.conf.json | 2 +- scripts/ci/_common.sh | 4 ++-- scripts/ci/test_linux_rpm_packaging.py | 16 ++++++++++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/maple-research/frontend/src-tauri/tauri.conf.json b/apps/maple-research/frontend/src-tauri/tauri.conf.json index 7c018fa65..d5a3ed72b 100644 --- a/apps/maple-research/frontend/src-tauri/tauri.conf.json +++ b/apps/maple-research/frontend/src-tauri/tauri.conf.json @@ -73,7 +73,7 @@ ], "linux": { "rpm": { - "depends": ["webkit2gtk4.1"] + "depends": ["libwebkit2gtk-4.1.so.0()(64bit)"] }, "appimage": { "bundleMediaFramework": true, diff --git a/scripts/ci/_common.sh b/scripts/ci/_common.sh index 76d7c88ca..d08601b14 100755 --- a/scripts/ci/_common.sh +++ b/scripts/ci/_common.sh @@ -3833,8 +3833,8 @@ verify_linux_rpm_package_dependencies() { local requires requires="$(rpm -qp --requires "${package}")" || return 1 - if ! grep -Fxq 'webkit2gtk4.1' <<< "${requires}"; then - echo "RPM is missing the required webkit2gtk4.1 dependency: ${package}" >&2 + if ! grep -Fxq 'libwebkit2gtk-4.1.so.0()(64bit)' <<< "${requires}"; then + echo "RPM is missing the required libwebkit2gtk-4.1.so.0()(64bit) capability: ${package}" >&2 return 1 fi } diff --git a/scripts/ci/test_linux_rpm_packaging.py b/scripts/ci/test_linux_rpm_packaging.py index f805569ed..d437442ca 100644 --- a/scripts/ci/test_linux_rpm_packaging.py +++ b/scripts/ci/test_linux_rpm_packaging.py @@ -169,16 +169,24 @@ def test_built_dev_rpm_declares_the_runtime_capability(self): def test_rpm_preserves_configured_runtime_dependencies(self): config = json.loads((ROOT / "apps/maple-research/frontend/src-tauri/tauri.conf.json").read_text()) - self.assertIn("webkit2gtk4.1", config["bundle"]["linux"]["rpm"]["depends"]) + self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", config["bundle"]["linux"]["rpm"]["depends"]) + self.assertNotIn("webkit2gtk4.1", config["bundle"]["linux"]["rpm"]["depends"]) (self.tauri / "tauri.conf.json").write_text(json.dumps(config)) self.fake_rpmbuild(0) result = self.run_factory() self.assertEqual(result.returncode, 0, result.stderr) spec = (self.tauri / "maple.spec").read_text() - self.assertIn("Requires: webkit2gtk4.1\n", spec) + self.assertIn("Requires: libwebkit2gtk-4.1.so.0()(64bit)\n", spec) def test_rpm_dependency_verification(self): - for requires, expected in (("webkit2gtk4.1", 0), ("rpmlib(PayloadFilesHavePrefix) <= 4.0-1", 1), ("webkit2gtk4.0", 1)): + for requires, expected in ( + ("libwebkit2gtk-4.1.so.0()(64bit)", 0), + ("rpmlib(PayloadFilesHavePrefix) <= 4.0-1", 1), + ("webkit2gtk4.1", 1), + ("libwebkit2gtk-4_1-0", 1), + ("libwebkit2gtk-4.0.so.0()(64bit)", 1), + ("libwebkit2gtk-4.1.so.0", 1), + ): with self.subTest(requires=requires): result = self.run_shell(f''' rpm() {{ printf '%s\\n' '{requires}'; }} @@ -197,7 +205,7 @@ def test_built_rpm_declares_webkit_dependency(self): ["rpm", "-qp", "--requires", str(self.rpm)], capture_output=True, text=True, check=True, ).stdout.splitlines() - self.assertIn("webkit2gtk4.1", requires) + self.assertIn("libwebkit2gtk-4.1.so.0()(64bit)", requires) verified = self.run_shell(f'verify_linux_rpm_package_dependencies "{self.rpm}"') self.assertEqual(verified.returncode, 0, verified.stderr)