From b5a8492a79c991e6c58b1093338cdf011611f7f8 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sun, 13 Feb 2022 18:04:22 +0100 Subject: [PATCH] nongnu: firefox: Use Gexp. * nongnu/packages/mozilla.scm (firefox)[arguments]: Use Gexp to remove uses of %BUILD-INPUTS and output references. Also remove trailing #t. Signed-off-by: Jonathan Brielmaier --- nongnu/packages/mozilla.scm | 485 ++++++++++++++++++------------------ 1 file changed, 238 insertions(+), 247 deletions(-) diff --git a/nongnu/packages/mozilla.scm b/nongnu/packages/mozilla.scm index dc7abf3..d9cea29 100644 --- a/nongnu/packages/mozilla.scm +++ b/nongnu/packages/mozilla.scm @@ -9,7 +9,7 @@ ;;; Copyright © 2017, 2018 Nikita ;;; Copyright © 2017, 2018 ng0 ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice -;;; Copyright © 2018, 2020 Ricardo Wurmus +;;; Copyright © 2018, 2020, 2022 Ricardo Wurmus ;;; Copyright © 2019 Ivan Petkov ;;; Copyright © 2020 Oleg Pykhalov ;;; Copyright © 2020 Jakub Kądziołka @@ -42,6 +42,7 @@ #:use-module (guix build-system trivial) #:use-module (guix download) #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix utils) @@ -100,269 +101,259 @@ (base32 "0a6z94kwgycgis4mgl13dh52kw7zmsya2qpxhcrh6b8j8z5pv2kc")))) (build-system gnu-build-system) (arguments - `(#:configure-flags - (let ((clang (assoc-ref %build-inputs "clang")) - (wasi-sysroot (assoc-ref %build-inputs - "wasm32-wasi-clang-toolchain"))) - `("--enable-application=browser" + (list + #:configure-flags + #~(let ((clang #$(this-package-native-input "clang")) + (wasi-sysroot #$(this-package-native-input "wasm32-wasi-clang-toolchain"))) + `("--enable-application=browser" - ;; Configuration - "--with-system-jpeg" - "--with-system-zlib" - ;; "--with-system-png" ;require libpng-apng >= 1.6.35 - "--with-system-icu" - "--enable-system-ffi" - "--enable-system-pixman" - "--enable-jemalloc" + ;; Configuration + "--with-system-jpeg" + "--with-system-zlib" + ;; "--with-system-png" ;require libpng-apng >= 1.6.35 + "--with-system-icu" + "--enable-system-ffi" + "--enable-system-pixman" + "--enable-jemalloc" - ;; see https://bugs.gnu.org/32833 - ;; "--with-system-nspr" - ;; "--with-system-nss" + ;; see https://bugs.gnu.org/32833 + ;; "--with-system-nspr" + ;; "--with-system-nss" - ,(string-append "--with-clang-path=" - clang "/bin/clang") - ,(string-append "--with-libclang-path=" - clang "/lib") - ,(string-append "--with-wasi-sysroot=" wasi-sysroot "/wasm32-wasi") + ,(string-append "--with-clang-path=" + clang "/bin/clang") + ,(string-append "--with-libclang-path=" + clang "/lib") + ,(string-append "--with-wasi-sysroot=" wasi-sysroot "/wasm32-wasi") - ;; Distribution - "--with-distribution-id=org.nonguix" - "--disable-official-branding" + ;; Distribution + "--with-distribution-id=org.nonguix" + "--disable-official-branding" - ;; Features - "--disable-tests" - "--disable-updater" - "--enable-pulseaudio" - "--disable-crashreporter" + ;; Features + "--disable-tests" + "--disable-updater" + "--enable-pulseaudio" + "--disable-crashreporter" - ;; Build details - "--disable-debug" - "--enable-rust-simd" - "--enable-release" - "--enable-optimize" - "--enable-strip" - "--disable-elf-hack")) - #:imported-modules ,%cargo-utils-modules - #:modules ((ice-9 regex) + ;; Build details + "--disable-debug" + "--enable-rust-simd" + "--enable-release" + "--enable-optimize" + "--enable-strip" + "--disable-elf-hack")) + #:imported-modules %cargo-utils-modules + #:modules `((ice-9 regex) (ice-9 ftw) (srfi srfi-26) ,@%gnu-build-system-modules) - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'fix-preferences - (lambda* (#:key inputs #:allow-other-keys) - (let ((port (open-file "browser/app/profile/firefox.js" "a"))) - (define (write-setting key value) - (format port "~%pref(\"~a\", ~a);~%" - key value) - (format #t "fix-preferences: setting value of ~a to ~a~%" - key value)) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fix-preferences + (lambda* (#:key inputs #:allow-other-keys) + (let ((port (open-file "browser/app/profile/firefox.js" "a"))) + (define (write-setting key value) + (format port "~%pref(\"~a\", ~a);~%" + key value) + (format #t "fix-preferences: setting value of ~a to ~a~%" + key value)) - ;; We should allow Firefox sandbox to read the store directory, - ;; because Firefox sandbox have access to /usr on FHS distros. - (write-setting "security.sandbox.content.read_path_whitelist" - (string-append "\"" (%store-directory) "/\"")) + ;; We should allow Firefox sandbox to read the store directory, + ;; because Firefox sandbox have access to /usr on FHS distros. + (write-setting "security.sandbox.content.read_path_whitelist" + (string-append "\"" (%store-directory) "/\"")) - ;; XDG settings should be managed by Guix. - (write-setting "browser.shell.checkDefaultBrowser" "false") - (close-port port)) - #t)) - (add-after 'fix-preferences 'fix-ffmpeg-runtime-linker - (lambda* (#:key inputs #:allow-other-keys) - (let* ((ffmpeg (assoc-ref inputs "ffmpeg")) - (libavcodec (string-append ffmpeg "/lib/libavcodec.so"))) - ;; Arrange to load libavcodec.so by its absolute file name. - (substitute* "dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp" - (("libavcodec\\.so") - libavcodec)) - #t))) + ;; XDG settings should be managed by Guix. + (write-setting "browser.shell.checkDefaultBrowser" "false") + (close-port port)))) + (add-after 'fix-preferences 'fix-ffmpeg-runtime-linker + (lambda* (#:key inputs #:allow-other-keys) + (let* ((ffmpeg (assoc-ref inputs "ffmpeg")) + (libavcodec (string-append ffmpeg "/lib/libavcodec.so"))) + ;; Arrange to load libavcodec.so by its absolute file name. + (substitute* "dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp" + (("libavcodec\\.so") + libavcodec))))) - (add-after 'patch-source-shebangs 'patch-cargo-checksums - (lambda _ - (use-modules (guix build cargo-utils)) - (let ((null-hash - ;; This is the SHA256 output of an empty string. - "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")) - (for-each - (lambda (file) - (format #t "patch-cargo-checksums: patching checksums in ~a~%" - file) - (substitute* file - (("(checksum = )\".*\"" all name) - (string-append name "\"" null-hash "\"")))) - (find-files "." "Cargo\\.lock$")) - (for-each generate-all-checksums - '("build" - "dom/media" - "dom/webauthn" - "gfx" - "intl" - "js" - "media" - "modules" - "mozglue/static/rust" - "netwerk" - "remote" - "security/manager/ssl" - "servo" - "storage" - "third_party/rust" - "toolkit" - "xpcom/rust" - "services")) - #t))) - (add-after 'patch-cargo-checksums 'remove-cargo-frozen-flag - (lambda _ - ;; Remove --frozen flag from cargo invokation, otherwise it'll - ;; complain that it's not able to change Cargo.lock. - ;; https://bugzilla.mozilla.org/show_bug.cgi?id=1726373 - (substitute* "build/RunCbindgen.py" - (("\"--frozen\",") "")) - #t)) - (delete 'bootstrap) - (replace 'configure - (lambda* (#:key inputs outputs configure-flags #:allow-other-keys) - (setenv "AUTOCONF" (string-append (assoc-ref inputs "autoconf") - "/bin/autoconf")) - (setenv "SHELL" (which "bash")) - (setenv "CONFIG_SHELL" (which "bash")) - (setenv "MACH_USE_SYSTEM_PYTHON" "1") + (add-after 'patch-source-shebangs 'patch-cargo-checksums + (lambda _ + (use-modules (guix build cargo-utils)) + (let ((null-hash + ;; This is the SHA256 output of an empty string. + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")) + (for-each + (lambda (file) + (format #t "patch-cargo-checksums: patching checksums in ~a~%" + file) + (substitute* file + (("(checksum = )\".*\"" all name) + (string-append name "\"" null-hash "\"")))) + (find-files "." "Cargo\\.lock$")) + (for-each generate-all-checksums + '("build" + "dom/media" + "dom/webauthn" + "gfx" + "intl" + "js" + "media" + "modules" + "mozglue/static/rust" + "netwerk" + "remote" + "security/manager/ssl" + "servo" + "storage" + "third_party/rust" + "toolkit" + "xpcom/rust" + "services"))))) + (add-after 'patch-cargo-checksums 'remove-cargo-frozen-flag + (lambda _ + ;; Remove --frozen flag from cargo invokation, otherwise it'll + ;; complain that it's not able to change Cargo.lock. + ;; https://bugzilla.mozilla.org/show_bug.cgi?id=1726373 + (substitute* "build/RunCbindgen.py" + (("\"--frozen\",") "")))) + (delete 'bootstrap) + (replace 'configure + (lambda* (#:key inputs outputs configure-flags #:allow-other-keys) + (setenv "AUTOCONF" (string-append (assoc-ref inputs "autoconf") + "/bin/autoconf")) + (setenv "SHELL" (which "bash")) + (setenv "CONFIG_SHELL" (which "bash")) + (setenv "MACH_USE_SYSTEM_PYTHON" "1") - ;; Use Clang, Clang is 2x faster than GCC - (setenv "AR" "llvm-ar") - (setenv "NM" "llvm-nm") - (setenv "CC" "clang") - (setenv "CXX" "clang++") - (setenv "WASM_CC" + ;; Use Clang, Clang is 2x faster than GCC + (setenv "AR" "llvm-ar") + (setenv "NM" "llvm-nm") + (setenv "CC" "clang") + (setenv "CXX" "clang++") + (setenv "WASM_CC" + (string-append + (assoc-ref inputs "wasm32-wasi-clang-toolchain") + "/bin/clang")) + (setenv "WASM_CXX" + (string-append + (assoc-ref inputs "wasm32-wasi-clang-toolchain") + "/bin/clang++")) + + (setenv "MOZ_NOSPAM" "1") + ;; Firefox will write the timestamp to output, which is harmful for + ;; reproducibility, so change it to a fixed date. + (setenv "MOZ_BUILD_DATE" #$%firefox-build-id) + + (setenv "MOZBUILD_STATE_PATH" (getcwd)) + + (let* ((mozconfig (string-append (getcwd) "/mozconfig")) + (out (assoc-ref outputs "out")) + (flags (cons (string-append "--prefix=" out) + configure-flags))) + (format #t "build directory: ~s~%" (getcwd)) + (format #t "configure flags: ~s~%" flags) + + (define write-flags + (lambda flags + (display (string-join + (map (cut string-append "ac_add_options " <>) + flags) + "\n")) + (display "\n"))) + (with-output-to-file mozconfig + (lambda () + (apply write-flags flags) + ;; The following option unsets Telemetry Reporting. With the Addons Fiasco, + ;; Mozilla was found to be collecting user's data, including saved passwords and + ;; web form data, without users consent. Mozilla was also found shipping updates + ;; to systems without the user's knowledge or permission. + ;; As a result of this, use the following command to permanently disable + ;; telemetry reporting in Firefox. + (display "unset MOZ_TELEMETRY_REPORTING\n"))) + (setenv "MOZCONFIG" mozconfig)) + (invoke "./mach" "configure"))) + (replace 'build + (lambda* (#:key (make-flags '()) (parallel-build? #t) + #:allow-other-keys) + (apply invoke "./mach" "build" + ;; mach will use parallel build if possible by default + `(,@(if parallel-build? + '() + '("-j1")) + ,@make-flags)))) + (add-after 'build 'neutralise-store-references + (lambda _ + ;; Mangle the store references to compilers & other build tools in + ;; about:buildconfig, reducing Firefox's closure by 1 GiB on x86-64. + (let* ((build-dir (car (scandir "." (cut string-prefix? "obj-" <>)))) + (file (string-append build-dir "/dist/bin/chrome/toolkit/content/global/buildconfig.html"))) + (substitute* file + (((format #f "(~a/)([0-9a-df-np-sv-z]{32})" + (regexp-quote (%store-directory))) + _ store hash) + (string-append store + (string-take hash 8) + "" + (string-drop hash 8))))))) + (replace 'install + (lambda _ (invoke "./mach" "install"))) + (add-after 'install 'wrap-program + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (lib (string-append out "/lib")) + (ld-libs + (map (lambda (x) + (string-append (assoc-ref inputs x) + "/lib")) + '("pulseaudio" "mesa" + "udev" ;; For U2F and WebAuthn + ;; For hardware video acceleration via VA-API + "libva" + ;; For the integration of native notifications + "libnotify"))) + (gtk-share (string-append (assoc-ref inputs "gtk+") + "/share"))) + (wrap-program (car (find-files lib "^firefox$")) + `("LD_LIBRARY_PATH" prefix ,ld-libs) + `("XDG_DATA_DIRS" prefix (,gtk-share)) + `("MOZ_LEGACY_PROFILES" = ("1")) + `("MOZ_ALLOW_DOWNGRADE" = ("1")))))) + (add-after 'wrap-program 'install-desktop-entry + (lambda* (#:key outputs #:allow-other-keys) + (let* ((desktop-file "taskcluster/docker/firefox-snap/firefox.desktop") + (applications (string-append #$output "/share/applications"))) + (substitute* desktop-file + (("^Exec=firefox") (string-append "Exec=" #$output "/bin/firefox")) + (("Icon=.*") "Icon=firefox\n") + (("NewWindow") "new-window") + (("NewPrivateWindow") "new-private-window") + (("StartupNotify=true") + "StartupNotify=true\nStartupWMClass=Navigator")) + (install-file desktop-file applications)))) + (add-after 'install-desktop-entry 'install-icons + (lambda* (#:key outputs #:allow-other-keys) + (let ((icon-source-dir (string-append - (assoc-ref inputs "wasm32-wasi-clang-toolchain") - "/bin/clang")) - (setenv "WASM_CXX" - (string-append - (assoc-ref inputs "wasm32-wasi-clang-toolchain") - "/bin/clang++")) + #$output "/lib/firefox/browser/chrome/icons/default"))) + (for-each + (lambda (size) + (let ((dest (string-append #$output "/share/icons/hicolor/" + size "x" size "/apps"))) + (mkdir-p dest) + (symlink (string-append icon-source-dir + "/default" size ".png") + (string-append dest "/firefox.png")))) + '("16" "32" "48" "64" "128")))))) - (setenv "MOZ_NOSPAM" "1") - ;; Firefox will write the timestamp to output, which is harmful for - ;; reproducibility, so change it to a fixed date. - (setenv "MOZ_BUILD_DATE" ,%firefox-build-id) + ;; Test will significantly increase build time but with little rewards. + #:tests? #f - (setenv "MOZBUILD_STATE_PATH" (getcwd)) + ;; WARNING: Parallel build will consume lots of memory! + ;; If you have encountered OOM issue in build phase, try disable it. + ;; #:parallel-build? #f - (let* ((mozconfig (string-append (getcwd) "/mozconfig")) - (out (assoc-ref outputs "out")) - (flags (cons (string-append "--prefix=" out) - configure-flags))) - (format #t "build directory: ~s~%" (getcwd)) - (format #t "configure flags: ~s~%" flags) - - (define write-flags - (lambda flags - (display (string-join - (map (cut string-append "ac_add_options " <>) - flags) - "\n")) - (display "\n"))) - (with-output-to-file mozconfig - (lambda () - (apply write-flags flags) - ;; The following option unsets Telemetry Reporting. With the Addons Fiasco, - ;; Mozilla was found to be collecting user's data, including saved passwords and - ;; web form data, without users consent. Mozilla was also found shipping updates - ;; to systems without the user's knowledge or permission. - ;; As a result of this, use the following command to permanently disable - ;; telemetry reporting in Firefox. - (display "unset MOZ_TELEMETRY_REPORTING\n"))) - (setenv "MOZCONFIG" mozconfig)) - (invoke "./mach" "configure"))) - (replace 'build - (lambda* (#:key (make-flags '()) (parallel-build? #t) - #:allow-other-keys) - (apply invoke "./mach" "build" - ;; mach will use parallel build if possible by default - `(,@(if parallel-build? - '() - '("-j1")) - ,@make-flags)))) - (add-after 'build 'neutralise-store-references - (lambda _ - ;; Mangle the store references to compilers & other build tools in - ;; about:buildconfig, reducing Firefox's closure by 1 GiB on x86-64. - (let* ((build-dir (car (scandir "." (cut string-prefix? "obj-" <>)))) - (file (string-append build-dir "/dist/bin/chrome/toolkit/content/global/buildconfig.html"))) - (substitute* file - (((format #f "(~a/)([0-9a-df-np-sv-z]{32})" - (regexp-quote (%store-directory))) - _ store hash) - (string-append store - (string-take hash 8) - "" - (string-drop hash 8))))) - #t)) - (replace 'install - (lambda _ (invoke "./mach" "install"))) - (add-after 'install 'wrap-program - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (lib (string-append out "/lib")) - (ld-libs - (map (lambda (x) - (string-append (assoc-ref inputs x) - "/lib")) - '("pulseaudio" "mesa" - "udev" ;; For U2F and WebAuthn - ;; For hardware video acceleration via VA-API - "libva" - ;; For the integration of native notifications - "libnotify"))) - (gtk-share (string-append (assoc-ref inputs "gtk+") - "/share"))) - (wrap-program (car (find-files lib "^firefox$")) - `("LD_LIBRARY_PATH" prefix ,ld-libs) - `("XDG_DATA_DIRS" prefix (,gtk-share)) - `("MOZ_LEGACY_PROFILES" = ("1")) - `("MOZ_ALLOW_DOWNGRADE" = ("1"))) - #t))) - (add-after 'wrap-program 'install-desktop-entry - (lambda* (#:key outputs #:allow-other-keys) - (let* ((desktop-file "taskcluster/docker/firefox-snap/firefox.desktop") - (out (assoc-ref outputs "out")) - (applications (string-append out "/share/applications"))) - (substitute* desktop-file - (("^Exec=firefox") (string-append "Exec=" out "/bin/firefox")) - (("Icon=.*") "Icon=firefox\n") - (("NewWindow") "new-window") - (("NewPrivateWindow") "new-private-window") - (("StartupNotify=true") - "StartupNotify=true\nStartupWMClass=Navigator")) - (install-file desktop-file applications)) - #t)) - (add-after 'install-desktop-entry 'install-icons - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (icon-source-dir - (string-append - out "/lib/firefox/browser/chrome/icons/default"))) - (for-each - (lambda (size) - (let ((dest (string-append out "/share/icons/hicolor/" - size "x" size "/apps"))) - (mkdir-p dest) - (symlink (string-append icon-source-dir - "/default" size ".png") - (string-append dest "/firefox.png")))) - '("16" "32" "48" "64" "128")) - #t)))) - - ;; Test will significantly increase build time but with little rewards. - #:tests? #f - - ;; WARNING: Parallel build will consume lots of memory! - ;; If you have encountered OOM issue in build phase, try disable it. - ;; #:parallel-build? #f - - ;; Some dynamic lib was determined at runtime, so rpath check may fail. - #:validate-runpath? #f)) + ;; Some dynamic lib was determined at runtime, so rpath check may fail. + #:validate-runpath? #f)) (inputs `(("bzip2" ,bzip2) ("cairo" ,cairo)