Subject: Re: [bug#28004] Chromium

From: ng0 <[email-masked]>
Date: Tue, 27 Feb 2018 22:17:11 +0000

Marius Bakke transcribed 43K bytes:
> ng0 <[email-masked]> writes:
> 
> > Marius Bakke transcribed 2.1K bytes:
> >> Mike Gerwitz <[email-masked]> writes:
> >> 
> >> > On Tue, Jan 16, 2018 at 20:01:34 +0100, Marius Bakke wrote:
> >> >> If there are no objections, expect to see this in 'master' in 1-2 weeks.
> >> >
> >> > I want to express gratitude for your hard work on this---given that
> >> > IceCat does not contain many of the FF devtool updates, Chromium is very
> >> > desirable for web development.  It's also needed for certain Node.js
> >> > tools, like node-inspector.
> >> >
> >> > So, thank you!
> >> 
> >> Thank *you* for the kind words! :-)
> >> 
> >> Here is the latest iteration of this patch.  New in this version:
> >> 
> >> * Chromium 64 (duh).
> >> * The 'delete-bundled-software' phase has been moved to a snippet,
> >>   shaving ~100MiB (~22%) off the compressed tarball size (and
> >>   drastically reduces (de)compression time).
> >> * The New Tab page does not show any thumbnails for new profiles.
> >
> > I think you forgot to attach the patches :)
> 
> Derp.  I realized that and just used `git send-email`[0], but have
> attached it here for convenience since the debbugs web UI doesn't allow
> easy download of a raw message.
> 
> [0] https://debbugs.gnu.org/cgi/bugreport.cgi?msg=131;bug=28004#131
>

Comments inlined, some words ahead.

I think it's good that we will be able to handle extensions via Guix.
But: We should point it out that you won't be able to install extensions
manually, via the store or as a file. People who betatested this got
confused.
Once we have extensions as packages, we can describe how to get extensions.
Gentoo (and Nix?) have done some work on handling the extensions via system
tools.

