diff options
Diffstat (limited to 'gnu/packages/chromium.scm')
-rw-r--r-- | gnu/packages/chromium.scm | 888 |
1 files changed, 440 insertions, 448 deletions
diff --git a/gnu/packages/chromium.scm b/gnu/packages/chromium.scm index 768564d42e..ba352c533e 100644 --- a/gnu/packages/chromium.scm +++ b/gnu/packages/chromium.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2019, 2020, 2021 Marius Bakke <mbakke@fastmail.com> +;;; Copyright © 2019, 2020, 2021, 2022 Marius Bakke <marius@gnu.org> ;;; Copyright © 2019 Alex Griffin <a@ajgrf.com> ;;; ;;; This file is part of GNU Guix. @@ -110,8 +110,6 @@ "third_party/catapult" ;BSD-3 "third_party/catapult/common/py_vulcanize/third_party/rcssmin" ;ASL2.0 "third_party/catapult/common/py_vulcanize/third_party/rjsmin" ;ASL2.0 - "third_party/catapult/third_party/beautifulsoup4" ;Expat - "third_party/catapult/third_party/html5lib-python" ;Expat "third_party/catapult/third_party/polymer" ;BSD-3 "third_party/catapult/third_party/six" ;Expat ;; XXX: This is a minified version of <https://d3js.org/>. @@ -134,6 +132,7 @@ "third_party/cros_system_api" ;BSD-3 "third_party/dav1d" ;BSD-2 "third_party/dawn" ;ASL2.0 + "third_party/dawn/third_party/tint" "third_party/depot_tools/owners.py" ;BSD-3 "third_party/devtools-frontend" ;BSD-3 "third_party/devtools-frontend/src/front_end/third_party/acorn" ;Expat @@ -151,6 +150,7 @@ "third_party/devtools-frontend/src/front_end/third_party/wasmparser" ;ASL2.0 "third_party/devtools-frontend/src/third_party/pyjson5" ;ASL2.0 "third_party/devtools-frontend/src/third_party/typescript" ;ASL2.0 + "third_party/distributed_point_functions" ;ASL2.0 "third_party/dom_distiller_js" ;BSD-3 "third_party/eigen3" ;MPL2.0 "third_party/emoji-segmenter" ;ASL2.0 @@ -269,7 +269,6 @@ "third_party/tflite" ;ASL2.0 "third_party/tflite/src/third_party/eigen3" ;MPL2.0 "third_party/tflite/src/third_party/fft2d" ;ASL2.0 - "third_party/tflite-support" ;ASL2.0 "third_party/ukey2" ;ASL2.0 "third_party/usb_ids" ;BSD-3 "third_party/usrsctp" ;BSD-2 @@ -319,6 +318,14 @@ ;; run the Blink performance tests, just remove everything to save ~70MiB. '("third_party/blink/perf_tests")) +(define* (arch-patch name hash #:optional (revision %arch-revision)) + (origin + (method url-fetch) + (uri (string-append "https://raw.githubusercontent.com/archlinux" + "/svntogit-packages/" revision "/trunk/" name)) + (file-name (string-append "ungoogled-chromium-" name)) + (sha256 (base32 hash)))) + (define* (debian-patch name hash #:optional (revision %debian-revision)) (origin (method url-fetch) @@ -329,11 +336,14 @@ (string-append "ungoogled-chromium-" category "-" name)))) (sha256 (base32 hash)))) -(define %chromium-version "93.0.4577.82") +(define %chromium-version "97.0.4692.99") +(define %ungoogled-revision (string-append %chromium-version "-1")) +(define %arch-revision "db2157b84924ce84201a8245e68a02f7d55f6491") (define %debian-revision "debian/90.0.4430.85-1") -;; Note: use 'git describe --long' even for exact tags to placate the -;; custom version format for ungoogled-chromium. -(define %ungoogled-revision "93.0.4577.82-1-2-g3f62dbc") + +(define %arch-patches + (list (arch-patch "chromium-94-ffmpeg-roll.patch" + "1kiskdjr9v3d491sq0wdjxliflh2vq5700gbygcixayj8gkvdb2n"))) (define %debian-patches (list (debian-patch "fixes/nomerge.patch" @@ -351,7 +361,7 @@ (file-name (git-file-name "ungoogled-chromium" %ungoogled-revision)) (sha256 (base32 - "1n0bffmwrzp3g1zzsy6qq325mbp4yn629m5zlfyz261szhvl9rgw")))) + "1jgxpp3wl24hq39291mgmdwcxbarxg4rpa6il53k8z3rf6gd2s4i")))) (define %guix-patches (list (local-file @@ -359,9 +369,18 @@ (search-patch "ungoogled-chromium-extension-search-path.patch"))) (local-file (assume-valid-file-name + (search-patch "ungoogled-chromium-RUNPATH.patch"))) + (local-file + (assume-valid-file-name + (search-patch "ungoogled-chromium-accelerated-video-decode.patch"))) + (local-file + (assume-valid-file-name (search-patch "ungoogled-chromium-ffmpeg-compat.patch"))) (local-file (assume-valid-file-name + (search-patch "ungoogled-chromium-system-ffmpeg.patch"))) + (local-file + (assume-valid-file-name (search-patch "ungoogled-chromium-system-nspr.patch"))))) ;; This is a source 'snippet' that does the following: @@ -387,6 +406,13 @@ patch "--no-backup-if-mismatch")) (append '#+%debian-patches '#+%guix-patches)) + ;; These patches are "reversed"; i.e. they represent changes + ;; already present in the source, but which should be reverted. + (for-each (lambda (patch) + (invoke "patch" "-Rp1" "--force" "--input" + patch "--no-backup-if-mismatch")) + '#$%arch-patches) + (with-directory-excursion #+%ungoogled-origin (format #t "Ungooglifying...~%") (force-output) @@ -437,38 +463,15 @@ `(cons "--enable-custom-modes" ,flags)))))) -;; 'make-ld-wrapper' can only work with an 'ld' executable, so we need -;; this trick to make it wrap 'lld'. -(define (make-lld-wrapper lld) - (define lld-as-ld - (computed-file "lld-ld" - #~(begin - (mkdir #$output) - (mkdir (string-append #$output "/bin")) - (symlink #$(file-append lld "/bin/lld") - (string-append #$output "/bin/ld"))))) - - ;; Create a wrapper for LLD that inserts appropriate -rpath entries. - (define lld-wrapper - (make-ld-wrapper "lld-wrapper" - #:binutils lld-as-ld)) - - ;; Clang looks for an 'ld.lld' executable, so we need to symlink it back. - (computed-file "lld-wrapped" - #~(begin - (mkdir #$output) - (mkdir (string-append #$output "/bin")) - (symlink #$(file-append lld-wrapper "/bin/ld") - (string-append #$output "/bin/lld")) - (symlink "lld" (string-append #$output "/bin/ld.lld"))))) - (define-public ungoogled-chromium (package (name "ungoogled-chromium") - (version (string-append %chromium-version "-0." - (match (string-split %ungoogled-revision #\-) - ((version revision commits g+short) - (string-drop g+short 1))))) + (version (if (string-prefix? %chromium-version %ungoogled-revision) + %ungoogled-revision + ;; ungoogled-chromium version tags always have a "-1" suffix, + ;; so we can hijack "-0" in cases where the Chromium source + ;; is newer than the latest available tag. + (string-append %chromium-version "-0"))) (synopsis "Graphical web browser") (source (origin (method url-fetch) @@ -477,424 +480,413 @@ %chromium-version ".tar.xz")) (sha256 (base32 - "0lr8zdq06smncdzd6knzww9hxl8ynvxadmrkyyl13fpwb1422rjx")) + "1fpc07zvashaqqalwn7wxnswxclrxvhjrxy1rzr6gcq5awhaw6y9")) (modules '((guix build utils))) (snippet (force ungoogled-chromium-snippet)))) (build-system gnu-build-system) (arguments - `(#:tests? #f - ;; FIXME: Chromiums RUNPATH lacks entries for some libraries. - #:validate-runpath? #f - #:modules ((guix build gnu-build-system) + (list + #:tests? #f + #:modules '((guix build gnu-build-system) (guix build utils) (srfi srfi-26)) - #:configure-flags - ;; 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. - ;; (Note: The 'configure' phase will do that for you.) - (list "is_debug=false" - ;; Use the "official" release optimizations, as opposed to - ;; a developer build. - "is_official_build=true" - "clang_use_chrome_plugins=false" - "is_cfi=false" ;requires Clang 13 - "use_thin_lto=false" ;XXX ICE with Clang+LLD 12.0.1 - "chrome_pgo_phase=0" - "use_sysroot=false" - "goma_dir=\"\"" - "enable_nacl=false" - "enable_nacl_nonsfi=false" - "use_unofficial_version_number=false" - "treat_warnings_as_errors=false" - "use_official_google_api_keys=false" - "fieldtrial_testing_like_official_build=true" - "safe_browsing_mode=0" - "enable_mdns=false" - "enable_one_click_signin=false" - "enable_reading_list=false" - "enable_remoting=false" - "enable_reporting=false" - "enable_service_discovery=false" - "enable_vr=false" - "enable_widevine=false" - ;; Disable type-checking for the Web UI to avoid a Java dependency. - "enable_js_type_check=false" - ;; Disable code using TensorFlow until it has been scrutinized - ;; by the ungoogled project. - "build_with_tflite_lib=false" - ;; Avoid dependency on code formatting tools. - "blink_enable_generated_code_formatting=false" - - ;; Define a custom toolchain that simply looks up CC, AR and - ;; friends from the environment. - "custom_toolchain=\"//build/toolchain/linux/unbundle:default\"" - "host_toolchain=\"//build/toolchain/linux/unbundle:default\"" - - ;; Prefer system libraries. - "use_system_freetype=true" - "use_system_harfbuzz=true" - "use_system_lcms2=true" - "use_system_libdrm=true" - "use_system_libjpeg=true" - "use_system_libopenjpeg2=true" - "use_system_libpng=true" - "use_system_wayland_scanner=true" - (string-append "system_wayland_scanner_path=\"" - (assoc-ref %build-inputs "wayland-scanner") - "/bin/wayland-scanner\"") - - "use_system_zlib=true" - "use_gnome_keyring=false" ;deprecated by libsecret - "use_pulseaudio=true" - "link_pulseaudio=true" - "icu_use_data_file=false" - - ;; FIXME: Using system protobuf with "is_official_build" causes an - ;; invalid opcode and "protoc-gen-plugin: Plugin killed by signal 4". - ;;"perfetto_use_system_protobuf=true" - - ;; 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") - '()) - - "media_use_ffmpeg=true" - "media_use_libvpx=true" - "media_use_openh264=true" - - ;; Do not artifically restrict formats supported by system ffmpeg. - "proprietary_codecs=true" - "ffmpeg_branding=\"Chrome\"" - - ;; WebRTC stuff. - "rtc_use_h264=true" - "rtc_use_pipewire=true" - "rtc_link_pipewire=true" - "rtc_pipewire_version=\"0.3\"" - ;; Don't use bundled sources. - "rtc_build_json=true" ;FIXME: libc++ std::string ABI difference - "rtc_build_libevent=false" - "rtc_build_libvpx=false" - "rtc_build_opus=false" - "rtc_build_libsrtp=true" ;FIXME: fails to find headers - "rtc_build_usrsctp=true" ;TODO: package this - "rtc_build_ssl=true") ;XXX: the bundled BoringSSL is required? - #:phases - (modify-phases %standard-phases - (add-after 'unpack 'patch-stuff - (lambda* (#:key inputs #:allow-other-keys) - (let ((openjpeg (assoc-ref inputs "openjpeg"))) - (substitute* "third_party/pdfium/BUILD.gn" - ;; This include path is added by Debians openjpeg patch. - (("/usr/include/openjpeg") - (string-append openjpeg "/include/openjpeg")))) - - (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\""))) - (find-files (string-append "third_party/webrtc/modules" - "/audio_coding/codecs/opus"))) - - ;; 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/icc/iccmodule.h" - (("include \"third_party/lcms/include/lcms2\\.h\"") - "include \"lcms2.h\"")) - - ;; Add missing include statement. - (substitute* "third_party/pdfium/core/fxcodec/png/png_decoder.cpp" - (("#include \"core/fxcodec/fx_codec.h\"" all) - (string-append all - "\n#include \"core/fxcodec/fx_codec_def.h\""))) - - (substitute* - "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h" - (("include \"third_party/curl") - "include \"curl")) - - (substitute* '("components/viz/common/gpu/vulkan_context_provider.h" - "components/viz/common/resources/resource_format_utils.h" - "gpu/config/gpu_util.cc") - (("third_party/vulkan_headers/include/") "")) - - (substitute* "third_party/skia/include/gpu/vk/GrVkVulkan.h" - (("include/third_party/vulkan/") "")))) - (add-after 'patch-stuff 'add-absolute-references - (lambda* (#:key inputs #:allow-other-keys) - (let ((cups (assoc-ref inputs "cups")) - (nss (assoc-ref inputs "nss")) - (mesa (assoc-ref inputs "mesa")) - (udev (assoc-ref inputs "udev"))) - (substitute* "printing/cups_config_helper.py" - (("cups_config =.*") - (string-append "cups_config = '" cups - "/bin/cups-config'\n"))) - (substitute* "crypto/nss_util.cc" - (("libnssckbi\\.so") - (string-append nss "/lib/nss/libnssckbi.so"))) - (substitute* "device/udev_linux/udev1_loader.cc" - (("libudev\\.so\\.1") - (string-append udev "/lib/libudev.so.1"))) - - (substitute* - '("ui/ozone/platform/x11/gl_ozone_glx.cc" - "ui/ozone/common/egl_util.cc" - "ui/gl/init/gl_initializer_linux_x11.cc" - "third_party/angle/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp") - (("libGL\\.so\\.1") - (string-append mesa "/lib/libGL.so.1")) - (("libEGL\\.so\\.1") - (string-append mesa "/lib/libEGL.so.1")) - (("libGLESv2\\.so\\.2") - (string-append mesa "/lib/libGLESv2.so.2")))))) - (add-before 'configure 'prepare-build-environment - (lambda* (#:key inputs #:allow-other-keys) - - ;; Define the GN toolchain. - (setenv "AR" "llvm-ar") (setenv "NM" "llvm-nm") - (setenv "CC" "clang") (setenv "CXX" "clang++") - - (let ((gcc (assoc-ref inputs "gcc"))) - ;; Remove the default compiler from CPLUS_INCLUDE_PATH to - ;; prevent header conflict with the bundled libcxx. - (setenv "CPLUS_INCLUDE_PATH" - (string-join - (delete (string-append gcc "/include/c++") - (string-split (getenv "CPLUS_INCLUDE_PATH") - #\:)) - ":")) - (format #t - "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" - (getenv "CPLUS_INCLUDE_PATH"))) - - (setenv "CXXFLAGS" - (string-join - '(;; Do not optimize away null pointer safety checks. - "-fno-delete-null-pointer-checks" - ;; Disable warnings about unknown warnings that require - ;; Clang plugins or newer versions. - "-Wno-unknown-warning-option"))) - - (setenv "CFLAGS" "-Wno-unknown-warning-option") - - ;; TODO: pre-compile instead. Avoids a race condition. - (setenv "PYTHONDONTWRITEBYTECODE" "1") - - ;; XXX: How portable is this. - (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"))) - (replace 'configure - (lambda* (#:key configure-flags #:allow-other-keys) - (let ((args (string-join configure-flags " "))) - ;; Generate ninja build files. - (invoke "gn" "gen" "out/Release" - (string-append "--args=" args)) - - ;; Print the full list of supported arguments as well as - ;; 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 2048, - ;; or equal to the hard limit, whichever is lower. - (call-with-values (lambda () (getrlimit 'nofile)) - (lambda (soft hard) - (when (and soft (< soft 2048)) - (if hard - (setrlimit 'nofile (min hard 2048) hard) - (setrlimit 'nofile 2048 #f)) - (format #t - "increased maximum number of open files from ~d to ~d~%" - soft (if hard (min hard 2048) 2048))))))) - (replace 'build - (lambda* (#:key (parallel-build? #t) #:allow-other-keys) - (invoke "ninja" "-C" "out/Release" - "-j" (if parallel-build? - (number->string (parallel-job-count)) - "1") - "chrome" - "chromedriver"))) - (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")) - (libs '("chrome_100_percent.pak" - "chrome_200_percent.pak" - "resources.pak" - "v8_context_snapshot.bin" - - ;; Chromium ships its own libGL - ;; implementation called ANGLE. - "libEGL.so" "libGLESv2.so")) - (locales (string-append lib "/locales")) - (resources (string-append lib "/resources")) - (preferences (assoc-ref inputs "master-preferences")) - (gtk+ (assoc-ref inputs "gtk+")) - (xdg-utils (assoc-ref inputs "xdg-utils")) - (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")) - - (mkdir-p lib) - (copy-file preferences (string-append lib "/master_preferences")) - - (with-directory-excursion "out/Release" - (for-each (cut install-file <> lib) libs) - (copy-file "chrome" (string-append lib "/chromium")) - - (copy-recursively "locales" locales) - (copy-recursively "resources" resources) - - (mkdir-p bin) - (symlink "../lib/chromium" exe) - (install-file "chromedriver" bin) - - (for-each (lambda (so) - (install-file so (string-append lib "/swiftshader"))) - (find-files "swiftshader" "\\.so$")) - - (wrap-program exe - ;; Avoid file manager crash. See <https://bugs.gnu.org/26593>. - `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share"))) - `("PATH" ":" prefix (,(string-append xdg-utils "/bin"))))) - - (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"))))))))) + #:configure-flags + ;; 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. + ;; (Note: The 'configure' phase will do that for you.) + #~(list "is_debug=false" + ;; Use the "official" release optimizations, as opposed to + ;; a developer build. + "is_official_build=true" + "clang_use_chrome_plugins=false" + "is_cfi=false" ;requires ThinLTO + "use_thin_lto=false" ;XXX lld segfaults + "chrome_pgo_phase=0" + "use_sysroot=false" + "goma_dir=\"\"" + "enable_nacl=false" + "enable_nacl_nonsfi=false" + "use_unofficial_version_number=false" + "treat_warnings_as_errors=false" + "use_official_google_api_keys=false" + "disable_fieldtrial_testing_config=true" + "safe_browsing_mode=0" + "enable_mdns=false" + "enable_one_click_signin=false" + "enable_reading_list=false" + "enable_remoting=false" + "enable_reporting=false" + "enable_service_discovery=false" + "enable_vr=false" + "enable_widevine=false" + ;; Disable type-checking for the Web UI to avoid a Java dependency. + "enable_js_type_check=false" + ;; Disable code using TensorFlow until it has been scrutinized + ;; by the ungoogled project. + "build_with_tflite_lib=false" + ;; Avoid dependency on code formatting tools. + "blink_enable_generated_code_formatting=false" + + ;; Define a custom toolchain that simply looks up CC, AR and + ;; friends from the environment. + "custom_toolchain=\"//build/toolchain/linux/unbundle:default\"" + "host_toolchain=\"//build/toolchain/linux/unbundle:default\"" + + ;; Prefer system libraries. + "use_system_freetype=true" + "use_system_harfbuzz=true" + "use_system_lcms2=true" + "use_system_libdrm=true" + "use_system_libjpeg=true" + "use_system_libopenjpeg2=true" + "use_system_libpng=true" + "use_system_wayland_scanner=true" + (string-append "system_wayland_scanner_path=\"" + (search-input-file %build-inputs + "/bin/wayland-scanner") + "\"") + + "use_system_zlib=true" + "use_gnome_keyring=false" ;deprecated by libsecret + "use_pulseaudio=true" + "link_pulseaudio=true" + "icu_use_data_file=false" + + ;; FIXME: Using system protobuf with "is_official_build" causes an + ;; invalid opcode and "protoc-gen-plugin: Plugin killed by signal 4". + ;;"perfetto_use_system_protobuf=true" + + ;; 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") + '()) + + "media_use_ffmpeg=true" + "media_use_libvpx=true" + "media_use_openh264=true" + + ;; Do not artifically restrict formats supported by system ffmpeg. + "proprietary_codecs=true" + "ffmpeg_branding=\"Chrome\"" + + ;; WebRTC stuff. + "rtc_use_h264=true" + "rtc_use_pipewire=true" + "rtc_link_pipewire=true" + ;; Don't use bundled sources. + "rtc_build_json=true" ;FIXME: libc++ std::string ABI difference + "rtc_build_libevent=false" + ;; XXX: Use the bundled libvpx for WebRTC because unbundling + ;; currently fails (see above), and the versions must match. + "rtc_build_libvpx=true" + "rtc_build_opus=false" + "rtc_build_libsrtp=true" ;FIXME: fails to find headers + "rtc_build_usrsctp=true" ;TODO: package this + "rtc_build_ssl=true") ;XXX: requires BoringSSL + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'patch-stuff + (lambda* (#:key inputs #:allow-other-keys) + (let ((openjpeg (search-input-directory + inputs "include/openjpeg-2.4"))) + (substitute* "third_party/pdfium/BUILD.gn" + ;; This include path is added by Debians openjpeg patch. + (("/usr/include/openjpeg-2.4") openjpeg)) + + (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\""))) + (find-files (string-append "third_party/webrtc/modules" + "/audio_coding/codecs/opus"))) + + ;; 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/icc/icc_transform.h" + (("include \"third_party/lcms/include/lcms2\\.h\"") + "include \"lcms2.h\"")) + + (substitute* + "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h" + (("include \"third_party/curl") + "include \"curl")) + + (substitute* '("components/viz/common/gpu/vulkan_context_provider.h" + "components/viz/common/resources/resource_format_utils.h" + "gpu/config/gpu_util.cc") + (("third_party/vulkan_headers/include/") "")) + + (substitute* "third_party/skia/include/gpu/vk/GrVkVulkan.h" + (("include/third_party/vulkan/") ""))))) + (add-after 'patch-stuff 'add-absolute-references + (lambda* (#:key inputs #:allow-other-keys) + (let ((cups-config (search-input-file inputs "/bin/cups-config")) + (libnssckbi.so (search-input-file inputs + "/lib/nss/libnssckbi.so")) + (libudev.so.1 (search-input-file inputs "/lib/libudev.so.1")) + (libvulkan.so.1 (search-input-file inputs + "/lib/libvulkan.so.1")) + (mesa-lib (dirname (search-input-file inputs + "/lib/libGL.so.1")))) + (substitute* "printing/cups_config_helper.py" + (("cups_config =.*") + (string-append "cups_config = '" cups-config "'\n"))) + (substitute* "crypto/nss_util.cc" + (("libnssckbi\\.so") libnssckbi.so)) + (substitute* "device/udev_linux/udev1_loader.cc" + (("libudev\\.so\\.1") libudev.so.1)) + (substitute* "third_party/dawn/src/dawn_native/vulkan/BackendVk.cpp" + (("libvulkan\\.so\\.1") libvulkan.so.1)) + (substitute* + '("ui/ozone/platform/x11/gl_ozone_glx.cc" + "ui/ozone/common/egl_util.cc" + "ui/gl/init/gl_initializer_linux_x11.cc" + "third_party/angle/src/libANGLE/renderer/gl/glx\ +/FunctionsGLX.cpp") + (("libGL\\.so\\.1") + (string-append mesa-lib "/libGL.so.1")) + (("libEGL\\.so\\.1") + (string-append mesa-lib "/libEGL.so.1")) + (("libGLESv2\\.so\\.2") + (string-append mesa-lib "/libGLESv2.so.2")))))) + (add-before 'configure 'prepare-build-environment + (lambda* (#:key native-inputs inputs #:allow-other-keys) + (let ((c++ (search-input-directory (or native-inputs inputs) + "include/c++")) + (node (search-input-file (or native-inputs inputs) + "/bin/node"))) + ;; Remove the default compiler from CPLUS_INCLUDE_PATH to + ;; prevent header conflict with the bundled libcxx. + (setenv "CPLUS_INCLUDE_PATH" + (string-join + (delete c++ + (string-split (getenv "CPLUS_INCLUDE_PATH") + #\:)) + ":")) + (format #t + "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" + (getenv "CPLUS_INCLUDE_PATH")) + + ;; Define the GN toolchain. + (setenv "AR" "llvm-ar") (setenv "NM" "llvm-nm") + (setenv "CC" "clang") (setenv "CXX" "clang++") + + ;; TODO: pre-compile instead. Avoids a race condition. + (setenv "PYTHONDONTWRITEBYTECODE" "1") + + ;; XXX: How portable is this. + (mkdir-p "third_party/node/linux/node-linux-x64") + (symlink (dirname node) + "third_party/node/linux/node-linux-x64/bin")))) + (replace 'configure + (lambda* (#:key configure-flags #:allow-other-keys) + (let ((args (string-join configure-flags " "))) + ;; Generate ninja build files. + (invoke "gn" "gen" "out/Release" + (string-append "--args=" args)) + + ;; Print the full list of supported arguments as well as + ;; 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 2048, + ;; or equal to the hard limit, whichever is lower. + (call-with-values (lambda () (getrlimit 'nofile)) + (lambda (soft hard) + (when (and soft (< soft 2048)) + (if hard + (setrlimit 'nofile (min hard 2048) hard) + (setrlimit 'nofile 2048 #f)) + (format #t + "increased maximum number of open files from ~d to ~d~%" + soft (if hard (min hard 2048) 2048))))))) + (replace 'build + (lambda* (#:key (parallel-build? #t) #:allow-other-keys) + (invoke "ninja" "-C" "out/Release" + "-j" (if parallel-build? + (number->string (parallel-job-count)) + "1") + "chrome" + "chromedriver"))) + (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")) + (libs '("chrome_100_percent.pak" + "chrome_200_percent.pak" + "resources.pak" + "v8_context_snapshot.bin" + + ;; Swiftshader ICD. + "libvk_swiftshader.so" + "vk_swiftshader_icd.json" + + ;; Chromium ships its own libGL + ;; implementation called ANGLE. + "libEGL.so" "libGLESv2.so")) + (locales (string-append lib "/locales")) + (resources (string-append lib "/resources")) + (preferences + ;; This file contains defaults for new user profiles. + #$(local-file "aux-files/chromium/master-preferences.json")) + (gtk+ (assoc-ref inputs "gtk+")) + (xdg-utils (assoc-ref inputs "xdg-utils"))) + + (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")) + + (mkdir-p lib) + (copy-file preferences (string-append lib "/master_preferences")) + + (with-directory-excursion "out/Release" + (for-each (cut install-file <> lib) libs) + (copy-file "chrome" (string-append lib "/chromium")) + + (copy-recursively "locales" locales) + (copy-recursively "resources" resources) + + (mkdir-p bin) + (symlink "../lib/chromium" exe) + (install-file "chromedriver" bin) + + (for-each (lambda (so) + (install-file so (string-append lib "/swiftshader"))) + (find-files "swiftshader" "\\.so$")) + + (wrap-program exe + ;; Avoid file manager crash. See <https://bugs.gnu.org/26593>. + `("XDG_DATA_DIRS" ":" prefix (,(string-append gtk+ "/share"))) + `("PATH" ":" prefix (,(string-append xdg-utils "/bin"))))) + + (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"))))))))) (native-inputs - `(("bison" ,bison) - ("clang" ,clang-12) - ("gn" ,gn) - ("gperf" ,gperf) - ("ld-wrapper" ,(make-lld-wrapper lld)) - ("ninja" ,ninja) - ("node" ,node-lts) - ("pkg-config" ,pkg-config) - ("which" ,which) - - ;; This file contains defaults for new user profiles. - ("master-preferences" ,(local-file "aux-files/chromium/master-preferences.json")) - - ("python-beautifulsoup4" ,python-beautifulsoup4) - ("python-html5lib" ,python-html5lib) - ("python" ,python-wrapper) - ("wayland-scanner" ,wayland))) + (list bison + clang-13 + gn + gperf + lld-as-ld-wrapper + ninja + node-lts + pkg-config + which + python-beautifulsoup4 + python-html5lib + python-wrapper + wayland)) (inputs - `(("alsa-lib" ,alsa-lib) - ("atk" ,atk) - ("cups" ,cups) - ("curl" ,curl) - ("dbus" ,dbus) - ("expat" ,expat) - ("flac" ,flac) - ("ffmpeg" ,ffmpeg) - ("fontconfig" ,fontconfig) - ("freetype" ,freetype) - ("gdk-pixbuf" ,gdk-pixbuf) - ("glib" ,glib) - ("gtk+" ,gtk+) - ("harfbuzz" ,harfbuzz) - ("icu4c" ,icu4c-69) - ("lcms" ,lcms) - ("libevent" ,libevent) - ("libffi" ,libffi) - ("libjpeg-turbo" ,libjpeg-turbo) - ("libpng" ,libpng) - ("libva" ,libva) - ("libvpx" ,libvpx) - ("libwebp" ,libwebp) - ("libx11" ,libx11) - ("libxcb" ,libxcb) - ("libxcomposite" ,libxcomposite) - ("libxcursor" ,libxcursor) - ("libxdamage" ,libxdamage) - ("libxext" ,libxext) - ("libxfixes" ,libxfixes) - ("libxi" ,libxi) - ("libxml2" ,libxml2) - ("libxrandr" ,libxrandr) - ("libxrender" ,libxrender) - ("libxscrnsaver" ,libxscrnsaver) - ("libxslt" ,libxslt) - ("libxtst" ,libxtst) - ;; Newer kernel headers are required for userfaultfd support; remove - ;; after 'core-updates' merge. - ("linux-libre-headers" ,linux-libre-headers-5.10) - ("mesa" ,mesa) - ("minizip" ,minizip) - ("mit-krb5" ,mit-krb5) - ("nss" ,nss) - ("openh264" ,openh264) - ("openjpeg" ,openjpeg) ;PDFium only - ("opus" ,opus+custom) - ("pango" ,pango) - ("pciutils" ,pciutils) - ("pipewire" ,pipewire-0.3) - ("pulseaudio" ,pulseaudio) - ("snappy" ,snappy) - ("speech-dispatcher" ,speech-dispatcher) - ("udev" ,eudev) - ("valgrind" ,valgrind) - ("vulkan-headers" ,vulkan-headers) - ("wayland" ,wayland) - ("xdg-utils" ,xdg-utils))) + (list alsa-lib + atk + cups + curl + dbus + expat + flac + ffmpeg + fontconfig + freetype + gdk-pixbuf + glib + gtk+ + harfbuzz-3.0 + icu4c + lcms + libevent + libffi + libjpeg-turbo + libpng + libva + libvpx + libwebp + libx11 + libxcb + libxcomposite + libxcursor + libxdamage + libxext + libxfixes + libxi + libxml2 + libxrandr + libxrender + libxscrnsaver + libxslt + libxtst + mesa + minizip + mit-krb5 + nss + openh264 + openjpeg ;PDFium only + opus+custom + pango + pciutils + pipewire-0.3 + pulseaudio + snappy + speech-dispatcher + eudev + valgrind + vulkan-headers + vulkan-loader + wayland + xdg-utils)) (native-search-paths (list (search-path-specification (variable "CHROMIUM_EXTENSION_DIRECTORY") |