Package: guix-patches;
Reported by: Clément Lassieur <clement <at> lassieur.org>
Date: Sun, 8 Oct 2023 16:29:01 UTC
Severity: normal
Tags: patch
Done: Clément Lassieur <clement <at> lassieur.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 66408 in the body.
You can then email your comments to 66408 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Sun, 08 Oct 2023 16:29:01 GMT) Full text and rfc822 format available.Clément Lassieur <clement <at> lassieur.org>
:jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
.
(Sun, 08 Oct 2023 16:29:01 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: guix-patches <at> gnu.org Cc: mhw <at> netris.org, Clément Lassieur <clement <at> lassieur.org>, marius <at> gnu.org Subject: [PATCH] gnu: icecat: Add support for Guix packaged extensions. Date: Sun, 8 Oct 2023 18:26:57 +0200
* gnu/build/icecat-extension.scm: New file. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin): [properties]: Store the addon id so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the addon id as first directory level. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. * gnu/packages/patches/icecat-compare-canonicalized-paths.patch: New patch that canonicalizes the addon path and use it to detect package changes. * gnu/packages/patches/icecat-use-guix-extension.patch: New patch that replaces /usr/share/mozilla/extensions with ~/.guix-profile/share/extensions. --- gnu/build/icecat-extension.scm | 62 +++++++++++++++++++ gnu/local.mk | 5 +- gnu/packages/browser-extensions.scm | 13 +++- gnu/packages/gnuzilla.scm | 19 +++--- .../icecat-compare-canonicalized-paths.patch | 33 ++++++++++ .../patches/icecat-use-guix-extensions.patch | 30 +++++++++ 6 files changed, 147 insertions(+), 15 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-canonicalized-paths.patch create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..ccc6a1ece7fb --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,62 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs '()) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((id #$(assq-ref (package-properties pkg) 'id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output + "/share/icecat/extensions/" + moz-app-id))) + ;; Icecat's XPIProvider.jsm looks within `search-dir` for a + ;; directory named after the add-on id. + + ;; This directory has to be a symlink, because Icecat's + ;; GetNativeTarget checks S_ISLNK before canonicalizing it like + ;; `readlink -f` would do. + + ;; Canonicalizing is required because Icecat compares the path + ;; against its local database to know if there is an extension + ;; update. A path that contains the store path will change every + ;; time the package is updated. + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) id) + (in-vicinity search-dir id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index a53701c673b7..17916a106dfb 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -13,7 +13,7 @@ # Copyright © 2016-2023 Efraim Flashner <efraim <at> flashner.co.il> # Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Jan (janneke) Nieuwenhuizen <janneke <at> gnu.org> # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me <at> tobias.gr> -# Copyright © 2017, 2018 Clément Lassieur <clement <at> lassieur.org> +# Copyright © 2017, 2018, 2023 Clément Lassieur <clement <at> lassieur.org> # Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe <at> gmail.com> # Copyright © 2017, 2018, 2019 Gábor Boskovits <boskovits <at> gmail.com> # Copyright © 2018 Amirouche Boubekki <amirouche <at> hypermove.net> @@ -759,6 +759,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1406,6 +1407,8 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-canonicalized-paths.patch \ + %D%/packages/patches/icecat-use-guix-extensions.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..8a76f3a3e042 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,10 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((id #$(assq-ref (package-properties this-package) 'id)) + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +146,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index ab629afd3d20..1ef30498e49c 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -5,7 +5,7 @@ ;;; Copyright © 2015 Sou Bunnbu <iyzsong <at> gmail.com> ;;; Copyright © 2016, 2017, 2018, 2019, 2021 Efraim Flashner <efraim <at> flashner.co.il> ;;; Copyright © 2016 Alex Griffin <a <at> ajgrf.com> -;;; Copyright © 2017 Clément Lassieur <clement <at> lassieur.org> +;;; Copyright © 2017, 2023 Clément Lassieur <clement <at> lassieur.org> ;;; Copyright © 2017, 2018 Nikita <nikita <at> n0.is> ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice <me <at> tobias.gr> ;;; Copyright © 2018, 2020 Ricardo Wurmus <rekado <at> elephly.net> @@ -880,16 +880,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-canonicalized-paths.patch")) + #$(local-file + (search-patch "icecat-use-guix-extensions.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may diff --git a/gnu/packages/patches/icecat-compare-canonicalized-paths.patch b/gnu/packages/patches/icecat-compare-canonicalized-paths.patch new file mode 100644 index 000000000000..f0130062624b --- /dev/null +++ b/gnu/packages/patches/icecat-compare-canonicalized-paths.patch @@ -0,0 +1,33 @@ +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, +--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm +@@ -1167,8 +1167,9 @@ class SystemAddonDefaults extends DirectoryLocation { + + // Only attempt to load unpacked directory if unofficial build. + if (!AppConstants.MOZILLA_OFFICIAL && !file.exists()) { +- file = this.dir.clone(); +- file.append(`${id}`); ++ let symlink = this.dir.clone(); ++ symlink.append(`${id}`); ++ file = symlink.isSymlink() ? new nsIFile(symlink.target) : symlink; + } + + addons.set(id, file); diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch new file mode 100644 index 000000000000..0d90ea98b685 --- /dev/null +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch @@ -0,0 +1,30 @@ +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -415,13 +415,20 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, + #if defined(XP_UNIX) && !defined(XP_MACOSX) + else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) { + # ifdef ENABLE_SYSTEM_EXTENSION_DIRS +-# if defined(__OpenBSD__) || defined(__FreeBSD__) +- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions"; +-# else +- static const char* const sysLExtDir = "/usr/share/mozilla/extensions"; +-# endif +- rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false, +- getter_AddRefs(file)); ++ rv = GetUserDataDirectoryHome(getter_AddRefs(file), false); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative(".guix-profile"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("share"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("icecat"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("extensions"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); + # endif + } + #endif // defined(XP_UNIX) && !defined(XP_MACOSX) base-commit: 47d0346553fdad9795c9390a60944ccaad7e5255 -- 2.41.0
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Sun, 08 Oct 2023 23:09:01 GMT) Full text and rfc822 format available.Message #8 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Clément Lassieur <clement <at> lassieur.org> Subject: [PATCH v2] gnu: icecat: Add support for Guix packaged extensions. Date: Mon, 9 Oct 2023 01:07:17 +0200
* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION procedure that makes sure the add-on directory is a symlink, so that Icecat can normalize it into a store path. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the add-on ID as root directory. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares add-on store paths to detect package changes. * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch replacing /usr/share/mozilla/extensions with ~/.guix-profile/share/icecat/extensions. --- gnu/build/icecat-extension.scm | 64 +++++++++++++++++++ gnu/local.mk | 5 +- gnu/packages/browser-extensions.scm | 13 +++- gnu/packages/gnuzilla.scm | 19 +++--- .../patches/icecat-compare-paths.patch | 19 ++++++ .../patches/icecat-use-guix-extensions.patch | 30 +++++++++ 6 files changed, 135 insertions(+), 15 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-paths.patch create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..c1e528bc35fa --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,64 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs '()) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((id #$(assq-ref (package-properties pkg) 'id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output + "/share/icecat/extensions/" + moz-app-id))) + ;; Icecat's iterates over `search-dir` for directories. If a + ;; directory's name is not a valid add-on ID, it is ignored. See + ;; DirectoryLocation::readAddons() in XPIProvider.jsm. + + ;; This directory has to be a symlink, because Icecat's + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a + ;; symlink. + + ;; Normalizing is required because Icecat compares the add-on path + ;; against its local database to know if there is an extension + ;; update. A store path will change every time the package is + ;; updated. See updateExistingAddon() in XPIDatabase.jsm, with + ;; our patch `icecat-compare-paths.patch`. + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) id) + (in-vicinity search-dir id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index 631b901b8a77..702bda3e4638 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -13,7 +13,7 @@ # Copyright © 2016-2023 Efraim Flashner <efraim <at> flashner.co.il> # Copyright © 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Jan (janneke) Nieuwenhuizen <janneke <at> gnu.org> # Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me <at> tobias.gr> -# Copyright © 2017, 2018 Clément Lassieur <clement <at> lassieur.org> +# Copyright © 2017, 2018, 2023 Clément Lassieur <clement <at> lassieur.org> # Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe <at> gmail.com> # Copyright © 2017, 2018, 2019 Gábor Boskovits <boskovits <at> gmail.com> # Copyright © 2018 Amirouche Boubekki <amirouche <at> hypermove.net> @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1413,6 +1414,8 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-paths.patch \ + %D%/packages/patches/icecat-use-guix-extensions.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..8a76f3a3e042 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,10 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((id #$(assq-ref (package-properties this-package) 'id)) + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +146,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index ac96d7fb1fb6..a6a92cd8a53b 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -5,7 +5,7 @@ ;;; Copyright © 2015 Sou Bunnbu <iyzsong <at> gmail.com> ;;; Copyright © 2016, 2017, 2018, 2019, 2021 Efraim Flashner <efraim <at> flashner.co.il> ;;; Copyright © 2016 Alex Griffin <a <at> ajgrf.com> -;;; Copyright © 2017 Clément Lassieur <clement <at> lassieur.org> +;;; Copyright © 2017, 2023 Clément Lassieur <clement <at> lassieur.org> ;;; Copyright © 2017, 2018 Nikita <nikita <at> n0.is> ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice <me <at> tobias.gr> ;;; Copyright © 2018, 2020 Ricardo Wurmus <rekado <at> elephly.net> @@ -880,16 +880,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-paths.patch")) + #$(local-file + (search-patch "icecat-use-guix-extensions.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch new file mode 100644 index 000000000000..9205899dc0c4 --- /dev/null +++ b/gnu/packages/patches/icecat-compare-paths.patch @@ -0,0 +1,19 @@ +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch new file mode 100644 index 000000000000..0d90ea98b685 --- /dev/null +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch @@ -0,0 +1,30 @@ +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -415,13 +415,20 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, + #if defined(XP_UNIX) && !defined(XP_MACOSX) + else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) { + # ifdef ENABLE_SYSTEM_EXTENSION_DIRS +-# if defined(__OpenBSD__) || defined(__FreeBSD__) +- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions"; +-# else +- static const char* const sysLExtDir = "/usr/share/mozilla/extensions"; +-# endif +- rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false, +- getter_AddRefs(file)); ++ rv = GetUserDataDirectoryHome(getter_AddRefs(file), false); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative(".guix-profile"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("share"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("icecat"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = file->AppendNative("extensions"_ns); ++ NS_ENSURE_SUCCESS(rv, rv); + # endif + } + #endif // defined(XP_UNIX) && !defined(XP_MACOSX) base-commit: 40a1254b05612759e919507c9201d7cd291d5975 -- 2.41.0
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Wed, 11 Oct 2023 12:28:02 GMT) Full text and rfc822 format available.Message #11 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Clément Lassieur <clement <at> lassieur.org> Subject: [PATCH v3] gnu: icecat: Add support for Guix packaged extensions. Date: Wed, 11 Oct 2023 14:26:38 +0200
* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION procedure that makes sure the add-on directory is a symlink, so that Icecat can normalize it into a package store path. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the add-on ID as root directory. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. [native-search-paths]: New field. * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares add-on paths (which are package store paths) to detect package changes. * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR". --- gnu/build/icecat-extension.scm | 71 +++++++++++++++++++ gnu/local.mk | 3 + gnu/packages/browser-extensions.scm | 13 +++- gnu/packages/gnuzilla.scm | 22 +++--- .../patches/icecat-compare-paths.patch | 19 +++++ .../patches/icecat-use-guix-extensions.patch | 52 ++++++++++++++ 6 files changed, 167 insertions(+), 13 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-paths.patch create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..8ecd8a505f72 --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,71 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs '()) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((id #$(assq-ref (package-properties pkg) 'id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output + "/share/icecat/extensions/" + moz-app-id))) + ;; Icecat's iterates over `search-dir` for directories. If a + ;; directory's name is not a valid add-on ID, it is ignored. See + ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm. + + ;; This directory has to be a symlink, because Icecat's + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a + ;; symlink. + + ;; Normalizing is required because Icecat compares the add-on path + ;; against its local database to know if there is an extension + ;; update. We want the add-on path to be the package store path, + ;; so that a path change is detected every time the package is + ;; updated. See `updateExistingAddon()` in XPIDatabase.jsm, with + ;; our patch `icecat-compare-paths.patch`. + + ;; We don't want the add-on path to be the profile store path, + ;; which would change too often. We don't want the add-on path to + ;; be hard-coded ("/usr/share/mozilla/extensions") either because + ;; it would never change. + + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) id) + (in-vicinity search-dir id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index 9fa52833cbc5..1bf925a57d9e 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1415,6 +1416,8 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-paths.patch \ + %D%/packages/patches/icecat-use-guix-extensions.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..8a76f3a3e042 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,10 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((id #$(assq-ref (package-properties this-package) 'id)) + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +146,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index a367d7a00ff6..608219c97303 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -885,16 +885,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-paths.patch")) + #$(local-file + (search-patch "icecat-use-guix-extensions.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may @@ -1138,6 +1135,11 @@ (define-public icecat-minimal '("default16.png" "default22.png" "default24.png" "default32.png" "default48.png" "content/icon64.png" "mozicon128.png" "default256.png")))))))) + (native-search-paths + (list (search-path-specification + (variable "ICECAT_EXTENSION_DIR") + (separator #f) ;single entry + (files '("share/icecat/extensions"))))) (home-page "https://www.gnu.org/software/gnuzilla/") (synopsis "Entirely free browser derived from Mozilla Firefox") (description diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch new file mode 100644 index 000000000000..9205899dc0c4 --- /dev/null +++ b/gnu/packages/patches/icecat-compare-paths.patch @@ -0,0 +1,19 @@ +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch new file mode 100644 index 000000000000..f2fe4260c2cd --- /dev/null +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch @@ -0,0 +1,52 @@ +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -415,13 +415,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, + #if defined(XP_UNIX) && !defined(XP_MACOSX) + else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) { + # ifdef ENABLE_SYSTEM_EXTENSION_DIRS +-# if defined(__OpenBSD__) || defined(__FreeBSD__) +- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions"; +-# else +- static const char* const sysLExtDir = "/usr/share/mozilla/extensions"; +-# endif +- rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false, +- getter_AddRefs(file)); ++ rv = GetGuixExtensionDir(getter_AddRefs(file)); + # endif + } + #endif // defined(XP_UNIX) && !defined(XP_MACOSX) +@@ -1198,6 +1192,24 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile, + return NS_OK; + } + ++nsresult nsXREDirProvider::GetGuixExtensionDir(nsIFile** aFile) { ++ nsresult rv; ++ nsCOMPtr<nsIFile> localDir; ++ ++#if defined(XP_UNIX) ++ const char* extensionDir = getenv("ICECAT_EXTENSION_DIR"); ++ if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE; ++ ++ rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true, ++ getter_AddRefs(localDir)); ++#else ++# error "Don't know how to get product dir on your platform" ++#endif ++ ++ NS_IF_ADDREF(*aFile = localDir); ++ return rv; ++} ++ + nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, + bool aLocal) { + // Copied from nsAppFileLocationProvider (more or less) +--- a/toolkit/xre/nsXREDirProvider.h ++++ b/toolkit/xre/nsXREDirProvider.h +@@ -112,6 +112,7 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, + private: + nsresult GetFilesInternal(const char* aProperty, + nsISimpleEnumerator** aResult); ++ static nsresult GetGuixExtensionDir(nsIFile** aFile); + static nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal); + static nsresult GetSysUserExtensionsDirectory(nsIFile** aFile); + #if defined(XP_UNIX) || defined(XP_MACOSX) base-commit: 9ad9113fc238ee8de5191a5e15b5153fd149e9fa -- 2.41.0
guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Wed, 11 Oct 2023 14:54:02 GMT) Full text and rfc822 format available.Message #14 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Mark H Weaver <mhw <at> netris.org>, Marius Bakke <marius <at> gnu.org> Subject: Re: [PATCH v3] gnu: icecat: Add support for Guix packaged extensions. Date: Wed, 11 Oct 2023 16:52:29 +0200
Hello, Now that this patch looks stable to me, please let me introduce it shortly. I believe that a lot of people use Icecat extensions downloaded from Mozilla store[2]. Mozzarella[1] is really just a "plugin finder", so the extension is really downloaded from https://addons.mozilla.org/, which means we have no control over the software we are running, except for the bundled extensions. An upgrade could very well import non-free software when the initial version was free. I think it would be great to do like we do with Emacs and a lot of other softwares: package our own plugins. That would give users the assurance that the software is free and can be trusted as they trust any Guix packaged software. That would also allow to do Guix-specific changes, like removing the non-free bits, or adapting the package for technical reasons. And that would allow for a declarative deployment of the browser, because the extensions could be added, say, to the Guix home config.scm. So this is what this patch is about. And it works with the only add-on that is currently packaged: uBlock Origin. To test it one needs to install both "icecat" and "ublock-origin-icecat". This is related to the work Marius did on ungoogled-chromium, and of course to the work Mark did on Icecat, so both of you are CCed. As for the technical details, there is a long comment in "icecat-extensions.scm" explaining what I did. Thank you, Clément Lassieur [1]: https://gnuzilla.gnu.org/mozzarella/ [2]: https://addons.mozilla.org/ > * gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION > procedure that makes sure the add-on directory is a symlink, so that Icecat > can normalize it into a package store path. > * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. > * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the > add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. > [arguments]: Use the add-on ID as root directory. > (ublock-origin/icecat): New procedure. > * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused > 'apply-guix-specific-patches' phase so that it applies the following two > patches. > [native-search-paths]: New field. > * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares > add-on paths (which are package store paths) to detect package changes. > * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that > replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR".
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Tue, 17 Oct 2023 12:50:02 GMT) Full text and rfc822 format available.Message #17 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Clément Lassieur <clement <at> lassieur.org> Subject: [PATCH v4] gnu: icecat: Add support for Guix packaged extensions. Date: Tue, 17 Oct 2023 14:48:55 +0200
* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION procedure that makes sure the add-on directory is a symlink, so that Icecat can normalize it into a package store path. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the add-on ID as root directory. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. [native-search-paths]: New field. * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares add-on paths (which are package store paths) to detect package changes. * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR". --- gnu/build/icecat-extension.scm | 71 +++++++++++++++++++ gnu/local.mk | 3 + gnu/packages/browser-extensions.scm | 13 +++- gnu/packages/gnuzilla.scm | 22 +++--- .../patches/icecat-compare-paths.patch | 19 +++++ .../patches/icecat-use-guix-extensions.patch | 40 +++++++++++ 6 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-paths.patch create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..8ecd8a505f72 --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,71 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs '()) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((id #$(assq-ref (package-properties pkg) 'id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output + "/share/icecat/extensions/" + moz-app-id))) + ;; Icecat's iterates over `search-dir` for directories. If a + ;; directory's name is not a valid add-on ID, it is ignored. See + ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm. + + ;; This directory has to be a symlink, because Icecat's + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a + ;; symlink. + + ;; Normalizing is required because Icecat compares the add-on path + ;; against its local database to know if there is an extension + ;; update. We want the add-on path to be the package store path, + ;; so that a path change is detected every time the package is + ;; updated. See `updateExistingAddon()` in XPIDatabase.jsm, with + ;; our patch `icecat-compare-paths.patch`. + + ;; We don't want the add-on path to be the profile store path, + ;; which would change too often. We don't want the add-on path to + ;; be hard-coded ("/usr/share/mozilla/extensions") either because + ;; it would never change. + + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) id) + (in-vicinity search-dir id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index 13c2b949449d..5e8aaea9ff99 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1416,6 +1417,8 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-paths.patch \ + %D%/packages/patches/icecat-use-guix-extensions.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..68c38a76d8ac 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,10 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((id #$(assq-ref properties 'id)) + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +146,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index a367d7a00ff6..608219c97303 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -885,16 +885,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-paths.patch")) + #$(local-file + (search-patch "icecat-use-guix-extensions.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may @@ -1138,6 +1135,11 @@ (define-public icecat-minimal '("default16.png" "default22.png" "default24.png" "default32.png" "default48.png" "content/icon64.png" "mozicon128.png" "default256.png")))))))) + (native-search-paths + (list (search-path-specification + (variable "ICECAT_EXTENSION_DIR") + (separator #f) ;single entry + (files '("share/icecat/extensions"))))) (home-page "https://www.gnu.org/software/gnuzilla/") (synopsis "Entirely free browser derived from Mozilla Firefox") (description diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch new file mode 100644 index 000000000000..9205899dc0c4 --- /dev/null +++ b/gnu/packages/patches/icecat-compare-paths.patch @@ -0,0 +1,19 @@ +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch new file mode 100644 index 000000000000..ed1ce922d55b --- /dev/null +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch @@ -0,0 +1,40 @@ +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -281,6 +281,22 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir( + } + #endif + ++static nsresult GetGuixExtensionDir(nsIFile** aFile) { ++ nsresult rv; ++ nsCOMPtr<nsIFile> localDir; ++ ++ const char* extensionDir = getenv("ICECAT_EXTENSION_DIR"); ++ if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE; ++ ++ rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true, ++ getter_AddRefs(localDir)); ++ ++ if (NS_SUCCEEDED(rv)) { ++ localDir.forget(aFile); ++ } ++ return rv; ++} ++ + #if defined(XP_UNIX) || defined(XP_MACOSX) + /** + * Get the directory that is the parent of the system-wide directories +@@ -415,13 +431,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, + #if defined(XP_UNIX) && !defined(XP_MACOSX) + else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) { + # ifdef ENABLE_SYSTEM_EXTENSION_DIRS +-# if defined(__OpenBSD__) || defined(__FreeBSD__) +- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions"; +-# else +- static const char* const sysLExtDir = "/usr/share/mozilla/extensions"; +-# endif +- rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false, +- getter_AddRefs(file)); ++ rv = ::GetGuixExtensionDir(getter_AddRefs(file)); + # endif + } + #endif // defined(XP_UNIX) && !defined(XP_MACOSX) base-commit: 5498835bb38c0de57f284f0fa6b1178ecdcaf678 -- 2.41.0
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Tue, 17 Oct 2023 16:47:02 GMT) Full text and rfc822 format available.Message #20 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Clément Lassieur <clement <at> lassieur.org> Subject: [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Tue, 17 Oct 2023 18:45:46 +0200
* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION procedure that makes sure the add-on directory is a symlink, so that Icecat can normalize it into a package store path. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the add-on ID as root directory. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. [native-search-paths]: New field. * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares add-on paths (which are package store paths) to detect package changes. * gnu/packages/patches/icecat-use-system-wide-dir.patch: New patch that replaces "/usr/lib/mozilla" (the system-wide directory for extensions and native manifests) with "$ICECAT_SYSTEM_DIR". --- gnu/build/icecat-extension.scm | 70 +++++++++++++++++++ gnu/local.mk | 3 + gnu/packages/browser-extensions.scm | 13 +++- gnu/packages/gnuzilla.scm | 22 +++--- .../patches/icecat-compare-paths.patch | 19 +++++ .../patches/icecat-use-system-wide-dir.patch | 33 +++++++++ 6 files changed, 147 insertions(+), 13 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-paths.patch create mode 100644 gnu/packages/patches/icecat-use-system-wide-dir.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..ebdf30f2af06 --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,70 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs (package-propagated-inputs pkg)) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((id #$(assq-ref (package-properties pkg) 'id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output "/lib/icecat/extensions/" + moz-app-id))) + ;; Icecat's iterates over `search-dir` for directories. If a + ;; directory's name is not a valid add-on ID, it is ignored. See + ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm. + + ;; This directory has to be a symlink, because Icecat's + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a + ;; symlink. + + ;; Normalizing is required because Icecat compares the add-on path + ;; against its local database to know if there is an extension + ;; update. We want the add-on path to be the package store path, + ;; so that a path change is detected every time the package is + ;; updated. See `updateExistingAddon()` in XPIDatabase.jsm, with + ;; our patch `icecat-compare-paths.patch`. + + ;; We don't want the add-on path to be the profile store path, + ;; which would change too often. We don't want the add-on path to + ;; be hard-coded either because it would never change (but it + ;; wouldn't make sense anyway). + + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) id) + (in-vicinity search-dir id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index 13c2b949449d..3bf0ad0cf08b 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1416,8 +1417,10 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-paths.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ + %D%/packages/patches/icecat-use-system-wide-dir.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ %D%/packages/patches/icedtea-7-hotspot-pointer-comparison.patch \ %D%/packages/patches/icu4c-fix-TestHebrewCalendarInTemporalLeapYear.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..68c38a76d8ac 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,10 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((id #$(assq-ref properties 'id)) + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +146,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index a367d7a00ff6..1817dd44d1e3 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -885,16 +885,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-paths.patch")) + #$(local-file + (search-patch "icecat-use-system-wide-dir.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may @@ -1138,6 +1135,11 @@ (define-public icecat-minimal '("default16.png" "default22.png" "default24.png" "default32.png" "default48.png" "content/icon64.png" "mozicon128.png" "default256.png")))))))) + (native-search-paths + (list (search-path-specification + (variable "ICECAT_SYSTEM_DIR") + (separator #f) ;single entry + (files '("lib/icecat"))))) (home-page "https://www.gnu.org/software/gnuzilla/") (synopsis "Entirely free browser derived from Mozilla Firefox") (description diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch new file mode 100644 index 000000000000..9205899dc0c4 --- /dev/null +++ b/gnu/packages/patches/icecat-compare-paths.patch @@ -0,0 +1,19 @@ +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, diff --git a/gnu/packages/patches/icecat-use-system-wide-dir.patch b/gnu/packages/patches/icecat-use-system-wide-dir.patch new file mode 100644 index 000000000000..db9cf12e5435 --- /dev/null +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch @@ -0,0 +1,33 @@ +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -293,24 +293,12 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir( + static nsresult GetSystemParentDirectory(nsIFile** aFile) { + nsresult rv; + nsCOMPtr<nsIFile> localDir; +-# if defined(XP_MACOSX) +- rv = GetOSXFolderType(kOnSystemDisk, kApplicationSupportFolderType, +- getter_AddRefs(localDir)); +- if (NS_SUCCEEDED(rv)) { +- rv = localDir->AppendNative("Mozilla"_ns); +- } +-# else +- constexpr auto dirname = +-# ifdef HAVE_USR_LIB64_DIR +- "/usr/lib64/mozilla"_ns +-# elif defined(__OpenBSD__) || defined(__FreeBSD__) +- "/usr/local/lib/mozilla"_ns +-# else +- "/usr/lib/mozilla"_ns +-# endif +- ; +- rv = NS_NewNativeLocalFile(dirname, false, getter_AddRefs(localDir)); +-# endif ++ ++ const char* systemParentDir = getenv("ICECAT_SYSTEM_DIR"); ++ if (!systemParentDir || !*systemParentDir) return NS_ERROR_FAILURE; ++ ++ rv = NS_NewNativeLocalFile(nsDependentCString(systemParentDir), false, ++ getter_AddRefs(localDir)); + + if (NS_SUCCEEDED(rv)) { + localDir.forget(aFile); base-commit: 5498835bb38c0de57f284f0fa6b1178ecdcaf678 -- 2.41.0
guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Fri, 20 Oct 2023 10:03:02 GMT) Full text and rfc822 format available.Message #23 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Mathieu Othacehe <othacehe <at> gnu.org> To: Clément Lassieur <clement <at> lassieur.org> Cc: Jonathan Brielmaier <jonathan.brielmaier <at> web.de>, 66408 <at> debbugs.gnu.org Subject: Re: [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Fri, 20 Oct 2023 12:01:11 +0200
Hey Clément, > + (let* ((id #$(assq-ref properties 'id)) id is maybe a bit generic? > + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) > + (xpi (assoc-ref outputs "xpi")) > + (chromium (assoc-ref outputs "chromium"))) > (install-file "dist/build/uBlock0.firefox.xpi" > (string-append xpi "/lib/mozilla/extensions")) > (copy-recursively "dist/build/uBlock0.firefox" firefox) > @@ -142,3 +146,6 @@ (define ublock-origin > > (define-public ublock-origin/chromium > (make-chromium-extension ublock-origin "chromium")) > + > +(define-public ublock-origin/icecat > + (make-icecat-extension ublock-origin "firefox")) It does not appear clearly that one has to install ublock-origin-icecat here. We have the same issue for ublock-origin-chromium though. > diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch > new file mode 100644 > index 000000000000..9205899dc0c4 > --- /dev/null > +++ b/gnu/packages/patches/icecat-compare-paths.patch You could add a small header explaining the content of that patch, ... > --- /dev/null > +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch ..., as well as that one. I tried a guix shell icecat ublock-origin-icecat and it worked perfectly :) It is also very appreciated to have a pre-built icecat by the QA :). Thanks, Mathieu
jonathan.brielmaier <at> web.de, guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Fri, 20 Oct 2023 12:28:01 GMT) Full text and rfc822 format available.Message #26 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: 66408 <at> debbugs.gnu.org Cc: Clément Lassieur <clement <at> lassieur.org> Subject: [PATCH v6] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Fri, 20 Oct 2023 14:26:01 +0200
* gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION procedure that makes sure the add-on directory is a symlink, so that Icecat can normalize it into a package store path. * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. [arguments]: Use the add-on ID as root directory. (ublock-origin/icecat): New procedure. * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused 'apply-guix-specific-patches' phase so that it applies the following two patches. [native-search-paths]: New field. * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares add-on paths (which are package store paths) to detect package changes. * gnu/packages/patches/icecat-use-system-wide-dir.patch: New patch that replaces "/usr/lib/mozilla" (the system-wide directory for extensions and native manifests) with "$ICECAT_SYSTEM_DIR". --- gnu/build/icecat-extension.scm | 70 +++++++++++++++++++ gnu/local.mk | 3 + gnu/packages/browser-extensions.scm | 14 +++- gnu/packages/gnuzilla.scm | 22 +++--- .../patches/icecat-compare-paths.patch | 21 ++++++ .../patches/icecat-use-system-wide-dir.patch | 36 ++++++++++ 6 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 gnu/build/icecat-extension.scm create mode 100644 gnu/packages/patches/icecat-compare-paths.patch create mode 100644 gnu/packages/patches/icecat-use-system-wide-dir.patch diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm new file mode 100644 index 000000000000..1e6a9a54e4bb --- /dev/null +++ b/gnu/build/icecat-extension.scm @@ -0,0 +1,70 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu build icecat-extension) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix build-system trivial) + #:export (make-icecat-extension)) + +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) + "Create an Icecat extension from package PKG and return a package that, +when installed, will make the extension contained in PKG available as an +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." + (package + (inherit pkg) + (name (string-append (package-name pkg) "-icecat")) + (native-inputs '()) + (inputs '()) + (propagated-inputs (package-propagated-inputs pkg)) + (outputs '("out")) + (build-system trivial-build-system) + (arguments + (list + #:modules '((guix build utils)) + #:builder + #~(begin + (use-modules (guix build utils)) + (let* ((addon-id #$(assq-ref (package-properties pkg) 'addon-id)) + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") + (search-dir (string-append #$output "/lib/icecat/extensions/" + moz-app-id))) + ;; Icecat's iterates over `search-dir` for directories. If a + ;; directory's name is not a valid add-on ID, it is ignored. See + ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm. + + ;; This directory has to be a symlink, because Icecat's + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a + ;; symlink. + + ;; Normalizing is required because Icecat compares the add-on path + ;; against its local database to know if there is an extension + ;; update. We want the add-on path to be the package store path, + ;; so that a path change is detected every time the package is + ;; updated. See `updateExistingAddon()` in XPIDatabase.jsm, with + ;; our patch `icecat-compare-paths.patch`. + + ;; We don't want the add-on path to be the profile store path, + ;; which would change too often. We don't want the add-on path to + ;; be hard-coded either because it would never change (but it + ;; wouldn't make sense anyway). + + (mkdir-p search-dir) + (symlink (in-vicinity (ungexp pkg pkg-output) addon-id) + (in-vicinity search-dir addon-id)))))))) diff --git a/gnu/local.mk b/gnu/local.mk index daacd786a7d3..be3ec73cb1e9 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ %D%/build/chromium-extension.scm \ %D%/build/cross-toolchain.scm \ %D%/build/dbus-service.scm \ + %D%/build/icecat-extension.scm \ %D%/build/image.scm \ %D%/build/jami-service.scm \ %D%/build/file-systems.scm \ @@ -1416,8 +1417,10 @@ dist_patch_DATA = \ %D%/packages/patches/icecat-makeicecat.patch \ %D%/packages/patches/icecat-102-makeicecat.patch \ %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ + %D%/packages/patches/icecat-compare-paths.patch \ %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ %D%/packages/patches/icecat-use-system-media-libs.patch \ + %D%/packages/patches/icecat-use-system-wide-dir.patch \ %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ %D%/packages/patches/icedtea-7-hotspot-pointer-comparison.patch \ %D%/packages/patches/icu4c-fix-TestHebrewCalendarInTemporalLeapYear.patch \ diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm index 3f6da8d77a3f..252c95729dad 100644 --- a/gnu/packages/browser-extensions.scm +++ b/gnu/packages/browser-extensions.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu build chromium-extension) + #:use-module (gnu build icecat-extension) #:use-module (gnu packages compression) #:use-module (gnu packages python)) @@ -98,6 +100,7 @@ (define ublock-origin "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) (build-system gnu-build-system) (outputs '("xpi" "firefox" "chromium")) + (properties '((addon-id . "uBlock0 <at> raymondhill.net"))) (arguments (list #:tests? #f ;no tests @@ -125,9 +128,11 @@ (define ublock-origin (invoke "./tools/make-chromium.sh"))) (add-after 'build-chromium 'install (lambda* (#:key outputs #:allow-other-keys) - (let ((firefox (assoc-ref outputs "firefox")) - (xpi (assoc-ref outputs "xpi")) - (chromium (assoc-ref outputs "chromium"))) + (let* ((addon-id #$(assq-ref properties 'addon-id)) + (firefox (in-vicinity + (assoc-ref outputs "firefox") addon-id)) + (xpi (assoc-ref outputs "xpi")) + (chromium (assoc-ref outputs "chromium"))) (install-file "dist/build/uBlock0.firefox.xpi" (string-append xpi "/lib/mozilla/extensions")) (copy-recursively "dist/build/uBlock0.firefox" firefox) @@ -142,3 +147,6 @@ (define ublock-origin (define-public ublock-origin/chromium (make-chromium-extension ublock-origin "chromium")) + +(define-public ublock-origin/icecat + (make-icecat-extension ublock-origin "firefox")) diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm index a367d7a00ff6..1817dd44d1e3 100644 --- a/gnu/packages/gnuzilla.scm +++ b/gnu/packages/gnuzilla.scm @@ -885,16 +885,13 @@ (define-public icecat-minimal #:phases #~(modify-phases %standard-phases (add-after 'unpack 'apply-guix-specific-patches - (lambda* (#:key inputs native-inputs #:allow-other-keys) - (let ((patch (search-input-file inputs "bin/patch"))) - (for-each (match-lambda - ((label . file) - (when (and (string-prefix? "icecat-" label) - (string-suffix? ".patch" label)) - (format #t "applying '~a'...~%" file) - (invoke patch "--force" "--no-backup-if-mismatch" - "-p1" "--input" file)))) - (or native-inputs inputs))))) + (lambda _ + (for-each + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) + '(#$(local-file + (search-patch "icecat-compare-paths.patch")) + #$(local-file + (search-patch "icecat-use-system-wide-dir.patch")))))) (add-after 'apply-guix-specific-patches 'remove-bundled-libraries (lambda _ ;; Remove bundled libraries that we don't use, since they may @@ -1138,6 +1135,11 @@ (define-public icecat-minimal '("default16.png" "default22.png" "default24.png" "default32.png" "default48.png" "content/icon64.png" "mozicon128.png" "default256.png")))))))) + (native-search-paths + (list (search-path-specification + (variable "ICECAT_SYSTEM_DIR") + (separator #f) ;single entry + (files '("lib/icecat"))))) (home-page "https://www.gnu.org/software/gnuzilla/") (synopsis "Entirely free browser derived from Mozilla Firefox") (description diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch new file mode 100644 index 000000000000..69c03e05eebc --- /dev/null +++ b/gnu/packages/patches/icecat-compare-paths.patch @@ -0,0 +1,21 @@ +See comment in gnu/build/icecat-extension.scm. + +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { + if ( + newAddon || + oldAddon.updateDate != xpiState.mtime || ++ oldAddon.path != xpiState.path || + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) + ) { + newAddon = this.updateMetadata( +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { + xpiState, + newAddon + ); +- } else if (oldAddon.path != xpiState.path) { +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); + } else if (aUpdateCompatibility || aSchemaChange) { + newAddon = this.updateCompatibility( + installLocation, diff --git a/gnu/packages/patches/icecat-use-system-wide-dir.patch b/gnu/packages/patches/icecat-use-system-wide-dir.patch new file mode 100644 index 000000000000..a635a4d18ee6 --- /dev/null +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch @@ -0,0 +1,36 @@ +Replace "/usr/lib/mozilla" (the system-wide directory for extensions and +native manifests) with "$ICECAT_SYSTEM_DIR". + +--- a/toolkit/xre/nsXREDirProvider.cpp ++++ b/toolkit/xre/nsXREDirProvider.cpp +@@ -293,24 +293,12 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir( + static nsresult GetSystemParentDirectory(nsIFile** aFile) { + nsresult rv; + nsCOMPtr<nsIFile> localDir; +-# if defined(XP_MACOSX) +- rv = GetOSXFolderType(kOnSystemDisk, kApplicationSupportFolderType, +- getter_AddRefs(localDir)); +- if (NS_SUCCEEDED(rv)) { +- rv = localDir->AppendNative("Mozilla"_ns); +- } +-# else +- constexpr auto dirname = +-# ifdef HAVE_USR_LIB64_DIR +- "/usr/lib64/mozilla"_ns +-# elif defined(__OpenBSD__) || defined(__FreeBSD__) +- "/usr/local/lib/mozilla"_ns +-# else +- "/usr/lib/mozilla"_ns +-# endif +- ; +- rv = NS_NewNativeLocalFile(dirname, false, getter_AddRefs(localDir)); +-# endif ++ ++ const char* systemParentDir = getenv("ICECAT_SYSTEM_DIR"); ++ if (!systemParentDir || !*systemParentDir) return NS_ERROR_FAILURE; ++ ++ rv = NS_NewNativeLocalFile(nsDependentCString(systemParentDir), false, ++ getter_AddRefs(localDir)); + + if (NS_SUCCEEDED(rv)) { + localDir.forget(aFile); base-commit: c065da01ff956d3c2bdfc45a33d910e509a211d9 -- 2.41.0
guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Fri, 20 Oct 2023 12:41:01 GMT) Full text and rfc822 format available.Message #29 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: Mathieu Othacehe <othacehe <at> gnu.org> Cc: Jonathan Brielmaier <jonathan.brielmaier <at> web.de>, 66408 <at> debbugs.gnu.org Subject: Re: [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Fri, 20 Oct 2023 14:40:10 +0200
Hey Mathieu, >> + (let* ((id #$(assq-ref properties 'id)) > > id is maybe a bit generic? Done. >> + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) >> + (xpi (assoc-ref outputs "xpi")) >> + (chromium (assoc-ref outputs "chromium"))) >> (install-file "dist/build/uBlock0.firefox.xpi" >> (string-append xpi "/lib/mozilla/extensions")) >> (copy-recursively "dist/build/uBlock0.firefox" firefox) >> @@ -142,3 +146,6 @@ (define ublock-origin >> >> (define-public ublock-origin/chromium >> (make-chromium-extension ublock-origin "chromium")) >> + >> +(define-public ublock-origin/icecat >> + (make-icecat-extension ublock-origin "firefox")) > > It does not appear clearly that one has to install ublock-origin-icecat > here. We have the same issue for ublock-origin-chromium though. Indeed! That's a small change that should be in another patch I believe. >> diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch >> new file mode 100644 >> index 000000000000..9205899dc0c4 >> --- /dev/null >> +++ b/gnu/packages/patches/icecat-compare-paths.patch > > You could add a small header explaining the content of that patch, ... Done. >> --- /dev/null >> +++ b/gnu/packages/patches/icecat-use-system-wide-dir.patch > > ..., as well as that one. Done. > I tried a guix shell icecat ublock-origin-icecat and it worked perfectly > :) It is also very appreciated to have a pre-built icecat by the QA :). Thanks for the review! Clément
guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Mon, 23 Oct 2023 07:16:01 GMT) Full text and rfc822 format available.Message #32 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Mathieu Othacehe <othacehe <at> gnu.org> To: Clément Lassieur <clement <at> lassieur.org> Cc: Jonathan Brielmaier <jonathan.brielmaier <at> web.de>, 66408 <at> debbugs.gnu.org Subject: Re: [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Mon, 23 Oct 2023 09:14:13 +0200
Hello, > Indeed! That's a small change that should be in another patch I > believe. Agreed. I think you can go ahead! Thanks, Mathieu
guix-patches <at> gnu.org
:bug#66408
; Package guix-patches
.
(Mon, 23 Oct 2023 07:40:01 GMT) Full text and rfc822 format available.Message #35 received at 66408 <at> debbugs.gnu.org (full text, mbox):
From: Andrew Tropin <andrew <at> trop.in> To: Clément Lassieur <clement <at> lassieur.org>, 66408 <at> debbugs.gnu.org Cc: Jonathan Brielmaier <jonathan.brielmaier <at> web.de>, Clément Lassieur <clement <at> lassieur.org> Subject: Re: [bug#66408] [PATCH v3] gnu: icecat: Add support for Guix packaged extensions. Date: Mon, 23 Oct 2023 11:37:44 +0400
[Message part 1 (text/plain, inline)]
On 2023-10-11 14:26, Clément Lassieur wrote: > * gnu/build/icecat-extension.scm: New file with a MAKE-ICECAT-EXTENSION > procedure that makes sure the add-on directory is a symlink, so that Icecat > can normalize it into a package store path. > * gnu/local.mk (dist_patch_DATA): Register it, as well as new patches. > * gnu/packages/browser-extensions.scm (ublock-origin)[properties]: Store the > add-on ID so that it is accessible in MAKE-ICECAT-EXTENSION. > [arguments]: Use the add-on ID as root directory. > (ublock-origin/icecat): New procedure. > * gnu/packages/gnuzilla.scm (icecat-minimal)[arguments]: Rewrite the unused > 'apply-guix-specific-patches' phase so that it applies the following two > patches. > [native-search-paths]: New field. > * gnu/packages/patches/icecat-compare-paths.patch: New patch that compares > add-on paths (which are package store paths) to detect package changes. > * gnu/packages/patches/icecat-use-guix-extensions.patch: New patch that > replaces "/usr/share/mozilla/extensions" with "$ICECAT_EXTENSION_DIR". > --- > gnu/build/icecat-extension.scm | 71 +++++++++++++++++++ > gnu/local.mk | 3 + > gnu/packages/browser-extensions.scm | 13 +++- > gnu/packages/gnuzilla.scm | 22 +++--- > .../patches/icecat-compare-paths.patch | 19 +++++ > .../patches/icecat-use-guix-extensions.patch | 52 ++++++++++++++ > 6 files changed, 167 insertions(+), 13 deletions(-) > create mode 100644 gnu/build/icecat-extension.scm > create mode 100644 gnu/packages/patches/icecat-compare-paths.patch > create mode 100644 gnu/packages/patches/icecat-use-guix-extensions.patch > > diff --git a/gnu/build/icecat-extension.scm b/gnu/build/icecat-extension.scm > new file mode 100644 > index 000000000000..8ecd8a505f72 > --- /dev/null > +++ b/gnu/build/icecat-extension.scm > @@ -0,0 +1,71 @@ > +;;; GNU Guix --- Functional package management for GNU > +;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> > +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> > +;;; > +;;; This file is part of GNU Guix. > +;;; > +;;; GNU Guix is free software; you can redistribute it and/or modify it > +;;; under the terms of the GNU General Public License as published by > +;;; the Free Software Foundation; either version 3 of the License, or (at > +;;; your option) any later version. > +;;; > +;;; GNU Guix is distributed in the hope that it will be useful, but > +;;; WITHOUT ANY WARRANTY; without even the implied warranty of > +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +;;; GNU General Public License for more details. > +;;; > +;;; You should have received a copy of the GNU General Public License > +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. > + > +(define-module (gnu build icecat-extension) > + #:use-module (guix gexp) > + #:use-module (guix packages) > + #:use-module (guix build-system trivial) > + #:export (make-icecat-extension)) > + > +(define* (make-icecat-extension pkg #:optional (pkg-output "out")) > + "Create an Icecat extension from package PKG and return a package that, > +when installed, will make the extension contained in PKG available as an > +Icecat browser extension. PKG-OUTPUT specifies which output of PKG to use." > + (package > + (inherit pkg) > + (name (string-append (package-name pkg) "-icecat")) > + (native-inputs '()) > + (inputs '()) > + (propagated-inputs '()) > + (outputs '("out")) > + (build-system trivial-build-system) > + (arguments > + (list > + #:modules '((guix build utils)) > + #:builder > + #~(begin > + (use-modules (guix build utils)) > + (let* ((id #$(assq-ref (package-properties pkg) 'id)) > + (moz-app-id "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}") > + (search-dir (string-append #$output > + "/share/icecat/extensions/" > + moz-app-id))) > + ;; Icecat's iterates over `search-dir` for directories. If a > + ;; directory's name is not a valid add-on ID, it is ignored. See > + ;; `DirectoryLocation::readAddons()` in XPIProvider.jsm. > + > + ;; This directory has to be a symlink, because Icecat's > + ;; `_readLinkFile(aFile)` calls `normalize()` only if `aFile` is a > + ;; symlink. > + > + ;; Normalizing is required because Icecat compares the add-on path > + ;; against its local database to know if there is an extension > + ;; update. We want the add-on path to be the package store path, > + ;; so that a path change is detected every time the package is > + ;; updated. See `updateExistingAddon()` in XPIDatabase.jsm, with > + ;; our patch `icecat-compare-paths.patch`. > + > + ;; We don't want the add-on path to be the profile store path, > + ;; which would change too often. We don't want the add-on path to > + ;; be hard-coded ("/usr/share/mozilla/extensions") either because > + ;; it would never change. > + > + (mkdir-p search-dir) > + (symlink (in-vicinity (ungexp pkg pkg-output) id) > + (in-vicinity search-dir id)))))))) > diff --git a/gnu/local.mk b/gnu/local.mk > index 9fa52833cbc5..1bf925a57d9e 100644 > --- a/gnu/local.mk > +++ b/gnu/local.mk > @@ -761,6 +761,7 @@ GNU_SYSTEM_MODULES = \ > %D%/build/chromium-extension.scm \ > %D%/build/cross-toolchain.scm \ > %D%/build/dbus-service.scm \ > + %D%/build/icecat-extension.scm \ > %D%/build/image.scm \ > %D%/build/jami-service.scm \ > %D%/build/file-systems.scm \ > @@ -1415,6 +1416,8 @@ dist_patch_DATA = \ > %D%/packages/patches/icecat-makeicecat.patch \ > %D%/packages/patches/icecat-102-makeicecat.patch \ > %D%/packages/patches/icecat-avoid-bundled-libraries.patch \ > + %D%/packages/patches/icecat-compare-paths.patch \ > + %D%/packages/patches/icecat-use-guix-extensions.patch \ > %D%/packages/patches/icecat-use-system-graphite2+harfbuzz.patch \ > %D%/packages/patches/icecat-use-system-media-libs.patch \ > %D%/packages/patches/icedtea-7-hotspot-aarch64-use-c++98.patch \ > diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm > index 3f6da8d77a3f..8a76f3a3e042 100644 > --- a/gnu/packages/browser-extensions.scm > +++ b/gnu/packages/browser-extensions.scm > @@ -1,6 +1,7 @@ > ;;; GNU Guix --- Functional package management for GNU > ;;; Copyright © 2020, 2021 Marius Bakke <marius <at> gnu.org> > ;;; Copyright © 2023 Nicolas Graves <ngraves <at> ngraves.fr> > +;;; Copyright © 2023 Clément Lassieur <clement <at> lassieur.org> > ;;; > ;;; This file is part of GNU Guix. > ;;; > @@ -25,6 +26,7 @@ (define-module (gnu packages browser-extensions) > #:use-module (guix build-system gnu) > #:use-module ((guix licenses) #:prefix license:) > #:use-module (gnu build chromium-extension) > + #:use-module (gnu build icecat-extension) > #:use-module (gnu packages compression) > #:use-module (gnu packages python)) > > @@ -98,6 +100,7 @@ (define ublock-origin > "1i8rnij3sbwg6vj6znprrsca0n5xjzhmhppaa8v6jyxg6wrrfch1")))) > (build-system gnu-build-system) > (outputs '("xpi" "firefox" "chromium")) > + (properties '((id . "uBlock0 <at> raymondhill.net"))) > (arguments > (list > #:tests? #f ;no tests > @@ -125,9 +128,10 @@ (define ublock-origin > (invoke "./tools/make-chromium.sh"))) > (add-after 'build-chromium 'install > (lambda* (#:key outputs #:allow-other-keys) > - (let ((firefox (assoc-ref outputs "firefox")) > - (xpi (assoc-ref outputs "xpi")) > - (chromium (assoc-ref outputs "chromium"))) > + (let* ((id #$(assq-ref (package-properties this-package) 'id)) > + (firefox (in-vicinity (assoc-ref outputs "firefox") id)) > + (xpi (assoc-ref outputs "xpi")) > + (chromium (assoc-ref outputs "chromium"))) > (install-file "dist/build/uBlock0.firefox.xpi" > (string-append xpi "/lib/mozilla/extensions")) > (copy-recursively "dist/build/uBlock0.firefox" firefox) > @@ -142,3 +146,6 @@ (define ublock-origin > > (define-public ublock-origin/chromium > (make-chromium-extension ublock-origin "chromium")) > + > +(define-public ublock-origin/icecat > + (make-icecat-extension ublock-origin "firefox")) > diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm > index a367d7a00ff6..608219c97303 100644 > --- a/gnu/packages/gnuzilla.scm > +++ b/gnu/packages/gnuzilla.scm > @@ -885,16 +885,13 @@ (define-public icecat-minimal > #:phases > #~(modify-phases %standard-phases > (add-after 'unpack 'apply-guix-specific-patches > - (lambda* (#:key inputs native-inputs #:allow-other-keys) > - (let ((patch (search-input-file inputs "bin/patch"))) > - (for-each (match-lambda > - ((label . file) > - (when (and (string-prefix? "icecat-" label) > - (string-suffix? ".patch" label)) > - (format #t "applying '~a'...~%" file) > - (invoke patch "--force" "--no-backup-if-mismatch" > - "-p1" "--input" file)))) > - (or native-inputs inputs))))) > + (lambda _ > + (for-each > + (lambda (file) (invoke "patch" "--force" "-p1" "-i" file)) > + '(#$(local-file > + (search-patch "icecat-compare-paths.patch")) > + #$(local-file > + (search-patch "icecat-use-guix-extensions.patch")))))) > (add-after 'apply-guix-specific-patches 'remove-bundled-libraries > (lambda _ > ;; Remove bundled libraries that we don't use, since they may > @@ -1138,6 +1135,11 @@ (define-public icecat-minimal > '("default16.png" "default22.png" "default24.png" > "default32.png" "default48.png" "content/icon64.png" > "mozicon128.png" "default256.png")))))))) > + (native-search-paths > + (list (search-path-specification > + (variable "ICECAT_EXTENSION_DIR") > + (separator #f) ;single entry > + (files '("share/icecat/extensions"))))) > (home-page "https://www.gnu.org/software/gnuzilla/") > (synopsis "Entirely free browser derived from Mozilla Firefox") > (description > diff --git a/gnu/packages/patches/icecat-compare-paths.patch b/gnu/packages/patches/icecat-compare-paths.patch > new file mode 100644 > index 000000000000..9205899dc0c4 > --- /dev/null > +++ b/gnu/packages/patches/icecat-compare-paths.patch > @@ -0,0 +1,19 @@ > +--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm > ++++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm > +@@ -3452,6 +3452,7 @@ const XPIDatabaseReconcile = { > + if ( > + newAddon || > + oldAddon.updateDate != xpiState.mtime || > ++ oldAddon.path != xpiState.path || > + (aUpdateCompatibility && this.isAppBundledLocation(installLocation)) > + ) { > + newAddon = this.updateMetadata( > +@@ -3460,8 +3461,6 @@ const XPIDatabaseReconcile = { > + xpiState, > + newAddon > + ); > +- } else if (oldAddon.path != xpiState.path) { > +- newAddon = this.updatePath(installLocation, oldAddon, xpiState); > + } else if (aUpdateCompatibility || aSchemaChange) { > + newAddon = this.updateCompatibility( > + installLocation, > diff --git a/gnu/packages/patches/icecat-use-guix-extensions.patch b/gnu/packages/patches/icecat-use-guix-extensions.patch > new file mode 100644 > index 000000000000..f2fe4260c2cd > --- /dev/null > +++ b/gnu/packages/patches/icecat-use-guix-extensions.patch > @@ -0,0 +1,52 @@ > +--- a/toolkit/xre/nsXREDirProvider.cpp > ++++ b/toolkit/xre/nsXREDirProvider.cpp > +@@ -415,13 +415,7 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent, > + #if defined(XP_UNIX) && !defined(XP_MACOSX) > + else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) { > + # ifdef ENABLE_SYSTEM_EXTENSION_DIRS > +-# if defined(__OpenBSD__) || defined(__FreeBSD__) > +- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions"; > +-# else > +- static const char* const sysLExtDir = "/usr/share/mozilla/extensions"; > +-# endif > +- rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir), false, > +- getter_AddRefs(file)); > ++ rv = GetGuixExtensionDir(getter_AddRefs(file)); > + # endif > + } > + #endif // defined(XP_UNIX) && !defined(XP_MACOSX) > +@@ -1198,6 +1192,24 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile, > + return NS_OK; > + } > + > ++nsresult nsXREDirProvider::GetGuixExtensionDir(nsIFile** aFile) { > ++ nsresult rv; > ++ nsCOMPtr<nsIFile> localDir; > ++ > ++#if defined(XP_UNIX) > ++ const char* extensionDir = getenv("ICECAT_EXTENSION_DIR"); > ++ if (!extensionDir || !*extensionDir) return NS_ERROR_FAILURE; > ++ > ++ rv = NS_NewNativeLocalFile(nsDependentCString(extensionDir), true, > ++ getter_AddRefs(localDir)); > ++#else > ++# error "Don't know how to get product dir on your platform" > ++#endif > ++ > ++ NS_IF_ADDREF(*aFile = localDir); > ++ return rv; > ++} > ++ > + nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, > + bool aLocal) { > + // Copied from nsAppFileLocationProvider (more or less) > +--- a/toolkit/xre/nsXREDirProvider.h > ++++ b/toolkit/xre/nsXREDirProvider.h > +@@ -112,6 +112,7 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, > + private: > + nsresult GetFilesInternal(const char* aProperty, > + nsISimpleEnumerator** aResult); > ++ static nsresult GetGuixExtensionDir(nsIFile** aFile); > + static nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal); > + static nsresult GetSysUserExtensionsDirectory(nsIFile** aFile); > + #if defined(XP_UNIX) || defined(XP_MACOSX) > > base-commit: 9ad9113fc238ee8de5191a5e15b5153fd149e9fa Looks good! -- Best regards, Andrew Tropin
[signature.asc (application/pgp-signature, inline)]
Clément Lassieur <clement <at> lassieur.org>
:Clément Lassieur <clement <at> lassieur.org>
:Message #40 received at 66408-done <at> debbugs.gnu.org (full text, mbox):
From: Clément Lassieur <clement <at> lassieur.org> To: Mathieu Othacehe <othacehe <at> gnu.org>, Andrew Tropin <andrew <at> trop.in> Cc: 66408-done <at> debbugs.gnu.org, Jonathan Brielmaier <jonathan.brielmaier <at> web.de> Subject: Re: [bug#66408] [PATCH v5] gnu: icecat: Support Guix packaged extensions and native manifests. Date: Mon, 23 Oct 2023 11:55:23 +0200
Andrew Tropin <andrew <at> trop.in> writes: > Looks good! Mathieu Othacehe <othacehe <at> gnu.org> writes: > Hello, > >> Indeed! That's a small change that should be in another patch I >> believe. > > Agreed. I think you can go ahead! > > Thanks, > > Mathieu Pushed as 25043e01b6cb6696ffdc6cdedd9cdf8235bb695c, thanks!
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Mon, 20 Nov 2023 12:24:05 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.