> From f00529f4cd9e2e5efef146915d217cbb413d1f1a Mon Sep 17 00:00:00 2001
> From: Marius Bakke <[email-masked]>
> Date: Wed, 12 Oct 2016 17:25:05 +0100
> Subject: [PATCH] gnu: Add chromium.
> 
> * gnu/packages/chromium.scm: New file.
> * gnu/packages/patches/chromium-gcc.patch,
> gnu/packages/patches/chromium-remove-default-history.patch: New files.
> * gnu/local.mk: Record it.
> ---
>  gnu/local.mk                                       |   3 +
>  gnu/packages/chromium.scm                          | 756 +++++++++++++++++++++
>  gnu/packages/patches/chromium-gcc5.patch           |  39 ++
>  .../patches/chromium-remove-default-history.patch  |  13 +
>  4 files changed, 811 insertions(+)
>  create mode 100644 gnu/packages/chromium.scm
>  create mode 100644 gnu/packages/patches/chromium-gcc5.patch
>  create mode 100644 gnu/packages/patches/chromium-remove-default-history.patch
> 
> diff --git a/gnu/local.mk b/gnu/local.mk
> index fa98810d6..fb1320f7b 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -92,6 +92,7 @@ GNU_SYSTEM_MODULES =				\
>    %D%/packages/check.scm			\
>    %D%/packages/chemistry.scm			\
>    %D%/packages/chez.scm				\
> +  %D%/packages/chromium.scm			\
>    %D%/packages/ci.scm				\
>    %D%/packages/cinnamon.scm			\
>    %D%/packages/cmake.scm			\
> @@ -581,6 +582,8 @@ dist_patch_DATA =						\
>    %D%/packages/patches/ceph-skip-collect-sys-info-test.patch	\
>    %D%/packages/patches/ceph-skip-unittest_blockdev.patch	\
>    %D%/packages/patches/chmlib-inttypes.patch			\
> +  %D%/packages/patches/chromium-gcc5.patch			\
> +  %D%/packages/patches/chromium-remove-default-history.patch	\
>    %D%/packages/patches/clang-libc-search-path.patch		\
>    %D%/packages/patches/clang-3.8-libc-search-path.patch		\
>    %D%/packages/patches/clang-runtime-asan-build-fixes.patch	\
> diff --git a/gnu/packages/chromium.scm b/gnu/packages/chromium.scm
> new file mode 100644
> index 000000000..1dd77b089
> --- /dev/null
> +++ b/gnu/packages/chromium.scm
> @@ -0,0 +1,756 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2016, 2017, 2018 Marius Bakke <[email-masked]>
> +;;;
> +;;; 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 packages chromium)
> +  #:use-module ((guix licenses) #:prefix license:)
> +  #:use-module (guix packages)
> +  #:use-module (guix download)
> +  #:use-module (guix git-download)
> +  #:use-module (guix utils)
> +  #:use-module (guix build-system gnu)
> +  #:use-module (gnu packages)
> +  #:use-module (gnu packages assembly)
> +  #:use-module (gnu packages base)
> +  #:use-module (gnu packages bison)
> +  #:use-module (gnu packages compression)
> +  #:use-module (gnu packages cups)
> +  #:use-module (gnu packages curl)
> +  #:use-module (gnu packages databases)
> +  #:use-module (gnu packages fontutils)
> +  #:use-module (gnu packages ghostscript)
> +  #:use-module (gnu packages gl)
> +  #:use-module (gnu packages glib)
> +  #:use-module (gnu packages gnome)
> +  #:use-module (gnu packages gnuzilla)
> +  #:use-module (gnu packages gperf)
> +  #:use-module (gnu packages gtk)
> +  #:use-module (gnu packages icu4c)
> +  #:use-module (gnu packages image)
> +  #:use-module (gnu packages libevent)
> +  #:use-module (gnu packages libffi)
> +  #:use-module (gnu packages libusb)
> +  #:use-module (gnu packages linux)
> +  #:use-module (gnu packages kerberos)
> +  #:use-module (gnu packages ninja)
> +  #:use-module (gnu packages node)
> +  #:use-module (gnu packages pciutils)
> +  #:use-module (gnu packages photo)
> +  #:use-module (gnu packages pkg-config)
> +  #:use-module (gnu packages protobuf)
> +  #:use-module (gnu packages pulseaudio)
> +  #:use-module (gnu packages python)
> +  #:use-module (gnu packages python-web)
> +  #:use-module (gnu packages regex)
> +  #:use-module (gnu packages serialization)
> +  #:use-module (gnu packages speech)
> +  #:use-module (gnu packages tls)
> +  #:use-module (gnu packages valgrind)
> +  #:use-module (gnu packages version-control)
> +  #:use-module (gnu packages video)
> +  #:use-module (gnu packages xiph)
> +  #:use-module (gnu packages xml)
> +  #:use-module (gnu packages xdisorg)
> +  #:use-module (gnu packages xorg))
> +
> +(define (strip-directory-prefix pathspec)
> +  "Return everything after the last '/' in PATHSPEC."
> +  (let ((index (string-rindex pathspec #\/)))
> +    (if index
> +        (string-drop pathspec (+ 1 index))
> +        pathspec)))
> +
> +(define (chromium-patch-file-name pathspec)
> +  (let ((patch-name (strip-directory-prefix pathspec)))
> +    (if (string-prefix? "chromium-" patch-name)
> +        patch-name
> +        (string-append "chromium-" patch-name))))
> +
> +;; https://anonscm.debian.org/cgit/pkg-chromium/pkg-chromium.git/tree/debian/patches
> +(define (debian-patch pathspec revision hash)
> +  (origin
> +    (method url-fetch)
> +    (uri (string-append
> +          "https://anonscm.debian.org/cgit/pkg-chromium/pkg-chromium.git"
> +          "/plain/debian/patches/" pathspec "?id=" revision))
> +    (sha256 (base32 hash))
> +    (file-name (chromium-patch-file-name pathspec))))
> +
> +;; https://gitweb.gentoo.org/repo/gentoo.git/tree/www-client/chromium/files
> +(define (gentoo-patch pathspec revision hash)
> +  (origin
> +    (method url-fetch)
> +    (uri (string-append
> +          "https://gitweb.gentoo.org/repo/gentoo.git/plain/www-client"
> +          "/chromium/files/" pathspec "?id=" revision))
> +    (sha256 (base32 hash))
> +    (file-name (chromium-patch-file-name pathspec))))
> +
> +;; https://github.com/gcarq/inox-patchset
> +(define (inox-patch pathspec revision hash)
> +  (origin
> +    (method url-fetch)
> +    (uri (string-append "https://raw.githubusercontent.com/gcarq/inox-patchset/"
> +                        revision "/" pathspec))
> +    (sha256 (base32 hash))
> +    (file-name (chromium-patch-file-name pathspec))))
> +
> +;; https://github.com/NixOS/nixpkgs/tree/master/pkgs/applications/networking/browsers/chromium
> +(define (nixos-patch pathspec revision hash)
> +  (origin
> +    (method url-fetch)
> +    (uri (string-append "https://raw.githubusercontent.com/NixOS/nixpkgs/"
> +                        revision "/pkgs/applications/networking/browsers"
> +                        "/chromium/patches/" pathspec))
> +    (sha256 (base32 hash))
> +    (file-name (chromium-patch-file-name pathspec))))
> +
> +;; Fix build for older versions of GCC.
> +(define %chromium-angle-gcc-compat.patch
> +  (gentoo-patch "chromium-angle-r0.patch"
> +                "08971011b4d6fa37aa906920fba7564e48b9e60b"
> +                "0izdrqwsyr48117dhvwdsk8c6dkrnq2njida1q4mb1lagvwbz7gc"))
> +
> +;; https://webrtc-review.googlesource.com/9384
> +(define %chromium-webrtc-gcc-compat.patch
> +  (gentoo-patch "chromium-webrtc-r0.patch"
> +                "08971011b4d6fa37aa906920fba7564e48b9e60b"
> +                "0qj5b4w9kav51ylpdf38vm5w7p2gx4qp8p45vrfggp7miicg9cmw"))
> +
> +;; https://chromium-review.googlesource.com/813737
> +(define %chromium-memcpy.patch
> +  (gentoo-patch "chromium-memcpy-r0.patch"
> +                "08971011b4d6fa37aa906920fba7564e48b9e60b"
> +                "1d3vra59wjg2lva7ddv55ff6l57mk9k50llsplr0b7vxk0lh0ps5"))
> +
> +(define %chromium-system-nspr.patch
> +  (debian-patch "system/nspr.patch"
> +                "debian/64.0.3282.119-2"
> +                "0pcwk3jsx8hjzd4s1v7p11jd8vpdqfnq82di31222cjx0bl6275r"))
> +
> +(define %chromium-system-libevent.patch
> +  (debian-patch "system/event.patch"
> +                "debian/64.0.3282.119-2"
> +                "1dxzn1yf05mzf21c25sczj4zhkknf03x9bc3xzznqpvnsf3cjpr0"))
> +
> +(define %chromium-system-icu.patch
> +  (debian-patch "system/icu.patch"
> +                "debian/64.0.3282.119-2"
> +                "0kf77d8lyma3w0xpgfv2k0c741zp6ii08gzllfja6d5s59c15ylv"))
> +
> +;; Don't show a warning about missing API keys.
> +(define %chromium-disable-api-keys-warning.patch
> +  (debian-patch "disable/google-api-warning.patch"
> +                "debian/64.0.3282.119-2"
> +                "1932xkrskm4nnglzj6xfjpycx4chsycj9ay3ipkq5f6xk21a1xm0"))
> +
> +;; Add DuckDuckGo and set it as the default search engine.
> +(define %chromium-duckduckgo.patch
> +  (inox-patch "0011-add-duckduckgo-search-engine.patch"
> +              "d655594419af6b82a2a070e4d3eedd926a04fa79"
> +              "0p8x98g71ngkd3wbl5q36wrl18ff185sfrr5fcwjbgrv3v7r6ra7"))
> +
> +;; Don't start a "Login Wizard" at first launch.
> +(define %chromium-first-run.patch
> +  (inox-patch "0018-disable-first-run-behaviour.patch"
> +              "d655594419af6b82a2a070e4d3eedd926a04fa79"
> +              "1y4zsqqf2125jkb1phwy9g5hcbd9xhyv5lr4xcaly66rpdzx2ayb"))
> +
> +;; Use privacy-preserving defaults.
> +(define %chromium-default-preferences.patch
> +  (inox-patch "0006-modify-default-prefs.patch"
> +              "d655594419af6b82a2a070e4d3eedd926a04fa79"
> +              "0qpd5l3wiw7325cicjzvdql0gay7jl4afml4nrbmy3w40i1ai2rf"))
> +
> +;; Recent versions of Chromium may load a remote search engine on the
> +;; New Tab Page, causing unnecessary and involuntary network traffic.
> +(define %chromium-restore-classic-ntp.patch
> +  (inox-patch "0008-restore-classic-ntp.patch"
> +              "d655594419af6b82a2a070e4d3eedd926a04fa79"
> +              "0lj018q6vd6m43cj8rnraqgi4lp2iq76i1i0078dav4cxnzdryfs"))
> +
> +(define opus+custom
> +  (package (inherit opus)
> +           (name "opus+custom")
> +           (arguments
> +            `(;; Opus Custom is an optional extension of the Opus
> +              ;; specification that allows for unsupported frame
> +              ;; sizes.  Chromium requires that this is enabled.
> +              #:configure-flags '("--enable-custom-modes")
> +              ,@(package-arguments opus)))))
> +
> +(define libvpx+experimental
> +  (package
> +    (inherit libvpx)
> +    (name "libvpx+experimental")
> +    (arguments
> +     `(,@(substitute-keyword-arguments (package-arguments libvpx)
> +           ((#:configure-flags flags ''())
> +            ;; Spatial SVC is an experimental VP9 encoder required by Chromium.
> +            `(cons* "--enable-experimental" "--enable-spatial-svc"
> +                    ,flags)))))))
> +
> +(define-public chromium
> +  (package
> +    (name "chromium")
> +    (version "64.0.3282.186")
> +    (synopsis "Graphical web browser")
> +    (source (origin
> +              (method url-fetch)
> +              (uri (string-append "https://commondatastorage.googleapis.com/"
> +                                  "chromium-browser-official/chromium-"
> +                                  version ".tar.xz"))
> +              (sha256
> +               (base32
> +                "0q0q1whspmzyln04gxhgl3jd2vrgb4imh8r9qw6c06i3b63j3l2z"))
> +              (patches (list %chromium-duckduckgo.patch
> +                             %chromium-default-preferences.patch
> +                             %chromium-first-run.patch
> +                             %chromium-restore-classic-ntp.patch
> +                             %chromium-angle-gcc-compat.patch
> +                             %chromium-webrtc-gcc-compat.patch
> +                             %chromium-memcpy.patch
> +                             %chromium-system-icu.patch
> +                             %chromium-system-nspr.patch
> +                             %chromium-system-libevent.patch
> +                             %chromium-disable-api-keys-warning.patch
> +                             (search-patch "chromium-gcc5.patch")
> +                             (search-patch "chromium-remove-default-history.patch")))
> +              (modules '((srfi srfi-1)
> +                         (ice-9 ftw)
> +                         (ice-9 regex)
> +                         (guix build utils)))
> +              (snippet
> +               '(begin
> +                  (let ((preserved-files
> +                         (map
> +                          (lambda (path) (string-append "./" path))
> +                          (list
> +                           "base/third_party/dmg_fp"
> +                           "base/third_party/dynamic_annotations"
> +                           "base/third_party/icu"
> +                           "base/third_party/libevent"
> +                           "base/third_party/nspr"
> +                           "base/third_party/superfasthash"
> +                           "base/third_party/symbolize" ;glog
> +                           "base/third_party/xdg_mime"
> +                           "base/third_party/xdg_user_dirs"
> +                           "buildtools/third_party/libc++"
> +                           "chrome/third_party/mozilla_security_manager"
> +                           "courgette/third_party"
> +                           "net/third_party/mozilla_security_manager"
> +                           "net/third_party/nss"
> +                           "third_party/adobe/flash/flapper_version.h"
> +                           ;; FIXME: This is used in:
> +                           ;; * ui/webui/resources/js/analytics.js
> +                           ;; * ui/file_manager/
> +                           "third_party/analytics"
> +                           "third_party/angle"
> +                           "third_party/angle/src/common/third_party/base"
> +                           "third_party/angle/src/common/third_party/smhasher"
> +                           "third_party/angle/src/third_party/compiler"
> +                           "third_party/angle/src/third_party/libXNVCtrl"
> +                           "third_party/angle/src/third_party/trace_event"
> +                           "third_party/blink"
> +                           "third_party/boringssl"
> +                           "third_party/boringssl/src/third_party/fiat"
> +                           "third_party/breakpad"
> +                           "third_party/brotli"
> +                           "third_party/cacheinvalidation"
> +                           "third_party/catapult"
> +                           "third_party/catapult/common/py_vulcanize/third_party/rcssmin"
> +                           "third_party/catapult/common/py_vulcanize/third_party/rjsmin"
> +                           "third_party/catapult/third_party/polymer"
> +                           "third_party/catapult/tracing/third_party/d3"
> +                           "third_party/catapult/tracing/third_party/gl-matrix"
> +                           "third_party/catapult/tracing/third_party/jszip"
> +                           "third_party/catapult/tracing/third_party/mannwhitneyu"
> +                           "third_party/catapult/tracing/third_party/oboe"
> +                           "third_party/catapult/tracing/third_party/pako"
> +                           "third_party/ced"
> +                           "third_party/cld_3"
> +                           "third_party/crc32c"
> +                           "third_party/cros_system_api"
> +                           "third_party/dom_distiller_js"
> +                           "third_party/fips181"
> +                           "third_party/flatbuffers"
> +                           ;; PDFium requires a private freetype API.
> +                           ;; <https://bugs.chromium.org/p/pdfium/issues/detail?id=733>
> +                           "third_party/freetype/src/src/psnames/pstables.h"
> +                           "third_party/glslang-angle"
> +                           "third_party/google_input_tools"
> +                           "third_party/google_input_tools/third_party/closure_library"
> +                           (string-append "third_party/google_input_tools/third_party"
> +                                          "/closure_library/third_party/closure")
> +                           "third_party/googletest"
> +                           "third_party/harfbuzz-ng"
> +                           "third_party/hunspell"
> +                           "third_party/iccjpeg"
> +                           "third_party/inspector_protocol"
> +                           "third_party/jinja2"
> +                           "third_party/jstemplate"
> +                           "third_party/khronos"
> +                           "third_party/leveldatabase"
> +                           "third_party/libXNVCtrl"
> +                           "third_party/libaddressinput"
> +                           "third_party/libjingle_xmpp"
> +                           "third_party/libphonenumber"
> +                           "third_party/libsecret" ;FIXME: needs pkg-config support.
> +                           "third_party/libsrtp"   ;TODO: Requires libsrtp@2.
> +                           "third_party/libudev"
> +                           "third_party/libwebm"
> +                           "third_party/libxml"
> +                           "third_party/libyuv"
> +                           "third_party/lss"
> +                           "third_party/lzma_sdk"
> +                           "third_party/markupsafe"
> +                           "third_party/mesa"
> +                           "third_party/metrics_proto"
> +                           "third_party/modp_b64"
> +                           "third_party/mt19937ar"
> +                           "third_party/node"
> +                           (string-append "third_party/node/node_modules/"
> +                                          "polymer-bundler/lib/third_party/UglifyJS2")
> +                           "third_party/openmax_dl"
> +                           "third_party/ots"
> +                           "third_party/pdfium"
> +                           "third_party/pdfium/third_party"
> +                           "third_party/ply"
> +                           "third_party/polymer"
> +                           "third_party/protobuf"
> +                           "third_party/protobuf/third_party/six"
> +                           "third_party/qcms"
> +                           "third_party/sfntly"
> +                           "third_party/skia"
> +                           "third_party/skia/third_party/vulkan"
> +                           "third_party/skia/third_party/gif"
> +                           "third_party/smhasher"
> +                           "third_party/speech-dispatcher"
> +                           "third_party/spirv-headers"
> +                           "third_party/spirv-tools-angle"
> +                           "third_party/sqlite"
> +                           "third_party/swiftshader"
> +                           "third_party/swiftshader/third_party"
> +                           "third_party/usb_ids"
> +                           "third_party/usrsctp"
> +                           "third_party/vulkan"
> +                           "third_party/vulkan-validation-layers"
> +                           "third_party/WebKit"
> +                           "third_party/web-animations-js"
> +                           "third_party/webrtc"
> +                           "third_party/webrtc_overrides"
> +                           "third_party/widevine/cdm/widevine_cdm_version.h"
> +                           "third_party/widevine/cdm/widevine_cdm_common.h"
> +                           "third_party/woff2"
> +                           "third_party/xdg-utils"
> +                           "third_party/yasm/run_yasm.py"
> +                           "third_party/zlib/google"
> +                           "url/third_party/mozilla"
> +                           "v8/src/third_party/valgrind"
> +                           "v8/third_party/inspector_protocol"))))
> +
> +                    ;; This is an implementation of
> +                    ;; "build/linux/unbundle/remove_bundled_libraries.py".
> +                    ;; It traverses any "third_party" directory and deletes
> +                    ;; files that are:
> +                    ;; * not ending with ".gn" or ".gni"; or
> +                    ;; * not explicitly named as argument (folder or file).
> +                    ;; TODO: Remove empty directories.
> +                    (define (delete-files-except exceptions dir)
> +
> +                      (define (enter? name stat result)
> +                        (not (member name exceptions)))
> +
> +                      (define (leaf name stat result)
> +                        (let ((protected-files (make-regexp "\\.(gn|gyp)i?$"
> +                                                            regexp/icase)))
> +                          (unless (or (member name exceptions)
> +                                      (regexp-exec protected-files name))
> +                            (delete-file name))))
> +
> +                      (file-system-fold enter?
> +                                        leaf
> +                                        (lambda (dir stat result) result) ;down
> +                                        (lambda (dir stat result) result) ;up
> +                                        (lambda (dir stat result) result) ;skip
> +                                        (lambda (dir stat result) result) ;error
> +                                        #t
> +                                        dir))
> +
> +                    (for-each (lambda (third-party)
> +                                (delete-files-except preserved-files
> +                                                     third-party))
> +                              (find-files "." "^third_party$" #:directories? #t))
> +
> +                    ;; Replace GN files from third_party with shims for building
> +                    ;; against system libraries.  Keep this list in sync with
> +                    ;; "build/linux/unbundle/replace_gn_files.py".
> +                    (for-each (lambda (pair)
> +                                (let ((source (string-append
> +                                               "build/linux/unbundle/" (car pair)))
> +                                      (dest (cdr pair)))
> +                                  (copy-file source dest)))
> +                              (list
> +                               '("ffmpeg.gn" . "third_party/ffmpeg/BUILD.gn")
> +                               '("flac.gn" . "third_party/flac/BUILD.gn")
> +                               '("freetype.gn" . "third_party/freetype/BUILD.gn")
> +                               ;; FIXME: This is no longer supported since 63.
> +                               ;;'("harfbuzz-ng.gn" . "third_party/harfbuzz-ng/BUILD.gn")
> +                               '("icu.gn" . "third_party/icu/BUILD.gn")
> +                               '("libdrm.gn" . "third_party/libdrm/BUILD.gn")
> +                               '("libevent.gn" . "base/third_party/libevent/BUILD.gn")
> +                               '("libjpeg.gn" .
> +                                 "build/secondary/third_party/libjpeg_turbo/BUILD.gn")
> +                               '("libpng.gn" . "third_party/libpng/BUILD.gn")
> +                               '("libvpx.gn" . "third_party/libvpx/BUILD.gn")
> +                               '("libwebp.gn" . "third_party/libwebp/BUILD.gn")
> +                               '("libxml.gn" . "third_party/libxml/BUILD.gn") ;TODO
> +                               '("libxslt.gn" . "third_party/libxslt/BUILD.gn")
> +                               '("openh264.gn" . "third_party/openh264/BUILD.gn")
> +                               '("opus.gn" . "third_party/opus/BUILD.gn")
> +                               '("re2.gn" . "third_party/re2/BUILD.gn")
> +                               '("snappy.gn" . "third_party/snappy/BUILD.gn")
> +                               '("yasm.gn" . "third_party/yasm/yasm_assemble.gni")
> +                               '("zlib.gn" . "third_party/zlib/BUILD.gn")))
> +                    #t)))))
> +    (build-system gnu-build-system)
> +    (arguments
> +     `(#:tests? #f
> +       ;; FIXME: There is a "gn" option specifically for setting -rpath, but
> +       ;; it's not recognized when passed.
> +       #:validate-runpath? #f
> +       #:modules ((srfi srfi-26)
> +                  (ice-9 ftw)
> +                  (ice-9 regex)
> +                  (guix build gnu-build-system)
> +                  (guix build utils))
> +       #:phases
> +       (modify-phases %standard-phases
> +         (add-after 'unpack 'patch-stuff
> +           (lambda* (#:key inputs #:allow-other-keys)
> +             (substitute* "printing/cups_config_helper.py"
> +               (("cups_config =.*")
> +                (string-append "cups_config = '" (assoc-ref inputs "cups")
> +                               "/bin/cups-config'\n")))
> +
> +             (substitute*
> +                 '("base/process/launch_posix.cc"
> +                   "base/third_party/dynamic_annotations/dynamic_annotations.c"
> +                   "sandbox/linux/seccomp-bpf/sandbox_bpf.cc"
> +                   "sandbox/linux/services/credentials.cc"
> +                   "sandbox/linux/services/namespace_utils.cc"
> +                   "sandbox/linux/services/syscall_wrappers.cc"
> +                   "sandbox/linux/syscall_broker/broker_host.cc")
> +               (("include \"base/third_party/valgrind/") "include \"valgrind/"))
> +
> +             (for-each (lambda (file)
> +                         (substitute* file
> +                           ;; Fix opus include path.
> +                           ;; Do not substitute opus_private.h.
> +                           (("#include \"opus\\.h\"")
> +                            "#include \"opus/opus.h\"")
> +                           (("#include \"opus_custom\\.h\"")
> +                            "#include \"opus/opus_custom.h\"")
> +                           (("#include \"opus_defines\\.h\"")
> +                            "#include \"opus/opus_defines.h\"")
> +                           (("#include \"opus_multistream\\.h\"")
> +                            "#include \"opus/opus_multistream.h\"")
> +                           (("#include \"opus_types\\.h\"")
> +                            "#include \"opus/opus_types.h\"")))
> +                       (append (find-files "third_party/opus/src/celt")
> +                               (find-files "third_party/opus/src/src")
> +                               (find-files (string-append "third_party/webrtc/modules"
> +                                                          "/audio_coding/codecs/opus"))))
> +
> +             (substitute* "chrome/common/chrome_paths.cc"
> +               (("/usr/share/chromium/extensions")
> +                ;; TODO: Add ~/.guix-profile.
> +                "/run/current-system/profile/share/chromium/extensions"))

                   I don't know if I asked you about this in the past, but can you explain why you
                   picked the run dir? I have to re-read the Gentoo eclass and Nix integration for this.

> +
> +             (substitute*
> +                 "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h"
> +               (("include \"third_party/curl") "include \"curl"))
> +             (substitute* "media/base/decode_capabilities.cc"
> +               (("third_party/libvpx/source/libvpx/") ""))
> +
> +             ;; We don't cross compile most packages, so get rid of the
> +             ;; unnecessary ARCH-linux-gnu* prefix.
> +             (substitute* "build/toolchain/linux/BUILD.gn"
> +               (("aarch64-linux-gnu-") "")
> +               (("arm-linux-gnueabihf-") ""))
> +             #t))
> +         (replace 'configure
> +           (lambda* (#:key inputs outputs #:allow-other-keys)
> +             (let ((gn-flags
> +                    (list
> +                     ;; See tools/gn/docs/cookbook.md and
> +                     ;; https://www.chromium.org/developers/gn-build-configuration
> +                     ;; for usage.  Run "./gn args . --list" in the Release
> +                     ;; directory for an exhaustive list of supported flags.
> +                     "is_debug=false"
> +                     "is_official_build=false"
> +                     "is_clang=false"
> +                     "use_gold=false"
> +                     "use_lld=false"
> +                     "linux_use_bundled_binutils=false"
> +                     "use_custom_libcxx=false"
> +                     "use_sysroot=false"
> +                     "goma_dir=\"\""
> +                     "enable_precompiled_headers=false"
> +                     "enable_nacl=false"
> +                     "enable_nacl_nonsfi=false"
> +                     "use_allocator=\"none\"" ;don't use tcmalloc
> +                     "override_build_date=\"01 01 2000 05:00:00\""
> +                     "use_unofficial_version_number=false"
> +                     ;; Optimize for building everything at once, as opposed
> +                     ;; to incrementally for development.  See "docs/jumbo.md".
> +                     ;; XXX: On some systems this may trigger a compiler error.
> +                     ;;"use_jumbo_build=true"
> +                     ;; Disable debugging features to save space.
> +                     "remove_webcore_debug_symbols=true"
> +                     "enable_iterator_debugging=false"
> +                     ;; Some of the unbundled libraries throws deprecation
> +                     ;; warnings, etc.  Ignore it.
> +                     "treat_warnings_as_errors=false"
> +                     ;; Don't add any API keys.  End users can set them in the
> +                     ;; environment if desired.  See
> +                     ;; <https://www.chromium.org/developers/how-tos/api-keys>.
> +                     "use_official_google_api_keys=false"
> +                     ;; Disable "field trials".
> +                     "fieldtrial_testing_like_official_build=true"
> +
> +                     "use_system_freetype=true"
> +                     "use_system_harfbuzz=true"
> +                     "use_system_libjpeg=true"
> +                     "use_system_lcms2=true"
> +                     "use_system_zlib=true"
> +                     ;; This is currently not supported on Linux:
> +                     ;; https://bugs.chromium.org/p/chromium/issues/detail?id=22208
> +                     ;;"use_system_sqlite=true"
> +
> +                     "use_gconf=false"         ;deprecated by gsettings
> +                     "use_gnome_keyring=false" ;deprecated by libsecret
> +                     "use_gtk3=true"
> +                     "use_openh264=true"
> +                     "use_xkbcommon=true"
> +                     "link_pulseaudio=true"
> +
> +                     ;; Don't arbitrarily restrict formats supported by system ffmpeg.
> +                     "proprietary_codecs=true"
> +                     "ffmpeg_branding=\"Chrome\""
> +
> +                     ;; WebRTC stuff.
> +                     "rtc_use_h264=true"
> +                     ;; Don't use bundled sources.
> +                     "rtc_build_json=false"
> +                     "rtc_build_libevent=false"
> +                     "rtc_build_libvpx=false"
> +                     "rtc_build_opus=false"
> +                     "rtc_build_ssl=false"
> +                     ;; TODO: Package these.
> +                     "rtc_build_libsrtp=true" ;2.0
> +                     "rtc_build_libyuv=true"
> +                     "rtc_build_openmax_dl=true"
> +                     "rtc_build_usrsctp=true"
> +                     (string-append "rtc_jsoncpp_root=\""
> +                                    (assoc-ref inputs "jsoncpp")
> +                                    "/include/jsoncpp/json\"")
> +                     (string-append "rtc_ssl_root=\""
> +                                    (assoc-ref inputs "openssl")
> +                                    "/include/openssl\""))))
> +
> +               ;; XXX: How portable is this.

                  Can you extend this comment?

> +               (mkdir-p "third_party/node/linux/node-linux-x64")
> +               (symlink (string-append (assoc-ref inputs "node") "/bin")
> +                        "third_party/node/linux/node-linux-x64/bin")
> +
> +               (setenv "CC" "gcc")
> +               (setenv "CXX" "g++")
> +               ;; TODO: pre-compile instead. Avoids a race condition.
> +               (setenv "PYTHONDONTWRITEBYTECODE" "1")
> +               (and
> +                ;; Build the "gn" tool.
> +                (invoke "python"
> +                        "tools/gn/bootstrap/bootstrap.py" "-s" "-v")
> +                ;; Generate ninja build files.
> +                (invoke "./out/Release/gn" "gen" "out/Release"
> +                        (string-append "--args="
> +                                       (string-join gn-flags " ")))))))
> +         (replace 'build
> +           (lambda* (#:key outputs #:allow-other-keys)
> +             (invoke "ninja" "-C" "out/Release"
> +                     "-j" (number->string (parallel-job-count))
> +                     "chrome")))
> +         (replace 'install
> +           (lambda* (#:key inputs outputs #:allow-other-keys)
> +             (let* ((out            (assoc-ref outputs "out"))
> +                    (bin            (string-append out "/bin"))
> +                    (exe            (string-append bin "/chromium"))
> +                    (lib            (string-append out "/lib"))
> +                    (man            (string-append out "/share/man/man1"))
> +                    (applications   (string-append out "/share/applications"))
> +                    (install-regexp (make-regexp "\\.(bin|pak)$"))
> +                    (locales        (string-append lib "/locales"))
> +                    (resources      (string-append lib "/resources"))
> +                    (gtk+           (assoc-ref inputs "gtk+"))
> +                    (mesa           (assoc-ref inputs "mesa"))
> +                    (nss            (assoc-ref inputs "nss"))
> +                    (udev           (assoc-ref inputs "udev"))
> +                    (sh             (which "sh")))
> +
> +               (substitute* '("chrome/app/resources/manpage.1.in"
> +                              "chrome/installer/linux/common/desktop.template")
> +                 (("@@MENUNAME@@") "Chromium")
> +                 (("@@PACKAGE@@") "chromium")
> +                 (("/usr/bin/@@USR_BIN_SYMLINK_NAME@@") exe))
> +               (mkdir-p man)
> +               (copy-file "chrome/app/resources/manpage.1.in"
> +                          (string-append man "/chromium.1"))
> +               (mkdir-p applications)
> +               (copy-file "chrome/installer/linux/common/desktop.template"
> +                          (string-append applications "/chromium.desktop"))
> +
> +               (with-directory-excursion "out/Release"
> +                 (for-each (lambda (file)
> +                             (install-file file lib))
> +                           (scandir "." (cut regexp-exec install-regexp <>)))
> +                 (copy-file "chrome" (string-append lib "/chromium"))
> +
> +                 ;; TODO: Install icons from "../../chrome/app/themes" into
> +                 ;; "out/share/icons/hicolor/$size".
> +                 (install-file
> +                  "product_logo_48.png"
> +                  (string-append out "/share/icons/48x48/chromium.png"))
> +
> +                 (copy-recursively "locales" locales)
> +                 (copy-recursively "resources" resources)
> +
> +                 (mkdir-p bin)
> +                 ;; Add a thin wrapper to prevent the user from inadvertently
> +                 ;; installing non-free software through the Web Store.
> +                 ;; TODO: Discover extensions from the profile and pass
> +                 ;; something like "--disable-extensions-except=...".

                    To be able to work on this, can you (at least in this bug ticket,
                    explain the TODO part a bit more?

> +                 (call-with-output-file exe
> +                   (lambda (port)
> +                     (format port
> +                             "#!~a~@
> +                             if [ -z \"$CHROMIUM_ENABLE_WEB_STORE\" ]~@
> +                             then~@
> +                               CHROMIUM_FLAGS=\" \\~@
> +                                 --disable-background-networking \\~@
> +                                 --disable-extensions \\~@
> +                               \"~@
> +                             fi~@
> +                             exec ~a $CHROMIUM_FLAGS \"$@\"~%"
> +                             sh (string-append lib "/chromium"))))
> +                 (chmod exe #o755)
> +
> +                 (wrap-program exe
> +                   ;; TODO: Get these in RUNPATH.
> +                   `("LD_LIBRARY_PATH" ":" prefix
> +                     (,(string-append lib ":" nss "/lib/nss:" gtk+ "/lib:"
> +                                      mesa "/lib:" udev "/lib")))
> +                   ;; Avoid file manager crash.  See <https://bugs.gnu.org/26593>.
> +                   `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share"))))
> +                 #t)))))))
> +    (native-inputs
> +     `(("bison" ,bison)
> +       ("git" ,git)                     ;last_commit_position.py
> +       ("gperf" ,gperf)
> +       ("ninja" ,ninja)
> +       ("node" ,node)
> +       ("pkg-config" ,pkg-config)
> +       ("which" ,which)
> +       ("yasm" ,yasm)
> +
> +       ("python-beautifulsoup4" ,python2-beautifulsoup4)
> +       ("python-html5lib" ,python2-html5lib)
> +       ("python" ,python-2)))
> +    (inputs
> +     `(("alsa-lib" ,alsa-lib)
> +       ("atk" ,atk)
> +       ("cups" ,cups)
> +       ("curl" ,curl)
> +       ("dbus" ,dbus)
> +       ("dbus-glib" ,dbus-glib)
> +       ("expat" ,expat)
> +       ("flac" ,flac)
> +       ("ffmpeg" ,ffmpeg)
> +       ("fontconfig" ,fontconfig)
> +       ("freetype" ,freetype)
> +       ("gdk-pixbuf" ,gdk-pixbuf)
> +       ("glib" ,glib)
> +       ("gtk+-2" ,gtk+-2)
> +       ("gtk+" ,gtk+)
> +       ("harfbuzz" ,harfbuzz)
> +       ("icu4c" ,icu4c)
> +       ("jsoncpp" ,jsoncpp)
> +       ("lcms" ,lcms)
> +       ("libevent" ,libevent)
> +       ("libffi" ,libffi)
> +       ("libjpeg-turbo" ,libjpeg-turbo)
> +       ("libpng" ,libpng)
> +       ("libusb" ,libusb)
> +       ("libvpx" ,libvpx+experimental)
> +       ("libwebp" ,libwebp)
> +       ("libx11" ,libx11)
> +       ("libxcb" ,libxcb)
> +       ("libxcomposite" ,libxcomposite)
> +       ("libxcursor" ,libxcursor)
> +       ("libxdamage" ,libxdamage)
> +       ("libxext" ,libxext)
> +       ("libxfixes" ,libxfixes)
> +       ("libxi" ,libxi)
> +       ("libxkbcommon" ,libxkbcommon)
> +       ("libxml2" ,libxml2)
> +       ("libxrandr" ,libxrandr)
> +       ("libxrender" ,libxrender)
> +       ("libxscrnsaver" ,libxscrnsaver)
> +       ("libxslt" ,libxslt)
> +       ("libxtst" ,libxtst)
> +       ("mesa" ,mesa)
> +       ("minizip" ,minizip)
> +       ("mit-krb5" ,mit-krb5)
> +       ("nss" ,nss)
> +       ("openh264" ,openh264)
> +       ("openssl" ,openssl)
> +       ("opus" ,opus+custom)
> +       ("pango" ,pango)
> +       ("pciutils" ,pciutils)
> +       ("protobuf" ,protobuf)
> +       ("pulseaudio" ,pulseaudio)
> +       ("re2" ,re2)
> +       ("snappy" ,snappy)
> +       ("speech-dispatcher" ,speech-dispatcher)
> +       ("sqlite" ,sqlite)
> +       ("udev" ,eudev)
> +       ("valgrind" ,valgrind)))
> +    (home-page "https://www.chromium.org/")
> +    (description
> +     "Chromium is a web browser designed for speed and security.  This
> +version incorporates patches from
> +@url{https://github.com/gcarq/inox-patchset,Inox} and
> +@url{https://www.debian.org/,Debian} in order to protect the users privacy.")
> +    ;; Chromium is developed as BSD-3, but bundles a large number of third-party
> +    ;; components with other licenses.  For full information, see chrome://credits.
> +    (license (list license:bsd-3
> +                   license:bsd-2
> +                   license:expat
> +                   license:asl2.0
> +                   license:mpl2.0
> +                   license:public-domain
> +                   license:lgpl2.1+))))
> diff --git a/gnu/packages/patches/chromium-gcc5.patch b/gnu/packages/patches/chromium-gcc5.patch
> new file mode 100644
> index 000000000..56b2cd6ef
> --- /dev/null
> +++ b/gnu/packages/patches/chromium-gcc5.patch
> @@ -0,0 +1,39 @@
> +Work around a GCC5 bug where it fails to choose the correct base::span
> +constructor.
> +
> +Adapted from this commit:
> +https://gitweb.gentoo.org/repo/gentoo.git/commit/www-client/chromium?id=7843d29ab07411a9c70962fb90b4cd1546910242
> +
> +--- a/gpu/ipc/common/mailbox_struct_traits.h
> ++++ b/gpu/ipc/common/mailbox_struct_traits.h
> +@@ -15,7 +15,7 @@ namespace mojo {
> + template <>
> + struct StructTraits<gpu::mojom::MailboxDataView, gpu::Mailbox> {
> +   static base::span<const int8_t> name(const gpu::Mailbox& mailbox) {
> +-    return mailbox.name;
> ++    return base::make_span(mailbox.name);
> +   }
> +   static bool Read(gpu::mojom::MailboxDataView data, gpu::Mailbox* out);
> + };
> +--- a/services/viz/public/cpp/compositing/filter_operation_struct_traits.h
> ++++ b/services/viz/public/cpp/compositing/filter_operation_struct_traits.h
> +@@ -134,7 +134,7 @@ struct StructTraits<viz::mojom::FilterOperationDataView, cc::FilterOperation> {
> +   static base::span<const float> matrix(const cc::FilterOperation& operation) {
> +     if (operation.type() != cc::FilterOperation::COLOR_MATRIX)
> +       return base::span<const float>();
> +-    return operation.matrix();
> ++    return base::make_span(operation.matrix());
> +   }
> +
> +   static base::span<const gfx::Rect> shape(
> +--- a/services/viz/public/cpp/compositing/quads_struct_traits.h
> ++++ b/services/viz/public/cpp/compositing/quads_struct_traits.h
> +@@ -308,7 +308,7 @@
> +   static base::span<const float> vertex_opacity(const viz::DrawQuad& input) {
> +     const viz::TextureDrawQuad* quad =
> +         viz::TextureDrawQuad::MaterialCast(&input);
> +-    return quad->vertex_opacity;
> ++    return base::make_span(quad->vertex_opacity);
> +   }
> + 
> +   static bool y_flipped(const viz::DrawQuad& input) {
> diff --git a/gnu/packages/patches/chromium-remove-default-history.patch b/gnu/packages/patches/chromium-remove-default-history.patch
> new file mode 100644
> index 000000000..38be10820
> --- /dev/null
> +++ b/gnu/packages/patches/chromium-remove-default-history.patch
> @@ -0,0 +1,13 @@
> +Don't pre-populate the New Tab Page for new profiles.
> +
> +--- a/chrome/browser/history/top_sites_factory.cc
> ++++ b/chrome/browser/history/top_sites_factory.cc
> +@@ -74,7 +74,7 @@
> + 
> + void InitializePrepopulatedPageList(
> +     history::PrepopulatedPageList* prepopulated_pages) {
> +-#if !defined(OS_ANDROID)
> ++#if false
> +   DCHECK(prepopulated_pages);
> +   prepopulated_pages->reserve(arraysize(kRawPrepopulatedPages));
> +   for (size_t i = 0; i < arraysize(kRawPrepopulatedPages); ++i) {
> -- 
> 2.16.2
> 

Otherwise, LGTM.
-- 
A88C8ADD129828D7EAC02E52E22F9BBFEE348588
https://n0.is