;;; 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.
;;;
#: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)
#: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 kerberos)
#:use-module (gnu packages ninja)
#:use-module (gnu packages node)
+ #:use-module (gnu packages nss)
#:use-module (gnu packages pciutils)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages pulseaudio)
#: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
"chrome/third_party/mozilla_security_manager" ;MPL-1.1/GPL2+/LGPL2.1+
"courgette/third_party/bsdiff" ;BSD-2, BSD protection license
"courgette/third_party/divsufsort" ;Expat
- "net/third_party/http2" ;BSD-3
"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/spdy" ;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/src/third_party/compiler" ;BSD-2
"third_party/angle/src/third_party/libXNVCtrl" ;Expat
"third_party/angle/src/third_party/trace_event" ;BSD-3
- "third_party/angle/third_party/glslang" ;BSD-3
- "third_party/angle/third_party/spirv-headers" ;Expat
- "third_party/angle/third_party/spirv-tools" ;Expat
"third_party/angle/third_party/vulkan-headers" ;ASL2.0
"third_party/angle/third_party/vulkan-loader" ;ASL2.0
"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/fips181" ;BSD-3
+ "third_party/emoji-segmenter" ;ASL2.0
"third_party/flatbuffers" ;ASL2.0
+ "third_party/glslang" ;BSD-3, Expat, ASL2.0
"third_party/google_input_tools" ;ASL2.0
"third_party/google_input_tools/third_party/closure_library" ;ASL2.0
"third_party/google_input_tools/third_party/closure_library/third_party/closure" ;Expat
"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
"third_party/yasm/run_yasm.py" ;BSD-2 or BSD-3
"third_party/zlib/google" ;BSD-3
"url/third_party/mozilla" ;BSD-3, MPL1.1/GPL2+/LGPL2.1+
+ "v8/src/third_party/siphash" ;Public domain
"v8/src/third_party/utf8-decoder" ;Expat
"v8/src/third_party/valgrind" ;BSD-4
"v8/third_party/inspector_protocol" ;BSD-3
(mlet %store-monad ((guile (package->derivation guile system)))
(gexp->derivation (or name "computed-origin")
(force gexp-promise)
+ #:graft? #f ;nothing to graft
#:system system
#:guile-for-build guile)))
-(define %chromium-version "72.0.3626.109")
-(define %ungoogled-revision "a58db880c15e5077e881cad7b07d1a277ecd463a")
+(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:
-;; 1) Runs the Ungoogled scripts on a pristine Chromium tarball.
-;; 2) Prunes all third_party folders that are not explicitly preserved.
-;; 3) Adjusts "GN" build files such that system libraries are preferred.
+;; *) 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
- "0bcc0iksk2v30drwd5zbw7v6sfbw16jqllc12ks2nifrvh058jjp"))))
- (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
- "19w60b71rcccp32b7rcpw75kfg4sw2xfr32rfk0hcyaj5rq0mm69")))))
-
+ (let ((chromium-source %chromium-origin)
+ (ungoogled-source %ungoogled-origin)
+ (debian-source %debian-origin))
(origin
(method computed-origin-method)
- (file-name (string-append "ungoogled-chromium-" %chromium-version ".tar.xz"))
+ (file-name (string-append "ungoogled-chromium-" %package-version ".tar.xz"))
(sha256 #f)
(uri
(delay
(with-imported-modules '((guix build utils))
#~(begin
- (use-modules (guix build utils))
+ (use-modules (guix build utils)
+ (ice-9 rdelim)
+ (srfi srfi-1)
+ (srfi srfi-26))
(let ((chromium-dir (string-append "chromium-" #$%chromium-version))
(preserved-files (list #$@%preserved-third-party-files)))
(with-directory-excursion "/tmp/ungoogled"
- ;; Create a custom "bundle" that inherits from linux_rooted
- ;; and adds an additional patch.
- (format #t "Creating Guix config bundle...~%")
- (force-output)
- (mkdir-p "config_bundles/guix")
- (call-with-output-file "config_bundles/guix/bundlemeta.ini"
- (lambda (port)
- (format port
- "[bundle]
-display_name = GNU Guix
-depends = linux_rooted\n")))
- (call-with-output-file "config_bundles/guix/patch_order.list"
- (lambda (port)
- (format port "debian_buster/system/openjpeg.patch\n")))
-
(format #t "Unpacking chromium tarball...~%")
(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" "run_buildkit_cli.py" "prune"
- "-b" "config_bundles/guix" chromium-dir)
- (invoke "python3" "run_buildkit_cli.py" "patches" "apply"
- "-b" "config_bundles/guix" chromium-dir)
- (invoke "python3" "run_buildkit_cli.py" "domains" "apply"
- "-b" "config_bundles/linux_rooted"
+ (invoke "python3" "utils/prune_binaries.py" chromium-dir
+ "pruning.list")
+ (invoke "python3" "utils/patches.py" "apply"
+ chromium-dir "patches")
+ (invoke "python3" "utils/domain_substitution.py" "apply" "-r"
+ "domain_regex.list" "-f" "domain_substitution.list"
"-c" "/tmp/domainscache.tar.gz" chromium-dir)
(with-directory-excursion chromium-dir
+
+ (format #t "applying Debian patches...~%")
+ (force-output)
+ (let* ((debian #+debian-source)
+ (patches (string-append debian "/debian/patches"))
+ (series (string-append patches "/series")))
+ (with-input-from-file series
+ (lambda ()
+ (let loop ((line (read-line)))
+ (unless (eof-object? line)
+ (when (and (> (string-length line) 1)
+ ;; Skip the Debian-specific ones.
+ (not (string-prefix? "debianization/" line))
+ (not (string-prefix? "buster/" line))
+ (not (any (cute string-suffix? <> line)
+ ;; These conflict with Ungoogled.
+ '("widevine-buildflag.patch"
+ "signin.patch"
+ "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"))
+ (loop (read-line)))))))
+
(format #t "Pruning third party files...~%")
(force-output)
(apply invoke "python"
- "build/linux/unbundle/remove_bundled_libraries.py"
- "--do-remove" preserved-files)
+ "build/linux/unbundle/remove_bundled_libraries.py"
+ "--do-remove" preserved-files)
(format #t "Replacing GN files...~%")
(force-output)
`(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")
- (version %chromium-version)
+ (version %package-version)
(synopsis "Graphical web browser")
(source ungoogled-chromium-source)
(build-system gnu-build-system)
"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"
"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"
"use_system_lcms2=true"
"use_system_libdrm=true"
"use_system_libjpeg=true"
+ "use_system_libopenjpeg2=true"
"use_system_libpng=true"
"use_system_zlib=true"
"use_gnome_keyring=false" ;deprecated by libsecret
"use_openh264=true"
"use_pulseaudio=true"
"link_pulseaudio=true"
- "use_vaapi=true"
- ;; Don't arbitrarily restrict formats supported by system ffmpeg.
+ ;; VA-API acceleration is currently only supported on x86_64-linux.
+ ,@(if (string-prefix? "x86_64" (or (%current-target-system)
+ (%current-system)))
+ '("use_vaapi=true")
+ '())
+
+ ;; Do not artifically restrict formats supported by system ffmpeg.
"proprietary_codecs=true"
"ffmpeg_branding=\"Chrome\""
;; 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\""))
(substitute* "third_party/webrtc/rtc_base/strings/json.h"
(("#include \"third_party/jsoncpp/") "#include \"json/"))
- (substitute* "media/base/decode_capabilities.cc"
- (("third_party/libvpx/source/libvpx/") ""))
-
- (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/") ""))
+
;; Building chromedriver embeds some files using the ZIP
;; format which doesn't support timestamps before
;; 1980. Therefore, advance the timestamps of the files
(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")
;; 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
(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)
(,(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)
("libjpeg-turbo" ,libjpeg-turbo)
("libpng" ,libpng)
("libva" ,libva)
- ("libvpx" ,libvpx)
+ ("libvpx" ,libvpx/chromium)
("libwebp" ,libwebp)
("libx11" ,libx11)
("libxcb" ,libxcb)
("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
(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)))))))