;; -*- fill-column: 120 -*- (define-module (battering packages palemoon) #:use-module (guix packages) #:use-module (guix utils) #:use-module (guix gexp) #:use-module (guix git-download) #:use-module (guix build-system copy) #:use-module (guix build-system mozilla) #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages) #:use-module (gnu packages assembly) #:use-module (gnu packages autotools) #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages crypto) #:use-module (gnu packages compression) #:use-module (gnu packages freedesktop) #:use-module (gnu packages gl) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) #:use-module (gnu packages gtk) #:use-module (gnu packages image) #:use-module (gnu packages linux) #:use-module (gnu packages m4) #:use-module (gnu packages nss) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages pulseaudio) #:use-module (gnu packages python) #:use-module (gnu packages sqlite) #:use-module (gnu packages tls) #:use-module (gnu packages version-control) #:use-module (gnu packages video) #:use-module (gnu packages xorg) #:autoload (ice-9 regex) (string-match)) (define* (make-uxp-browser app-name app-version #:key with-gtk3? (branding "official")) (package (name app-name) (version app-version) (source #f) (build-system mozilla-build-system) (native-inputs (list autoconf gtk+-2 ;; Needed for NPAPI and WebRTC in the GTK3 build. libxcrypt m4 perl pkg-config python-2.7 tar unzip which yasm zip)) (inputs (list bash-minimal alsa-lib bzip2 dbus-glib desktop-file-utils ffmpeg gconf glib (if with-gtk3? gtk+ gtk+-2) libaom libdbusmenu libjpeg-turbo libxcomposite libxt mesa openssl pulseaudio sqlite zlib)) (arguments (let* ((build-by-date? (string-match "[0-9]{4}\\.[0-9]{2}\\.[0-9]{2}" version)) (gtk-version (if with-gtk3? "gtk3" "gtk2")) (branding-dir (format #f "~a/branding/~a" name branding)) (distdir (format #f "obj-~a/dist" (string-replace-substring (or (%current-target-system) %host-type) "unknown" "pc"))) (build-date (string-append (if build-by-date? (string-replace-substring version "." "") "19700101") "000000")) (tarball-dist (format #f "~a/~a-~a.~a-~a.tar.xz" distdir name (if build-by-date? build-date version) (string-join (reverse (string-split (or (%current-target-system) (%current-system)) #\-)) "-") gtk-version))) (list #:tests? #f #:configure-flags #~'(#$(string-append "--enable-application=" name) "--enable-accessibility" "--enable-appcompat-guid" "--enable-av1" #$(string-append "--enable-default-toolkit=cairo-" gtk-version) "--enable-devtools" "--enable-elf-hack" "--enable-jemalloc" "--enable-jxl" "--enable-more-deterministic" "--enable-necko-wifi" "--enable-npapi" "--enable-official-branding" ;; Official branding. #$(string-append "--with-branding=" branding-dir) "--enable-optimize=\"-O2 -w\"" #$(format #f "--enable-optimize=~s" "-O2 -w") "--enable-strip" "--enable-webrtc" "--enable-system-ffi" "--enable-system-cairo" "--enable-system-pixman" ;; UNBUNDLE: "--enable-system-hunspell" "--enable-system-extension-dirs" "--disable-debug" "--disable-debug-js-modules" "--disable-debug-symbols" "--disable-gamepad" "--disable-gold" "--disable-tests" "--disable-updater" "--with-pthreads" "--with-system-bz2" "--with-system-jpeg" "--with-system-zlib" "--with-x") #:modules '((guix build utils) (guix build gnu-build-system) (ice-9 regex)) #:phases #~(modify-phases %standard-phases (add-after 'unpack 'fix-prefs (lambda* (#:key inputs #:allow-other-keys) (let ((port (open-file #$(format #f "~a/app/profile/~a.js" name name) "a"))) (for-each (lambda (pref) (let ((key (car pref)) (value (if (boolean? (cadr pref)) (if (cadr pref) 'true 'false) (cadr pref)))) (format port "~%pref(~s, ~s);~%" key value) (format #t "fix-prefs: setting value of ~s to ~s~%" key value))) '(("browser.backspace_action" 0) ("extensions.blocklist.enabled" #f) ;; Feudal blocking ("browser.shell.checkDefaultBrowser" #f) ("security.sandbox.content.read_path_whitelist" (%store-directory)))) (close-port port)))) (add-after 'fix-prefs 'patch-configure-in (lambda* (#:key inputs #:allow-other-keys) (substitute* "./configure.in" ;; Doesn't get patched automatically. Why ? This eludes me. (("^#!/bin/sh") (format #f "#!~a" (search-input-file inputs "bin/sh")))))) (add-before 'configure 'setenv (lambda* (#:key inputs #:allow-other-keys) (setenv "LDFLAGS" (string-append "-Wl,-rpath=" #$output "/lib/" #$name)) (setenv "SHELL" (search-input-file inputs "/bin/bash")) (setenv "CONFIG_SHELL" (search-input-file inputs "/bin/bash")) (setenv "MOZILLA_OFFICIAL" "1") ;; Official branding (setenv "MOZ_PKG_SPECIAL" #$gtk-version) (setenv "MOZ_BUILD_DATE" #$build-date) (setenv "MOZ_NOSPAM" "1"))) (add-before 'configure 'mozconfig (lambda* (#:key configure-flags #:allow-other-keys) (call-with-output-file ".mozconfig" (lambda (p) (for-each (lambda (flag) (format p "ac_add_options ~a~%" flag)) configure-flags))))) (replace 'configure (lambda _ (invoke "./mach" "configure"))) (replace 'build (lambda* (#:key (make-flags '()) (parallel-build? #t) #:allow-other-keys) (apply invoke "./mach" "build" `(,(string-append "-j" (number->string (if parallel-build? (parallel-job-count) 1))) ,@make-flags)))) (replace 'check (lambda* (#:key tests? #:allow-other-keys) (when tests? (invoke "./mach" "test")))) (replace 'install (lambda* (#:key inputs outputs #:allow-other-keys) (invoke "./mach" "package") (let ((tar (search-input-file inputs "/bin/tar")) (lib (string-append #$output "/lib")) (bin (string-append #$output "/bin"))) (mkdir-p lib) (mkdir-p bin) (invoke tar "xJpf" #$tarball-dist "-C" lib) (symlink (format #f "~a/~a/~a" lib #$name #$name) (format #f "~a/~a" bin #$name))))) (add-after 'install 'wrap-program (lambda* (#:key inputs #:allow-other-keys) (wrap-program (format #f "~a/lib/~a/~a" #$output #$name #$name) `("GDK_BACKEND" = ("x11")) `("MOZ_ENABLE_WAYLAND" = ("0"))))) (add-after 'install 'install-branding (lambda* (#:key outputs #:allow-other-keys) (for-each (lambda (branding-file) (let* ((size (match:substring (string-match (format #f "~a/default([0-9]+)\\.png" #$branding-dir) branding-file) 1)) (dir (format #f "~a/share/icons/hicolor/~ax~a/apps" #$output size size))) (mkdir-p dir) (copy-file branding-file (in-vicinity dir (format #f "~a.png" #$name))))) (find-files #$branding-dir "default.*\\.png")) (let* ((dir (format #f "~a/share/icons/hicolor/128x128/apps" #$output))) (mkdir-p dir) (copy-file (format #f "~a/mozicon128.png" #$branding-dir) (in-vicinity dir (format #f "~a.png" #$name)))))))))) (synopsis "") (description "") (license #f) (home-page ""))) (define (make-palemoon . args) (let ((pkg (apply make-uxp-browser "palemoon" "33.5.1" args))) (package (inherit pkg) (name (package-name pkg)) (version (package-version pkg)) (native-inputs (modify-inputs (package-native-inputs pkg) (append git))) (source (origin (method git-fetch) (uri (git-reference (url "https://repo.palemoon.org/MoonchildProductions/Pale-Moon.git") (commit (string-append version "_Release")) (recursive? #t))) (file-name (git-file-name name version)) (sha256 (base32 "0cvxk7hn7dg2jl9dd25kirydg6rbyszy7vyglm40pnyvxa3hjnf4")) (patches (parameterize ((%patch-path (map (lambda (directory) (string-append directory "/sigils/packages/patches")) %load-path))) (search-patches "palemoon-vendor-basename.patch"))))) (arguments (substitute-keyword-arguments (package-arguments pkg) ((#:phases phases) #~(modify-phases #$phases (add-before 'fix-prefs 'remove-spyware-home-page (lambda _ (substitute* "palemoon/branding/shared/locales/browserconfig.properties" ;; Switch the page from the properties to something local (("(https?://)start.palemoon.org(/?)" all https slash) "about:home")) (substitute* "palemoon/branding/official/palemoon.desktop" ;; New tab should open the user's specified "New Tab" page, not the palemoon start page. (("^Exec=palemoon -new-tab .*") "Exec=palemoon -new-tab")) (substitute* '("palemoon/branding/shared/pref/preferences.inc" "palemoon/branding/unofficial/pref/palemoon-branding.js") ;; Remove the startup.homepage_welcome_url preference (("^pref\\(\"startup\\.homepage_(welcome|override)_url(.additional)?\",\".*\"\\);\n$") "")))) (add-after 'remove-spyware-home-page 'remove-spyware-search-engine (lambda _ ;; No tracking in the parameters. (substitute* '("palemoon/locales/en-US/searchplugins/duckduckgo-palemoon.xml" "palemoon/locales/en-US/searchplugins/mojeek.xml") ((".*value=\"palemoon\".*") "")) (substitute* '("palemoon/locales/en-US/searchplugins/answers.xml" "palemoon/locales/en-US/searchplugins/ekoru.xml") (("(client|ext)=palemoon&") "")))) (add-after 'install-branding 'install-desktop-file (lambda* (#:key outputs #:allow-other-keys) (install-file #$(format #f "~a/branding/official/~a.desktop" name name) (string-append #$output "/share/applications/")))))))) (home-page "https://palemoon.org") (synopsis "Independent browser derived from Firefox/Mozilla community code") (description "Pale Moon is an Open Source, Goanna-based web browser.") (license license:mpl2.0)))) (define basilisk-official-branding (package (name "basilisk-official-branding") (version "63a2bff658c5dfff3b6de17fa54743078aa4eb7e") (source (origin (method git-fetch) (uri (git-reference (url "https://repo.palemoon.org/Basilisk-Dev/Basilisk.git") (commit version) (recursive? #f))) (file-name (git-file-name name version)) (sha256 (base32 "02yz9wd5k3q1cklqslyzam3ji6mh6why7zr8hfyx88k9xqvlqix2")))) (build-system copy-build-system) (arguments '(#:install-plan '(("basilisk/branding/official/" ".")))) (home-page "https://www.basilisk-browser.org/") (synopsis "Official branding distributed with the Basilisk binaries") (description "This is a Guix recipe that extracts the official branding from the last commit before it was removed from the Basilisk repository.") (license #f))) (define (make-basilisk . args) (let ((pkg (apply make-uxp-browser "basilisk" "2024.10.24" args))) (package (inherit pkg) (name (package-name pkg)) (version (package-version pkg)) (native-inputs (modify-inputs (package-native-inputs pkg) (append basilisk-official-branding))) (source (origin (method git-fetch) (uri (git-reference (url "https://repo.palemoon.org/Basilisk-Dev/Basilisk.git") (commit (string-append "v" version)) (recursive? #t))) (file-name (git-file-name name version)) (sha256 (base32 "1z3yspg2migsrli360iym535sns1n5lc2phh6nr0xp91fwk823j1")))) (arguments (substitute-keyword-arguments (package-arguments pkg) ((#:phases phases) #~(modify-phases #$phases (add-after 'unpack 'include-official-branding (lambda* (#:key native-inputs #:allow-other-keys) (let ((dir "basilisk/branding/official")) (mkdir-p dir) (copy-recursively #$basilisk-official-branding dir)))) (add-after 'include-official-branding 'remove-spyware-home-page (lambda _ (substitute* "basilisk/branding/official/pref/basilisk-branding.js" ;; Remove the startup.homepage_welcome_url preference (("^pref\\(\"startup\\.homepage_(welcome|override)_url(.additional)?\",\".*\"\\);\n$") "")))) (add-after 'remove-spyware-home-page 'remove-spyware-search-engine (lambda _ ;; No tracking in the parameters. Yup, basilisk uses "palemoon" too. (substitute* '("basilisk/locales/searchplugins/duckduckgo-palemoon.xml" "basilisk/locales/searchplugins/mojeek.xml") ((".*value=\"palemoon\".*") "")) (substitute* "basilisk/locales/searchplugins/ekoru.xml" (("ext=palemoon&") "")))))))) (home-page "https://www.basilisk-browser.org/") (synopsis "A XUL-based web-browser built on top of the Unified XUL Platform (UXP). This browser is a close twin to pre-Servo Firefox in how it operates.") (description "Basilisk is a free and Open Source XUL-based web browser, featuring the well-known Firefox-style interface and operation. It is based on the Goanna layout and rendering engine (a fork of Gecko) and builds on the Unified XUL Platform (UXP), which in turn is a fork of the Mozilla code base without Servo or Rust.") (license license:mpl2.0)))) (define-public palemoon (make-palemoon)) (define-public basilisk (make-basilisk)) (define-public palemoon/gtk3 (package (inherit (make-palemoon #:with-gtk3? #t)) (name "palemoon-gtk3"))) (define-public basilisk/gtk3 (package (inherit (make-basilisk #:with-gtk3? #t)) (name "basilisk-gtk3")))