diff --git a/apps/maple-research/frontend/src-tauri/tauri.conf.json b/apps/maple-research/frontend/src-tauri/tauri.conf.json index 82558f706..d5a3ed72b 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": ["libwebkit2gtk-4.1.so.0()(64bit)"] + }, "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..d08601b14 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 '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 +} + 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..d437442ca 100644 --- a/scripts/ci/test_linux_rpm_packaging.py +++ b/scripts/ci/test_linux_rpm_packaging.py @@ -167,6 +167,55 @@ 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("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: libwebkit2gtk-4.1.so.0()(64bit)\n", spec) + + def test_rpm_dependency_verification(self): + 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}'; }} +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("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) + + 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')