gnu: Add cl-ana.statistical-learning.
[jackhill/guix/guix.git] / gnu / packages / chromium.scm
index 41cc10a..9d194de 100644 (file)
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2019 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2019 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -35,6 +36,7 @@
   #:use-module (gnu packages cups)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages gl)
@@ -70,7 +72,8 @@
   #:use-module (gnu packages xorg))
 
 (define %preserved-third-party-files
-  '("base/third_party/dmg_fp" ;X11-style
+  '("base/third_party/cityhash" ;Expat
+    "base/third_party/double_conversion" ;BSD-3
     "base/third_party/dynamic_annotations" ;BSD-2
     "base/third_party/icu" ;Unicode, X11-style
     "base/third_party/superfasthash" ;BSD-3
@@ -82,7 +85,7 @@
     "courgette/third_party/divsufsort" ;Expat
     "net/third_party/mozilla_security_manager" ;MPL-1.1/GPL2+/LGPL2.1+
     "net/third_party/nss" ;MPL-2.0
-    "net/third_party/quic" ;BSD-3
+    "net/third_party/quiche" ;BSD-3
     "net/third_party/uri_template" ;ASL2.0
     "third_party/abseil-cpp" ;ASL2.0
     "third_party/adobe/flash/flapper_version.h" ;no license, trivial
     "third_party/angle/third_party/vulkan-tools" ;ASL2.0
     "third_party/angle/third_party/vulkan-validation-layers" ;ASL2.0
     "third_party/apple_apsl" ;APSL2.0
+    "third_party/axe-core" ;MPL2.0
     "third_party/blink" ;BSD-3, LGPL2+
     "third_party/boringssl" ;OpenSSL/ISC (Google additions are ISC)
     "third_party/boringssl/src/third_party/fiat" ;Expat
+    "third_party/boringssl/src/third_party/sike" ;Expat
+    ;; XXX: these files are generated by fp-$arch.pl in the above directory.
+    "third_party/boringssl/linux-aarch64/crypto/third_party/sike/asm/fp-armv8.S"
+    "third_party/boringssl/linux-x86_64/crypto/third_party/sike/asm/fp-x86_64.S"
     "third_party/breakpad" ;BSD-3
     "third_party/brotli" ;Expat
     "third_party/cacheinvalidation" ;ASL2.0
     "third_party/catapult/tracing/third_party/pako" ;Expat
     "third_party/ced" ;BSD-3
     "third_party/cld_3" ;ASL2.0
+    "third_party/closure_compiler" ;ASL2.0
     "third_party/crashpad" ;ASL2.0
+    "third_party/crashpad/crashpad/third_party/lss" ;ASL2.0
     "third_party/crashpad/crashpad/third_party/zlib/zlib_crashpad.h" ;Zlib
     "third_party/crc32c" ;BSD-3
     "third_party/cros_system_api" ;BSD-3
     "third_party/dav1d" ;BSD-2
+    "third_party/dawn" ;ASL2.0
+    "third_party/depot_tools/owners.py" ;BSD-3
     "third_party/dom_distiller_js" ;BSD-3
     "third_party/emoji-segmenter" ;ASL2.0
-    "third_party/fips181" ;BSD-3
     "third_party/flatbuffers" ;ASL2.0
     "third_party/glslang" ;BSD-3, Expat, ASL2.0
     "third_party/google_input_tools" ;ASL2.0
     "third_party/nasm" ;BSD-2
     "third_party/node" ;Expat
     "third_party/node/node_modules/polymer-bundler/lib/third_party/UglifyJS2" ;BSD-2
+    "third_party/one_euro_filter" ;BSD-3
+    "third_party/openscreen" ;BSD-3
+    "third_party/openscreen/src/third_party/tinycbor" ;Expat
     "third_party/ots" ;BSD-3
     "third_party/pdfium" ;BSD-3
     "third_party/pdfium/third_party/agg23" ;Expat
     "third_party/pdfium/third_party/bigint" ;Public domain, BSD-3
     "third_party/pdfium/third_party/skia_shared" ;BSD-3
     "third_party/pdfium/third_party/freetype/include/pstables.h" ;FreeType
+    "third_party/pffft" ;the "FFTPACK" license, similar to BSD-3
     "third_party/ply" ;BSD-3
     "third_party/polymer" ;BSD-3
+    "third_party/private-join-and-compute" ;ASL2.0
     "third_party/protobuf" ;BSD-3
     "third_party/protobuf/third_party/six" ;Expat
     "third_party/pyjson5" ;ASL2.0
     "third_party/s2cellid" ;ASL2.0
     "third_party/sfntly" ;ASL2.0
     "third_party/skia" ;BSD-3
+    "third_party/skia/include/third_party/skcms" ;BSD-3
     "third_party/skia/third_party/gif" ;MPL1.1/GPL2+/LGPL2.1+
     "third_party/skia/third_party/skcms" ;BSD-3
-    "third_party/skia/third_party/vulkan" ;BSD-3
+    "third_party/skia/third_party/vulkanmemoryallocator" ;BSD-3, Expat
     "third_party/smhasher" ;Expat, public domain
     "third_party/speech-dispatcher" ;GPL2+
     "third_party/spirv-headers" ;ASL2.0
     "third_party/ungoogled" ;BSD-3
     "third_party/usb_ids" ;BSD-3
     "third_party/usrsctp" ;BSD-2
+    "third_party/wayland/wayland_scanner_wrapper.py" ;BSD-3
+    "third_party/wayland-protocols" ;Expat
     "third_party/web-animations-js" ;ASL2.0
     "third_party/webdriver" ;ASL2.0
     "third_party/webrtc" ;BSD-3
@@ -223,54 +242,66 @@ from forcing GEXP-PROMISE."
                       #:system system
                       #:guile-for-build guile)))
 
-(define %chromium-version "74.0.3729.131")
-(define %ungoogled-revision "9e33022f3ac7de2a12e3c7a7923799c9bbbf8194")
-(define %debian-revision "debian/74.0.3729.108-1")
+(define %chromium-version "78.0.3904.108")
+(define %ungoogled-revision "8f065138317a6152b20decc224027a5192ba76b1")
+(define %debian-revision "e43d74632091324774a5049668782dba7b09cf72")
 (define package-revision "0")
-
 (define %package-version (string-append %chromium-version "-"
                                         package-revision "."
                                         (string-take %ungoogled-revision 7)))
 
+(define %chromium-origin
+  (origin
+    (method url-fetch)
+    (uri (string-append "https://commondatastorage.googleapis.com"
+                        "/chromium-browser-official/chromium-"
+                        %chromium-version ".tar.xz"))
+    (sha256
+     (base32
+      "03jvfz68nvmmrplygf96sh0l347p4h03c8vpw8yrglh6ycwkiigr"))))
+
+(define %ungoogled-origin
+  (origin
+    (method git-fetch)
+    (uri (git-reference (url "https://github.com/Eloston/ungoogled-chromium")
+                        (commit %ungoogled-revision)))
+    (file-name (git-file-name "ungoogled-chromium"
+                              (string-take %ungoogled-revision 7)))
+    (sha256
+     (base32
+      "0zix90jz82hpym9jmyf99yw19swaf13ps6szi60wccmz1gccv77g"))))
+
+(define %debian-origin
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://salsa.debian.org/chromium-team/chromium.git")
+          (commit %debian-revision)))
+    (file-name (git-file-name "debian-chromium-packaging"
+                              (if (string-prefix? "debian/" %debian-revision)
+                                  (cadr (string-split %debian-revision #\/))
+                                  (string-take %debian-revision 7))))
+    (sha256
+     (base32
+      "1l1ajjkn1y7ql5w4zb3c3vw57hkydvy1mac7y81rycx4g5djasaz"))))
+
+(define (gentoo-patch name hash revision)
+  (origin
+    (method url-fetch)
+    (uri (string-append "https://gitweb.gentoo.org/repo/gentoo.git/plain"
+                        "/www-client/chromium/files/" name "?id=" revision))
+    (file-name name)
+    (sha256 (base32 hash))))
+
 ;; This is a "computed" origin that does the following:
 ;; *) Runs the Ungoogled scripts on a pristine Chromium tarball.
 ;; *) Applies Debians Chromium patches, for their unbundling and GCC work.
 ;; *) Prunes all third_party directories that are not explicitly preserved.
 ;; *) Adjusts "GN" build files such that system libraries are preferred.
 (define ungoogled-chromium-source
-  (let ((chromium-source
-         (origin
-           (method url-fetch)
-           (uri (string-append "https://commondatastorage.googleapis.com"
-                               "/chromium-browser-official/chromium-"
-                               %chromium-version ".tar.xz"))
-           (sha256
-            (base32
-             "11m9mlzrqzmz7rhl0ff7lry2s4yjrdkfi36qfv48m1cg5y2cfy6i"))))
-        (ungoogled-source
-         (origin
-           (method git-fetch)
-           (uri (git-reference (url "https://github.com/Eloston/ungoogled-chromium")
-                               (commit %ungoogled-revision)))
-           (file-name (git-file-name "ungoogled-chromium"
-                                     (string-take %ungoogled-revision 7)))
-           (sha256
-            (base32
-             "08whx582p3a2nivkj7kwin09a8acybr00z6344smb9xjlxy9rkp4"))))
-        (debian-source
-         (origin
-           (method git-fetch)
-           (uri (git-reference
-                 (url "https://salsa.debian.org/chromium-team/chromium.git")
-                 (commit %debian-revision)))
-           (file-name (git-file-name "debian-chromium-packaging"
-                                     (if (string-prefix? "debian/" %debian-revision)
-                                         (cadr (string-split %debian-revision #\/))
-                                         (string-take %debian-revision 7))))
-           (sha256
-            (base32
-             "1bn0c86sxkkxgdz0i88y0zh4zr39l6379r2rhgk3b3qbvwz25s3j")))))
-
+  (let ((chromium-source %chromium-origin)
+        (ungoogled-source %ungoogled-origin)
+        (debian-source %debian-origin))
     (origin
       (method computed-origin-method)
       (file-name (string-append "ungoogled-chromium-" %package-version ".tar.xz"))
@@ -302,6 +333,12 @@ from forcing GEXP-PROMISE."
                    (force-output)
                    (invoke "tar" "xf" #+chromium-source)
 
+                   ;; Ungoogled-Chromium contains a forked subset of the Debian
+                   ;; patches.  Disable those, as we apply newer versions later.
+                   (substitute* "patches/series"
+                     ((".*/debian_buster/.*")
+                      ""))
+
                    (format #t "Ungooglifying...~%")
                    (force-output)
                    (invoke "python3" "utils/prune_binaries.py" chromium-dir
@@ -318,16 +355,7 @@ from forcing GEXP-PROMISE."
                      (force-output)
                      (let* ((debian  #+debian-source)
                             (patches (string-append debian "/debian/patches"))
-                            (series  (string-append patches "/series"))
-                            (grep-q (lambda (query file)
-                                      (with-input-from-file file
-                                        (lambda ()
-                                          (let loop ((line (read-line))
-                                                     (match #f))
-                                            (if (or match (eof-object? line))
-                                                (if match #t #f)
-                                                (loop (read-line)
-                                                      (string-contains line query)))))))))
+                            (series  (string-append patches "/series")))
                        (with-input-from-file series
                          (lambda ()
                            (let loop ((line (read-line)))
@@ -335,15 +363,28 @@ from forcing GEXP-PROMISE."
                                (when (and (> (string-length line) 1)
                                           ;; Skip the Debian-specific ones.
                                           (not (string-prefix? "debianization/" line))
-                                          (not (string-prefix? "gcc6/" line))
-                                          ;; And those that conflict with Ungoogled.
+                                          (not (string-prefix? "buster/" line))
                                           (not (any (cute string-suffix? <> line)
+                                                    ;; These conflict with Ungoogled.
                                                     '("widevine-buildflag.patch"
                                                       "signin.patch"
-                                                      "third-party-cookies.patch")))
-                                          ;; Ungoogled includes a subset of the Debian
-                                          ;; patches.  Exclude those already present.
-                                          (not (grep-q line "../patches/series")))
+                                                      "third-party-cookies.patch"
+
+                                                      ;; Disable workarounds for the
+                                                      ;; Chromium "-lite" tarball.  We
+                                                      ;; use the "full" version and don't
+                                                      ;; need these patches.
+                                                      "closure.patch"
+                                                      "owners.patch"
+
+                                                      ;; XXX: 'fixes/inspector.patch'
+                                                      ;; makes v8 reuse the top-level
+                                                      ;; third_party/inspector_protocol
+                                                      ;; instead of its own bundled copy,
+                                                      ;; but that does not work here for
+                                                      ;; some reason.  Ignore that patch
+                                                      ;; and those that depend on it.
+                                                      "inspector.patch"))))
                                  (invoke "patch" "--force" "-p1" "--input"
                                          (string-append patches "/" line)
                                          "--no-backup-if-mismatch"))
@@ -388,6 +429,21 @@ from forcing GEXP-PROMISE."
         `(cons "--enable-custom-modes"
                ,flags))))))
 
+;; Chromium 78 requires libvpx features that are not in any release.
+(define libvpx/chromium
+  (package/inherit
+   libvpx
+   (version "m78-3904")
+   (source (origin
+             (inherit (package-source libvpx))
+             (uri (git-reference
+                   (url "https://chromium.googlesource.com/webm/libvpx")
+                   (commit version)))
+             (file-name (git-file-name "libvpx" version))
+             (sha256
+              (base32
+               "1pphjfmg0aqq93n5cq790884v1h84di8p9mk3r28sm053wszhm7g"))))))
+
 (define-public ungoogled-chromium
   (package
     (name "ungoogled-chromium")
@@ -434,6 +490,7 @@ from forcing GEXP-PROMISE."
              "enable_reporting=false"
              "enable_service_discovery=false"
              "enable_swiftshader=false"
+             "enable_vr=false"
              "enable_widevine=false"
              ;; Disable type-checking for the Web UI to avoid a Java dependency.
              "closure_compile=false"
@@ -446,12 +503,14 @@ from forcing GEXP-PROMISE."
              "is_clang=false"
              ;; Disable debugging features to save space.  These are normally
              ;; pulled in by "is_official_build", but that requires "is_clang".
-             "blink_symbol_level=0"
              "enable_iterator_debugging=false"
              "exclude_unwind_tables=true"
              ;; Optimize for building everything at once, as opposed to
              ;; incrementally for development.  See "docs/jumbo.md".
              "use_jumbo_build=true"
+             ;; The default file merge limit of 50 requires huge amounts of RAM.
+             ;; Cap it to make sure the build succeeds on commodity hardware.
+             "jumbo_file_merge_limit=8"
 
              ;; Prefer system libraries.
              "use_system_freetype=true"
@@ -473,7 +532,7 @@ from forcing GEXP-PROMISE."
                    '("use_vaapi=true")
                    '())
 
-             ;; Don't arbitrarily restrict formats supported by system ffmpeg.
+             ;; Do not artifically restrict formats supported by system ffmpeg.
              "proprietary_codecs=true"
              "ffmpeg_branding=\"Chrome\""
 
@@ -534,8 +593,14 @@ from forcing GEXP-PROMISE."
                 ;; TODO: Add ~/.guix-profile.
                 "/run/current-system/profile/share/chromium/extensions"))
 
+             ;; Many files try to include ICU headers from "third_party/icu/...".
+             ;; Remove the "third_party/" prefix to use system headers instead.
+             (substitute* (find-files "chrome" "\\.cc$")
+               (("third_party/icu/source/(common|i18n)/")
+                ""))
+
              ;; XXX: Should be unnecessary when use_system_lcms2=true.
-             (substitute* "third_party/pdfium/core/fxcodec/codec/ccodec_iccmodule.h"
+             (substitute* "third_party/pdfium/core/fxcodec/icc/iccmodule.h"
                (("include \"third_party/lcms/include/lcms2\\.h\"")
                 "include \"lcms2.h\""))
 
@@ -546,12 +611,12 @@ from forcing GEXP-PROMISE."
              (substitute* "third_party/webrtc/rtc_base/strings/json.h"
                (("#include \"third_party/jsoncpp/") "#include \"json/"))
 
-             (substitute* '("ui/gfx/skia_util.h"
+             (substitute* '("components/viz/common/gpu/vulkan_context_provider.h"
                             "components/viz/common/resources/resource_format_utils.h")
                (("third_party/vulkan/include/") ""))
 
              (substitute* "third_party/skia/include/gpu/vk/GrVkVulkan.h"
-               (("\\.\\./\\.\\./include/third_party/vulkan/") ""))
+               (("include/third_party/vulkan/") ""))
 
              ;; Building chromedriver embeds some files using the ZIP
              ;; format which doesn't support timestamps before
@@ -572,9 +637,8 @@ from forcing GEXP-PROMISE."
              (setenv "AR" "ar") (setenv "NM" "nm")
              (setenv "CC" "gcc") (setenv "CXX" "g++")
 
-             ;; Work around <https://bugs.gnu.org/30756>.
-             (unsetenv "C_INCLUDE_PATH")
-             (unsetenv "CPLUS_INCLUDE_PATH")
+             ;; Prevent GCC from optimizing away null pointer safety checks.
+             (setenv "CXXFLAGS" "-fno-delete-null-pointer-checks")
 
              ;; TODO: pre-compile instead. Avoids a race condition.
              (setenv "PYTHONDONTWRITEBYTECODE" "1")
@@ -596,10 +660,30 @@ from forcing GEXP-PROMISE."
                ;; their current status for convenience.
                (format #t "Dumping configure flags...\n")
                (invoke "gn" "args" "out/Release" "--list"))))
+         (add-before 'build 'increase-resource-limits
+           (lambda _
+             ;; XXX: Chromiums linking step requires a lot of simultaneous file
+             ;; accesses.  Having a too low ulimit will result in bogus linker
+             ;; errors such as "foo.a: error adding symbols: malformed archive".
+
+             ;; Try increasing the soft resource limit of max open files to 4096,
+             ;; or equal to the hard limit, whichever is lower.
+             (call-with-values (lambda () (getrlimit 'nofile))
+               (lambda (soft hard)
+                 (when (and soft (< soft 4096))
+                   (if hard
+                       (setrlimit 'nofile (min hard 4096) hard)
+                       (setrlimit 'nofile 4096 #f))
+                   (format #t
+                           "increased maximum number of open files from ~d to ~d~%"
+                           soft (if hard (min hard 4096) 4096)))))
+             #t))
          (replace 'build
-           (lambda* (#:key outputs #:allow-other-keys)
+           (lambda* (#:key (parallel-build? #t) #:allow-other-keys)
              (invoke "ninja" "-C" "out/Release"
-                     "-j" (number->string (parallel-job-count))
+                     "-j" (if parallel-build?
+                              (number->string (parallel-job-count))
+                              "1")
                      "chrome"
                      "chromedriver")))
          (replace 'install
@@ -643,12 +727,6 @@ from forcing GEXP-PROMISE."
                            (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)
 
@@ -662,8 +740,18 @@ from forcing GEXP-PROMISE."
                      (,(string-append lib ":" nss "/lib/nss:" mesa "/lib:"
                                       udev "/lib")))
                    ;; Avoid file manager crash.  See <https://bugs.gnu.org/26593>.
-                   `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share"))))
-                 #t)))))))
+                   `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share")))))
+
+               (with-directory-excursion "chrome/app/theme/chromium"
+                 (for-each
+                  (lambda (size)
+                    (let ((icons (string-append out "/share/icons/hicolor/"
+                                                size "x" size "/apps")))
+                      (mkdir-p icons)
+                      (copy-file (string-append "product_logo_" size ".png")
+                                 (string-append icons "/chromium.png"))))
+                  '("24" "48" "64" "128" "256")))
+               #t))))))
     (native-inputs
      `(("bison" ,bison)
        ("gcc" ,gcc-8)
@@ -705,7 +793,7 @@ from forcing GEXP-PROMISE."
        ("libjpeg-turbo" ,libjpeg-turbo)
        ("libpng" ,libpng)
        ("libva" ,libva)
-       ("libvpx" ,libvpx)
+       ("libvpx" ,libvpx/chromium)
        ("libwebp" ,libwebp)
        ("libx11" ,libx11)
        ("libxcb" ,libxcb)
@@ -738,6 +826,11 @@ from forcing GEXP-PROMISE."
        ("udev" ,eudev)
        ("valgrind" ,valgrind)
        ("vulkan-headers" ,vulkan-headers)))
+
+    ;; Building Chromium takes ... a very long time.  On a single core, a busy
+    ;; mid-end x86 system may need more than 24 hours to complete the build.
+    (properties '((timeout . 144000)))  ;40 hours
+
     (home-page "https://github.com/Eloston/ungoogled-chromium")
     (description
      "Ungoogled-Chromium is the Chromium web browser, with some functionality
@@ -755,3 +848,25 @@ disabled in order to protect the users privacy.")
                    (license:non-copyleft "chrome://credits"
                                          "See chrome://credits for more information.")
                    license:lgpl2.1+))))
+
+(define-public ungoogled-chromium/wayland
+  (package/inherit ungoogled-chromium
+    (name "ungoogled-chromium-wayland")
+    (inputs
+     `(("wayland" ,wayland)
+       ("wayland-protocols" ,wayland-protocols)
+       ,@(package-inputs ungoogled-chromium)))
+
+    (arguments
+     (substitute-keyword-arguments (package-arguments ungoogled-chromium)
+       ((#:configure-flags flags)
+        `(append (list "use_ozone=true"
+                       "ozone_platform_wayland=true"
+                       "ozone_auto_platforms=false"
+                       "use_xkbcommon=true"
+                       "use_system_minigbm=true"
+                       "use_system_libwayland=true"
+                       (string-append "system_wayland_scanner_path=\""
+                                      (assoc-ref %build-inputs "wayland")
+                                      "/bin/wayland-scanner\""))
+                 (delete "use_vaapi=true" ,flags)))))))